4.多表(连接)查询join
笛卡尔积现象
原因:无有效连接条件
select * from beauty;#12
select * from boys;#4
SELECT NAME,boyname FROM boys,beauty;#12*4
#WHERE beauty.boyfriend_id =boys.id; 添加此行即可
1.分类:
年代sql 92 推荐99
功能 内连接 :等值连接 非等值连接 自连接
外连接 :左外连接 右外连接 全外连接
交叉连接
2.等值连接
如果为表起了别名 则只能用别名限定
select 字段,...
from 表1
【inner|left outer|right outer|cross】join 表2 on 连接条件
【inner|left outer|right outer|cross】join 表3 on 连接条件
【where 筛选条件】
【group by 分组字段】
【having 分组后的筛选条件】
【order by 排序的字段或表达式】
#查姓 部门名
SELECT last_name ,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`;
#查姓含e的员工的姓和他的工作具体名称 (含筛选条件)
SELECT last_name ,job_title
FROM employees e
INNER JOIN jobs j
ON e.`job_id`=j.`job_id`
WHERE last_name LIKE '%e%';
#查询部门个数大于3的城市 与它的部门数
#①先查询每个城市部门个数②再分组后筛选
SELECT city ,COUNT(*) AS 部门个数
FROM departments d
INNER JOIN locations l
ON d.location_id=l.location_id
GROUP BY city;
HAVING COUNT(*)>3;#分组后才有count
多个表连接时 相邻的两张表得有关系 顺序不能随意打乱
3.非等值连接
SELECT COUNT(*),grade_level
FROM employees e
JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal//即 条件不是一条等式
GROUP BY grade_level
HAVING COUNT(*)>4
ORDER BY grade_level DESC;
4.自连接
用别名自己与自己表 连
SELECT e.last_name,m.last_name ,e.manager_id,m.employee_id
FROM employees e
JOIN employees m
ON e.manager_id = m.employee_id
5.外连接(左)
用于查询一个表有 另一个没有的
查询结果为所有结果
SELECT beauty.name ,boys.*
FROM beauty
LEFT OUTER JOIN boys#左边是主表
ON beauty.boyfriend_id=boys.id
where boys.id is null;
#哪个部门没有员工
SELECT d.*,e.employee_id
FROM departments d
LEFT JOIN employees e
ON d.department_id=e.department_id
WHERE e.employee_id IS NULL;
全外连接的结果是内连接+表一有表二无+表一无表二有
交叉连接 笛卡尔积
USE girls
SELECT be.*,bo.*
FROM beauty be
CROSS JOIN boys bo;



浙公网安备 33010602011771号