MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】
全部章节 >>>>
本章目录
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
创建数据表的 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
)
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,这是什么原因造成的?
示例:新增一条新线路,向表中指定的字段插入数据。
线路号 |
所属分公司 |
起点站 |
终点站 |
621 |
公交一公司 |
沿海赛洛城公交场站 |
后湖五路淌湖二村 |
insert into line(lineNo,company,from_station,end_station)
values('621', ' 公交一公司 ', ' 沿海赛洛城公交场站 ', ' 后湖五路淌湖二村 ');
注意:insert 语句中,字段列表中字段的次序可以任意,但值列表中字段值的次序要与字段列表中的字段次序必须一一对应。
示例:新增一条新线路,在 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” 仍然保持自增型字段的值
示例:删除表中指定条件记录。
delete from line_new where company=' 公交二公司 ';
3.4.2 删除被关联的表记录
示例:删除存在外键约束的主表记录
公交集团为方便市民出行、优化公交线路,拟在新建住宅小区周边新增一些线路的同时,裁掉老城区中部分重复度高的线路,如删除 523 公交线路
查看 line 表可知线路 523 的线路编号 lineID 的值为“14”。
查看车辆表 vehicle,发现其中有记录参照主表 523 线路(523 线路的 lineID 值为“14”)。
由于存在从表 vehicle 中部分记录参照(引用)主表 line 中记录(如 523 线路),因此使用 delete 语句删除 523 线路时会出现删除异常。
方法一:设置“删除时”状态为“SET NULL”
方法二:设置“删除时”状态为“CASCADE”
由于方法二使用了级联删除规则,容易误删从表数据,所以使用时需特别慎重。
总结:
- 创建数据表的 DDL 语法
- 添加字段和外键约束的 DDL 语法
- 解决存在外键约束的主表记录的删除异常:
- 设置“删除时”状态为“SET NULL”。这样当删除被从表引用的主表记录时,从表中这些引用记录的外键值均被系统赋值为 null。
- 设置“删除时”状态为“CASCADE”。这样当删除被从表引用的主表记录时,从表中这些引用记录均被级 联删除。
MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】的更多相关文章
- MySQL数据操作与查询笔记 • 【目录】
持续更新中- 我的大学笔记>>> 章节 内容 第1章 MySQL数据操作与查询笔记 • [第1章 MySQL数据库基础] 第2章 MySQL数据操作与查询笔记 • [第2章 表结构管 ...
- MySQL 数据操作与查询笔记 • 【第1章 MySQL数据库基础】
全部章节 >>>> 本章目录 1.1 数据库简介 1.1.1 数据和数据库定义 1.1.2 数据库发展阶段 1.1.3 数据库系统组成 1.1.4 关系型数据库 1.2 M ...
- MySQL数据操作与查询笔记 • 【第5章 MySQL 函数】
全部章节 >>>> 本章目录 5.1 数学函数和控制流函数 5.1.1 数学函数 5.1.2 控制流函数 5.2 字符串函数 5.2.1 字符串函数介绍 5.2.2 字符串 ...
- MySQL数据操作与查询笔记 • 【第6章 聚合函数和分组查询】
全部章节 >>>> 本章目录 6.1 sum.max 和 min 聚合函数 6.1.1 聚合函数介绍 6.1.2 sum 函数 6.1.3 max/min 函数 6.2 a ...
- MySQL数据操作与查询笔记 • 【第4章 SELECT 数据查询】
全部章节 >>>> 本章目录 4.1 select 选择列表 4.1.1 select 基本结构 4.1.2 选择列表 4.2 MySQL 运算符 4.2.1 MySQL ...
- MySQL数据操作与查询笔记 • 【第2章 表结构管理】
全部章节 >>>> 本章目录 2.1 关系模型与数据表 2.1.1 关系模型 2.1.2 数据表 2.2 MySQL 数据类型 2.2.1 MySQL 常见数据类型 2.2 ...
- MySQL数据操作与查询笔记 • 【第7章 连接查询】
全部章节 >>>> 本章目录 7.1 内连接查询 7.1.1 交叉连接(笛卡尔积) 7.1.2 内连接查询概要 7.1.3 内连接案例 7.1.4 自然连接 7.2 多表连 ...
- 《MySQL数据操作与查询》- 综合项目 - 学生管理系统
<MySQL数据操作与查询>综合项目需求 一.系统整体功能 维护学生信息.老师信息和成绩信息. 支持按多种条件组合查询学生信息和成绩信息. 二.系统的信息需求 一个班级有一个讲师一个班主任 ...
- 《MySQL数据操作与查询》- 综合项目 - 航空售票系统
Mysql & SqlServer综合项目需求 1.系统整体功能 系统需支持以下功能: 维护客户信息.航班信息和票务信息 支持客户按多种条件组合查询航班信息和票务信息 支持客户根据票务信息订购 ...
随机推荐
- webservice--cxf和spring结合
服务端: 实体: package entity; import java.util.Date; /*** 实体 */ public class Pojo { //温度 private String d ...
- Dubbo管控平台
2019年初,官方发布了Dubbo管理控制台0.1版本.结构上采取了前后端分离的方式,前端使用Vue和Vuetify分别作为Javascript框架和UI框架,后端采用Spring Boot框架 一. ...
- GO类型转换
golang []byte转string golang中,字符切片[]byte转换成string最简单的方式是 package main import ( "fmt" _ &quo ...
- 记一次 .NET 某妇产医院 WPF内存溢出分析
一:背景 1. 讲故事 上个月有位朋友通过博客园的短消息找到我,说他的程序存在内存溢出情况,寻求如何解决. 要解决还得通过 windbg 分析啦. 二:Windbg 分析 1. 为什么会内存溢出 大家 ...
- Redis - 2 - 聊聊Redis的RDB和AOF持久化 - 更新完毕
1.RDB 1.1).RDB是什么? RDB,全称Redis Database RDB是Redis进行持久化的一种方式,当然:Redis默认的持久化方式也是RDB 1.2).Redis配置RDB 1. ...
- 为什么在集合中不能使用int关键字作为类型
解释: 1.Int是基本数据类型,Integer是Int的引用类型,定义集合的时候不能使用基本数据类型,需要使用对应的引用类型 2.int是基本数据类型,Integer是他的包装类,包装类主要用在类型 ...
- Mysql脚本 优化检测
下载地址: wget https://launchpad.net/mysql-tuning-primer/trunk/1.6-r1/+download/tuning-primer.sh 安装依赖: y ...
- 09 - Vue3 UI Framework - Table 组件
接下来做个自定义的表格组件,即 table 组件 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 基于原生 table 标签的强语义 允许用户自定义表头.表体 可选是否具有边框 ...
- 11 - Vue3 UI Framework - Card 组件
卡片是非常常用也是非常重要的组件,特别是在移动端的众多应用场景中,随便打开一个手机 App ,您会发现充斥着各种各样的卡片. 所以,我们也来制作一个简易的 Card 组件 返回阅读列表点击 这里 需求 ...
- AT2686 [ARC080A] 4-adjacent 题解
Content 给定一个长度为 \(n\) 的数列 \(a\),请将其重新排列,使得 \(\forall i\in[1,n-1]\),都有 \(4\mid (a_i\cdot a_{i+1})\),或 ...