数据库DML和DDL的学习
Posted 黑黑白白君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库DML和DDL的学习相关的知识,希望对你有一定的参考价值。
相关的背景知识:
- 本栏的《【数据库(一)】数据库基础知识及MySQL常用命令》(https://blog.csdn.net/m0_37621024/article/details/116547612)
- 本栏的《【数据库(二)】SQL语言以及DQL的学习》(https://blog.csdn.net/m0_37621024/article/details/116561545)
1)DML语言
DML(Data Manipulation Language,数据操纵语言) 主要有三种形式:
- 插入:INSERT
- 更新:UPDATE
- 删除:DELETE
1.1 插入
-
方式一(最常用)
-
语法:
insert into 表名(字段名,...) values(值1,...);
特点:
1、字段类型和值类型一致或兼容,而且一一对应
2、可以为空的字段,可以不用插入值,或用null填充
3、不可以为空的字段,必须插入值
4、字段个数和值的个数必须一致
5、字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致 -
-
方式二
-
语法
insert into 表名 set 列名=值,列名=值...
-
-
两种方式PK
-
方式一支持插入多行
insert into 表名【(字段名,...)】 values(值,...),(值,...),...
-
方式一还支持子查询
#举例: insert into beauty(id,name,phone) select (26,'宋茜','11809866');
-
1.2 修改
-
修改单表语法:
update 表名 set 字段=新值,字段=新值 【where 条件】
-
修改多表语法:
-
sql192语法
update 表1 别名1,表2 别名2 set 字段=新值,字段=新值 where 连接条件 and 筛选条件
-
sql199语法
update 表1 别名 inner|left|right join 表2 别名 on 连接条件 set 列=值, ... where 筛选条件;
-
1.3 删除
-
方式1:delete语句
-
单表的删除
delete from 表名 【where 筛选条件】 # 扩展:可配合limit: # delete from beauty limit 1;
-
多表的删除:
delete 别名1,别名2 from 表1 别名1,表2 别名2 where 连接条件 and 筛选条件;
-
-
方式2:truncate语句
truncate table 表名
2)DDL语句
DDL(data definition language)主要的命令有CREATE、ALTER、DROP等。DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
2.1 库的管理
2.1.1 创建库
create database 库名
# 举例:
CREATE DATABASE【IF NOT EXISTS】 books 【character set 字符集名】;
2.1.2 删除库
drop database 库名
# 举例:
DROP DATABASE 【IF EXISTS】 books;
2.1.3 其他
- 一般不更改库名,因为不安全
- 更改库的字符集:
ALTER DATABASE books CHARACTER SET gbk;
2.2 表的管理
2.2.1 创建表
create table 表名(
列名 列的类型【(长度),约束】,
列名 列的类型【(长度),约束】
)
# 举例:
CREATE TABLE 【IF NOT EXISTS】 stuinfo(
stuId INT,
stuName VARCHAR(20),
gender CHAR,
bornDate DATETIME
);
2.2.2 修改表
-
语法:
ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段类型】; alter table 表名 add| drop| modify| change column 列名 【列表型 约束】;
①修改列名 :
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型;
②修改表名:
ALTER TABLE 表名 RENAME 【TO】 新表名;
③修改列的类型或列级约束:
ALTER TABLE 表名 MODIFY COLUMN 列名 新类型【新约束】;
④添加列:
ALTER TABLE 表名 ADD COLUMN 列名 类型 【first| after 字段名】;
⑤删除列:
ALTER TABLE 表名 DROP COLUMN 列名;
2.2.3 删除表
DROP TABLE 【IF EXISTS】 表名;
2.2.4 表的复制
-
仅仅复制表的结构
CREATE TABLE 表名 LIKE 旧表;
-
复制表的结构+数据
CREATE TABLE 表名 SELECT * FROM 旧表 【where 筛选】;
-
只复制部分数据
CREATE TABLE copy3 SELECT id,au_name FROM author WHERE nation='china';
-
只复制某些结构(不要数据)
CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 0;
2.2.5 通用写法
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;
DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 新表名();
2.2.6 跨库
USE test;
CREATE TABLE dept2
SELECT department_id,department_name
FROM myemployees.departments;
2.3 常见约束
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型 列级约束,
表级约束
);
2.3.1 分类:
NOT NULL
非空,用于保证该字段的值不能为空,如姓名、学号等 。DEFAULT
默认,用于保证该字段有默认值。PRIMARY KEY
主键,用于保证该字段的值具有唯一性,并且非空,如学号、员工编号等。UNIQUE
与主键类似,保证唯一性,但可以为空。CHECK
检查约束【mysql中不支持】,如年龄、性别在。FOREIGN KEY
外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。
- 在从表添加外键约束,用于引用主表中某列的值
- 比如学生表的专业编号,员工表的部门编号,员工表的工种编号
-
主键和唯一的大PK【面试常见】
- 均保证唯一性,但UNIQUE允许为空(但NULL也只允许一个)
- 一个表中至多有一个主键,UNIQUE可以多个
- 均允许组合,但不推荐(因为不稳定)
- PRIMARY KEY (id,stuname)
- UNIQUE(seat,seat2)
-
外键【重点】
- 要求在从表设置外键关系
- 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
- 主表的关联列必须是一个key(一般是主键、唯一)
- 插入数据时,先插入主表,再插入从表
- 删除数据时,先删除从表,再删除主表
2.3.2 添加约束的时机
2.3.2.1 添加表时
-
列级约束
- 六大约束语法上都支持,但外键约束没有效果
- 只支持:默认、非空、主键、唯一,外键和check不支持
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 FOREIGN KEY INT REFERENCES major(id) );
-
表级约束
- 除了非空、默认,其他的都支持
- 除了非空、默认,其他的都支持
-
通用的写法:
```bash CREATE TABLE IF 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) ); ```
2.3.2.2 修改表时添加
-
语法:
# 添加列级约束: alter table 表名 modify column 字段名 字段类型 新约束; # 添加表级约束: alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
-
添加非空约束、默认约束:
ALTER TABLE 表名 MODIFY COLUMN 列名 VARCHAR(20) NOT NULL| DEFAULT 18| PRIMARY KEY;
-
添加主键、唯一键:
-
列级约束同上
-
表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id)| UNIQUE(id);
-
-
添加外键:
ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);
2.3.2.3 修改表时删除
-
删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
-
删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
-
删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
-
删除唯一
ALTER TABLE stuinfo DROP INDEX seat;
-
删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
2.3.3 标识列(自增长列)
含义:可以不用手动的插入值,系统提供默认的序列值。
-
特点:
-
标识列必须和key(一般是主键或者unique)搭配
-
一个表至多一个标识列
-
标识列的类型只能是数值型(INT、FLOAT、DOUBLE等)
-
标识列可通过
SET auto_increment_increment=3;
设置步长 -
更改步长
SHOW VARIABLES LIKE '%auto_increment%'; SET auto_increment_increment=3;
-
也可以通过手动插入值,设置起始值
-
-
创建表时设置标识列:
CREATE TABLE tab_identity( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO tab_identity VALUES(NULL,'john'); INSERT INTO tab_identity(NAME) VALUES('Lucy');
-
修改表时设置标识列:
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
-
修改表时删除标识列:
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;
2.3.4 有外键的情况下,删除主表的记录
-
级联删除
添加外键的时候加上ON DELETE CASCADE。
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE; DELETE FROM major WHERE id=3;
-
级联置空
添加外键的时候加上ON DELETE SET NULL。
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL; DELETE FROM major WHERE id=3;
以上是关于数据库DML和DDL的学习的主要内容,如果未能解决你的问题,请参考以下文章