一、多张原始表
1. beauty表
2. boys表
3. employees表
4. departments表
二、内联
1. 等值连接—-(交集部分)
1. 基本连表查询
eg1:查询女神名和对应的男神名
SELECT NAME,boyName FROM boys,beauty
WHERE beauty.boyfriend_id=boys.id;
eg2. 查询员工名和对应的部门名
SELECT last_name,department_name FROM employees,departments
WHERE employees.department_id=departments.department_id;
2. 为表起别名
eg: 查询员工名、工种名、工种号
SELECT last_name,e.job_id,j.job_title
FROM employees AS e,jobs AS j
WHERE e.job_id=j.job_id;
3. 加筛选
eg1: 查询有奖金的员工名和部门名
SELECT e.last_name, d.department_name
FROM departments d,employees e
WHERE d.department_id=e.department_id
AND e.commission_pct IS NOT NULL;
eg2: 查询城市名中第二个字符为o的部门名和城市名
SELECT department_name,city
FROM departments d,locations l
WHERE d.location_id=l.location_id
AND city LIKE '_o%';
4. 加分组
eg1: 查询每个城市的部门个数
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.location_id=l.location_id
GROUP BY city;
eg2 : 查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
SELECT d.department_name,d.manager_id,MIN(e.salary)
FROM employees e, departments d
WHERE e.department_id=d.department_id
AND e.commission_pct IS NOT NULL
GROUP BY d.department_name;
5. 加排序
eg1: 查询每个工种的工种名和员工个数,并且按照员工个数降序
SELECT COUNT(*),e.department_id,d.department_name
FROM employees e, departments d
WHERE e.department_id=d.department_id
GROUP BY d.department_id
ORDER BY COUNT(*) DESC;
6. 三表连接
eg: 查询员工名、部门名和所在的城市
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;
2. 非等值连接
案例: 查询员工的工资和工资级别
SELECT salary,grade_level
FROM employees e, job_grades g
WHERE e.salary BETWEEN g.lowest_sal AND g.highest_sal;
3. 自连接
eg: 查询员工名和上级的名称
SELECT e.employee_id,e.last_name,m.manager_id,m.last_name
FROM employees e,employees m
WHERE e.employee_id=m.manager_id;
4. 知识回顾
1. trim
2. substr
select substr(str, startIndex)
三、99语法
1. 语法
select 查询列表
from 表1 别名1 连接类型
join 表2 别名2
on 连接条件
where 筛选条件
group by 分组
having 筛选条件
order by 排序列表
连接类型: inner ; left (outer)
2. 内连接
1. 语法:
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件
2. 等值连接
2.1: 普通查询
eg: 查询员工名、部门名
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id;
2.2: 添加筛选
eg: 查询名字中包含e的员工名和工种名
SELECT e.employee_id,j.job_id,e.last_name
FROM employees e
INNER JOIN jobs j
ON e.job_id=j.job_id
WHERE e.last_name LIKE '%e%';
2.3 分组+筛选
eg: 查询部门个数>3的城市名和部门个数
SELECT COUNT(*),d.department_id,d.department_name,l.city
FROM departments d
INNER JOIN locations l
ON d.location_id=l.location_id
GROUP BY city
HAVING COUNT(*)>3;
2.4 排序
eg: 查询哪个部门的员工个数>3的部门名和员工个数,并按个数排序
SELECT COUNT(*),d.department_name
FROM employees e
INNER JOIN departments d
ON d.department_id=e.department_id
GROUP BY d.department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*);
2.5 多表查询
eg: 查询员工名、部门名、工种名,并按部门名排序
SELECT e.last_name,d.department_name,j.job_title
FROM departments d
INNER JOIN employees e ON d.department_id=e.department_id
INNER JOIN jobs j ON j.job_id=e.job_id
GROUP BY d.department_name DESC;
3. 99语法的优点
3.1 添加排序、分组和筛选;
3.2 inner可以省略;
3.3 筛选条件放在where后面,连接条件放在on后面,提高了分离性,便于阅读;
3.4 inner join和 92语法中的等值连接效果相同,都是找交集;
4. 非等值连接
4.1 查询员工的工资级别
SELECT grade_level,salary
FROM employees e
INNER JOIN job_grades jg ON e.salary BETWEEN jg.lowest_sal AND jg.highest_sal;
4.2 查询工资个数大于2,按照工资级别降序排列
SELECT COUNT(*),grade_level
FROM employees e
INNER JOIN job_grades jg ON e.salary BETWEEN jg.lowest_sal AND jg.highest_sal
GROUP BY grade_level
HAVING COUNT(*)>2
ORDER BY grade_level DESC;
5. 自连接
eg: 查询员工的名字、上级的名字
SELECT e.last_name AS empl_name ,m.last_name AS leader_name
FROM employees e
INNER JOIN employees m ON e.manager_id=m.employee_id;
eg2: 查询员工名字中包含字符k的名字、上级的名字
SELECT e.last_name AS empl_name ,m.last_name AS leader_name
FROM employees e
INNER JOIN employees m ON e.manager_id=m.employee_id
WHERE e.last_name LIKE '%k%';
6. 外连接
6.1 应用场景
6.2 特点
- 外连接的查询结果为主表中的所有记录;
如果从表中有和它匹配的,则显示匹配的值;
如果从表中没有和它匹配的,则显示null; ——> 在从表中,对应的属性为null
====》外连接查询结果=内连接结果+主表中有而从表中没有的记录。
- 左外连接,left join左边的是主表
- 右外连接,right join 右边的是主表
- 左外和右外交换2个表的顺序,可以实现同样的效果;
6.3 案例
查询男朋友 不在 男神表的女神名
SELECT b.name,bo.* FROM beauty b LEFT OUTER JOIN boys bo ON b.boyfriend_id=bo.id WHERE bo.id IS NULL;
查询哪个部门没有员工
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;
7. 交叉连接
7.1 语法
7.2 结果是笛卡尔乘积
select b.*,bo.* from beauty b cross join boys bo;