数据库
# 连接到本机的 MySQL,默认 3306 端口,回车后按提示输入密码,进入 MySQL 控制台
C:\> mysql -uroot -p
# 显示有哪些数据库
mysql> show databases;
# 创建一个叫 test 的数据库
mysql> create database test;
# 进入到 test 数据库中
mysql> use test;
# 显示有哪些表
mysql> show tables;
# 创建一个 user 表
mysql> create table user (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
created_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 查看 user 表的字段信息
mysql> desc user;
# 查看 user 表的建表语句
mysql> show create table user;
# 删除 user 表
mysql> drop table user;
# 删除 test 数据库
mysql> drop database test;
# 退出 MySQL
mysql> exit;
C:\>
MySQL` 中的数据类型,大致可分为三大类:`数值类型`、`日期时间类型` 、`字符类型
首先我们来看看 MySQL
中的数值类型
表示整数的数据类型有 TINYINT
、SMALLINT
、MEDIUMINT
、INT
、BIGINT
表示浮点的数据类型有 FLOAT
和 DOUBLE
。而 DECIMAL
数据类型用于在数据库中存储精确的小数值。FLOAT
、DOUBLE
都存在精度问题,而 DECIMAL
则不存在精度问题,所以表示小数值我们都会使用 DECIMAL
下面的表中是不同数值类型的取值范围及用来表示什么类型的整数:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 Byte | (-128, 127) | (0, 255) | 小整数 |
SMALLINT | 2 Bytes | (-32 768, 32 767) | (0, 65 535) | 大整数 |
MEDIUMINT | 3 Bytes | (-8 388 608, 8 388 607) | (0, 16 777 215) | 大整数 |
INT | 4 Bytes | (-2 147 483 648, 2 147 483 647) | (0, 4 294 967 295) | 大整数 |
BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数 |
FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度浮点数 |
DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度浮点数 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
接下来,我们来看看日期时间类型
日期时间类型,我们用得最多的是 DATETIME
类型,他所表示的 "年-月-日 时:分:秒" 格式,既表示日期,又表示时间。如果,你只需要存储日期部分,你可以选择 DATE
类型, 只表示时间,你可以选择 TIME
类型。 详细的取值范围和用途请查看下表:
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 Bytes | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期 |
TIME | 3 Bytes | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间 |
YEAR | 1 Bytes | 1901/2155 | YYYY | 年份 |
DATETIME | 8 Bytes | '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' | YYYY-MM-DD hh:mm:ss | 日期时间 |
TIMESTAMP | 4 Bytes | '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC | YYYY-MM-DD hh:mm:ss | 日期时间,时间戳 |
接下来,我们来看看 MySQL
中的字符串
字符类型有 char
、varchar
、text
和 blob
四种
char
和 varchar
从字面意思来理解,就是存储字符的数据类型,在使用的时候需要在类型的后面指定字符个数,char(n)
和 varchar(n)
括号中 n
代表字符的个数,不是代表字节个数,比如 char(10)
就可以存储 10 个字符
BLOB
用来存储二进制数据。 BLOB
类型有 4 种,分别是:TINYBLOB
、BLOB
、MEDIUMBLOB
和 LONGBLOB
。它们区别在于可容纳存储的数据范围不同
TEXT
类型,用来存储长文本,比如说要存储一篇文章就选择 TEXT
类型, TEXT
类型有 4 种, 分别是:TINYTEXT
、TEXT
、MEDIUMTEXT
和 LONGTEXT
。它们可存储的最大长度不同,可根据实际情况选择。具体参见下表:
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 Bytes | 定长字符串 |
VARCHAR | 0-65535 Bytes | 变长字符串 |
TINYBLOB | 0-255 Bytes | 不超过255个字符的二进制字符串 |
TINYTEXT | 0-255 Bytes | 短文本字符串 |
BLOB | 0-65535 Bytes | 二进制长文本 |
TEXT | 0-65535 Bytes | 长文本 |
MEDIUMBLOB | 0-16777215 Bytes | 二进制中等长度文本 |
MEDIUMTEXT | 0-16777215 Bytes | 中等长度文本 |
LONGBLOB | 0-4294967295 Bytes | 二进制大文本 |
LONGTEXT | 0-4294967295 Bytes | 大文本 |
在 SQL
入门中,我们已经学习过如何创建数据表,在这里,我们学习了 MySQL
中更多的数据类型,同学们要认真巩固这些知识点,在创建数据表的时候才能够准确熟练的选择相应的数据类型来设计数据表。
这一节,我们来练习在终端下操作 MySQL
的表结构,比如 添加字段
、删除字段
、修改字段属性
等操作
在进行表结构的操作前,我们先要了解几个关键字的使用。第一个关键字是 UNSIGNED
UNSIGNED
无符号的意思,通俗理解就是不表示负数只表示正数。比如说 TINYINT
类型,取值范围是 -128 ~ 127,如果设置为 UNSIGNED
取值范围则是 0 ~ 255;也就是说,一个数值字段被设置为无符号,则正数的表示范围就增大一倍
来看下面的示例:
-- 如果有 user 表 则删除 user 表
DROP TABLE IF EXISTS `user`;
-- 创建 user 表
CREATE TABLE `user` (
`username` varchar(15),
`age` TINYINT
)ENGINE=InnoDB CHARSET=UTF8;
-- 我们添加两条数据:
INSERT INTO `user` (`username`,`age`) VALUES('jack', -300);
INSERT INTO `user` (`username`,`age`) VALUES('lily', 300);
-- 执行一下查询语句:
SELECT * FROM `user`;
观察一下这两条数据中 age
的值,你会发现,插入的 -300 实际存储的值是 -128 ,插入的 300 实际存储的值是 127 。也就是说,当插入的数值超过边界值的大小,默认就是边界值。这里的 age
字段是 TINYINT
类型,其表示的数据范围是 -128 ~ 127
我们来给 age
字段加上 UNSIGNED
属性:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`username` varchar(15),
`age` TINYINT UNSIGNED -- 加上 UNSINGED 属性
)ENGINE=InnoDB CHARSET=UTF8;
INSERT INTO `user` (`username`,`age`) VALUES('jack', -300);
INSERT INTO `user` (`username`,`age`) VALUES('lily', 300);
SELECT * FROM `user`;
是不是插入的-300 实际存储的值是 0,插入的 300 实际存储的值是 255
总结一下:UNSIGNED
表示无符号,即不表示负数,加上 UNSIGNED
属性的字段,正值的取值范围将会增大一倍。UNSIGNED
用来修饰数值类型的字段
下面,我们来学习 AUTO_INCREMENT
和 PRIMARY KEY
两个属性
PRIMARY KEY
是将一个字段设置为主键。一个数据表只能有一个主键。字段设置为 PRIMARY KEY
后,其值不能重复
AUTO_INCREMENT
自动增加的意思,一般用于主键或唯一索引,也就是用于值不重复的字段上。当每新增一条记录,该字段的值会自加1。一般用在整数类型上
AUTO_INCREMENT` 必须配合 `PRIMARY KEY` 一起使用。设置 `PRIMARY KEY` 的字段,不一定需要 `AUTO_INCREMNT
我们来看看下面的示例:
-- 创建user表:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 设置无符号、自增、主键
`username` VARCHAR(30),
`age` TINYINT UNSIGNED -- 设为无符号
)ENGINE=InnoDB CHARSET=UTF8;
INSERT INTO `user` (`username`,`age`) VALUES('jack', 18);
INSERT INTO `user` (`username`,`age`) VALUES('lily', 19);
SELECT * FROM `user`;
观察表中的数据, 写入数据时,我们没有为 id
字段赋值,由于 id
字段设置的 AUTO_INCREMENT
属性,MySQL
会自动为该字段赋值,且是从当前表的最大 id
值自动加 1
下面我们来学习 非空约束
、 默认值
、 注释
, 对应的属性是 NOT NULL
、 DEFAULT
、COMMENT
NOT NULL` 是用于创建表时为字段设置非空约束,即字段的值不能为 `NULL
DEFAULT
用来设置默认值。当添加数据值,如果没有给设置默认值的字段赋值,则该条记录中该字段就使用默认值
COMMENT
用来添加注释。注释就是说明一下字段存储的是什么数据或字段的中文意思,说明一下字段的不同的值代表着什么意思
一起来看看下面的示例:
-- 创建一个user表:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT "编号", -- 使用 DOMMENT 添加了注释
`username` VARCHAR(30) NOT NULL DEFAULT "" COMMENT "用户名", -- 设置了非空约束,并设置默认值为空字符串
`age` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT "年龄", -- 设置了非空约束,并设置默认值为0
`gender` TINYINT NOT NULL DEFAULT 1 COMMENT "性别 0-未知 1-男 2-女" -- 设置了非空约束,并设置默认值为1
)ENGINE=InnoDB CHARSET=UTF8;
DESC `user`;
INSERT INTO `user` (`username`) VALUES("jack");
INSERT INTO `user` (`username`) VALUES("johnny");
SELECT * FROM `user`;
插入数据时,我们只给字段 username
赋值了,其它字段都没有赋值。 id
是自增字段,所以 MySQL
会自动给 id
进行自增赋值。age、gender
都设置了默认值,所以,插入数据时,没有给有默认值的字段赋值,字段的值就是默认值
接下来,我们开始操作数据表的表结构
我们使用 ALTER TABLE
关键字,配合 ADD
、MODIFY
、CHANGE
、 DROP COLUMN
来实现对数据表进行字段的 添加
、修改
和 删除
ALTER TABLE
语句用来操作数据表的表结构
ADD
给数据表添加新字段
MODIFY
用于修改字段属性
CHANGE
用于修改字段名,同时也可以修改字段属性
DROP COLUMN
删除数据表中的字段
一起来看看添加字段的示例:
-- 创建user表:
DROP TALBE IF EXISTS `user`;
CREATE TABLE `user_test` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT "编号",
`username` VARCHAR(30) NOT NULL DEFAULT "" COMMENT "用户名"
)ENGINE=InnoDB CHARSET=UTF8;
DESC `user`;
很明显,这个用户表缺少很多字段,现在让我们使用 ADD 关键字来添加 age
和 gender
字段:
ALTER TABLE `user` ADD `age` TINYINT;
ALTER TABLE `user` ADD `gender` TINYINT;
DESC `user`;
通过 DESC
语句,我们可以看到两个新字段 age、gender
就添加成功了
如果用户的年龄超过 127 岁(要考虑会出现的极端情况),之前使用的 TINYINT
就不能表示大于 127 的值
下面,使用 MODIFY
来修改一下 age
字段的属性,我们给 age
字段添加上 UNSIGNED、DEFAULT、COMMENT
属性:
ALTER TABLE `user` MODIFY `age` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄';
解决数值大于 127 其实只需要加上 UNSIGNED
即可,现在最大数值可以表示到 255 了,DEFAULT
COMMENT
属性是额外加上去的,增加你对这些属性的记忆
接下来,我们来用一用 CHANGE
关键字。需求是将 gender
字段名修改为 sex
,并添加上非空约束、默认值和注释:
ALTER TABLE `user` CHANGE `gender` `sex` TINYINT NOT NULL DEFAULT 1 COMMENT '性别';
我们用 DESC
查看表结构,会发现字段名已经改为 sex
了
如果我们想删除一个字段,我们会用 DROP COLUMN
来完成,比如我们将 sex
字段删除:
ALTER TABLE `user` DROP COLUMN `sex`;
再次使用 DESC
语句,观察一下表结构的变化,我们会发现 sex
字段已经被删除了
在实际的开发工作中,如果要执行删除操作,建议一定要先进行备份,因为一但执行删除,数据就消失在人间了。一定要给自己的删除操作留退路。防止数据丢失的惨剧发生在你的身上
mysqldump 用于备份数据库到一个SQL文件中,下面示范将 test
数据库,备份到 test.sql
文件中,假设你数据库用户名为 root
,密码为12345
$ mysqldump -uroot -p12345 test > test.sql
如果需要将备份的数据恢复到MySQL中,使用下面的语句:
# 先删除test数据库,从新创建一个空的 test库,再执行下面的语句
$ mysql -uroot -p12345 test < test.sql
根据你提供的命令行截图和信息,这个情况下MySQL命令行无反应的最可能原因是,前面有一个未完成的多行语句。
具体来说,在你输入 \c
回车后,MySQL服务器认为这是一个多行语句的开始,等待更多的输入。但是你后续输入的root
、exit
等都是单独的语句,而不是完成 \c
开头的逻辑。
所以MySQL服务器仍然停留在等待多行语句输入的状态,导致后面所有语句都不会执行,从而出现命令行无反应的情况。
要解决这个问题,你可以按以下操作:
- 输入一个分号回车,手动终止这个多行语句的输入:
;
- 然后再输入你想运行的语句,比如:
show databases;
- 现在命令行应该可以正常执行SQL语句了。
另外要注意在MySQL中使用多行语句时:
- 必须以
\
字符开头表示多行模式 - 输入多行语句内容时不能有分号
- 结束多行语句输入要以
\g
或\G
结尾
这就避免了这种语句没有结尾导致的命令行挂起情况。
让我知道如果问题还没完全解决!