MySQL:表的增删查改

目录

Create

单行数据

多行数据

插入否则更新

replace替换

Retrieve

select

全列查询

指定列查询

为查询结果指定别名

结果去重

where

模糊匹配

结果排序

升序

降序

筛选分页结果

Update

Delete

删除数据

删除单行

删除整张表数据

截断表

查询插入结果

聚合函数

COUNT

SUM

AVG

MAX

MIN

[group by子句](#group by子句)

having


在数据库操作中,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执行的先后顺序为:

  1. from

  2. where

  3. group by

  4. having

  5. select

having是经常搭配group by使用的