多表查询
2019-05-06 / SQL / 938 次围观 / 0 次吐槽 /多表查询有如下几种:
合并结果集;UNION 、UNION ALL
连接查询
内连接 [INNER] JOIN ON
外连接 OUTER JOIN ON
左外连接 LEFT [OUTER] JOIN
右外连接 RIGHT [OUTER] JOIN
全外连接(MySQL不支持)FULL JOIN
自然连接 NATURAL JOIN
子查询
合并结果集
作用:合并结果集就是把两个select语句的查询结果合并到一起!
合并结果集有两种方式:
UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;
UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。
要求:被合并的两个结果:列数、列类型必须相同
连接查询 (非常重要)
连接查询就是求出多个表的乘积,例如表1连接表2,那么查询出的结果就是表1*表2。
SELECT * FROM 表1,表2;
连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。
那么多表查询产生这样的结果并不是我们想要的,那么怎么去除重复的,不想要的记录呢,当然是通过条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过关联关系去除笛卡尔积。
SELECT * FROM 表1,表2 WHERE 表1.字段 = 表2.字段; SELECT 表1.字段,表2.字段 FROM 表1,表2 WHERE 表1.字段 = 表2.字段;
内连接
上面的连接语句就是内连接,但它不是SQL标准中的查询方式,可以理解为方言!SQL标准的内连接为:
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段=表2.字段;
外连接(左连接、右连接)
外连接的特点:查询出的结果存在不满足条件的可能。
左连接
是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。
SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 表1.字段 = 表2.字段;
右连接
右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。
SELECT * FROM 表1 RIGHT OUTER JOIN 表2 ON 表1.字段=表2.字段;
自然连接
大家也都知道,连接查询会产生无用笛卡尔积,我们通常使用主外键关系等式来去除它。而自然连接无需你去给出主外键等式,它会自动找到这一等式:
两张连接的表中名称和类型完全一致的列作为条件,例如表1和表2都存在相同字段,并且类型一致,所以会被自然连接找到!
当然自然连接还有其他的查找条件的方式,但其他方式都可能存在问题!
select * from 表1 natural join 表2;//自然连接 SELECT * FROM 表1 inner JOIN 表2 using(字段);//等同于自然连接 select * from 表1 natural left join 表2;//左连接 select * from 表1 left join 表2 using(字段);//左连接 select * from 表1 natural right join 表2;//右连接 select * from 表1 right join 表2 using(字段);//右连接
子查询
子查询概念:
一个select语句中包含另一个完整的select语句。
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
子查询出现的位置:
where后,作为查询条件的一部分;
from后,作表;
当子查询出现在where后作为条件时,还可以使用如下关键字:
any
all
子查询结果集的形式:
单行单列(用于条件)
单行多列(用于条件)
多行单列(用于条件)
多行多列(用于表)
自连接:自己连接自己,起别名
SELECT 别名1.字段,别名1.字段,别名.字段,别名.字段 FROM 表 别名1, 表 别名2 WHERE 别名1.字段 = 别名2.字段 AND 别名1.字段 = 条件;
连接查询心得:
连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。
两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件。
Powered By Cheug's Blog
Copyright Cheug Rights Reserved.