SQL 多表联查

打印 上一主题 下一主题

主题 1684|帖子 1684|积分 5052

目次
1. 内联接(INNER JOIN)
2. 左外联接(LEFT JOIN)
3. 右外联接(RIGHT JOIN)
4. 全外联接(FULL JOIN)
5. 交叉联接(CROSS JOIN)
6. 自联接(SELF JOIN)
7. 左外连接排除内连接
8. 右外连接排除内连接
9. 全外连接排除内连接
总结
三表联查 
四表联查


1. 内连接(INNER JOIN)

语法:
  1. SELECT 列名
  2. FROM 表1
  3. INNER JOIN 表2 ON 表1.列名 = 表2.列名;
复制代码


示例:
  1. SELECT employees.name, departments.department_name
  2. FROM employees
  3. INNER JOIN departments ON employees.department_id = departments.id;
复制代码

2. 左外连接(LEFT JOIN)

语法:
  1. SELECT 列名
  2. FROM 表1
  3. LEFT JOIN 表2 ON 表1.列名 = 表2.列名;
复制代码


示例:
  1. SELECT employees.name, departments.department_name
  2. FROM employees
  3. LEFT JOIN departments ON employees.department_id = departments.id;
复制代码

3. 右外连接(RIGHT JOIN)

语法:
  1. SELECT 列名
  2. FROM 表1
  3. RIGHT JOIN 表2 ON 表1.列名 = 表2.列名;
复制代码


示例:
  1. SELECT employees.name, departments.department_name
  2. FROM employees
  3. RIGHT JOIN departments ON employees.department_id = departments.id;
复制代码

4. 全外连接(FULL JOIN)

语法:
  1. SELECT 列名FROM 表1LEFT JOIN 表2 ON 表1.列名 = 表2.列名UNIONSELECT 列名
  2. FROM 表1
  3. RIGHT JOIN 表2 ON 表1.列名 = 表2.列名;
复制代码


示例:
  1. SELECT employees.name, departments.department_nameFROM employeesLEFT JOIN departments ON employees.department_id = departments.idUNIONSELECT employees.name, departments.department_name
  2. FROM employees
  3. RIGHT JOIN departments ON employees.department_id = departments.id;
复制代码

5. 交叉连接(CROSS JOIN)

语法:
  1. SELECT 列名
  2. FROM 表1
  3. CROSS JOIN 表2;
复制代码


示例:
  1. SELECT employees.name, departments.department_name
  2. FROM employees
  3. CROSS JOIN departments;
复制代码


6. 自连接(SELF JOIN)

自联接(Self Join)是指一个表与自身进行联接。这种操纵通常用于表中记录之间的比较或关联。自联接可以帮助解决例如员工与其经理的关系、产品与产品之间的关系等问题。
自连接查询,可以是内连接查询,也可以是外连接查询。
语法:
  1. SELECT 列名1, 列名2, ...
  2. FROM 表名 AS 别名1
  3. JOIN 表名 AS 别名2
  4. ON 别名1.列名 = 别名2.列名
  5. WHERE 条件;
复制代码
示例:员工与经理自联接
假设我们有一个 employees 表,如下:
employees 表结构:
idnamemanager_id1AliceNULL2Bob13Carol14Dave2 查询员工及其经理的姓名
  1. SELECT employees.name AS employee_name, manager.name AS manager_name
  2. FROM employees
  3. LEFT JOIN employees AS manager
  4. ON employees.manager_id = manager.id;
复制代码


7. 左外连接排除内连接

界说:返回左表中全部记录和右表中匹配的记录,但排除那些在右表中也有匹配的记录。
语法:
  1. SELECT 列名
  2. FROM 表1
  3. LEFT JOIN 表2 ON 表1.列名 = 表2.列名
  4. WHERE 表2.列名 IS NULL;
复制代码
示例:
  1. SELECT employees.name
  2. FROM employees
  3. LEFT JOIN departments ON employees.department_id = departments.id
  4. WHERE departments.id IS NULL;
复制代码

8. 右外连接排除内连接

界说:返回右表中全部记录和左表中匹配的记录,但排除那些在左表中也有匹配的记录。
语法:
  1. SELECT 列名
  2. FROM 表1
  3. RIGHT JOIN 表2 ON 表1.列名 = 表2.列名
  4. WHERE 表1.列名 IS NULL;
复制代码
示例:
  1. SELECT departments.department_name
  2. FROM departments
  3. RIGHT JOIN employees ON departments.id = employees.department_id
  4. WHERE employees.id IS NULL;
复制代码

9. 全外连接排除内连接

界说:返回两个表的全部记录,但排除那些在两个表中都匹配的记录。
语法:
  1. SELECT 列名
  2. FROM 表1
  3. LEFT JOIN 表2 ON 表1.列名 = 表2.列名
  4. WHERE 表2.列名 IS NULL
  5. UNION
  6. SELECT 列名
  7. FROM 表2
  8. RIGHT JOIN 表1 ON 表2.列名 = 表1.列名
  9. WHERE 表1.列名 IS NULL;
复制代码
示例:
  1. SELECT employees.nameFROM employeesLEFT JOIN departments ON employees.department_id = departments.idWHERE departments.id IS NULLUNIONSELECT departments.department_name
  2. FROM departments
  3. RIGHT JOIN employees ON departments.id = employees.department_id
  4. WHERE employees.id IS NULL;
复制代码



总结



  • 内连接:仅返回两个表中匹配的记录。
  • 左外连接:返回左表的全部记录和右表中匹配的记录,右表中没有匹配的记录显示为 NULL。
  • 右外连接:返回右表的全部记录和左表中匹配的记录,左表中没有匹配的记录显示为 NULL。
  • 全外连接:返回两个表的全部记录,通过 UNION 模仿。
  • 交叉连接:返回两个表的笛卡尔积。
  • 自连接:表与自身的联接,常用于记录间的比较。
  • 左外连接排除内连接:返回左表中的记录,这些记录在右表中没有匹配项。
  • 右外连接排除内连接:返回右表中的记录,这些记录在左表中没有匹配项。
  • 全外连接排除内连接:返回两个表的全部记录,排除那些在两个表中都有匹配的记录。

联合查询 

联合查询(也称为聚集操纵)用于将多个 SELECT 查询的结果聚集并在一起。

1.  UNION


  • 功能:将两个或多个 SELECT 查询的结果聚集并为一个结果集,并去除重复行。
  • 语法
    1. [/code] [code]SELECT column1, column2 FROM table1
    2. UNION
    3. SELECT column1, column2 FROM table2;
    复制代码
    注意:全部 SELECT 查询必须具有雷同数量的列,并且对应列的范例应兼容。

2.  UNION ALL


  • 功能:将两个或多个 SELECT 查询的结果聚集并为一个结果集,包罗全部重复行。
  • 语法
    1. [/code] [code]SELECT column1, column2 FROM table1
    2. UNION ALL
    3. SELECT column1, column2 FROM table2;
    复制代码
    注意:比 UNION 更高效,由于它不去重。


3. INTERSECT


  • 功能:返回两个 SELECT 查询结果中的交集,即两个查询中都存在的行。
  • 语法
    1. SELECT column1, column2 FROM table1
    2. INTERSECT
    3. SELECT column1, column2 FROM table2;
    复制代码

  • 注意:MySQL 8.0 及之前的版本不直接支持 INTERSECT,可以使用 INNER JOIN 来实现类似功能。

4. EXCEPT (或 MINUS)


  • 功能:返回在第一个 SELECT 查询中存在但在第二个 SELECT 查询中不存在的行。
  • 语法
    1. SELECT column1, column2 FROM table1
    2. EXCEPT
    3. SELECT column1, column2 FROM table2;
    复制代码
    ​​​​​​​​​​​​​​注意:MySQL 8.0 及之前的版本不直接支持 EXCEPT。可以使用 LEFT JOIN 和 IS NULL 实现类似功能。


三表联查 


界说:将三个表通过指定的连接条件联接在一起,通常用于从多个表中获取相关数据。
语法格式
  1. SELECT 列名1, 列名2, ...
  2. FROM 表1
  3. JOIN 表2 ON 表1.列名 = 表2.列名
  4. JOIN 表3 ON 表2.列名 = 表3.列名
  5. WHERE 条件
  6. GROUP BY 列名
  7. HAVING 条件
  8. ORDER BY 列名 [ASC|DESC]
  9. LIMIT n OFFSET m;
复制代码
假设我们有以下三个表:


  • employees(员工表):包含员工的根本信息。
  • departments(部门表):包含部门的信息。
  • salaries(薪资表):包含员工的薪资信息。
表结构示例:
employees 表:
idnamedepartment_id1Alice12Bob23Carol1 departments 表:
iddepartment_name1HR2IT salaries 表:
employee_idsalary170000280000375000 查询语句
  1. SELECT employees.name, departments.department_name, salaries.salary
  2. FROM employees
  3. INNER JOIN departments ON employees.department_id = departments.id
  4. INNER JOIN salaries ON employees.id = salaries.employee_id;
  5. /*
  6. 解释:
  7. INNER JOIN departments ON employees.department_id = departments.id:
  8. 将 employees 表与 departments 表通过 department_id 和 id 列进行连接,提取部门名称。
  9. INNER JOIN salaries ON employees.id = salaries.employee_id:
  10. 将 employees 表与 salaries 表通过 id 和 employee_id 列进行连接,提取薪资信息。
  11. SELECT employees.name, departments.department_name, salaries.salary:
  12. 从连接后的结果中选择员工姓名、部门名称和薪资信息。
  13. */
复制代码

四表联查


界说:将四个表通过指定的连接条件联接在一起,用于从多个表中获取更复杂的数据。
语法格式
  1. SELECT 列名1, 列名2, ...
  2. FROM 表1
  3. JOIN 表2 ON 表1.列名 = 表2.列名
  4. JOIN 表3 ON 表2.列名 = 表3.列名
  5. JOIN 表4 ON 表3.列名 = 表4.列名
  6. WHERE 条件
  7. GROUP BY 列名
  8. HAVING 条件
  9. ORDER BY 列名 [ASC|DESC]
  10. LIMIT n OFFSET m;
复制代码
四表联查示例
假设我们有以下四个表:


  • employees(员工表):包含员工的根本信息。
  • departments(部门表):包含部门的信息。
  • salaries(薪资表):包含员工的薪资信息。
  • projects(项目表):包含项目的信息。
表结构示例:
employees 表:
idnamedepartment_id1Alice12Bob23Carol1 departments 表:
iddepartment_name1HR2IT salaries 表:
employee_idsalary170000280000375000 projects 表:
project_idproject_namedepartment_id1Project X12Project Y2 查询语句
  1. SELECT employees.name, departments.department_name, salaries.salary, projects.project_name
  2. FROM employees
  3. INNER JOIN departments ON employees.department_id = departments.id
  4. INNER JOIN salaries ON employees.id = salaries.employee_id
  5. INNER JOIN projects ON departments.id = projects.department_id;
  6. /*
  7. 解释:
  8. INNER JOIN departments ON employees.department_id = departments.id:
  9. 将 employees 表与 departments 表通过 department_id 和 id 列进行连接,提取部门名称。
  10. INNER JOIN salaries ON employees.id = salaries.employee_id:
  11. 将 employees 表与 salaries 表通过 id 和 employee_id 列进行连接,提取薪资信息。
  12. INNER JOIN projects ON departments.id = projects.department_id:
  13. 将 departments 表与 projects 表通过 department_id 和 department_id 列进行连接,提取项目名称。
  14. SELECT employees.name, departments.department_name, salaries.salary, projects.project_name:
  15. 从连接后的结果中选择员工姓名、部门名称、薪资信息和项目名称。
  16. */
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表