MySQL:表的增删查改
目录
Create
单行数据
多行数据
插入否则更新
replace替换
Retrieve
select
全列查询
指定列查询
为查询结果指定别名
结果去重
where
模糊匹配
结果排序
升序
降序
筛选分页结果
Update
Delete
删除数据
删除单行
删除整张表数据
截断表
查询插入结果
聚合函数
COUNT
SUM
AVG
MAX
MIN
group by子句
having
在数据库操作中,CRUD是一个常用的缩写,代表了四种基本的数据操作:创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。
基于以下表来进行增删查改
CREATE TABLE students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,gender ENUM('Male', 'Female') NOT NULL,class VARCHAR(50)
);
Create
语法:
INSERT [INTO] table_name [(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
例如:
单行数据
INSERT INTO students (name, age, gender, class) VALUES ('Alice', 20, 'Female', 'Class 1');
INSERT INTO students (name, age, gender, class) VALUES ('Bob', 22, 'Male', 'Class 2');
多行数据
INSERT INTO students (name, age, gender, class) VALUES ('Alice', 20, 'Female', 'Class 1')
, VALUES ('Bob', 22, 'Male', 'Class 2');
插入否则更新
插入数据如果存在则更新
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
例如:
INSERT INTO students (name, age, class)
VALUES ('Alice', 20, 'Class 1')
ON DUPLICATE KEY UPDATEage = VALUES(age),class = VALUES(class);
replace替换
语法:
REPLACE INTO 表名 (列1, 列2, ..., 列N)
VALUES (值1, 值2, ..., 值N);
例如:
REPLACE INTO students (name, age, class)
VALUES ('Alice', 20, 'Class 3');
Retrieve
整体语法:
SELECT [DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
select
全列查询
SELECT * FROM 表名;
指定列查询
SELECT 列1, 列2, ... FROM 表名;
为查询结果指定别名
SELECT 列1 AS 别名1, 列2 [AS] 别名2, ... FROM 表名;
结果去重
SELECT DISTINCT 列1, 列2, ... FROM 表名;
where
比较运算符:
逻辑运算符:
例如:
SELECT * FROM students WHERE age = 20;
SELECT * FROM students WHERE age <> 20;
SELECT * FROM students WHERE age > 20;
SELECT * FROM students WHERE age >= 20;
模糊匹配
LIKE用于模糊匹配字符串,支持以下通配符:
- %:匹配任意数量的字符(包括 0 个字符)。
- _:匹配单个字符。
SELECT * FROM students WHERE name LIKE 'A%';
结果排序
基本语法:
SELECT 列名 FROM 表名
ORDER BY 列1 [ASC|DESC], 列2 [ASC|DESC], ...;
升序
SELECT * FROM 表名 ORDER BY 列名 [ASC];
降序
SELECT * FROM 表名 ORDER BY 列名 DESC;
筛选分页结果
语法:
SELECT 列名 FROM 表名
LIMIT 起始记录偏移量, 返回记录数量;
起始记录偏移量:从哪一条记录开始返回(从 0 开始计数)。
返回记录数量:最多返回的记录数量。
Update
update语句用于修改表中的数据。
你可以更新表中的一行或多行记录,或者更新特定列的值。
语法:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
例如:
UPDATE students
SET name = 'Alice Smith', age = 22
WHERE id = 1;
将id=1的学生名字改为'Alice Smith',年龄改为22
Delete
删除数据
delete语句用于从表中删除数据。
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
例如:
删除单行
DELETE FROM students
WHERE id = 2;
这样就删除了students表中当前行id=2的这一行
删除整张表数据
DELETE FROM table_name;
截断表
截断表TRUNCATE TABLE是一种快速清空表中所有数据的语句。
它与DELETE语句的主要区别在于,TRUNCATE的执行效率更高,因为它不会逐行删除记录,而是直接删除表并重新创建一个空表。
语法:
TRUNCATE [TABLE] table_name
功能:
- 只能对整表操作,不能像 DELETE 一样针对部分数据操作
- TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
- 会重置 AUTO_INCREMENT 项
查询插入结果
查询插入结果通常是指在执行INSERT操作后,获取刚刚插入的记录的相关信息
语法:
INSERT INTO table_name [(column [, column ...])] SELECT ...
例如:
CREATE TABLE students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,class VARCHAR(50)
);CREATE TABLE archived_students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,class VARCHAR(50)
);
创建两张表,并为students表中插入数据
INSERT INTO archived_students
SELECT * FROM students;
就可以将在students中查询到的数据插入到archived_students表中
聚合函数
COUNT
COUNT函数用于计算表中行的数量,或者某个列中非NULL值的数量。
语法:
COUNT(*)
COUNT(列名)
COUNT(DISTINCT 列名)
例如:
SELECT COUNT(*) FROM students;
SUM
SUM函数用于计算数值列的总和。
语法:
SUM(列名)
例如:
SELECT SUM(age) FROM students;
AVG
AVG函数用于计算数值列的平均值。
语法:
AVG(列名)
例如:
SELECT AVG(age) FROM students;
MAX
MAX函数用于找出数值列中的最大值。
语法:
MAX(列名)
例如:
SELECT MAX(age) FROM students;
MIN
MIN函数用于找出数值列中的最小值。
语法:
MIN(列名)
例如:
SELECT MIN(age) FROM students;
group by子句
group by子句在 SQL 中用于将查询结果按指定列的值分组。
语法:
SELECT 列1, 列2, 聚合函数(列3)
FROM 表名
GROUP BY 列1, 列2;
例如:
假设有如下表:
id | name | age | class
---|-------|-----|-------
1 | Alice | 20 | Class 1
2 | Bob | 22 | Class 2
3 | Carol | 21 | Class 1
4 | Dave | 23 | Class 2
5 | Eve | 20 | Class 1
我们可以对从class进行分组,这样就能分为两组,分别为Class1和Class2
SELECT class, COUNT(*) AS student_count
FROM students
GROUP BY class;
Class1有3行,Class2有2行,所以结果为:
class | student_count
---------|---------------
Class 1 | 3
Class 2 | 2
针对这里的聚合函数,我们如果想用条件来筛选(例如需要指定表中人的姓名为某某),这时候用where语句是会报错的,因为执行顺序where是在FROM之后GROUP BY之前的
having
having子句用于对分组后的结果进行筛选,类似于where子句,但having是在分组后应用的。
例如:
找出学生数量大于2的班级
SELECT class, COUNT(*) AS student_count
FROM students
GROUP BY class
HAVING COUNT(*) > 2;
select、from、where、group by、having执行的先后顺序为:
1. from
2. where
3. group by
4. having
5. select
having是经常搭配group by使用的
完