Cheug's Blog

当前位置:网站首页 / SQL / 正文

多表查询

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.