插入数据(增)
USE atguigudb;CREATE TABLE IF NOT EXISTS emp1(id INT,`name` VARCHAR(15),hire_date DATE,salary DOUBLE(10,2))DESC emp1;
方式1:一条一条的添加数据
没有指明添加的字段,需要按照声明的字段的先后顺序添加
INSERT INTO emp1 //正确的VALUES (1,'Tom','2000-12-21',3400)
INSERT INTO emp1 //错误的VALUES (2,3400,'2000-12-21','Tom')
指明要添加的字段(推荐) ```sql INSERT INTO emp1(id,hire_date,salary,name) VALUE(2,’1999-12-21’,4000,’Jerry’)
说明:若没有赋值,则值为null
- 同时插入多条记录```sqlINSERT INTO emp1(id,name,salary)VALUES(4,'Jim',5000),(5,'sdf',4999)
方式2:将查询结果插入到表中
- 查询的字段一定要与添加到的表的字段一一对应 ```sql 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)
- 说明:emp1表中要添加数据的字段的长度不能低于employees表中查询的字段的长度- 如果emp1表中要添加数据的字段的长度低于employees表中查询的字段的长度的话,就有添加不成功的风险<a name="Zejui"></a># 更新数据(改)- update可以实现批量修改数据(看where)```sqlUPDATE ... SET ... WHERE ...
UPDATE emp1SET hire_date = CURDATE()WHERE id = 5;
- 同时修改一条数据的多个字段
UPDATE emp1SET hire_date = CURDATE(),salary = 6000WHERE id = 4;
题目:将表中姓名中包含字符a的提薪20%
UPDATE emp1SET salary = salary * 1.2WHERE name LIKE '%a%';
- 修改数据时,可能存在不成功的情况。(可能是由于约束的影响造成的)
UPDATE employeesSET department_id = 10000WHERE employee_id = 102
删除数据(删)
DELETE FROM ... WHERE ...
DELETE emp1WHERE id = 1;
在删除数据时,也有可能因为约束的影响,导致删除失败
DELETE FROM departmentsWHERE department_id = 50
DML操作默认情况下,执行完后都会自动提交数据
- 如果希望执行完后不自动提交数据,则需要使用 SET autocommit = FALSE
计算列
某一列的值时通过别的列计算得来的
- 字段c即为计算列
```sql INSERT INTO test1(a,b) VALUES(10,20)CREATE TABLE test1(a INT,b INT,c INT GENERATED ALWAYS AS (a + b) VIRTUAL);
SELECT * FROM test1; //c = 30
UPDATE test1 SET a = 100 //相应的c也会变成 120
<a name="hdIoN"></a># 综合案例1. 创建数据库test01_library```sqlCREATE DATABASES IF NOT EXISTS test01_library CHARACTER SET 'utf8'
- 创建表books
``sql CREATE TABLE IF NOT EXISTS books( id INT,nameVARCHAR(50),authors` VARCHAR(50), price FLOAT, pubdate YEAR, note VARCHAR(100), num INT )
DESC books;
3. 向books表中插入记录1. 不指定字段名称,插入第一条记录```sqlINSERT INTO booksVALUES(1,'Tal of AAA','Dickes',23,'1995','novel',11);
指定所有字段名称,插入第二条记录
INSERT INTO books(id,`name`,`authors`,price,pubdate,note,num)VALUES(2,'EmmaT','Jane lura',35,'1993','joke',22);
同时插入多条记录,插入剩下所有的记录
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);
将小说类型的书的价格都增加5
UPDATE booksSET price = price + 5WHERE note = 'novel'
将名称为 EmmaT的书的价格改成40,并将说明改为drama
UPDATE booksSET price = 40,note = 'drama'WHERE `name` = 'EmmaT'
删除库存为0的记录
DELETE FROM booksWHERE num = 0
统计书名中包含a字母的书
SELECT `name`FROM booksWHERE `name` LIKE '%a%';
统计书名中包含字母a的书的数量和库存总量
SELECT COUNT(*),SUM(num)FROM booksWHERE `name` LIKE '%a%';
找出”novel”类型的书,按照价格降序排列
SELECT `name`,noteFROM booksWHERE note = 'novel'ORDER BY price DESC;
查询图书信息,按照库存量降序排列,如果库存量相同的按照note升序排列
SELECT *FROM booksORDER BY num DESC,note ASC;
按照note分类统计书的数量
SELECT note,COUNT(*)FROM booksGROUP BY note;
按照note分类统计书的库存量,显示库存量超过30本的
SELECT note,SUM(num)FROM booksGROUP BY noteHAVING SUM(num) > 30;
查询所有图书,每页显示5本,显示第二页
SELECT *FROM booksLIMIT 5,5
按照note分类统计书的库存量,显示库存量最多的
SELECT note,SUM(num) sum_numFROM booksGROUP BY noteORDER BY sum_num DESCLIMIT 0,1;
查询书名达10个字符的书,不包括里面的空格
``sql SELECT CHAR_LENGTH(REPLACE(name`,’ ‘,’’)) 先用’’来替换空格 FROM books
SELECT ‘name’
FROM books
WHERE CHAR_LENGTH(REPLACE(name,’ ‘,’’)) >= 10
16. 查询书名和类型,其中note值为novel显示小说,law显示法律,medicine显示医药,cartoon显示卡通,joke显示笑话```sqlSELECT `name` "书名",note,CASE note WHEN 'novel' THEN '小说'WHEN 'law' THEN '法律'WHEN 'medicine' THEN '医药'WHEN 'cartoon' THEN '卡通'WHEN 'joke' THEN '笑话'ELSE '其他'END '类型'FROM books
查询书名、库存,其中num值超过30本的,显示滞销,大于0并且低于10的显示畅销,为零的显示需要无货
SELECT `name` AS "书名",num "库存",CASE WHEN num > 30 THEN '滞销'WHEN num > 0 AND num < 10 THEN '畅销'WHEN num = 0 THEN '无货'END "显示状态"FROM books
统计每一种note的库存量,并合计总量
SELECT IFNULL(note,'合计库存总量') note,SUM(num)FROM booksGROUP BY note WITH ROLLUP;
统计每一种note的数量,并合计总量
SELECT IFNULL(note,'合计总量') note,COUNT(*)FROM booksGROUP BY note WITH ROLLUP;
统计库存量前三名的图书
SELECT *FROM booksORDER BY num DESCLIMIT 0,3
找出最早出版的一本书
SELECT *FROM booksORDER BY pubdate ASCLIMIT 0,1
找出novel中价格最高的一本书
SELECT *FROM booksWHERE note = 'novel'ORDER BY price DESCLIMIT 0,1
找出书名中字数最多的书,不含空格
SELECT *FROM booksORDER BY CHAR_LENGTH(REPLACE(`name`,' ','')) DESCLIMIT 0,1;
