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)
语法:
SELECT 列名
FROM 表1
INNER JOIN 表2 ON 表1.列名 = 表2.列名;
复制代码
示例:
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
复制代码
2.
左外连接(LEFT JOIN)
语法:
SELECT 列名
FROM 表1
LEFT JOIN 表2 ON 表1.列名 = 表2.列名;
复制代码
示例:
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
复制代码
3.
右外连接(RIGHT JOIN)
语法:
SELECT 列名
FROM 表1
RIGHT JOIN 表2 ON 表1.列名 = 表2.列名;
复制代码
示例:
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
复制代码
4.
全外连接(FULL JOIN)
语法:
SELECT 列名FROM 表1LEFT JOIN 表2 ON 表1.列名 = 表2.列名UNIONSELECT 列名
FROM 表1
RIGHT JOIN 表2 ON 表1.列名 = 表2.列名;
复制代码
示例:
SELECT employees.name, departments.department_nameFROM employeesLEFT JOIN departments ON employees.department_id = departments.idUNIONSELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
复制代码
5.
交叉连接(CROSS JOIN)
语法:
SELECT 列名
FROM 表1
CROSS JOIN 表2;
复制代码
示例:
SELECT employees.name, departments.department_name
FROM employees
CROSS JOIN departments;
复制代码
6.
自连接(SELF JOIN)
自联接(Self Join)是指一个表与自身进行联接。这种操纵通常用于表中记录之间的比较或关联。自联接可以帮助解决例如员工与其经理的关系、产品与产品之间的关系等问题。
自连接查询,可以是内连接查询,也可以是外连接查询。
语法:
SELECT 列名1, 列名2, ...
FROM 表名 AS 别名1
JOIN 表名 AS 别名2
ON 别名1.列名 = 别名2.列名
WHERE 条件;
复制代码
示例:员工与经理自联接
假设我们有一个 employees 表,如下:
employees 表结构:
idnamemanager_id1AliceNULL2Bob13Carol14Dave2
查询员工及其经理的姓名
:
SELECT employees.name AS employee_name, manager.name AS manager_name
FROM employees
LEFT JOIN employees AS manager
ON employees.manager_id = manager.id;
复制代码
7. 左外连接排除内连接
界说
:返回左表中全部记录和右表中匹配的记录,但排除那些在右表中也有匹配的记录。
语法:
SELECT 列名
FROM 表1
LEFT JOIN 表2 ON 表1.列名 = 表2.列名
WHERE 表2.列名 IS NULL;
复制代码
示例:
SELECT employees.name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id
WHERE departments.id IS NULL;
复制代码
8. 右外连接排除内连接
界说
:返回右表中全部记录和左表中匹配的记录,但排除那些在左表中也有匹配的记录。
语法:
SELECT 列名
FROM 表1
RIGHT JOIN 表2 ON 表1.列名 = 表2.列名
WHERE 表1.列名 IS NULL;
复制代码
示例:
SELECT departments.department_name
FROM departments
RIGHT JOIN employees ON departments.id = employees.department_id
WHERE employees.id IS NULL;
复制代码
9. 全外连接排除内连接
界说
:返回两个表的全部记录,但排除那些在两个表中都匹配的记录。
语法:
SELECT 列名
FROM 表1
LEFT JOIN 表2 ON 表1.列名 = 表2.列名
WHERE 表2.列名 IS NULL
UNION
SELECT 列名
FROM 表2
RIGHT JOIN 表1 ON 表2.列名 = 表1.列名
WHERE 表1.列名 IS NULL;
复制代码
示例:
SELECT employees.nameFROM employeesLEFT JOIN departments ON employees.department_id = departments.idWHERE departments.id IS NULLUNIONSELECT departments.department_name
FROM departments
RIGHT JOIN employees ON departments.id = employees.department_id
WHERE employees.id IS NULL;
复制代码
总结
内连接
:仅返回两个表中匹配的记录。
左外连接
:返回左表的全部记录和右表中匹配的记录,右表中没有匹配的记录显示为 NULL。
右外连接
:返回右表的全部记录和左表中匹配的记录,左表中没有匹配的记录显示为 NULL。
全外连接
:返回两个表的全部记录,通过 UNION 模仿。
交叉连接
:返回两个表的笛卡尔积。
自连接
:表与自身的联接,常用于记录间的比较。
左外连接排除内连接
:返回左表中的记录,这些记录在右表中没有匹配项。
右外连接排除内连接
:返回右表中的记录,这些记录在左表中没有匹配项。
全外连接排除内连接
:返回两个表的全部记录,排除那些在两个表中都有匹配的记录。
联合查询
联合查询(也称为聚集操纵)用于将多个 SELECT 查询的结果聚集并在一起。
1. UNION
功能
:将两个或多个 SELECT 查询的结果聚集并为一个结果集,并去除重复行。
语法
:
[/code] [code]SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
复制代码
注意
:全部 SELECT 查询必须具有雷同数量的列,并且对应列的范例应兼容。
2. UNION ALL
功能
:将两个或多个 SELECT 查询的结果聚集并为一个结果集,包罗全部重复行。
语法
:
[/code] [code]SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
复制代码
注意
:比 UNION 更高效,由于它不去重。
3. INTERSECT
功能
:返回两个 SELECT 查询结果中的交集,即两个查询中都存在的行。
语法
:
SELECT column1, column2 FROM table1
INTERSECT
SELECT column1, column2 FROM table2;
复制代码
注意
:MySQL 8.0 及之前的版本不直接支持 INTERSECT,可以使用 INNER JOIN 来实现类似功能。
4. EXCEPT (或 MINUS)
功能
:返回在第一个 SELECT 查询中存在但在第二个 SELECT 查询中不存在的行。
语法
:
SELECT column1, column2 FROM table1
EXCEPT
SELECT column1, column2 FROM table2;
复制代码
注意
:MySQL 8.0 及之前的版本不直接支持 EXCEPT。可以使用 LEFT JOIN 和 IS NULL 实现类似功能。
三表联查
界说
:将三个表通过指定的连接条件联接在一起,通常用于从多个表中获取相关数据。
语法格式
:
SELECT 列名1, 列名2, ...
FROM 表1
JOIN 表2 ON 表1.列名 = 表2.列名
JOIN 表3 ON 表2.列名 = 表3.列名
WHERE 条件
GROUP BY 列名
HAVING 条件
ORDER BY 列名 [ASC|DESC]
LIMIT n OFFSET m;
复制代码
假设我们有以下三个表:
employees(员工表):包含员工的根本信息。
departments(部门表):包含部门的信息。
salaries(薪资表):包含员工的薪资信息。
表结构示例:
employees 表:
idnamedepartment_id1Alice12Bob23Carol1 departments 表:
iddepartment_name1HR2IT salaries 表:
employee_idsalary170000280000375000
查询语句
:
SELECT employees.name, departments.department_name, salaries.salary
FROM employees
INNER JOIN departments ON employees.department_id = departments.id
INNER JOIN salaries ON employees.id = salaries.employee_id;
/*
解释:
INNER JOIN departments ON employees.department_id = departments.id:
将 employees 表与 departments 表通过 department_id 和 id 列进行连接,提取部门名称。
INNER JOIN salaries ON employees.id = salaries.employee_id:
将 employees 表与 salaries 表通过 id 和 employee_id 列进行连接,提取薪资信息。
SELECT employees.name, departments.department_name, salaries.salary:
从连接后的结果中选择员工姓名、部门名称和薪资信息。
*/
复制代码
四表联查
界说
:将四个表通过指定的连接条件联接在一起,用于从多个表中获取更复杂的数据。
语法格式
:
SELECT 列名1, 列名2, ...
FROM 表1
JOIN 表2 ON 表1.列名 = 表2.列名
JOIN 表3 ON 表2.列名 = 表3.列名
JOIN 表4 ON 表3.列名 = 表4.列名
WHERE 条件
GROUP BY 列名
HAVING 条件
ORDER BY 列名 [ASC|DESC]
LIMIT n OFFSET m;
复制代码
四表联查示例
假设我们有以下四个表:
employees(员工表):包含员工的根本信息。
departments(部门表):包含部门的信息。
salaries(薪资表):包含员工的薪资信息。
projects(项目表):包含项目的信息。
表结构示例:
employees 表:
idnamedepartment_id1Alice12Bob23Carol1 departments 表:
iddepartment_name1HR2IT salaries 表:
employee_idsalary170000280000375000 projects 表:
project_idproject_namedepartment_id1Project X12Project Y2
查询语句
:
SELECT employees.name, departments.department_name, salaries.salary, projects.project_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id
INNER JOIN salaries ON employees.id = salaries.employee_id
INNER JOIN projects ON departments.id = projects.department_id;
/*
解释:
INNER JOIN departments ON employees.department_id = departments.id:
将 employees 表与 departments 表通过 department_id 和 id 列进行连接,提取部门名称。
INNER JOIN salaries ON employees.id = salaries.employee_id:
将 employees 表与 salaries 表通过 id 和 employee_id 列进行连接,提取薪资信息。
INNER JOIN projects ON departments.id = projects.department_id:
将 departments 表与 projects 表通过 department_id 和 department_id 列进行连接,提取项目名称。
SELECT employees.name, departments.department_name, salaries.salary, projects.project_name:
从连接后的结果中选择员工姓名、部门名称、薪资信息和项目名称。
*/
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4