文章目录
一、分组与分组后的筛选
1.分组
关键字:group by
将查询结果按照1个或多个字段进行分组,字段值相同的为一组;
可用于单个字段分组,也可用于多个字段分组
语法:select ... from 表 group by 组别;
select name from students group by gender;
打印
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'demo.students.NAME' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
报错,并且没有实际意义,即select后接的是能区分这个组的字段,一般是聚合函数。
select gender from students group by gender;
打印
+--------+
| gender |
+--------+
| male |
| female |
| secret |
+--------+
3 rows in set (0.01 sec)
统计每个组的数量
select gender,count(*) from students group by gender;
打印
+--------+----------+
| gender | count(*) |
+--------+----------+
| male | 4 |
| female | 6 |
| secret | 17 |
+--------+----------+
3 rows in set (0.00 sec)
换别名
select gender as sex,count(*) from students group by gender;
打印
+--------+----------+
| sex | count(*) |
+--------+----------+
| male | 4 |
| female | 6 |
| secret | 17 |
+--------+----------+
3 rows in set (0.00 sec)
查找各个组的最值
select gender as sex,max(age) from students group by gender;
打印
+--------+----------+
| sex | max(age) |
+--------+----------+
| male | 19 |
| female | 19 |
| secret | 19 |
+--------+----------+
3 rows in set (0.00 sec)
查看组内信息:
group_concat(...)
字段,可以作为一个输出字段来使用;
表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合,相对于对字符串进行拼接。
select gender as sex,group_concat(name) from students group by gender;
打印
+--------+--------------------------------------------------------------------------------------+
| sex | group_concat(name) |
+--------+--------------------------------------------------------------------------------------+
| male | Tom,Jerry,Nancy,Tony |
| female | Rose,Rose,Rose,Rose,Rose,Rose |
| secret | John,John,John,John,John,John,John,John,John,John,John,John,John,John,John,John,null |
+--------+--------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
查看多个字段
select gender as sex,group_concat(name,'-',age) from students group by gender;
打印
+--------+---------------------------------------------------------------------------------------------------------
--------------------------------+
| sex | group_concat(name,'-',age)
|
+--------+---------------------------------------------------------------------------------------------------------
--------------------------------+
| male | Tom-18,Jerry-19,Nancy-17,Tony-18
|
| female | Rose-19,Rose-19,Rose-19,Rose-19,Rose-19,Rose-19
|
| secret | John-19,John-16,John-19,John-19,John-19,John-19,John-19,John-19,John-19,John-19,John-19,John-19,John-19,
John-19,John-16,John-19,null-18 |
+--------+---------------------------------------------------------------------------------------------------------
--------------------------------+
3 rows in set (0.00 sec)
2.分组之后的筛选
分组之后根据条件进行筛选不能再用where语句,要用having语句;
having 条件表达式用来分组查询后指定一些条件来输出查询结果。
--查询性别分组中人数大于5的组别
select gender,count(*) from students group by gender having count(*) > 5;
打印
+--------+----------+
| gender | count(*) |
+--------+----------+
| female | 6 |
| secret | 17 |
+--------+----------+
2 rows in set (0.00 sec)
--查询男生女生人数大于2的姓名
select gender,count(*),group_concat(name) from students group by gender having count(*) > 2;
打印
+--------+----------+--------------------------------------------------------------------------------------+
| gender | count(*) | group_concat(name) |
+--------+----------+--------------------------------------------------------------------------------------+
| male | 4 | Tom,Jerry,Nancy,Tony |
| female | 6 | Rose,Rose,Rose,Rose,Rose,Rose |
| secret | 17 | John,John,John,John,John,John,John,John,John,John,John,John,John,John,John,John,null |
+--------+----------+--------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)
--查询平均年龄超过18岁的姓名,以及姓名
select gender,avg(age),group_concat(name) from students group by gender having avg(age) > 18;
打印
+--------+----------+--------------------------------------------------------------------------------------+
| gender | avg(age) | group_concat(name) |
+--------+----------+--------------------------------------------------------------------------------------+
| female | 19.0000 | Rose,Rose,Rose,Rose,Rose,Rose |
| secret | 18.5882 | John,John,John,John,John,John,John,John,John,John,John,John,John,John,John,John,null |
+--------+----------+--------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
having作用和where一样,但having只能用于group by。
二、排序
为了方便查看数据,可以对数据进行排序。
关键字:order by
语法:select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...];
将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推;
asc从小到大排列,即升序,是默认值;
desc从大到小排列,即降序。
--查询年龄在18-26岁之间的男同学,按照年龄从小到大排序
select * from students where (age between 18 and 26) and gender =1 order by age;
打印
+----+-------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+-------+------+--------+--------+------------+-----------+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
+----+-------+------+--------+--------+------------+-----------+--------+
3 rows in set (0.01 sec)
与
select * from students where (age between 18 and 26) and gender =1 order by age asc;
效果一样。
--查询年龄在18-26岁之间的女同学,按照身高从低到高排序
select * from students where (age between 18 and 26) and gender =1 order by height;
打印
+----+-------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+-------+------+--------+--------+------------+-----------+--------+
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
+----+-------+------+--------+--------+------------+-----------+--------+
3 rows in set (0.00 sec)
order by排序多个字段:
排序的字段相同时,再按照后边的字段进行排序。
--查询年龄在18-26岁之间的男同学,按照身高从高到低排序,身高相同时按照年龄从小到大排序
select * from students where (age between 18 and 26) and gender =1 order by height desc,age asc;
打印
+----+-------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+-------+------+--------+--------+------------+-----------+--------+
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
+----+-------+------+--------+--------+------------+-----------+--------+
3 rows in set (0.00 sec)
--按照年龄从大到小、身高从低到高排序
select * from students order by age desc,height asc;
打印
+----+-------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+-------+------+--------+--------+------------+-----------+--------+
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 |
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 |
+----+-------+------+--------+--------+------------+-----------+--------+
27 rows in set (0.00 sec)
三、分页与制作分页
1.分页简介
当数据量过大时,在一页中查看数据是一件非常麻烦的事情,我们可以限制查出来的数据个数,即限制显示条数,这就是分页。
语法:select * from 表名 limit start,count;
–start起始的位置,从0开始,count个数,表示从start开始,获取count条数据。
select * from students limit 2;
打印
+----+-------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+-------+------+--------+--------+------------+-----------+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
+----+-------+------+--------+--------+------------+-----------+--------+
2 rows in set (0.01 sec)
显示了前2条数据。
select * from students limit 5,5;
打印
+----+------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+------+------+--------+--------+------------+-----------+--------+
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 |
+----+------+------+--------+--------+------------+-----------+--------+
5 rows in set (0.00 sec)
查询了第6-10条数据。
2.制作分页
--每页显示2个,第1页
select * from students limit 0,2;
打印
+----+-------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+-------+------+--------+--------+------------+-----------+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
+----+-------+------+--------+--------+------------+-----------+--------+
2 rows in set (0.00 sec)
--每页显示2个,第2页
select * from students limit 2,2;
打印
+----+-------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+-------+------+--------+--------+------------+-----------+--------+
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
+----+-------+------+--------+--------+------------+-----------+--------+
2 rows in set (0.00 sec)
--每页显示2个,第3页
select * from students limit 4,2;
打印
+----+------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+------+------+--------+--------+------------+-----------+--------+
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 |
+----+------+------+--------+--------+------------+-----------+--------+
2 rows in set (0.00 sec)
--每页显示2个,第4页
select * from students limit 6,2;
打印
+----+------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+------+------+--------+--------+------------+-----------+--------+
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 |
+----+------+------+--------+--------+------------+-----------+--------+
2 rows in set (0.00 sec)
可总结出规律:
第n页:limit (n-1)*每页显示个数
,但是不能在SQL语句中直接使用公式,要提前算出数值。
limit语句只能放在SQL语句最后,只有先查询到数据才能分页。
select gender from students group by gender limit 0,2;
打印
+--------+
| gender |
+--------+
| male |
| female |
+--------+
2 rows in set (0.00 sec)
四、连接查询
当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回。
在MySQL中支持三种类型的连接查询:
1.内连接查询:
查询的结果为两个表匹配到的数据,如下图所示:
语法:select ... from 表A inner join 表B on 表1.列 = 表2.列;
select * from students inner join classes;
打印
+----+-------+------+--------+--------+------------+-----------+--------+----+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height | id | name |
+----+-------+------+--------+--------+------------+-----------+--------+----+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 | 1 | class1 |
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 | 2 | class2 |
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 | 3 | class3 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 | 1 | class1 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 | 2 | class2 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 | 3 | class3 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 | 1 | class1 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 | 2 | class2 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 | 3 | class3 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 1 | class1 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 2 | class2 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 3 | class3 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 | 1 | class1 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 | 2 | class2 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 | 3 | class3 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 | 1 | class1 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 | 2 | class2 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 | 3 | class3 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 1 | class1 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 | 1 | class1 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 | 2 | class2 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 | 3 | class3 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 | 1 | class1 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 | 1 | class1 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 | 2 | class2 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 | 3 | class3 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 1 | class1 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 | 1 | class1 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 | 2 | class2 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 | 3 | class3 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 1 | class1 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 | 1 | class1 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 | 2 | class2 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 | 3 | class3 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 1 | class1 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 | 1 | class1 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 | 2 | class2 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 | 3 | class3 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 | 1 | class1 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 | 1 | class1 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 | 2 | class2 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 | 3 | class3 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 | 1 | class1 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 | 2 | class2 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 | 3 | class3 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 | 1 | class1 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 | 2 | class2 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 | 3 | class3 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 1 | class1 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 2 | class2 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 3 | class3 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 | 1 | class1 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 | 2 | class2 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 | 3 | class3 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 | 1 | class1 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 | 2 | class2 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 | 3 | class3 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 | 1 | class1 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 | 2 | class2 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 | 3 | class3 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 | 1 | class1 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 | 2 | class2 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 | 3 | class3 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 | 1 | class1 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 | 2 | class2 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 | 3 | class3 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 | 1 | class1 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 | 2 | class2 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 | 3 | class3 |
+----+-------+------+--------+--------+------------+-----------+--------+----+--------+
81 rows in set (0.00 sec)
得到的是两个表的笛卡儿积,但是一般无意义。
--查询对应班级的学生及班级信息
select * from students inner join classes on students.cls_id = classes.id;
打印
+----+-------+------+--------+--------+------------+-----------+--------+----+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height | id | name |
+----+-------+------+--------+--------+------------+-----------+--------+----+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 | 1 | class1 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 | 3 | class3 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 | 2 | class2 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 1 | class1 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 | 3 | class3 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 | 1 | class1 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 | 3 | class3 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 | 1 | class1 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 | 1 | class1 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 | 2 | class2 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 | 2 | class2 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 | 2 | class2 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 | 3 | class3 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 | 1 | class1 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 1 | class1 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 | 1 | class1 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 | 2 | class2 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 | 1 | class1 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 | 2 | class2 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 | 2 | class2 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 | 1 | class1 |
+----+-------+------+--------+--------+------------+-----------+--------+----+--------+
27 rows in set (0.00 sec)
去除重复信息
--查询对应班级的学生及班级信息
select students.*,classes.name from students inner join classes on students.cls_id = classes.id;
打印
+----+-------+------+--------+--------+------------+-----------+--------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height | name |
+----+-------+------+--------+--------+------------+-----------+--------+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 | class1 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 | class3 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 | class2 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | class1 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 | class3 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 | class1 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | class2 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 | class3 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 | class3 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 | class1 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | class2 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 | class1 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | class2 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 | class2 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | class2 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 | class2 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 | class3 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 | class2 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 | class3 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 | class1 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | class1 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 | class1 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 | class2 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 | class1 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 | class2 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 | class2 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 | class1 |
+----+-------+------+--------+--------+------------+-----------+--------+--------+
27 rows in set (0.00 sec)
换别名
--查询对应班级的学生及班级信息
select s.*,c.name from students as s inner join classes as c on s.cls_id = c.id;
打印
+----+-------+------+--------+--------+------------+-----------+--------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height | name |
+----+-------+------+--------+--------+------------+-----------+--------+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 | class1 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 | class3 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 | class2 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | class1 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 | class3 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 | class1 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | class2 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 | class3 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 | class3 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 | class1 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | class2 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 | class1 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | class2 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 | class2 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | class2 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 | class2 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 | class3 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 | class2 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 | class3 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 | class1 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | class1 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 | class1 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 | class2 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 | class1 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 | class2 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 | class2 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 | class1 |
+----+-------+------+--------+--------+------------+-----------+--------+--------+
27 rows in set (0.00 sec)
--查询对应班级的学生及班级信息
select c.name,s.* from students as s inner join classes as c on s.cls_id = c.id;
打印
+--------+----+-------+------+--------+--------+------------+-----------+--------+
| name | id | NAME | age | gender | cls_id | birth | is_delete | height |
+--------+----+-------+------+--------+--------+------------+-----------+--------+
| class1 | 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| class3 | 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
| class2 | 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 |
| class1 | 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| class3 | 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 |
| class1 | 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 |
| class2 | 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class3 | 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 |
| class3 | 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 |
| class1 | 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 |
| class2 | 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class1 | 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 |
| class2 | 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class2 | 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 |
| class2 | 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class2 | 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 |
| class3 | 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 |
| class2 | 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 |
| class3 | 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 |
| class1 | 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 |
| class1 | 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| class1 | 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
| class2 | 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 |
| class1 | 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 |
| class2 | 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 |
| class2 | 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 |
| class1 | 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 |
+--------+----+-------+------+--------+--------+------------+-----------+--------+
27 rows in set (0.00 sec)
加入排序
select c.name,s.* from students as s inner join classes as c on s.cls_id = c.id order by c.name;
打印
+--------+----+-------+------+--------+--------+------------+-----------+--------+
| name | id | NAME | age | gender | cls_id | birth | is_delete | height |
+--------+----+-------+------+--------+--------+------------+-----------+--------+
| class1 | 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 |
| class1 | 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| class1 | 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 |
| class1 | 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
| class1 | 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 |
| class1 | 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| class1 | 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 |
| class1 | 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| class1 | 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 |
| class1 | 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 |
| class2 | 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 |
| class2 | 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class2 | 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 |
| class2 | 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class2 | 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 |
| class2 | 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 |
| class2 | 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class2 | 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 |
| class2 | 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 |
| class2 | 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 |
| class2 | 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class3 | 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
| class3 | 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 |
| class3 | 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 |
| class3 | 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 |
| class3 | 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 |
| class3 | 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 |
+--------+----+-------+------+--------+--------+------------+-----------+--------+
27 rows in set (0.00 sec)
select c.name,s.* from students as s inner join classes as c on s.cls_id = c.id order by c.name,s.id asc;
打印
+--------+----+-------+------+--------+--------+------------+-----------+--------+
| name | id | NAME | age | gender | cls_id | birth | is_delete | height |
+--------+----+-------+------+--------+--------+------------+-----------+--------+
| class1 | 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| class1 | 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| class1 | 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 |
| class1 | 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 |
| class1 | 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 |
| class1 | 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 |
| class1 | 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| class1 | 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
| class1 | 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 |
| class1 | 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 |
| class2 | 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 |
| class2 | 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class2 | 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class2 | 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class2 | 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 |
| class2 | 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| class2 | 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 |
| class2 | 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 |
| class2 | 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 |
| class2 | 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 |
| class2 | 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 |
| class3 | 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
| class3 | 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 |
| class3 | 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 |
| class3 | 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 |
| class3 | 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 |
| class3 | 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 |
+--------+----+-------+------+--------+--------+------------+-----------+--------+
27 rows in set (0.00 sec)
2.左连接查询
查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充,如下图:
语法:select ... from 表A left join 表B on 表1.列 = 表2.列;
以第一个表为主,应用比右连接更多。
select * from students left join classes on students.cls_id = classes.id;
打印
+----+-------+------+--------+--------+------------+-----------+--------+------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height | id | name |
+----+-------+------+--------+--------+------------+-----------+--------+------+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 | 1 | class1 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 1 | class1 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 | 1 | class1 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 | 1 | class1 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 | 1 | class1 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 | 1 | class1 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 | 1 | class1 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 | 1 | class1 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 | 1 | class1 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 | 1 | class1 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 | 2 | class2 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 | 2 | class2 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 | 2 | class2 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 | 2 | class2 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 | 2 | class2 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 | 2 | class2 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 | 2 | class2 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 | 2 | class2 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 | 3 | class3 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 | 3 | class3 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 | 3 | class3 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 | 3 | class3 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 | 3 | class3 |
+----+-------+------+--------+--------+------------+-----------+--------+------+--------+
27 rows in set (0.01 sec)
select * from students as s left join classes as c on s.cls_id = c.id having c.id is null;
打印
Empty set (0.00 sec)
与
select * from students as s left join classes as c on s.cls_id = c.id where c.id is null;
效果相同。
连接后筛选用的关键字是having,也可以用where,但是建议用having。
select c.name,s.* from students as s left join classes as c on s.cls_id = c.id having c.id is null and s.is_delete = 1;
打印
Empty set (0.00 sec)
3.右连接
查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充,如下图:
语法:select ... from 表A right join 表B on 表1.列 = 表2.列;
以第二个表为主,应用比左连接更少,一般可以转化成左连接。
select * from students right join classes on students.cls_id = classes.id;
打印
+------+-------+------+--------+--------+------------+-----------+--------+----+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height | id | name |
+------+-------+------+--------+--------+------------+-----------+--------+----+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165 | 1 | class1 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157 | 3 | class3 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165 | 2 | class2 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168 | 1 | class1 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165 | 3 | class3 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176 | 1 | class1 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165 | 2 | class2 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153 | 3 | class3 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165 | 3 | class3 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169 | 1 | class1 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165 | 2 | class2 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158 | 1 | class1 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165 | 2 | class2 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183 | 2 | class2 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165 | 2 | class2 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173 | 2 | class2 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165 | 3 | class3 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159 | 2 | class2 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176 | 3 | class3 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157 | 1 | class1 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168 | 1 | class1 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173 | 1 | class1 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175 | 2 | class2 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164 | 1 | class1 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160 | 2 | class2 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171 | 2 | class2 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169 | 1 | class1 |
+------+-------+------+--------+--------+------------+-----------+--------+----+--------+
27 rows in set (0.02 sec)
五、子查询
即嵌套查询,在一个select语句中嵌套另一个select语句,被嵌入的select语句称之为子查询语句。
--查询最高的男生信息
select * from students where height = (
select max(height) from students where gender = 1) and gender = 1;
打印
+----+------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+------+------+--------+--------+------------+-----------+--------+
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
+----+------+------+--------+--------+------------+-----------+--------+
1 row in set (0.00 sec)
--查询高于平均身高的信息
select * from students where height > (select avg(height) from students);
打印
+----+------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+------+------+--------+--------+------------+-----------+--------+
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 |
+----+------+------+--------+--------+------------+-----------+--------+
11 rows in set (0.01 sec)
列级子查询
与内连接效果一样。
--查询学生的班级号能够对应的学生信息
select * from students where cls_id in (select id from classes);
打印
+----+-------+------+--------+--------+------------+-----------+--------+
| id | NAME | age | gender | cls_id | birth | is_delete | height |
+----+-------+------+--------+--------+------------+-----------+--------+
| 1 | Tom | 18 | male | 1 | 1999-09-09 | 1 | 165.00 |
| 2 | Jerry | 19 | male | 3 | 1999-10-09 | 1 | 157.00 |
| 3 | Nancy | 17 | male | 2 | 1999-08-09 | 1 | 165.00 |
| 4 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| 6 | John | 16 | secret | 3 | 1999-05-09 | 1 | 165.00 |
| 7 | John | 19 | secret | 1 | 1999-07-09 | 1 | 176.00 |
| 8 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 9 | John | 19 | secret | 3 | 1999-07-09 | 1 | 153.00 |
| 10 | John | 19 | secret | 3 | 1999-07-09 | 1 | 165.00 |
| 11 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 169.00 |
| 12 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 13 | Rose | 19 | female | 1 | 1999-07-09 | 1 | 158.00 |
| 14 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 15 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 183.00 |
| 16 | John | 19 | secret | 2 | 1999-07-09 | 1 | 165.00 |
| 17 | John | 19 | secret | 2 | 1999-07-09 | 1 | 173.00 |
| 18 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 165.00 |
| 19 | John | 19 | secret | 2 | 1999-07-09 | 1 | 159.00 |
| 20 | Rose | 19 | female | 3 | 1999-07-09 | 1 | 176.00 |
| 21 | John | 19 | secret | 1 | 1999-07-09 | 1 | 157.00 |
| 22 | John | 19 | secret | 1 | 1999-07-09 | 1 | 168.00 |
| 23 | Tony | 18 | male | 1 | 1990-01-01 | 1 | 173.00 |
| 24 | John | 19 | secret | 2 | 1999-07-09 | 1 | 175.00 |
| 25 | John | 16 | secret | 1 | 1999-05-09 | 1 | 164.00 |
| 26 | John | 19 | secret | 2 | 1999-07-09 | 1 | 160.00 |
| 27 | Rose | 19 | female | 2 | 1999-07-09 | 1 | 171.00 |
| 28 | null | 18 | secret | 1 | 1990-01-01 | 0 | 169.00 |
+----+-------+------+--------+--------+------------+-----------+--------+
27 rows in set (0.00 sec)
--查询最大年龄的女性id
select id,name from students where age = (select max(age) from students where gender = 2) and gender = 2;
打印
+----+------+
| id | name |
+----+------+
| 11 | Rose |
| 13 | Rose |
| 15 | Rose |
| 18 | Rose |
| 20 | Rose |
| 27 | Rose |
+----+------+
6 rows in set (0.00 sec)
大家也可以关注我的公众号:Python极客社区,在我的公众号里,经常会分享很多Python的文章,而且也分享了很多工具、学习资源等。另外回复“电子书”还可以获取十本我精心收集的Python电子书。