库的管理
1. 库的创建
#语法
create database 库名
#案例1:创建库books
CREATE DATABASE books;
#重复执行会报错
#加个判断
CREATE DATABASE IF NOT EXISTS books;#容错性的处理
2. 库的修改
#更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;
3. 库的删除
DROP DATABASE books;
#加个判断
DROP DATABASE IF EXISTS books;#容错性的处理
表的管理
表的创建
#语法
create table 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
...
列名 列的类型【(长度) 约束】
)
#案例1:创建表book
CREATE TABLE IF NOT EXISTS books(
id INT ,#编号
bname VARCHAR(20),#图书名
price DOUBLE,
authorid INT,
publishdate DATETIME
);
DESC books;
表的修改
语法:ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段类型】;
#(1)修改列名
ALTER TABLE books CHANGE COLUMN publishdate pubdate DATETIME;
#COLUMN可以省略
#(2)修改列类型或约束
ALTER TABLE books MODIFY COLUMN pubdate TIMESTAMP;
#(3)添加新列
ALTER TABLE books ADD COLUMN annual DOUBLE;
#(4)删除列
ALTER TABLE books DROP COLUMN annual;
#(5)修改表名
ALTER TABLE books RENAME TO book_a;
常见数据类型介绍
常见类型
数值型
整型
小数
浮点型
定点型
字符型
较短的文本char、varchar
较长的文本text、blob(较大的二进制)
日期型
整型
1.分类
(1) tinyint
(2)smallint
(3)mediumint
(4) int/integar
(5) bigint
#案例1:如何设置无符号和有符号
CREATE TABLE tab_int(
t1 INT
t2 INT UNSIGNED
);
2.特点
- 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned
- 如果插入的数值超出了整型范围,会报异常,并插入临界值
- 如果不设置长度,会有默认的长度(长度只代表显示的最大宽度,如果不够会用0在左边填充,当必须搭配zerofill使用,本身的字符长度已经由类型决定了)
小数
1.分类
(1)浮点型
float(M,D)
double(M,D)
(2)定点型
dec(M,D)
decimal(M,D)#与dec一样
2.特点
(1)M和D(可省略)
(i)D:小数点后的位数
M:整数不为+小数部位
如果超过范围,则插入临界值
(ii)M和D都可以省略.
如果是decimal,则M默认为10,D默认为0.
如果是float和double,则会根据插入的数值的精度来决定精度。
原则
所选择的类型越简单越好,能保存数值的类型越小越好。
字符型
1.较短的文本
(1) char(M)
- 固定长度的字符
- M指最多字符数,可以省略,默认为1
- 比较耗费空间
- 效率较高
(2)varchar(M)
- 可变长度的字符
- M指最多字符数,不可省略
(3)Enum类型(枚举型)
(4) Set类型
日期型
1.分类
(1)date
只保存日期
(2)time
只保存时间
(3)year
只保存年
(4)datetime
(1)保存日期+时间
(2)范围:1000-9999
(3)不受时区等影响
(5)timestamp
(1)保存日期+时间
(2)1970-2038
(3)受时区等影响
常见约束
含义
一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
分类
NOT NULL #非空约束,用于保证该字段的值不能为空,比如姓名,学号等
DEFAULT#默认约束,用于保证该字段的值有默认值,比如性别等
UNIQUE#唯一约束,保证该字段的值具有唯一性,可以为空。比如座位号
CHECK#检查约束,mysql中不支持,比如年龄,性别等
PRIMARY KEY#主键约束,用于保证该字段的值具有唯一性,并且非空,如学号,员工编号等。
FOREIGN KEY#外键约束,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外键约束,用于引用主表中某列的值。如学生表的专业编号,员工表的部门编号,员工表的工种编号。
添加约束的时机
- 创建表时
- 修改表时
约束的添加分类
-
列级约束
六大约束语法上都支持,但外键约束没有效果,不可以起约束名 -
表级约束
除了非空,默认,其他都支持,可以起约束名(主键没有效果)CREATE TABLE 表名( 字段名 字段类型 列级约束 字段名 字段类型 列级约束 表级约束 );
创建表时添加的约束
1. 添加列级约束
#语法
#直接在字段名和类型后面约束类型即可,只支持:默认、非空、主键、唯一
CREATE DATABASE students;
CREATE TABLE stuinfo(
id INT PRIMARY KEY,#主键
stuName VARCHAR(20) NOT NULL;#非空
gender CHAR(1) CHECK(gender'男' OR gender='女'),#检查
sear INT UNIQUE#唯一
age INT DEFAULT 18, #默认约束
majoryID INT REFERENCES major(id)#外键
);
CREATE TABLE major(
id INT PRIMARY KEY
majoryName VARCHAR(20)
);
#外键和检查mysql是不支持的,这里只是写一下语法
2. 添加表级约束
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT ,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id),#主键
CONSTRAINT uq UNIQUE(seat)#唯一键
);
SHOW INDEX FROM stuinfo;
#语法
在各个字段的最下面
【constraint 约束名】 约束类型(字段名)
#通用写法
create table if not exists stuinfo(
id int primary key,
stuname varchar(20) not null,
sex char(1),
age int default 18,
seat int unique,
majorid int,
constraint fk_stuinfo_major foreign key (majorid) references major(id)
);
3.主键和唯一的大对比
(1)主键
- 保证唯一性
- 不允许为空
- 一个表中至多有一个
- 允许两个列组合成一个主键,但不推荐
(2)唯一
- 保证唯一性
- 允许为空
- 可以有多个
- 允许两个列组合成一个唯一键,但不推荐
4.外键
- 要求在从表设置外键关系
- 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
- 主表的关联列必须是一个key(一般是主键,也可以是唯一键)
- 插入数据时,先插入主表,再插入从表
- 删除数据时,先删除从表,再删除主表
- 多个键可以重叠使用
修改表时添加约束
#语法
#添加列级约束
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 新约束;
#添加表级约束
ALTER TABLE 表名 ADD [CONSTRAINT 约束名 ] 约束类型(字段名) 【外键的引用】;
1.添加非空约束
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT
);
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
2.添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
3.添加主键
#列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#表级约束
ALTER TABLE stuiinfo ADD PRIMARY KEY(id);
4.添加唯一
#列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#表级约束
ALTER TABLE stuiinfo ADD UNIQUE(seat);
5.添加外键
ALTER TABLE stuinfo ADD FOREIGN KEY (majorid) REFERENCES major(id);
修改表时删除约束
1.删除非空约束
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT
);
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT ;
3.删除主键
#列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT ;
#或者
ALTER TABLE stuinfo MODIFY COLUMN id INT DROP PRIMARY KEY;
4.删除唯一
ALTER TABLE stuinfo DROP INDEX seat;
5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
标识列
含义:又称为自增长列,可以不用手动地插入值,系统提供默认的序列值。
创建表时设置标识列
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO tab_identity
VALUES(NULL,'join');
SELECT *
FROM tab_identity;
#或者
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO tab_identity(NAME)
VALUES('join');
SELECT *
FROM tab_identity;
#设置步长为3
SET auto_increment_increment=3;
#更改起始值为10
INSERT INTO tab_identity
VALUES(10,'join');
INSERT INTO tab_identity
VALUES(NULL,'join');
特点
- 标识列必须与一个key搭配,可以不是主键
- 一个表中至多只有一个标识列
- 标识列的类型只能是数值型,一般是INT
- 标识列可以通过 SET auto_increment_increment=3;来设置步长
- 可以通过手动插入值,设置起始值
修改表时设置标识列
ALTER TABLE tab_identity
MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
修改表时删除标识列
ALTER TABLE tab_identity
MODIFY COLUMN id INT;