数据库中多表查询操作

简单多表查询

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的查询字段名称,或者可以使用别名来改变查询字段名称,如下:

交集操作

差集操作

备注:在上面的“并集”、“交集”以及“差集”操作中,前后子查询的结果集中包含的字段是一样的,不过这种集合操作在实际项目中使用的并不多。