SQL99
分类:
- 内连接(*):inner
- 外连接
- 左外(*):left【outer】
- 右外(*):right【outer】
- 全外:full【outer】
- 交叉连接:cross
语法:
SELECT 查询列表
from 表1 别名 (连接类型)
join 表2 别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件]
[order by 排序列表]
1.内连接
语法:
SELECT 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件;
-
等值连接
案例1:查询员工名、部门名
SELECT last_name, department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;
案例2:查询名字中包含e的员工名和工种名(添加筛选)
SELECT last_name,job_title FROM employees e INNER JOIN jobs j ON e.job_id = j.job_id WHERE e.last_name LIKE '%e%';
案例3:查询部门个数>3的城市名和部门个数,(添加分组+筛选)
SELECT city,COUNT(*) 部门个数 FROM departments d INNER JOIN locations l ON d.location_id = l.location_id GROUP BY city HAVING COUNT(*) > 3;
案例4:查询员工个数>3的部门名和员工个数,并按个数排序(添加排序)
SELECT COUNT(*),d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id GROUP BY department_name HAVING COUNT(*)>3 ORDER BY COUNT(*) DESC;
案例5:查询员工名,部门名,工种名,并按部门名降序排序
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;
特点:
- 可以添加排序、分组、筛选
- inner可以省略
- 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
- inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
-
非等值连接
案例1:查询员工的工资级别
SELECT salary,grade_level FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;
案例2:查询工资级别的个数>20的个数,并且按工资级别排序
SELECT COUNT(*),grade_level FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal GROUP BY grade_level HAVING COUNT(*)>20 ORDER BY grade_level DESC;
-
自连接
案例1:查询员工的名字、上级的名字
SELECT e.last_name,m.last_name FROM employees e JOIN employees m ON e.manager_id = m.employee_id;
SQL99
分类:
- 内连接(*):inner
- 外连接
- 左外(*):left【outer】
- 右外(*):right【outer】
- 全外:full【outer】
- 交叉连接:cross
语法:
SELECT 查询列表
from 表1 别名 (连接类型)
join 表2 别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件]
[order by 排序列表]
1.内连接
语法:
SELECT 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件;
-
等值连接
案例1:查询员工名、部门名
SELECT last_name, department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;
案例2:查询名字中包含e的员工名和工种名(添加筛选)
SELECT last_name,job_title FROM employees e INNER JOIN jobs j ON e.job_id = j.job_id WHERE e.last_name LIKE '%e%';
案例3:查询部门个数>3的城市名和部门个数,(添加分组+筛选)
SELECT city,COUNT(*) 部门个数 FROM departments d INNER JOIN locations l ON d.location_id = l.location_id GROUP BY city HAVING COUNT(*) > 3;
案例4:查询员工个数>3的部门名和员工个数,并按个数排序(添加排序)
SELECT COUNT(*),d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id GROUP BY department_name HAVING COUNT(*)>3 ORDER BY COUNT(*) DESC;
案例5:查询员工名,部门名,工种名,并按部门名降序排序
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;
特点:
- 可以添加排序、分组、筛选
- inner可以省略
- 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
- inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
-
非等值连接
案例1:查询员工的工资级别
SELECT salary,grade_level FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;
案例2:查询工资级别的个数>20的个数,并且按工资级别排序
SELECT COUNT(*),grade_level FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal GROUP BY grade_level HAVING COUNT(*)>20 ORDER BY grade_level DESC;
-
自连接
案例1:查询员工的名字、上级的名字
SELECT e.last_name,m.last_name FROM employees e JOIN employees m ON e.manager_id = m.employee_id;
2.外连接
应用场景:用于查询一个表中有,一个表中没有的记录
特点:
-
外连接的查询结果为主表中的所有记录(如果从表中有和它匹配的,则显示匹配的值;若无,则显示NULL)
外连接查询结果=内连接结果+主表中有而从表中没有的记录
-
左外连接,left join左边的是主表
右外连接,right join右边的是主表
-
左外和右外交换两个表的顺序,可以实现同样的效果
-
全外连接(full outer join)=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
引入:查询男朋友不在男生表的女生
SELECT b.name, bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE bo.id IS NULL;
案例1:查询哪个部门没有员工
SELECT d.*, e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.department_id = e.department_id
WHERE e.employee_id IS NULL;
3.交叉连接
使用sql99语法的标准实现笛卡尔乘积
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;
总结: