数据库DML和DDL的学习

Posted 黑黑白白君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库DML和DDL的学习相关的知识,希望对你有一定的参考价值。



相关的背景知识


1)DML语言

DML(Data Manipulation Language,数据操纵语言) 主要有三种形式:

  1. 插入:INSERT
  2. 更新:UPDATE
  3. 删除: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 表名
    
  • 两种方式的区别【面试题】

    1、truncate不能加where条件,而delete可以加where条件
    2、truncate的效率高一丢丢
    3、truncate 删除带自增长的列的表后,如果再插入数据,数据从1开始
    4、delete 删除带自增长列的表后,如果再插入数据,数据从上一次的断点处开始
    5、truncate删除不能回滚,delete删除可以回滚


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 表名(
	字段名 字段类型 列级约束,
	字段名 字段类型 列级约束,
	表级约束
);
  • 语法:

    在各个字段的最下面
    【contraint 约束名】 约束类型(字段名)
    

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的学习的主要内容,如果未能解决你的问题,请参考以下文章

MySQL学习DQL/DML/DDL/DCL 介绍

Hive学习——DDL&DML&DQL语句

Hive学习——DDL&DML&DQL语句

SQL语句学习----通用语法,DDL,DML基础语句

什么是ddl dml和dcl?怎样用才最好?

MYSQL学习笔记(DDL[数据定义]DML[数据操作]DQL[数据查询])