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;

相关推荐
云和数据.ChenGuang19 分钟前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys1 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi1 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据2 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
xlsw_2 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
Hacker_LaoYi3 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀3 小时前
Redis梳理
数据库·redis·缓存
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
神仙别闹3 小时前
基于java的改良版超级玛丽小游戏
java
你的微笑,乱了夏天3 小时前
linux centos 7 安装 mongodb7
数据库·mongodb