连接查询
一、含义
当查询中涉及到了多个表的字段,就需要使用多表连接。
SELECT 字段1,字段2...
FROM 表1,表2...;
当查询多个表时,没有添加有效的连接条件,会导致多个表所有行实现完全连接,这称为笛卡尔乘积。要想避免,就要添加有效的连接条件。
二、分类
按功能分类
- 内连接
等值连接
非等值连接
自连接
- 外连接
左外连接
右外连接
全外连接
- 交叉连接
sql92标准
支持内连接,也支持一部分外连接(用于oracle、sqlserver,mysql不支持)
sql99标准
支持内连接+一部分外连接(左外和右外)+交叉连接
mysql不支持全外连接
三、sql92语法
1.等值连接
语法
SELECT 查询列表
FROM 表1 别名,表2 别名
WHERE 表1.key=表2.key
AND 筛选条件#非必需
GROUP BY 分组字段#非必需
HAVING 分组后的筛选#非必需
ORDER BY 排序字段#非必需
特点
- 一般为表起别名
- 多表的顺序可以调换
- n表连接至少需要n-1个连接条件
- 等值连接的结果是多表的交集部分
2.非等值连接
语法
SELECT 查询列表
FROM 表1 别名,表2 别名
WHERE 非等值的连接条件
AND 筛选条件#非必需
GROUP BY 分组字段#非必需
HAVING 分组后的筛选#非必需
ORDER BY 排序字段#非必需
3.自连接
语法
SELECT 查询列表
FROM 表 别名1,表 别名2
WHERE 等值的连接条件#别名1.key=别名2.key
AND 筛选条件#非必需
GROUP BY 分组字段#非必需
HAVING 分组后的筛选#非必需
ORDER BY 排序字段#非必需
四、sql99语法
1.内连接
语法
SELECT 查询列表
FROM 表1 别名
INNER JOIN 表2 别名
ON 连接条件
WHERE 筛选条件#非必需
GROUP BY 分组字段#非必需
HAVING 分组后的筛选#非必需
ORDER BY 排序字段#非必需
特点
- 表的顺序可以调换
- 内连接的结果=多表的交集
- n表连接至少需要n-1个连接条件
分类
- 等值连接
- 非等值连接
- 自连接
2.外连接
语法
SELECT 查询列表
FROM 表1 别名
LEFT/RIGHT/FULL OUTER JOIN 表2 别名
ON 连接条件
WHERE 筛选条件#非必需
GROUP BY 分组字段#非必需
HAVING 分组后的筛选#非必需
ORDER BY 排序字段#非必需
特点
- 查询的结果=主表中所有的行。如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
- left join左边的是主表,right join右边的是主表,full join两边都是主表
- 一般用于查询除了交集部分的剩余不匹配的行
交叉连接
特点:类似于笛卡尔乘积
SELECT 查询列表
FROM 表1 别名
CROSS JOIN 表2 别名;