1. 连接查询
- 描述:查询字段来自多个表,也叫多表查询
- 分类:
- 按功能分类
- 内连接
- 外连接
- 交叉连接
- 按年代分类
- SQL92标准:仅仅支持内连接
- SQL99标准:支持内连接、外连接(左外+右外)、交叉连接
- 按功能分类
2. 内连接
分类:等值连接、非等值连接、自然连接
2.1 SQL92标准的等值连接
- 描述:将表1记录逐一与表2记录对比,通过等值连接条件来决定是否返回
# 语法
SELECT 查询列表 FROM 数据表列表 WHERE 等值连接条件 AND 筛选条件;
# 实例
SELECT b.`b_name`,p.`pro_name` FROM `bill` b,`provide` p WHERE b.`b_pro_id` = p.`pro_id`;
2.2 SQL92标准的非等值连接
- 描述:将表1记录逐一与表2记录对比,通过非等值连接条件来决定是否返回
# 语法
SELECT 查询列表 FROM 数据表列表 FROM 非等值连接条件 AND 筛选条件;
# 实例
SELECT b.`b_id`,b.`b_name`,p.`pro_id`,p.`pro_name` FROM `bill` b,`provide` p WHERE b.`b_id` > p.`pro_id`;
2.3 SQL92标准的自然连接
- 描述:自然连接一般是指自己连接自己,比如查询员工的上级,员工和上级信息都是存储在一个表中的
# 语法
SELECT 查询列表 FROM 数据表列表 FROM 自然连接条件 AND 筛选条件;
# 实例
SELECT t1.`username` 管理者,t2.`username` 领导 FROM `user` t1,`user` t2 WHERE t1.`super` = t2.`pk_id`;
2.4 SQL99标准的等值连接
# 语法
SELECT 查询列表 FROM 表1 表1别名 INNER JOIN 表2 表2别名 ON 等值连接条件 WHERE 筛选条件;
# 实例
SELECT b.`b_name`,p.`pro_name` FROM `bill` b INNER JOIN `provide` p ON b.`b_pro_id` = p.`pro_id`;
2.5 SQL99标准的非等值连接
# 语法
SELECT 查询列表 FROM 表1 表1别名 INNER JOIN 表2 表2别名 ON 非等值连接条件 WHERE 筛选条件;
# 实例
SELECT b.`b_name`,p.`pro_name` FROM `bill` b INNER JOIN `provide` p ON b.`b_id` > p.`pro_id`;
2.6 SQL99标准的自然连接
# 语法
SELECT 查询列表 FROM 表1 表1别名 INNER JOIN 表2 表2别名 ON 自然连接条件 WHERE 筛选条件;
# 实例
SELECT t1.`username` 管理者,t2.`username` 领导 FROM `user` t1 INNER JOIN `user` t2 ON t1.`super` = t2.`pk_id`;
3. 外连接
3.1 左外连接
- 描述:以表1为主表,表2为从表,如果从表有匹配主表的显示匹配记录,若从表没有匹配主表的记录用NULL值填充
# 语法
SELECT 查询列表 FROM 表1 表1别名 LEFT OUTER JOIN 表2 表2别名 ON 连接条件 WHERE 筛选条件;
# 实例
SELECT b.`b_name`,p.`pro_name` FROM `bill` b LEFT OUTER JOIN `provide` p ON b.`b_pro_id` = p.`pro_id`;
3.2 右外连接
- 描述:以表2为主表,表1为从表,如果从表有匹配主表的显示匹配记录,若从表没有匹配主表的记录用NULL填充
# 语法
SELECT 查询列表 FROM 表1 表1别名 RIGHT OUTER JOIN 表2 表2别名 ON 连接条件 WHERE 筛选条件;
# 实例
SELECT b.`b_name`,p.`pro_name` FROM `bill` b RIGHT OUTER JOIN `provide` p ON b.`b_pro_id` = p.`pro_id`;
3.3 全外连接
- 描述:如果表1有匹配表2的显示匹配记录,若表1没有匹配表2的记录用NULL填充,若表2没有匹配表1的记录用NULL填充
- 注意:mysql不支持
# 语法
SELECT 查询列表 FROM 表1 表1别名 FULL OUTER JOIN 表2 表2别名 ON 连接条件 WHERE 筛选条件;
# 实例
SELECT b.`b_name`,p.`pro_name` FROM `bill` b FULL OUTER JOIN `provide` p ON b.`b_pro_id` = p.`pro_id`;
4. 交叉连接
- 含义:将表1的记录与表2的记录一一匹配返回,就是通常说的笛卡尔积
# 语法
SELECT 查询列表 FROM 表1 表1别名 CROSS JOIN 表2 表2别名 WHERE 筛选条件;
# 实例
SELECT b.`b_name`,p.`pro_name` FROM `bill` b CROSS JOIN `provide` p;