数字类型包括整数类型和数值类型。
整数类型从小到大:TINYINT SMALLINT MEDIUMINT INT BIGINT
数值类型包括:精确数值型DECIMAL
;近似数值型FLOAT DOUBLE REAL
在实际应用中,用户可以根据实际的需求来选择合适的整数类型,当出现位数太多而且是小数时,我们可以采用数值的近似类型。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 Bytes | (-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或INTEGER | 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的值 | 小数值 |
字符串类型用于存储字符串数据,包括 CHAR VARCHAR TEXT
TEXT用于存储二进制字符串:TINYTEXT TEXT MEDIUMTEXT LONGTEXT
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
表示时间和日期的数据类型包括:TIME DATE YEAR DATETIME TIMESTAMP
类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
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:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYY-MM-DD hh:mm:ss | 混合日期和时间值,时间戳 |
由0和1组成的字符串的字段成为二进制类型。
二进制类型有:BIT BINARY VARBINARY TINYBLOB BLOB MUDIUMBLOB LONGBLOB
类型名称 | 说明 | 存储需求 |
---|---|---|
BIT(M) | 位字段类型 | 大约 (M+7)/8 字节 |
BINARY(M) | 固定长度二进制字符串 | M 字节 |
VARBINARY (M) | 可变长度二进制字符串 | M+1 字节 |
TINYBLOB (M) | 非常小的BLOB | L+1 字节,在此,L<2^8 |
BLOB (M) | 小 BLOB | L+2 字节,在此,L<2^16 |
MEDIUMBLOB (M) | 中等大小的BLOB | L+3 字节,在此,L<2^24 |
LONGBLOB (M) | 非常大的BLOB | L+4 字节,在此,L<2^32 |
允许在给定的集合中选择一个值:性别选择一个男或者女。
ENUM('男','女')
可以从给定集合中选择多个值
使用CREATE TABLE创建数据表
CREATE [TEMPORARY] TABLE [IF NOT EXIST] <表名>
[([<字段定义>]),...,] [<索引定义>])]
[table_option] [select_statement];
temporary:表示是一个临时表
IF NOT EXIST:判断存不存在同名表
<表名>:要创建的表名。
<字段定义>
<索引定义>:为表中相关字段指定索引
table_option:表示选项,存储引擎,字符集
select_statement:定义表的查询语句
示例:在Student数据库中创建学生表S:
//首先创建数据库
CREATE DATABASE Student
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_0900_ai_ci;
//使用此数据库
use Student;
//创建S的表头
CREATE TABLE s
(
sno CHAR(15) NOT NULL COMMENT '学号',
sn VARCHAR(20) NOT NULL COMMENT '姓名',
sex ENUM('男','女') NOT NULL COMMENT '性别',
age INT NOT NULL COMMENT '年龄',
maj VARCHAR(20) NOT NULL COMMENT '专业',
dept VARCHAR(20) NOT NULL COMMENT '院系',
PRIMARY KEY (sno) //sno可以唯一确定一个学生,设置为此表的主码
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
什么是主码?
什么是外码?
约束包括:
我们刚才创建的表S就是NOT NULL约束的,即所有的字段都不能为空
表示字段中的值不能重复出现,用于保证数据表在某一字段或者段的组合上的取值必须是唯一的。
定义了UNIQEU的字段称为唯一码,唯一码允许为空,即Null,但是为了保证唯一性,只能有一个Null值出现。
使用方法:
<字段名> <数据类型> UNIQUE
示例1:创建表S,姓名sn设置为UNIQUE约束
//选取关键部分
sn VARCHAR(20) UNIQUE COMMENT '姓名',
只需要在数据类型后面加上约束条件UNIQUE即可。
示例2:创建表S,设置sn+sex为唯一码,UNIQUE约束
CREATE TABLE s
(
sno CHAR(15) NOT NULL COMMENT '学号',
sn VARCHAR(20) NOT NULL COMMENT '姓名',
sex ENUM('男','女') NOT NULL COMMENT '性别',
age INT NOT NULL COMMENT '年龄',
maj VARCHAR(20) NOT NULL COMMENT '专业',
dept VARCHAR(20) NOT NULL COMMENT '院系',
//设置他们两个为唯一码
UNIQUE ('sn','sex')
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
用于定义表的主码,起到唯一标识的作用,保证数据的唯一性,此字段中不能出现Null,不能重复,以此来保证数据的实体完整性。
一个表只能由一个主码,但是主码可以是多个段的组合
刚才我们定义的表S,使用的就是PRIMARY KEY设置了sno为表的主码
使用方法:
<字段名> <数据类型> PRIMARY KEY
示例1:设置sno为此表主码
sno CHAR(15) NOT NULL PRIMARY KEY COMMENT '学号',
在数据类型后面加上PRIMARY KEY即可。
示例2:创建一个选课表sc_primar,设置sno+cno两个,为表的主码:
CREATE TABLE sc_primary(
sno CHAR(10) NOT NULL COMMENT '学号',
cno CHAR(10) NOT NULL COMMENT '课程号',
score DECIMAL(5,2) COMMENT '成绩',
PRIMARY KEY (sno,cno)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
PRIMARY KEY约束与UNIQUE约束的区别:
用于在两个表之间建立联系:在表A中的一个外码,一定是另一个表(设为B)的主码,因此他们肯定具有相同的连接字段,即A的外码(B的主码)。
通过 FOREIGN KEY约束来保证两表的参照完整性
使用方法:
FOREIGN KEY (<从表A字段名> [从表A的另一个字段名])
REFERENCES <主表B表名> (<主表B字段名> [<主表B的另一个字段名>])
[其他条件]
ps:主码B指定的字段名一定是表的主码或者候选码
注意:[其他条件]
示例:建立选课表sc_foreign,设置学号sno和课程号cno为表的外码:
CREATE TABLE sc_foreign(
sno CHAR(10) NOT NULL COMMENT '学号',
cno CHAR(10) NOT NULL COMMENT '课程号',
score DECIMAL(5,2) COMMENT '成绩',
FOREIGN KEY(cno) REFERENCES sc_primary (cno),
FOREIGN KEY(sno) REFERENCES s (sno)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CHECK用于检查数据表中所允许的范围,例如:月份只能输入整数,而且是限定1-12输入。在更新表中的数据时,系统会检查,更新后的数据是否满足CHECK约束的限定条件。
使用方法:
CHECK(<条件>)
注意:
示例:建立选课表sc_check,定义成绩score的取值范围:0-100
CREATE TABLE sc_check(
sno CHAR(10) NOT NULL COMMENT '学号',
cno CHAR(10) NOT NULL COMMENT '课程号',
score DECIMAL(5,2) CHECK(score>=0 AND score<=100) COMMENT '成绩',
PRIMARY KEY (sno,cno)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
**用于增加新字段和完整性约束**
使用方法:
ALTER TABLE <表名>
ADD [<新字段名><数据类型>] [<完整性约束>] [FIRST | ALTER已有字段名]
示例:在学生表s中添加一个字段class_no字段:
ALTER TABLE s
ADD class_no VARCHAR(10);
可知:在默认情况下, 最后的参数位置默认表示添加到最后一个字段之后。
示例2:在学生表s中,在age字段之后添加一个家庭住址address字段:
ALTER TABLE s
ADD address VARCHAR(45) AFTER age;
示例3:在表中添加多个字段:
ALTER TABLE s
ADD (class_NO1 VARCHAR(10),addRess1 NVARCHAR(20));
同时添加了class_NO1和addRess1字段,在表的末尾
示例4:添加age的新的完整性约束 0 - 100:
ALTER TABLE s
ADD CONSTRAINT s_chk CHECK(age BETWEEN 0 AND 50);
此后,age便只能输入0-50。另外,CONSTRAINT s_chk可以省略,则系统自动为CHECK约束提供一个约束名。
**用于修改字段名**
使用方法:
ALTER TABLE 字段名
CHANGE <旧字段名> <新字段名> <新数据类型>
示例:把学生表s的sn改为name:
ALTER TABLE s
CHANGE sn name VARCHAR(20);
注意:即使不需要数据类型,也要写上数据类型,即使和以前一样,不能省略。
**用于修改表名**
使用方法:
ALTER TABLE 旧表名
RENAME [TO] 新表名
示例:把学生表s表名改为student:
ALTER TABLE s
RENAME TO student;
**用于修改字段数据类型和字段排序**
使用方法:
ALTER TABLE 表名
MODIFY <字段名1> <数据类型> [FIRST |AFTER字段名2]
示例:把学生表student的姓名name改为CHAR(50):
ALTER TABLE student
MODIFY name CHAR(50)
示例2:把年龄age的顺序查到性别sex的前面:
ALTER TABLE student
MODIFY sex ENUM('男','女') AFTER age;
注意顺序:age到前面来,即sex放到age的后面
**修改表的存储引擎**
使用方法:
ALTER TABLE 表名
ENGINE=<修改后的存储引擎名>
用于删除字段和完整性约束
ALTER TABLE 表名
DROP <字段名>
示例:删除student中新添加的class_NO1和addRess1字段:
ALTER TABLE student
DROP class_NO1,
DROP addRess1;
ALTER TABLE 表名
DROP CONSTRAINT <约束名>
示例: 删除学生表student中的CHECK约束s_chk
ALTER TABLE student
DROP CONSTRAINT s_chk;
ALTER TABLE 表名
DROP PRIMARY KEY
ALTER TABLE 表名
CHANGE [COLUMN] <字段名> <字段名> <数据类型> NULL
删除一个或者多个数据表
语法:
DROP TABLE [IF EXISTS] <表名>
IF EXISTS 为可选项。表示如果存在则删除此数据表
示例:删除学生表student:
DROP TABLE IF EXISTS student;
当我们已经创建完成表后:
SHOW TABLE;
来查看数据表内容
使用DESCRIBE(DESC)或者SHOW CREATE TABLE查看数据表结构
DESCRIBE/DESC <表名>
SHOW CREATE TABLE <表名>
示例:分别使用这两个语句来查看学生表s的结构:
USE student;
DESCRIBE s;
USE student;
DESC s;
USE student;
SHOW CREATE TABLE s;
语法:
INSERT | REPLACE INTO <表名> [(<字段名1> [<字段名2>...])] VALUES(<值>);
示例:使用INSERT和REPLACE分别在学生表s中插入数据:
USE student;
INSERT INTO s(sno,name,age,sex,address,maj,dept,class_no)
VALUES('s1','张三','18','男','中国','计算机','信息学院','20211');
REPLACE INTO s(sno,name,age,sex,address,maj,dept,class_no)
VALUES('s2','李四','18','男','中国','计算机','信息学院','20211');
同理,添加部分数据也是如此,我们只需要指定任意的字段名即可。
INSERT | REPLACE INTO <表名> [(<字段名1> [<字段名2>...])] VALUES(<值>),(<值>),(<值>)...;
示例:添加多条数据:
REPLACE INTO s(sno,name,age,sex,address,maj,dept,class_no)
VALUES('s2','李四','18','男','中国','计算机','信息学院','20211'),
('s3','王五','18','男','中国','计算机','信息学院','20211'),
('s4','赵六','18','男','中国','计算机','信息学院','20211');
语法:
UPDATE <表名>
SET <字段名>=<表达式> [,<字段名>=<表达式>]...
[WHERE <条件>]
示例:修改一条数据,把张三转入会计学院:
UPDATE s
SET dept='会计学院'
WHERE name='张三';
UPDATE s
SET age=age+1;
语法:
DELETE
FROM <表名>
[WHERE <条件>]
示例:删除一条数据,学生表s中会计学院删除:
DELETE
FROM s
WHERE dept='会计学院';
示例2:删除所有学生的所有字段:
DELETE
FROM s;
删除多条语句可以使用DELETE,也可以使用TRUNCATE语句,TRUNCATE专门用于清空表数据:
TRUNCATE [TABLE] <表名>;
推荐使用TRUNCATE:因为TRUNCATE删除内容,不删除定义,但是释放空间;DELETE删除内容,不删除定义,但是不释放空间。
本节我们学习了数据库表的创建,修改,删除,查看;表数据的添加,修改,删除。