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;
相关推荐
橘橙黄又青2 小时前
MyBatis篇
数据库·oracle·mybatis
TDengine (老段)2 小时前
TDengine R 语言连接器进阶指南
大数据·开发语言·数据库·r语言·时序数据库·tdengine·涛思数据
不会kao代码的小王2 小时前
深信服超融合 HCI 核心技术解析:aSV、aSAN 与 aNET 的协同架构
运维·服务器·网络·数据库·github
Maggie_ssss_supp2 小时前
Linux-MySQL数据备份与恢复
数据库·mysql
DBA小马哥2 小时前
文档型数据库MongoDB迁移替换:金仓数据库跨地域同步方案解析
数据库·安全·dba
DBA小马哥2 小时前
制造业时序数据管理的演进:从传统数据库到时序数据库的转型之路
数据库·时序数据库·dba
结衣结衣.2 小时前
Redis中的string字符串介绍
数据库·redis·缓存
你才是臭弟弟2 小时前
实时数据库与时序数据库
数据库·时序数据库