在MySQL中,DDL(数据定义语言)、DML(数据操作语言)和DQL(数据查询语言)是三类常用的SQL语言,每类语言有不同的功能:
1. DDL(Data Definition Language - 数据定义语言)
DDL 用于定义和修改数据库中的结构(如数据库、表、索引等)。常见的DDL命令包括 、 和 。
-
创建数据库:
-
创建表:
-
修改表:
-
删除表:
2. DML(Data Manipulation Language - 数据操作语言)
DML 用于对表中的数据进行增、删、改的操作。常见的DML命令有 、 和 。
-
插入数据:
-
更新数据:
-
删除数据:
3. DQL(Data Query Language - 数据查询语言)
DQL 用于查询数据,主要是 语句。可以通过 、、 等子句来精确地查询所需的数据。
-
查询所有数据:
-
条件查询:
-
分组查询:
-
排序查询:
-
分页查询:
-
DDL 主要用于定义和修改表结构。
-
DML 主要用于操作表中的数据(增、改、删)。
-
DQL 主要用于查询数据,并可以结合各种子句精确查询。
MySQL 多表查询是关系型数据库中一个非常重要的功能,它允许开发者从多个相关表中获取数据。MySQL 提供了多种方式来进行多表查询,常见的有 连接查询(JOIN) 和 子查询(Subquery)。掌握这些技巧是数据库设计与查询优化中的核心技能。
以下是 MySQL 多表查询的总结,涵盖了常用的连接类型、子查询以及实际应用中的查询示例。
1.1 INNER JOIN(内连接)
内连接是最常见的连接查询,它只返回两个表中匹配条件的数据。如果某一行在其中一个表中不存在对应的匹配行,那么该行将不会出现在结果集中。
语法:
示例: 假设有两个表:
- 表(存储订单信息)
- 表(存储客户信息)
我们希望查询每个订单对应的客户信息:
此查询返回订单和客户的匹配结果,仅显示那些在 表中有订单,并且在 表中有对应客户的记录。
1.2 LEFT JOIN(左连接)
左连接返回左表中的所有行,即使右表中没有匹配的数据,右表中的数据为空()。
语法:
示例: 我们希望查询所有订单,包括那些没有匹配到客户的订单:
此查询会显示所有订单,即使某些订单的客户信息缺失。
1.3 RIGHT JOIN(右连接)
右连接与左连接相反,它返回右表中的所有行,即使左表中没有匹配的数据。
语法:
示例: 我们希望查询所有客户,包括那些没有下订单的客户:
此查询会显示所有客户信息,包含那些没有订单的客户。
1.4 FULL JOIN(全连接)
全连接返回两个表中的所有行,不论是否匹配。MySQL 本身不直接支持 ,但可以通过使用 结合 和 来实现全连接。
语法:
示例: 返回所有客户和订单,不论是否有匹配关系:
1.5 CROSS JOIN(交叉连接)
交叉连接会返回两个表的笛卡尔积,即每一个表中的行都和另一个表中的每一行进行组合,不考虑是否有匹配条件。
语法:
示例: 查询所有产品与所有订单的组合:
此查询返回所有产品和订单的每一种组合。
2.1 单行子查询
单行子查询返回一行数据,常用于条件判断。
语法:
示例: 查询下单次数最多的客户信息:
2.2 多行子查询
多行子查询返回多行数据,常与 、、 等关键字一起使用。
语法:
示例: 查询下过订单的所有客户信息:
2.3 相关子查询
相关子查询是指子查询依赖于外部查询的值。与普通子查询不同,它在外部查询的每一行执行一次。
语法:
示例: 查询订单金额大于所有该客户历史订单平均金额的订单:
UNIOn 用于合并两个或多个 查询的结果。每个查询的列数和数据类型必须匹配。
语法:
示例: 查询所有客户和供应商的名称(假设有 和 表):
注意:
- 默认去重,可以使用 显示所有结果,包括重复项。
- 内连接(INNER JOIN) 是最常用的多表查询方式,只返回两个表之间匹配的数据。用于查找共有信息。
- 左连接(LEFT JOIN) 和 右连接(RIGHT JOIN) 用于在查询中保留一方表的所有数据,即使另一方没有匹配数据。
- 全连接(FULL JOIN) 可以通过 来模拟,它返回两个表中的所有数据,不论是否有匹配项。
- 交叉连接(CROSS JOIN) 用于生成笛卡尔积,慎用。
- 子查询(Subquery) 用于嵌套查询,单行子查询和多行子查询在复杂查询中非常有用。
- 联合查询(UNIOn) 合并多个查询的结果集,但需要保证各查询的列数和类型相同。