sql-DQL(持续更新中...)
完整执行顺序总结
- FROM:选择数据源并应用连接。
- WHERE:过滤记录。
- GROUP BY:分组数据。
- HAVING:过滤分组结果。
- SELECT:提取所需列并计算表达式。
- ORDER BY:对结果排序。
- LIMIT / OFFSET:限制返回记录数量。
SELECT user_id, SUM(total_price) AS TotalAmount
FROM Orders
WHERE total_price > 100
GROUP BY user_id
HAVING SUM(total_price) > 500
ORDER BY TotalAmount DESC
LIMIT 10;
临时表with...as
字段合并
汇总函数
分组函数
自查询
视图
连接查询(左连接、内连接、右连接)
窗口函数(排名、累计、连续)
日期时间函数
1、空值:is (not) null
“教师表”中找出姓名为空值和不为空值的教师号
select 教师号 from 教师表 where 教师姓名 is null;
select 教师号 from 教师表 where 教师姓名 is not null
2、去除重复记录:distinct
SELECT DISTINCT user_id FROM Orders ORDER BY user_id;
返回唯一的
user_id数据
假设 Orders
表中有如下数据:
order_id | user_id | total_price |
---|---|---|
1 | 1 | 100 |
2 | 1 | 200 |
3 | 2 | 150 |
4 | 2 | 250 |
5 | 3 | 300 |
执行查询后,结果将是:
user_id |
---|
1 |
2 |
3 |
SELECT DISTINCT user_id, total_price FROM Orders;
返回
user_id
和唯一的total_price
组合(多对一)
假设 Orders
表中有如下数据:
order_id | user_id | total_price |
---|---|---|
1 | 1 | 100 |
2 | 1 | 200 |
3 | 2 | 150 |
4 | 2 | 150 |
5 | 3 | 300 |
执行查询后,结果将是:
user_id | total_price |
---|---|
1 | 100 |
1 | 200 |
2 | 150 |
3 | 300 |
3、case条件判断
“评分表”含有3个字段:房源号、城市、分数。求分数(满分10分)在0-5分、5-7分、7-9分、9分及以上的分别有多少个房源?
select count(房源号) from 评分表 group by 分数
(case when 分数<5 then 房源号 end) as '0-5',
(case when 分数>=5 and 分数<7 then 房源号 end) as '5-7',
(case when 分数>=7 and 分数<9 then 房源号 end) as '7-9',
(case when 分数>=9 房源号 end) as '9+'
4、返回 每个访客和对应的浏览日期(每个访客同一天浏览多次算作一次记录)。
SELECT DISTINCT visitor_id, browse_date
FROM Visitor;
5、or
查询表中数据是否有空值的记录
select * from order where user_id is null or total_price is null
假设 Orders
表中有如下数据:
order_id | user_id | total_price | order_date |
---|---|---|---|
1 | 101 | 200.50 | 2024-12-01 |
2 | NULL | 150.00 | 2024-12-02 |
3 | 103 | NULL | 2024-12-03 |
4 | NULL | NULL | 2024-12-04 |
5 | 105 | 300.00 | 2024-12-05 |
运行上述查询后,返回以下记录:
order_id | user_id | total_price | order_date |
---|---|---|---|
2 | NULL | 150.00 | 2024-12-02 |
3 | 103 | NULL | 2024-12-03 |
4 | NULL | NULL | 2024-12-04 |
6、重命名:as
1. 列的别名
为列创建一个别名,通常用于更改结果集中列的标题。
SELECT user_id AS UserID, total_price AS TotalAmount FROM Orders;
2. 表的别名
为表创建别名,常用于复杂查询中简化表名,特别是在多表关联时。
SELECT o.order_id, u.user_name FROM Orders AS o JOIN Users AS u ON o.user_id = u.user_id;
3. 表达式的别名: as
SELECT product_id, quantity * price AS TotalPrice FROM OrderDetails;
4. 子查询的别名
SELECT o.UserID, o.TotalAmount FROM ( SELECT user_id AS UserID, SUM(total_price) AS TotalAmount FROM Orders GROUP BY user_id ) AS o WHERE o.TotalAmount > 1000;
5. 列的计算或拼接
SELECT CONCAT(first_name, ' ', last_name) AS FullName FROM Users;
7、汇总函数(计数count()、和sum()、均值avg()、最值max/min(),合成一个结果)
为了监测新上市的产品的受欢迎程度,通过数据来分析用户的总数、用户的平均年龄、每个性别的平均年龄和用户总数、按年龄范围统计用户数量。
SELECT
COUNT(*) AS TotalUsers,
AVG(age) AS AverageAge
FROM Users;
假设 Users
表包含以下数据:
user_id | user_name | age | |
---|---|---|---|
1 | Alice | 25 | alice@mail.com |
2 | Bob | 30 | bob@mail.com |
3 | Charlie | NULL | charlie@mail.com |
4 | Diana | 35 | diana@mail.com |
5 | Eve | 40 | eve@mail.com |
运行查询后,返回结果:
TotalUsers | AverageAge |
---|---|
5 | 32.5 |