MySQL的使用
在MySQL中,DDL(数据定义语言)、DML(数据操作语言)和DQL(数据查询语言)是三类常用的SQL语言,每类语言有不同的功能:
1. DDL(Data Definition Language - 数据定义语言)
DDL 用于定义和修改数据库中的结构(如数据库、表、索引等)。常见的DDL命令包括 CREATE
、ALTER
和 DROP
。
-
创建数据库:
CREATE DATABASE my_database;
-
创建表:
CREATE TABLE my_table ( id INT PRIMARY KEY, name VARCHAR(50), age INT );
-
修改表:
ALTER TABLE my_table ADD COLUMN email VARCHAR(100);
-
删除表:
DROP TABLE my_table;
2. DML(Data Manipulation Language - 数据操作语言)
DML 用于对表中的数据进行增、删、改的操作。常见的DML命令有 INSERT
、UPDATE
和 DELETE
。
-
插入数据:
INSERT INTO my_table (id, name, age) VALUES (1, 'Alice', 25);
-
更新数据:
UPDATE my_table SET age = 26 WHERE name = 'Alice';
-
删除数据:
DELETE FROM my_table WHERE id = 1;
3. DQL(Data Query Language - 数据查询语言)
DQL 用于查询数据,主要是 SELECT
语句。可以通过 WHERE
、GROUP BY
、ORDER BY
等子句来精确地查询所需的数据。
-
查询所有数据:
SELECT * FROM my_table;
-
条件查询:
SELECT name, age FROM my_table WHERE age > 20;
-
分组查询:
SELECT age, COUNT(*) FROM my_table GROUP BY age;
-
排序查询:
SELECT * FROM my_table ORDER BY age DESC;
-
分页查询:
SELECT * FROM my_table LIMIT 10 OFFSET 0;
-
DDL 主要用于定义和修改表结构。
-
DML 主要用于操作表中的数据(增、改、删)。
-
DQL 主要用于查询数据,并可以结合各种子句精确查询。
MySQL 多表查询
MySQL 多表查询是关系型数据库中一个非常重要的功能,它允许开发者从多个相关表中获取数据。MySQL 提供了多种方式来进行多表查询,常见的有 连接查询(JOIN) 和 子查询(Subquery)。掌握这些技巧是数据库设计与查询优化中的核心技能。
以下是 MySQL 多表查询的总结,涵盖了常用的连接类型、子查询以及实际应用中的查询示例。
一、连接查询(JOIN)
1.1 INNER JOIN(内连接)
内连接是最常见的连接查询,它只返回两个表中匹配条件的数据。如果某一行在其中一个表中不存在对应的匹配行,那么该行将不会出现在结果集中。
语法:
SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;
示例:
假设有两个表:
orders
表(存储订单信息)customers
表(存储客户信息)
我们希望查询每个订单对应的客户信息:
SELECT orders.order_id, customers.customer_name, orders.order_date
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
此查询返回订单和客户的匹配结果,仅显示那些在 orders
表中有订单,并且在 customers
表中有对应客户的记录。
1.2 LEFT JOIN(左连接)
左连接返回左表中的所有行,即使右表中没有匹配的数据,右表中的数据为空(NULL
)。
语法:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;
示例:
我们希望查询所有订单,包括那些没有匹配到客户的订单:
SELECT orders.order_id, customers.customer_name, orders.order_date
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;
此查询会显示所有订单,即使某些订单的客户信息缺失。
1.3 RIGHT JOIN(右连接)
右连接与左连接相反,它返回右表中的所有行,即使左表中没有匹配的数据。
语法:
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
示例:
我们希望查询所有客户,包括那些没有下订单的客户:
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
此查询会显示所有客户信息,包含那些没有订单的客户。
1.4 FULL JOIN(全连接)
全连接返回两个表中的所有行,不论是否匹配。MySQL 本身不直接支持 FULL JOIN
,但可以通过使用 UNION
结合 LEFT JOIN
和 RIGHT JOIN
来实现全连接。
语法:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
示例:
返回所有客户和订单,不论是否有匹配关系:
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
UNION
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
1.5 CROSS JOIN(交叉连接)
交叉连接会返回两个表的笛卡尔积,即每一个表中的行都和另一个表中的每一行进行组合,不考虑是否有匹配条件。
语法:
SELECT columns
FROM table1
CROSS JOIN table2;
示例:
查询所有产品与所有订单的组合:
SELECT products.product_name, orders.order_id
FROM products
CROSS JOIN orders;
此查询返回所有产品和订单的每一种组合。
二、子查询(Subquery)
2.1 单行子查询
单行子查询返回一行数据,常用于条件判断。
语法:
SELECT columns
FROM table
WHERE column = (SELECT value FROM other_table WHERE condition);
示例:
查询下单次数最多的客户信息:
SELECT *
FROM customers
WHERE customer_id = (SELECT customer_id
FROM orders
GROUP BY customer_id
ORDER BY COUNT(*) DESC LIMIT 1);
2.2 多行子查询
多行子查询返回多行数据,常与 IN
、ANY
、ALL
等关键字一起使用。
语法:
SELECT columns
FROM table
WHERE column IN (SELECT column FROM other_table WHERE condition);
示例:
查询下过订单的所有客户信息:
SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders);
2.3 相关子查询
相关子查询是指子查询依赖于外部查询的值。与普通子查询不同,它在外部查询的每一行执行一次。
语法:
SELECT columns
FROM table1 AS t1
WHERE column = (SELECT value FROM table2 AS t2 WHERE t1.column = t2.column);
示例:
查询订单金额大于所有该客户历史订单平均金额的订单:
SELECT order_id, order_total
FROM orders AS o1
WHERE order_total > (SELECT AVG(order_total)
FROM orders AS o2
WHERE o1.customer_id = o2.customer_id);
三、联合查询(UNION)
UNION 用于合并两个或多个 SELECT
查询的结果。每个查询的列数和数据类型必须匹配。
语法:
SELECT columns FROM table1
UNION
SELECT columns FROM table2;
示例:
查询所有客户和供应商的名称(假设有 customers
和 suppliers
表):
SELECT customer_name AS name FROM customers
UNION
SELECT supplier_name AS name FROM suppliers;
注意:
UNION
默认去重,可以使用UNION ALL
显示所有结果,包括重复项。
- 内连接(INNER JOIN) 是最常用的多表查询方式,只返回两个表之间匹配的数据。用于查找共有信息。
- 左连接(LEFT JOIN) 和 右连接(RIGHT JOIN) 用于在查询中保留一方表的所有数据,即使另一方没有匹配数据。
- 全连接(FULL JOIN) 可以通过
UNION
来模拟,它返回两个表中的所有数据,不论是否有匹配项。 - 交叉连接(CROSS JOIN) 用于生成笛卡尔积,慎用。
- 子查询(Subquery) 用于嵌套查询,单行子查询和多行子查询在复杂查询中非常有用。
- 联合查询(UNION) 合并多个查询的结果集,但需要保证各查询的列数和类型相同。
通过理解这些查询方式,开发者能够轻松地处理多表数据操作,实现复杂业务逻辑。