SQL 查询可以分为简单查询和复杂查询,简单查询通常用于获取基础数据,而复杂查询则涉及多表连接、子查询、聚合函数等更为高级的功能。在这部分,我将详细讲解 SQL 的简单查询 和 复杂查询,并结合实际示例进行讲解。
1. 简单查询
简单查询通常只涉及单一表格的数据检索,主要使用 SELECT 语句。它是最常见的查询方式,适用于基本的数据检索操作。
1.1. 查询所有数据
通过 SELECT * 可以选择表中的所有列。
SELECT * FROM users;
解释:
SELECT *:选取所有列。FROM users:指定要查询的表users。
结果:
user_id | name | email
------------------------
1 | Alice | alice@example.com
2 | Bob | bob@example.com
3 | Charlie | charlie@example.com
1.2. 查询特定列
如果只需要特定的列,可以明确指定列名。
SELECT name, email FROM users;
结果:
name | email
-----------------------------
Alice | alice@example.com
Bob | bob@example.com
Charlie | charlie@example.com
1.3. 查询带条件的数据(WHERE 子句)
可以通过 WHERE 过滤数据,条件可以使用逻辑运算符如 =, >, <, BETWEEN, LIKE 等。
SELECT * FROM users WHERE name = 'Alice';
结果:
user_id | name | email
--------------------------
1 | Alice | alice@example.com
示例:查询名字包含 ‘a’ 的用户
SELECT * FROM users WHERE name LIKE '%a%';
结果:
user_id | name | email
--------------------------
1 | Alice | alice@example.com
3 | Charlie | charlie@example.com
1.4. 排序查询(ORDER BY)
使用 ORDER BY 对查询结果进行排序,支持升序(ASC)和降序(DESC)。
SELECT * FROM users ORDER BY name ASC;
结果:
user_id | name | email
------------------------
1 | Alice | alice@example.com
2 | Bob | bob@example.com
3 | Charlie | charlie@example.com
1.5. 限制返回记录数(LIMIT)
使用 LIMIT 控制查询返回的最大行数。
SELECT * FROM users LIMIT 2;
结果:
user_id | name | email
------------------------
1 | Alice | alice@example.com
2 | Bob | bob@example.com
2. 复杂查询
复杂查询涉及多个表连接(JOIN)、子查询、聚合函数、窗口函数等功能,通常用于从多个角度获取数据或进行深入分析。
2.1. 多表连接(JOIN)
多表查询常常通过 JOIN 实现,它允许你从多个表中结合数据。
2.1.1. 内连接(INNER JOIN)
返回两个表中匹配的记录。
假设有以下两张表:
users 表:
user_id | name
----------------
1 | Alice
2 | Bob
3 | Charlie
orders 表:
order_id | user_id | product
--------------------------------
101 | 1 | Laptop
102 | 2 | Phone
103 | 1 | Tablet
内连接查询,获取每个用户及其订单:
SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.user_id = orders.user_id;
结果:
name | product
---------------------
Alice | Laptop
Alice | Tablet
Bob | Phone
2.1.2. 左连接(LEFT JOIN)
返回左表(第一个表)的所有记录,即使右表没有匹配的记录。
SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id;
结果:
name | product
----------------------
Alice | Laptop
Alice | Tablet
Bob | Phone
Charlie | NULL
2.2. 聚合查询
聚合函数用于计算数据的总和、平均值、最大值等。
2.2.1. 使用 GROUP BY 进行分组
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;
结果:
user_id | order_count
---------------------
1 | 2
2 | 1
2.2.2. 使用 HAVING 进行过滤
HAVING 用于过滤聚合后的结果,类似 WHERE,但 WHERE 不能用于聚合结果。
查询订单数大于 1 的用户:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 1;
结果:
user_id | order_count
---------------------
1 | 2
2.3. 子查询
子查询是嵌套在其他查询中的查询,常用于更复杂的条件判断。
2.3.1. 简单子查询
查询价格大于某个用户所有订单价格的用户:
SELECT * FROM users
WHERE user_id IN (
SELECT user_id FROM orders WHERE price > 500
);
2.3.2. 关联子查询
查询订单价格超过所有用户平均价格的用户:
SELECT name
FROM users
WHERE user_id IN (
SELECT user_id
FROM orders
WHERE price > (SELECT AVG(price) FROM orders)
);
2.4. 窗口函数
窗口函数用于在查询结果中进行分组后计算排名、总计等,能够在保持原始数据的基础上,计算出额外的信息。
2.4.1. 排名函数:ROW_NUMBER(), RANK(), DENSE_RANK()
例如,查询每个用户的订单排名:
SELECT
user_id,
product,
RANK() OVER (PARTITION BY user_id ORDER BY order_date) AS order_rank
FROM orders;
2.4.2. 聚合窗口函数:SUM(), AVG()
例如,计算每个用户的累计订单金额:
SELECT
user_id,
product,
SUM(price) OVER (PARTITION BY user_id ORDER BY order_date) AS cumulative_sales
FROM orders;
2.5. 联合查询(UNION)
UNION 用于将多个 SELECT 查询结果合并,要求查询列数和类型相同。
查询所有用户和所有订单信息:
SELECT name AS info FROM users
UNION
SELECT product AS info FROM orders;
3. 查询优化
- 使用索引:
- 对常用的查询字段(如
user_id、order_id)创建索引,能够加速查询操作。
CREATE INDEX idx_user_id ON orders(user_id);
- 避免
SELECT *:
- 仅查询需要的字段,避免查询不必要的数据。
- 限制返回结果:
- 使用
LIMIT限制返回记录数,避免查询结果过多。
- 避免多次子查询:
- 将重复使用的子查询提取为 CTE(公共表表达式),提高查询的效率和可读性。
通过上述讲解,我们可以清楚地看到 简单查询 和 复杂查询 在 SQL 中的使用和区别。简单查询适合简单的数据检索,而复杂查询则更具灵活性,适合处理多表连接、聚合分析以及更复杂的数据操作。更多详细内容请关注其他相关文章。