MySQL基础(四)——DDL
视频学习来源:MySQL_基础+高级篇- 数据库 -sql -mysql教程_mysql视频_mysql入门_尚硅谷;
作者:木子六日;
MySQL版本:5.7.33;
库的管理
# 库的管理
# 创建库
CREATE DATABASE books;
# 一般会这样写来避免库已经存在
CREATE DATABASE
IF NOT EXISTS books;
# 修改库
# 修改字符集
ALTER DATABASE books CHARACTER
SET utf8;
# 删除库
DROP DATABASE books;
# 一般会这样写来避免库不存在
DROP DATABASE
IF EXISTS books;
表的管理
USE books;
# 表的管理
# 创建表
/*
语法格式如下:
create table 表名(
字段名 字段类型(长度) 约束,
字段名 字段类型(长度) 约束,
字段名 字段类型(长度) 约束,
……
字段名 字段类型(长度) 约束
);
*/
CREATE TABLE book (
id INT,
bName VARCHAR (20),
price DOUBLE,
authorId INT,
publishDate DATETIME
);
# 修改表
# 修改字段名
# ALTER TABLE 表名 CHANGE COLUMN 原字段名 新字段名 字段类型;
ALTER TABLE book CHANGE COLUMN publishDate pubDate datetime;
# 修改字段类型
# ALTER TABLE 表名 MODIFY COLUMN 字段名 新类型;
ALTER TABLE book MODIFY COLUMN pubDate TIMESTAMP;
# 添加一个字段
# ALTER TABLE 表名 ADD COLUMN 字段名 字段类型;
ALTER TABLE book ADD COLUMN salary DOUBLE;
# 删除字段
# ALTER TABLE 表名 DROP COLUMN 字段名;
ALTER TABLE book DROP COLUMN salary;
# 修改表名
# ALTER TABLE 就表名 RENAME TO 新表名;
ALTER TABLE book RENAME TO books;
# 删除表
DROP TABLE books;
DROP TABLE
IF EXISTS books;
# 查看表结构
DESC book;
# 查看所有表
SHOW TABLES;
# 表的复制
# 仅仅复制表结构
CREATE TABLE copy LIKE book;
# 复制结构和数据(当然也可以只复制部分数据,就看你子查询怎么写了)
CREATE TABLE copy2 SELECT
*
FROM
book;
SELECT
*
FROM
copy2;
数据类型
# 数据类型
# 整数
# TINYINT--1字节,SMALLINT--2字节,MEDIUMINT--3字节,INT--4字节,INTEGER--4字节,BIGINT--8字节
# 默认都是有符号的,即可以插入负数
# 设置为无符号如下:
CREATE TABLE t_int (t1 INT, t2 INT UNSIGNED);
# 我们也可以给整型设置长度,但是毫无意义,并不会影响整型的存储范围。
# 只有搭配zerofill关键字一起使用时,长度设置才有意义,他会使用0填充并且变为无符号(命令行才可以,Navicat还是不会填充的);
DROP TABLE
IF EXISTS t_int;
CREATE TABLE t_int (
t1 INT (5) ZEROFILL,
t2 INT UNSIGNED
);
INSERT INTO t_int
VALUES
(1, 12);
SELECT
*
FROM
t_int;
# 小数
# FLOAT(浮点)--4字节,DOUBLE(浮点)--8字节,DECIMAL(定点)--8字节
CREATE TABLE t_float (
f FLOAT (5, 2),
d DOUBLE (5, 2),
de DECIMAL (5, 2)
);
# M表示整数位数加小数位数一共最多是M位,D表示小数部分最多D位;
# 如果小数位数超出D,会四舍五入到D位,如果总位数(小数部分四舍五入后)超出M,直接报错;
# decimal的默认精度是M为10,D为0;
# FLOAT和double都是无所谓的;
INSERT INTO t_float
VALUES
(123.45, 124.4, 134.456);
SELECT
*
FROM
t_float;
# 字符型
# char 长度可以省略,默认是1,哪怕你插入的字符长度为3,如果你的类型是char(6)的话,他还是会开辟6个字符的空间;
# 所以char比varchar要更费空间,但是他的效率比varchar要高一些;
# varchar的长度不能省略;
CREATE TABLE t_char (c CHAR, v VARCHAR(5));
INSERT INTO t_char
VALUES
('a', 'ljj');
SELECT
*
FROM
t_char;
# 枚举型(只能插入指定的结果集中的一个)
CREATE TABLE t_enum (e enum('a', 'b', 'c'));
INSERT INTO t_enum
VALUES
('b');
# set型(只能插入指定的结果集中的任意个,用逗号分割)
CREATE TABLE t_set (s SET('a', 'b', 'c'));
INSERT INTO t_set
VALUES
('b,a,c');
# 二进制类型
# BINARY,TINYBLOB,VARBINARY,BLOB二进制类型
# 日期类型
# date(只有日期),time(只有时间),year(只有年),datetime(日期和时间都有),timestamp(时间戳)
CREATE TABLE t_date (t1 TIMESTAMP, t2 datetime);
INSERT INTO t_date
VALUES
(NOW(), NOW());
SELECT
*
FROM
t_date;
常见约束
# 常见约束
/*
六大常见约束:
NOT NULL:非空
DEFAULT:默认值
PRIMARY KEY:主键,唯一,非空
UNIQUE:唯一,但可以为空
CHECK:检查[mysql中不支持]
FOREIGN KEY:外键
列级约束:不支持外键;
表级约束: 除了非空和默认,其他都可以写;
语法:
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型 列级约束,
……
字段名 字段类型 列级约束,
表级约束
);
*/
USE students;
CREATE DATABASE
IF NOT EXISTS students;
CREATE TABLE
IF NOT EXISTS major (
id INT PRIMARY KEY,
majorName VARCHAR (20)
);
DROP TABLE
IF EXISTS stuInfo;
# 列级约束
CREATE TABLE
IF NOT EXISTS stuInfo (
id INT PRIMARY KEY,
stuName VARCHAR (20) NOT NULL,
gender CHAR (1) CHECK (gender = '男' OR gender = '女'),
seat INT UNIQUE,
age INT DEFAULT 19
);
-- DESC stuInfo;
DROP TABLE
IF EXISTS stuInfo;
# 表级约束
CREATE TABLE
IF NOT EXISTS stuInfo (
id INT,
stuName VARCHAR (20),
gender CHAR (1),
seat INT,
age INT,
majorId INT,
CONSTRAINT pk PRIMARY KEY (id),
CONSTRAINT uq UNIQUE (seat),
CONSTRAINT ck CHECK (gender = '男' OR gender = '女'),
CONSTRAINT fk FOREIGN KEY (majorId) REFERENCES major (id)
);
# CONSTRAINT 名称 这个东西不写也没事,就是取个名字而已
DESC stuInfo;
# UNIQUE,PRIMARY KEY,FOREIGN KEY都是有索引的
SHOW INDEX
FROM
stuInfo;
# 一般来说,除了外键我们都是把约束写成列级约束的,除了外键
INSERT INTO stuInfo (id, stuName, seat)
VALUES
(1, 'a', NULL),
(2, 'a', NULL),
(3, 'a', NULL);
SELECT
*
FROM
stuInfo;
# mysql5.7.33版本亲测可以的unique约束可以添加多个null,但是有些版本的mysql好像不可以
# 主键和unique约束都是可以组合的,例如
USE students;
SHOW INDEX
FROM
stu2;
CREATE TABLE
IF NOT EXISTS stu2 (
id1 INT,
id2 INT,
un1 INT,
un2 INT,
PRIMARY KEY (id1, id2),
UNIQUE (un1, un2)
);
DESC stu2;
# 修改约束(注意auto_increment并不是一个约束,而是一个标识列
# 他必须与key与数值型搭配使用[主键、唯一键、外键],而且一个表只能有一个标识列)
USE students;
DESC stuInfo;
ALTER TABLE stuInfo MODIFY COLUMN id INT auto_increment;