MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

时间:2021-05-05 10:32:48

全部章节   >>>>


本章目录

3.1 使用 DDL 定义数据库表结构

3.1.1 SQL 简介

3.1.2 维护数据库和创建数据表

3.2 使用 DDL 维护数据库表结构

3.2.1 修改表结构

3.2.2 重命名表

3.2.3 添加外键约束

3.3 使用 DML 新增和更新表数据

3.3.1 插入表纪录

3.3.2 修改表纪录

3.4 使用 DML 删除表数据

3.4.1 删除没有被关联的表记录

3.4.2 删除被关联的表记录

总结:


3.1 使用 DDL 定义数据库表结构

3.1.1 SQL 简介

结构化查询语言(Structured Query Language,SQL)是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,专用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。

SQL 作为关系型数据库管理系统的标准语言(ANSI X3.135-1986),在 1987 年得到国际标准组织的支持成为国际标准。不过不同数据库系统之间的 SQL 不能完全通用。

SQL 重点内容包括数据定义语言 DDL 和数据操作语言 DML

3.1.2 维护数据库和创建数据表

数据定义语言(Data Definition Language,DDL)是一种用于描述数据库所需存储的现实世界实体的专门语言, 其主要工作是用于定义和维护数据库以及数据表结构。

创建数据库的 DDL 语法如下:

CREATE DATABASE database_name

语法说明:

database_name 为数据库名,如创建“demo”数据库的 DDL 语句为:create database demo。

为区分 SQL 语句中的关键字,通常在进行语法定义时,将 SQL 语句中的关键字设为大写,

如“CREATE DATABASE”。 但 SQL 语 句 本 身 不 区 分 大 小 写, 即“CREATE DATABASE demo”“create dadabase demo”“create database DEMO”这三条语句意义相同。

删除数据库的 DDL 语法如下:

DROP DATABASE database_name

查看数据库的 SQL 语句如下:

SHOW DATABASES

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

创建数据表的 DDL 语法如下:

CREATE TABLE table_name(
column_name data_type [NOT NULL] [DEFAULT default_value] [AUTO_INCREMENT] [],
...
[PRIMARY KEY(pk_name),]
[FOREIGN KEY(fk_name) REFERENCES referenced_table_name(ref_pk_name)]
)

语法说明:

“[]”中的内容为可选项。table_name:表名。

column_name:字段名。

data_type:字段数据类型。default_value:默认值。

auto_increment:主键值自动增长。pk_name:当前表中的主键名。

fk_name:当前表中的外键名。

referenced_table_name:被引用表名(主表名)。ref_pk_name:被引用表主键名。

示例:使用 DDL 创建驾驶员表

 字段名

说明

类型

长度

约束

driverID

驾驶员编号

int

主键、自动增长

licenseNo

驾照号码

varchar

20

非空

name

姓名

varchar

20

非空

gender

性别

varchar

2

birth

出生年月

date

use bus; -- 选择数据库
create table driver(
driverID int primary key auto_increment,
licenseNo varchar(20),
name varchar(20),
gender varchar(2),
birth date
)

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

3.2 使用 DDL 维护数据库表结构

3.2.1 修改表结构

修改表结构的 DDL 语法如下:

ALTER TABLE 表名 修改子句

语法说明:“修改子句”允许指定多个动作,其动作间使用逗号分隔。

新增字段修改子句表达式如下:

ADD column_name data_type [NOT NULL] [DEFAULT default_value]

变更字段子句表达式如下:

CHANGE column_name new_column_name data_type [NOT NULL] [DEFAULT default_value]

更新字段子句表达式如下:

MODIFY column_name new_data_type [NOT NULL] [DEFAULT default_value]

删除字段子句表达式如下:

DROP COLUMN column_name

删除唯一约束子句表达式如下:

DROP UNIQUE constraint_name

示例:修改 driver 表内容,要求如下:

新增字段 phone,它的类型为 varchar(20)。

将字段 birth 更名为 birthday,字段类型维持不变,仍为 date 类型。

将字段 goodsName 的类型修改为 varchar(100),原类型为 varchar(50)。

删除字段 gender。

alter table driver
add phone varchar(20),
change birth birthday date,
modify goodsName varchar(100),
drop column gender

3.2.2 重命名表

重命名表的 DDL 语法如下:

RENAME TABLE table_name TO new_table_name

语法说明:将表 table_name 更新为 new_table_name。

示例:rename table employee to emp;

3.2.3 添加外键约束

添加外键约束的语法如下:

ALTER TABLE table_name(
ADD CONSTRAINT constraint_name FOREIGN KEY(fk_name) REFERENCES referenced_table_name(ref_pk_name)]
)

语法说明如下:

constraint_name:约束名。

fk_name:当前表中的外键名。

referenced_table_name:被引用表名(主表名)。ref_pk_name:被引用表主键。

删除外键约束子句表达式如下:

DROP FOREIGN KEY constraint_name

示例:先删除在第 2 章中使用 Navicat for MySQL 在车辆表 vehicle 中所创建的参照线路表 line 的外键约束,然后再使用 DDL 语句重新创建该约束

use bus;
alter table vehicle drop foreign key fk1; -- 删除名为 fk1 外键约束
alter table vehicle add constraint fk_vehicle_line -- fk_vehicle_line 为新添加外键名foreign key(lineID) references line(lineID);

3.3 使用 DML 新增和更新表数据

数据操纵语言(Data Manipulation Language,DML) 由 DBMS 提供,用于让用户或程序员使用,实现对数据库中数据的操作。基本的 DML 分为两类四种:检索(查询)和更新(插入、删除、修改)。

3.3.1 插入表纪录

新增一条新纪录的语法如下:

INSERT [INTO] table_name[( 字段列表 )] VALUES( 值列表 )

语法说明如下:

  • 关键字 INTO 可以省略。
  • 字段列表是可选项。
  • 字段列表由若干个需要插入数据的字段名组成,各字段使用“,”隔开。若省略了字段列表,则表示需要为表的所有字段插入数据。
  • 值列表为必选项,该列表给出了待插入的若干个字段值,各字段值使用“,”隔开,并与字段列表一一对应。

注意:

(1)向字符串类型的 char、varchar、text 以及日期型字段插入数据时,字段值要括于单引号中。(在 MySQL 中单引号和双引号没有任何区别,但单引号为 SQL 标准,所以提倡使用单引号。)

(2)向自增型 auto_increment 字段插入数据时,建议插入 null 值,此时将向自增型字段插入下一个编号。

(3)向默认值约束字段插入数据时,字段值可以使用 default 关键字,表示插入的是该字段的默认值。

(4)插入新纪录时,需要注意表之间的外键约束关系,原则上先为主(父)表插入数据,然后再为从(子) 表插入数据。

示例:新增一条新线路,要求新增的记录使用 line 表中所有的字段。

 线路号

所属分公司

起点站

终点站

线路长度(km)

车辆数

807

通恒公司

工业四路 23 街坊

振兴路复兴村小区

23.1

18

insert into line values(NULL, '807 ', ' 通恒公司 ', ' 工业四路 23 街坊 ', ' 振兴路复兴村小区 ',23.1,18);

NULL 与主键自增匹配

新增“807”线路的 lineID 值为 9,而其上一条记录的 lineID 值为 7,而不是 8,这是什么原因造成的?

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

示例:新增一条新线路,向表中指定的字段插入数据。

 线路号

所属分公司

起点站

终点站

621

公交一公司

沿海赛洛城公交场站

后湖五路淌湖二村

insert into line(lineNo,company,from_station,end_station)

values('621', ' 公交一公司 ', ' 沿海赛洛城公交场站 ', ' 后湖五路淌湖二村 ');

注意:insert 语句中,字段列表中字段的次序可以任意,但值列表中字段值的次序要与字段列表中的字段次序必须一一对应。

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

示例:新增一条新线路,在 insert 语句中使用默认值。

 线路号

起点站

终点站

线路长度(km)

车辆数

508

幸福路百步亭路口

工农路舵落口

24.5

20

insert into line
values(null,'508',default,' 幸福路百步亭路口 ',' 工农路舵落口 ',24.5,20);

使用 insert 语句可以一次性地向表中批量插入多条记录,语法格式如下:

INSERT INTO table_name[( 字段列表 )] VALUES
( 值列表 1),
( 值列表 2),
...
( 值列表 n)

示例:新增3 条线路。

 线路号

 所属分公司

 起点站

 终点站

 线路长度(km)

 车辆数

548

公交二公司

长丰大道东风村

发展大道红旗建材家居

22.8

15

625

公交一公司

南湖路保利公园九里

武汉植物园

18.1

12

523

公交六公司

芦沟桥路

古田二路陈家墩

17.5

14

insert into line values
(null,'548',default,' 长丰大道东风村 ',' 发展大道红旗建材家居 ',22.8,15),
(null,'625',' 公交一公司 ',' 南湖路保利公园九里 ',' 武汉植物园 ',18.1,12),
(null,'523',' 公交六公司 ',' 芦沟桥路 ',' 古田二路陈家墩 ',17.5,14);

3.3.2 修改表纪录

update 语句的语法格式如下:

UPDATE table_name set
字段名 1= 值 1, 字段名 2= 值 2,..., 字段名 n= 值 n;
[WHERE 条件表达式 ]

语法说明如下:

where 表达式指定了表中的哪些记录需要修改,若省略了 where 子句,则表示修改表中的所有记录。

set 子句指定了要修改的字段以及该字段修改后的值。

示例:在国土测绘部门提供每条线路的具体里程数之前,公交集团拟将所有公交线路的线路长度置为 null,表明线路长度暂时未知。

update line set miles=null;

示例:市交通委员会为加强公交集团在市民出行交通的主导性地位,通过资本运作方式拟将公交集团的控股公司“通恒公司”转变为公交集团的全资子公司,因而需要将“通恒公司”更名为“公交通恒公司”,为增大该公司的运力, 还将该公司所有线路的车辆数增加 4 台。

update line set company=concat(' 公交 ', company), number=number+4 where company='通恒公司 '

concat(str1,str2,…) 为 MySQL 连接字符串函数,用于返回字符串 str1、str2…的连接结果。

3.4 使用 DML 删除表数据

删除表记录的语法如下:

DELETE FROM table_name [WHERE 条件表达式 ]

语法说明如下:

WHERE 条件子句为可选,若不存在 WHERE 子句,则删除整张表中的数据。

3.4.1 删除没有被关联的表记录

示例:删除表中所有记录。

“create table line_new like line;”的作用是创建一个新表 line_new,该表的表结构与 line 相同。
“insert into line_new select * from line”的作用是将 line 表中的所有记录插入到 line_new 表。
“delete from line_new”将删除 line_new 表中所有的记录。

“delete from line_new”  仍然保持自增型字段的值

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

示例:删除表中指定条件记录。

delete from line_new where company=' 公交二公司 ';

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

3.4.2 删除被关联的表记录

示例:删除存在外键约束的主表记录

公交集团为方便市民出行、优化公交线路,拟在新建住宅小区周边新增一些线路的同时,裁掉老城区中部分重复度高的线路,如删除 523 公交线路

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

查看 line 表可知线路 523 的线路编号 lineID 的值为“14”。

查看车辆表 vehicle,发现其中有记录参照主表 523 线路(523 线路的 lineID 值为“14”)。

由于存在从表 vehicle 中部分记录参照(引用)主表 line 中记录(如 523 线路),因此使用 delete 语句删除 523 线路时会出现删除异常。

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

方法一:设置“删除时”状态为“SET NULL”

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

方法二:设置“删除时”状态为“CASCADE”

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

由于方法二使用了级联删除规则,容易误删从表数据,所以使用时需特别慎重。

总结:

  • 创建数据表的 DDL 语法
  • 添加字段和外键约束的 DDL 语法
  • 解决存在外键约束的主表记录的删除异常:
  • 设置“删除时”状态为“SET NULL”。这样当删除被从表引用的主表记录时,从表中这些引用记录的外键值均被系统赋值为 null。
  • 设置“删除时”状态为“CASCADE”。这样当删除被从表引用的主表记录时,从表中这些引用记录均被级 联删除。

MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】的更多相关文章

  1. MySQL数据操作与查询笔记 • 【目录】

    持续更新中- 我的大学笔记>>> 章节 内容 第1章 MySQL数据操作与查询笔记 • [第1章 MySQL数据库基础] 第2章 MySQL数据操作与查询笔记 • [第2章 表结构管 ...

  2. MySQL 数据操作与查询笔记 • 【第1章 MySQL数据库基础】

    全部章节   >>>> 本章目录 1.1 数据库简介 1.1.1 数据和数据库定义 1.1.2 数据库发展阶段 1.1.3 数据库系统组成 1.1.4 关系型数据库 1.2 M ...

  3. MySQL数据操作与查询笔记 • 【第5章 MySQL 函数】

    全部章节   >>>> 本章目录 5.1 数学函数和控制流函数 5.1.1 数学函数 5.1.2 控制流函数 5.2 字符串函数 5.2.1 字符串函数介绍 5.2.2 字符串 ...

  4. MySQL数据操作与查询笔记 • 【第6章 聚合函数和分组查询】

    全部章节   >>>> 本章目录 6.1 sum.max 和 min 聚合函数 6.1.1 聚合函数介绍 6.1.2 sum 函数 6.1.3 max/min 函数 6.2 a ...

  5. MySQL数据操作与查询笔记 • 【第4章 SELECT 数据查询】

    全部章节   >>>> 本章目录 4.1 select 选择列表 4.1.1 select 基本结构 4.1.2 选择列表 4.2 MySQL 运算符 4.2.1 MySQL ...

  6. MySQL数据操作与查询笔记 • 【第2章 表结构管理】

    全部章节   >>>> 本章目录 2.1 关系模型与数据表 2.1.1 关系模型 2.1.2 数据表 2.2 MySQL 数据类型 2.2.1 MySQL 常见数据类型 2.2 ...

  7. MySQL数据操作与查询笔记 • 【第7章 连接查询】

    全部章节   >>>> 本章目录 7.1 内连接查询 7.1.1 交叉连接(笛卡尔积) 7.1.2 内连接查询概要 7.1.3 内连接案例 7.1.4 自然连接 7.2 多表连 ...

  8. 《MySQL数据操作与查询》- 综合项目 - 学生管理系统

    <MySQL数据操作与查询>综合项目需求 一.系统整体功能 维护学生信息.老师信息和成绩信息. 支持按多种条件组合查询学生信息和成绩信息. 二.系统的信息需求 一个班级有一个讲师一个班主任 ...

  9. 《MySQL数据操作与查询》- 综合项目 - 航空售票系统

    Mysql & SqlServer综合项目需求 1.系统整体功能 系统需支持以下功能: 维护客户信息.航班信息和票务信息 支持客户按多种条件组合查询航班信息和票务信息 支持客户根据票务信息订购 ...

随机推荐

  1. OC - 5&period;内存管理

    一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...

  2. JavaScript一个简易枚举类型实现扑克牌

    <script type="text/javascript"> /** * 这个函数创建一个新的枚举类型,实参对象表示类的每个实例的名字和值 * 返回值是一个构造函数, ...

  3. hbase1&period;1&period;4集群搭建

    hbase1.1.4集群搭建 先部署一个zookeeper集群和hadoop集群. (1)上传hbase安装包到intsmaze01节点 (2)解压 (3)配置hbase集群,要修改3个文件 注意:要 ...

  4. Android版本分布数据源

    先来Android官方数据地址:http://developer.android.com/intl/zh-cn/about/dashboards/index.html 友盟指数,这个对国内开发者比较有 ...

  5. Java用Jackson遍历json所有节点

    <!-- jackson begin --> <dependency> <groupId>com.fasterxml.jackson.core</groupI ...

  6. Flask-SQLAlchemy基本操作

    db.session.rollback() 回滚"""Role.query.get(2) get查询接收的参数为主键,如果不存在,返回空 >>> Use ...

  7. python 常用的高阶函数

    前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...

  8. serv-U使用

    该软件是设置ftp服务器的 可以百度查询ftp服务器安装攻略,如 https://jingyan.baidu.com/article/cb5d6105c00bba005c2fe0ca.html 问题: ...

  9. ES6之数组操作

    es6中对于数组操作添加了4种方法: 1.map —— 映射(一个对应一个) 2.reduce —— 汇总(多个出来一个) 3.filter —— 过滤 4.forEach —— 迭代/循环. 1.m ...

  10. JS-检测浏览器类型及版本

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...