进阶6:连接查询
含义:又称多表查询
笛卡尔乘积现象:表1:有n行,表2:有m行,合成的表m*n;
分类:
按年代分类
92标准;仅支持所有内连接
99标准支持内连接,外连接左外右外和交叉连接
按功能:内连接:等值,非等值,自连接,
外连接:左外连接,右外连接,全外连接
交叉连接:
*/
SELECT * FROM beauty;
SELECT * FROM boys;
SELECT NAME,boyname FROM beauty,boys;
SELECT NAME,boyname FROM beauty,boys WHERE beauty.`boyfriend_id` = boys.`id`;
#sql92标准
#1.等值查询
/*
1.多表等值连接的结果为多表的交集部分
2.n表连接,至少需要n-1个连接条件
3.多表的先后顺序没有要求
4.一般需要为表取别名
5.可以搭配前面介绍的所有字句是使用,比如排序、分组、 筛选
*/
#案例1:查询女神和男神对应的信息
SELECT
NAME,
boyname
FROM
beauty,
boys
WHERE beauty.`boyfriend_id` = boys.`id` ;
#案例2:查询员工名和对应的部门名
SELECT last_name,department_name
FROM employees,departments
WHERE employees.`department_id` = departments.`department_id`;
#2.为表起别名:提高语句简介度,区分多个重名的字段
#如果起了别名,就不能使用原名进行限定
#查询员工名,工种号,工种名
SELECT last_name,e.`job_id`,job_title
FROM employees e,jobs j
WHERE e.`job_id` = j.`job_id`;
#3.表的顺序可以颠倒
#4.可以加筛选
#查询有奖金的员工名和部门名
SELECT last_name,department_name,commission_pct
FROM employees e,departments d
WHERE e.`department_id` = d.`department_id`
AND e.`commission_pct` IS NOT NULL;
#5.加分组
#案例1:查询每个城市的部门个数
SELECT COUNT(*)
FROM departments d,locations l
WHERE d.`location_id` = l.`location_id`
GROUP BY l.`city`;
#6.加排序
#查询每个工种的工种名和员工的个数,并且按员工个数降序
SELECT `job_title`,COUNT(*) FROM jobs,employees
WHERE jobs.`job_id` = employees.`job_id`
GROUP BY jobs.`job_id` ORDER BY COUNT(*) DESC;
#7.三表连接
#案例:查询员工名、部门名和所在的城市
SELECT
last_name,
department_name,
city
FROM employees,departments,locations
WHERE employees.`department_id` = departments.`department_id` AND
departments.`location_id` = locations.`location_id`
AND city LIKE 's%'
ORDER BY department_name DESC;
#2.非等值连接
#案例1:查询员工的工资和工资级别
SELECT * FROM job_grades;
SELECT
salary,
grade_level
FROM
employees e,
job_grades j
WHERE e.`salary` BETWEEN j.`lowest_sal`
AND j.`highest_sal` ;
#3.自连接
#查询员工名和上级的名字
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.`manager_id` = m.`employee_id`;