MySQL学习第三部分
连接查询
含义:又称多表查询,当查询的字段来自于多个表时,就会使用到连接查询
笛卡尔乘积现象:表一有m行,表二有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
分类:按年代分类:1、sql192标准:仅仅支持内连接
2、sql199标准(推荐):支持内连接+外连接(左外和右外)+交叉连接
按功能分类:1、内连接:等值连接、非等值连接、自连接
2、外连接:左外连接、右外连接、全外连接
3、交叉连接
等值连接介绍
语法:SELECT 字段名1,字段名2 FROM 表名1,表名2 WHERE 表名1.字段名3=表名2.字段名4;
一、sql92标准:
1、等值连接:
i、多表等值连接结果为多表的交集部分
ii、n表连接,至少需要n-1个连接条件
iii、多表的顺序没有要求
iv、一般需要为表取别名
v、可以搭配前面介绍的所有子句使用,比如:筛选、分组、排序
2、非等值连接:
使用BETWEEN AND模糊条件运算符放在WHERE后
3、自连接:
查询同一张表中两次使用同一字段名
SELECT 别名1.字段名1,别名1.字段名2,别名2.字段名1,别名2.字段名2
FROM 表名 别名1,表名 别名2
WHERE 别名1.字段名1=别名2.字段名1;
sql99标准
语法:SELECT 查询列表
FROM 表1 别名[连接类型]
JOIN 表1 别名 ON 连接条件
[WHERE 筛选条件]
[GROUP BY 分组]
[HAVING 筛选条件]
[ORDER BY 排序列表];
分类:内连接:INNER
外连接:左外:LEFT [OUTER]
右外:RIGHT [OUTER]
全外:FULL[OUTER]
交叉连接:CROSS
(一)内连接:
语法:SELECT 查询列表
FROM 表1 别名1
INNER JOIN 表2 别名2 ON 连接条件
分类:i、添加排序、分组、筛选条件
ii、INNER可以省略
iii、筛选条件放在WHERE后面,连接条件放在ON后面,提高分离性,便于阅读
iv、INNER JOIN连接和sql92语法中的等值连接效果时一样的,都是查询多表交际。
(二)外连接:
应用场景:用于查询一个表中有,另一个表中没有的记录
特点:i、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的记录,则显示匹配的值;
如果从表中没有和它匹配的记录,则显示NULL值。
ii、左外连接,LEFT OUTER JOIN左边的是主表
右外连接:RIGHT OUTER JOIN右边的是主表
iii、左外和右外交换两个表的顺序,可以实现同样的效果
iv、全外连接=内连接的结果+表1中有但表2中没有的+表2中有但表1中没有的
(三)交叉连接
(四)sql92和sql99 PK:
功能:sql99支持的较多
可读性:sql99实现连接条件和筛选条件的分离,可读性较高