MySQL数据库操作与数据表操作
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 创建数据库
# 创建一个数据库mydb1
CREATE DATABASE mydb1;
# 创建指定字符编码集的数据库
CREATE DATABASE mydb1 CHARACTER SET UTF8;
1.3 修改数据库(ALTER)
语法:
ALTER DATABASE 库名 操作
;
1.3.1 修改数据库的字符集
# 修改mydb1 的字符集为 GBK
ALTER DATABASE mydb1 CHARACTER SET GBK;
1.4 删除数据库(DROP)
语法:
DROP DATABASE 库名
1.4.1 删除数据库
# 删除 mydb1 数据库
DROP DATABASE mydb1;
2. 数据【表】操作(DML:增、删、改)
2.1 数据表的创建(CREATE)
语法:
CREATE TABLE 表名(
?
列名1 数据类型 [约束],
?
列名2 数据类型 [约束],
扫描二维码关注公众号,回复: 10849151 查看本文章? …
?
列名n 数据类型 [约束]
//最后一列末尾不加逗号
)[charset=utf8]
//可根据需要指定表的字符编码集
2.1.1 创建表
列名 | 数据类型 | 说明 |
---|---|---|
subjectId | INT | 课程编号 |
subjectName | VARCHAR(20) | 课程名称 |
subjectHours | INT | 课程时长 |
# 创建科目表 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 向现有表中添加列
# 在学生表基础上添加 image 列
ALTER TABLE student ADD image blob;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zP1uB494-1585391257628)(image-20200328100719232.png)]
2.2.2 修改表中的列
# 修改学生表中手机号码不允许为空
ALTER TABLE student MODIFY Phone VARCHAR(11) NOT NULL;
- 注意:修改表中的某列时,也要
写全列的名字,数据类型,约束
2.2.2 修改表中的列(详细)
# 【增】最右侧添加:如果想在一个已经建好的表中添加一列,可以用
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 删除表中的列
# 删除学生表中 image 列
ALTER TABLE student DROP image;
- 注意:删除列时,
每次只能删除一列
2.2.4 修改列名
# 修改学生表中 borndate 列为 birthday
ALTER TABLE student CHANGE borndate birthday date NOT NULL;
- 注意:修改列名时,在给定列新名称时,要
指定列的类型和约束
2.2.5 修改表名
# 修改学生表的 student 为 stu
ALTER TABLE student TO stu;
2.3 数据表的删除(DROP)
语法:
DROP TABLE
表名;
2.3.1 删除学生表
# 删除学生表
DROP TABLE stu;