MySQL 连接查询

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL 连接查询



连接查询

连接查询也叫多表查询,常用于查询表头来自于多张表,通过不同连接方式把多张表重新组成一张新的临时表,再对临时表做数据处理。

命令格式:

SELECT 表头名 FROM 表1 as 别名 INNERJOIN 表2 as 别名 ON 连接条件

[WHERE 筛选条件][GROUP BY 分组]|[HAVING 分组后筛选]|[ORDER BY排序]|[limit 分页];

内连接:

等值连接:

使用相等判断做连接条件:表里必须有存储相同数据的表头

格式:

SELECT 表头名列表 FROM 表1 as别名 INNERJOIN 表2 as别名 ON 连接条件                   [WHERE 筛选条件] | [GROUP BY 分组]|[HAVING 分组后筛选] | [ORDER BY 排序列表]  

非等值连接:

不使用相等判断做连接条件据的表头时使用:适合表里没有存储相同类

格式:

SELECT 字段列表 FROM 表1 as别名 INNERJOIN 表2 as别名 ON 连接条件                                  [WHERE 筛选条件] | [GROUP BY 分组 [HAVING 分组后筛选] | [ORDER BY 排序列表

外连接:

左连接:

格式:

表名 LEFT JOIN 表名ON 连接条件

结果:

左表表头记录全显示,右表表头只显示与条件匹配的记录,右表比左表少的记录使用NULL匹配

右连接:

格式:

表名 RIGHT JOIN 表名ON 连接条件

结果:

右表表头记录全显示,左表表头只显示与条件匹配的记录,左表比右表少的记录使用NULL匹配

全外连接:

也称联合查询,用来合并查询结果可以合并同一张的表的查询记录(不同表的查询记录也可合并要求查询时,多个select语句查询表头个数必须一样UNION关键字默认去重,可以使用UNI0N ALL包含重复项

格式:

(SELECT语句) UNION (SELECT语句); 去重

(SELECT语句) UNION  ALL (SELECT语句); 不去重

练习

表联系图:

1.编写 SQL 语句以从 Customers 表中返回客户名称 (cust_name) 并从 Orders 表中返回相关订单号 (order_num),然后按客户名称和订单号对结果进行排序。尝试两次,一次使用简单的 equijoin 语法,一次使用 INNER JOIN。

mysql> SELECT cust_name, order_num
    -> FROM customers, orders
    -> WHERE customers.cust_id = orders.cust_id
    -> ORDER BY cust_name, order_num;
+----------------+-----------+
| cust_name      | order_num |
+----------------+-----------+
| Coyote Inc.    |     20005 |
| Coyote Inc.    |     20009 |
| E Fudd         |     20008 |
| Wascals        |     20006 |
| Yosemite Place |     20007 |
+----------------+-----------+
5 rows in set (0.00 sec)
mysql> SELECT cust_name, order_num
    -> FROM customers INNER JOIN orders
    ->  ON customers.cust_id = orders.cust_id
    -> ORDER BY cust_name, order_num;
+----------------+-----------+
| cust_name      | order_num |
+----------------+-----------+
| Coyote Inc.    |     20005 |
| Coyote Inc.    |     20009 |
| E Fudd         |     20008 |
| Wascals        |     20006 |
| Yosemite Place |     20007 |
+----------------+-----------+
5 rows in set (0.00 sec)

2.除了返回客户名称和订单号外,还可以添加名为 OrderTotal 的第三列,其中包含每个订单的总价。有两种方法可以做到这一点,可以使用 OrderItems 表上的子查询创建 OrderTotal 列,也可以将 OrderItems 表联接到现有表并使用聚合函数。这里有一个提示,请注意需要使用完全限定列名称的位置。

mysql> SELECT cust_name,
    ->        order_num,
    ->        (SELECT Sum(item_price*quantity)
    ->        FROM orderitems
    ->        WHERE orders.order_num=orderitems.order_num) AS ordertotal
    -> FROM customers, orders
    -> WHERE customers.cust_id = orders.cust_id
    -> ORDER BY cust_name, order_num;
+----------------+-----------+------------+
| cust_name      | order_num | ordertotal |
+----------------+-----------+------------+
| Coyote Inc.    |     20005 |     149.87 |
| Coyote Inc.    |     20009 |      38.47 |
| E Fudd         |     20008 |     125.00 |
| Wascals        |     20006 |      55.00 |
| Yosemite Place |     20007 |    1000.00 |
+----------------+-----------+------------+
5 rows in set (0.00 sec)
mysql> SELECT cust_name,
    ->        orders.order_num,
    ->        Sum(item_price*quantity) AS ordertotal
    -> FROM customers, orders, orderitems
    -> WHERE customers.cust_id = orders.cust_id
    ->  AND orders.order_num = orderitems.order_num
    -> GROUP BY cust_name, orders.order_num
    -> ORDER BY cust_name, order_num;
+----------------+-----------+------------+
| cust_name      | order_num | ordertotal |
+----------------+-----------+------------+
| Coyote Inc.    |     20005 |     149.87 |
| Coyote Inc.    |     20009 |      38.47 |
| E Fudd         |     20008 |     125.00 |
| Wascals        |     20006 |      55.00 |
| Yosemite Place |     20007 |    1000.00 |
+----------------+-----------+------------+
5 rows in set (0.00 sec)

3.编写一个 SQL 语句,用于检索订购产品 BR01 的日期,但这次使用 join 和简单的 equijoin 语法。

mysql> SELECT cust_id, order_date
    -> FROM orders, orderitems
    -> WHERE orders.order_num = orderitems.order_num
    ->  AND prod_id = 'TNT2'
    -> ORDER BY order_date;
+---------+---------------------+
| cust_id | order_date          |
+---------+---------------------+
|   10001 | 2023-09-01 00:00:00 |
|   10004 | 2023-09-30 00:00:00 |
+---------+---------------------+
2 rows in set (0.00 sec)
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 MySQL 索引
MySQL的全文索引查询方法
【8月更文挑战第26天】MySQL的全文索引查询方法
39 0
|
2月前
|
自然语言处理 关系型数据库 MySQL
MySQL MATCH 匹配中文 无法查询的问题如何处理?
【8月更文挑战第27天】MySQL MATCH 匹配中文 无法查询的问题如何处理?
140 62
|
19天前
|
SQL 缓存 关系型数据库
MySQL高级篇——关联查询和子查询优化
左外连接:优先右表创建索引,连接字段类型要一致、内连接:驱动表由数据量和索引决定、 join语句原理、子查询优化:拆开查询或优化成连接查询
MySQL高级篇——关联查询和子查询优化
|
21天前
|
SQL 关系型数据库 MySQL
MySQL查询(万字超详细版)
本文详细介绍了数据库中的单表和多表查询方法。首先,单表查询包括全列查询、指定列查询及去重查询,其中应避免使用`*`以提高效率。接着,文章讲解了排序查询,包括升序和降序,并展示了如何通过多个字段进行排序。在多表查询部分,本文解释了内连接、外连接(左外连接和右外连接)以及自连接的概念和用法,提供了丰富的代码示例
24 1
MySQL查询(万字超详细版)
|
3天前
|
存储 关系型数据库 MySQL
MySQL索引失效及避免策略:优化查询性能的关键
MySQL索引失效及避免策略:优化查询性能的关键
15 3
|
6天前
|
关系型数据库 MySQL 数据库
MySQL 表的CRUD与复合查询
【9月更文挑战第26天】本文介绍了数据库操作中的 CRUD(创建、读取、更新、删除)基本操作及复合查询。创建操作使用 `INSERT INTO` 语句插入数据,支持单条和批量插入;读取操作使用 `SELECT` 语句查询数据,可进行基本查询、条件查询和排序查询;更新操作使用 `UPDATE` 语句修改数据;删除操作使用 `DELETE FROM` 语句删除数据。此外,还介绍了复合查询,包括连接查询(如内连接、左连接)和子查询,以及聚合函数与分组查询,并提供了示例代码。
|
9天前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
26 4
|
12天前
|
NoSQL 关系型数据库 MySQL
当Redis与MySQL数据一致性校验中Redis数据量小于MySQL时的全量查询处理方法
保持Redis和MySQL之间的数据一致性是一个需要细致规划和持续维护的过程。通过全量数据同步、建立增量更新机制,以及定期执行数据一致性校验,可以有效地管理和维护两者之间的数据一致性。此外,利用现代化的数据同步工具可以进一步提高效率和可靠性。
33 6
|
8天前
|
关系型数据库 MySQL
mysql查询速度慢怎么解决?
mysql查询速度慢怎么解决?
30 2
|
11天前
|
SQL 关系型数据库 MySQL
MySQL C连接与使用
【9月更文挑战第21天】在 MySQL 中,可以通过 C 语言连接和操作数据库。首先需安装 MySQL 服务器及 C 开发库,然后在程序中包含必要头文件,初始化连接对象,并使用实际参数建立连接。执行 SQL 语句时,需替换表名等变量,获取并遍历结果集。最后,释放资源并关闭连接。过程中应注意错误处理、内存管理和安全性,以及性能优化。此方式适用于高效数据存储和检索的应用程序。
下一篇
无影云桌面