SQL语句(四)联表查询⽂章⽬录
⼀、关联查询的分类
按年代分
sql92:仅仅⽀持内连接
sql99【推荐】:⽀持内连接+外连接(左外,右外)+交叉连接
按功能分
内连接
等值连接
⾮等值连接
⾃连接
外连接
左外连接
右外连接
全外连接
交叉连接
⼆、sql92语法的连接
语法
SELECT查询列表
FROM待链接的多个表
WHERE连接条件[和筛选条件]
这⾥的连接条件写字段相等关系,如e.department_id = d.id等
1. 简单应⽤
查询员⼯名和对应的部门名
SELECT  last_name 员⼯名,department_name 部门名
FROM  employees, departments
WHERE  employees.department_id=departments.department_id;
# 连接条件为employees.department_id=departments.department_id
2. 为表起别名
SELECT查询列表
FROM表名AS别名,...
WHERE连接条件等
查询员⼯名,⼯种号,⼯种名
SELECT  last_name,e.job_id,job_title
FROM  employees AS e, jobs AS j
WHERE  e.job_id = j.job_id;
由于两个表中都有job_id这个字段,所以在SELECT中需要指明是哪张表3. 加⼊筛选
查询有奖⾦的员⼯名,部门名
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE  e.department_id = d.department_id
AND emission_pct IS NOT NULL;<--加⼊的筛选条件
查询位于的城市的城市名中第⼆个字符为o的部门名和城市名
SELECT city,department_name
FROM locations l,departments d
WHERE d.location_id=l.location_id
AND city LIKE'_o%';
4. 加⼊分组
查询每个城市的部门个数
SELECT  city,COUNT(*)部门个数
FROM  locations l,departments d
WHERE  l.location_id=d.location_id
GROUP BY city
sql left join 多表连接查询每个⼯种的⼯种名和员⼯个数,并按员⼯个数降序
SELECT  job_title,COUNT(*)员⼯个数
FROM  jobs j,employees e
WHERE  j.job_id=e.job_id
GROUP BY job_title
ORDER BY员⼯个数DESC;
5. 三表连接
和两表连接是基本相同的,在WHERE语句中加⼊⼀个连接条件即可获取所有员⼯的员⼯名,部门名和所在城市
SELECT last_name, department_name, city
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id;
6. ⾮等值连接
查询员⼯的⼯资和⼯资级别
job_grades表:
SELECT  salary, grade_level
FROM  employees e, job_grades j
WHERE  e.salary >= j.lowest_sal AND e.salary <= j.highest_sal;
7. ⾃连接
查询员⼯名及其对应上级的名称
SELECT  e.last_name 员⼯,m.last_name 上级
FROM  employees e, employees m
WHERE  e.manager_ployee_id;
三、sql99语法的连接
SELECT查询列表
FROM表1别名
【连接类型】join表2别名
on连接条件
where xxx
连接类型分类
内连接:inner
和sql92的等值连接是等效的
外连接:
左外:left [outer]
右外:right [outer]
全外:full [outer]
交叉连接:cross
1. 内连接(INNER JOIN)
获取所有的员⼯名和其对应的部门名
SELECT e.last_name, d.department_name
FROM employees e INNER JOIN departments d
ON e.department_id = d.department_id;
查询部门个数>3的城市名和部门个数
SELECT city,COUNT(1)部门个数
FROM departments d INNER JOIN locations l
ON d.location_id = l.location_id
GROUP BY city
HAVING部门个数>3;
查询员⼯名、部门名、⼯种名,并按部门名排序【三表连接】
SELECT last_name, department_name, job_title
FROM employees e INNER JOIN departments d
ON e.department_id = d.department_id
INNER JOIN jobs j
ON e.job_id = j.job_id
ORDER BY department_name DESC;
查询员⼯的⼯资级别【⾮等值连接】
SELECT last_name, salary, grade_level
FROM employees e INNER JOIN job_grades j
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal
ORDER BY salary;
查询员⼯名即其对应的上级名【⾃连接】
SELECT e.last_name 员⼯名, m.last_name 上级名
FROM employees e INNER JOIN employees m
ON e.manager_id = m.employee_id;
由上⾯的例⼦可以看出,使⽤sql99的内连接(INNER JOIN)即可实现sql92的所有连接操作了。
2. 外连接
作⽤:查询⼀个表有,另⼀个表没有的记录
此时我们可以获得如下⼏张表:
然后我们可以分别使⽤内连接和外连接分别连接beauty和boys这两张表,查看结果的差异:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。