MYSQL查询表格数据基本操作指南

您所在的位置:网站首页 vb代码查询表 MYSQL查询表格数据基本操作指南

MYSQL查询表格数据基本操作指南

2024-07-12 12:18| 来源: 网络整理| 查看: 265

数据库博文汇总 MYSQL查询表格数据基本操作指南MYSQL中编辑表格相关基本操作指南MYSQL修改插入删除表格数据MYSQL数据库之索引

这篇博客旨在更详细简洁的介绍MYSQl中查询表格数据的相关基本操作,包括单张表格查询数据、使用聚合函数查询数据、连接多个表格查询数据、表格子查询语句、合并查询语句等。博文不仅给出了相关操作的详细介绍,还列举了每部分操作的详细源码供大家练习。本文不仅适合小白级同学阅读学习,也适合有一定基础的人来短时间快速掌握MYSQL查询表格数据操作。

推荐大家使用工具SQLyog,本文主要使用原始mysql窗口进行交互,相关指令在SQLyog上更加直观。本文的mysql源码命令行都有备注,对源码的含义给出解释。

单表查询

我们创建一个数据库s_book, 再使用这个数据库创建一个表格t_student且导入数据:

create database s_book; use s_book; create table `t_student` ( `id` double , `stuName` varchar (60), `age` double , `sex` varchar (30), `gradeName` varchar (60) ); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('1','张三','23','男','一年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('2','张三丰','25','男','二年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('3','李四','23','男','一年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('4','王五','22','男','三年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('5','珍妮','21','女','一年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('6','李娜','26','女','二年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('7','王峰','20','男','三年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('8','梦娜','21','女','二年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('9','小黑','22','男','一年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('10','追风','25','男','二年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('11','小小张三','21',NULL,'二年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('12','小张三','23','男','二年级'); insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('13','张三锋小','24',NULL,'二年级');

这样我们就创建完成了t_student,我们可以在mysql 里面利用命令查看表格:

+------+--------------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+--------------+------+------+-----------+ | 1 | 张三 | 23 | 男 | 一年级 | | 2 | 张三丰 | 25 | 男 | 二年级 | | 3 | 李四 | 23 | 男 | 一年级 | | 4 | 王五 | 22 | 男 | 三年级 | | 5 | 珍妮 | 21 | 女 | 一年级 | | 6 | 李娜 | 26 | 女 | 二年级 | | 7 | 王峰 | 20 | 男 | 三年级 | | 8 | 梦娜 | 21 | 女 | 二年级 | | 9 | 小黑 | 22 | 男 | 一年级 | | 10 | 追风 | 25 | 男 | 二年级 | | 11 | 小小张三 | 21 | NULL | 二年级 | | 12 | 小张三 | 23 | 男 | 二年级 | | 13 | 张三锋小 | 24 | NULL | 二年级 | +------+--------------+------+------+-----------+

或者利用SQLyog直接查看(s_book-->Tables-->t_student-->表数据):

查询所有字段(语法:SELECT * FROM 表名/SELECT 字段 1,字段 2,字段 3...FROM 表名 ),第二种语法可以更改字段的位置: mysql> select *from t_student;/*查询此表格所有字段* | id | stuName | age | sex | gradeName | +------+--------------+------+------+-----------+ | 1 | 张三 | 23 | 男 | 一年级 | | 2 | 张三丰 | 25 | 男 | 二年级 | | 3 | 李四 | 23 | 男 | 一年级 | | 4 | 王五 | 22 | 男 | 三年级 | | 5 | 珍妮 | 21 | 女 | 一年级 | | 6 | 李娜 | 26 | 女 | 二年级 | | 7 | 王峰 | 20 | 男 | 三年级 | | 8 | 梦娜 | 21 | 女 | 二年级 | | 9 | 小黑 | 22 | 男 | 一年级 | | 10 | 追风 | 25 | 男 | 二年级 | | 11 | 小小张三 | 21 | NULL | 二年级 | | 12 | 小张三 | 23 | 男 | 二年级 | | 13 | 张三锋小 | 24 | NULL | 二年级 | +------+--------------+------+------+-----------+ mysql> select stuName, id, age, gradeName, sex, stuName from t_student; /*手动选取表中的这几行查看,且可以调整顺序*/ +--------------+------+------+-----------+------+--------------+ | stuName | id | age | gradeName | sex | stuName | +--------------+------+------+-----------+------+--------------+ | 张三 | 1 | 23 | 一年级 | 男 | 张三 | | 张三丰 | 2 | 25 | 二年级 | 男 | 张三丰 | | 李四 | 3 | 23 | 一年级 | 男 | 李四 | | 王五 | 4 | 22 | 三年级 | 男 | 王五 | | 珍妮 | 5 | 21 | 一年级 | 女 | 珍妮 | | 李娜 | 6 | 26 | 二年级 | 女 | 李娜 | | 王峰 | 7 | 20 | 三年级 | 男 | 王峰 | | 梦娜 | 8 | 21 | 二年级 | 女 | 梦娜 | | 小黑 | 9 | 22 | 一年级 | 男 | 小黑 | | 追风 | 10 | 25 | 二年级 | 男 | 追风 | | 小小张三 | 11 | 21 | 二年级 | NULL | 小小张三 | | 小张三 | 12 | 23 | 二年级 | 男 | 小张三 | | 张三锋小 | 13 | 24 | 二年级 | NULL | 张三锋小 | +--------------+------+------+-----------+------+--------------+

使用SQLyog更加直观的看见结果,为免博文冗长,后续不给出SQLyog直观界面截图,只给出SQL源码,将源码直接粘贴到SQLyog中运行就可以得到结果;SQLlog工具更加方便而已,相关指令是一样的。

查询指定字段(语法:SELECT 字段 1,字段 2,字段 3...FROM 表名 ): mysql> select id from t_student; /*查寻指定列id*/ +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | | 11 | | 12 | | 13 | +------+ mysql> select age, sex from t_student; /*查询指定列 age、sex*/ +------+------+ | age | sex | +------+------+ | 23 | 男 | | 25 | 男 | | 23 | 男 | | 22 | 男 | | 21 | 女 | | 26 | 女 | | 20 | 男 | | 21 | 女 | | 22 | 男 | | 25 | 男 | | 21 | NULL | | 23 | 男 | | 24 | NULL | +------+------+ Where 条件查询(语法:SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 条件表达式),比如查询age这一栏,我只需要查询里面年龄是25岁的学生: mysql> select id, stuname,age from t_student where age=25; /*当年龄为25岁时 查询指定字段*/ +------+-----------+------+ | id | stuname | age | +------+-----------+------+ | 2 | 张三丰 | 25 | | 10 | 追风 | 25 | +------+-----------+------+

查询年龄是25或者21的学生,where 条件表达式 or 条件表达式:

mysql> select id, stuname,age from t_student where age=25 or age=21; /*当年龄为25或者21岁时,查询指定字段*/ +------+--------------+------+ | id | stuname | age | +------+--------------+------+ | 2 | 张三丰 | 25 | | 5 | 珍妮 | 21 | | 8 | 梦娜 | 21 | | 10 | 追风 | 25 | | 11 | 小小张三 | 21 | +------+--------------+------+

也可以运用不等号:

mysql> select id, stuname,age from t_student where age>25; /*当年龄大于25岁时,查询指定字段*/ +------+---------+------+ | id | stuname | age | +------+---------+------+ | 6 | 李娜 | 26 | +------+---------+------+ 1 row in set (0.00 sec) mysql> select id, stuname,age from t_student where age>=25; /*当年龄大于或者等于25岁时,查询指定字段*/ +------+-----------+------+ | id | stuname | age | +------+-----------+------+ | 2 | 张三丰 | 25 | | 6 | 李娜 | 26 | | 10 | 追风 | 25 | +------+-----------+------+ 3 rows in set (0.00 sec) 带 IN 关键字查询(语法:SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] IN (元素 1,元素 2,元素 3),比如我需要查询 年龄是21或者25 的学生: mysql> select id, stuname,age from t_student where age in (21, 25); /*选择年龄是21、25的字段*/ +------+--------------+------+ | id | stuname | age | +------+--------------+------+ | 2 | 张三丰 | 25 | | 5 | 珍妮 | 21 | | 8 | 梦娜 | 21 | | 10 | 追风 | 25 | | 11 | 小小张三 | 21 | +------+--------------+------+

反过来:

mysql> select id, stuname,age from t_student where age not in (21, 25); /*选择21 SELECT * FROM t_student WHERE stuName LIKE '张三_'; /*搜索stuname中字符前两个是'张三'的三位字符*/ +------+-----------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+-----------+------+------+-----------+ | 2 | 张三丰 | 25 | 男 | 二年级 | +------+-----------+------+------+-----------+ mysql> SELECT * FROM t_student WHERE stuName LIKE '张三__'; /*搜索字符前两个是‘张三’的四位字符,以此类推*/ +------+--------------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+--------------+------+------+-----------+ | 13 | 张三锋小 | 24 | NULL | 二年级 | +------+--------------+------+------+-----------+ 空值查询 (语法:SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 IS [NOT] NULL ): mysql> select *from t_student where sex is null;/*取出性别是空值的数据*/ +------+--------------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+--------------+------+------+-----------+ | 11 | 小小张三 | 21 | NULL | 二年级 | | 13 | 张三锋小 | 24 | NULL | 二年级 | +------+--------------+------+------+-----------+ mysql> select *from t_student where sex is not null; /*与上相反*/ +------+-----------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+-----------+------+------+-----------+ | 1 | 张三 | 23 | 男 | 一年级 | | 2 | 张三丰 | 25 | 男 | 二年级 | | 3 | 李四 | 23 | 男 | 一年级 | | 4 | 王五 | 22 | 男 | 三年级 | | 5 | 珍妮 | 21 | 女 | 一年级 | | 6 | 李娜 | 26 | 女 | 二年级 | | 7 | 王峰 | 20 | 男 | 三年级 | | 8 | 梦娜 | 21 | 女 | 二年级 | | 9 | 小黑 | 22 | 男 | 一年级 | | 10 | 追风 | 25 | 男 | 二年级 | | 12 | 小张三 | 23 | 男 | 二年级 | +------+-----------+------+------+-----------+ 带 AND 或 OR的多条件查询(语法:SELECT *FROM 表名 WHERE 条件表达式 1 AND/OR 条件表达式 2 ): mysql> select *from t_student where gradename='一年级' and age=23; /*寻找一年级且23岁的数据*/ +------+---------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+---------+------+------+-----------+ | 1 | 张三 | 23 | 男 | 一年级 | | 3 | 李四 | 23 | 男 | 一年级 | +------+---------+------+------+-----------+ 2 rows in set (0.00 sec) mysql> select *from t_student where gradename='一年级' or age=23; /*寻找一年级或者23岁的学生*/ +------+-----------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+-----------+------+------+-----------+ | 1 | 张三 | 23 | 男 | 一年级 | | 3 | 李四 | 23 | 男 | 一年级 | | 5 | 珍妮 | 21 | 女 | 一年级 | | 9 | 小黑 | 22 | 男 | 一年级 | | 12 | 小张三 | 23 | 男 | 二年级 | +------+-----------+------+------+-----------+ DISTINCT 去重复查询 (语法:SELECT DISTINCT 字段名 FROM 表名) mysql> select gradename from t_student ; /*显示表格中关于年级的所有数据*/ +-----------+ | gradename | +-----------+ | 一年级 | | 二年级 | | 一年级 | | 三年级 | | 一年级 | | 二年级 | | 三年级 | | 二年级 | | 一年级 | | 二年级 | | 二年级 | | 二年级 | | 二年级 | +-----------+ mysql> select distinct gradename from t_student ; /*显示表格中关于年级的所有不重复数据*/ +-----------+ | gradename | +-----------+ | 一年级 | | 二年级 | | 三年级 | +-----------+ 对查询结果排序 (语法:SELECT 字段 1,字段 2...FROM 表名 ORDER BY 属性名 [ASC(升序)|DESC(降序)] ) mysql> SELECT * FROM t_student ORDER BY age ASC; /*按年龄升序排*/ +------+--------------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+--------------+------+------+-----------+ | 7 | 王峰 | 20 | 男 | 三年级 | | 5 | 珍妮 | 21 | 女 | 一年级 | | 8 | 梦娜 | 21 | 女 | 二年级 | | 11 | 小小张三 | 21 | NULL | 二年级 | | 4 | 王五 | 22 | 男 | 三年级 | | 9 | 小黑 | 22 | 男 | 一年级 | | 1 | 张三 | 23 | 男 | 一年级 | | 3 | 李四 | 23 | 男 | 一年级 | | 12 | 小张三 | 23 | 男 | 二年级 | | 13 | 张三锋小 | 24 | NULL | 二年级 | | 2 | 张三丰 | 25 | 男 | 二年级 | | 10 | 追风 | 25 | 男 | 二年级 | | 6 | 李娜 | 26 | 女 | 二年级 | +------+--------------+------+------+-----------+ mysql> SELECT * FROM t_student ORDER BY age desc; /*按年龄降序排*/ +------+--------------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+--------------+------+------+-----------+ | 6 | 李娜 | 26 | 女 | 二年级 | | 2 | 张三丰 | 25 | 男 | 二年级 | | 10 | 追风 | 25 | 男 | 二年级 | | 13 | 张三锋小 | 24 | NULL | 二年级 | | 1 | 张三 | 23 | 男 | 一年级 | | 3 | 李四 | 23 | 男 | 一年级 | | 12 | 小张三 | 23 | 男 | 二年级 | | 4 | 王五 | 22 | 男 | 三年级 | | 9 | 小黑 | 22 | 男 | 一年级 | | 5 | 珍妮 | 21 | 女 | 一年级 | | 8 | 梦娜 | 21 | 女 | 二年级 | | 11 | 小小张三 | 21 | NULL | 二年级 | | 7 | 王峰 | 20 | 男 | 三年级 | +------+--------------+------+------+-----------+ GROUP BY 分组查询(语法直接见下源代码) mysql> select gradename, group_concat(stuname) from t_student group by gradename; /*通过年级分组,用group_concat函数合计每个年级的人数*/ +-----------+--------------------------------------------------------------------+ | gradename | group_concat(stuname) | +-----------+--------------------------------------------------------------------+ | 一年级 | 张三,李四,珍妮,小黑 | | 三年级 | 王五,王峰 | | 二年级 | 张三丰,李娜,梦娜,追风,小小张三,小张三,张三锋小 | +-----------+--------------------------------------------------------------------+ mysql> SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName; /*通过年级分组,用count函数统计每个年级的人数*/ +-----------+----------------+ | gradeName | COUNT(stuName) | +-----------+----------------+ | 一年级 | 4 | | 三年级 | 2 | | 二年级 | 7 | +-----------+----------------+ mysql> SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName HAVING COUNT(stuName)>3; /*加条件:显示每个年级人数大于3的数据*/ +-----------+----------------+ | gradeName | COUNT(stuName) | +-----------+----------------+ | 一年级 | 4 | | 二年级 | 7 | +-----------+----------------+ mysql> SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName WITH ROLLUP; /*后面加一行总和*/ +-----------+----------------+ | gradeName | COUNT(stuName) | +-----------+----------------+ | 一年级 | 4 | | 三年级 | 2 | | 二年级 | 7 | | NULL | 13 | +-----------+----------------+ mysql> SELECT gradeName,GROUP_CONCAT(stuName) FROM t_student GROUP BY gradeName WITH ROLLUP; /*累计字符加总和*/ +-----------+--------------------------------------------------------------------------------------------------------------+ | gradeName | GROUP_CONCAT(stuName) | +-----------+--------------------------------------------------------------------------------------------------------------+ | 一年级 | 张三,李四,珍妮,小黑 | | 三年级 | 王五,王峰 | | 二年级 | 张三丰,李娜,梦娜,追风,小小张三,小张三,张三锋小 | | NULL | 张三,李四,珍妮,小黑,王五,王峰,张三丰,李娜,梦娜,追风,小小张三,小张三,张三锋小 | +-----------+--------------------------------------------------------------------------------------------------------------+ LIMIT 分页查询 (语法:SELECT 字段 1,字段 2...FROM 表名 LIMIT 初始位置,记录数) mysql> select *from t_student limit 0,5; /*从0开始,取5各数据,不包括0*/ +------+-----------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+-----------+------+------+-----------+ | 1 | 张三 | 23 | 男 | 一年级 | | 2 | 张三丰 | 25 | 男 | 二年级 | | 3 | 李四 | 23 | 男 | 一年级 | | 4 | 王五 | 22 | 男 | 三年级 | | 5 | 珍妮 | 21 | 女 | 一年级 | +------+-----------+------+------+-----------+ mysql> select *from t_student limit 5,10; /*从第五个数据开始,取10各数据,不包括第五个数据。取不满就算了*/ +------+--------------+------+------+-----------+ | id | stuName | age | sex | gradeName | +------+--------------+------+------+-----------+ | 6 | 李娜 | 26 | 女 | 二年级 | | 7 | 王峰 | 20 | 男 | 三年级 | | 8 | 梦娜 | 21 | 女 | 二年级 | | 9 | 小黑 | 22 | 男 | 一年级 | | 10 | 追风 | 25 | 男 | 二年级 | | 11 | 小小张三 | 21 | NULL | 二年级 | | 12 | 小张三 | 23 | 男 | 二年级 | | 13 | 张三锋小 | 24 | NULL | 二年级 | +------+--------------+------+------+-----------+ 使用聚合函数查询

首先我们重新创建一个表格t_grade,以便于更好的使用聚合函数,这一节的聚合函数不同,但相关用法的语法基本相同:

create table `t_grade` ( `id` int , `stuName` varchar (60), `course` varchar (60), `score` int ); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('1','张三','语文','91'); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('2','张三','数学','90'); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('3','张三','英语','87'); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('4','李四','语文','79'); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('5','李四','数学','95'); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('6','李四','英语','80'); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('7','王五','语文','77'); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('8','王五','数学','81'); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('9','王五','英语','89'); mysql> select *from t_grade; /*查看表*/ +------+---------+--------+-------+ | id | stuName | course | score | +------+---------+--------+-------+ | 1 | 张三 | 语文 | 92 | | 2 | 张三 | 数学 | 90 | | 3 | 张三 | 英语 | 87 | | 4 | 李四 | 语文 | 79 | | 5 | 李四 | 数学 | 95 | | 6 | 李四 | 英语 | 80 | | 7 | 王五 | 语文 | 77 | | 8 | 王五 | 数学 | 81 | | 9 | 王五 | 英语 | 89 | +------+---------+--------+-------+ COUNT()函数 (语法:见源码Mysql命令行),count可以看作是数数,数多少条记录,用来统计记录的条数 ,逐条统计: mysql> select count(*) from t_grade; /*统计这个表格总共多少行数据*/ +----------+ | count(*) | +----------+ | 9 | +----------+ mysql> select count(*) as total from t_grade;/*将count(*)记作total,最后一节专门讲这个用法*/ +-------+ | total | +-------+ | 9 | +-------+ mysql> select stuname,count(*) as total_course from t_grade group by stuname; /*根据stuname分组,统计每个人学几门课且记作tatal_course*/ +---------+--------------+ | stuname | total_course | +---------+--------------+ | 张三 | 3 | | 李四 | 3 | | 王五 | 3 | +---------+--------------+ SUM()函数(语法:见源码Mysql命令行), SUM函数是求和函数: mysql> select stuname,sum(score)from t_grade where stuname='张三'; /*对张三成绩求和*/ +---------+------------+ | stuname | sum(score) | +---------+------------+ | 张三 | 269 | +---------+------------+ mysql> select stuname,sum(score)from t_grade group by stuname; /*对每个人成绩求平均*/ +---------+------------+ | stuname | sum(score) | +---------+------------+ | 张三 | 269 | | 李四 | 254 | | 王五 | 247 | +---------+------------+ mysql> select stuname,sum(score) as 总分 from t_grade group by stuname; /*统计每个人的总分*/ +---------+--------+ | stuname | 总分 | +---------+--------+ | 张三 | 269 | | 李四 | 254 | | 王五 | 247 | +---------+--------+ AVG()函数 (语法:见源码Mysql命令行),AVG()函数是求平均值的函数: mysql> select stuname,avg(score)from t_grade where stuname='张三'; /*对张三成绩求平均*/ +---------+------------+ | stuname | avg(score) | +---------+------------+ | 张三 | 89.6667 | +---------+------------+ mysql> select stuname,avg(score) as `平均分` from t_grade group by stuname;/*对每个人求平均*/ +---------+-----------+ | stuname | 平均分 | +---------+-----------+ | 张三 | 89.6667 | | 李四 | 84.6667 | | 王五 | 82.3333 | +---------+-----------+ 3 rows in set (0.00 sec) mysql> select stuname as `学生姓名`,avg(score) as `平均分` from t_grade group by stuname;/*起别名,本文最后一节细讲*/ +--------------+-----------+ | 学生姓名 | 平均分 | +--------------+-----------+ | 张三 | 89.6667 | | 李四 | 84.6667 | | 王五 | 82.3333 | +--------------+-----------+ MAX()函数 (语法:见源码Mysql命令行),MAX()函数是求最大值的函数: mysql> select stuname,max(score)from t_grade where stuname='张三'; /*在张三成绩中找考的成绩最高的*/ +---------+------------+ | stuname | max(score) | +---------+------------+ | 张三 | 92 | +---------+------------+ mysql> select stuname,max(score) as '总分' from t_grade group by stuname;/*在每个人成绩中分别找最高的*/ +---------+--------+ | stuname | 总分 | +---------+--------+ | 张三 | 92 | | 李四 | 95 | | 王五 | 89 | +---------+--------+ MIN()函数 (语法:见源码Mysql命令行),MIN()函数是求最小值的函数: mysql> select stuname,min(score)from t_grade where stuname='张三'; /*相对max,找最小的*/ +---------+------------+ | stuname | min(score) | +---------+------------+ | 张三 | 87 | +---------+------------+ 1 row in set (0.00 sec) mysql> select stuname,min(score) as '总分' from t_grade group by stuname;/*相对于max,找最小的*/ +---------+--------+ | stuname | 总分 | +---------+--------+ | 张三 | 87 | | 李四 | 79 | | 王五 | 77 | +---------+--------+ 3 rows in set (0.00 sec) 连接查询

连接查询是将两个或两个以上的表按照某个条件连接起来,从中选取需要的数据,这儿我们创建两个基本表格来对相关操作示例:

USE `s_book`; DROP TABLE IF EXISTS `t_book`; create table `t_book`( `id` int(11) NOT NULL AUTO_INCREMENT, `bookName` varchar(20) DEFAULT NULL, `price` decimal(6,2) DEFAULT NULL, `author` varchar(20) DEFAULT NULL, `bookTypeId` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; insert into `t_book`(`id`,`bookName`,`price`,`author`,`bookTypeId`) values (1,'Java编程思想','100.00','埃史尔',1),(2,'Java从入门到精通','80.00','李钟尉',1),(3,'三剑客','70.00','大仲马',2),(4,'生理学(第二版)','24.00','刘先国',4); DROP TABLE IF EXISTS `t_booktype`; create table t_booktype( `id` int(11) NOT NULL AUTO_INCREMENT, `bookTypeName` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; insert into `t_booktype`(`id`,`bookTypeName`) values (1,'计算机类'),(2,'文学类'),(3,'教育类'); mysql> select *from t_book;/*查表所有字段*/ +----+------------------------+--------+-----------+------------+ | id | bookName | price | author | bookTypeId | +----+------------------------+--------+-----------+------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | | 4 | 生理学(第二版) | 24.00 | 刘先国 | 4 | +----+------------------------+--------+-----------+------------+ 4 rows in set (0.00 sec) mysql> select *from t_booktype;/*查表所有字段*/ +----+--------------+ | id | bookTypeName | +----+--------------+ | 1 | 计算机类 | | 2 | 文学类 | | 3 | 教育类 | +----+--------------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM t_book,t_bookType;/*两张表放在一起查*/ +----+------------------------+--------+-----------+------------+----+--------------+ | id | bookName | price | author | bookTypeId | id | bookTypeName | +----+------------------------+--------+-----------+------------+----+--------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | 1 | 计算机类 | | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | 2 | 文学类 | | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | 3 | 教育类 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | 1 | 计算机类 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | 2 | 文学类 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | 3 | 教育类 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | 1 | 计算机类 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | 2 | 文学类 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | 3 | 教育类 | | 4 | 生理学(第二版) | 24.00 | 刘先国 | 4 | 1 | 计算机类 | | 4 | 生理学(第二版) | 24.00 | 刘先国 | 4 | 2 | 文学类 | | 4 | 生理学(第二版) | 24.00 | 刘先国 | 4 | 3 | 教育类 | +----+------------------------+--------+-----------+------------+----+--------------+ 内连接查询(语法:SELECT 属性名列表 FROM 表名 1, 表名 2 WHERE 表名 1.属性名 1=表名 2.属性名 2) mysql> select *from t_book `表1`, t_booktype `表2` where 表1.booktypeid=表2.id;/*将表1中booktypeid与表2中的id联系起来*/ +----+------------------------+--------+-----------+------------+----+--------------+ | id | bookName | price | author | bookTypeId | id | bookTypeName | +----+------------------------+--------+-----------+------------+----+--------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | 1 | 计算机类 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | 1 | 计算机类 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | 2 | 文学类 | +----+------------------------+--------+-----------+------------+----+--------------+ mysql> select bookname, author, booktypename from t_book `表1`, t_booktype `表2` where 表1.booktypeid=表2.id;/*如上但是只选取部分数据显示*/ +------------------------+-----------+--------------+ | bookname | author | booktypename | +------------------------+-----------+--------------+ | Java编程思想 | 埃史尔 | 计算机类 | | Java从入门到精通 | 李钟尉 | 计算机类 | | 三剑客 | 大仲马 | 文学类 | +------------------------+-----------+--------------+ mysql> select 表1.bookname, 表1.author, 表2.booktypename from t_book `表1`, t_booktype `表2` where 表1.booktypeid=表2.id;/*与上一样,但是这样写防止混淆*/ | bookname | author | booktypename | +------------------------+-----------+--------------+ | Java编程思想 | 埃史尔 | 计算机类 | | Java从入门到精通 | 李钟尉 | 计算机类 | | 三剑客 | 大仲马 | 文学类 | +------------------------+-----------+--------------+ 外连接查询 (语法:SELECT 属性名列表 FROM 表名 1 LEFT|RIGHT JOIN 表名 2 ON 表名 1.属性名 1=表名 2.属性名 2): mysql> select *from t_book `s` left join t_booktype `sw` on s.booktypeid=sw.id;/*将表1中booktypeid与表二中id一一对应,但完全显示表1数据,表二对应不上的用null表示*/ +----+------------------------+--------+-----------+------------+------+--------------+ | id | bookName | price | author | bookTypeId | id | bookTypeName | +----+------------------------+--------+-----------+------------+------+--------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | 1 | 计算机类 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | 1 | 计算机类 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | 2 | 文学类 | | 4 | 生理学(第二版) | 24.00 | 刘先国 | 4 | NULL | NULL | +----+------------------------+--------+-----------+------------+------+--------------+ mysql> select *from t_book `s` right join t_booktype `sw` on s.booktypeid=sw.id;/*如上,但完全显示表二数据*/ +------+------------------------+--------+-----------+------------+----+--------------+ | id | bookName | price | author | bookTypeId | id | bookTypeName | +------+------------------------+--------+-----------+------------+----+--------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | 1 | 计算机类 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | 1 | 计算机类 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | 2 | 文学类 | | NULL | NULL | NULL | NULL | NULL | 3 | 教育类 | +------+------------------------+--------+-----------+------------+----+--------------+ 多条件连接查询 (语法:见源码),在内连接和外连接的基础上多加些条件而已: mysql> select *from t_book `s` right join t_booktype `sw` on s.booktypeid=sw.id and s.price>70; /*再添加条件,价格大于70才显示,完全显示第二张表*/ +------+------------------------+--------+-----------+------------+----+--------------+ | id | bookName | price | author | bookTypeId | id | bookTypeName | +------+------------------------+--------+-----------+------------+----+--------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | 1 | 计算机类 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | 1 | 计算机类 | | NULL | NULL | NULL | NULL | NULL | 2 | 文学类 | | NULL | NULL | NULL | NULL | NULL | 3 | 教育类 | +------+------------------------+--------+-----------+------------+----+--------------+ 子查询 带 In 关键字的子查询(语法:SELECT *FROM 表1 WHERE 表1属性 IN (表2查询结果) ),通俗一点,把表2的查询结果看作一个集合来作为表1查询结果的范围界限,示例如下: mysql> select id from t_booktype; /*取表格中id数据*/ +----+ | id | +----+ | 1 | | 2 | | 3 | +----+ 3 rows in set (0.00 sec) mysql> select *from t_book where booktypeid in (select id from t_booktype);/*将上面的id结果 作为本次查询的参考集合,这次查询的booktypeid在这之内,若是4,就不显示*/ +----+------------------------+--------+-----------+------------+ | id | bookName | price | author | bookTypeId | +----+------------------------+--------+-----------+------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | +----+------------------------+--------+-----------+------------+ mysql> select *from t_book where booktypeid not in (select id from t_booktype);/*与上相反*/ +----+----------------------+-------+-----------+------------+ | id | bookName | price | author | bookTypeId | +----+----------------------+-------+-----------+------------+ | 4 | 生理学(第二版) | 24.00 | 刘先国 | 4 | +----+----------------------+-------+-----------+------------+ 带比较运算符的子查询 (语法:SELECT *FROM 表1 WHERE 表1属性 [>, select price from t_book where id=3; /*查出70*/ +-------+ | price | +-------+ | 70.00 | +-------+ mysql> select *from t_book where price>(select price from t_book where id=3);/*大于70,将上述结果作为参考标准*/ +----+------------------------+--------+-----------+------------+ | id | bookName | price | author | bookTypeId | +----+------------------------+--------+-----------+------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | +----+------------------------+--------+-----------+------------+ 带 Exists 关键字的子查询(语法:见源码),假如子查询查询到记录,则进行外层查询,否则,不执行外层查询: mysql> select *from t_book where exists(select id from t_booktype); /*exists()条件为真,即返回数据,才执行前面操作,否则返回null*/ +----+------------------------+--------+-----------+------------+ | id | bookName | price | author | bookTypeId | +----+------------------------+--------+-----------+------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | | 4 | 生理学(第二版) | 24.00 | 刘先国 | 4 | +----+------------------------+--------+-----------+------------+ mysql> select *from t_book where not exists(select id from t_booktype); /*子查询为真,加个not,意思就别执行之前语句*/ Empty set (0.00 sec) 带 Any 关键字的子查询 ,(语法:SELECT *FROM 表1 WHERE 表1属性 [>, select *from t_pricelevel; /*创建一个表格便于示例*/ +------+------------+-------+--------------------+ | id | priceLevel | price | description | +------+------------+-------+--------------------+ | 1 | 1 | 80 | 价格贵的书 | | 2 | 2 | 60 | 价格适中的书 | | 3 | 3 | 40 | 价格便宜的书 | +------+------------+-------+--------------------+ mysql> select *from t_book where price> any(select price from t_pricelevel); /*any代表任意,意思大于40就行*/ +----+------------------------+--------+-----------+------------+ | id | bookName | price | author | bookTypeId | +----+------------------------+--------+-----------+------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | | 2 | Java从入门到精通 | 80.00 | 李钟尉 | 1 | | 3 | 三剑客 | 70.00 | 大仲马 | 2 | +----+------------------------+--------+-----------+------------+ 带 All 关键字的子查询 (语法:SELECT *FROM 表1 WHERE 表1属性 [>, select *from t_book where price> all(select price from t_pricelevel); /*all代表全部,意思price必须大于80*/ +----+------------------+--------+-----------+------------+ | id | bookName | price | author | bookTypeId | +----+------------------+--------+-----------+------------+ | 1 | Java编程思想 | 100.00 | 埃史尔 | 1 | +----+------------------+--------+-----------+------------+ 合并查询结果 UNION 与 UNION ALL函数(语法:表达式1 UNION[ALL] 表达式2),把结果显示处来: mysql> SELECT bookTypeName FROM t_booktype; +--------------+ | bookTypeName | +--------------+ | 计算机类 | | 文学类 | | 教育类 | +--------------+ mysql> SELECT id FROM t_book; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | +----+ mysql> SELECT id FROM t_book UNION SELECT bookTypeName FROM t_booktype; /*合并上面两个查询结果,但重复数据只显示一次*/ +--------------+ | id | +--------------+ | 1 | | 2 | | 3 | | 4 | | 计算机类 | | 文学类 | | 教育类 | +--------------+ 7 rows in set (0.00 sec) mysql> SELECT id FROM t_book; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | +----+ 4 rows in set (0.00 sec) mysql> mysql> SELECT id FROM t_booktype; +----+ | id | +----+ | 1 | | 2 | | 3 | +----+ 3 rows in set (0.00 sec) mysql> mysql> SELECT id FROM t_book UNION SELECT id FROM t_booktype; /*重复数据覆盖了*/ +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | +----+ 4 rows in set (0.00 sec) mysql> SELECT id FROM t_book UNION ALL SELECT id FROM t_booktype; /*加ALL, 使所有结果显示*/ +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 1 | | 2 | | 3 | +----+ 7 rows in set (0.00 sec) 关于属性以及表格的备注用法

写完这节,本文就结束了,上文用到了部分表格以及属性别名操作,此语法主要是 `属性名 as 别名`,`表格+空格+别名`,示例如下:

mysql> select author ,price from t_book where id=1; +-----------+--------+ | author | price | +-----------+--------+ | 埃史尔 | 100.00 | +-----------+--------+ mysql> select author as `作者`,price as `价格` from t_book 表 where 表.id=1; /*author起别名作‘者’,price起别名‘价格’,t_book起别名‘表’*/ +-----------+--------+ | 作者 | 价格 | +-----------+--------+ | 埃史尔 | 100.00 | +-----------+--------+


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3