SQL语法笔记(持续更新)

SQL语法笔记

1 SQL语言概述

1.1 SQL分类

SQL语言在功能上主要分为以下几类:

  • 数据查询语言(Data Query Language,DQL),用于进行数据查询而不会对数据本身进行修改的子句,是最基本的SQL子句。

    • 主要的子句关键字包括SELECTFROMWHEREGROUP BYHAVINGORDER BY等。
  • 数据定义语言(Data Definition Language,DDL),用于定义数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。

    • 主要的子句关键字包括CREATEDROPALTER等。
  • 数据操纵语言(Data Manipulation Language, DML),用于添加、删除、更新和查询数据库记录,并检查数据完整性。

    • 主要的子句关键词包括INSERTDELETEUPDATESELECT等。
  • 数据控制语言(Data Control Language,DCL),用于定义数据库、表、字段、用户的访问权限和安全级别。

    • 主要的子句关键字包括GRANTREVOKECOMMITROLLBACKSAVEPOINT等。

1.2 SQL语言的规则和规范

1.2.1 基本规则
  • SQL可以写在一行或者多行。为了提高可读性,各句子分行写,必要时使用缩进;
  • 每条命令以;结束;
  • 关键字不能被缩写也不能分行;
  • 关于标点符号:
    • 必须保证所有的()、单引号和双引号是成对结束的;
    • 必须使用英文符号;
    • 字符串型和日期时间类型的数据可以使用单引号(’’)表示;
    • 列的别名,尽量使用双引号(""),而且不要省略as;
1.2.2 SQL大小写规范
  • MySQL在Windows环境下大小写不敏感;
  • MySQL在Linux环境下大小写敏感;
    • 数据库名、表名、表的别名、变量名是严格区分大小写的;
    • 关键字、函数名、列名(字段名)、列的别名(字段的别名)是忽略大小写的。
  • 推荐采用统一的书写规范:
    • 数据库名、表名、表别名、字段名、字段别名等都小写;
    • SQL关键字、函数名、绑定变量等都大写;
1.2.3 注释

注释格式如下:

单行注释:#注释文字
单行注释:-- 注释文字(--后面必须包含一个空格)
多行注释:/*注释文字	*/

2 SELECT子句

2.1 SELECT子句作用

SELECT子句用于从表中选取数据。

结果被存储在一个结果表中(称为结果集)

2.2 SELECT语法

2.2.1 SELECT … FROM
  • 语法:
# 搜索整个表:
SELECT *
FROM 表名;

# 搜索表中的某列(属性):
SELECT 字段
FROM 表名;

# 搜索表中的某些列(属性):
SELECT 字段1, 字段2, ...
FROM 表名;

# 数字类型的值可以运算:
SELECT 字段1 * 2
FROM 表名;
2.2.2 AS(列的别名)
  • 重命名一个列

  • 语法:

# 可用作单个搜索:
SELECT 字段 AS 别名
FROM 表名;

# 可用作多个搜索:
SELECT 字段 AS 别名, 字段 AS 别名, 字段 AS 别名
FROM 表名;

# 可根据情况选择使用:
SELECT 字段, 字段 AS 别名, 字段 AS 别名
FROM 表名;

# 也可使用双引号引起而不使用关键字AS:
SELECT 字段 "别名" 
FROM 表名;

# 也可以直接省略:
SELECT 字段 别名 
FROM 表名;
2.2.3 DISTINCT(去除重复行)
  • 去除查询中重复的属性值(列值)
  • 语法:
# 单个搜索:
SELECT DISTINCT 字段
FROM 表名;

# 多个搜索:
SELECT DISTINCT 字段1, 字段2
FROM 表名;
2.2.4 NULL(空值参与运算)
  • 空值(NULL)不等同于0,’’,"",‘NULL’;

  • NULL与任何值参与运算,结果都等于NULL

  • IFNULL()函数可以使用值替换NULL

# 替换NULL值:
SELECT 字段1 * IFNULL(字段2/*NULL*/,)
FROM 表名;
2.2.5 着重号(``)
  • 属性名关键字重名时,使用着重号引起来;
  • 语法:
# FROM为关键字,使用着重号引起后则为字段:
SELECT `FROM`
FROM 表名;

# FROM为关键字,使用着重号引起后则为表名:
SELECT * FROM `FROM`;
2.2.6 查询常数
  • 使用常数时,每一行都会匹配常数;
  • 语法:
SELECT 常数, 字段
FROM 表名;
# 结果为:常数 + 字段

3 显示表结构

3.1 DESCRIBE(显示表结构)

  • 显示表中字段的详细信息

  • 语法:

DESCRIBE 表名;

# 缩写:
DESC 表名;
  • 含义
Field Type Null Key Default Extra
包含字段 数据类型 能否为空 约束 是否有默认值 额外描述

4 过滤数据

4.1 WHERE子句

4.1.1 WHERE子句作用
  • WHERE子句添加到SELECT子句中,可有条件地从表中选取数据;
  • WHERE子句紧随FROM子句;
  • 语法:
SELECT 字段
FROM 表名
WHERE 字段 运算符 值;
4.1.2 运算符
  • 下列运算符可在WHERE子句中使用:
操作符 作用
= 等于
<> / != 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
4.1.3 引号
  • 数值不要使用引号
  • 如果是文本值则使用单引号
  • 子句:
# 数值不需要加引号:
SELECT *
FROM 表名
WHERE 字段 运算符 数值;

# 文本值需要加引号:
SELECT *
FROM 表名
WHERE 字段 运算符 '文本值';

5 运算符

5.1 算术运算符

  • 算术运算符主要用于数学运算,其可以连接运算符前后的两个数字或表达式,对数字或表达式进行加(+)、减(-)、乘(*)、除(/)和取模(%)运算。
运算符 名称 作用 示例
+ 加法运算符 计算两个值或表达式的和 SELECT A + B
- 减法运算符 计算两个值或表达式的差 SELECT A - B
* 乘法运算符 计算两个值或表达式的乘积 SELECT A * B
/ 或 DIV 除法运算符 计算两个值或表达式的商 SELECT A / B
% 或 MOD 求模运算符 计算两个值或表达式的余数 SELECT A % B

其中加法没有连接的作用,只表示加法运算,此时会将字符串转换为数值。

5.2 比较运算符

  • 比较运算符用来对表达式左边操作数和右边操作数进行比较,比较结果为真则返回1,为假则返回0,其他情况返回NILL
5.2.1 符号比较运算符
运算符 名称 作用 示例
= 等于运算符 判断两个值、字符串或表达式是否相等 SELECT C FROM TABLE WHERE A = B
<=> 安全等于运算符 安全地判断两个值、字符串或表达式是否相等 SELECT C FROM TABLE WHERE A <=> B
<>(!=) 不等于运算符 判断两个值、字符串或表达式是否不相等 SELECT C FROM TABLE WHERE A != B
< 小于运算符 判断前面的值、字符串或表达式是否小于后面的 SELECT C FROM TABLE WHERE A < B
<= 小于等于运算符 判断前面的值、字符串或表达式是否小于等于后面的 SELECT C FROM TABLE WHERE A <= B
> 大于运算符 判断前面的值、字符串或表达式是否大于后面的 SELECT C FROM TABLE WHERE A > B
>= 大于等于运算符 判断前面的值、字符串或表达式是否大于等于后面的 SELECT C FROM TABLE WHERE A >= B
5.2.2 非符号比较运算符
运算符 名称 作用 示例
IS NULL 为空运算符 判断值、字符串或表达式是否为空 SELECT B FROM TABLE WHERE A IS NULL
IS NOT NULL 不为空运算符 判断值、字符串或表达式是否不为空 SELECT B FROM TABLE WHERE A IS NOT NULL
LEAST 最小值运算符 在多个值中返回最小值 SELECT D FROM TABLE WHERE C LEAST(A, B)
GREATEST 最大值运算符 在多个值中返回最大值 SELECT D FROM TABLE WHERE C GREATEST(A, B)
BETWEEN…AND 两值之间的运算符 判断一个值是否在两个值之间 SELECT D FROM TABLE WHERE C BETWEEN A AND B
ISNULL 为空运算符 判断一个值、字符串或表达式是否为空 SELECT B FROM TABLE WHERE A ISNULL
IN 属于运算符 判断一个值是否为列表中的任意一个值 SELECT D FROM TABLE WHERE C IN(A, B)
NOT IN 不属于运算符 判断一个值是否不是列表中的任意一个值 SELECT D FROM TABLE WHERE C NOT IN(A, B)
LIKE 模糊匹配运算符 判断一个值是否符合模糊匹配规则 SELECT C FROM TABLE WHERE A LIKE B
REGEXP 正则表达式运算符 判断一个值是否符合正则表达式的规则 SELECT C FROM TABLE WHERE A REGEXP B
RLIKE 正则表达式运算符 判断一个值是否符合正则表达式的规则 SELECT C FROM TABLE WHERE A RLIKE B
  • LIKE需要搭配通配符使用:
    • %代表不确定个数的字符(0个,1个,或多个),可放在字符前后,可连续使用。
    • _代表一个不确定的字符。
    • 加入转义字符\可将上面两个通配符还原为正常字符。
5.2.2.1 正则表达式查询
  • 正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据指定的匹配模式匹配稳重符合要求的特殊字符串。
  • 例如从一个文本文件中提取电话号码,查找一篇文章中重复的单词或者替换用户输入的某些敏感词语等。
选项 说明 例子 匹配值实例
^ 匹配文本的开始字符 '^b’匹配以字母b开头的字符串 book, big, banana, bike
$ 匹配文本的结束字符 'st$'匹配以st结尾的字符串 test, resist, persist
. 匹配任何单个字符 'b.t’匹配任何b和t之间有一个字符的字符串 bit, bat, but, bite
* 匹配零个或多个在它前面的字符 'f*n’匹配字符n前面有任意个字符f的字符串 fn, fan, faan, fabcn
+ 匹配前面的字符1次或多次 'ba+'匹配以b开头后面紧跟至少有一个a的字符串 ba, bay, bare, battle
<字符串> 匹配包含指定的字符串的文本 'fa’匹配包含fa的字符串 fan, afa, faad
[字符集合] 匹配字符集合中的任何一个字符 '[xz]'匹配包含x或者z的字符串 dizzy, zebra, x-ray, extra
[^] 匹配不在括号中的任何字符 '[^abc]'匹配任何不包含a、b或c的字符串 desk, fox, f8ke
字符串{n,} 匹配前面的字符串至少n次 b{2}匹配2个或更多的b bbb, bbbb, bbbbbb
字符串{n,m} 匹配前面的字符串至少n次,至多m次。如果n为0,此参数为可选参数 b{2, 4}匹配含最少2个、最多4个b的字符串 bb, bbb, bbbb

5.3 逻辑运算符

  • 逻辑运算符主要用来判断表达式的真假,在MySQL中,逻辑运算符的结果返回1、0或NULL
  • MySQL的4中逻辑运算符如下:
运算符 作用 示例
NOT 或 ! 逻辑非 SELECT NOT A
AND 或 && 逻辑与 SELECT A AND BSELECT A && B
OR 或 || 逻辑或 SELECT A OR BSELECT A || B
XOR 逻辑异或 SELECT A XOR B

5.4 位运算符

  • 位运算符是在二进制数上进行计算的运算符。

  • 位运算会先将操作数变成二进制数,然后进行位运算。

  • 最后将计算结果从二进制变回十进制数。

  • MySQL的运算符如下:

运算符 作用 示例
& 按位与(位AND) SELECT A & B
| 按位或(位OR) SELECT A | B
^ 按位异或(位XOR) SELECT A ^ B
~ 按位取反 SELECT ~ A
>> 按位右移 SELECT A >> 2
<< 按位左移 SELECT B << 2

6 排序与分页

6.1 排序数据

6.1.1 排序规则
  • 使用ORDER BY子句排序
    • ASC(ascend):升序
    • DESC(descend):降序
6.1.2 一级排序
  • ORDER BY子句在SELECT子句的结尾。
  • 语法:
# 升序排序于某字段:
SELECT 字段1, 字段2, 字段3
FROM 表名
ORDER BY 字段(1~3);

# 降序排序于某字段:
SELECT 字段1, 字段2, 字段3
FROM 表名
ORDER BY 字段(1~3) DESC;

#使用别名进行排序:
SELECT 字段1, 字段2 AS 别名, 字段3
FROM 表名
ORDER BY 别名;

# ORDER在WHERE后面:
SELECT 字段1, 字段2, 字段3
FROM 表名
WHERE 字段 运算符 值
ORDER BY 字段(1~3);
6.1.3 多级排序
  • 在一级排序后,再选择一个字段进行排序。
  • 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
  • 语法:
SELECT 字段1, 字段2, 字段3
FROM 表名
ORDER BY 字段(1~3), 字段;

# 也可以让第二级降序排序:
SELECT 字段1, 字段2, 字段3
FROM 表名
ORDER BY 字段(1~3), 字段 DESC;

# 前面降序,后面升序:
SELECT 字段1, 字段2, 字段3
FROM 表名
ORDER BY 字段(1~3) DESC, 字段 ASC;

6.2 分页

6.2.1 分页作用
  • 查询返回的数据太多,实现分页查询可更加便捷;
  • 显示规定的某几条数据;
6.2.2 实现规则
  • 分页原理
    • 就是将数据库中的结果集,一段一段显示出来需要的条件。
  • 语法:
LIMIT[位置偏移量], 行数;

第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从第一条记录开始(第一条记录的位置偏移量是0);

第二个参数“行数”指示每一页多少行。

  • 举例:
# 前10条数据:
SELECT *
FROM 表名
LIMIT 0, 10;

# 或者:
SELECT *
FROM 表名
LIMIT 10;

# 第11至20条记录:
SELECT *
FROM 表名
LIMIT 10, 10;

# 第21至30条记录:
SELECT *
FROM 表名
LIMIT 20, 10;
  • 分页显式公式:(当前页数-1)* 每页条数,每页条数
SELECT *
FROM table
LIMIT (PageNo - 1) * PageSize, PageSize;

注意!LIMIT子句必须放在整个SELECT子句的最后!


7 多表查询

前提条件:这些一起查询的表之间是有关系的(一对一、一对多、多对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也有可能没有建立外键。

比如:员工表和部门表,这两个表依靠“部门编号”进行关联。

7.1 表的连接

7.1.1 笛卡尔积(交叉连接)
  • 将两个或多个表直接进行连接。
  • 一般连接出来的数据大多冗余,不能够被使用。
  • 语法:
# 方法一: 将两个表进行笛卡尔积
SELECT 字段1/*来自表1*/, 字段2/*来自表2*/
FROM1,2;

# 方法二:
SELECT 字段1/*来自表1*/, 字段2/*来自表2*/
FROM1
CROSS JOIN2;

也称为笛卡尔积错误,一般在下面的条件下产生:

  • 省略多个表的连接条件(或关联条件);
  • 连接条件(或关联条件)无效;
  • 所有表中的所有行互相连接;
7.1.2 条件连接
  • 在笛卡尔积的基础上增加条件。
  • 语法:
# 多个表中无重复字段时:
SELECT 字段1/*来自表1*/, 字段2/*来自表2*/
FROM1,2
WHERE 连接条件;	# 在WHERE后增加筛选的条件

# 多个表中出现重复字段时:
SELECT1.字段1/*来自表1*/,2.字段1/*来自表2*/
FROM1,2
WHERE 连接条件;	# 指明各字段所在的表

# 给表起别名:(如果给表起了别名,在SELECT或WHERE中使用表名的话,必须使用表的别名,不能再使用表的原名)
SELECT t1.字段1/*来自表1*/, t2.字段1/*来自表2*/
FROM1 t1,2 t2
WHERE 连接条件;

建议:从SQL优化的角度,建议多表查询时,每个字段前都指明其所在的表。

如果有n个表实现多表查询则需要至少需要n-1个连接条件。

7.2 多表查询的分类

  • 角度1:等值连接 vs 非等值连接
  • 角度2:自连接 vs 非自连接
  • 角度3:内连接 vs 外连接
7.2.1 等值连接和非等值连接
  • 示例:
# 等值连接:
SELECT t1.字段1/*来自表1*/, t2.字段1/*来自表2*/
FROM1 t1,2 t2
WHERE=;

# 非等值连接:
SELECT t1.字段1/*来自表1*/, t2.字段1/*来自表2*/
FROM1 t1,2 t2
WHERE[!=|<|<=|>|>=|...];
7.2.2 自连接和非自连接
  • 示例:
# 自连接:
SELECT t1.字段1, t2.字段1
FROM1 t1,2 t2
WHERE 连接条件;
7.2.3 内连接和外连接
  • 内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行(交集)

  • 外连接:两个表在连接过程中除了满足连接条件的行以外,还返回左(或右)表中不满足条件的行,这种连接称为左(或右)连接。没有匹配的行时,结果表中相应的列为空NULL

    • 外连接的分类:左外连接、右外连接、满外连接
    • 如果是左外连接,则连接条件中左边的表也称为主表、右边的表称为从表

7.3 SQL99语法实现多表查询

7.3.1 SQL99实现内连接
  • 语法:
# 内连接(2张表):
SELECT 字段...
FROM1 JOIN2
ON1.Key =2.Key;

# 内连接(3张表):
SELECT 字段...
FROM1 JOIN2
ON1.Key =2.Key;
JOIN3
ON2.Key =3.Key;
7.3.2 SQL99实现外连接
  • 语法:
# 左外连接:
SELECT 字段...
FROM1 LEFT OUTER JOIN2
ON1.Key =2.Key;

# 右外连接:
SELECT 字段...
FROM1 RIGHT OUTER JOIN2
ON1.Key =2.Key;

# 满外连接: MySQL不支持,Oracle支持
SELECT 字段...
FROM1 FULL OUTER JOIN2
ON1.Key =2.Key;

7.4 UNION的使用

合并查询结果

利用UNION关键字,可以给出多条SELECT子句,并将它们的结果组合成当个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT子句之间使用UNIONUNION ALL关键字分隔。

  • 语法:
SELECT 字段...
FROM1
UNION [ALL]
SELECT 字段...
FROM2;
7.4.1 UNION操作符
  • UNION操作符返回两个查询接过的结果集的并集,区处于重复记录。
7.4.2 UNION ALL操作符
  • UNION ALL操作符返回两个查询的结果接的并集。对于两个结果集的重复部分,不去重。

注意:执行UNION ALL子句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL子句,以提高数据查询的效率。

7.5 7种SQL JOINS的实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KE3G3TGY-1648026404331)(https://www.runoob.com/wp-content/uploads/2019/01/sql-join.png “JOIN”)]

  • 中图:内连接

  • 左上图:左外连接;

  • 右上图:右外连接;

  • 左中图:左上图基础上加WHERE

  • 右中图:右上图基础上加WHERE

  • 左下图:满外连接

    • 方式1:左上图UNION ALL右中图
    • 方式2:左中图UNION ALL右上图
  • 右下图:

    • 左中图UNION ALL右中图

7.6 SQL99语法新特性

7.6.1 自然链接
  • 语法:
SELECT 字段...
FROM1 NATURAL JOIN2

8 单行函数

  • 操作数据对象
  • 接受参数返回一个结果
  • 只对一行进行变换
  • 每行返回一个结果
  • 可以嵌套
  • 参数可以是一列或一个值

8.1 数值函数

8.1.1 基本函数
函数 作用
ABS(x) 返回x的绝对值
SIGN(X) 返回X的符号。正数返回1,负数返回-1,0返回0
PI() 返回圆周率的值
CEIL(x),CEILING(x) 返回大于或等于某个值的最小整数
FLOOR(x) 返回小于或等于某个值的最大整数
LEAST(e1,e2,e3…) 返回列表中的最小值
GREATEST(e1,e2,e3…) 返回列表中的最大值
MOD(x,y) 返回X除以Y后的余数
RAND() 返回0~1的随机值
RAND(x) 返回0~1的随机值,其中x的值用作种子值,相同的X值会产生相同的随机数
ROUND(x) 返回一个对x的值进行四舍五入后,最接近于X的整数
ROUND(x,y) 返回一个对x的值进行四舍五入后最接近X的值,并保留到小数点后面Y位
TRUNCATE(x,y) 返回数字x截断为y位小数的结果
SQRT(x) 返回x的平方根。当X的值为负数时,返回NULL
  • 举例:
SELECT
ABS(-123),ABS(32),SIGN(-23),SIGN(43),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32),
FLOOR(-43.23),MOD(12,5)
FROM DUAL;
8.1.2 角度与弧度互换函数
函数 作用
RADIANS(x) 将角度转化为弧度,其中,参数x为角度值
DEGREES(x) 将弧度转化为角度,其中,参数x为弧度值
8.1.3 三角函数
函数 作用
SIN(x) 返回x的正弦值,其中,参数x为弧度值
ASIN(x) 返回x的反正弦值,即获取正弦为x的值。如果x的值不在-1到1之间,则返回NULL
COS(x) 返回x的余弦值,其中,参数x为弧度值
ACOS(x) 返回x的反余弦值,即获取余弦为x的值。如果x的值不在-1到1之间,则返回NULL
TAN(x) 返回x的正切值,其中,参数x为弧度值
ATAN(x) 返回x的反正切值,即返回正切值为x的值
ATAN2(m, n) 返回两个参数的反正切值
COT(x) 返回x的余切值,其中,X为弧度值
8.1.4 指数函数
函数 作用
POW(x,y),POWER(X,Y) 返回x的y次方
EXP(X) 返回e的X次方,其中e是一个常数,2.718281828459045
LN(X),LOG(X) 返回以e为底的X的对数,当X <= 0 时,返回的结果为NULL
LOG10(X) 返回以10为底的X的对数,当X <= 0 时,返回的结果为NULL
LOG2(X) 返回以2为底的X的对数,当X <= 0 时,返回NULL
8.1.5 进制间的转换函数
函数 作用
BIN(x) 返回x的二进制编码
HEX(x) 返回x的十六进制编码
OCT(x) 返回x的八进制编码
CONV(x,f1,f2) 返回f1进制数变成f2进制数

8.2 字符串函数

函数 作用
ASCII(S) 返回字符串S中的第一个字符的ASCII码值
CHAR_LENGTH(s) 返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同
LENGTH(s) 返回字符串s的字节数,和字符集有关
CONCAT(s1,s2,…,sn) 连接s1,s2,…,sn为一个字符串
CONCAT_WS(x, s1,s2,…,sn) 同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上x
INSERT(str, idx, len, replacestr) 将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestr
REPLACE(str, a, b) 用字符串b替换字符串str中所有出现的字符串a
UPPER(s) 或 UCASE(s) 将字符串s的所有字母转成大写字母
LOWER(s) 或LCASE(s) 将字符串s的所有字母转成小写字母
LEFT(str,n) 返回字符串str最左边的n个字符
RIGHT(str,n) 返回字符串str最右边的n个字符
LPAD(str, len, pad) 用字符串pad对str最左边进行填充,直到str的长度为len个字符
RPAD(str ,len, pad) 用字符串pad对str最右边进行填充,直到str的长度为len个字符
LTRIM(s) 去掉字符串s左侧的空格
RTRIM(s) 去掉字符串s右侧的空格
TRIM(s) 去掉字符串s开始与结尾的空格
TRIM(s1 FROM s) 去掉字符串s开始与结尾的s1
TRIM(LEADING s1 FROM s) 去掉字符串s开始处的s1
TRIM(TRAILING s1 FROM s) 去掉字符串s结尾处的s1
REPEAT(str, n) 返回str重复n次的结果
SPACE(n) 返回n个空格
STRCMP(s1,s2) 比较字符串s1,s2的ASCII码值的大小
SUBSTR(s,index,len) 返回从字符串s的index位置其len个字符,作用与SUBSTRING(s,n,len)、 MID(s,n,len)相同
LOCATE(substr,str) 返回字符串substr在字符串str中首次出现的位置,作用于POSITION(substr IN str)、INSTR(str,substr)相同。未找到,返回0
ELT(m,s1,s2,…,sn) 返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如 果m=n,则返回sn
FIELD(s,s1,s2,…,sn) 返回字符串s在字符串列表中第一次出现的位置
FIND_IN_SET(s1,s2) 返回字符串s1在字符串s2中出现的位置。其中,字符串s2是一个以逗号分隔的字符串
REVERSE(s) 返回s反转后的字符串
NULLIF(value1,value2) 比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value1

8.3 日期和时间函数

8.3.1 获取日期、时间
函数 作用
CURDATE() ,CURRENT_DATE() 返回当前日期,只包含年、 月、日
CURTIME() , CURRENT_TIME() 返回当前时间,只包含时、 分、秒
NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP() 返回当前系统日期和时间
UTC_DATE() 返回UTC(世界标准时间)日期
UTC_TIME() 返回UTC(世界标准时间)时间
8.3.2 日期与时间戳的转换
函数 作用
UNIX_TIMESTAMP() 以UNIX时间戳的形式返回当前时间。SELECT UNIX_TIMESTAMP() - >1634348884
UNIX_TIMESTAMP(date) 将时间date以UNIX时间戳的形式返回
FROM_UNIXTIME(timestamp) 将UNIX时间戳的时间转换为普通格式的时间
8.3.3 获取月份、星期、星期数、天数等函数
函数 作用
YEAR(date) / MONTH(date) / DAY(date) 返回具体的日期值
HOUR(time) / MINUTE(time) / SECOND(time) 返回具体的时间值
MONTHNAME(date) 返回月份:January,…
DAYNAME(date) 返回星期几:MONDAY,TUESDAY…SUNDAY
WEEKDAY(date) 返回周几,注意,周1是0,周2是1,。。。周日是6
QUARTER(date) 返回日期对应的季度,范围为1~4
WEEK(date) , WEEKOFYEAR(date) 返回一年中的第几周
DAYOFYEAR(date) 返回日期是一年中的第几天
DAYOFMONTH(date) 返回日期位于所在月份的第几天
DAYOFWEEK(date) 返回周几,注意:周日是1,周一是2,。。。周六是7
8.3.4 日期的操作函数
函数 作用
EXTRACT(type FROM date) 返回指定日期中特定的部分,type指定返回的值

EXTRACT(type FROM date)函数中type的取值与含义:

type取值 含义
MICROSECOND 返回毫秒数
SECOND 返回秒数
MINUTE 返回分钟数
HOUR 返回小时数
DAY 返回天数
WEEK 返回日期在一年中的第几个星期
MONTH 返回日期在一年中的第几个月
QUARTER 返回日期在一年中的第几个季度
YEAR 返回日期的年份
SECOND_MINCROSECOND 返回秒和毫秒值
MINUTE_MICROSECOND 返回分钟和毫秒值
MINUTE_SECOND 返回分钟和秒值
HOUR_MICROSECOND 返回小时和毫秒值
HOUR_SECOND 返回小时和秒值
HOUR_MINUTE 返回小时和分钟值
DAY_MICROSECOND 返回天和毫秒值
DAY_SECOND 返回天和秒值
DAY_MINUTE 返回天和分钟值
DAY_HOUR 返回天和小时
YEAR_MONTH 返回年和月
8.3.5 时间和秒钟转换的函数
函数 作用
TIME_TO_SEC(time) 将time转化为秒并返回结果值。转化的公式为:小时*3600+分钟 *60+秒
SEC_TO_TIME(seconds) 将seconds描述转化为包含小时、分钟和秒的时间
8.3.6 计算日期和时间的函数

第1组:

函数 作用
DATE_ADD(datetime, INTERVAL expr type), ADDDATE(date,INTERVAL expr type) 返回与给定日期时间相差INTERVAL时间段的日期时间
DATE_SUB(date,INTERVAL expr type), SUBDATE(date,INTERVAL expr type) 返回与date相差INTERVAL时间间隔的日期

上述函数中type的取值:

间隔类型 含义
HOUR 小时
MINUTE 分钟
SECOND
YEAR
MONTH
DAY
YEAR_MONTH 年和月
DAY_HOUR 日和小时
DAY_MINUTE 日和分钟
DAY_SECOND 日和秒
HOUR_MINUTE 小时和分钟
HOUR_SECOND 小时和秒
MINUTE_SECOND 分钟和秒

第2组:

函数 作用
ADDTIME(time1,time2) 返回time1加上time2的时间。当time2为一个数字时,代表的是,可以为负数
SUBTIME(time1,time2) 返回time1减去time2后的时间。当time2为一个数字时,代表的 是,可以为负数
DATEDIFF(date1,date2) 返回date1 - date2的日期间隔天数
TIMEDIFF(time1, time2) 返回time1 - time2的时间间隔
FROM_DAYS(N) 返回从0000年1月1日起,N天以后的日期
TO_DAYS(date) 返回日期date距离0000年1月1日的天数
LAST_DAY(date) 返回date所在月份的最后一天的日期
MAKEDATE(year,n) 针对给定年份与所在年份中的天数返回一个日期
MAKETIME(hour,minute,second) 将给定的小时、分钟和秒组合成时间并返回
PERIOD_ADD(time,n) 返回time加上n后的时间
8.3.7 日期的格式化与解析
函数 作用
DATE_FORMAT(date,fmt) 按照字符串fmt格式化日期date值
TIME_FORMAT(time,fmt) 按照字符串fmt格式化时间time值
GET_FORMAT(date_type,format_type) 返回日期字符串的显示格式
STR_TO_DATE(str, fmt) 按照字符串fmt对str进行解析,解析为一个日期

上述非GET_FORMAT函数中fmt参数常用的格式符:

格式符 说明 格式符 说明
%Y 4位数字表示年份 %y 表示两位数字表示年份
%M 月名表示月份(January, …) %m 两位数字表示月份 (01,02,03…)
%b 缩写的月名(Jan., Feb., …) %c 数字表示月份(1, 2, 3, …)
%D 英文后缀表示月中的天数(1st, 2nd, 3rd, …) %d 两位数字表示月中的天数(01, 02, …)
%e 数字形式表示月中的天数(1, 2, 3, 4, 5, …)
%H 两位数字表示小数,24小时制(01, 02, …) %h和%I 两位数字表示小时,12小时制(01,02…)
%k 数字形式的小时,24小时制(1, 2, 3) %l 数字形式表示小时,12小时制(1, 2, 3, 4, …)
%i 两位数字表示分钟(00, 01, 02) %S和%s 两位数字表示秒(00, 01, 02, …)
%W 一周中的星期名称(Sunday, …) %a 一周中的星期缩写(Sun., Mon., Tues., …)
%w 以数字表示周中的天数(0=Sunday, 1=Monday, …)
%j 以3位数字表示年中的天数(001,002…) %U 以数字表示年中的第几周,(1, 2, 3, …)其中Sunday为周中第一天
%u 以数字表示年中的第几周,(1, 2, 3, …)其中Monday为周中第一天
%T 24小时制 %r 12小时制
%p AM或PM %% 表示%

8.4 流程控制函数

流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL语句中实现不同的条件选择。MySQL中的流程处理函数主要包括IF()、IFNULL()和CASE()函数。

函数 作用
IF(value,value1,value2) 如果value的值为TRUE,返回value1,否则返回value2
IFNULL(value1, value2) 如果value1不为NULL,返回value1,否 则返回value2
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 … [ELSE resultn] END 相当于Java的if…else if…else…
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 … [ELSE 值n] END 相当于Java的switch…case…

8.5 加密与解密函数

加密与解密函数主要用于对数据库中的数据进行加密和解密处理,以防止数据被他人窃取。这些函数在保证数据库安全时非常有用。

函数 作用
PASSWORD(str) 返回字符串str的加密版本,41位长的字符串。加密结果不可逆,常用于用户的密码加密
MD5(str) 返回字符串str的md5加密后的值,也是一种加密方式。若参数为NULL,则会返回NULL
SHA(str) 从原明文密码str计算并返回加密后的密码字符串,当参数为NULL时,返回NULL。SHA加密算法比MD5更加安全
ENCODE(value,password_seed) 返回使用password_seed作为加密密码加密value
DECODE(value,password_seed) 返回使用password_seed作为加密密码解密value

8.6 MySQL信息函数

MySQL中内置了一些可以查询MySQL信息的函数,这些函数主要用于帮助数据库开发或运维人员更好地对数据库进行维护工作。

函数 作用
VERSION() 返回当前MySQL的版本号
CONNECTION_ID() 返回当前MySQL服务器的连接数
DATABASE(),SCHEMA() 返回MySQL命令行当前所在的数据库
USER(),CURRENT_USER()、SYSTEM_USER(), SESSION_USER() 返回当前连接MySQL的用户名,返回结果格式为“主机名@用户名”
CHARSET(value) 返回字符串value自变量的字符集
COLLATION(value) 返回字符串value的比较规则

8.7 其他函数

MySQL中有些函数无法对其进行具体的分类,但是这些函数在MySQL的开发和运维过程中也是不容忽视的。

函数 作用
FORMAT(value,n) 返回对数字value进行格式化后的结果数据。n表示四舍五入后保留到小数点后n位
CONV(value,from,to) 将value的值进行不同进制之间的转换
INET_ATON(ipvalue) 将以点分隔的IP地址转化为一个数字
INET_NTOA(value) 将数字形式的IP地址转化为以点分隔的IP地址
BENCHMARK(n,expr) 将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间
CONVERT(value USING char_code) 将value所使用的字符编码修改为char_code

9 聚合函数

  • 聚合函数作用于一组数据,并对一组数据返回一个值;
  • 聚合函数语法
SELECT [column, ] grounp function(column), ...
FROM[WHERE condition]
[GROUP BY column]
[ORDER BY column];

聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。

9.1 常用聚合函数

函数 作用 数据类型
AVG() 计算从SELECT语句返回的数值数据集的平均值 数值型类型
SUM() 计算从SELECT语句返回的数值数据集的总和 数值型类型
MIN() 查找给定列中的最小值/最小值 任意数据类型
MAX() 查找给定列中的最大值/最大值 任意数据类型
COUNT() 返回表中记录总数 任意数据类型

你可能感兴趣的:(sql,mysql)