小白终是踏上了这条不归路----小文的mysql学习笔记(6)----连接查询-----等值连接、非等值连接、自链接、外连接、交叉连接
**
小白终是踏上了这条不归路----小文的mysql学习笔记(1)
小白终是踏上了这条不归路----小文的mysql学习笔记(2)----条件查询
小白终是踏上了这条不归路----小文的mysql学习笔记(3)----排序询查
小白终是踏上了这条不归路----小文的mysql学习笔记(4)----常见的基本函数
小白终是踏上了这条不归路----小文的mysql学习笔记(5)----分组查询
…
…
小白终是踏上了这条不归路----小文的mysql学习笔记(目录)
**
连接查询有点多,但是模式是固定的和前面的也基本相差不多。唉什么时候才能出去唉,我都在家两个多月了都没出过门。【????】
**
链接查询
含义:又称多表查询,当查询的字段来自于多个表时,就会用到链接查询。
分类:
按年代分类:sq192标准:仅仅支持内连接;
sq199标准【推荐】:支持内链接+外连接(左外和右外)+交叉链接;
按功能分类:
内连接:等值连接;
非等值连接;
自链接;
外连接:左外链接;
右外连接;
全外连接;
交叉连接;
这里解释一个在多表查询时出现的一个现象----笛卡尔现象
笛卡尔乘积现象:表1有m行;表2有n行;查找结果=m*n行
发生:在多表查询时没有添加有效的连接条件
解决:添加有效的连接条件
一、sq192标准
特点:多表等值连接的结果为多表的交集部分
N个表连接,至少需要N-1个连接条件
多表的顺序没有要求
一般需要为表起别名
可以搭配前面学习的所有语法使用,比如排序、分组、筛选等。
1、等值连接
语法: select查询列表
from表1别名,表2别名
where表1. key=表2. key
【and筛选条件】
【group by 分组字段】
【having分组后的筛选】
【order by 排序字段】
例(1):查询员工名和对应的部门名#2、为表 #(1)为表起别名
好处: 提高语句的简洁度;
区分多个重名的字段。
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
例(1):查询员工名、工种号、工种名。
#(2)查询时的两个表顺序可以调换,不影响查询结果
#(3)添加筛选条件
例(1):查询城市名中第二个字母为o的城市名和部门名
#(5)添加分组
例(1):查询每个城市的部门个数
例(2): 查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资。
#(6)添加排序
例(1):查询每个工种的工种名和员工的个数,并且按员工个数降序
#(7)可以实现3表链接
例(1):查询员工名、部门名和所在的城市
2、非等值连接
个人理解:若链接条件不是=,则为非等值连接
语法: select查询列表
from表1别名,表2别名
where 非等值的链接条件
【and筛选条件】
【group by 分组字段】
【having分组后的筛选】
【order by 排序字段】
例(1):查询员工的工资和工资级别
查询结果:
3、自链接
MySQL自连接就是在同一张表上自己连接自己,参与连接的表是同一张表,通过设置表别名虚拟出两张表。当我们想将表中行与同一表中的其他行组合或运算时,可以使用自连接。要执行自连接操作必须使用表别名来帮助MySQL在查询中区分连接后的虚拟结果集中的字段。
语法: select查询列表
from表 别名1,表 别名2
where 等值的连接条件
【and筛选条件】
【group by 分组字段】
【having分组后的筛选】
【order by 排序字段】
例:查询员工名和上级的名称。
二、sq199语法
语法: select 查询列表
表1别名1【连接类型】
join表2别名
on连接条件
【where筛选条件】
【group by分组】
【having筛选条件】
【order by排序列表】
分类:
内连接(★) : inner
外连接:
左外(★) :left 【outer】
右外(★): right 【outer】
全外: full 【outer】
注:outer可省略
交叉连接: cross
1、内连接
语法: select 查询列表
From 表1 别名
inner join 表2 别名
on 链接条件;
分类:(1)等值连接;(2)非等值连接;(3)自链接
特点: ①添加排序、分组、筛选
②inner可以省略
③筛选条件放在where后面, 连接条件放在on后面,提高分离性,便于阅读
④inner join连 接和sq192语法中的等值连接效果是一样的,都是查询多表的交集
#1等值连接
例(1).查询员工名、部门名
例(2):查询名字中包含e的员工名和工种名【添加筛选条件】
例(3):查询部门个数>3的城市名和部门个数【分组+筛选】
例(4):查询哪个部门的部门员工个数>3的部门名和员工个数,并按个数降序【排序】
例(5)查询员工名、部门名、工种名,并按部门名降序【三表查询】
#2非等值连接
个人理解:非等值连接即连接条件不是等号
例(1)查询员工的工资级别
查询结果:
#3自链接
例:查询员工名和上级的名称。
2、外连接
外连接一般用于用于查询一个表中有,另一个表没有的记录。
特点: 1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录。
2、左外连接,left join左边的是主表
右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的,即两张表取并集。
例子:查询表中没有员工的部门【用左外连接查询】
例子:查询表中没有员工的部门【用右外连接查询】
全外连接
全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的,即两张表取并集。
并且在我们sql中不支持这种写法。
3、交叉连接
相当于用sq199的标准来实现的笛卡尔乘积
案例:
总结:一般 sq199使用较多支 持的较,因为sq199实现连接条件和筛选条件的分离,可读性更高。
**
感谢支持,点个赞呗
**