Python全栈(三)数据库优化之4.数据库查询(分组、排序、分页、连接查询、子查询)

一、分组与分组后的筛选

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电子书。

发布了51 篇原创文章 · 获赞 184 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/CUFEECR/article/details/103375856
今日推荐