语法:
SELECT<查询>FROM<表名 1 > <连接类型>JOIN <表名 2 > ON <连接条件>WHERE<筛选类型>GROUP BY<分组字段>HAVING<分组后筛选字段>ORDER BY<排序条件>
内连接
内连接使用关键字 inner。
等值连接
# 查询员工名、部门名。SELECTlast_name,department_nameFROMemployees eINNER JOIN departments d ON e.department_id = d.department_id;# 查询名字中包含 e 的员工名和工种名。SELECTlast_name,job_titleFROMemployees AS eINNER JOIN jobs AS j ON e.job_id = j.job_idWHEREe.last_name LIKE '%e%';# 查询部门个数 > 3 的城市名和部门个数。SELECTcity,COUNT(*)FROMdepartments AS dINNER JOIN locations AS l ON d.location_id = l.location_idGROUP BYcityHAVINGCOUNT(*) > 3;# 查询哪个部门的员工个数 > 3 的部门名和员工个数,并按个数降序。SELECTCOUNT(*),department_nameFROMemployees AS eINNER JOIN departments AS d ON e.department_id = d.department_idGROUP BYdepartment_nameHAVINGCOUNT(*) > 3ORDER BYCOUNT(*) DESC;# 查询员工名、部门名、工种名,并按照部门名降序(三表查询)。SELECTlast_name,department_name,job_titleFROMemployees AS eINNER JOIN departments AS d ON e.department_id = d.department_idINNER JOIN jobs AS j ON e.job_id = j.job_idORDER BYdepartment_name DESC;
非等值连接
# 查询员工的工资级别SELECTsalary,grade_levelFROMemployees AS dINNER JOIN job_grades AS jg ON d.salary BETWEEN jg.lowest_salAND jg.highest_sal;
自连接
# 查询姓名中包含 k 字符的员工的名字、上级的名字。SELECTe.last_name,m.last_nameFROMemployees AS eINNER JOIN employees AS m ON e.manager_id = m.employee_idWHEREe.last_name LIKE '%k%';
外连接
用于查询一个表中有的,而另一个表没有的记录。有主从表之分。
查询结果为主表中的所有记录。
- 如果从表中有和它匹配的,则显示匹配的值。
 - 如果从表中没有和它匹配的,则显示 null。
 
外连接的结果 = 内连接结果 + 主表中有而从表中没有的记录。
外连接根据关键字的不同分为左外连接(Left)、右外连接(Right)、全外连接(Full)。
# 查询男朋友不在男神表的女神名(左外连接)SELECTb.NAME,bo.*FROMbeauty AS bLEFT OUTER JOIN boys AS bo ON b.boyfriend_id = bo.idWHEREbo.id IS NULL;# 查询哪个部门没有员工(右外连接)。SELECTd.*,e.employee_idFROMemployees AS eRIGHT OUTER JOIN departments AS d ON d.department_id = e.department_idWHEREe.employee_id IS NULL;
全外连接没有主从表之分。
全外连接的结果 = 内连接的结果 + 表 1 中有的但表 2 中没有的 + 表 2 中有的但表 1 中没有的。
# 全外连接SELECTb.*,bo.*FROMbeauty AS bFULL OUTER JOIN boys AS bo ON b.boyfriend_id = bo.id;
交叉连接
交叉连接其实就是笛卡尔乘积。
# 交叉连接SELECTb.*FROMbeauty AS bCROSS JOIN boys;
参考:
