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;
相关推荐
剩下了什么4 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥5 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉5 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变5 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
WangYaolove13146 小时前
基于python的在线水果销售系统(源码+文档)
python·mysql·django·毕业设计·源码
山岚的运维笔记7 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里8 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科8 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦8 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总8 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法