连接查询
-
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
-
笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n行
-
发生原因:没有有效的连接条件
-
如何避免:添加有效的连接条件
分类:
-
按年代分类:
sql92标准:仅仅支持内连接
sql99标准[推荐]:支持内连接+外连接( 左外和右外) +交叉连接 -
按功能分类:
- 内连接:
等值连接
非等值连接
自连接 - 外连擦:
左外连接
右外连接
全外连接 - 交叉连接
- 内连接:
sql92标准
一.等值连接
- 多表等值连接的结果为多表的交集部分
- n表连接,至少需要n-1个连接条件
- 多表的顺序没有要求
- 一般需要为表起别名
#案例1:女神名和对应的男神名
SELECT NAME,boyname
FROM beauty,boys
WHERE beauty.`boyfriend_id` = boys.`id`;
#案例2:查询员工名和对应的部门名
SELECT last_name,department_name
FROM departments,employees
WHERE departments.`department_id` = employees.`department_id`;
#1.为表起别名
- 提高语句的简洁度
- 区分多个重名的字段
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
#2.查询员工名、工种号、工种名
SELECT e.last_name,e.job_id,j.job_title
FROM employees e,jobs j
WHERE e.`job_id`=j.`job_id`;
#3.条件筛选
#查询有奖金的员工名、部门名
SELECT last_name,department_name,commission_pct
FROM employees,departments
WHERE employees.`department_id` = departments.`department_id`
AND employees.`commission_pct` IS NOT NULL;
#4.加分组:查询每个城市的部门个数
SELECT city 城市,COUNT(*) 部门个数
FROM locations l,departments d
WHERE l.`location_id` = d.`location_id`
GROUP BY city;
#5.可以加排序
#查询每个工种的工种名和员工的个数,并且按员工个数降序
SELECT COUNT(*)
FROM employees e,jobs j
WHERE e.`job_id` = j.`job_id`
GROUP BY job_title
ORDER BY COUNT(*) DESC;
#6.三表连接
#查询员工名、部门名和所在城市
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`;
二.非等值连接
SELECT salary, grade_level
FROM employees e, job_ grades g
WHERE salary BETWEEN g. lowest_sal AND g.highest_sal;
三.自连接
#查询员工名和上级的名称
SELECT e.`last_name` 员工,m.`last_name` 上级
FROM employees e,employees m
WHERE e.`manager_id` = m.`employee_id`;