sql99标准(推荐):语句上连接条件和筛选条件实现了分离。

  • 内连接:
    • 等值连接(自然连接:若在等值连接中把目标列中重复的属性列去掉则为自然连接。)
      • (1)等值连接的结果 = 多个表的交集。
      • (2)n表连接,至少需要n-1个连接条件。
      • (3)多个表不分主次,没有顺序要求。
      • (4)一般为表起别名,提高阅读性和性能。
    • 非等值连接:和等值连接的差异在于连接条件不是等号
    • 自连接:可以多次查询同一个表
    • inner join
  • 外连接:
    • 用于查询一个表有,另一个表没有的情况
    • 左外连接:left [outer] join
    • 右外连接:right [outer] join
    • 全外连接(MySQL不支持):full [outer] join
  • 交叉连接
    • cross join

image.png

一、等值连接

  1. -- 查询员工名及其部门名
  2. use db_mysql;
  3. select last_name,department_name
  4. from employees,departments
  5. where employees.department_id=departments.department_id;
  6. -- 查询有奖金的每个部门的部门名和部门领导编号和该部门的最低工资
  7. select a.department_name,a.manager_id,min(b.salary)
  8. from departments a,employees b
  9. where a.department_id=b.department_id and commission_pct is not null
  10. group by department_name,a.manager_id;

二、内连接

-- 查询员工名、部门名、工种名,并按部门名排序(多表连接)
select name,dept_name,job_title 
from employee e
inner join department d on e.dept_id = d.dept_id
inner join job j on e.join_id = j.joob_id
order by dept_name desc

三、自连接

-- 查询员工名及其上级领导名称
select a.last_name workerName,b.last_name managerName from employees a,employees b
where a.manager_id=b.employee_id;
-- 等效于
select a.last_name workerName,b.last_name managerName from employees a inner join employees b
on a.manager_id=b.employee_id;