MYSQL基础(三)
===========
(DDL)[Data Define Language(数据定义语言)]
数据定义语言一、库的管理
创建、修改、删除
二、表的管理
创建、修改、删除
- 库和表的管理:
===========
- - 库的管理
# DDL
/*
数据定义语言
库和表的管理
一、库的管理
创建、修改、删除
二、表的管理
创建、修改、删除
创建;create
修改:alter
删除:drop
*/
# 一、库的管理
# 1. 库的创建
/*
语法:
create database [if not exists] 库名;
*/
# 案例:创建 数据库 book
CREATE DATABASE IF NOT EXISTS books;
# 2. 库的修改
# (老版本的mysql能使用这句话):RENAME DATABASE book TO 新库名;(不安全)
# 更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;
# 3. 库的删除
DROP DATABASE if exists 库名;
- - 表的管理
# 二、表的管理
# 1. 表的创建
/*
语法:
create table 表名(
列名 列的类型[(长度)(约束)],
列名 列的类型[(长度)(约束)],
列名 列的类型[(长度)(约束)],
...
列名 列的类型[(长度)(约束)]
);
*/
use books;
# 案例:创建名字叫book 的表
CREATE TABLE book(
id int, # 编号
bName VARCHAR(20), # 图书名
price DOUBLE,# 价格
authorId INT,# 作者
publishDate VARCHAR(20)
);
DESC book;
# 案例二、创建表author
-- drop table author;
CREATE TABLE author(
id INT,
au_name VARCHAR(20),
nation VARCHAR(10)
);
DESC author;
# 2. 表的修改
/*
修改:
ALTER TABLE 表名 ADD|DROP|MODIFY|CHANGE COLUMN 列名【列的类型|约束】;
*/
DESC book;
# 1. 修改列名
ALTER table book CHANGE COLUMN publishDate pubDate VARCHAR(20);
# 2. 修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pubDate TIMESTAMP;
# 3. 添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;
DESC author;
# 4. 删除列
ALTER TABLE author DROP COLUMN annual;
# 5. 修改表名
ALTER TABLE author RENAME TO book_author;
# 表的删除
show tables;
DROP TABLE book_author;
# 通用的写法:
DROP DATABASE is EXISTS 旧的库名;
CREATE DATABASE 新库名;
DROP TABLE IS EXISTS 旧的表名;
DROP TABLE 表名();
# 4. 表的复制
use books;
DESC author;
SELECT * from author;
INSERT INTO author VALUES(id,au_name,nation)
(1,'村上村树','日本'),
(2,'莫言','中国'),
(3,'金庸','中国');
# 仅仅复制表的结构
CREATE TABLE copy LIKE author;
DESC copy;
# 复制表的结构外加数据
CREATE table copy2
SELECT * from author;
#只复制部分数据
CREATE TABLE copy3
SELECT id,au_name
FROM author
WHERE nation='中国';
# 仅仅复制某些字段
CREATE TABLE copy4
SELECT id,au_name
FROM author
WHERE 0;
- - 常见的数据类型
# 常见的数据类型
/*
数值型:
整形
小数:
定点数
浮点数
字符型:
较短的文本:char 、varchar
较长的文本:text、blob(较长的二进制数据)
日期型:
*/
# 一、整形
/*
分类:
tinyint、smallint、mediaint、int/integer、bigint
byte 1 2 3 4 8
特点:
1. 如果不设置无符号还是有符号,默认是有符号、如果想设置无符号 要加 UNSIGNED
2. 如果插入的数值超出了整形的范围会爆警告,会爆 out of range 异常,并且插入临界值
3. 如果不设置长度,会有默认的长度
*/
# 1. 如何设置无符号和有符号
SELECT database();
DROP TABLE IF EXISTS tab_int;
SELECT * from tab_int;
CREATE TABLE tab_int(
t1 INT,
t2 INT UNSIGNED
);
DESC tab_int;
insert into tab_int VALUES(123,1232);
insert into tab_int VALUES(123,1232);
insert into tab_int VALUES(123,1232);
# 二、小数
/*
分类:
1. 浮点型:
float(M,D):4
double(M,D):8
2. 定点型:
DEC(M,D)
M+2
DECIMAL(M,D)
特点:
1. M 代表整数部位+小数部位
2. D 小数部位
2.M 和D 都可以省略
如果是decimal,则m默认为10,d默认为0
如果是float和double,则会根据插入数值的精度决定精度
3. 定点型的精确度较高,
如果要求插入数值的精度较高如货币运算等则
考虑使用
*/
# 1. 测试m和d
DESC tab_float;
DROP TABLE tab_float;
CREATE table tab_float(
f1 FLOAT(5,2),
f2 FLOAT(5,2),
f3 DEC(5,2)
);
SELECT * from tab_float;
insert into tab_float VALUES(123.45,123.45,123.45);
insert into tab_float VALUES(123.456,123.456,123.456);
insert into tab_float VALUES(123.4,123.4,123.4);
insert into tab_float VALUES(1523.4,1523.4,1523.4);
# 原则:
/*
所选择的类型越简单越好,能保存数值的类型越小越好
*/
# 三、字符型
/*
较短的文本:
char (M)m = 0 - 255
varchar(M) m = 0 - 65535
较长的文本:
text
blob(较大的二进制)
特点:
写法 特点: 空间耗费 效率
char char 最大的字符数,可以省略默认为1 固定的长度的字符 比较耗费 高
varchar varchar 最大的字符书,不可省略 可变长度的字符 比较节省 低
其他:
binary 和 carbinary 用于保存较短的二进制
enum
用于保存枚举
*/
use books;
# ENUM
create TABLE tab_char(
c1 ENUM('a','b','c')
);
INSERT INTO tab_char VALUES('a');
INSERT INTO tab_char VALUES('b');
INSERT INTO tab_char VALUES('c');
INSERT INTO tab_char VALUES('m');
INSERT INTO tab_char VALUES('A');
SELECT * FROM tab_char;
# set
CREATE TABLE tab_set(
s1 set('a','b','c','d')
);
INSERT into tab_set VALUES('a');
INSERT into tab_set VALUES('a','b');
INSERT into tab_set VALUES('a','c','d');
SELECT * from tab_set;
# 四、日期型
/*
date 只保存日期
time 只保存时间
year 只保存 年
datetime 保存日期加时间
timestamp 保存日期加时间
特点:
字节 范围 时区影响
datetime 8 1000-9999 不受影响
timestamp 4 1970-2038 受影响
*/
CREATE TABLE tab_date(
t1 datetime,
t2 timestamp
)
INSERT INTO tab_date VALUES(NOW(),now());
SELECT * FROM tab_date;
SHOW VARIABLES LIKE 'time_zone';
SET time_zone='+9:00';
- - 常见的约束
# 常见约束
/*
含义:一种限制,用于限制表中数据 ,为了保证数据的准确和可靠性
分类:六大约束
not null 非空约束 :用于保证该字段的值 不能为 空
比如 、姓名、学号
default:默认约束,表示该字段有默认值
比如性别 、
primary key:主键 约束:用于保证该字段的值具有唯一性,并且非空
比如学号、员工编号等
UNIQUE:唯一 约束:用于保证该字段的值具有唯一性 ,可以为空
比如:座位号
CHECK:检查约束【MYSQL中不支持】:
比如年龄,性别:
foreign key:外键;用于限制两个表的关系,用于保证该字段的值必须来自于
主表的关联列的值(在从表中添加外键约束、用于引用主表 中的某列的 值)
比如学生表中的专业编号,员工表的部门编号、员工表的工种编号
添加约束的时机:
1、创建表时
2、修改表时
约束的添加分类:
列级约束:
六大约束语法上都支持,但外键约束没有效果
表级约束:
除了非空和默认,其他的都支持
面试题:
主键和唯一的大对比
保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
主键: ✅ ❌ 至少有一个 ✅ 但不推荐
唯一 ✅ ✅ 可以有多个 ✅ 但不推荐
insert into major values(1,'java');
insert into major values(2,'h5');
delete from stuinfo;
insert into stuinfo values(1,'jhon','男',null,19,1);
insert into stuinfo values(2,'lucy','女',null,18,2);
外键:
1. 要求在从表设置外键关系
2. 从表的外键类型和主表的关联列的类型要求一致或兼容,名称无要求
3、要求主表中的关联列必须是一个key(主键 或 唯一 )
4. 插入数据时,先插入主表,再插入从表
删除数据时,先删除从表,再删除主表
*/
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
)
DROP database books;
# 一、创建表时添加约束
# 1.添加列级约束
/*
语法:
直接在字段名和类型后面 加 约束 即可
只支持:默认、非空、主键、唯一
*/
CREATE DATABASE students;
USE students;
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)
);
desc stuinfo;
# 查看stuinfo表中所有的索引,包括主键,外键,唯一
show index from stuinfo;
# 添加表级约束
/*
在各个字段的最下面
【constraint 约束名】 约束类型(字段名)
*/
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),#唯一
CONSTRAINT ck CHECK(gender='男' OR gender='女'),# 检查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id)#外键
);
DROP TABLE IF EXISTS stuinfo;
create table stuinfo(
id INT,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorId INT,
seat2 INT
primary key(id),#主键
UNIQUE(seat),#唯一
UNIQUE(seat2),
CHECK(gender='男' OR gender='女'),# 检查
FOREIGN KEY(majorId) REFERENCES major(id)#外键
);
SHOW index FROM stuinfo;
# 通用的写法:
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)
);
# 二、修改表时添加约束
/*
1、添加列级约束
alter table 表名 modify 字段名 字段类型 新约束,
2、添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名)【外键引用】
*/
DROP TABLE IF EXISTS stuinfo;
create table stuinfo(
id INT,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorId INT
);
DESC stuinfo;
# 1.添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
# 2. 添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
# 3.添加主键
# 1. 列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
# 2. 表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
# 4. 唯一键
# 1. 列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
# 2. 表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
# 5. 添加外键盘
ALTER TABLE stuinfo ADD constraint fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id);
# 三、修改表时删除约束
# 1. 删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
# 2. 删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
# 3.删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
# 4.删除唯一
ALTER TABLE stuinfo DROP INDEX seat;
show index from stuinfo;
# 删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_majorId;
- - 标识列
#