用来对数据库管理系统中的对象进行增删改查的操作语言。
一、数据库
1、创建数据库
创建数据库是指在数据库管理系统的服务器中划分一个空间,用来存储相应的数据。在实际操作中,分析人员可以根据定期的需求分析对数据进行提取和归纳,并在当前用户权限下创建数据库用来存储提取的数据,这样即可以避免对实时业务产生冲突,也可以按照分析需求重新定义数据之间的关系。
--创建一个名为test的数据库(数据库名称可以为中英文字符、数字或下划线) create database test;
2、查看数据库
在数据库管理系统中,可查看当前用户权限范围以内的数据库。
show databases;
3、选择数据库
在完成创建数据库之后,该数据库不会自动成为当前数据库,如果我们要使用这个数据库,需先使用use命令来指定使用数据库。当没有执行使用数据库的命令,则系统无法知道我们要使用哪个数据库,且之后的操作语句中每次都需要限定符来指定数据库(格式为数据库名称.表明);若既没有执行使用数据库的命令,也没有使用限定字符来指定数据库,则数据库管理系统就会报错,执行使用数据库的命令后,所有SQL命令都会在当前数据库执行,直到再次使用use命令指定其他数据库。
--基础语法格式 --use <数据库名称>; use test; ? #使用创建好的test数据库
4、删除数据库
当一个数据库我们创建错了或者不想要它时,则需要执行删除命令将其删除(删除数据库的同时会删除数据库中存储的所有表和数据)
--基础语法格式 --drop database <数据库名称> drop database test;
二、数据表
1、数据字典
数据字典是一个用来描述数据表信息的表格,可以存储在数据库中,也可以以独立的说明文档的形式保存在数据库系统之外。对于分析人员来说,数据字典是分析阶段非常重要的工具,可以帮助分析人员快速梳理数据表的结构及字段的基础信息。数据字典应由数据库设计人员在数据库设计初期的需求分析阶段建立,在数据字典中会严格规定每个字段的相关属性,如字段的数据类型或字段的约束条件。一般来说,数据字典会包括表名、表的描述信息、字段名、字段描述、字段对应的数据类型、约束、初始值等信息。
2、创建表
创建表的同时需要指定表名、字段名、以及每个字段的数据类型和约束条件,其中约束条件可以不指定。在创建表时,一定要声明使用的数据库,即“use <数据库名称>”
--基础语法格式 create table <表名>( <字段名1> <数据类型1>[<约束条件1>, <字段名2> <数据类型2><约束条件2>, ………… <字段名n> <数据类型n><约束条件n>] );
3、查看表
我们查看当前数据库中已创建好的全部数据库,也可以进一步查看特定表的表结构。
--查看数据库下的所有表 show tables; --查看表结构(在查看表之前需要声明该表所在的数据库,用限定符指定数据库名称、表名) describe <表名> --或 desc <表名>
4、修改表
--修改表名(对表名进行修改,不用考虑被修改的表中是否有数据) alter table <原表名> rename <新表名>; --修改字段名(对表中字段的名称进行修改,不用考虑被修改的字段中是否有数据) alter table <表名> change <原字段名> <新字段名> <新数据类型>; --修改字段类型(对字段的类型进行修改时,如果要修改的字段已经存储了数据,那么数据库会检查已存储的数据是否满足新的数据类型的要求,只有在该字段的所有数据都满足新的数据类型的要求的情况下才会成功执行修改命令,如果有任意一行数据不满足要求就会报错,无法进行字段类型的修改【以数值格式存储的字符串,可以强制转换为数值类型】) alter table <表名> modify <字段名> <新数据类型>; --添加新字段(向已存在的表中添加新的字段,添加字段的位置可以指定,在不指定的情况下会默认将新字段添加到表中的最后一列) alter table <表名> add <新字段名> <数据类型> [约束条件] [first|after参照字段名] --修改字段的排列位置(出于业务逻辑方面的考虑,于数据库管理系统而言,无具体意义) alter table <表名> modify <字段名> <数据类型> first|after 参照字段名 --删除字段(删除表中不需要的字段,该字段在标准存储的全部数据、约束条件、索引等也会一并删除) alter table <表名> drop <字段名>;
5、删除表
删除表不仅会删除表的结构、约束条件、索引等,也会删除表中存储的全部数据。drop可同时删除多个表,if exists主要用来判断表名是否存在,在使用时需要注意如果表名输入数据,语句也不会报错,会正常执行,但是需要删除的表并没有被删除。
drop table [if exists] <表名> [,<表名1>,<表名2>,<表名2>,……,<表名n>];
三、数据类型
1、数据库中的每个字段都需要指定相应的数据类型,用于限制该字段中存储的数据。数据库中常用的数据类型有以下3种:数值型、字符串型(文本型)、日期和时间型。
2、计算机中最小的数据单位是位(bit),每一位的状态只能是二进制的0或1(比特币就是位币的意思)。字节(Byte)是由8个二进制位构成的,字节是数据存储空间的基本计量单位。INT为4字节,(有符号的INT值的取值范围为-(2^31)~~~2^31-1,无符号INT值的取值范围是0~~~2^32。
3、数值型(分为整数型和小数型)
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1字节 | (-128,127) | (0.255) | 小整数值 |
SMALLINT | 2字节 | (-) | ||
MEDIUMINT | 3字节 | |||
INT或INTEGER | 4字节 | |||
BIGINT | 8字节 |
注:整数型数据都可取有符号和无符号两种,如果要禁止负数,那么可以在整数型数据列后加上UNSIGNED,此时数据的取值就会从0开始。
FLOAT(4字节)、DOUBLE(8字节)。小数型数据可以通过后面加括号的方式来指定显示宽度和小数位数。括号中包含了一个最大可表示值和最小非零可表示值,最小非零可表示值决定了该类型的精确度。当指定UNSIGNED时,取值范围并没有平移到正数区间,而仅仅是把浮点类型的负数去掉。另,DECIMAL也可以用来存储小数,适用于金额、价格等对精度要求较高的数据存储,默认为DECIMAL(10,0),表示最多有10位数字,其中有0位小数。
名称 | 描述 |
---|---|
FLOAT(M,D) | 只能为有符号的。默认为FLOAT(10,2),表示最多有10位数字,其中有2位小数 |
DECIMAL(M,D) | 只能为有符号的,默认为DECIMAL(10,2),表示最多有10位数字,其中有0位小数 |
4、字符串型
字符串主要用来存储不能进行数字运算的文本数据。在实际应用中,字符串不仅可以用来表示任何一种值,还可以存储图片和声音的二进制数据,故字符串是最基本的数据类型之一。常见的字符串型数据类型有CHAR、VARCHAR、TEXT。CHAR(M)、VARCHAR(M)中的M是指定长度,这个长度必须大于实际数据的最大长度,否则会造成数据后半部分丢失。
CHAR和VARCHAR的区别在于,CHAR是固定长度的,每个值占用相同的字节数,针对不足的位数,MySQL会在它的右边用空格字符补足。VARCHAR是一种可变长度的类型,每个值占用其刚好的字数再加上一个用来记录其长度的字节,即L+1字节。在一个数据表中,只要有一个数据列的长度是可变的,所有数据列的长度就是可变的。
MySQL会自动进行自动转换。例,CHAR的长度小于4,此时不会进行自动转换,因为MySQL认为没必要这样做,节省不了多少空间。反而MySQL会把大量长度小的VARCHAR转换成CHAR,以减少空间占用量。
CHAR和VARCHAR的使用主要根据数据长度进行选择,如果数据长度相同,那么选用VARCHAR会多占用空间,因为 有1位用来存储其长度。如果数据长度不一,选用VARCHAR能节省存储空间。而CHAR不论字符长短都需补位占用相同的空间,即使是空值也不例外。如果长度出入不大,而且使用MyISAM或ISAM类型的表格,则用CHAR会比VARCHAR好,因为MyISAM和ISAM类型的表对处理固定长度的行的效率最高。
名称 | 描述 |
---|---|
CHAR(M) | 固定长度字符串,长度为1~255个字符。若不指定字符长度,则默认存储1个字符;若指定字符长度,但实际存储字符长度小于指定长度,则右边填充空格;若指定字符长度,但实际存储字符长度大于指定长度,则会报错 |
VARCHAR(M) | 可变长度字符串,长度为1~255个字符。定义该类型时必须指定长度 |
TEXT | 最大长度为65535个字符。用来存储二进制大数据,如图片。该类型不能指定长度。 |
5、日期时间型
日期时间型数据主要用于存储日期、时间信息,主要包含4种数据类型。分别为DATE、TIME、DATETIME、TIMESTAMP。
最常用的DATE、TIME和DATETIME类型分别用来存储“YYYY-MM-DD”格式的日期数据、“hh:mm:ss”格式的时间数据和“YYYY-MM-DD hh:mm:ss”格式的日期时间数据。
DATETIME中的时间值和TIME值是有区别的,DATETIME中的时间值代表的是几点几分,TIME值代表的是所花费的时间。当向TIME数据列插值时,应用时间的完整写法,如12分30秒应写为00:12:30。
名称 | 描述 |
---|---|
DATE | YYYY-MM-DD格式,在1000-01-01和9999-12-31之间,如1973-12-30 |
DATETIME | YYYY-MM-DD hh:mm:ss格式,在1000-01-01 00:00:00和9999-12-31 23:59:59之间 |
TIME | hh:mm:ss格式,在00:00:00和23:59:59之间 |
TIMESTAMP | 时间戳,在1970-01-01 00:00:00和2037-12-31 23:59:59之间,存储从1970-01-01 00:00:00到指定时间的秒数。 |
在数据库中字符串数据和日期时间型数据,都需要用英文的引号括起来。
四、约束条件
约束条件是在表和字段上强制执行的表的检验规则。使用约束条件可以保证表中数据的完整性和准确性,防止不规范的数据进入数据库。
1、定义约束条件
在MySQL中有以下5种常用的约束条件。
控制条件 | 说明 | 语法 |
---|---|---|
primary key | 主键约束 | 字段名 数据类型 primary key |
not null | 非空约束 | 字段名 数据类型 not null |
unique | 唯一约束 | 字段名 数据类型 unique |
auto_increment | 自动增长约束 | 字段名 数据类型 auto_increment |
default | 默认约束 | 字段名 数据类型 default 默认值 |
primary key是主键约束,用来唯一标识数据中的每行记录。主键约束要求字段中的数据记录是非空的和唯一的。
not null是非空约束,限制了字段中的数据记录不能有空值。
unique是唯一约束,限制了字段中的数据记录不能有重复值,即不能有两个相同的数据记录存在。
auto_increment是自动增长约束,它需要和主键约束,并且只有整数型字段才可以添加自动增长约束。在默认情况下,它是从1开始,在前一条记录的基础上,步长为1自动生成的。
default是默认约束,表示为字段设置默认值,如果某个字段在添加数据时,没有指定该字段的取值,那么数据库管理系统就会按照default设置的默认值进行存储。
除了上述的5种约束条件,SQL还使用外键约束来指定表和表之间的依赖关系,受实际业务的限制。(SQL还会使用检查约束来指定需要检查的限定条件,以确保不符合限定条件的数据无法进入数据表,在8.0.16版本后,在MySQL客户端中并不显示)
2、主键约束
主键,又称为“主码”,是数据表中一列或多列的组合。
--单字段主键约束 create table <表名>( ? ?<字段名1> <字段类型1> primary key, ? ?<字段名2> <字段类型2>, ? …… ? ?<字段名n> <字段类型n> ); ? --多字段主键约束 --如果主键是由两个不同的字段组合而成复合主键,那么主键约束就要写在所有定义好的字段的最后一行primary key( , ),括号里面写复合主键的组成部分,中间用逗号分隔。如果主键是由两个以上字段组合而成的,有多少个字段就在括号里面增加多少个并以逗号分隔即可。 create table <表名>( ? ?<字段名1> <字段类型1>. ? ?<字段名2> <字段类型2>, ? …… ? ?<字段名n> <字段类型n>, ? ?[constraint 主键约束名] primary key(字段名1[,字段名2,……字段名n]) ); ? --删除主键约束 alter ?table <表名> drop primary key;
3、唯一约束
--格式1 create table <表名>( ? ?<字段名1> <字段类型1> unique, ? ?<字段名2> <字段类型2>, ? …… ? ?<字段名n> <字段类型n> ) ? --格式2 create table <表名>( ? ?<字段名1> <字段类型1>. ? ?<字段名2> <字段类型2>, ? …… ? ?<字段名n> <字段类型n>, ? ?[constraint 唯一约束名] unique(字段名1[,字段名2,……字段名n]) ); ? --删除唯一约束(唯一约束名用字段名表示) alter table <表名> drop index <唯一约束名>
4、自动增长约束
自动增长约束要求指定字段的数值取值自动增长,默认从1开始,每增加一条记录,这个字段的取值就会加1,所以它只适用于正数的数值型字段。一个表只能有一个自动增长字段,且必须为主键的一部分,因此自动增长约束也是辨别表中主键的重要标志之一。
--创建自动增长约束 create table <表名>( ? ?<字段名1> <字段类型1> primary key auto_increment, ? ?<字段名2> <字段类型2>, ? …… ? ?<字段名n> <字段类型n> ); --删除自动增长约束 alter table <表名> modify <字段名> <字段类型>;
5、非空约束
非空约束要求字段的值不能为空值。
--创建非空约束 create table <表名>( ? ?<字段名1> <字段类型1> not null, ? ?<字段名2> <字段类型2>, ? …… ? ?<字段名n> <字段类型n> ); --删除非空约束 alter table <表名> modify <字段名> <字段类型> [null];
6、默认约束
默认约束指定某个字段的默认值,当插入记录时,如果没有明确为字段赋值,那么系统就会自动为这个字段赋值为约束设定的值。但对于分析人员来说,默认约束中定义的默认值在实际分析场景中有时可能会导致分析的结果出现偏差。故有时需要将默认值按照缺失值的处理方式,对默认值进行过滤等操作。若默认值为字符串型数据或日期时间型数据,则必须用引号引起来。
--创建默认约束 create table <表名>( ? ?<字段名1> <字段类型1> default value, ? ?<字段名2> <字段类型2>, ? …… ? ?<字段名n> <字段类型n> ); --删除默认约束 alter table <表名> modify <字段名> <字段类型>;