简单多表查询
1 | SELECT TableA.name, TableA.sex, TableB.income, TableB.dscrept FROM TableA a, TableB b where a.name = b.name; |
子查询
MySQL子查询简介
子查询是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句、DML语句中也都会常用到子查询。所谓子查询是将一个查询语句嵌套在另一个查询语句中。在特定情况下,一个查询语句的条件需要另一个查询语句来获取,内层查询(inner query)语句的查询结果,可以为外层查询(outer query)语句提供查询条件。
MySQL子查询的分类
按子查询(select语句)在外部查询(select语句)出现的位置的不同可以分为:
from子查询,即子查询跟在from之后
where子查询,即子查询出现在where条件中
exists子查询,即子查询出现在exists里面
in子查询,即子查询出现在in里面
根据子查询得到的数据进行分类,可以分为:
标量子查询,即子查询得到的结果是一行一列
列子查询,即子查询得到的结构是一列多行
行子查询,即子查询的得到的结果是一行多列(也可以是多行多列)
表子查询,即子查询得到的结果是多行多列
MySQL子查询的举例
(1)from子查询
1 | select * from (select * from tb_student order by height desc) as t group by class; |
(2)where子查询
1 | select * from s_user where user_birthday = (select MAX(user_birthday) from s_user ) and user_salary = (select MAX(user_salary) from s_user); |
(3)exists子查询
1 | select * from employee where exists (select d_name from department where d_id=1004); --内层循环并没有查询到满足条件的结果,因此返回false,外层查询不执行 |
(4)in子查询
1 | select * from employee where d_id in (select d_id from department); |
JOIN操作
包括INNER JOIN/LEFT JOIN/RIGHT JOIN/FULL JOIN等,具体内容参见《数据库表连接JOIN操作》
集合操作
并集操作
在大多数开发中,使用一条select查询就会返回一个结果集。如果,我们想一次性查询多条SQL语句,并将每一条select查询的结果合并成一个结果集返回。就需要用到Union操作符,将多个select语句组合起来,这种查询被称为并(Union)。举例来说,假设现在两张表,分别是websites和apps,内容如下:
如下是使用union和union all来查询的效果图。union默认会将多个select结果中重复的记录只保留一条,而union all会保留重复的记录:
在使用union或union all时,每个select查询子句必须包含相同的列、表达式或者聚合函数 ,但列名称可以不一样。union查询在遇到不一致的字段名称时,会使用第一条select的查询字段名称,或者可以使用别名来改变查询字段名称,如下:
交集操作
差集操作
备注:在上面的“并集”、“交集”以及“差集”操作中,前后子查询的结果集中包含的字段是一样的,不过这种集合操作在实际项目中使用的并不多。