MySQL多表查询

SQL92标准

1. 等值连接

SELECT name,boyName FROM boys,beauty WHERE beauty.bf_id = boys.id;

SELECT last_name,department_name FROM employee,department WHERE employee.department_id = department.department_id; 
  1. 为表起别名

  2. 多个表顺序可变

  3. 可以加筛选

  4. 可以加分组

  5. 可以加排序

  6. 可以实现多个表(>2)连接

2. 非等值连接

SELECT
  salary,grade_level
FROM
  employee e,job_grade g
where
  salary BETWEEN g.lowest_salary AND g.highest_salary
;

3. 自连接

SELECT
  e.employee_id,e.last_name,m.employee_id,m.last_name
FROM
  employee e, employee m;
WHERE
  e.manager_id = m.employee_id;

SQL99标准

基本语法

SELECT
  查询列表
FROM 表1 别名 [连接类型]
JOIN 表2 别名 ON 连接条件 [[连接类型]
JOIN 表n 别名 ON 连接条件 ...]
[WHERE 限制条件]
[GROUP BY 分组条件]
[ORDER BY 分组条件]
[LIMIT m,n]

1. 内连接

内连接使用关键之INNER JOIN

等值连接

ON后面使用的是等值条件

例如:

SELECT
  last_name,department_name
FROM
  departments d
INNER JOIN
  employees e ON e.department_id = d.department_id
SELECT
  last_name,job_title
FROM
  employees e
INNER JOIN
  jobs j ON e.job_id = j.job_id
WHERE
  e.last_name LIKE '%e%'
;

非等值连接

ON后面使用的是不等表达式进行连接

例如:

SELECT
  salary,grade_level
FROM
  employees e
JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal
;

自连接

自连接就是自己表和自己连接,其实就是内连接的一种特例

SELECT
  e.last_name 姓名, m.last_name 领导姓名
FROM
  employees e
JOIN
  employees m ON e.manager_id = m.employee_id
WHERE
  e.last_name LIKE '%k%'
;

2. 外连接

外连接使用关键字LEFT OUTER JOIN或者RIGHT OUTER JOIN

左外连接

对于左外连接,主表放在前面,例如:

SELECT
  b.name 没有男朋友的女生
FROM
  beauty b
LEFT OUTER JOIN
  boys bo ON b.boyfriend_id = bo.id
WHERE
  bo.id IS NOT NULL
;

主表在左边

右外连接

对于右外连接,主表放在后面,例如:

SELECT
  b.name 没有男朋友的女生
FROM
  boys bo
RIGHT OUTER JOIN
  beauty b ON b.boyfriend_id = bo.id
WHERE
  bo.id IS NOT NULL
;

主表在左边

全外连接

全外连接相当于左外和右外连接的结果集的并集,当前MySQL不支持,使用的关键词是FULL OUTER JOIN

3. 交叉连接

就是笛卡尔积,例如:

SELECT
  b.*,bo.*
FROM
  beauty b
CROSS JOIN
  boys bo
;
posted @ 2020-12-10 16:34  chdaring  阅读(21)  评论(0)    收藏  举报