Part 04 MySQL数据查询语句(DQL)(单表)
约 2569 字大约 9 分钟
2024-12-05
1 概述
单表查询用于数据库的查询操作,不影响库表结构,也不会影响表的数据,而是基于原表数据利用SELECT语法、WHERE条件、运算符号、单行/多行函数、分组和排序等查询出一个虚拟表。
其关键字为 SELECT
。
2 基础SELECT语法
2.1 非表查询
-- 输出函数结果
SELECT VERSION();
2.2 指定表查询
- 指定表中的某些字段进行查询
SELECT <字段A>, <字段B>, <字段C>, ... FROM <表名>;
- 指定表中的全部字段进行查询
SELECT * FROM <表名>;
2.3 给字段添加别名
SELECT <字段A> as <字段A别名>, <字段B> as <字段B别名>, <字段C> as <字段C别名>, ... FROM <表名>;
其中 as
可以被省略。
SELECT <字段A> <字段A别名>, <字段B> <字段B别名>, <字段C> <字段C别名>, ... FROM <表名>;
例如,要将表��字段 stu_id
和 stu_name
映射到接口 stuId
和 stuName
中,只需要
SELECT stu_id as "stuId", stu_name "stuName" FROM <test_table>;
为了区分大小写,使用双引号包裹别名。
2.4 去除重复记录
指定单个字段或多个字段去除重复记录。
当两个记录的这些字段的值全部都相同时,才认为这两个记录相同。
SELECT DISTINCT <字段A>[, 字段B, 字段C, ...] FROM <表名>;
2.5 查询常量
在查询结果中添加一个值为常量的字段。
SELECT <常量> as <字段X>, <字段A>, <字段B>, ... FROM <表名>;
3 条件查询
条件查询的关键字为 WHERE
。
SELECT <字段A>, <字段B>, ... FROM <表名> WHERE <条件>
添加查询条件后,会先从表中过滤出符合条件的记录,再返回指定字段。
4 运算符
运算符的优先级和其他编程语言基本一致,提高运算优先级可以用 ()
包裹。
4.1 算术运算符
算数运算符 | 描述 | 是否标准SQL |
---|---|---|
%(MOD) | 取模 | ✅ |
* | 乘法 | ✅ |
+ | 加法 | ✅ |
- | 减法 | ✅ |
/ | 浮点数除法 | ✅ |
DIV | 整数除法 | ✅ |
特别地,如果发生了除以0的情况,会返回NULL而不是抛出异常。
4.2 比较运算符
比较运算符 | 描述 | 是否标准SQL | 比较运算符 | 描述 | 是否标准SQL |
---|---|---|---|---|---|
> | 大于 | ✅ | IS NULL | NULL值测试 | ✅ |
>= | 大于等于 | ✅ | IS NOT NULL | 非NULL值测试 | ✅ |
< | 小于 | ✅ | BETWEEN ... AND ... | 值是否在范围内 | ✅ |
<= | 小于等于 | ✅ | NOT BETWEEN ... AND ... | 值是否不在范围内 | ✅ |
<> | 不等于 | ✅ | IN() | 值是否在一组值中 | ✅ |
!= | 不等于 | ❌ | NOT IN() | 值是否不在一组值中 | ✅ |
= | 等于 | ✅ | LIKE | 简单的模式匹配(模糊等于) | ✅ |
< = > | NULL安全的等于 | ❌ | NOT LIKE | 否定简单的模式匹配 | ✅ |
比较运算符的结果为1、0、NULL。1代表true,0和NULL代表false。
比较操作适用于数字和字符串。根据需要,字符串会自动转换为数字,数字会自动转换为字符串。
4.3 逻辑运算符
逻辑运算符 | 描述 | 是否标准SQL | 逻辑运算符 | 描述 | 是否标准SQL |
---|---|---|---|---|---|
AND | 逻辑且 | ✅ | && | 逻辑且 | ✅ |
NOT | 逻辑非 | ✅ | ! | 逻辑非 | ✅ |
OR | 逻辑或 | ✅ | || | 逻辑或 | ✅ |
XOR | 逻辑亦或 | ✅ |
5 单行函数和多行函数
MySQL中内置了多种函数,如数值函数、日期函数、字符串函数、流程函数、信息函数、时间函数、聚合函数等。按照其作用域的不同,将其分为单行函数和多行函数。
单行函数:对一条记录的某个字段进行操作,返回结果是单一值。
数值函数、日期函数、字符串函数、流程函数、信息函数、时间函数,都是单行函数
多行函数:对多条记录的某个字段进行操作,返回结果是单一值。
聚合函数是多行函数。
5.1 数值函数
函数 | 返回值 | 是否标准SQL | 函数 | 返回值 | 是否标准SQL |
---|---|---|---|---|---|
ABS(x) | x的绝对值 | ✅ | MOD(x,y) | x模y | ✅ |
SIGN(x) | x的符号 x为正数时返回1 x为负数时返回-1 x为0时返回0 | ✅ | RAND() | 0~1的随机数 | ❌ |
PI() | 圆周率Pi | ✅ | RAND(x) | 以x为种子 生成0~1的随机数 | ❌ |
CEIL(x) | 向上取整 | ✅ | ROUND(x) | 将x四��五入到整数 | ✅ |
CEILING(x) | 向上取整 | ✅ | ROUND(x,y) | 将x四舍五入到小数点后y位 | ✅ |
FLOOR(x) | 向下取整 | ✅ | TRUNCATE(x,y) | 将x截断为y位小数 | ❌ |
LEAST(x1,x2,x3,...,xn) | 列表中的最小值 | ❌ | SQRT(x) | x的平方根 当x为负数是返回NULL | ✅ |
GREATEST(x1,x2,x3,...,xn) | 列表中的最大值 | ❌ |
5.2 字符串函数
函数 | 返回值 | 是否标准SQL | 函数 | 返回值 | 是否标准SQL |
---|---|---|---|---|---|
CHAR_LENGTH(s) | 字符串s的字符数 | ✅ | LEFT(s,n) | 返回字符串s的前n个字符 | ✅ |
LENGTH(s) | 字符串s的字节数 | ✅ | RIGHT(s,n) | 返回字符串s的后n个字符 | ✅ |
CONTACT(s1, s2, ..., sn) | 连接若干个字符串为一个字符 | ❌ | TRIM(s) | 去除字符串s首尾的空格 | ✅ |
INSERT(s1, i, l, s2) | 将字符串s1的第i字符开始、l个字符长的子串 替换为字符串s2 | ✅ | SUBSTR(s,i,l) | 返回字符串s从第i位置开始长度为l的子串 | ❌ |
REPLACE(s,a,b) | 将字符串s中的所有字符串a替换为字符串b | ✅ | FIND_IN_SET(s1,s2) | 返回字符串s1在字符串s2中的位置(以逗号分隔) | ❌ |
UPPER(s) | 将字符串s转换为大写 | ✅ | REVERSE(s) | 返回字符串s的反转 | ❌ |
UCASE(s) | 将字符串s转换为大写 | ❌ | NULLIF(s1,s2) | 如果字符串s1等于字符串s2, 则返回NULL,否则返回s1 | ✅ |
LOWER(s) | 将字符串s转换为小写 | ✅ | |||
LCASE(s) | 将字符串s转换为小写 | ❌ |
5.3 时间函数
时间函数包含许多函数,可以将其分为三类:时间提取函数、时间计算函数、时间格式化函数。
5.3.1 时间提取函数
函数 | 返回值 | 是否标准SQL | 函数 | 返回值 | 是否标准SQL |
---|---|---|---|---|---|
CURDATE() | 当前日期 | ❌ | YEAR(date) | 日期的年份 | ❌ |
CURRENT_DATE() | 当前日期 | ✅ | MONTH(date) | 日期的月份 | ❌ |
CURTIME() | 当前时间 | ❌ | DAY(date) | 日期的天数 | ❌ |
CURRENT_TIME() | 当前时间 | ✅ | HOUR(time) | 时间的小时 | ❌ |
NOW() | 当前日期和时间 | ❌ | MINUTE(time) | 时间的分钟 | ❌ |
SYSDATE() | 当前日期和时间 | ❌ | SECOND(time) | 时间的秒数 | ❌ |
UTCDATE() | 当前UTC日期 | ❌ | MONTHNAME(date) | 日期的月份名称 | ❌ |
UTCTIME() | 当前UTC时间 | ❌ | DAYNAME(date) | 日期的星期名称 | ❌ |
WEEKDAY(date) | 日期的星期几 | ❌ | DAYOFYEAR(date) | 日期在年的天数 | ❌ |
QUARTER(date) | 日期的季度 | ❌ | DAYOFMONTH(date) | 日期在月的天数 | ❌ |
WEEK(date) | 日期在年的周数 | ❌ | DAYOFWEEK(date) | 日期在周的天数 | ❌ |
WEEKOFYEAR(date) | 日期在年的周数 | ❌ |
5.3.2 时间计算函数
函数 | 返回值 | 是否标准SQL | 函数 | 返回值 | 是否标准SQL |
---|---|---|---|---|---|
DATE_ADD(datetime, INTERVAL expr type) | 指定日期加上时间间隔后的日期 | ❌ | FROM_DAYS(n) | 将天数转换为日期 | ❌ |
ADDDATE(datetime, INTERVAL expr type) | 指定日期加上时间间隔后的日期 | ❌ | TO_DAYS(n) | 将日期转换为天数 | ❌ |
DATE_SUB(datetime, INTERVAL expr type) | 指定日期减去时间间隔后的日期 | ❌ | LAST_DAY(date) | 指定月份的最后一天 | ❌ |
SUBDATE(datetime, INTERVAL expr type) | 指定日期减去时间间隔后的日期 | ❌ | MAKEDATE(year,n) | 由年份和天数生成日期 | ❌ |
ADDTIME(time1,time2) | 时间相加的结果 | ❌ | MAKETIME(hour,min,sec) | 由小时、分钟和秒生成时间 | ❌ |
SUBTIME(time1,time2) | 时间相减的结果 | ❌ | |||
DATEDIFF(date1,date2) | 日期相减的天数 | ❌ | |||
TIMEDIFF(time1,time2) | 时间相减的结果 | ❌ |
5.3.3 时间格式化函数
函数 | 返回值 | 是否标准SQL |
---|---|---|
DATE_FORMAT(date,fmt) | 按照指定格式 fmt 格式化日期 date | ❌ |
TIME_FORMAT(time,fmt) | 按照指定格式 fmt 格式化时间 time | ❌ |
STR_TO_DATE(str,fmt) | 按照指定格式 fmt 将字符串 str 转换为日期或时间 | ❌ |
格式化符号 | 作用 | 格式化符号 | 作用 | 格式化符号 | 作用 |
---|---|---|---|---|---|
%Y | 四位数的年份(如2023) | %y | 两位数的年份(如23) | %M | 月份名称(如January) |
%m | 数字月份(01-12) | %b | 缩写的月份名称(如Jan) | %c | 数字月份(1-12) |
%D | 带有英文序数后缀的日子(如1st, 2nd, 3rd) | %d | 两位数的日期(01-31) | %e | 数字日期(1-31) |
%H | 小时(00-23,24小时制) | %h | 小时(01-12,12小时制) | %k | 小时(0-23,24小时制) |
%i | 分钟数(00-59) | %S | 秒数(00-59) | %s | 秒数(00-59) |
%W | 星期名称(如Sunday) | %a | 缩写的星期名称(如Sun) | %w | 一周中的第几天(0=星期日,6=星期六) |
%j | 一年中的第几天(001-366) | %U | 一年中的第几周(00-53,星期日作为一周的第一天) | %u | 一年中的第几周(00-53,星期一作为一周的第一天) |
%T | 时间(24小时制,hh:mm:ss) | %r | 时间(12小时制,hh:mm:ss AM或PM) | %p | AM或PM标识 |
%% | 字面上的百分号符号 % |
5.4 流程控制函数
IF
函数
IF(<条件>, <True_Value>, <False_Value>)
当条件成立时,返回 True_Value
,否则返回 False_Value
。
IFNULL
函数
IFNULL(<字段>, <Null_Value>)
当指定字段的值是 NULL
时,将其替换为 Null_Value
。
CASE
表达式
CASE表达式有两种,其一为
CASE
WHEN <条件1> THEN <结果1>
WHEN <条件2> THEN <结果2>
WHEN <条件3> THEN <结果3>
...
ELSE <默认结果>
END
这种形式中的WHEN语句后跟着判断条件,而非一个具体的值。其二为
CASE <表达式或字段>
WHEN <值1> THEN <结果1>
WHEN <值2> THEN <结果2>
WHEN <值3> THEN <结果3>
...
ELSE <默认结果>
END
在这种形式中,CASE后跟随一个常量表达式或者字段名,WHEN后面跟着一个值,然后逐个相比较。
5.5 聚合函数
聚合函数是作用于多个记录进行统计和计算,最终返回一个结果。
函数 | 返回值 | 是否标准SQL |
---|---|---|
AVG(字段名) | 返回指定列的平均值 | ✅ |
SUM(字段名) | 返回指定列的总和 | ✅ |
MIN(字段名) | 返回指定列的最小值 | ✅ |
MAX(字段名) | 返回指定列的最大值 | ✅ |
COUNT(字段名) | 返回指定列的非NULL值的个数 | ✅ |