1.插入数据
为了演示,事先新建一张表,名为emp1:
sql
CREATE TABLE IF NOT EXISTS emp1(
id INT,
`name` VARCHAR(15),
hire_date DATE,
salary DOUBLE(10,2)
);
1.1 方式1:VALUES 的方式添加
该语法一次只能向表中插入一条数据。
(1)按照表的字段默认顺序插入数据
sql
INSERT INTO emp1
VALUES(1,'Tom','2000-1-1',3500);

- 值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。
(2)为表的指定字段插入数据✅️
sql
INSERT INTO emp1(salary,id,`name`,hire_date)
VALUES(2800,2,'Jerry','2016-1-21');

当INSERT语句中只向部分字段中插入值,则其他字段值为定义表时的默认值
sql
INSERT INTO emp1(salary,id,`name`)
VALUES(4000,3,'Kobe');

(3)同时插入多条数据
sql
INSERT INTO emp1(salary,id,`name`)
VALUES(4500,4,'Join'),(5500,5,'Jim');

注意:插入多条记录时最好选择使用单条INSERT语句插多条数据的方式。
1.2 方式2:将查询结果插入到表中
- 使用一条INSERT语句和一条SELECT语句组成的组合语句即可快速地从一个或多个表中向一个表中插入多行。
sql
INSERT INTO emp1(salary,id,`name`,hire_date)
SELECT salary,employee_id,last_name,hire_date # 查询字段要与添加表的字段一一对应
FROM employees
WHERE department_id IN(60,70);

注意:该方式中新表字段长应当大于或等于查询表对应字段长度,否则会有问题。
2.更新数据
更新 Join 的入职时间:
sql
UPDATE emp1
SET hire_date = CURDATE()
WHERE id = 4;

- 如果省略 WHERE 子句,则表中的所有数据都将被更新;
更新 Kobe 的入职时间以及薪资:
sql
UPDATE emp1
SET hire_date = CURDATE(),salary = 6000
WHERE id = 3;

修改数据可能不成功:(由于约束的影响)
sql
UPDATE employees
SET department_id = 55 # 不存在55号部门
WHERE department_id = 110;

3.删除数据
删除 id = 4 的员工信息:
sql
DELETE FROM emp1
WHERE id =4;

- 如果省略 WHERE 子句,则表中的全部数据将被删除;
删除数据可能不成功:(由于约束的影响)
sql
DELETE FROM departments
WHERE department_id = 60;

删掉60号部门,则该部门下的员工无部门的对应关系。
4.计算列
定义:某一列的值是通过别的列计算得来的。例如,a列值为1、b列值为2,c列不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。
- CREATE TABLE 和 ALTER TABLE 中都支持增加计算列;
案例:定义数据表tb1,然后定义字段id、字段a、字段b和字段c,其中字段c为计算列,用于计算a+b的值。
sql
CREATE TABLE tb1(
id INT,
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL
);
插入数据(id=1,a = 19,b = 11)
sql
INSERT INTO tb1(id,a,b)
VALUES(1,19,11);

此时更新 a 或 b,则 c 也随之更新。
5.综合实例
(1)创建数据库test01_library
sql
CREATE DATABASE IF NOT EXISTS test01_library CHARACTER SET 'utf8';
(2)创建表 books,表结构如下:
| 字段名 | 字段说明 | 数据类型 |
|---|---|---|
| id | 书编号 | INT |
| name | 书名 | VARCHAR(50) |
| authors | 作者 | VARCHAR(100) |
| price | 价格 | FLOAT |
| pubdate | 出版日期 | YEAR |
| note | 说明 | VARCHAR(100) |
| num | 库存 | INT |
sql
CREATE TABLE IF NOT EXISTS books(
id INT,
`name` VARCHAR(50),
`authors` VARCHAR(100) ,
price FLOAT,
pubdate YEAR ,
note VARCHAR(100),
num INT
);
(3)向books表中插入记录
| id | 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 |
①不指定字段名称,插入第一条记录
sql
INSERT INTO books
VALUES(1,'Tal of AAA','Dickes',23,1995,'novel',11);
②指定所有字段名称,插入第二记录
sql
INSERT INTO books(id,name,authors,price,pubdate,note,num)
VALUES(2,'EmmaT','Jane lura',35,1993,'joke',22);
③同时插入多条记录(剩下的所有记录)
sql
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
sql
UPDATE books
SET price = price+5
WHERE note = 'novel';

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

(6)删除库存为0的记录
sql
DELETE FROM books
WHERE num = 0;

(7)统计书名中包含a字母的书
sql
SELECT *
FROM books
WHERE `name` LIKE '%a%';

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

(9)找出"novel"类型的书,按照价格降序排列
sql
SELECT *
FROM books
WHERE note = 'novel'
ORDER BY price DESC;

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

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

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

(13)查询所有图书,每页显示5本,显示第二页
sql
SELECT *
FROM books
LIMIT 5,5;

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

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

(16)查询书名和类型,其中note值为 novel显示小说,law显示法律,medicine显示医药,cartoon显示卡通,joke显示笑话
sql
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的显示无货
sql
SELECT `name`,num,CASE num
WHEN num > 30 THEN '滞销'
WHEN num > 0 AND num < 10 THEN '畅销'
WHEN num = 0 THEN '无货'
ELSE '正常'
END "库存状态"
FROM books;

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

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

(20)统计库存量前三名的图书
sql
SELECT *
FROM books
ORDER BY num DESC
LIMIT 3;

(21)找出最早出版的一本书
sql
SELECT *
FROM books
ORDER BY pubdate
LIMIT 1;

(22)找出novel中价格最高的一本书
sql
SELECT *
FROM books
WHERE note = 'novel'
ORDER BY price DESC
LIMIT 1;

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

