04-库表创删改

image-20200812132737977

1. 数据【库】操作

1.1 数据值类型

sql支持多种类型,大致可以分为三类:数值日期/时间字符串(字符)类型。

对于我们约束数据的类型有很大的帮助。

1.1.1 数值类型
类型 大小 范围(有符号) 范围(无符号) 用途
INT/INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
DOUBLE 8 字节 (-1.797E+308,-2.22E-308) (0,2.22E-308,1.797E+308) 双精度浮点值
DOUBLE(M,D) 8个字节
M为长度,D小数位数(全舍不入)
受M和D的约束 DUBLE(5,2) -999.99-999.99 受M和D的约束 双精度浮点值
DECIMAL(M,D) 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2(四舍五入) 依赖于M和D的值,M最大值为65 依赖于M和D的值,M最大值为65 小数值
1.1.2 日期类型
类型 大小 范围 格式 用途
DATE 3 1000-01-01 ~ 9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’ ~ ‘838:59:59’ HH:MM:SS 时间值
YEAR 1 1901 ~ 2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038
结束:第 2147483647
北京时间 2038-1-19 11:14:07 格林尼治时间: 2038年1月19日 凌晨 03:14:07
YYYYMMDD HHMMSS 时间戳
1.1.3 字符串类型
类型 大小 用途
CHAR 0-255 字符 定长字符串 char(10) 10个字符
VARCHAR 0-65535 字节 变长字符串 varchar(10) 10个字符【最常用
BLOB(binary large object) 0-65535字节 二进制形式的长文本数据
TEXT 0-65535字节 长文本数据
  • CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
  • BINARY 和 VARBINARY 类类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
  • BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
  • 有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。

1.2 创建库(CREATE)

语法:CREATE DATABASE 库名;

1.2.1 创建数据库
1
2
3
4
# 创建一个数据库mydb1
CREATE DATABASE mydb1;
# 创建指定字符编码集的数据库
CREATE DATABASE mydb1 CHARACTER SET UTF8;

1.3 修改库(ALTER)

语法:ALTER DATABASE 库名 操作;

1.3.1 修改数据库的字符集
1
2
# 修改mydb1 的字符集为 GBK
ALTER DATABASE mydb1 CHARACTER SET GBK;

1.4 删除库(DROP)

语法:DROP DATABASE 库名

1.4.1 删除数据库
1
2
# 删除 mydb1 数据库
DROP DATABASE mydb1;

2. 数据【表】操作

2.1 创建表(CREATE)

语法:

CREATE TABLE 表名(

列名1 数据类型 [约束],

列名2 数据类型 [约束],

​ ….

列名n 数据类型 [约束] //最后一列末尾不加逗号

)[charset=utf8] //可根据需要指定表的字符编码集

2.1.1 创建表
列名 数据类型 说明
subjectId INT 课程编号
subjectName VARCHAR(20) 课程名称
subjectHours INT 课程时长
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 创建科目表 subject
# 科目编号、科目名称、科目学时
# ``符号在sql中声明其中的字符串为表名,而不与sql中的关键字冲突
CREATE TABLE `subject`(
subjectId INT,
subjectName VARCHAR(20),
subjectHours INT
)CHARSET = utf8; # 执行完需刷新数据库,才能显示表
SELECT * FROM `subject`;
INSERT INTO `subject`(subjectId, subjectName, subjectHours) VALUES(1, 'Java', 10);
INSERT INTO `subject`(subjectId, subjectName, subjectHours) VALUES(2, 'Html5', 20);
INSERT INTO `subject`(subjectId, subjectName, subjectHours) VALUES(3, 'sql', 5);

# 考试表 exam
# 编号、科目、时间、分数
CREATE TABLE exam(
id INT,
subjectId INT,
examDate DATE,
examScore DOUBLE(4,1) # 总长度 4 位,小数点 1
)CHARSET = utf8;
SELECT * FROM exam;
INSERT INTO exam(id, subjectId, examDate, examScore) VALUES(1, 1, '2020-3-17', 72.5);
INSERT INTO exam(id, subjectId, examDate, examScore) VALUES(2, 1, '2020-3-17 13:35:26', 59); # 警告:只留日期
INSERT INTO exam(id, subjectId, examDate, examScore) VALUES(3, 1, CURDATE(), 80);
INSERT INTO exam(id, subjectId, examDate, examScore) VALUES(4, 1, CURDATE(), 100.15);
INSERT INTO exam(id, subjectId, examDate, examScore) VALUES(5, 1, CURDATE(), 90.15);

# 向已存在的表中添加新的一列 totalScore
ALTER TABLE exam ADD COLUMN totalScore DECIMAL(4,1) NOT NULL;

# 删除添加的 totalScore 列
ALTER TABLE exam DROP COLUMN totalScore;

# 向表中重新插入1条数据,包含编号、科目编号、考试日期、考试分数、总分数
INSERT INTO exam(id, subjectId, examDate, examScore, totalScore) VALUES(6, 1, CURDATE(), 100.13, 100.13);
INSERT INTO exam(id, subjectId, examDate, examScore, totalScore) VALUES(7, 1, CURDATE(), 100.14, 100.15);
  • 问题:在往已创建表中新增数据时,可不可以新增两行相同列值得数据? 答案:可行。
  • 如果可行,会有什么弊端?表中的数据不唯一!

2.2 修改表(ALTER)

语法:ALTER TABLE 表名 操作;

2.2.1 向现有表中添加列
1
2
# 在学生表基础上添加 image 列
ALTER TABLE student ADD image blob;
2.2.2 修改表中的列
1
2
# 修改学生表中手机号码不允许为空
ALTER TABLE student MODIFY Phone VARCHAR(11) NOT NULL;
  • 注意:修改表中的某列时,也要写全列的名字,数据类型,约束
2.2.2 修改表中的列(详细)
1
2
3
4
5
6
7
8
9
10
# 【增】最右侧添加:如果想在一个已经建好的表中添加一列,可以用
ALTER TABLE mydb1 ADD COLUMN NEW_COLUMN_NAME VARCHAR(45) NOT NULL;
# 【增】指定位置添加:这条语句向已有的表中加入新的一列,这一列在表的最后一列位置,希望添加在指定的一列
ALTER TABLE mydb1 ADD COLUMN NEW_COLUMN_NAME VARCHAR(45) NOT NULL AFTER COLUMN_NAME;
# 【增】添加到第一列:上面这个命令的意思是说添加新列到某一列后面。如果想添加到第一列
ALTER TABLE mydb1 ADD COLUMN NEW_COLUMN_NAME VARCHAR(45) NOT NULL FIRST;
# 【改】将表 mydb1 中,列名 def 改为unit
ALTER TABLE mydb1 CHANGE def unit CHAR;
# 【删】将表 mydb1 中,列名 unit 的列删除
ALTER TABLE mydb1 DROP COLUMN unit;
2.2.3 删除表中的列
1
2
# 删除学生表中 image 列
ALTER TABLE student DROP image;
  • 注意:删除列时,每次只能删除一列
2.2.4 修改列名
1
2
# 修改学生表中 borndate 列为 birthday
ALTER TABLE student CHANGE borndate birthday date NOT NULL;
  • 注意:修改列名时,在给定列新名称时,要指定列的类型和约束
2.2.5 修改表名
1
2
# 修改学生表的 student 为 stu
ALTER TABLE student TO stu;

2.3 删除表(DROP)

语法:DROP TABLE 表名;

2.3.1 删除学生表
1
2
# 删除学生表
DROP TABLE stu;

04-库表创删改
https://janycode.github.io/2017/06/18/05_数据库/01_MySQL/04-库表创删改/
作者
Jerry(姜源)
发布于
2017年6月18日
许可协议