IT评测·应用市场-qidao123.com技术社区

标题: SQL 多表联查 [打印本页]

作者: 大连密封材料    时间: 2024-10-14 23:53
标题: SQL 多表联查
目次
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;
复制代码



总结



联合查询 

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

1.  UNION


2.  UNION ALL



3. INTERSECT


4. EXCEPT (或 MINUS)



三表联查 


界说:将三个表通过指定的连接条件联接在一起,通常用于从多个表中获取相关数据。
语法格式
  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 表:
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 表:
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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4