连接篇

  • sql92语法
  • 一、等值链接
  • 二、非等值连接
  • 三、自连接
  • sql99语法
  • 四、内连接(INNER JOIN)
  • 五、外连接(LEFT JOIN / RIGHT JOIN)
  • 六、交叉连接


sql92语法

一、等值链接

相当于将两张表的数据全部链接起来,相等的数据为同一行,组成一个大的表

SELECT * FROM users, projects
WHERE users.id = projects.user_id

案例1: 没有连接条件
users表数据9条,projects表数据3条

SELECT * FROM users, projects

查询结果共有27条数据

mysql 连接 小表连接大表 mysql表格连接_内连接


该情况,数据库会以左表或者右表为主,会匹配另一张表的每一行,效果如下:

mysql 连接 小表连接大表 mysql表格连接_内连接_02


案例2: 有连接条件

简单来说就是:连接符合条件的所有行

SELECT * FROM users, projects
WHERE users.id = projects.user_id

mysql 连接 小表连接大表 mysql表格连接_sql_03


此时,users的id要等于projetcs的user_id时,两条数据才算是匹配上,查询顺序如下:

mysql 连接 小表连接大表 mysql表格连接_mysql_04

二、非等值连接

关联关系不是用=号连接的连接关系

案例1:员工的薪资等级

SELECT u.id,s.level, u.salary
FROM users u, salary_grades s
WHERE u.salary BETWEEN s.lower_salary AND s.high_salary

users表匹配工资等级表,连接薪资范围,符合范围对应的行,连接成一行。

mysql 连接 小表连接大表 mysql表格连接_mysql_05


上述sql等价于如下的等值连接:

SELECT u.id,s.level, u.salary
FROM users u, salary_grades s
WHERE u.salary > s.lower_salary AND u.salary < s.high_salary

三、自连接

自连接故名思意,就是自己连接自己

-- u2是领导表  u1是员工表
SELECT u2.last_name '领导name', u1.last_name '员工name'
FROM users u1, users u2
WHERE u1.leader_id = u2.id AND u1.leader_id IS NOT NULL

mysql 连接 小表连接大表 mysql表格连接_sql_06

sql99语法

连接查询必定会涉及到on和where,
where:先生成关联表,然后where才对行进行筛选
on:先筛选后join,left join还是会把坐标中不匹配的行也全部返回
on是先筛选后关联,where是先关联后筛选,where结果集 < on结果集

四、内连接(INNER JOIN)

将关联表所有符合条件的行连接,不符合条件的不输出(有点类似等值连接)
案例1:求员工领导

SELECT u2.last_name '领导name', u1.last_name '员工name'
FROM users u2
INNER JOIN users u1 ON u1.leader_id = u2.id

mysql 连接 小表连接大表 mysql表格连接_数据库_07

案例2:内连接和左连接对比

-- 左连接
SELECT users.id , projects.user_id, projects.id
FROM users
LEFT JOIN projects ON projects.user_id = users.id
-- 内连接
SELECT users.id , projects.user_id, projects.id
FROM users
INNER JOIN projects ON projects.user_id = users.id

左连接:

mysql 连接 小表连接大表 mysql表格连接_sql_08


内连接:

mysql 连接 小表连接大表 mysql表格连接_mysql 连接 小表连接大表_09


案例3:插叙员工薪资等级

SELECT u.id,s.level, u.salary
FROM users u
INNER JOIN salary_grades s ON u.salary BETWEEN s.lower_salary AND s.high_salary

mysql 连接 小表连接大表 mysql表格连接_mysql_10

五、外连接(LEFT JOIN / RIGHT JOIN)

外连接分为做连接和右连接。左连接是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出而右表只列出ON后条件与左表满足的部分

SELECT users.id , projects.user_id, projects.id
FROM users
LEFT JOIN projects ON projects.user_id = users.id

mysql 连接 小表连接大表 mysql表格连接_sql_08

六、交叉连接

两张表所有数据都会匹配行,全部数据的笛卡尔积,用处不多

SELECT * FROM users
CROSS JOIN projects