#第十一章 数据处理之增删改

#0、储备工作
USE atguigudb;

CREATE TABLE IF NOT EXISTS emp1(
id INT,
`name` VARCHAR(15),
hire_date DATE,
salary DOUBLE(10,2)
);

DESC emp1;

SELECT *
FROM emp1;

#1、添加数据
#方式1：一条一条的添加数据

#(1)没有指明添加的字段
#正确的
INSERT INTO emp1
VALUES (1,'Tom','2000-12-20',3400);#注意：一定要按照声明的字段的先后顺序添加

#错误的
INSERT INTO emp1
VALUES (2,3400,'2000-12-20','Jerry');

#(2)指明要添加的字段（推荐方式）
INSERT INTO emp1(id,hire_date,salary,`name`)
VALUES (2,'2011-12-20',4000,'Jerry');

#说明：没有进行赋值的hire_date的值为null
INSERT INTO emp1(id,salary,`name`)
VALUES (3,4500,'shk');

#（3）同时插入多条记录
INSERT INTO emp1(id,`name`,salary)
VALUES
(4,'Jim',5000),
(5,'孙悟空',5500);

#方式2：将查询结果插入到表中

SELECT * FROM emp1;

INSERT INTO emp1(id,`name`,salary,hire_date)
#查询语句
SELECT employee_id,last_name,salary,hire_date	#查询的字段一定要与添加到的表的字段一一对应
FROM employees
WHERE department_id IN (70,60);

DESC emp1;
DESC employees;

#说明：emp1表中要添加数据的字段的长度不能低于employees表中查询的字段的长度。
#如果emp1表中要添加数据的字段的长度低于employees表中查询的字段的长度的话，
#就有添加不成功的风险。

#2、更新数据（或修改数据）
#UPDATE ... SET ... WHERE ...
#可以实现批量修改数据。（取消WHERE语句就是批量修改）

UPDATE emp1
SET hire_date = CURDATE()
WHERE id = 5;

#同时修改一条数据的多个字段
UPDATE emp1
SET hire_date = CURDATE(),salary = 6000
WHERE id = 4;

#题目：将表中姓名中包含字符a的提薪20%

UPDATE emp1
SET salary = salary * 1.2
WHERE `name` LIKE '%a%';

#修改数据时，是可能存在不成功的情况的。（可能是由于约束的影响造成的）
UPDATE employees
SET department_id = 10000
WHERE employee_id = 102;

#3、删除数据
# DELETE FROM ... WHERE ...

DELETE FROM emp1
WHERE id = 5;

SELECT * FROM emp1;

#在删除数据时，也有可能因为约束的影响，导致删除失败
DELETE FROM departments
WHERE department_id = 50;

#小结：DML操作默认情况下，执行完以后都会自动提交数据，
#如果希望执行完以后不自动提交数据，则需要使用 SET autocommit = FALSE

#4、MySQL8的新特性：计算列
USE atguigudb;

CREATE TABLE test1(
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL #字段c即为计算列
);

INSERT INTO test1(a,b)
VALUES(10,20);

SELECT * FROM test1;

UPDATE test1
SET a = 100;

#5、综合案例（学习笔记第11章，11.5综合案例）
#1、创建数据库test01_library
CREATE DATABASE IF NOT EXISTS test01_library CHARACTER SET 'utf8';

USE test01_library;

#2、创建表books，表结构如下：
CREATE TABLE IF NOT EXISTS books(
id INT,
`name` VARCHAR(50),
`authors` VARCHAR(100),
price FLOAT,
pubdate YEAR,
note VARCHAR(100),
num INT
);

DESC books;

SELECT * FROM books;

#3、向books中插入记录：
#（1）、不指定字段名称，插入第一条记录
#（2）、指定所有字段名称，插入第二条记录
#（3）、同时插入多条记录（剩下的所有记录）

#（1）、不指定字段名称，插入第一条记录
INSERT INTO books
VALUES(1,'Tal of AAA','Dickes',23,'1995','novel',11);

#（2）、指定所有字段名称，插入第二条记录
INSERT INTO books(id,`name`,`authors`,price,pubdate,note,num)
VALUES(2,'EmmaT','Jane lura',35,'1993','joke',22);

#（3）、同时插入多条记录（剩下的所有记录）
INSERT INTO books(id,`name`,`authors`,price,pubdate,note,num)
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);

#4、将小说类型（novel）的书的价格都增加5。
UPDATE books
SET price = price + 5
WHERE note = 'novel';

#5、将名称为EmmaT的书的价格改为40，并将说明改为drama。
UPDATE books
SET price = 40,note = 'drama'
WHERE `name` = 'EmmaT';

SELECT * FROM books;
 
#6、删除库存为0的记录。
DELETE FROM books
WHERE num = 0;

#7、统计书名中包含a字母的书。
SELECT name
FROM books
WHERE name LIKE '%a%';

#8、统计书名中包含a字母的书的数量和库存总量。
SELECT COUNT(*),SUM(num)
FROM books
WHERE name LIKE '%a%';

#9、找出“novel”类型的书，按照价格降序排列。
SELECT *
FROM books
WHERE note = 'novel'
ORDER BY price DESC;

#10、查询图书信息，按照库存量降序排列，如果库存量相同的按照note升序排列。
SELECT *
FROM books
ORDER BY num DESC,note ASC;

#11、按照note分类统计书的数量。
SELECT note,COUNT(*)
FROM books
GROUP BY note;

#12、按照note分类统计书的库存量，显示库存量超过30本的
SELECT note,SUM(num)
FROM books
GROUP BY note
HAVING SUM(num) > 30;

#13、查询所有图书，每页显示5本，显示第二页。
SELECT *
FROM books
LIMIT 5,5;

#14、按照note分类统计书的库存量，显示库存量最多的。
SELECT note,SUM(num) sum_num
FROM books
GROUP BY note
ORDER BY sum_num DESC
LIMIT 0,1;

#15、查询书名达到10个字符的书，不包括里面的空格。
SELECT name
FROM books
WHERE CHAR_LENGTH(REPLACE(name,' ','')) >= 10;

#16、查询书名和类型，其中note值为novel显示小说，law显示法律，medicine显示医药，cartoon显示卡通，joke显示笑话。
SELECT name "书名",note,CASE note WHEN 'novel' THEN '小说'
																	WHEN 'law' THEN '法律'
																	WHEN 'medicine' THEN '医药'
																	WHEN 'cartoon' THEN '卡通'
																	WHEN 'joke' THEN '笑话'
																	ELSE '其他'
																	END "类型"
FROM books;


#17、查询书名、库存，其中num值超过30本的，显示滞销，大于0并低于10的，显示畅销，为0的显示需要无货。
SELECT name AS "书名",num AS "库存",CASE WHEN num > 30 THEN '滞销'
																				 WHEN num > 0 AND num < 10 THEN '畅销'
																				 WHEN num = 0 THEN '无货'
																				 ELSE '正常'
																				 END "显示状态"
FROM books;

#18、统计每一种note的库存量，并合计总量。
SELECT IFNULL(note,'合计库存总量') AS note,SUM(num)
FROM books
GROUP BY note WITH ROLLUP;

#19、统计每一种note的数量，并合计总量。
SELECT IFNULL(note,'合计总量') AS note,COUNT(*)
FROM books
GROUP BY note WITH ROLLUP;

#20、统计库存前三名的图书。
SELECT *
FROM books
ORDER BY num DESC
LIMIT 0,3;

#21、找出最早出版的一本书。
SELECT *
FROM books
ORDER BY pubdate ASC
LIMIT 0,1;

#22、找出novel中价格最高的一本书。
SELECT *
FROM books
WHERE note = 'novel'
ORDER BY price DESC
LIMIT 0,1;

#23、找出书名中字数最多的一本书，不含空格。
SELECT *
FROM books
ORDER BY CHAR_LENGTH(REPLACE(name,' ','')) DESC
LIMIT 0,1;

















