#数据类型
/*
数值型:
整型
小数:
定点型
浮点型
字符型:
较短的文本:char, varchar
较长的文本:text, blob(保存二进制数据)
日期型
*/
#一、整型
/*
分类:
tinyint(1字节),smallint(2),mediumint(3),int/integer(4),bigint(8)
特点:
(1)如果不设置有符号还是无符号,默认是有符号
若想设置为无符号,应在数据类型后添加 unsigned
(2)如果插入的数值超过了整型的范围,会报out of range异常,并插入临界值
(3)如果不设置长度,会使用默认长度,长度表示数据在结果单元格中显示的最
大宽度,如果宽度不够,会使用0在左边填充,若想让填充的0显示出来,必
须搭配 zerofill 使用,但此时数据类型自动变成无符号。例如int(7),结
果为123,若在显示结果的单元格中123的左边有4个隐藏的0,若想让0显示,
则要在声明int时,书写 int(7) zerofill
*/
#1.如何设置有符号值和无符号值
CREATE TABLE IF NO EXISTS test (t1 INT, t2 INT UNSIGNED) ;#t1有符号,t2无符号
#二、小数
/*
分类:
(1)浮点型
float(M, D), double(M, D)
(2)定点型
dec(M, D), decimal(M, D)
特点:
(1)M代表总位数,D代表小数位数,插入的数值如果超过范围,则插入临界值
(2)M和D可以省略,对于decimal,默认(10, 0),对于float和double会根据插入值的精度自动变化
(3)定点型的精度较高,如果要求插入数值的精度较高,如货币,则可以考虑使用
*/
/*
选择数据类型的原则:
选择的数据类型越简单越好,能保存数值的范围越小越好,节省空间
*/
#三、字符型
/*
较短的文本:
char(M):
固定长度的字符,M一旦指定,开辟的空间也就固定了,尽管数据没有占用全部空间
varchar(M):
可变长度的字符,M只规定了最大字符数,若数据占用2个字符,则只开辟2个字符空间
M表示能存储的最多字符数,一个字母或一个汉字都是一个字符
较长的文本:
text、blob
比较:
写法 M的意义 特点 空间耗费 效率
char char(M) 最大字符数,可以 固定长度字符 高 高
省略,默认为1
varchar varchar(M) 最大字符数,不可 可变长度字符 低 低
以省略
补充
enum:枚举,插入的数据只能是枚举列表中的某一个
enum('', '', ...)
取值固定时可以使用,例如性别、四季等
set:集合,插入的数据可以是集合列表中的某一个或多个
set('', '', ...)
enum和set对插入的数据不区分大小写
*/
#案例1:演示枚举
CREATE TABLE test2 (
t2 ENUM ('a', 'b', 'c'),
sex ENUM ('男', '女')
) ;
INSERT INTO test2 VALUES('a','女');
INSERT INTO test2 VALUES('c','男');
#案例2:演示枚举
CREATE TABLE test3 (t3 SET ('a', 'b', 'c')) ;
INSERT INTO test3 VALUES('a');
INSERT INTO test3 VALUES('a,b');
INSERT INTO test3 VALUES('a,b,c');
#四、日期型
/*
分类:
date:2020-10-04
time:22:17:34
datetime:2020-10-04 22:17:34
timestamp(时间戳):20201004221734
year:2020
特点:
字节 范围 受时区影响
datetime 8 1000-1-1~9999-12-31 否
timestamp 4 19700101080001~2038 是
*/
#DDL
/*
数据定义语言
库和表的管理
一、库的管理
创建、修改、删除
二、表的管理
创建、修改、删除
创建:create
修改:alter
删除:drop
*/
#一、库的管理
/*
1.库的创建
create database [if not exists] 库名 ;
2.库的修改(修改字符集)
alter database 库名 character set 字符集 ;
3.库的删除
drop database [if exists] 库名 ;
*/
#案例1:创建图书库
CREATE DATABASE books ;
CREATE DATABASE IF NOT EXISTS books ;
#案例2:修改books库的字符集
ALTER DATABASE books CHARACTER SET gbk ;
#案例3:删除books库
DROP DATABASE books ;
DROP DATABASE IF EXISTS books ;
#二、表的管理
/*
1.表的创建
create table [if not exists] 表名(
列名 列的类型[(长度) 约束],
列名 列的类型[(长度) 约束],
...
) ;
2.表的修改
(1)修改列名:
alter table 表名 change [column] 列名 新列名 类型 [约束] ;
(2)修改列的类型或约束
alter table 表名 modify column 列名 新类型 [约束];
(3)添加列
alter table 表名 add column 新列名 类型 [约束];
(4)删除列
alter table 表名 drop column 列名 ;
(5)修改表名
alter table 表名 rename to 新表名 ;
3.表的删除
drop table [if exists] 表名 ;
4.表的复制
(1)复制表的结构(只复制字段名,不复制数据)
create table 表名 like 要复制的表名 ;
(2)复制表的结构和数据
create table 表名 select * from 要复制的表名 ;
(3)复制表的指定列的数据
见案例11
(4)复制表的部分结构
见案例12
*/
#案例1:在books库中创建book表
CREATE TABLE book (
#编号
id INT,
#书名
book_name VARCHAR (20),
#价格
price DOUBLE,
#作者编号,实现与author表连接
author_id INT,
#出版日期
public_date DATETIME
) ;
#案例2:在books库中创建author表
CREATE TABLE author (
#编号
author_id INT,
#姓名
author_name VARCHAR (20),
#国籍
nation VARCHAR (10)
) ;
#======================================================
#案例3:修改author表中的author_id为id
ALTER TABLE author CHANGE COLUMN author_id id INT ;
#案例4:修改book表中public_date的类型为timestamp
ALTER TABLE book MODIFY COLUMN public_date TIMESTAMP ;
#案例5:在author表中添加字段年薪,类型为double
ALTER TABLE author ADD COLUMN annual_salary DOUBLE ;
#案例6:删除author表中的年薪字段
ALTER TABLE author DROP COLUMN annual_salary ;
#案例7:修改author表为authors表
ALTER TABLE author RENAME TO `authors`;
#案例8:删除author表
DROP TABLE author ;
DROP TABLE IF EXISTS author ;
#======================================================
#向author表中插入数据
INSERT INTO author (id, author_name, nation)
VALUES
(1, '村上春树', '日本'),
(2, '莫言', '中国'),
(3, '金庸', '中国') ;
#案例9:创建表copy,该表具有和author表一样的结构
CREATE TABLE copy LIKE author ;
#案例10:创建表copy2,该表具有和author表一样的结构和数据
CREATE TABLE copy2 SELECT * FROM author ;
#案例11:创建表copy3,该表具有author表中国籍为中国的作者的id和author_name数据
CREATE TABLE copy3
SELECT
id,
author_name
FROM
author
WHERE nation = '中国' ;
#案例12:创建表copy4,该表具有author表中字段id和author_name的结构,而没有数据
CREATE TABLE copy4
SELECT
id,
author_name
FROM
author
WHERE 0 ;
#标识列
#一、创建表时设置自增长列
/*
又称为自增长列
含义:可以不用手动的插入值,系统提供默认的序列值
方法:在声明列时添加 auto_increment
特点:
(1)为自增长列赋值时:
a.不指定列名,不需要赋值 (name) values ('')
b.指定列名,赋值为null (id, name) values (null, '')
(2)设置自增长列起始值
插入第一条数据时指定值,插入第二条数据时不指定值
例如从id从10开始:
(id, name) values (10, '') ;
(id, name) values (null, '');
(3)设置自增长列的步长(每次增长的值),例如2
set auto_increment_increment = 2 ;
(4)标识列必须和主键搭配吗?
不必须,但标识列必须和key搭配(如主键、唯一键、外键等)
(5)一个表中只能有一个标识列
(6)标识列的类型只能是数值型(int, float, double等)
*/
#二、修改表时添加和删除标识列
/*
语法:
(1)添加标识列
alter table 表名 modify column 列名 类型 auto_increment ;
(2)删除标识列
alter table 表名 modify column 列名 类型 ;
*/
#1.添加标识列
ALTER TABLE student_info MODIFY COLUMN id INT AUTO_INCREMENT ;
#2.删除标识列
ALTER TABLE student_info MODIFY COLUMN id INT ;
DESC student_info;
#常见约束
/*
约束:
一种限制,用于限制表中的数据,以保证添加到表中的数据的准确性和可靠性
分类:六大约束
(1)not null:非空,用来保证该字段的值不能为空
(2)default:默认,用来保证该字段有默认值
(3)primary key:主键,用来保证该字段的值具有唯一性,并且非空
(4)unique:唯一,用来保证该字段的值具有唯一性,但可以为空
(5)check:检查,MySQL不支持
(6)foreign key:外键,需要搭配 references 使用,用于限制两个表之间的关系,
保证该字段的值必须来自于主表中关联字段的值,外键约束要添加在从表中,
例如学生表的专业编号、员工表的部门编号等
添加约束的时机:
(1)创建表时
(2)修改表时
一定是在添加数据之前添加约束
一个字段可以添加多个约束
约束的添加分类:
(1)列级约束:除了检查和外键
create table [if not exists] 表名(
列名 列的类型(长度) 列级约束,
列名 列的类型(长度) 列级约束,
...
) ;
(2)表级约束:除了非空和默认,关键字 constraint
create table [if not exists] 表名(
列名 列的类型(长度) 列级约束,
列名 列的类型(长度) 列级约束,
... ,
表级约束
) ;
*/
#创建测试用数据库
CREATE DATABASE test_student ;
#一、创建表时添加列级约束
CREATE TABLE stuInfo (
#主键约束
id INT PRIMARY KEY,
#非空约束
stuName VARCHAR (20) NOT NULL,
#检查约束
gender CHAR CHECK (gender IN ('男', '女')),
#gender enum('男','女')
#唯一约束
seat INT UNIQUE,
#默认约束
age INT DEFAULT 18,
) ;
CREATE TABLE major (
id INT PRIMARY KEY,
majorName VARCHAR (20) NOT NULL
) ;
DESC stuinfo ;
#查看表中的所有索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo ;
#二、创建表时添加表级约束
/*
语法:
在各个字段的最下面
[constraint 自定义的约束名] 约束类型 (字段名)
其中,外键:
[constraint 自定义的约束名] foreign key (字段名) references (主表中相关字段名)
若省略自定义的约束名,则该约束默认起名为字段名,但主键约束始终为primary,不会改变
*/
DROP TABLE IF EXISTS stuinfo ;
CREATE TABLE stuInfo (
id INT,
stuName VARCHAR (20),
gender CHAR,
seat INT,
age INT,
majorId INT,
#添加表级约束
#主键
CONSTRAINT pk PRIMARY KEY (id),
#唯一
CONSTRAINT uq UNIQUE (seat),
#外键
CONSTRAINT fk_studInfo_major FOREIGN KEY (majorId) REFERENCES major (id) #外键
) ;
SHOW INDEX FROM stuinfo;
#标准写法:一般将外键放在表级约束,其他约束都设置为列级约束
CREATE TABLE stuInfo (
#主键
id INT PRIMARY KEY,
#非空
#一个字段可以添加多个约束
stuName VARCHAR (20) NOT NULL UNIQUE,
gender ENUM('男','女'),
#唯一
seat INT UNIQUE,
#默认
age INT DEFAULT 18,
#外键
PRIMARY KEY(majorID) REFERENCES major(id)
) ;
#三、主键和唯一的对比
/*
唯一性 是否可以为空 一个表中可以有多少个 是否允许组合
主键 是 否 0个或1个 是
唯一 是 是(但只能有一个为null) 多个 是
*/
#四、外键的注意事项
/*
1.在从表中设置外键约束
2.从表的外键列的类型要与主表的关联列的类型一致或兼容,名称无要求
3.主表的关联列必须设置了key(一般为主键或唯一键)
4.插入数据时,先插入主表数据,再插入从表数据;
删除数据时,先删除从表数据,再删除从表数据
*/
#五、修改表时添加约束
/*
语法:
(1)添加列级约束
alter table 表名 modify column 列名 类型 添加的约束 ;
(2)添加表级约束
alter table 表名 add 添加的约束(列名) ;
alter table 表名 add constraint 自定义的约束名 添加的约束(列名) ;
*/
CREATE TABLE student_info (
id INT,
NAME VARCHAR (20),
age INT,
seat INT,
majorid INT
) ;
#1.添加非空约束
ALTER TABLE student_info
MODIFY COLUMN `name` VARCHAR (20) NOT NULL ;
#2.添加默认约束
ALTER TABLE student_info
MODIFY COLUMN age INT DEFAULT 18 ;
#3.添加主键
#(1)列级
ALTER TABLE student_info
MODIFY COLUMN id INT PRIMARY KEY ;
#(2)表级
ALTER TABLE student_indo ADD PRIMARY KEY (id) ;
#4.添加唯一
#(1)列级
ALTER TABLE student_info
MODIFY COLUMN seat INT UNIQUE ;
#(2)表级
ALTER TABLE student_info ADD UNIQUE(seat) ;
#5.添加外键
#表级
ALTER TABLE student_info
ADD FOREIGN KEY (majorid) REFERENCES major (id) ;
#添加约束名
ALTER TABLE student_info
ADD CONSTRAINT fk_studentinfo_major FOREIGN KEY (majorid) REFERENCES major (id) ;
#五、修改表时删除约束
/*
语法:
(1)删除非空和默认
alter table 表名 modify column 列名 类型 ;
(2)删除主键、唯一和外键
alter table 列名 drop primary key ;
alter table 列名 drop index|foreign key 自定义的约束名 ;
*/
#1.删除非空约束
ALTER TABLE student_info MODIFY COLUMN `name` VARCHAR(20) NULL ;#null可以省略
#2.删除默认约束
ALTER TABLE student_info MODIFY COLUMN age INT ;
#3.删除主键
ALTER TABLE student_info DROP PRIMARY KEY ;
#4.删除唯一
ALTER TABLE student_info DROP INDEX seat ;#seat是唯一键名,没有自定义时默认字段名
#5.删除外键
ALTER TABLE student_info DROP FOREIGN KEY fk_studentinfo_major ;