连接查询
又称为多表查询,应用于多表连接的情况下
问题引入:
当执行SELECT name, boy_name FROM beauty, boys
会出现笛卡尔积的情况
笛卡尔积:表1 有 m 行, 表2 有 n行, 结果为 m*n 行
发生原因:没有有效的连接情况
分类:
按功能分类
内连接
等值连接
非等值连接
自连接
外连接
左外连接
右外连接
全外连接
交叉连接
SQL92(一)内连接
一、等值连接
SELECT name, boy_name
FROM beauty, boys
WHERE beauty.boy_id = boys.id
可以通过给表起别名来提高语句的简洁度,但是如果为表起了别名,则查询的字段就不能使用原来的表名去限定
二、非等值连接
SELECT e.salary, g.grade
FROM employees e, job_grades g
WHERE e.salary
BETWEEN g.lowest_salary AND g.highest_salary
三、自连接
SELECT e.last_name, m.last_name
FROM employees e, manager m
WHERE e.employ_id = m.manager_id
SQL99 连接查询
语法: SELECT 查询列表 FROM 表1 别名 【连接类型】 JOIN 表2 别名 ON 连接条件 【WHERE 筛选条件】 【GROUP BY 分组条件】【HAVING 筛选条件】【ORDER BY 排序列表】
分类:
内连接 INNER
外连接 左外 LEFT OUTER 右外 RIGHT OUTER
全外 FULL OUTER
交叉连接 CROSS
(一)内连接
一、等值连接
SELECT name, boy_name
FROM beauty
INNER JOIN boys
ON beauty.boy_id = boys.id
二、非等值连接
SELECT salary, grade
FROM employees e
INNER JOIN job_grades g
ON e.salary
BETWEEN g.lowest_salary AND g.highest_salary
三、自连接
SELECT e.last_name, m.last_name
FROM employees e
INNER JOIN manager m
ON e.employ_id = m.manager_id
(二)外连接
一、左外右外连接
应用场景: 用于查询一个表中有,另一个表中没有的记录
特点:
- 外连接的查询结果为主表中的所有记录。如果从表中没有与之匹配的,则显示NULL。外连接查询结果=内连接结果+主表中有从表中没有的记录
- 左外连接,LEFT JOIN 左边是主表;右外连接,RIGHT JOIN 右边是主表
- 左外由外交换两表的顺序可以实现同样的效果
左外案例:
SELECT name, boy_name
FROM beauty
LEFT OUTER JOIN boys
ON beauty.boy_id = boys.id
若想看主表中有从表中没有
SELECT name, boy_name
FROM beauty
LEFT OUTER JOIN boys
ON beauty.boy_id = boys.id
WHERE boys.id IS NULL
二、全外连接
特点:1. 全外连接 = 内连接结果 + 表1有表2没有 + 表1没有表2有
SELECT name, boy_name
FROM beauty
FULL OUTER JOIN boys
ON beauty.boy_id = boys.id
WHERE boys.id IS NULL
三、交叉连接
SELECT name, boy_name
FROM beauty
CROSS JOIN boys
交叉连接(笛卡尔乘积结果)