乐趣区

关于mysql:MySQL学习笔记08多表查询下

细枝末节

1. 内连贯的 INNER 和外连贯的 OUTER 能够省略
2. 筛选条件放在 WHERE 后, 连贯条件放在 ON 后, 进步分离性, 便于浏览
3. 外连贯查问的后果集为主表中所有记录
4. LEFT 和 RIGHT 作用是指定主表
5. 全连贯是将两表都作为主表
6. 穿插连贯后果集是笛卡尔乘积 

格局

SELECT 查问列表
FROM 表 1 别名 [连贯类型]
JOIN 表 2 别名
ON 连贯条件
[WHERE 筛选条件]
[GROUP BY 分组]
[HAVING 筛选条件]
[ORDER BY 排序列表]

连贯类型:

1. 内连贯: IINER
2. 外连贯:
        左外连贯: LEFT [OUTER]
        右外连贯: RIGHT [OUTER]
        全外连贯: FULL [OUTER]
3. 穿插连贯: CROSS

内连贯

格局

SELECT 查问列表
FROM 表 1 别名
INNER JOIN 表 2 别名
ON 连贯条件 

分类

1. 等值连贯
2. 非等值连贯
3. 内连贯 

等值连贯

示例
/* 查问员工名, 部门名 */
SELECT e.name, d.name
FROM emp e
INNER JOIN dept d
ON e.dept_id = d.id
/* 查问名字中蕴含 e 的员工名和工种名 */
SELECT e.name, j.name
FROM emp e
INNER JOIN job j
ON e.job_id = j.id
WHERE e.name LIKE '%e%';
/* 查问部门个数 >3 的城市名和部门个数 */
SELECT city, COUNT(*)
FROM location l
INNER JOIN dept d
ON d.loc_id = l.id
GROUP BY city
HAVING COUNT(*)>3
/* 查问员工名, 部门名, 工种名, 并按部门降序 */
SELECT e.name, d.name, j.name
FROM emp e
INNER JOIN dept d ON e.dept_id = d.id
INNER JOIN job j ON e.job_id = j.id
ORDER BY d.name DESC;

非等值连贯

示例
/* 查问员工的工资级别 */
SELECT salry, grade
FROM emp e
INNER JOIN salary_grade g
ON e.salary BETWEEN g.lowwest_sal AND g.highest_sal;

自连贯

示例
/* 查问姓名中蕴含 k 的员工姓名及其下属姓名 */
SELECT e.name, m.name
FROM emp e
INNER JOIN emp m
ON e.mng_id = m.id
WHERE e.name LIKE '%k%';

外连贯

示例
/* 查问男朋友不在男生表的女生名 */

/* 第一种形式: 左外连贯 */
SELECT w.name, m.*
FROM womwn w
LEFR OUTER JOIN man m
ON w.cp_id = m.id
WHERE m.name IS NULL;

/* 第二种形式: 右外连贯 */
SELECT w.name m.*
FROM man m
RIGHT OUTER JOIN woman w
ON w.cp_id = m.id
WHERE m.nae IS NULL;
退出移动版