目录
[group by子句](#group by子句)
在数据库操作中,CRUD是一个常用的缩写,代表了四种基本的数据操作:创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。
基于以下表来进行增删查改
cpp
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
语法:
cpp
INSERT [INTO] table_name [(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
例如:
单行数据
cpp
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');
多行数据
cpp
INSERT INTO students (name, age, gender, class)
VALUES ('Alice', 20, 'Female', 'Class 1')
, VALUES ('Bob', 22, 'Male', 'Class 2');
插入否则更新
插入数据如果存在则更新
cpp
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
例如:
cpp
INSERT INTO students (name, age, class)
VALUES ('Alice', 20, 'Class 1')
ON DUPLICATE KEY UPDATE
age = VALUES(age),
class = VALUES(class);
replace替换
语法:
cpp
REPLACE INTO 表名 (列1, 列2, ..., 列N)
VALUES (值1, 值2, ..., 值N);
例如:
cpp
REPLACE INTO students (name, age, class)
VALUES ('Alice', 20, 'Class 3');
Retrieve
整体语法:
cpp
SELECT [DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
select
全列查询
cpp
SELECT * FROM 表名;
指定列查询
cpp
SELECT 列1, 列2, ... FROM 表名;
为查询结果指定别名
cpp
SELECT 列1 AS 别名1, 列2 [AS] 别名2, ... FROM 表名;
结果去重
cpp
SELECT DISTINCT 列1, 列2, ... FROM 表名;
where
比较运算符:

逻辑运算符:

例如:
cpp
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 个字符)。
- _:匹配单个字符。
cpp
SELECT * FROM students WHERE name LIKE 'A%';
结果排序
基本语法:
cpp
SELECT 列名 FROM 表名
ORDER BY 列1 [ASC|DESC], 列2 [ASC|DESC], ...;
升序
cpp
SELECT * FROM 表名 ORDER BY 列名 [ASC];
降序
cpp
SELECT * FROM 表名 ORDER BY 列名 DESC;
筛选分页结果
语法:
cpp
SELECT 列名 FROM 表名
LIMIT 起始记录偏移量, 返回记录数量;
起始记录偏移量:从哪一条记录开始返回(从 0 开始计数)。
返回记录数量:最多返回的记录数量。
Update
update语句用于修改表中的数据。
你可以更新表中的一行或多行记录,或者更新特定列的值。
语法:
cpp
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
例如:
cpp
UPDATE students
SET name = 'Alice Smith', age = 22
WHERE id = 1;
将id=1的学生名字改为'Alice Smith',年龄改为22
Delete
删除数据
delete语句用于从表中删除数据。
语法:
cpp
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
例如:
删除单行
cpp
DELETE FROM students
WHERE id = 2;
这样就删除了students表中当前行id=2的这一行
删除整张表数据
cpp
DELETE FROM table_name;
截断表
截断表TRUNCATE TABLE是一种快速清空表中所有数据的语句。
它与DELETE语句的主要区别在于,TRUNCATE的执行效率更高,因为它不会逐行删除记录,而是直接删除表并重新创建一个空表。
语法:
cpp
TRUNCATE [TABLE] table_name
功能:
- 只能对整表操作,不能像 DELETE 一样针对部分数据操作
- TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
- 会重置 AUTO_INCREMENT 项
查询插入结果
查询插入结果通常是指在执行INSERT操作后,获取刚刚插入的记录的相关信息
语法:
cpp
INSERT INTO table_name [(column [, column ...])] SELECT ...
例如:
cpp
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表中插入数据
cpp
INSERT INTO archived_students
SELECT * FROM students;
就可以将在students中查询到的数据插入到archived_students表中
聚合函数
COUNT
COUNT函数用于计算表中行的数量,或者某个列中非NULL值的数量。
语法:
cpp
COUNT(*)
COUNT(列名)
COUNT(DISTINCT 列名)
例如:
cpp
SELECT COUNT(*) FROM students;
SUM
SUM函数用于计算数值列的总和。
语法:
cpp
SUM(列名)
例如:
cpp
SELECT SUM(age) FROM students;
AVG
AVG函数用于计算数值列的平均值。
语法:
cpp
AVG(列名)
例如:
cpp
SELECT AVG(age) FROM students;
MAX
MAX函数用于找出数值列中的最大值。
语法:
cpp
MAX(列名)
例如:
cpp
SELECT MAX(age) FROM students;
MIN
MIN函数用于找出数值列中的最小值。
语法:
cpp
MIN(列名)
例如:
cpp
SELECT MIN(age) FROM students;
group by子句
group by子句在 SQL 中用于将查询结果按指定列的值分组。
语法:
cpp
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
cpp
SELECT class, COUNT(*) AS student_count
FROM students
GROUP BY class;
Class1有3行,Class2有2行,所以结果为:
cpp
class | student_count
---------|---------------
Class 1 | 3
Class 2 | 2
针对这里的聚合函数,我们如果想用条件来筛选(例如需要指定表中人的姓名为某某),这时候用where语句是会报错的,因为执行顺序where是在FROM之后GROUP BY之前的
having
having子句用于对分组后的结果进行筛选,类似于where子句,但having是在分组后应用的。
例如:
找出学生数量大于2的班级
cpp
SELECT class, COUNT(*) AS student_count
FROM students
GROUP BY class
HAVING COUNT(*) > 2;
select、from、where、group by、having执行的先后顺序为:
from
where
group by
having
select
having是经常搭配group by使用的
完