DDL(数据定义语言):包括库和表的管理
一、库的管理
1、库的创建
语法:CREATE DATABASE IF NOT EXISTS 库名;
2、库的修改
语法:RENAME DATABASE 旧库名 TO 新库名;(版本更新后不使用了,会影响库内数据)
一般去外部文件中去修改库名,先停止服务,修改库名之后再更新开启服务。
更改库的字符集:ALTER DATABASE 库名 CHARACTER SET gbk;
3、库的删除
语法:DROP DATABASE IF EXISTS 库名;
二、表的管理
1、表的创建
语法:CREATE TABLE IF NOT EXISTS 表名( 列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
. . .
列名 列的类型【(长度) 约束】 )
CREATE TABLE IF NOT EXISTS book(
id INT,
bName VARCHAR(20),
bPrice DOUBLE,
authorId INT,
publishDate DATETIME
);
CREATE TABLE author(
id INT,
au_name VARCHAR(20),
nation VARCHAR(10)
)
VARCHAR(20)中20表示最大字符串长度,一个字母占一个字符,一个汉字也占一个字符。
2、表的修改:alter
(1)可以修改列名;
语法:
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 新列名类型
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
(2)可以修改列的类型或约束;
语法:
ALTER TABLE 表名 MODIFY COLUMN 列名 列要更改为的类型
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
(3)可以添加新列;
语法:
ALTER TABLE 表名 ADD COLUMN 要添加的列名 要添加列的类型
ALTER TABLE author ADD COLUMN annual DOUBLE;
(4)可以删除列;
语法:
ALTER TABLE 表名 DROP COLUMN IF EXISTS 要删除的列名
ALTER TABLE author DROP COLUMN IF EXISTS annual;
(5)可以修改表名。
语法:
ALTER TABLE 要修改的表名 RENAME TO 新表名
ALTER TABLE author RENAME TO author;
3、表的删除:drop
语法:
DROP TABLE IF EXISTS 表名
DROP TABLE IF EXISTS bool_author;
4、表的复制:
(1)仅仅复制表的结构,语法如下:
CREATE TABLE 新表名 LIKE 要复制的表名
CREATE TABLE copy LIKE author;
(2)复制表的结构和数据,语法为:
CREATE TABLE 新表名 SELECT * FROM 要复制的表名
CREATE TABLE copy2 SELECT * FROM author;
(3)在(2)的基础上,但仅仅复制部分数据和相应的字段,语法为:
CREATE TABLE copy3 SELECT 要复制的数据列名 FROM 要复制的表名 WHERE 筛选条件
CREATE TABLE copy3 SELECT id,au_name FROM author WHERE nation='中国';
(4)仅仅复制某些字段,语法为:
CREATE TABLE 新表名 SELECT 要复制的列名 FROM 要复制的表名 WHERE 0
CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 0;
三、常见的数据类型
1、数值型:整型、小数(定点数、浮点数)
2、字符型:较短的文本(char、varchar)、较长的文本(text、blob(较长的二进制数据))
3、日期型
(1)整型
分类:tinyint——1字节、smallint——2字节、mediumint——3字节、int/integer——4字节、bigint——8字节
特点:
<1>如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加你unsigned关键字。
<2>如果插入的数值超出整型的范围,首先会报异常out of range,并且插入临界值。
<3>如果不设置长度,会有默认的长度。长度代表了显示的最大宽度,如果不够会有0在左边填充,但必须搭配ZEROFILL使用。
(2)小数
分类:浮点型——ffloat(M,D)——4字节 double(M,D)——8字节;定点型——decimal(M,D)——M+2字节,可以简写成dec(M,D)
对于精确度要求较高的小数,建议使用定点型
特点:
<1>M和D:M代表整数部位+小数部位的总长度;D代表小数部位。如果超过范围,则插入临界值。M和D都可以省略。如果是decimal,则M默认为10,D默认为0;如果是float或者double,则会根据插入的数值的精度来决定精度。
<2>定点型的精确度较高,如果要求插入数值的精度较高,如:货币运算等,就优先考虑使用
(3)字符型
分类:
较短的文本——char和varchar、binary和varbinary(较短的二进制)、enum用于保存枚举、set用于保存集合;
较长的文本——text和blob(较大的二进制)、
特点:
<1>char(M)、varchar(M)——M的意思是指最大的字符数。
<2>char代表固定长度的字符,比较耗费空间,但性能较高一点;varchar代表可变长度字符,比较节省空间,但性能较低一些。
<3>char中M可以省略,默认为1,而varchar中M不可以省略。
(4)日期型
分类:date(只保存日期)\datetime(保存日期+时间)\timestamp(保存日期+时间)\time(只保存时间)\year(只保存年)
特点:
datetime:8字节、范围1000—9999、不受时区影响
timestamp:4字节、范围1970—2038、受时区影响
四、常见约束
约束的含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
六大分类:
1、NOT NULL (非空约束,用于保证该字段的值不能为空,比如姓名、学号等)
2、DEFAULT (默认约束,用于保证该字段有默认值,比如性别等)
3、PRIMARY KEY (主键约束,用于保证该字段的值具有唯一性并且非空,比如学号、员工编号等)
4、UNIQUE (唯一约束,用于保证该字段的值具有唯一性但可以为空,比如座位号等)
5、CHECK (检查约束,MySQL中不支持该约束,比如检查年龄、性别是否符合要求)
6、FOREIGN KEY (外键约束,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值)
注意,外键约束是在从表中添加,用于引用主表中某列的值。比如学生表的专业编号,员工表的部门编号,工种编号等。
添加约束的时机:1、创建表时;2、修改表时
具体格式如下图所示:
约束的添加分类:
1、列级约束(跟在字段后面):六大约束语法上都支持,但外键约束没有效果
语法:直接在字段名和类型后面追加约束类型即可,只支持:默认、非空、主键、唯一
CREATE TABLE stuinfo(
id INT PRIMARY KEY, #主键
stuName VARCHAR(20) NOT NULL, #非空
gender CHAR(1) CHECK (gender='男'OR gender='女'), #检查
seat INT UNIQUE, #唯一
age INT DEFAULT 18, #默认约束
majorId INT REFERENCES major(id) #外键
)
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
)
2、表级约束(脱离字段):除了非空、默认约束,其他都支持
语法:在各个字段的最下面,【CONSTRAINT 约束名】 约束类型(字段名)
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id), #主键
CONSTRAINT ck CHECK (gender='男'OR gender='女'), #检查
CONSTRAINT uq UNIQUE (seat), #唯一
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) #外键
)
3、通用的写法
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
sex CHAR(1),
seat INT UNIQUE,
age INT DEFAULT 18,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) #外键
)