mysql快速精通(一)DQL数据查询语言

文章建立在已知基础用法的前提下进行深入了解

一.排序

基础语法:

sql 复制代码
SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名 [ASC|DESC]; 
# ASC: 升序,默认是升序 
# DESC: 降序
  1. 单行排序,即上述语法的基础用法
sql 复制代码
# 根据角色ID升序排序
SELECT role_id FROM roles_table ORDER BY role_id ASC;
  1. 组合排序
sql 复制代码
# 先根据性别ID降序排序再根据角色ID升序排序
SELECT role_id,role_gender FROM roles_table ORDER BY role_gender DESC,role_id ASC;

二.单行函数

  1. 数值函数
  • abs(x) 绝对值函数
  • ceil(x) 向上取整
  • floor 向下取整
  • rand() 返回0-1随机数(可通过运算得到任意范围的随机数)
  • round(x) 四舍五入得到整数
  1. 字符串函数
  • concat(s1,s2...sn) 连接字符串
  • locate(s1,s) 从s中获取第一个s1开始的位置
  • lower(s) 将字符串变成小写字母
  • upper(s) 将字符串变成大写字母
  • replace(s,s1,s2) 将s中的字符串s1替换为s2
  • substr(s,start,length) 从字符串s的start位置截取长度为lenght的字符串
  • trim(s) 去除字符串s前后的空格
  • reverse(s) 反转字符串s
  1. 时间日期函数
  • 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的详解

  1. 流程控制函数
  • 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
  1. 其他函数
  • version()查看数据库版本
  • user()查看当前数据库用户
  • md5(expr) 查看参数进行md5加密后的值

三. 聚合函数

  • count(rowName)查询指定列记录数,为NULL不计,rowName为通配符*可查询总条数
  • sum计算指定列数值和,特性:如果不是数值类型,计算结果为0
  • avg计算指定列平均值,为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;

相关推荐
数据技术说12 分钟前
MySQL 迁移实战——如何实现真正的"零改造"平滑切换
mysql
MacroZheng23 分钟前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端
SamDeepThinking35 分钟前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试
倔强的石头_15 小时前
《Kingbase护城河》——猎捕慢查询:执行计划的微观解析与索引调优实战
数据库
SelectDB17 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
Flittly18 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了18 小时前
Java 生成二维码解决方案
java·后端
人活一口气1 天前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP1 天前
Vibe Coding -- 完整项目案例实操
java
荣码1 天前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python