MySQL多表连接查询——等值连接、非等值连接和自连接

MySQL多表连接查询

1. 含义:

又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

笛卡尔乘积现象: 表1 有m行,
                              表2 有n行,那么结果=m*n行
在这里插入图片描述
笛卡尔乘积现象:如果连接条件省略或无效的连接条件,导致现象出现
解决办法:添加有效的连接条件
在这里插入图片描述

2. 分类:

年代分类:
           sql92标准:仅仅支持内连接
           sql99标准:【推荐使用】:支持内连接、外连接(左外和右外)、交叉连接
功能分类:
           内连接:等值连接 、非等值连接 、 自连接
           外连接:左外连接 、 右外连接 、 全外连接
           交叉连接.

一、sql92标准

1) 等值连接

特点:
     ① 多表等值连接的结果为多表的交集部分
     ② n表连接,至少需要n-1个连接条件
     ③ 多表不分主次,没有顺序要求
     ④ 一般为表起别名,提高阅读性和性能
     ⑤ 可以搭配排序、分组、筛选….等子句使用

# 查询员工名和对应的部门名
在这里插入图片描述
1. 为表起别名

好处:
      ①提高语句的简洁度;
      ②区分多个重名的字段

注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定

#查询员工名、工种号、工种名
在这里插入图片描述
这里需要用表名限定
但如果反复用表名去限定,语句更复杂
因此,可以为表名起别名
在这里插入图片描述

2. 两个表的顺序可以调换
#查询员工名、工种号、工种名
在这里插入图片描述

3. 可以添加筛选条件
#查询有奖金的员工名、部门名
在这里插入图片描述
#查询城市名中第二个字符为o的部门名和城市名
在这里插入图片描述
4. 可以添加分组
#查询每个城市的部门个数
在这里插入图片描述
5. 可以添加排序
#查询每个工种的工种名和员工的个数,并且按员工个数降序
在这里插入图片描述
6. 三表连接
在这里插入图片描述

2) 非等值连接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3) 自连接

#查询员工名和上级的名称
在这里插入图片描述

二、sql99语法:通过join关键字实现连接

1. 含义: 1999年推出的sql语法
2. 语法:
            select 查询列表
            from 表1 别名 【连接类型】
            join 表2 别名 on 连接条件
          【where 筛选条件】
          【group by 分组字段】
          【having 分组后的筛选条件】
          【order by 排序的字段或表达式】
3. 分类:
           内连接 :inner
           外连接 :
                       左外 : left 【outer】
                       右外 :right【outer】
                       全外 : full 【outer】
            交叉连接 :cross join

1> 内连接:

语法:
         select 查询列表
         from 表1 别名
         inner join 表2 别名
         on 连接条件 ;
分类:
         等值
         非等值
         自连接

A. 等值连接

特点:
       ①添加排序、分组、筛选
       ②inner可以省略
       ③筛选条件放在where后面, 连接条件放在on后面,提高分离性,便于阅读(sql99的好处)
       ④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集

1.查询员工名、部门名
在这里插入图片描述
注:两个表调换顺序,结果一样

2.查询名字中包含e的员工名和工种名(添加条件)
在这里插入图片描述

3.查询部门个数>3的城市名和部门个数(添加分组+筛选)
① 查询每个城市的部门个数
② 在①结果上筛选满足条件的
在这里插入图片描述
4.查询员工个数>3的部门名和员工个数,且按个数降序的部门(添加排序)
在这里插入图片描述
5.查询员工名、部门名、工种名,并按部门名降序(三表连接)
在这里插入图片描述
B. 非等值连接
查询工资级别的个数>20的个数,并且按工资级别降序
在这里插入图片描述
C. 自连接
查询员工的名字、上级的名字

2> 外连接

用于查询一个表中有,另一个表中没有的记录

特点:
      ①外连接的查询结果为主表中的所有记录
          *如果从表中有和它匹配的,则显示匹配的值
          *如果从表中没有和它匹配的,则显示null
          *外连接查询结果=内连接结果(交集部分)+主表中有而从表中没有的(用null填充)记录
      ②左外连接,left join左边的是主表
          右外连接,right join右边的是主表
      ③左外和右外交换两个表的顺序,可以实现同样的效果
      ④全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

左外连接 :
#查询没有员工的部门
注:查询的信息主要来自哪个表,哪个就是主表
在这里插入图片描述
添加条件 :

在这里插入图片描述
使用id是主键 绝对不为空

右外连接 :
在这里插入图片描述

注 : 全外链接( MySQL不支持 )

3> 交叉连接

在这里插入图片描述
sql92 VS sql99
功能:    sql99支持的较多
可读性: sql99实现连接条件和筛选条件的分离,可读性强
在这里插入图片描述

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值