MySQL学习笔记8-----多表查询,又难又重要

=========== 【康师傅Day6】===========

 

目录

1.引言

2. 实现多表查询 

2.1 出现笛卡尔积的错误

 2.2 多表查询的正确打开方式

 2.3 傲娇的表的别名,增强复杂语句可读性

2.4 3+个表手拉手

2.5 多表查询分类 

2.5.1 等值连接&非等值连接,用符号区分

2.5.2 自连接&非自连接

2.5.3 内连接&外连接

重要Max!7种SQL JOINS的实现!

 3. SQL99语法新特性

3.1 自然连接 NATURAL JOIN,经典白学

 3.2 USING 简化关联条件


1.引言

多表查询,也称关联查询,指两个或更多个表一起完成一次查询工作

前提条件:这些一起查询的表之间室友关系的,他们之间一定有关联字段,这些关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表之间靠 “部门编号” 进行关联。

这个例子中用到三个表:employees,departments,location

先用 DESC 查询一下表信息:

三张表之间的关联信息如图所示:

查询员工编号116的员工,在哪个城市工作,通过下面三条SQL语句,我们可以人为查找到,但是会占用大量的网络资源

2. 实现多表查询 

2.1 出现笛卡尔积的错误

错误的实现方式 越简单越错误

这种情况下会发现每个员工都和每个部门匹配了一遍,这种错误称为笛卡尔积的错误

错误的原因:缺少了多表链接的条件

 2.2 多表查询的正确打开方式

SELECT 显示的列
FROM 表1 , 表2
#链接条件
WHERE 表1 . 关联字段 = 表2 . 关联字段;

 例子,查询employees表中的employee_iddepartments 表中的 department_name

 当链接字段就是我们想要查找的字段时,会出现报错如下:

 解决方案:随便明确一个表让它查就可以了

         建议,从优化的角度来说,建议多表查询时,所有要查询的的字段都指明所在的表,像下面这样,不关联的字段也写清楚,可以增加运行速度

 

 2.3 傲娇的表的别名,增强复杂语句可读性

        在 FROM 语句处加别名,让语句看起来短一点,增加程序可读性

SELECT...
FROM 表名 表的别名
....

         用别名优化一下上面的程序:

 注意,一旦起了表的别名,在 SELECT 和 WHERE 中就必须全部使用它的别名!!不然报错

真的有够傲娇的呢 0.0 

2.4 3+个表手拉手

三个及以上的表要用 WHERE... AND ...拉手 ,不要用WHERE... , ...

SELECT...
FROM...
WHERE 表1.关联字段1 = 表2.关联字段1
AND 表2.关联字段2 = 表3.关联字段2 ; 

        n个表手拉手,至少需要n-1个链接条件

2.5 多表查询分类 

        针对 WHERE 后面的链接条件进行的一系列分类

2.5.1 等值连接&非等值连接,用符号区分

等值连接:用 “ = ” 进行连接,上面的例子都是等值连接

非等值连接:没有用等号进行连接的,都叫非等值连接

        例如,有一个表名为 job_grade ,规定了不同的工资区间对应不同的工资等级。

        下面查询一下每个员工都属于什么工资等级:        

2.5.2 自连接&非自连接

自连接:对应表中的自我引用。例如employees表中,员工编号对应一个主管编号,但是主管也是一名员工

         例如,我们想要查询员工id,员工姓名 以及 管理者的id,管理者的姓名:

        相当于  1. 在 FROM 中创建了两张一样的表,用不同的别名区分开  2. 在 SELECT 中写出要查找的内容,注意一定要带上表名  3. 在 WHERE 中进行对应(这里要小心对应!)

2.5.3 内连接&外连接

内连接:以上例子中,当我们通过关联字段来调取多个表的信息时,是通过行的关联信息进行匹配的,结果集中不包含一个表与另一个表匹配不上的行信息

上面写的所有都叫内链接

例如,下面这个代码的运行结果不会显示出没有管理者的员工id,以及没有员工可以管理的经理id

 外连接:除了匹配的行之外,还查询到了左表或右表中不匹配的行。细分为左外连接右外连接满外连接

例如,查询所有的员工的last_name,department_name  一旦出现所有,就是一定要用外连接了

SQL92 语法实现内连接:见上,以上全部内容都是92语法

SQL92 语法实现外连接:使用 + ,即谁腿短就在谁后面加个(+)即可。因为要查询的是所有员工,所以可能会存在有的员工没有匹配的部门,那么部门id就是腿短的那个,要写+

 注意!!!但是MySQL不支持SQL92实现外连接 0.0

SQL99 语法:使用 JION...ON 的方式实现多表查询,内外连接都能解决

        99实现内连接

      JOIN ON可以理解为,表1申请 JOIN 加入表2,同时要说明 ON 一下他和表2里的谁是认识的~

SELECT 字段1 ,字段2,字段3
FROM 表1 (INNER) JOIN 表2 -- 这个INNER可以省略!
ON 表1.关联字段1 = 表2.关联字段1
JOIN 表3
ON 表2.关联字段2 = 表3.关联字段2;

           SQL99实现左右外连接

        刚才内连接是 INNER,外连接当然就是 OUTER 啦.

LEFT (OUTER) JOIN -- 左外连接,OUTER可以省略
RIGHT (OUTER) JOIN -- 右外连接,OUTER可以省略

        因为employees在左边,所以左外连接是对应全员工 ,有的员工没有部门:

         右外连接对应的是全部门,有的部门没有员工:

         SQL99实现满外连接

        原则上SQL99的满外连接是下面这么实现的:

FULL (OUTER) JOIN -- 满外连接,OUTER可以省略
                  -- 但是!!MySQL不支持!!

        但是!MySQL不支持这个写法!!(MySQL属实不灵 *.* 真.小刀喇pp)

重要Max!7种SQL JOINS的实现!

下面这个图需要什么就直接用下面的语句带入即可!重要Max!!

 

         UNION 合并查询结果:可以给出多条SELECT语句,并将他们的结果组合成单个的结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间,用UNION或者UNION ALL关键字分隔。

SELECT column,... 
FROM table1
WHERE...
UNION (ALL) -- 就是用UNION将两部分连接一下就行
SELECT column,... 
FROM table2
WHERE...

        UNION:返回两次查询的并集,去掉重复的部分

        UNION ALL:返回两次查询的并集,不去掉重复的部分

        注意,执行 UNION ALL 所需的资源比 UNION 要少,在明确知道不会出现重复数据时,最好使用UNION ALL。例如,先求出下方两部分,再用 UNION ALL合并在一起

 

                下面实现一下一直没实现的满外连接:

        只需要把上面需要的语句分别写出来,在用UNION ALL连接在一起即可

        运行之后发现没有员工的部门和没有部门的员工都显示出来了,实现成功 

         这样就终于用MySQL实现满外连接啦,撒花~

 3. SQL99语法新特性

3.1 自然连接 NATURAL JOIN,经典白学

可以理解为SQL92中的等值连接,它会自动帮你查找两张连接表中的所有相同字段,自动等值连接

SELECT 字段1,字段2
FROM 表1  NATURAL JOIN 表2;

        例如在表 employeesdepartments 中,有两个相同的字段:

        如果想把所有字段都关联,在SQL92中需要写:

         在SQL99中可以简化为:

 这么简单!!疯狂心动!!❤ 

但是这种方式不够灵活,可能会匹配多余的东西,有点憨,不建议使用(经典白学)

3.2 USING 简化关联条件

        当两个表中的关联字段名完全一样的时候才可以用!而且只能配合 JOIN

SELECT 字段1 , 字段2 , 字段3
FROM 表1 JOIN 表2
USING (同名关联字段);

        在SQL92中需要写:

        在SQL99中可以简化为:

         上面自连接中出现的下面这种情况就不能用 USING 了哦

 


        ✿✿✿ 第六章完结撒花~✿✿✿     

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值