SQL复杂查询功能介绍及示例

文章目录

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满足条件。如果有更多的订单数据,可能会有更多的客户出现在结果中。

相关推荐
apcipot_rain5 分钟前
【应用密码学】实验五 公钥密码2——ECC
前端·数据库·python
辛一一3 小时前
neo4j图数据库基本概念和向量使用
数据库·neo4j
熊大如如3 小时前
Java 反射
java·开发语言
LJianK14 小时前
关系型数据库和非关系型数据库
sql
巨龙之路4 小时前
什么是时序数据库?
数据库·时序数据库
蔡蓝4 小时前
binlog日志以及MySQL的数据同步
数据库·mysql
猿来入此小猿4 小时前
基于SSM实现的健身房系统功能实现十六
java·毕业设计·ssm·毕业源码·免费学习·猿来入此·健身平台
goTsHgo4 小时前
Spring Boot 自动装配原理详解
java·spring boot
卑微的Coder5 小时前
JMeter同步定时器 模拟多用户并发访问场景
java·jmeter·压力测试
是店小二呀5 小时前
【金仓数据库征文】金融行业中的国产化数据库替代应用实践
数据库·金融·数据库平替用金仓·金仓数据库2025征文