1. 创建和管理数据库
从系统架构的层次上看,MySQL 数据库系统从大到小依次是 数据库服务器 、 数据库 、 数据表 、数据表的 行与列
标识符命名规则
- 数据库名、表名不得超过30个字符,变量名限制为29个
- 必须只能包含 A–Z, a–z, 0–9, _共63个字符
- 数据库名、表名、字段名等对象名中间不要包含空格
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使
- 用`(着重号)引起来
- 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据
- 类型在一个表里是整数,那在另一个表里可就别变成字符型了
创建数据库
CREATE DATABASE 数据库名;
创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
判断数据库是否已经存在,不存在则创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;
管理数据库
查看所有数据库
show databases;
切换数据库
use 数据库名
查看数据库中的表
show tables;
查看正在使用的库
select database()
查看某个数据库中的表
show table from 数据库名
修改数据库
ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等
删除数据库
DROP DATABASE 数据库名;
DROP DATABASE IF EXISTS 数据库名;
2. MySQL的数据类型
1. 整数类型

CREATE TABLE test_int3(
f1 INT UNSIGNED
);
UNSIGNED : 无符号类型(非负),所有的整数类型都有一个可选的属性UNSIGNED(无符号属性),无符号整数类型的最小取值为0。
2. 浮点类型
浮点数和定点数类型的特点是可以 处理小数 ,你可以把整数看成小数的一个特例。因此,浮点数和定点数的使用场景,比整数大多了。 MySQL支持的浮点数类型,分别是 FLOAT、DOUBLE、REAL。
MySQL 存储浮点数的格式为: 符号(S) 、 尾数(M) 和 阶码(E) 。因此,无论有没有符号,MySQL 的浮点数都会存储表示符号的部分。因此, 所谓的无符号数取值范围,其实就是有符号数取值范围大于等于零的部分。
对于浮点类型,在MySQL中单精度值使用 4 个字节,双精度值使用 8 个字节。
MySQL允许使用 非标准语法 (其他数据库未必支持,因此如果涉及到数据迁移,则最好不要这么用): FLOAT(M,D) 或 DOUBLE(M,D) 。这里,M称为 精度 ,D称为 标度 。(M,D)中 M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30。
从MySQL 8.0.17开始,FLOAT(M,D) 和DOUBLE(M,D)用法在官方文档中已经明确不推荐使用
浮点数类型有个缺陷,就是不精准。
4. 定点类型

使用 DECIMAL(M,D) 的方式表示高精度小数。其中,M被称为精度,D被称为标度。0<=M<=65,0<=D<=30,D
当DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0)。当数据的精度超出了定点数类型的精度范围时,则MySQL同样会进行四舍五入处理。
5. 位类型

BIT类型中存储的是二进制值,类似010110
BIT类型,如果没有指定(M),默认是1位。这个1位,表示只能存1位的二进制值。这里(M)是表示二进制的位数,位数最小值为1,最大值为64。
6. 日期时间类型
7. 文本类型
3. 创建和管理数据表
创建表
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
……
[表约束条件]
);
CREATE TABLE c_1(
_id INT,
NAME VARCHAR(15) NOT NULL,
hire_date DATE
)ENGINE= INNODB CHARACTER SET= utf8;
基于现有的表创建表
CREATE TABLE c_2
AS
SELECT employee_id,last_name,salary
FROM employees
管理表
给表添加一个字段
ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;
ALTER TABLE c_1 ADD salary DOUBLE
修改一个字段的数据类型
ALTER TABLE 表名 MODIFY 【COLUMN】 字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名2】;
ALTER TABLE c_1 MODIFY salary DECIMAL
重命名一个字段
ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;
ALTER TABLE c_1 CHANGE salary my_salary DECIMAL
change也可以修改字段的数据类型
删除一个字段
ALTER TABLE 表名 DROP 【COLUMN】字段名
ALTER TABLE c_1 DROP COLUMN my_salary
给表重命名
1)
ALTER TABLE TO 原表名 RANAME 新表名
ALTER TABLE c_1 RENAME TO c_1_1
2)
RENAME TABLE 原表名 TO 新表名
RENAME TABLE c_1_1 TO c_1
删除表
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];
DROP TABLE IF EXISTS c_2
清空表
TRUNCATE TABLE detail_dept;
TRUNCATE TABLE c_4
4. 约束
为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面考虑:
- 实体完整性(Entity Integrity) :例如,同一个表中,不能存在两条完全相同无法区分的记录
- 域完整性(Domain Integrity) :例如:年龄范围0-120,性别范围“男/女”
- 引用完整性(Referential Integrity) :例如:员工所在部门,在部门表中要能找到这个部门
- 用户自定义完整性(User-defined Integrity) :例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。
根据约束起的作用,约束可分为:
- NOT NULL 非空约束,规定某个字段不能为空
- UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
- PRIMARY KEY 主键(非空且唯一)约束
- FOREIGN KEY 外键约束
- CHECK 检查约束
- DEFAULT 默认值约束
1. 查看表的约束
#information_schema数据库名(系统库) #table_constraints表名称(专门存储各个表的约束) SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';2. 非空约束
改变表设置NOT NULLCREATE TABLE constraint_test( `constraint` VARCHAR(15) NOT NULL )ALTER TABLE constraint_test MODIFY `constraint` VARCHAR(15) NOT NULL3. 唯一性约束
唯一性约束可以作用在多个列上
可以向有唯一性约束的列上添加NULL,而且NULL不遵守唯一性约束可以有多个``sql CREATE TABLE emp(idINT UNIQUE, #列级约束nameVARCHAR(15),emailVARCHAR(15) UNIQUE,salary` DECIMAL(10,2) )
CREATE TABLE emp(
id INT ,
name VARCHAR(15),
email VARCHAR(15) ,
salary DECIMAL(10,2) ,
表级约束
CONSTRAINT uk_emp_id UNIQUE(id)
)
```sql
ALTER TABLE emp ADD CONSTRAINT `uk_emp_id` UNIQUE KEY(`id`)
添加多列唯一性约束
只要两个列的值不完全一样就可以添加成功
CREATE TABLE emp(
`id` INT ,
`name` VARCHAR(15),
`email` VARCHAR(15) ,
`salary` DECIMAL(10,2) ,
#表级约束
CONSTRAINT `uk_emp_id_email` UNIQUE(`id`,`email`)
)
ALTER TABLE emp ADD CONSTRAINT `uk_emp_id_email` UNIQUE(`id`,`email`)
删除唯一性约束
- 添加唯一性约束的列上也会自动创建唯一索引。
- 删除唯一约束只能通过删除唯一索引的方式删除。
- 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
- 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()
中排在第一个的列名相同。也可以自定义唯一性约束名。
ALTER TABLE emps DROP INDEX `salary`;4. 主键约束
用来唯一标识表中的一行记录。
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
- 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。主键约束对应着表中的一列或者多列(复合主键)如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
- MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
- 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
- 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
CREATE TABLE emps(
`id` INT PRIMARY KEY,
`name` VARCHAR(15),
`email` VARCHAR(15) ,
`salary` DECIMAL(10,2)
)
CREATE TABLE emps(
`id` INT,
`name` VARCHAR(15),
`email` VARCHAR(15) ,
`salary` DECIMAL(10,2) ,
#表级约束
PRIMARY KEY(`id`)
)
ALTER TABLE `emps` ADD PARMARY KEY(`id`)
联合主键
CREATE TABLE `user`(
`name` VARCHAR(15),
`pwd` VARCHAR(15),
PRIMARY KEY(`name`,`pwd`)
)
删除主键约束
ALTER TABLE `emps` DROP PRIMARY KEY;
主键自增
- 一个表最多只能有一个自增长列
- 当需要产生唯一标识符或顺序值时,可设置自增长
- 自增长列约束的列必须是键列(主键列,唯一键列)
自增约束的列的数据类型必须是整数类型
CREATE TABLE emps( `id` INT PRIMARY KEY AUTO_INCREMENT , `name` VARCHAR(15), `email` VARCHAR(15) , `salary` DECIMAL(10,2) )删除自增
ALTER TABLE `emps` MODIFY `id` INT5. 外键约束
从表的外键列,必须引用/参考主表的主键或唯一约束
- 在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名(例如student_ibfk_1;),也可以指定外键约束名。
- 创建(CREATE)表时就指定外键约束的话,先创建主表,再创建从表
- 删表时,先删从表(或先删除外键约束),再删除主表
- 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据
- 在“从表”中指定外键约束,并且一个表可以建立多个外键约束
- 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。
- 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是外键的约束名。(根据外键查询效率很高)
- 删除外键约束后,必须 手动 删除对应的索引 ```sql create table 主表名称( 字段1 数据类型 primary key, 字段2 数据类型 ); create table 从表名称( 字段1 数据类型 primary key, 字段2 数据类型, [CONSTRAINT <外键约束名称>] FOREIGN KEY(从表的某个字段) references 主表名(被参考字段) );
(从表的某个字段)的数据类型必须与主表名(被参考字段)的数据类型一致,逻辑意义也一样
(从表的某个字段)的字段名可以与主表名(被参考字段)的字段名一样,也可以不一样
— FOREIGN KEY: 在表级指定子表中的列 — REFERENCES: 标示在父表中的列
```sql
ALTER TABLE emp1
ADD [CONSTRAINT emp_dept_id_fk] FOREIGN KEY(dept_id) REFERENCES dept(dept_id);
约束等级
- Cascade方式 :在父表上update/delete记录时,同步update/delete掉子表的匹配记录
- Set null方式 :在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null
- No action方式 :如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
- Restrict方式 :同no action, 都是立即检查外键约束
- Set default方式 (在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别
如果没有指定等级,就相当于Restrict方式。
对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式。
CREATE TABLE emps(
`id` INT PRIMARY KEY AUTO_INCREMENT ,
`name` VARCHAR(15),
`email` VARCHAR(15) ,
`salary` DECIMAL(10,2) ,
CONSTRAINT `fk_emps_email`
FOREIGN KEY(`email`) REFERENCES `user`(`id`)
ON UPDATE CASCADE ON DELETE RESTRICT
)
删除外键约束
ALTER TABLE `emps` DROP foreign key `fk_emps_email`
#删除外键对应的索引
ALTER TABLE `emps` DROP INDEX `fk_emps_email`
6. CHECK约束
检查某个字段的值是否符号xx要求,一般指的是值的范围
MySQL5.7 可以使用check约束,但check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告
但是MySQL 8.0中可以使用check约束了。
create table employee(
eid int primary key,
ename varchar(5),
gender char check ('男' or '女')
);
7. DEFAULT约束
给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。
create table 表名称(
字段名 数据类型 primary key,
字段名 数据类型 unique key not null,
字段名 数据类型 unique key,
字段名 数据类型 not null default 默认值,
);
alter table employee modify tel char(11) default ''

