diff --git "a/31 \346\235\216\346\254\243/20230219 MySQL_DDL&DML\350\257\255\345\217\245.md" "b/31 \346\235\216\346\254\243/20230219 MySQL_DDL&DML\350\257\255\345\217\245.md" new file mode 100644 index 0000000000000000000000000000000000000000..26782bdbccbe5f94f7fe76a934191ff9bb3b9eac --- /dev/null +++ "b/31 \346\235\216\346\254\243/20230219 MySQL_DDL&DML\350\257\255\345\217\245.md" @@ -0,0 +1,884 @@ +# 作业 + +## 第1题 + +```sql +-- 1、创建数据库test01_market +create database test01_market charset utf8; +-- 2、创建表格customers +use test01_market; +create table customers( + c_num int, + c_name varchar(50), + c_contact varchar(50), + c_city varchar(50), + c_birth date +); +-- | 字段名 | 数据类型 | +-- | --------- | ----------- | +-- | c_num | int(11) | +-- | c_name | varchar(50) | +-- | c_contact | varchar(50) | +-- | c_city | varchar(50) | +-- | c_birth | date | + +-- **要求3:**将c_contact字段移动到c_birth字段后面 +alter table customers modify c_contact varchar(50) after c_birth; +-- **要求4:**将c_name字段数据类型改为 varchar(70) +alter table customers change c_name c_name varchar(70); +-- **要求5:**将c_contact字段改名为c_phone +alter table customers change c_contact c_phone varchar(50); +-- **要求6:**增加c_gender字段到c_name后面,数据类型为char(1) +alter table customers add c_gende char(1) after c_name; +-- **要求7:**将表名改为customers_info +alter table customers rename to customers_info; +-- **要求8:**删除字段c_city +alter table customers_info drop c_city; +``` + + + +## 第2题 + +```sql +-- 1、创建数据库test02_library +create database test02_library charset utf8; +-- 2、创建表格books +use test02_library; +mysql> create table books( + -> b_id int(11), + -> b_name varchar(50), + -> `authors` varchar(100), + -> price float, + -> pubdate year, + -> note varchar(100), + -> num int(11) + -> ); +-- | 字段名 | 字段说明 | 数据类型 | 允许为空 | 唯一 | +-- | ------- | -------- | ------------- | -------- | ---- | +-- | b_id | 书编号 | int(11) | 否 | 是 | +-- | b_name | 书名 | varchar(50) | 否 | 否 | +-- | authors | 作者 | varchar(100) | 否 | 否 | +-- | price | 价格 | float | 否 | 否 | +-- | pubdate | 出版日期 | year | 否 | 否 | +-- | note | 说明 | varchar(100) | 是 | 否 | +-- | num | 库存 | int(11) | 否 | 否 | + +-- 3、向books表中插入记录 + +-- 1) 指定所有字段名称插入第一条记录 +insert into books(b_id,b_name,`authors`,price,pubdate,note,num) values (1,'Tal of AAA','Dicks',23,1995,'novel',11); +-- 2)不指定字段名称插入第二记录 +insert into books values (2,'EmmaT','Jane lura',35,1993,'joke',22); +-- 3)同时插入多条记录(剩下的所有记录) +insert into books values (3,'Story of Jane','Jane Tim',40,2001,'novel',0),(4,'Lovey Day','George Byron',20,2005,'novel',30),(5,'Old land','Honore Blade',30,2010,'law',0),(6,'The Battle','Upton Sara',30,1999,'medicine',40),(7,'Rose Hood','Richard haggard',28,2008,'cartoon',28); +-- | b_id | b_name | authors | price | pubdate | note | num | +-- | ---- | ------------- | --------------- | ----- | ------- | -------- | ---- | +-- | 1 | Tal of AAA | Dickes | 23 | 1995 | novel | 11 | +-- | 2 | EmmaT | Jane lura | 35 | 1993 | joke | 22 | +-- | 3 | Story of Jane | Jane Tim | 40 | 2001 | novel | 0 | +-- | 4 | Lovey Day | George Byron | 20 | 2005 | novel | 30 | +-- | 5 | Old land | Honore Blade | 30 | 2010 | law | 0 | +-- | 6 | The Battle | Upton Sara | 30 | 1999 | medicine | 40 | +-- | 7 | Rose Hood | Richard haggard | 28 | 2008 | cartoon | 28 | + +-- 4、将小说类型(novel)的书的价格都增加5。 +update books set price=price+5 where note='novel'; +-- 5、将名称为EmmaT的书的价格改为40。 +update books set price=40 where note='EmmaT'; +-- 6、删除库存为0的记录 +delete from books where num=0; +``` + + + +## 第3题 + +```sql +-- 1、创建数据库test03_bookstore +create database test03_bookstore charset utf8; +-- 2、创建book表 +use test03_bookstore; +create table book( + -> id int(11) primary key auto_increment, + -> title varchar(100), + -> author varchar(100), + -> price double(11,2), + -> sales int(11), + -> stock int(11), + -> img_path varchar(100) + -> ); +-- ```mysql +-- +----------+--------------+------+-----+---------+----------------+ +-- | Field | Type | Null | Key | Default | Extra | +-- +----------+--------------+------+-----+---------+----------------+ +-- | id | int(11) | NO | PRI | NULL | auto_increment | +-- | title | varchar(100) | NO | | NULL | | +-- | author | varchar(100) | NO | | NULL | | +-- | price | double(11,2) | NO | | NULL | | +-- | sales | int(11) | NO | | NULL | | +-- | stock | int(11) | NO | | NULL | | +-- | img_path | varchar(100) | NO | | NULL | | +-- +----------+--------------+------+-----+---------+----------------+ +-- ``` +insert into book values (1,'解忧杂货铺','东野圭吾',27.20,102,98,'upload/books/解忧杂货铺.jpg'),(2,'边城','沈从文',23.00,102,98,'upload/books/边城.jpg'); +-- 尝试添加部分模拟数据,参考示例如下: + +-- ```mysql +-- +----+-------------+------------+-------+-------+-------+----------------------------+ +-- | id | title | author | price | sales | stock | img_path | +-- +----+-------------+------------+-------+-------+-------+-----------------------------+ +-- | 1 | 解忧杂货店 | 东野圭吾 | 27.20 | 102 | 98 | upload/books/解忧杂货店.jpg | +-- | 2 | 边城 | 沈从文 | 23.00 | 102 | 98 | upload/books/边城.jpg | +-- +----+---------------+------------+-------+-------+-------+----------------------------+ +-- ``` + +-- 3、创建用户表users,并插入数据 + create table users( + -> id int(11) primary key auto_increment, + -> username varchar(100) unique, + -> password varchar(100), + -> email varchar(100) + -> ); +-- ```mysql +-- +----------+--------------+------+-----+---------+----------------+ +-- | Field | Type | Null | Key | Default | Extra | +-- +----------+--------------+------+-----+---------+----------------+ +-- | id | int(11) | NO | PRI | NULL | auto_increment | +-- | username | varchar(100) | NO | UNI | NULL | | +-- | password | varchar(100) | NO | | NULL | | +-- | email | varchar(100) | YES | | NULL | | +-- +----------+--------------+------+-----+---------+----------------+ +-- ``` + +-- 尝试添加部分模拟数据,参考示例如下: + insert into users values (1,'admin','112233','admin@mxdx.com'); +-- ```mysql +-- +----+----------+----------------------------------+--------------------+ +-- | id | username | password | email | +-- +----+----------+----------------------------------+--------------------+ +-- | 1 | admin | 112233 | admin@mxdx.com | +-- +----+----------+----------------------------------+--------------------+ +-- ``` + +-- 4、创建订单表orders +create table orders( + -> id varchar(100) primary key, + -> order_time datetime, + -> tatal_count int(11), + -> total_amount double(11,2), + -> state int(11), + -> user_id int(11), + -> constraint users + -> foreign key(user_id) references users(id) + -> ); +-- ```mysql +-- +--------------+--------------+------+-----+---------+-------+ +-- | Field | Type | Null | Key | Default | Extra | +-- +--------------+--------------+------+-----+---------+-------+ +-- | id | varchar(100) | NO | PRI | NULL | | +-- | order_time | datetime | NO | | NULL | | +-- | total_count | int(11) | NO | | NULL | | +-- | total_amount | double(11,2) | NO | | NULL | | +-- | state | int(11) | NO | | NULL | | +-- | user_id | int(11) | NO | MUL | NULL | | +-- +--------------+--------------+------+-----+---------+-------+ +-- ``` + +-- 尝试添加部分模拟数据,参考示例如下: + insert into orders values ('1529425845569','2018-06-20 00:30:45',2,50.20,0,1); +-- ```mysql +-- +----------------+---------------------+-------------+--------------+-------+---------+ +-- | id | order_time | total_count | total_amount | state | user_id | +-- +----------------+---------------------+-------------+--------------+-------+---------+ +-- | 15294258455691 | 2018-06-20 00:30:45 | 2 | 50.20 | 0 | 1 | +-- +----------------+---------------------+-------------+--------------+-------+---------+ +-- ``` + +-- 5、创建订单明细表order_items +create table order_items( + -> id int(11) primary key auto_increment, + -> count int(11), + -> amount double(11,2), + -> title varchar(100), + -> author varchar(100), + -> price double(11,2), + -> img_path varchar(100), + -> order_id varchar(100), + -> constraint orders + -> foreign key(order_id) references orders(id) + -> ); +-- ```mysql +-- +----------+--------------+------+-----+---------+----------------+ +-- | Field | Type | Null | Key | Default | Extra | +-- +----------+--------------+------+-----+---------+----------------+ +-- | id | int(11) | NO | PRI | NULL | auto_increment | +-- | count | int(11) | NO | | NULL | | +-- | amount | double(11,2) | NO | | NULL | | +-- | title | varchar(100) | NO | | NULL | | +-- | author | varchar(100) | NO | | NULL | | +-- | price | double(11,2) | NO | | NULL | | +-- | img_path | varchar(100) | NO | | NULL | | +-- | order_id | varchar(100) | NO | MUL | NULL | | +-- +----------+--------------+------+-----+---------+----------------+ +-- ``` +insert into order_items values (1,1,27.20,'解忧杂货店','东野圭 吾',27.20,'static/img/default.jpg','1529425845569'),(2,1,23.00,'边城','沈从文',23.00,'static/img/default.jpg','1529425845569'); +alter table order_items + -> drop foreign key orders; +update order_items set order_id=15294258455691 where count=1; +-- 尝试添加部分模拟数据,参考示例如下: + +-- ```mysql +-- +----+-------+--------+---------+---------+-------+----------------+----------------+ +-- | id |count| amount| title | author | price | img_path | order_id | +-- +----+-------+--------+------------+----------+-------+----------------+----------------+ +-- | 1 | 1 | 27.20| 解忧杂货店 | 东野圭吾 | 27.20 | static/img/default.jpg|15294258455691 | +-- | 2 | 1 | 23.00| 边城 | 沈从文 | 23.00 | static/img/default.jpg|15294258455691 | +-- +----+-------+--------+------------+----------+-------+------------+----------------+ +-- ``` + +-- 参考答案: +``` + + + + + + + + + + + +# DDL + +虽说图形界面工具可以直接创建库、创建表、修改库和表的结构,但是如果批量修改,还是编写DDL语句的脚本,执行脚本更快更方便。 + +### 创建数据库 + +```mysql +create database 数据库名 ; +create database 数据库名 charset 字符集; +``` + +### 查看所有的数据库 + +```mysql +show databases; #有一个s,代表多个数据库 +``` + +### 查看某个数据库的详细定义语句 + +```mysql +show create database 数据库名; +``` + +```mysql +show create database 数据库名\G +``` + +### 修改数据库编码 + +```mysql +#修改数据库字符集和校对规则 +ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称 COLLATE 字符集对应校对规则; +``` + +```mysql +ALTER DATABASE mxdx_chapter3_two CHARACTER SET utf8 COLLATE utf8_general_ci; +``` + +==**注意,**==修改数据库编码只会影响之后创建的表的默认编码,之前创建的表不会受影响。 + +### 删除数据库 + +```mysql +drop database 数据库名; +``` + +### 使用数据库 + +```mysql +use 数据库名; +``` + +### 查看某个数据库的所有表格 + +```mysql +use 数据库名; +show tables; +``` + +```mysql +show tables from 数据库名; +``` + +### 创建表格 + +```mysql +create table 数据表名称( + 字段名 数据类型, + 字段名 数据类型 + ... +); +``` + +```mysql +create table teacher( + tid int, + tname varchar(5), + salary double, + weight double(5,2), + birthday date, + gender enum('男','女'), + blood enum('A','B','AB','O'), + tel char(11) +); +``` + +### 查看表的详细定义信息,即查看建表语句 + +```mysql +show create table 表名称; +show create table 表名称\G +``` + +```mysql +mysql> show create table teacher\G +*************************** 1. row *************************** + Table: teacher +Create Table: CREATE TABLE `teacher` ( + `tid` int(11) DEFAULT NULL, + `tname` varchar(5) DEFAULT NULL, + `salary` double DEFAULT NULL, + `weight` double(5,2) DEFAULT NULL, + `birthday` date DEFAULT NULL, + `gender` enum('男','女') DEFAULT NULL, + `blood` enum('A','B','AB','O') DEFAULT NULL, + `tel` char(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8 +1 row in set (0.00 sec) +``` + +### 修改数据表编码 + +```mysql +alter table 表名称 convert to character set utf8; +``` + +### 查看表结构 + +```mysql +desc 表名称; +``` + +```mysql +mysql> desc teacher; ++----------+------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------+------------------------+------+-----+---------+-------+ +| tid | int(11) | YES | | NULL | | +| tname | varchar(5) | YES | | NULL | | +| salary | double | YES | | NULL | | +| weight | double(5,2) | YES | | NULL | | +| birthday | date | YES | | NULL | | +| gender | enum('男','女') | YES | | NULL | | +| blood | enum('A','B','AB','O') | YES | | NULL | | +| tel | char(11) | YES | | NULL | | ++----------+------------------------+------+-----+---------+-------+ +8 rows in set (0.00 sec) +``` + +### 删除表格,包括表结构和里面的数据 + +```mysql +drop table 表名称; +``` + +### 修改表结构:删除字段 + +```mysql +alter table 表名称 drop 【column】 字段名称; +``` + +```mysql +alter table teacher drop column weight; +``` + +### 修改表结构:增加字段 + +```mysql +alter table 表名称 add 【column】 字段名称 数据类型; +alter table 表名称 add 【column】 字段名称 数据类型 first; +alter table 表名称 add 【column】 字段名称 数据类型 after 另一个字段; +``` + +```mysql +alter table teacher add weight double(5,2); +alter table teacher drop column weight; + +alter table teacher add weight double(5,2) first; +alter table teacher drop column weight; + +alter table teacher add weight double(5,2) after salary; +alter table teacher drop column weight; +``` + +### 修改表结构:修改字段的数据类型 + +```mysql +alter table 表名称 modify 【column】 字段名称 新的数据类型; +``` + +```mysql +mysql> desc teacher; ++----------+------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------+------------------------+------+-----+---------+-------+ +| tid | int(11) | YES | | NULL | | +| tname | varchar(5) | YES | | NULL | | +| salary | double | YES | | NULL | | +| weight | double(5,2) | YES | | NULL | | +| birthday | date | YES | | NULL | | +| gender | enum('男','女') | YES | | NULL | | +| blood | enum('A','B','AB','O') | YES | | NULL | | +| tel | char(11) | YES | | NULL | | ++----------+------------------------+------+-----+---------+-------+ +8 rows in set (0.00 sec) + +mysql> alter table teacher modify column weight double; +Query OK, 0 rows affected (0.01 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +mysql> desc teacher; ++----------+------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------+------------------------+------+-----+---------+-------+ +| tid | int(11) | YES | | NULL | | +| tname | varchar(5) | YES | | NULL | | +| salary | double | YES | | NULL | | +| weight | double | YES | | NULL | | +| birthday | date | YES | | NULL | | +| gender | enum('男','女') | YES | | NULL | | +| blood | enum('A','B','AB','O') | YES | | NULL | | +| tel | char(11) | YES | | NULL | | ++----------+------------------------+------+-----+---------+-------+ +8 rows in set (0.00 sec) + +``` + +### 修改表结构:修改字段的名称 + +```mysql +alter table 表名称 change 【column】 旧字段名称 新的字段名称 新的数据类型; +``` + +```mysql +mysql> desc teacher; ++----------+------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------+------------------------+------+-----+---------+-------+ +| tid | int(11) | YES | | NULL | | +| tname | varchar(5) | YES | | NULL | | +| salary | double | YES | | NULL | | +| weight | double | YES | | NULL | | +| birthday | date | YES | | NULL | | +| gender | enum('男','女') | YES | | NULL | | +| blood | enum('A','B','AB','O') | YES | | NULL | | +| tel | char(11) | YES | | NULL | | ++----------+------------------------+------+-----+---------+-------+ +8 rows in set (0.00 sec) + +mysql> alter table teacher change tel phone char(11); +Query OK, 0 rows affected (0.01 sec) +Records: 0 Duplicates: 0 Warnings: 0 + +mysql> desc teacher; ++----------+------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------+------------------------+------+-----+---------+-------+ +| tid | int(11) | YES | | NULL | | +| tname | varchar(5) | YES | | NULL | | +| salary | double | YES | | NULL | | +| weight | double | YES | | NULL | | +| birthday | date | YES | | NULL | | +| gender | enum('男','女') | YES | | NULL | | +| blood | enum('A','B','AB','O') | YES | | NULL | | +| phone | char(11) | YES | | NULL | | ++----------+------------------------+------+-----+---------+-------+ +8 rows in set (0.00 sec) +``` + +### 修改表结构:修改字段位置 + +```mysql +alter table 表名称 modify 【column】 字段名称 数据类型 first; +alter table 表名称 modify 【column】 字段名称 数据类型 after 另一个字段; +``` + +### 修改表名称(重命名表) + +```mysql +alter table 旧表名 rename 【to】 新表名; +rename table 旧表名称 to 新表名称; +``` + +例如: + +```mysql +alter table teacher rename to t_tea; +rename table t_tea to teacher; +``` + +# DML + +## 添加语句 + +### (1)添加一条记录到某个表中 + +```mysql +insert into 表名称 values(值列表); #值列表中的值的顺序、类型、个数必须与表结构一一对应 +``` + +```mysql +mysql> desc teacher; ++----------+------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------+------------------------+------+-----+---------+-------+ +| tid | int(11) | YES | | NULL | | +| tname | varchar(5) | YES | | NULL | | +| salary | double | YES | | NULL | | +| weight | double | YES | | NULL | | +| birthday | date | YES | | NULL | | +| gender | enum('男','女') | YES | | NULL | | +| blood | enum('A','B','AB','O') | YES | | NULL | | +| phone | char(11) | YES | | NULL | | ++----------+------------------------+------+-----+---------+-------+ +8 rows in set (0.00 sec) +``` + +```mysql +insert into teacher values(1,'张三',15000,120.5,'1990-5-1','男','O','13789586859'); +``` + +```mysql +insert into teacher values(2,'李四',15000,'1990-5-1','男','O','13789586859'); #缺体重weight的值 + +ERROR 1136 (21S01): Column(列) count(数量) doesn't match(不匹配) value(值) count(数量) at row 1 +``` + +### (2)添加一条记录到某个表中 + +```mysql +insert into 表名称 (字段列表) values(值列表); #值列表中的值的顺序、类型、个数必须与(字段列表)一一对应 +``` + +```mysql +insert into teacher(tid,tname,salary,phone) values(3,'王五',16000,'15789546586'); +``` + +### (3)添加多条记录到某个表中 + +```mysql +insert into 表名称 values(值列表),(值列表),(值列表); #值列表中的值的顺序、类型、个数必须与表结构一一对应 +``` + +```mysql +insert into 表名称 (字段列表) values(值列表),(值列表),(值列表); #值列表中的值的顺序、类型、个数必须与(字段列表)一一对应 +``` + +```mysql +insert into teacher (tid,tname,salary,phone) +values(4,'赵六',16000,'15789546586'), +(5,'汪飞',18000,'15789548886'), +(6,'天琪',19000,'15909546586'); +``` + +### (4)示例演示 + +```mysql +#演示基本的,简单的DML语句 +#基于tempdb数据库演示 +create database tempdb; +use tempdb; + +#创建teacher表 +create table teacher( + id int, + name varchar(20), + gender enum('m','f'), + birthday date, + salary double, + tel varchar(11) +); + +#查看teacher表结构 +mysql> desc teacher; ++----------+---------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------+---------------+------+-----+---------+-------+ +| id | int | YES | | NULL | | +| name | varchar(20) | YES | | NULL | | +| gender | enum('m','f') | YES | | NULL | | +| birthday | date | YES | | NULL | | +| salary | double | YES | | NULL | | +| tel | char(18) | YES | | NULL | | ++----------+---------------+------+-----+---------+-------+ +6 rows in set (0.01 sec) + + +#添加数据 +#(1)第一种情况,给所有字段赋值 +insert into 表名称 values(值列表); +#这种情况要求(值列表)的每一个值的类型、顺序与表结构一一对应 +#表中有几个字段,(值列表)必须有几个值,不能多也不能少 +#值如果是字符串或日期类型,需要加单引号 + +#例如:添加一条记录到teacher表 +insert into teacher values +(1,'张三','m','1998-7-8',15000.0,'18256953685'); + +#例如:添加一条记录到teacher表 +insert into teacher values +(2,'李四','f','1998-7-8',15000.0); #少了电话号码 + +mysql> insert into teacher values + -> (2,'李四','f','1998-7-8',15000.0); +ERROR 1136 (21S01): Column count doesn't match value count at row 1' +#(值列表)中值的数量和表结构中column列的数量不一致。 + +#例如:添加一条记录到teacher表 +insert into teacher values +(2,'李四','f','北京宏福苑',15000.0,'18256953685'); #把生日写称为地址 + +mysql> insert into teacher values + -> (2,'李四','f','北京宏福苑',15000.0,'18256953685'); +ERROR 1292 (22007): Incorrect date value: '北京宏福苑' for column 'birthday' at row 1 +#日期格式不对 + +#(2)第二种情况,给部分字段赋值 +insert into 表名称 (部分字段列表) values(值列表); +#此时(值列表)中的值的数量、格式、顺序与(部分字段列表)对应即可 + +#例如:添加一条记录到teacher表,只给id和name字段赋值 +insert into teacher (id,name) values (2,'李四'); + +mysql> select * from teacher; ++------+------+--------+------------+--------+-------------+ +| id | name | gender | birthday | salary | tel | ++------+------+--------+------------+--------+-------------+ +| 1 | 张三 | m | 1998-07-08 | 15000 | 18256953685 | +| 2 | 李四 | NULL | NULL | NULL | NULL | ++------+------+--------+------------+--------+-------------+ +2 rows in set (0.00 sec) +#没有赋值的字段都是默认值,此时默认值是NULL +#这种情况,当某个字段设置了“非空NOT NULL”约束,又没有提前指定“默认值”, +#那么在添加时没有赋值的话,会报错。明天演示非空约束。 + +#(3)一次添加多条记录 +insert into 表名称 values(值列表1),(值列表2)...; +insert into 表名称 (部分字段列表) values(值列表),(值列表2)...; +#上面一个insert语句有几个(值列表)就表示添加几行记录。 +#每一个值列表直接使用逗号分隔 + +#添加多条记录到teacher表 +insert into teacher (id,name) values + (3,'王五'), + (4,'宋鑫'), + (5,'赵志浩'), + (6,'杨业行'), + (7,'牛钰琪'); + + #查看数据 + mysql> select * from teacher; ++------+--------+--------+------------+--------+-------------+ +| id | name | gender | birthday | salary | tel | ++------+--------+--------+------------+--------+-------------+ +| 1 | 张三 | m | 1998-07-08 | 15000 | 18256953685 | +| 2 | 李四 | NULL | NULL | NULL | NULL | +| 3 | 王五 | NULL | NULL | NULL | NULL | +| 4 | 宋鑫 | NULL | NULL | NULL | NULL | +| 5 | 赵志浩 | NULL | NULL | NULL | NULL | +| 6 | 杨业行 | NULL | NULL | NULL | NULL | +| 7 | 牛钰琪 | NULL | NULL | NULL | NULL | ++------+--------+--------+------------+--------+-------------+ +7 rows in set (0.00 sec) + +``` + + + +## 修改语句 + +### 修改所有行 + +```mysql +update 表名称 set 字段名 = 值, 字段名 = 值; #给所有行修改 +``` + +```mysql +#修改所有人的薪资,都涨了1000 +update teacher set salary = salary + 1000 ; +``` + +### 修改部分行 + +```mysql +update 表名称 set 字段名 = 值, 字段名 = 值 where 条件; #给满足条件的行修改 +``` + +```mysql +#修改天琪的薪资降低5000 +update teacher set salary = salary-5000 where tname = '天琪'; +``` + +## 删除 + +### 删除部分行的数据 + +```mysql +delete from 表名称 where 条件; +``` + +```mysql +delete from teacher where tname = '天琪'; +``` + +### 删除整张表的数据,但表结构留下 + +```mysql +delete from 表名称; +``` + +```mysql +delete from teacher; +``` + +### 截断表,清空表中的数据,只留有表结构 + +```mysql +truncate 表名称; +``` + +```mysql +truncate teacher; +``` + +truncate表和delete表的区别: + +delete是一条一条删除记录的。如果在事务中,事务提交之前支持回滚。(后面会讲事务) + +truncate是把整个表drop,新建一张,效率更高。就算在事务中,也无法回滚。 + +```mysql +#同学问:是否可以删除salary字段的值,字段留着,值删掉 +#可以实现,但是不是用delete,用update + +#同学问:是否可以删除salary字段,连同字段和这个字段的数据都是删除 +#可以实现,但是不是用delete,用alter table 表名称 drop column 字段名; + +#同学问:只删除某个单元格的值 +#可以实现,但是不是用delete,用update +``` + + + +## UPDATE中嵌套子查询 + +```mysql +#子查询也可以嵌套在update语句中 +#(1)修改“t_employee”表中部门编号(did)和 +#“测试部”部门编号(did)相同的员工薪资为原来薪资的1.5倍。 +UPDATE t_employee +SET salary = salary * 1.5 +WHERE did = (SELECT did FROM t_department WHERE dname = '测试部'); + +#(2)修改“t_employee”表中did为NULL的员工信息, +#将他们的did值修改为“测试部”的部门编号。 +#子查询select did from t_department where dname = '测试部' +#这种子查询必须是单个值,否则无法赋值 + +UPDATE t_employee +SET did = (SELECT did FROM t_department WHERE dname = '测试部') +WHERE did IS NULL; + +#(3)修改“t_employee”表中“李冰冰”的薪资值等于“孙红梅”的薪资值。 +#这里使用子查询先在“t_employee”表中查询出“孙红梅”的薪资。 +#select salary from t_employee where ename = '孙红梅'; + +UPDATE t_employee +SET salary = (SELECT salary FROM t_employee WHERE ename = '孙红梅') +WHERE ename = '李冰冰'; +#You can't specify target table 't_employee' for update in FROM clause' + +UPDATE t_employee +SET salary = (SELECT salary FROM(SELECT salary FROM t_employee WHERE ename = '孙红梅')temp) +WHERE ename = '李冰冰'; +#当update的表和子查询的表是同一个表时,需要将子查询的结果用临时表的方式表示 +#即再套一层子查询,使得update和最外层的子查询不是同一张表 + +#(4)修改“t_employee”表“李冰冰”的薪资与她所在部门的平均薪资一样。 +#子查询,查询李冰冰的部门编号 +#select did from t_employee where ename = '李冰冰'; + +#子查询第二层,查询李冰冰所在部门的平均薪资 +#select avg(salary) from t_employee where did = (select did from t_employee where ename = '李冰冰'); + +#子查询第三层,把第二层的子查询结果当成临时表再查一下结果 +#目的使得和外层的update不是同一张表 +SELECT pingjun FROM (SELECT AVG(salary) pingjun FROM t_employee WHERE did = (SELECT did FROM t_employee WHERE ename = '李冰冰') temp) + +#update更新 +UPDATE t_employee +SET salary = +(SELECT pingjun FROM + (SELECT AVG(salary) pingjun FROM t_employee WHERE did = + (SELECT did FROM t_employee WHERE ename = '李冰冰') ) temp) +WHERE ename = '李冰冰'; +``` + +## DELETE中嵌套子查询 + +```mysql +#delete语句中也可以嵌套子查询 +#(1)从“t_employee”表中删除“测试部”的员工记录。 +DELETE FROM t_employee +WHERE did = (SELECT did FROM t_department WHERE dname = '测试部'); + + +#(2)从“t_employee”表中删除和“李冰冰”同一个部门的员工记录。 +#子查询 “李冰冰”的部门编号 +#select did from t_employee where ename = '李冰冰'; + +DELETE FROM t_employee WHERE did = (SELECT did FROM t_employee WHERE ename = '李冰冰'); +#You can't specify target table 't_employee' for update in FROM clause' +#删除和子查询是同一张表 + +DELETE FROM t_employee WHERE did = (SELECT did FROM (SELECT did FROM t_employee WHERE ename = '李冰冰')temp); +``` + +## 使用子查询复制表结构和数据 + +```mysql +#演示通过子查询复制表, +#(1)复制表结构 +#(2)复制一条或多条记录 +#(3)同时复制表结构和记录 +#仅仅是复制表结构,可以用create语句 +CREATE TABLE department LIKE t_department; + +#使用INSERT语句+子查询,复制数据,此时INSERT不用写values +INSERT INTO department (SELECT * FROM t_department WHERE did<=3); + +#同时复制表结构+数据 +CREATE TABLE d_department AS (SELECT * FROM t_department); +#如果select后面是部分字段,复制的新表就只有这一部分字段 +``` + +# + + + + + +