MySQL基础-DDL语句 -- pd的MySQL笔记
文章目录
-
- [MySQL基础-DDL语句 -- pd的MySQL笔记](#MySQL基础-DDL语句 -- pd的MySQL笔记)
- 创建、删除、修改
- MySQL数据类型
- 关系型数据库的约束
-
- 主键约束
- [外键约束(Foreign Key)](#外键约束(Foreign Key))
- 唯一约束(Unique)
- [非空约束(Not Null)](#非空约束(Not Null))
- 创建表时添加约束
SQL语言分类
- 数据查询语言(DQL:Data Query Language)其语句,也称为"数据检索语句",用以从表中获得数据,确定数据怎样在应用程序给出。关键字 SELECT 是 DQL(也是所有 SQL)用得最多的动词。
- SELECT
- FROM
- WHERE
- ORDER BY
- HAVING
- 数据操作语言(DML:Data Manipulation Language)其语句包括动词 INSERT,UPDATE 和 DELETE。它们分别用于添加,修改和删除表中的行。
- INSERT:添加数据
- UPDATE:更新数据
- DELETE:删除数据
- 数据定义语言(DDL:Data Definition Language)定义数据库对象语言,其语句包括动词 CREATE 和 DROP 等。
- CREATE:创建数据库对象
- ALTER:修改数据库对象
- DROP:删除数据库对象
- 数据控制语言(DCL:Data Control Language)它的语句通过 GRANT 或 REVOKE 获得许可,确定用户对数据库对象的访问。
- GRANT:授予用户某种权限
- REVOKE:回收授予的某种权限
- 事务控制语言(TCL :Transaction Control Language)它的语句能确保被 DML 语句影响的表的所有行及时得以更新。
- COMMIT:提交事务
- ROLLBACK:回滚事务
- SAVEPOINT:设置回滚点
创建、删除、修改
数据库
使用DDL语言创建数据库:
sql
CREATE DATABASE db_name
DEFAULT CHARACTER SET = 'utf8mb4';
查看数据库
sql
SHOW DATABASES;
使用某数据库
sql
USE db_name;
使用DDL语言删除数据库:
sql
DROP DATABASE db_name;
数据表
使用DDL语言创建数据表:
sql
CREATE TABLE table_name (
COLUMN_NAME1 DATA_TYPE1,
column_name2 DATA_TYPE2,
)
举例创建一个employees表:包含雇员ID,雇员名字,雇员薪资
sql
CREATE TABLE employees (
employee_id INT,
name VARCHAR(10),
salary Float(8,2)
)
查看已创建的表
sql
SHOW TABLES;
使用DDL语言删除数据表:
sql
DROP TABLE table_name;
drop table employees;
使用DDL语言修改数据表:
sql
-- 重命名表
ALTER TABLE table_name RENAME new_name;
alter table employees rename employees_new;
-- 修改字段 (修改列名、 修改数据类型)
ALTER TABLE table_name CHANGE COLUMN old_name new_name DATA_TYPE;
alter table employees change column name new_name VARCHAR(10);
-- 只修改数据类型
ALTER TABLE table_name MODIFY COLUMN column_name DATA_TYPE;
alter table employees modify column salary Float(6,2);
使用DDL语句,添加新的列
sql
ALTER TABLE table_name ADD COLUMN column_name DATA_TYPE;
-- 在employees表中添加一个新的佣金百分比列
alter table employees add column commission Float(5,3);
使用DDL语句,删除列
sql
ALTER TABLE table_name DROP COLUMN column_name;
alter table employees drop column commission;
MySQL数据类型
整数类型
| 数据类型 | 描述 |
|---|---|
| tinyint(m) | 1字节,-128~127 |
| smallint(m) | 2字节,-32768~32767 |
| mediumint(m) | 3字节,-8388608~8388607 |
| int(m) | 4字节,-2147483648~2147483647 |
| bigint(m) | 8字节,-9223372036854775808~9223372036854775807 |
数值类型中的长度 m 是指显示长度,并不表示存储长度,只有字段指定 zerofill 时有用
- 例如: int(3) ,如果实际值是 2 ,如果列指定了 zerofill ,查询结果就是 002 ,左边用 0 来 填充
浮点类型
| 数据类型 | 描述 |
|---|---|
| float(m,d) | 单精度浮点型 8位精度(4字节) m 表示总长度,d 表示小数长度 |
| double(m,d) | 双精度浮点型 16位精度(8字节) m 表示总长度,d 表示小数长度 |
- 单精度浮点型存储约6-9位有效数字,双精度浮点型存储约15-17位有效数字;
- double占用空间是float的两倍
- 科学计算、金融等需要高精度时用double;图形处理、机器学习等大规模数据且精度要求不高时常用float。
字符串类型
| 数据类型 | 描述 |
|---|---|
| char(m) | 固定长度字符串,m 表示长度,最大长度为255字节 |
| tinytext | 可变长度,255字节长度的字符串 |
| varchar(n) | 可变长度,最多65535字节长度的字符串 |
| text | 可变长度,65535字节长度的字符串 |
| mediumtext | 可变长度,2^24-1字节长度的字符串 |
| longtext | 可变长度,2^32-1字节长度的字符串 |
char和varchar:
- char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定长。
- varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
- text不设置长度, 当不知道属性的最大长度时,适合用text。
按照查询速度: char最快, varchar次之,text最慢。
日期类型
| 数据类型 | 描述 |
|---|---|
| date | 日期类型,格式为 yyyy-mm-dd |
| time | 时间类型,格式为 hh:mm:ss |
| datetime | 日期时间类型,格式为 yyyy-mm-dd hh:mm:ss |
| timestamp | 时间戳类型,格式为 yyyymmdd hhmmss |
如果项目是跨时区的,使用timestamp,因为datetime不支持时区处理,而timestamp可以处理时区。
二进制数据(BLOB)
- BLOB和TEXT存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写。
- BLOB存储的数据只能整体读出。
- TEXT可以指定字符集,BLOB不用指定字符集。
关系型数据库的约束
数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。
- 主键约束(Primary Key) PK
- 不允许为空
- 不允许重复
- 保证数据的唯一性
- 外键约束(Foreign Key) FK
- 允许为空
- 允许重复
- 值必须是参照表的参照列中所包含的值
- 保证数据参照完整性
- 唯一约束(Unique)
- 相同值只能出现一次
- 允许为多个列添加唯一约束
- 保证数据的唯一性
- 非空约束(Not Null)
- 列中不能有空值
- 允许重复值
- 允许为多个列添加非空约束
- 保证数据没有空值
- 检查约束(Check) --当前MySQL不支持
- 用户自定义检查条件
- 保证数据满足自定义的条件约束
主键约束
- 单一主键:使用一个列作为主键列,当该列的值有重复时,则违反主键约束。
- 联合主键:使用多个列作为主键列,当这些列的值有重复时,则违反主键约束。
使用DDL语句添加主键约束
sql
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
alter table employees add primary key (employee_id);
主键自增长:
- 一个表中只允许有一个自增列
- 自动增长的列的类型必须是整数类型
- 自动增长只能添加到具备主键约束与唯一性约束的列上
- 删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长,然后才能删除主键约束或唯一性约束
使用DDL语句添加自增列:
sql
ALTER TABLE table_name MODIFY column_name DATA_TYPE AUTO_INCREMENT;
alter table employees modify employee_id int auto_increment;
使用DDL语句删除主键约束:
sql
ALTER TABLE table_name DROP PRIMARY KEY;
-- 先去掉自动增长
alter table employees modify employee_id int;
alter table employees drop primary key;
外键约束(Foreign Key)
使用DDL语句添加外键约束:
sql
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column_name) REFERENCES referenced_table_name (referenced_column_name);
-- 在employee表中加入对应部门列,先新建部门表
create table departments(
department_id int primary key auto_increment,
department_name varchar(20) not null,
location varchar(20) not null,
)
-- 给employee表添加外键约束
alter table employees add constraint emp_dep foreign key (department_id) references departments(department_id);
使用DDL语句删除外键约束:
sql
ALTER TABLE table_name DROP FOREIGN KEY constraint_name;
-- 删除employee表中的外键约束
alter table employees drop foreign key emp_dep;
唯一约束(Unique)
使用DDL语句添加唯一约束:
sql
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column_name);
-- 给name列添加唯一约束
alter table employees add constraint emp_name unique (name);
使用DDL语句删除唯一约束:
sql
ALTER TABLE table_name DROP KEY constraint_name;
-- 删除name列的唯一约束
alter table employees drop key emp_name;
非空约束(Not Null)
使用DDL语句添加非空约束:
sql
ALTER TABLE table_name MODIFY column_name DATA_TYPE NOT NULL;
-- 向employee表中的salary添加非空约束
alter table employees modify salary float(10,2) not null;
使用DDL语句删除非空约束:
sql
ALTER TABLE table_name MODIFY column_name DATA_TYPE NULL;
-- 删除salary列的非空约束
alter table employees modify salary float(10,2) null;
创建表时添加约束
要求: 创建 depts 表包含 department_id 该列为主键且自动增长,department_name 列不 允许重复,location_id 列不允含有空值。
sql
create table depts(
department_id int primary key auto_increment,
department_name varchar(30) not null unique,
location_id int not null,
)
默认值处理
在 MySQL 中可以使用 DEFAULT 为列设定一个默认值。如果在插入数据时并未指定该列的值,那么 MySQL 会将默认值添加到该列中
要求:创建 emp3 表,该表包含 emp_id 主键且自动增长,包含 name ,包含 address 该列默认值为"Unkown"
sql
create table emp3(
emp_id int primary key auto_increment,
name varchar(20) not null,
address varchar(20) default 'Unkown'
)
修改表添加新列并指定默认值
sql
ALTER TABLE table_name ADD COLUMN column_name DATA_TYPE DEFAULT value;
-- 修改 emp3 表,添加job_id 该列默认值为 0
alter table emp3 add column job_id int default 0;