细枝末节
1. 内连接的INNER和外连接的OUTER可以省略
2. 筛选条件放在WHERE后,连接条件放在ON后,提高分离性,便于阅读
3. 外连接查询的结果集为主表中所有记录
4. LEFT和RIGHT作用是指定主表
5. 全连接是将两表都作为主表
6. 交叉连接结果集是笛卡尔乘积
格式
SELECT 查询列表
FROM 表1 别名 [连接类型]
JOIN 表2 别名
ON 连接条件
[WHERE 筛选条件]
[GROUPBY 分组]
[HAVING 筛选条件]
[ORDERBY 排序列表]
连接类型:
1. 内连接: IINER
2. 外连接:
左外连接: LEFT [OUTER]
右外连接: RIGHT [OUTER]
全外连接: FULL [OUTER]
3. 交叉连接: CROSS
内连接
格式
SELECT 查询列表
FROM 表1 别名
INNERJOIN 表2 别名
ON 连接条件
分类
1. 等值连接
2. 非等值连接
3. 内连接
等值连接
示例
/* 查询员工名,部门名 */
SELECT e.name, d.name
FROM emp e
INNERJOIN dept d
ON e.dept_id = d.id
/* 查询名字中包含e的员工名和工种名 */
SELECT e.name, j.name
FROM emp e
INNERJOIN job j
ON e.job_id = j.id
WHERE e.name LIKE'%e%';
/* 查询部门个数>3的城市名和部门个数 */
SELECT city, COUNT(*)
FROM location l
INNERJOIN dept d
ON d.loc_id = l.id
GROUPBY city
HAVINGCOUNT(*)>3
/* 查询员工名,部门名,工种名,并按部门降序 */
SELECT e.name, d.name, j.name
FROM emp e
INNERJOIN dept d ON e.dept_id = d.id
INNERJOIN job j ON e.job_id = j.id
ORDERBY d.name DESC;
非等值连接
示例
/* 查询员工的工资级别 */
SELECT salry, grade
FROM emp e
INNERJOIN salary_grade g
ON e.salary BETWEEN g.lowwest_sal AND g.highest_sal;
自连接
示例
/* 查询姓名中包含k的员工姓名及其上司姓名 */
SELECT e.name, m.name
FROM emp e
INNERJOIN emp m
ON e.mng_id = m.id
WHERE e.name LIKE'%k%';
外连接
示例
/* 查询男朋友不在男生表的女生名 */
/* 第一种方式:左外连接 */
SELECT w.name, m.*
FROM womwn w
LEFTOUTERJOIN man m
ON w.cp_id = m.id
WHERE m.name ISNULL;
/* 第二种方式:右外连接 */
SELECT w.name m.*
FROM man m
RIGHTOUTERJOIN woman w
ON w.cp_id = m.id
WHERE m.nae ISNULL;