SQL数据操作实战指南

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;
相关推荐
李广坤18 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12022 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再3 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
WeiXin_DZbishe3 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
tryCbest3 天前
数据库SQL学习
数据库·sql