Mysql12——多表查询02_JOIN

1. SQL99 JOIN多表连接

在MySQL中,我们可以使用JOIN…ON语句进行表连接。JOIN是一个关键字,表示连接两个或多个表,而ON则用于指定连接上的条件。

JOIN有多种类型,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN等,它们之间的区别在于匹配条件和返回结果的不同。其中,INNER JOIN是最常用的一种类型,它只返回两个表中匹配的记录。

1.1 基本语法

在 MySQL 中,JOIN ON 是一种用于在多表查询中指定连接条件的语法。

JOIN 用于将多个表连接起来,而 ON 关键字则用于指定连接条件。通过 JOIN ON,你可以在多个表之间建立连接,并指定连接的条件。

语法如下:

SELECT columns
FROM table1
JOIN table2 ON condition;
SELECT table1.column, table2.column,table3.column
FROM table1
    JOIN table2 ON table1 和 table2 的连接条件
        JOIN table3 ON table2 和 table3 的连接条件

其中,table1table2 是要连接的表,condition 是连接条件。连接条件通常是指定连接字段之间的相等关系,例如:table1.column = table2.column。根据具体的需求,你还可以使用其他比较操作符,如不等于(<>, !=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。

示例:

SELECT *
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

该示例中,我们将 orders 表和 customers 表连接起来,连接条件是 orders.customer_id = customers.customer_id,即订单表中的 customer_id 字段等于客户表中的 customer_id 字段。

需要注意的是,使用 JOIN ON 进行连接时,连接的字段必须具有相同的数据类型或兼容的数据类型,以确保连接能够正常进行。

  • SQL99 采用的这种嵌套结构非常清爽、层次性更强、可读性更强,即使再多的表进行连接也都清晰可见。如果你采用 SQL92,可读性就会大打折扣。

  • 语法说明:

    • 可以使用 ON 子句指定额外的连接条件
    • 这个连接条件是与其它条件分开的。
    • ON 子句使语句具有更高的易读性
    • 关键字 JOIN、INNER JOIN、CROSS JOIN 的含义是一样的,都表示内连接

1.2 内连接(INNER JOIN)的实现

INNER JOIN 是 MySQL 中用于在多表查询中进行内连接操作的关键字。内连接(Inner Join)是最常用的连接类型之一,它根据连接条件从两个或多个表中筛选匹配的行,返回包含匹配结果的结果集。

  • 语法:
SELECT columns
FROM table1
INNER JOIN table2 ON condition;
SELECT 字段列表
FROM table1 INNER JOIN table1
ON 关联条件
WHERE 等其他子句;

其中,table1table2 是要连接的表,condition 是连接条件。通常,连接条件是指定连接字段之间的相等关系,例如:table1.column = table2.column。根据具体的需求,你还可以使用其他比较操作符,如不等于(<>, !=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。

INNER JOIN 的执行方式是,将第一个表(左表)中的每一行与第二个表(右表)中满足连接条件的行进行匹配,然后将满足条件的行组合成结果集。

示例:

SELECT *
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

该示例中,我们将 orders 表和 customers 表进行内连接,连接条件是 orders.customer_id = customers.customer_id,即订单表中的 customer_id 字段等于客户表中的 customer_id 字段。最终的结果集将包含满足连接条件的行。

需要注意的是,INNER JOIN 只返回匹配的行,未匹配的行将被忽略。如果两个表之间没有匹配的行,则结果集将为空。INNER JOIN 通常用于根据特定的关联关系从多个表中获取相关的数据。

案例1 员工表、部门表两表联查:

SELECT e.employee_id, e.last_name, e.department_id, 
       d.department_id, d.location_id
FROM   employees e JOIN departments d
ON     (e.department_id = d.department_id);

在这里插入图片描述

题目2 员工表、部门表、位置表三表联查:

SELECT employee_id, city, department_name
FROM   employees e 
JOIN   departments d
ON     d.department_id = e.department_id 
JOIN   locations l
ON     d.location_id = l.location_id;

在这里插入图片描述

1.3 外连接(OUTER JOIN)的实现

OUTER JOIN 是 MySQL 中用于在多表查询中进行外连接操作的关键字。外连接(Outer Join)是一种连接类型,它可以返回连接表中的所有行,包括未匹配的行

在 MySQL 中,有三种类型的外连接:LEFT OUTER JOIN、RIGHT OUTER JOIN 和 FULL OUTER JOIN。

1.3.1 左外连接(LEFT OUTER JOIN)

LEFT OUTER JOIN:左外连接返回左表中的所有行,以及与右表匹配的行。如果右表中没有匹配的行,则返回 NULL 值。

  • 语法:
#实现查询结果是A
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 等其他子句;
  • 举例:
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
LEFT OUTER JOIN departments d
ON   (e.department_id = d.department_id) ;

在这里插入图片描述

1.3.2 右外连接(RIGHT OUTER JOIN)

RIGHT OUTER JOIN:右外连接返回右表中的所有行,以及与左表匹配的行。如果左表中没有匹配的行,则返回 NULL 值。

  • 语法:
#实现查询结果是B
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 等其他子句;
  • 举例:
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
RIGHT OUTER JOIN departments d
ON    (e.department_id = d.department_id) ;

在这里插入图片描述

需要注意的是,LEFT JOIN 和 RIGHT JOIN 只存在于 SQL99 及以后的标准中,在 SQL92 中不存在,只能用 (+) 表示。

2. UNION的使用

合并查询结果

使用 UNION 很简单,所要做的只是给出每条 SELECT 语句,在各条语句之间放上关键字 UNION

举个例子,假如需要 IllinoisIndianaMichigan 等美国几个州的所有顾客的报表,还想包括不管位于哪个州的所有的 Fun4All

当然可以利用 WHERE 子句来完成此工作,不过这次我们使用 UNION

如上所述,创建 UNION 涉及编写多条 SELECT 语句。首先来看单条语句:

语法格式:

SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

UNION操作符

在这里插入图片描述

UNION 操作符返回两个查询的结果集的并集,去除重复记录

UNION ALL操作符

在这里插入图片描述

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

注意:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。

举例1 :查询部门编号>90或邮箱包含a的员工信息

#方式1
SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;
#方式2
SELECT * FROM employees  WHERE email LIKE '%a%'
UNION
SELECT * FROM employees  WHERE department_id>90;

举例2:查询中国用户中男性的信息以及美国用户中年男性的用户信息

SELECT id,cname FROM t_chinamale WHERE csex='男'
UNION ALL
SELECT id,tname FROM t_usmale WHERE tGender='male';

3. 7种SQL JOINS的实现

在这里插入图片描述

3.1 代码实现

#中图:内连接 A∩B
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;
#左上图:左外连接
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
#右上图:右外连接
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
#左中图:A - A∩B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
#右中图:B-A∩B
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL
#左下图:满外连接
# 左中图 + 右上图  A∪B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL  #没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
#右下图
#左中图 + 右中图  A ∪B- A∩B 或者 (A -  A∩B) ∪ (B - A∩B)
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL

3.2 语法格式小结

  • 左中图
#实现A -  A∩B
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;
  • 右中图
#实现B -  A∩B
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;
  • 左下图
#实现查询结果是A∪B
#用左外的A,union 右外的B
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句

union 

select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;
  • 右下图
#实现A∪B -  A∩B  或   (A -  A∩B) ∪ (B - A∩B)
#使用左外的 (A -  A∩B)  union 右外的(B - A∩B)
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句

union

select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句

4 SQL99语法新特性

4.1 自然连接

SQL99 在 SQL92 的基础上提供了一些特殊语法,比如 NATURAL JOIN 用来表示自然连接。我们可以把自然连接理解为 SQL92 中的等值连接。它会帮你自动查询两张连接表中所有相同的字段,然后进行等值连接

ATURAL JOIN 是 MySQL 中一种用于进行自然连接(Natural Join)操作的关键字。自然连接是一种在没有明确指定连接条件的情况下,根据两个表之间的相同列名进行连接的操作。

使用 NATURAL JOIN 时,MySQL 将根据两个表中具有相同列名的列进行连接,列名的匹配是基于列名的文本匹配,而不是严格的数据类型匹配。如果两个表中存在多个相同列名的列,则所有匹配的列将用于连接。

语法如下:

SELECT columns
FROM table1
NATURAL JOIN table2;

其中,table1table2 是要连接的表。

示例:

SELECT *
FROM orders
NATURAL JOIN customers;

该示例中,我们将 orders 表和 customers 表进行自然连接。MySQL 将根据这两个表中具有相同列名的列进行连接,列名的匹配是基于列名的文本匹配。自然连接将返回满足匹配条件的行。

需要注意的是,自然连接基于列名的匹配,可能会导致不可预期的结果。如果两个表中的列名不是唯一的,或者列名在语义上不匹配,那么自然连接可能会引入意外的行。因此,在实际使用时,建议明确指定连接条件,而不是依赖自然连接。

案例演示:

在SQL92标准中:

SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
AND e.`manager_id` = d.`manager_id`;

在 SQL99 中你可以写成:

SELECT employee_id,last_name,department_name
FROM employees e NATURAL JOIN departments d;

4.2 USING连接

当我们进行连接的时候,SQL99还支持使用 USING 指定数据表里的同名字段进行等值连接。但是只能配合JOIN一起使用。

USING 连接是 MySQL 中一种用于进行连接操作的关键字。它可以在连接多个表时,指定连接条件中要使用的列。

使用 USING 连接时,MySQL 将根据指定的列名进行连接,而不是根据所有列进行连接。这样可以简化连接条件的书写,并且避免重复列在结果集中出现。

语法如下:

SELECT columns
FROM table1
JOIN table2 USING (column);

其中,table1table2 是要连接的表,column 是要使用的连接列名。

案例演示:

SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
USING (department_id);

你能看出与自然连接 NATURAL JOIN 不同的是,USING 指定了具体的相同的字段名称,你需要在 USING 的括号 () 中填入要指定的同名字段。同时使用 JOIN...USING 可以简化 JOIN ON 的等值连接。它与下面的 SQL 查询结果是相同的:

SELECT employee_id,last_name,department_name
FROM employees e ,departments d
WHERE e.department_id = d.department_id;

1table2 是要连接的表,column` 是要使用的连接列名。

案例演示:

SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
USING (department_id);

你能看出与自然连接 NATURAL JOIN 不同的是,USING 指定了具体的相同的字段名称,你需要在 USING 的括号 () 中填入要指定的同名字段。同时使用 JOIN...USING 可以简化 JOIN ON 的等值连接。它与下面的 SQL 查询结果是相同的:

SELECT employee_id,last_name,department_name
FROM employees e ,departments d
WHERE e.department_id = d.department_id;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值