SQL82 返回 2020 年 1 月的所有订单的订单号和订单日期
方法一:时间函数匹配
select order_num,order_date
from Orders
where month(order_date)= '1'
order by order_date;
日期/时间分量提取
|
提取年份 |
YEAR(date) |
|
提取月份 |
MONTH(date) |
|
提取日 |
DAY(date) / DAYOFMONTH(date) |
|
提取小时 |
HOUR(time) |
|
提取分钟 |
MINUTE(time) |
|
提取秒 |
SECOND(time) |
利用date_format函数
select order_num,order_date
from Orders
where date_format(order_date,'%Y-%m')='2020-01'
order by order_date;
注意是:'2020-01'
DATE_FORMAT(date, format)
参数说明
常用格式符(适配表格中示例)
表格中 DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s') 用到的核心格式符:
- %Y:4 位完整年份(如 2026)
- %m:2 位月份(01~12,如 01、12)
- %d:2 位日期(01~31,如 01、31)
- %H:24 小时制小时(00~23,如 00、23)
- %i:2 位分钟(00~59,如 00、59)
- %s:2 位秒(00~59,如 00、59)
方法二:字符串匹配(近似查找法)
用like来查找
select order_num,order_date
from Orders
where order_date like '2020-01%'
order by order_date;
字符串比较
select order_num,order_date
from Orders
where order_date>='2020-01-01 00:00:00' and order_date<='2020-01-31 23:59:59'
order by order_date;
用正则来查找(效率不如like,能用like就用like)
select order_num,order_date
from Orders
where order_date regexp '2020-01'
order by order_date;
常用正则相关函数对比
|
函数名称 |
核心功能 |
MySQL 语法与示例 |
|
REGEXP_LIKE |
判断字符串是否匹配正则表达式(返回布尔值/匹配行) |
REGEXP_LIKE(str, pattern)<br>示例:REGEXP_LIKE('test123', '^test') → 1(匹配成功) |
|
REGEXP_SUBSTR |
提取字符串中匹配正则的子串 |
REGEXP_SUBSTR(str, pattern)<br>示例:REGEXP_SUBSTR('a1b2c3', '[0-9]+') → '1' |
|
REGEXP_INSTR |
返回正则匹配内容在字符串中的起始位置 |
REGEXP_INSTR(str, pattern)<br>示例:REGEXP_INSTR('a1b2c3', '[0-9]') → 2 |
|
REGEXP_REPLACE |
替换字符串中匹配正则的内容 |
REGEXP_REPLACE(str, pattern, new_str)<br>示例:REGEXP_REPLACE('a1b2c3', '[0-9]', '') →'abc' |
|
REGEXP_COUNT |
统计字符串中匹配正则的内容出现次数 |
REGEXP_COUNT(str, pattern)<br>示例:REGEXP_COUNT('a1b2c3', '[0-9]') → 3 |
切割字符串
select order_num,order_date
from Orders
where left(order_date,7)='2020-01'
order by order_date;
常用字符串切割函数对比
|
LEFT |
从字符串左侧截取指定长度的子串 |
LEFT(str, len)<br>示例:LEFT('2020-01-01', 7) → '2020-01' |
|
RIGHT |
从字符串右侧截取指定长度的子串 |
RIGHT(str, len)<br>示例:RIGHT('2020-01-01', 2) → '01' |
|
SUBSTRING/SUBSTR |
从字符串指定位置开始截取指定长度的子串 |
SUBSTRING(str, pos, len)<br>示例:SUBSTRING('abcdef', 2, 3) → 'bcd' |
|
SUBSTRING_INDEX |
按分隔符截取第n个分隔符前后的子串(MySQL专属) |
SUBSTRING_INDEX(str, delim, count)<br>示例:SUBSTRING_INDEX('a,b,c', ',', 2) → 'a,b' |
|
REGEXP_SUBSTR |
正则匹配截取子串(Oracle/MySQL 8.0+) |
REGEXP_SUBSTR(str, pattern, pos, occurrence, mode)<br>示例:REGEXP_SUBSTR('2020-01-01', '^[0-9]{4}-[0-9]{2}') → '2020-01' |
|
STRING_SPLIT |
按分隔符拆分字符串为多行(SQL Server 2016+) |
无原生函数,可通过自定义函数或SUBSTRING_INDEX循环实现 |
|
STUFF |
删除指定位置字符并替换(SQL Server专属) |
无原生函数,可通过CONCAT+SUBSTRING实现 |
SQL83 确定已售出产品的总数

聚合函数 sum的使用
select sum(quantity) items_ordered
from OrderItems;
SQL84 确定已售出产品项 BR01 的总数

第一种使用group by没有什么意义,为冗余代码
select sum(quantity)
from OrderItems
group by prod_id
having prod_id='BR01';
第二种由于where语法优先级较高,有限执行后,进行求和并查询
select sum(quantity)
from OrderItems
where prod_id='BR01';
SQL85 确定 Products 表中价格不超过 10 美元的最贵产品的价格
关键词:max
select max(prod_price) max_price
from Products
where prod_price<=10;
| 最大值 | max() |
| 最小值 | min() |
| 平均值 | avg() |
| 总值 | sum() |
| 总数 | count() |
用order + limit 实现 max
select prod_price max_price
from Products
where prod_price<=10
order by prod_price desc
limit 0,1;
#limit 1 offset 0 = limit 0,1





