数据库

xss大约 11 分钟数据库数据库sql



# 连接到本机的 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

下面的表中是不同数值类型的取值范围及用来表示什么类型的整数:

类型大小范围(有符号)范围(无符号)用途
TINYINT1 Byte(-128, 127)(0, 255)小整数
SMALLINT2 Bytes(-32 768, 32 767)(0, 65 535)大整数
MEDIUMINT3 Bytes(-8 388 608, 8 388 607)(0, 16 777 215)大整数
INT4 Bytes(-2 147 483 648, 2 147 483 647)(0, 4 294 967 295)大整数
BIGINT8 Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数
FLOAT4 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)单精度浮点数
DOUBLE8 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 类型。 详细的取值范围和用途请查看下表:

类型大小范围格式用途
DATE3 Bytes1000-01-01/9999-12-31YYYY-MM-DD日期
TIME3 Bytes'-838:59:59'/'838:59:59'HH:MM:SS时间
YEAR1 Bytes1901/2155YYYY年份
DATETIME8 Bytes'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'YYYY-MM-DD hh:mm:ss日期时间
TIMESTAMP4 Bytes'1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTCYYYY-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。它们可存储的最大长度不同,可根据实际情况选择。具体参见下表:

类型大小用途
CHAR0-255 Bytes定长字符串
VARCHAR0-65535 Bytes变长字符串
TINYBLOB0-255 Bytes不超过255个字符的二进制字符串
TINYTEXT0-255 Bytes短文本字符串
BLOB0-65535 Bytes二进制长文本
TEXT0-65535 Bytes长文本
MEDIUMBLOB0-16777215 Bytes二进制中等长度文本
MEDIUMTEXT0-16777215 Bytes中等长度文本
LONGBLOB0-4294967295 Bytes二进制大文本
LONGTEXT0-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服务器仍然停留在等待多行语句输入的状态,导致后面所有语句都不会执行,从而出现命令行无反应的情况。

要解决这个问题,你可以按以下操作:

  1. 输入一个分号回车,手动终止这个多行语句的输入:
;
  1. 然后再输入你想运行的语句,比如:
show databases;
  1. 现在命令行应该可以正常执行SQL语句了。

另外要注意在MySQL中使用多行语句时:

  • 必须以\字符开头表示多行模式
  • 输入多行语句内容时不能有分号
  • 结束多行语句输入要以\g或\G结尾

这就避免了这种语句没有结尾导致的命令行挂起情况。

让我知道如果问题还没完全解决!

Loading...