摘要:本文学习了SQL语言中的通用语法。
环境
Windows 10 企业版 LTSC 21H2
MySQL 5.7.40
1 基本规范
- 支持单行和多行书写,以分号结尾。
- 可以使用空格和缩进来增强语句的可读性。
- 不区分大小写,建议关键字使用大写。
2 注释
支持单行注释和多行注释:
- 单行注释:使用
--
符号或者#
符号会注释之后到行末尾之间的单行内容。 - 多行注释:使用
/*
符号和*/
符号注释之间的多行内容。
3 着重号
如果在定义表或者字段等其他实体时命名与保留字和关键字有冲突,在不想更改命名的情况下可以使用``
着重号将名称包裹起来,这样就不会被识别为关键字和保留字。
4 语句分类
根据SQL语句的功能,主要分为四类:
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象,比如数据库,以及表和字段。
- DML(Data Manipulation Language):数据操作语言,用来对数据库表中的数据进行增删改。
- DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录。
- DCL(Data Control Language):数据控制语言,用来创建数据库用户以及控制用户对数据库的访问权限。
5 数据类型
5.1 整数类型
整数类型的属性字段可以添加auto_increment自增约束条件。
整数类型:
类型名称 | 存储需求 |
---|---|
tinyint | 1字节 |
smallint | 2字节 |
mediumint | 3字节 |
int | 4字节 |
bigint | 8字节 |
定义整型的写法是int(N)
,这种写法只需要记住两点:
- 无论N等于多少,int永远占4个字节。
- N表示的是显示宽度,不足的用0补足,超过的无视长度而直接显示整个数字,但这要整型设置了
unsigned zerofill
才有效。
5.2 浮点类型
浮点类型有两种,分别是单精度浮点数(float)和双精度浮点数(double)。
浮点类型:
类型名称 | 存储需求 |
---|---|
float | 4字节 |
double | 8字节 |
定义浮点类型可以用(M,D)
来表示,其中M称为精度,表示总共的位数,D称为标度,表示小数的位数。
5.3 定点类型
浮点型的float和double存在精度丢失问题,即写入数据库的数据未必是插入数据库的数据。
由此引入了decimal类型,无论写入数据中的数据是多少,都不会存在精度丢失问题。
定点类型:
类型名称 | 存储需求 |
---|---|
decimal | 总位数M+2字节 |
常见于银行系统和互联网金融系统等对小数点后的数字比较敏感的系统中。
定义定点类型可以用(M,D)
来表示,和定义浮点类型相同,但区别在浮点类型没有指定参数时默认按照实际精度来处理,而定点类型在没有指定参数时默认使用(10,0)
作为参数。
5.4 日期和时间类型
支持五种形式的日期类型:
类型名称 | 日期格式 | 日期范围 | 存储需求 |
---|---|---|---|
year | YYYY | 1901 ~ 2155 | 1字节 |
time | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3字节 |
date | YYYY-MM-DD | 1000-01-01 ~ 9999-12-03 | 3字节 |
datetime | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8字节 |
timestamp | YYYY-MM-DD HH:MM:SS | 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC | 4字节 |
其中datetime与timestamp两种类型的区别:
- datetime占8个字节,timestamp占4个字节。
- 由于大小的区别,datetime与timestamp能存储的时间范围也不同。
- datetime默认值为空,当插入的值为null时,该列的值就是null。timestamp默认值不为空,当插入的值为null时,该列的值取当前时间。
- datetime存储的时间与时区无关,timestamp存储的时间及显示的时间都依赖于当前时区。
在实际工作中,一张表往往会有两个默认字段,一个记录创建时间而另一个记录最新一次的更新时间,这种时候可以使用timestamp类型来实现。
5.5 字符串类型
字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据,支持使用正则表达式进行匹配查找。
字符串类型众多,括号中的M表示可以为其指定长度:
类型名称 | 存储需求 |
---|---|
char(M) | M字节,1<=M<=255 |
varchar(M) | L+1字节,L<=M并且1<=M<=65535 |
tinytext | L+1字节,L<2^8 |
text | L+2字节,L<2^16 |
mediumtext | L+3字节,L<2^24 |
longtext | L+4字节,L<2^32 |
enum | 1字节或2字节,取决于枚举值的数目,最大值65535 |
set | 最大8字节,取决于集合成员数量,最多64个成员 |
5.5.1 char
使用char(M)
表示固定长度的字符串,存储时在右侧填充空格以达到指定的长度,查询时会删除尾部的空格。
5.5.2 varchar
使用varchar(M)
表示可变长度的字符串,存储的是字符串的实际内容。
5.5.3 text
使用text
表示可变长度的字符串,保存非二进制字符串,如文章内容和评论等。
支持四种类型:
- tinytext
- text
- mediumtext
- longtext
5.5.4 enum
使用enum
表示字符串对象,值为表创建时设定的枚举值,最多可以有65535个元素。
语法:
1 | 字段名 enum('值1', '值1', ..., '值n') |
字段名是将要定义的字段,值n指枚举列表中第n个值。
enum类型的字段在取值时,能在指定的枚举列表中获取,而且一次只能取一个。如果创建的成员中有空格,尾部的空格将自动被删除。
enum值依照列索引顺序排列,并且空字符串排在非空字符串前,null值排在其他所有枚举值前。
enum列总有一个默认值。如果将enum列声明为null,null值则为该列的一个有效值,并且默认值为null。如果enum列被声明为not null,其默认值为允许的值列表的第1个元素。
5.5.5 set
使用set
表示字符串的对象,值为表创建时规定的一列值,最多可以有64个成员。
语法:
1 | 字段名 set('值1', '值2', ..., '值n') |
与enum类型相同,set值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,尾部空格将自动删除。
与enum类型不同的是,enum类型的字段只能从定义的列值中选择一个值插入,而set类型的列可从定义的列值中选择多个字符的联合。
如果插入set字段中的列值有重复,则自动删除重复的值。并且插入set字段的值的顺序并不重要,在存入数据库时,按照定义的顺序显示。如果插入了不正确的值,默认情况下,会忽视这些值并警告。
5.6 二进制类型
用于存储二进制形式的值,支持多种类型,括号中的M表示长度:
类型名称 | 存储需求 |
---|---|
bit(M) | 大约(M+7)/8字节 |
binary(M) | M字节 |
varbinary(M) | M+1字节 |
tinyblob | L+1字节,L<2^8 |
blob | L+2字节,L<2^16 |
mediumblob | L+3字节,L<2^24 |
longblob | L+4字节,L<2^32 |
5.6.1 数字
使用bit(M)
表示二进制位数为M的数字,范围为1~64,默认值为1。如果长度小于M位,在值的左边使用0
填充。
例如保存的值为3,二进制形式为0101
,在这里需要M至少为4,大于二进制形式1111
的数据不能插入。
5.6.2 字符串
使用binary(M)
表示固定长度的二进制字符串。如果长度小于M位,在值的右边使用\0
填充。
使用varbinary(M)
表示可变长度的二进制字符串。
5.6.3 大对象
用于存储可变数量的二进制大对象,比如音频和视频等,根据可容纳值的最大长度分为四种:
- tinyblob
- blob
- mediumblob
- longblob
条