这一章的主角是数据表,但因为上篇文章还有一些数据库的知识没解决,因此先写了数据库。
选择数据库
在数据库创建后,不会将当前创建的数据库作为后续操作的默认数据库,如果需要在数据库中创建数据表并插入数据,需要先选择操作哪个数据库。在MySQL中,可以使用USE语句选择某个数据库为后续操作的默认数据库。USE语句的具体语法格式如下:
USE <数据库名称>;
上次创建了两个数据库,data和data01 ,随便选择一个进入:
mysql> USE data;
Database changed
只要有Database changed这个语句就表明你进入成功了。
如果想要查看当前选择的是哪个数据库,可以使用SELECT DATABASE();实现,具体SQL语句及执行结果如下:
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| data |
+------------+
1 row in set (0.00 sec)
从上述执行结果可以看出,当前选择的数据库名称为data,如若你进入了一个数据库,此时你又想进入其它的数据库,可以直接USE <数据库名称>;使用这个语句,会直接转换到你想要进的数据库具体SQL语句及执行结果如下:
mysql> USE data;
Database changed
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| data |
+------------+
1 row in set (0.00 sec)mysql> USE data01;
Database changed
可以看到已经进入data01数据库了。
修改数据库特征
数据库一旦被创建,其特征也就确定了。如果后续想修改数据库的特征,可以使用ALTER DATABASE语句实现。修改数据库特征的基本语法格式如下。
ALTER DATABASE | SCHEMA] [db_name] alter_option;
在上述格式中,ALTER DATABASE能够更改数据库的整体特征。db_name为可选项,是数据库名称,如果省略数据库名称,则该语句适用于当前所选择的数据库;如果当前没有选择数据库,则会发生错误。alter_option为要修改的特征,可修改的特征如下。
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| [DEFAULT] ENCRYPTION [=] {'Y | 'N'}
| READ ONLY [=] {DEFAULT| 0 | 1}
在上述特征中,CHARACTER SET为数据库字符集;COLLATE为数据库校对集ENCRYPTION为数据库加密选项;READ ONIY为My5QL8022中引入的选项,用控制是古允许修改数据库及其中的对象,允许的值为DEFAULT、0(非只读)和1(只读)
接下来,根据上述语法格式,编写一个修改数据库字符集的SQL语句,将数据库data01的字符集修改为gbk,SQL语句及执行结果如下。
mysql> SHOW CREATE DATABASE data01;
+----------+----------------------------------------------------------------------------------------------------+
| Database | Create Database|
+----------+----------------------------------------------------------------------------------------------------+
| data01 | CREATE DATABASE `data01` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
这个是没修改之前的,也就是默认的字符集, SHOW CREATE DATABASE 数据库;这个命令是显示创建数据库的语句的,一般向这种默认的是不需要要我们手动输入的。
修改过后的:
mysql> ALTER DATABASE data01 DEFAULT CHARACTER SET GBK;
Query OK, 1 row affected (0.01 sec)
mysql> SHOW CREATE DATABASE data01;
+----------+---------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------------------------------------------+
| data01 | CREATE DATABASE `data01` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+---------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
删除数据库
当数据库不再使用时应该将其删除,以确保数据库存储空间中存放的是有效数据。删除数据库是将已经创建的数据库从磁盘空间中清除,数据库清除后,数据库中的所有数据也将一同被删除。在MySQL中,删除数据库的基本语法格式如下。
DROP [DATABASE | SCHEMA] [IF EXISTS] db_name;
在上述语法格式中,DROP DATABASE或DROP SCHEMA表示删除数据库中的所有数据表并删除数据库,IF EXISTS可选项用于防止删除不存在的数据库时发生错误,db_name为要删除的数据库的名称。
接下来,根据上述语法格式,编写一个删除数据库的SQL语句,删除名称为data01的数据库,具体SQL语句及执行结果如下。
mysql> DROP DATABASE IF EXISTS data01;
Query OK, 0 rows affected (0.01 sec)
从上述代码中可以看到,提示删除语句执行成功。
为验证数据库是否真正删除成功,可以使用SHOW DATABASES语句查看数据库系统中当前存在的数据库,具体执行语句及结果如下
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| chapter04 |
| chapter05 |
| data |
| information_schema |
| itcast |
| mysql |
| performance_schema |
| sys |
+--------------------+
8 rows in set (0.00 sec)
从上述命令执行结果可以看出,数据库系统中不存在名称为data01的数据库,说明data01数据库已经被成功删除。
需要注意的是,执行DROP DATABASE命令后,MySQL不会给出任何提示确认信息而是直接删除数据库。数据库被删除后,数据库中的数据也一同被删除,因此要尽量避免删除数据库的操作,如确实有删除数据库的需求,也建议在删除数据库之前先将数据库进行备份。
从此刻开始我们就要进行数据表的内容了
数据类型
使用MySQL数据库存储数据时,不同类型数据的存储格式各不相同。MySQL数据库提供了多种数据类型,主要包括数值类型、日期和时间类型、字符串类型。本节将针对这些数据类型进行讲解。
提醒大家一下,数据类型里面的内容过一遍有个印象就可以了,不需要全部记住,里面的大多内容是不常用的,了解即可,用到了再回头看一下就行了。
数值类型
在数据库中,经常需要存储一些数值,例如员工的工资、工号、年龄等,它们适合用数值类型保存。数值类型包括整数类型、浮点数类型、定点数类型、BIT类型等,下面分别进行讲解。
1.整数类型
在MySQL数据库中,经常需要存储整数数值。根据整数的取值范围和存储方式的不同,MySQL将整数类型分为五种,分别是TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,具体如表所示
从表中可以看出,不同整数类型所占用的字节数和取值范围都是不同的 其中,占用字节数最小的是TINYINT,占用字节数最大的是B1GINT。不同整数类型的取值范围可以根据字节数计算出来,例如TINYINT类型的整数占用1字节,1字节是8位,那么TINYINT类型无符号数的最大值就是2的8次方减一(即255),TINYINT类型有符号数的最大值就是2的7次方-1(即127)。同理可以算出其他不同整数类型的取值范围。
需要注意的是,如果使用无符号数据类型,需要在数据类型的右边加上UNSIGNED关键字来修饰,例如INT UNSIGNED表示无符号INT类型。
在实际应用时,需要根据实际情况选择对应的数据类型,如果给字段所赋的值超出数据类型取值范围,会发生错误并提示Out of range。
2.浮点数类型
在MySQL数据库中,小数的表示分为浮点数和定点数两种类型。其中浮点数类型分为两种,分别是单精度浮点数类型(FLOAT)和双精度浮点数类型(DOUBLE)。MySQL中浮点数类型对应的字节及取值范围如表所示。
浮点值是近似值,不是作为精确值存储,表中列举的取值范围都是理论上的极限值。双精度浮点数的取值范围远大于单精度浮点数的取值范围,但同时也会耗费更多的存储空间,相对会降低数据的计算性能。
3.定点数类型
定点数类型表示精度确定的小数类型,适合用于对精度要求比较高的数据。定点数类型分为DECIMAL 和NUMERIC(需要说明的是,在MySQL中NUMERIC和DECIMAL同义)。定义定点数类型的方式如下。
DECIMAL(M,D)
在上述定义中,M表示数据的精度,即数据存储的有效位数(整数位数加小数位数),最大值为65,默认值为10;D表示数据的小数位数,即可以存储的小数点后的位数,最大值为30,默认值为0。例如,DECIMAL(5,2)表示存储的小数的范围是-999.99-999.99,系统会根据存储的具体数据来分配存储空间。
浮点数和定点数也可以使用数据类型后加(M,D)的方式来表示(属于非标准语法,从MySQL 8.0.17开始不推荐使用非标准语法定义浮点数)。需要注意的是,对浮点数类型和定点数类型的字段插入数据时,如果插入数据的精度高于实际定义的精度,小数位数超出范围,那么系统会自动对数据进行四舍五入处理,使值的精度达到要求。不同的是,定点数类型在四舍五入时会出现Data truncated(数据截断)警告,而浮点数不会出现警告;如果因为整数部分超出范围(数据的整数位数大于M-D的值),那么数据会插入失败,提示Out of range(超出取值范围)错误。
4.BIT类型
BIT(位)类型的字段通常用于存储bit值。定义BIT类型的基本语法格式如下。
BIT(M)
在上述格式中,M用于表示每个值的位数,范围为1~64。需要注意的是,如果分配的BIT(M)类型的数据长度小于M,则将在数据的左边用0补齐。例如,为BIT(6分配值b'101'的效果与分配b'000101'相同。
日期和时间类型
为方便在数据库中存储日期和时间,MySQL提供了表示日期和时间的数据类型分别是YEAR、DATE、TIME、DATETIME和TIMESTAMP。MySQL中的日期和时间数据类型如表所示。
从表中可以看出,每种日期和时间类型的取值范围是不同的,如果插入的数值超出这个范围,系统会进行错误提示,并且自动将对应类型的零值插入数据库。为了更好的学习日期和时间类型,下面会对表中的类型进行详细讲解。
1.YEAR类型
YEAR类型用于存储年份数据。当只需要记录年份时,使用YEAR更为方便和节省空间。在MySQL中,可以使用以下3种表示方式指定YEAR类型的值,具体如下
(1)使用4位字符串或数字表示,范围为'1901'-'2155'或1901-2155。例如,输'2021'或2021,则插入数据库的值均为2021。
(2)使用1位或2位字符串表示,范围为'0'-'99',其中‘0'-'69'范围的值会被转换为2000-2069范围的YEAR值,'70'-'99'范围的值会被转换为1970-1999范围的YEAR值例如,输入'21',则插入数据库的值为2021。
(3)使用1位或2位数字表示,范围为0-99,其中1-69范围的值会被转换为2001-2069范围的YEAR值,70-99范围的值会被转换为1970-1999范围的YEAR值。例如,输入21,则插入数据库的值为2021。
需要注意的是,当使用YEAR类型时,一定要区分'0'和0。因为字符串格式的'0'表示的YEAR值是2000,而数字格式的0表示的YEAR值是0000。
2. DATE类型
DATE类型用于存储日期数据。如果数据要用来记录年月日,通常使用DATE类型。在MySQL中,可以使用以下4种表示方式指定DATE类型的值,具体如下。
(1)以'YYYY-MM-DD'或'YYYYMMDD' 字符串方式表示。例如,输入'2021-01-21'或'20210121',则插入数据库的日期都为2021-01-21。
(2)以YY-MM-DD'或YYMMDD字符串方式表示。YY表示的是年,它转换为对应年份的规则与YEAR类型类似。例如,输入'21-01-21'或“210121',则插入数据库的日期都为2021-01-21。
(3)以YYMMDD数字方式表示。例如,输入210121,则插入数据库的日期为2021-01-21。
(4)使用CURRENT_DATE或NOWO表示当前系统日期。
3.TIME类型
1.TIME类型用于储存时间数据。如果数据要用来记录时分秒,通常使用TIME类型。TIME类型的显示格式一般为hh:mm:ss,其中hh表示小时,mm表示分,ss表示秒。在MySQL中,可以使用以下3种表示方式指定TIME类型的值,具体如下。
(1)以'D hh:mm:ss'字符串方式表示。其中,D表示日,可以取0~34的值,插入数据,.小的值等于D×24+hh。例如,输入'2 11:30:50',则插人数据库的时间为59:30:50。
(2)以'hhmmss'字符串方式或hhmmss数字方式表示。例如,输入'345454'或345454,则插入数据库的时间为34:54:54。
(3)使用CURRENT_TIME或NOW()输入当前系统时间。
4. DATETIME类型
DATETIME类型用于存储日期和时间的数据。如果数据要用来记录年月日时分秒,可以使用DATETIME类型。DATETIME类型的显示格式为'YYYY-MM-DD hh:mm:ss'其中,YYYY表示年,MM表示月,DD表示日,hh表示小时,mm表示分,ss表示秒。在MySQL中,可以使用以下4种表示方式指定DATETIME类型的值。
(1)以'YYYY-MM-DD hh:mm:ss'或' YYYYMMDDhhmmss'字符串方式表示的日期和时间,取值范围为'1000-01-01 00:00:00'~'9999-12-31 23:59:59'。例如,输入 '2021-01-22 09:01:23'或'20210122090123',则插入数据库的DATETIME值都为2021-01-22 09:01:23。
(2)以'YY-MM-DD hh:mm:ss'或'YYMMDDhhmmss' 字符串方式表示的日期和时间,其中YY表示年,取值范围为'00'-'99'。与DATE类型中的YY相同,'00'~'69范围的值会被转换为2000-2069范围的YEAR值,'70'~'99'范围的值会被转换为1970-1999范围的YEAR值。
(3)以YYYYMMDDhhmmss或YYMMDDhhmmss数字方式表示的日期和时间。例如,输入20210122090123或210122090123,则插入数据库的DATETIME值都为2021-01-22 09:01:23。
(4)使用CURRENT_TIMESTAMP或NOW()输入当前系统时间。
5. TIMESTAMP类型
TIMESTAMP类型用于表示日期和时间,它的显示形式与DATETIME类似,但是在使用时,两者却有一些区别,具体如下。
(1)TIMESTAMP类型的取值范围比DATATIME类型小。
(2)TIMESTAMP类型的值和时区相关,如果插入的日期时间为TIMESTAMP类型,系统会根据当前系统所设置的时区,对日期时间进行转换后存放;从数据库中取出TIMESTAMP类型的数据时,系统也会将数据转换为对应时区时间后显示。由于TIMESTAMP类型的这个特性,因此可能会导致两个不同时区取出来的同一个日期显示不一样。
字符串类型
MySQL中的字符串类型分为CHAR、VARCHAR、TEXT等多种类型,不同的数据类型具有不同的特点,具体如表所示。
接下来,针对这些字符串类型进行详细讲解。
1.CHAR和VARCHAR
CHAR类型和VARCHAR类型的字段通常用于存储字符串数据,不同的是CHAR类型的字段用于存储固定长度的字符串,其中固定长度可以是0~255中的任意整数值;VARCHAR类型的字段用于存储可变长度的字符串,其中可变长度可以是0~65535中的任意整数值。在MySQL中,定义CHAR和VARCHAR类型的方式如下。
CHAR(M)或VARCHAR(M),括号里面的M是字节长度,也就是你定义字段(这个后面会有)需要的一个字符串类型的整数值,也可以代表字符串的最大长度。
为帮助大家更好的理解CHAR和VARCHAR的区别,接下来,以CHAR(4)和VARCHAR(4)做对比进行说明,具体如表所示。
从表中可以看出,当数据为CHAR(4)类型时,不管插入值的长度是多少,所占用的存储空间都是4字节;而VARCHAR(4)对应的数据所占用的字节数为实际长度加1。
需要注意的是,如果插入的字符串尾部存在空格,CHAR类型会去除空格后进行存储,而VARCHAR类型会保留空格完整地存储字符串。
2.BINARY和VARBINARY类型
BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,不同的是BINARY和VARBINARY类型用于存储二进制数据。定义BINARY和VARBINARY类型的方式如下。
BINARY(M)
或
VARBINARY(M)
在上述格式中,M指的是可保存的二进制数据的最大长度。需要注意的是,BINARY类型的长度是固定的,如果数据的长度小于M,将在数据的后面用\0补齐,最终达到指定长度。例如,指定数据类型为BINARY(3),当插入d时,实际存储的数据为d\0\0;当插入db时,实际存储的数据为db\0。
3. TEXT类型
TEXT类型用于表示大文本数据,该类型的字段通常用于存储文章内容、评论等,它的类型分为4种,具体如表所示。
4.BLOB类型
BLOB类型的字段通常用于存储二进制的数据,如图片、PDF文档等。BLOB类型分为4种,具体如表所示。
需要注意的是,BLOB类型的数据是根据二进制编码进行比较和排序,而TEXT类型数据是根据文本模式进行比较和排序。
5. ENUM类型
ENUM类型又称为枚举类型,定义ENUM类型的语法格式如下。
ENUM('value1','value2',...)
在上述格式中('valuel','value2',...)称为枚举列表,往ENUM类型的字段中插入值时,需要插入枚举列表中存在的值。枚举列表中的每个枚举值都有一个索引值,索引值从1开始,一次递增。
6.SET类型
SET类型的字段通常用于存储字符串对象,该类字段的值可以有零个或多个。SET类型数据的定义格式与ENUM类型类似,具体如下。
SET('value1','value2',...)
与ENUM类型相同,('valuel',value2'..)列表中的每个值都有一个索引值,MySQL中存入的也是这个索引值,而不是列表中的值。
数据表的基本操作
在MySQL中,所有数据都存储在数据表中,因此在学习数据表中的数据操作之前有必要先了解数据表的基本操作。
创建数据表
创建数据表指的是在已经创建的数据库中建立新表。在MySQL中使用CREATETABLE语句创建数据表,其基本语法格式如下。
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(字段名1 数据类型1 [列级约束1]
[,字段名2数据类型2【列级约束2]][,·..]
[,表级约束(字段名3[,字段名4][,.])][,···])
[table_options][partition_options];
上述语法格式的说明具体如下。
- TEMPORARY:可选项,表示临时表。临时表仅在当前会话中可见,并且在会话关闭时自动删除。
- IF NOT EXISTS:可选项,只有在创建的数据表尚不存在时,才会创建数据表,可以避免因为存在同名数据表导致创建失败。
- tbl_name:创建的数据表的名称。
- 字段名:数据表字段的名称。
- 数据类型:字段中保存的数据的类型,如日期类型等。(知道我为什么让你们了解数据类型了吧,这个很重要的)
- 约束:用于保证数据的完整性和有效性的规则,具体内容会在后面进行讲解。
- table_options可选项,表示表选项,用于设置数据表的相关选项,如字符集校对集等。
- partition opions:可选项,表示分区选项,用于设置数据表分区的内容。
看到有这么多条件是不是一阵头大,没关系,下面我会用简单的SQL语法带你了解数据表的创建,一看就会的那种。具体SQL语法及执行结果如下:
这里我们先选择一个库进入,我选择的是之前创建的data数据库
use data;
Database changed
进入数据库之后开始创建数据表:
mysql> create table year(-> name VARCHAR(100),-> birthday YEAR);
Query OK, 0 rows affected (0.04 sec)
下面这个是查看数据表的结构的语句,后面也会提到,在这里先了解一下
mysql> desc year;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| name | varchar(100) | YES | | NULL | |
| birthday | year | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
下面这个是插入语句,后面也会提到
mysql> insert into year values-> ('李白',24);
Query OK, 1 row affected (0.01 sec)
这个是查看数据表中的具体内容的SQL语句
mysql> select * from year;
+--------+----------+
| name | birthday |
+--------+----------+
| 李白 | 2024 |
+--------+----------+
1 row in set (0.00 sec)
至此我们已经创建好了一个简单的数据表,上面提到的插入和查询语句后面会一一进行详细讲解。
这个就是创建数据表成功了,create table是创建数据表的语句,创建数据库就是database了,year是数据表的名称,name和birthday 是字段,也可以理解为属性名称,后面的 VARCHAR(100)和 YEAR是数据类型,也就是前面说到的,如果字段是age(年龄)或者学号就可以使用整数类型,成绩也可以使用整数或者浮点类型,这里的年龄,学号,成绩都是字段,字段后面是数据类型,下面再写一个SQL语句来加深理解;
mysql> create table data01(-> age int,-> id int-> );
Query OK, 0 rows affected (0.02 sec)
这里的两个字段的数据类型我都设置为整型了,int默认是11位,表后面有个括号,结尾也要有个括号,然后以英文分号结尾。
上面这两个SQL语法都是最简单的了
查看数据表
数据表创建成功,可以通过SQL语句对数据表进行查看,以确认数据表是否创建成功和数据表的定义是否正确。在MySQL中,查看数据表的SQL语句有3中,具体如下。
1使用SHOW TABLES语句查看数据表
选择数据库后,可以通过SHOW TABLES语句查看当前数据库中的数据表,基本语法格式如下
SHOW TABLES [LIKE 'pattern'I WHERE expr];
在上述语法格式中,LIKE子句和 WFERE子句为可选项,如果SHOW TABLES句中不添加可选项,表示管看当前数据库中的所有数据表;如果添加则按照LIKE子句或WHERE子句的匹配结果查看数据表。
接下来,使用SHOW TABLES语句查看当前数据库中所有的数据表,以验证数据表year和data01是否创建成功,具体SQL语句及执行结果如下。
mysql> SHOW TABLES;
+----------------+
| Tables_in_data |
+----------------+
| data01 |
| year |
+----------------+
2 rows in set (0.00 sec)
查询到了这两个数据表,说明我们创建成功了
2.使用SHOWCREATE TABLE查看数据表创建语句
在MySQL中,可以通过SHOW CREATE TABLE语句显示创建数据表的语句。SHOWCREATE TABLE语句的基本语法格式如下。
SHOW CREATE TABLE tbl_name;
在上述格式中,tbl_name指的是要查看的数据表的名称。
接下来,使用SHOW CREATE TABLE语句查看数据表tb dept的创建语句,具体SQL语句及执行结果如下所示。
mysql> SHOW CREATE TABLE year;
+-------+-------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table|
+-------+-------------------------------------------------------------------------------------------------------------------------------+
| year | CREATE TABLE `year` (`name` varchar(100) DEFAULT NULL,`birthday` year DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
从上述执行结果可以看出,year数据表的创建语句显示出来了。
3.使用DESCRIBE语句查看数据表结构信息
在MySQL中,使用DESCRIBE语句可以查看字段名、字段类型等数据表结构信息。DESCRIBE语句的基本语法格式如下。
DESCRIBE数据表名;
上述语法格式可以简写为如下形式。
DESC 数据表名;
上述两种语法格式效果都一样,为简化书写,后续查看数据表结构信息时,都使用“DESC数据表名;”这种方式。
接下来,使用DESC语句查看数据表data01的表结构信息,具体SQL语句及执行结果如下。
mysql> DESC data01;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| age | int | YES | | NULL | |
| id | int | YES | | NULL | |
+-------+------+------+-----+---------+-------+
2 rows in set (0.00 sec)
- 上述命令的执行结果显示了数据表data01的表结构信息,其中第一行字段的含义如下。
- Field:表示数据表中字段的名称,即列的名称。
- Type:表示数据表中字段对应的数据类型。
- Null:表示该字段是否可以存储NULL值。
- Key:表示该字段是否已经建立索引。
- Default:表示该字段是否有默认值,如果有,将显示对应的默认值。
- Extra:表示与字段相关的附加信息。
码字不易,请大家多多支持,感谢