文章建立在已知基础用法的前提下进行深入了解
一.排序
基础语法:
sql
SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名 [ASC|DESC];
# ASC: 升序,默认是升序
# DESC: 降序
- 单行排序,即上述语法的基础用法
sql
# 根据角色ID升序排序
SELECT role_id FROM roles_table ORDER BY role_id ASC;
- 组合排序
sql
# 先根据性别ID降序排序再根据角色ID升序排序
SELECT role_id,role_gender FROM roles_table ORDER BY role_gender DESC,role_id ASC;
二.单行函数
- 数值函数
abs(x)
绝对值函数ceil(x)
向上取整floor
向下取整rand()
返回0-1随机数(可通过运算得到任意范围的随机数)round(x)
四舍五入得到整数
- 字符串函数
concat(s1,s2...sn)
连接字符串locate(s1,s)
从s中获取第一个s1开始的位置lower(s)
将字符串变成小写字母upper(s)
将字符串变成大写字母replace(s,s1,s2)
将s中的字符串s1替换为s2substr(s,start,length)
从字符串s的start位置截取长度为lenght的字符串trim(s)
去除字符串s前后的空格reverse(s)
反转字符串s
- 时间日期函数
now()
或sysdate()
返回当前系统时间(包括年月日时分秒)curdate()
返回当前年月日curtime()
返回当前时间(时分秒)month(date)
返回参数日期的月份
该函数会进行日期合法性判断,不合法会返回空
sql
# 以横杠隔开的日期
SELECT MONTH('2024-2-29')
# 以斜杠隔开的日期
SELECT MONTH('2024/2/29')
week(date)
与day(date)
同上date_add(date|datetime,INTERVAL expr type)
在参数日期上增加相应的时间
a.
date|datetime
日期或者日期时间b.
expr
添加的时间间隔(可为负数)c.
type
参数有很多选择
sql
# 在在该时间上加上30天
select date_add('2024-7-10 12:11:22',interval 30 DAY)
需要了解这个函数更完全的用法可以看看这位大佬的博客
MySQL加减间隔时间函数DATE_ADD和DATE_SUB的详解
- 流程控制函数
if(condition,expr1,expr2)
condition条件为true时返回expr1,反之exp2
sql
# 如果为真则查询role_id并将结果重命名为hhh
SELECT if(true,role_id,role_gender) as hhh FROM roles_table
ifnull(expr1,expr2)
expr1不为null时返回expr1,反之expr2
- 其他函数
version()
查看数据库版本user()
查看当前数据库用户md5(expr)
查看参数进行md5加密后的值
三. 聚合函数
count(rowName)
查询指定列记录数,为NULL不计,rowName为通配符*可查询总条数sum
计算指定列数值和,特性:如果不是数值类型,计算结果为0avg
计算指定列平均值,为NULL不记,特性同上max
||min
分别是计算特定列最大值与最小值,特性同上
四.分组
- 分组查询
分组查询指的是使用GROUP BY
对查询信息进行分组,相同的放一组,但只返回第一组,所以通常与聚合函数配合使用
SELECT 字段1,字段2... FROM 表名 [WHERE条件] GROUP BY 分组字段 [HAVING 条件];
在某些默认情况下如果分组查询的字段没有用聚合函数包裹会违反
ONLY_FULL_GROUP_BY
的规定,这里为了方便输出用于分组的字段内容可以关闭该规则
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
sql
# 关闭ONLY_FULL_GROUP_BY规则
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
# 使用性别为聚合条件
SELECT SUM(role_id),role_gender from roles_table GROUP BY role_gender
- where和having的对比
a. having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
b. having语句中可以使用聚合函数,where后面不可以使用聚合函数
sql
# 分组前条件ele_type_id<3,分组后条件 SUM(role_id)>50
SELECT SUM(role_id),role_gender from roles_table where ele_type_id<3 GROUP BY role_gender HAVING SUM(role_id)>50
五. limit
常用于实现分页查询
语法(放在最后)
SELECT *|字段列表 [as 别名] FROM 表名 [WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句];
两种方式:
LIMIT offset,length;
或者limit length;
offset
是指偏移量,可以认为是跳过的记录数量,默认为0,表示从哪开始
length
是指需要显示的总记录数,表示显示几条
sql
# 表示向后偏移0,显示几条
SELECT * from roles_table LIMIT 0,5;
六. select语句语法总结
SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 字段 HAVING 条件 ORDER BY 字段 LIMIT offset,length;