连接查询
连接查询
又称多表查询
笛卡尔现象:表1有m行,表2有n行,结果有m*n行
原因:没有有效的连接条件
按年代分类
sql192标准:仅支持内连接
内连接:查询两个表的交集比分
等值连接
- n表连接,至少需要n-1个连接条件
- 一般需要给表其别名
例如: 查询员工名和对应的部门名
SELECT last_name,
department_name
FROMdepartments
as d,employees
as e
WHERE d.department_id
=e.department_id
;
用表名限定
例如:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
SELECT job_title,COUNT(),j.job_id
FROM jobs j,employees e
WHERE j.job_id
=e.job_id
GROUP BY j.job_id
ORDER BY COUNT() DESC;
例如:查询员工名、部门名和所在的城市
SELECT last_name,department_name,city
FROM employees e, departments d,locations l
WHERE d.location_id
=l.location_id
AND d.department_id
=e.department_id
;
非等值连接
where后放非等值条件
SELECT salary,grade_level
FROM employees e , job_grades g
WHERE salary BETWEEN g.lowest_sal
AND g.highest_sal
;
自连接
SELECT e.employee_id 员工id, e.last_name 员工名字,m.manager_id 领导id,m.last_name 领导名字
FROM employees e,employees m
WHERE e.manager_id=m.employee_id;
sql199标准:支持内连接+外连接(左外+右外)+交叉连接
语法
SELECT 查询列表
FROM 表1 别名1
【连接类型】 JOIN 表2 别名2
ON 连接条件
【WHERE 筛选条件】
【GROUP BY 分组条件】
【HAVING 筛选条件】
【ORDER BY 排序列表】
连接方式 | 连接类型 |
---|---|
内连接 | inner |
左外连接 | left [outer] |
右外连接 | right [outer] |
全连接 | full [outer] |
交叉连接 | cross |
内连接
等值连接
例如:查询部门个数>3的城市名和部门个数
分步骤:
①查询每个城市的部门个数
②筛选条件,部门个数>3
SELECT COUNT(), l.city
FROM locations l
INNER JOIN departments d
ON l.location_id
=d.location_id
GROUP BY l.country_id
HAVING COUNT()>3;
例如:查询员工名、部门名、工种名,并按部门名降序
SELECT e.last_name ,d.
department_name
,j.job_title
FROM employees e
INNER JOIN jobs j ON e.job_id
=j.job_id
INNER JOIN departments d ON e.department_id
=d.department_id
ORDER BY d.department_id
DESC;
非等值连接
自连接
外连接
- 外连接的查询结果为主表的所有记录,如果无法匹配,则为null
外连接查询结果=内连接查询结果+主表有从表没有的记录 - 左外连接:left join左边的是主表
- 右外连接:right join后边的是主表
左外连接
例如:查询哪个部门没有员工
SELECT d.
department_name
FROM departments d
LEFT JOIN employees e
ON d.department_id
=e.department_id
WHERE e.employee_id
IS NULL;
右外连接
全外连接
全外连接结果=内连接结果+表1有表2没有的+表1没有表2有的
交叉连接: 实现笛卡尔乘积
SELECT boys.,beauty.
FROM boys
CROSS JOIN beauty;
“失败是到达较佳境地的第一步”
小徐加油!
------2021.2.1