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;

相关推荐
·云扬·2 小时前
Redis性能测试实战:掌握redis-benchmark工具用法与集群压测技巧
数据库·redis·缓存
2401_837088503 小时前
秒杀优化—基于 Redis 完成秒杀下单
数据库·redis·缓存
爬山算法3 小时前
Redis(144)Redis的Cluster的节点通信是如何实现的?
数据库·redis·缓存
丸码3 小时前
Java异常体系全解析
java·开发语言
v***88563 小时前
Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
java·spring boot·后端
q***49453 小时前
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
java·ubuntu·centos
IMPYLH3 小时前
Lua 的 require 函数
java·开发语言·笔记·后端·junit·lua
曾经的三心草3 小时前
基于正倒排索引的Java文档搜索引擎1-实现索引模块-实现Parser类
java·开发语言·搜索引擎
vx_bscxy3223 小时前
告别毕设焦虑!Python 爬虫 + Java 系统 + 数据大屏,含详细开发文档 基于web的图书管理系统74010 (上万套实战教程,赠送源码)
java·前端·课程设计
AI绘画小333 小时前
Web 安全核心真相:别太相信任何人!40 个漏洞挖掘实战清单,直接套用!
前端·数据库·测试工具·安全·web安全·网络安全·黑客