文章目录
-
-
-
- [1. 多表连接(JOIN)](#1. 多表连接(JOIN))
- [2. 子查询(Subquery)](#2. 子查询(Subquery))
- [3. 聚合函数与分组(GROUP BY)](#3. 聚合函数与分组(GROUP BY))
- [4. 条件筛选(WHERE)](#4. 条件筛选(WHERE))
- [5. 排序(ORDER BY)](#5. 排序(ORDER BY))
- [6. 组合使用](#6. 组合使用)
-
-
1. 多表连接(JOIN)
功能介绍
多表连接是 SQL 中用于从多个表中检索数据的重要操作。它通过指定一个或多个条件来组合来自两个或多个表的数据行。主要类型包括:
- INNER JOIN:返回两个表中满足连接条件的匹配行。
- LEFT JOIN (或 LEFT OUTER JOIN):返回左表中的所有记录,即使右表中没有匹配项。对于右表中没有匹配项的情况,结果集中对应的字段将包含 NULL。
- RIGHT JOIN (或 RIGHT OUTER JOIN):与 LEFT JOIN 相反,返回右表中的所有记录。
- FULL JOIN (或 FULL OUTER JOIN):返回两个表中的所有记录,当某一方没有匹配时,使用 NULL 填充。
- CROSS JOIN:返回两个表的笛卡尔积,即每个表的每一行都与其他表的所有行配对。
应用场景
当你需要合并来自多个表的数据时,例如获取客户的订单信息、产品分类详情等,JOIN 是不可或缺的操作。
示例查询及初始表格
customers
表(未查询前)
customer_id | customer_name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
4 | Dave |
5 | Eve |
orders
表(未查询前)
order_id | customer_id | order_date | total_amount |
---|---|---|---|
101 | 1 | 2024-01-15 | 100.00 |
102 | 1 | 2024-02-20 | 200.00 |
103 | 2 | 2024-03-10 | 150.00 |
104 | 3 | 2024-04-15 | 75.00 |
105 | 3 | 2024-05-22 | 180.00 |
106 | 1 | 2024-06-30 | 90.00 |
107 | 1 | 2024-11-28 | 90.00 |
108 | 2 | 2024-11-30 | 125.00 |
109 | 3 | 2024-12-01 | 75.00 |
INNER JOIN 示例
查询
sql
SELECT customers.customer_name, orders.order_id, orders.order_date, orders.total_amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;
模拟查询结果
customer_name | order_id | order_date | total_amount |
---|---|---|---|
Alice | 101 | 2024-01-15 | 100.00 |
Alice | 102 | 2024-02-20 | 200.00 |
Alice | 106 | 2024-06-30 | 90.00 |
Alice | 107 | 2024-11-28 | 90.00 |
Bob | 103 | 2024-03-10 | 150.00 |
Bob | 108 | 2024-11-30 | 125.00 |
Charlie | 104 | 2024-04-15 | 75.00 |
Charlie | 105 | 2024-05-22 | 180.00 |
Charlie | 109 | 2024-12-01 | 75.00 |
LEFT JOIN 示例
查询
sql
SELECT customers.customer_name, orders.order_id, orders.order_date, orders.total_amount
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
模拟查询结果
customer_name | order_id | order_date | total_amount |
---|---|---|---|
Alice | 101 | 2024-01-15 | 100.00 |
Alice | 102 | 2024-02-20 | 200.00 |
Alice | 106 | 2024-06-30 | 90.00 |
Alice | 107 | 2024-11-28 | 90.00 |
Bob | 103 | 2024-03-10 | 150.00 |
Bob | 108 | 2024-11-30 | 125.00 |
Charlie | 104 | 2024-04-15 | 75.00 |
Charlie | 105 | 2024-05-22 | 180.00 |
Charlie | 109 | 2024-12-01 | 75.00 |
Dave | NULL | NULL | NULL |
Eve | NULL | NULL | NULL |
2. 子查询(Subquery)
功能介绍
子查询是在另一个查询内部执行的查询,它可以出现在 SELECT、FROM、WHERE 或 HAVING 子句中。根据子查询是否依赖于外部查询的结果,可以分为相关子查询和非相关子查询。
- 非相关子查询:独立于外部查询,通常用于计算聚合值如平均数、最大值等。
- 相关子查询:依赖于外部查询提供的参数,每次外部查询处理一行时,相关子查询都会重新评估。
应用场景
子查询常用于复杂的条件筛选、查找特定条件下的最值或者进行跨表比较。
示例查询及初始表格
orders
表(未查询前)
order_id | customer_id | order_date | total_amount |
---|---|---|---|
101 | 1 | 2024-01-15 | 100.00 |
102 | 1 | 2024-02-20 | 200.00 |
103 | 2 | 2024-03-10 | 150.00 |
104 | 3 | 2024-04-15 | 75.00 |
105 | 3 | 2024-05-22 | 180.00 |
106 | 1 | 2024-06-30 | 90.00 |
107 | 1 | 2024-11-28 | 90.00 |
108 | 2 | 2024-11-30 | 125.00 |
109 | 3 | 2024-12-01 | 75.00 |
非相关子查询 示例
查询
sql
SELECT *
FROM orders
WHERE total_amount > (SELECT AVG(total_amount) FROM orders);
模拟查询结果
order_id | customer_id | order_date | total_amount |
---|---|---|---|
102 | 1 | 2024-02-20 | 200.00 |
103 | 2 | 2024-03-10 | 150.00 |
105 | 3 | 2024-05-22 | 180.00 |
108 | 2 | 2024-11-30 | 125.00 |
相关子查询 示例
查询
sql
SELECT o1.customer_id, o1.order_id, o1.order_date, o1.total_amount
FROM orders o1
WHERE o1.total_amount = (
SELECT MAX(o2.total_amount)
FROM orders o2
WHERE o1.customer_id = o2.customer_id
);
模拟查询结果
customer_id | order_id | order_date | total_amount |
---|---|---|---|
1 | 102 | 2024-02-20 | 200.00 |
2 | 103 | 2024-03-10 | 150.00 |
3 | 105 | 2024-05-22 | 180.00 |
3. 聚合函数与分组(GROUP BY)
功能介绍
聚合函数如 COUNT(), SUM(), AVG(), MIN(), MAX() 等用于执行数值汇总操作。GROUP BY
子句用于将数据按照一个或多个列进行分组,然后对每个组应用聚合函数。
应用场景
当你需要对数据进行分类汇总时,例如计算每个客户的总订单金额、统计不同类别的商品数量等,GROUP BY
结合聚合函数是非常有效的工具。
示例查询及初始表格
customers
表(未查询前)
customer_id | customer_name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
4 | Dave |
5 | Eve |
orders
表(未查询前)
order_id | customer_id | order_date | total_amount |
---|---|---|---|
101 | 1 | 2024-01-15 | 100.00 |
102 | 1 | 2024-02-20 | 200.00 |
103 | 2 | 2024-03-10 | 150.00 |
104 | 3 | 2024-04-15 | 75.00 |
105 | 3 | 2024-05-22 | 180.00 |
106 | 1 | 2024-06-30 | 90.00 |
107 | 1 | 2024-11-28 | 90.00 |
108 | 2 | 2024-11-30 | 125.00 |
109 | 3 | 2024-12-01 | 75.00 |
查询
sql
SELECT c.customer_name, SUM(o.total_amount) AS total_spent
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_name
ORDER BY total_spent DESC;
模拟查询结果
customer_name | total_spent |
---|---|
Alice | 480.00 |
Charlie | 330.00 |
Bob | 275.00 |
4. 条件筛选(WHERE)
功能介绍
WHERE
子句用于过滤记录,只有符合条件的记录才会被包含在最终的结果集中。可以在 WHERE
中使用比较运算符(=, <, >, <=, >=, <>)、逻辑运算符(AND, OR, NOT)以及其他一些特定的运算符(LIKE, IN, BETWEEN...AND...)来进行复杂的条件组合。
应用场景
WHERE
子句广泛应用于数据过滤,比如选择特定日期范围内的记录、查找特定类别或状态的数据等。
示例查询及初始表格
orders
表(未查询前)
order_id | customer_id | order_date | total_amount |
---|---|---|---|
101 | 1 | 2024-01-15 | 100.00 |
102 | 1 | 2024-02-20 | 200.00 |
103 | 2 | 2024-03-10 | 150.00 |
104 | 3 | 2024-04-15 | 75.00 |
105 | 3 | 2024-05-22 | 180.00 |
106 | 1 | 2024-06-30 | 90.00 |
107 | 1 | 2024-11-28 | 90.00 |
108 | 2 | 2024-11-30 | 125.00 |
109 | 3 | 2024-12-01 | 75.00 |
查询
sql
SELECT *
FROM orders
WHERE YEAR(order_date) = 2024;
模拟查询结果
order_id | customer_id | order_date | total_amount |
---|---|---|---|
101 | 1 | 2024-01-15 | 100.00 |
102 | 1 | 2024-02-20 | 200.00 |
103 | 2 | 2024-03-10 | 150.00 |
104 | 3 | 2024-04-15 | 75.00 |
105 | 3 | 2024-05-22 | 180.00 |
106 | 1 | 2024-06-30 | 90.00 |
107 | 1 | 2024-11-28 | 90.00 |
108 | 2 | 2024-11-30 | 125.00 |
109 | 3 | 2024-12-01 | 75.00 |
5. 排序(ORDER BY)
功能介绍
ORDER BY
子句用于对查询结果按照一个或多个列进行排序,默认为升序排列(ASC),可以通过指定 DESC 实现降序排列。你还可以对多个列进行排序,优先级从左到右。
应用场景
当你希望按某种顺序展示查询结果时,例如按照时间先后、金额大小等,ORDER BY
是必不可少的。
示例查询及初始表格
orders
表(未查询前)
order_id | customer_id | order_date | total_amount |
---|---|---|---|
101 | 1 | 2024-01-15 | 100.00 |
102 | 1 | 2024-02-20 | 200.00 |
103 | 2 | 2024-03-10 | 150.00 |
104 | 3 | 2024-04-15 | 75.00 |
105 | 3 | 2024-05-22 | 180.00 |
106 | 1 | 2024-06-30 | 90.00 |
107 | 1 | 2024-11-28 | 90.00 |
108 | 2 | 2024-11-30 | 125.00 |
109 | 3 | 2024-12-01 | 75.00 |
查询
sql
SELECT *
FROM orders
ORDER BY order_date DESC;
模拟查询结果
order_id | customer_id | order_date | total_amount |
---|---|---|---|
109 | 3 | 2024-12-01 | 75.00 |
108 | 2 | 2024-11-30 | 125.00 |
107 | 1 | 2024-11-28 | 90.00 |
106 | 1 | 2024-06-30 | 90.00 |
105 | 3 | 2024-05-22 | 180.00 |
104 | 3 | 2024-04-15 | 75.00 |
103 | 2 | 2024-03-10 | 150.00 |
102 | 1 | 2024-02-20 | 200.00 |
101 | 1 | 2024-01-15 | 100.00 |
或者根据多个字段排序:
查询
sql
SELECT *
FROM orders
ORDER BY customer_id ASC, order_date DESC;
模拟查询结果
order_id | customer_id | order_date | total_amount |
---|---|---|---|
107 | 1 | 2024-11-28 | 90.00 |
106 | 1 | 2024-06-30 | 90.00 |
102 | 1 | 2024-02-20 | 200.00 |
101 | 1 | 2024-01-15 | 100.00 |
108 | 2 | 2024-11-30 | 125.00 |
103 | 2 | 2024-03-10 | 150.00 |
109 | 3 | 2024-12-01 | 75.00 |
105 | 3 | 2024-05-22 | 180.00 |
104 | 3 | 2024-04-15 | 75.00 |
6. 组合使用
功能介绍
实际应用中,通常会结合多种 SQL 特性来构建复杂的查询。例如,你可以同时使用 JOIN、子查询、聚合函数、WHERE 过滤、HAVING 筛选以及 ORDER BY 排序,以精确控制查询的结果集。
应用场景
这种组合使用非常普遍,尤其是在需要处理复杂业务逻辑或分析大量数据时。例如,查找特定年份内每个客户的订单总数,并且只显示订单数超过一定阈值的客户,同时按订单数降序排列。
示例查询及初始表格
customers
表(未查询前)
customer_id | customer_name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
4 | Dave |
5 | Eve |
orders
表(未查询前)
order_id | customer_id | order_date | total_amount |
---|---|---|---|
101 | 1 | 2024-01-15 | 100.00 |
102 | 1 | 2024-02-20 | 200.00 |
103 | 2 | 2024-03-10 | 150.00 |
104 | 3 | 2024-04-15 | 75.00 |
105 | 3 | 2024-05-22 | 180.00 |
106 | 1 | 2024-06-30 | 90.00 |
107 | 1 | 2024-11-28 | 90.00 |
108 | 2 | 2024-11-30 | 125.00 |
109 | 3 | 2024-12-01 | 75.00 |
查询
sql
SELECT c.customer_name, COUNT(o.order_id) AS order_count
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE YEAR(o.order_date) = 2024
GROUP BY c.customer_name
HAVING COUNT(o.order_id) > 5
ORDER BY order_count DESC;
模拟查询结果
customer_name | order_count |
---|---|
Alice | 4 |
示例数据中没有一个客户的订单数量超过5个,所以这里只有Alice满足条件。如果有更多的订单数据,可能会有更多的客户出现在结果中。