【MYSQL】增删改查

数据库中的 "增删改查" 是操作数据的四大核心基础操作,对应 SQL 语言的四个核心命令,通俗说就是 "对数据的添加、删除、修改、查询",是所有数据库操作的基石。

增(INSERT)

作用:往数据库表中插入一条或多条新记录。

示例(往学生表加一条新学生数据):

sql 复制代码
INSERT INTO students (student_id, name, age, class) 
VALUES ('2025001', '李四', 18, '高一2班');

删(DELETE)

作用:从表中删除不需要的记录(可按条件删除,避免误删全表)。

示例(删除学号为 2025001 的学生数据):

sql 复制代码
DELETE FROM students WHERE student_id = '2025001';
  • 注意:不加 WHERE 条件会删除表中所有数据,需谨慎使用。

改(UPDATE)

作用:更新表中已存在的记录(比如修改学生年龄、班级等)。

示例(将学号 2025001 的学生年龄改为 19):

sql 复制代码
UPDATE students SET age = 19 WHERE student_id = '2025001';

如果我们需要修改或更新 MySQL 中的数据,我们可以使用 UPDATE 命令来操作。

sql 复制代码
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

update的作用和应用

  1. 更新单个列的值:
sql 复制代码
UPDATE employees
SET salary = 60000
WHERE employee_id = 101;
  1. 更新多个列的值:
sql 复制代码
UPDATE orders
SET status = 'Shipped', ship_date = '2023-03-01'
WHERE order_id = 1001;
  1. 使用表达式更新值:
sql 复制代码
UPDATE products
SET price = price * 1.1
WHERE category = 'Electronics';
  1. 更新使用子查询的值:
sql 复制代码
UPDATE customers
SET total_purchases = (
    SELECT SUM(amount)
    FROM orders
    WHERE orders.customer_id = customers.customer_id
)
WHERE customer_type = 'Premium';

查(SELECT)

作用:从表中筛选、提取需要的数据(最常用,可灵活组合条件)。

示例(查询高一 2 班所有学生的姓名和年龄):

sql 复制代码
SELECT name, age FROM students WHERE class = '高一2班';

语法

sql 复制代码
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column_name [ASC | DESC]]
[LIMIT number];

select 的使用

sql 复制代码
-- 选择所有列的所有行
SELECT * FROM users;

-- 选择特定列的所有行
SELECT username, email FROM users;

-- 添加 WHERE 子句,选择满足条件的行
SELECT * FROM users WHERE is_active = TRUE;

-- 添加 ORDER BY 子句,按照某列的升序排序
SELECT * FROM users ORDER BY birthdate;

-- 添加 ORDER BY 子句,按照某列的降序排序
SELECT * FROM users ORDER BY birthdate DESC;

-- 添加 LIMIT 子句,限制返回的行数
SELECT * FROM users LIMIT 10;

WHERE 子句中,你可以使用各种条件运算符(如 =, <, >, <=, >=, !=),逻辑运算符(如 AND, OR, NOT),以及通配符(如 %)等。

以下是一些进阶的 SELECT 语句实例:

sql 复制代码
-- 使用 AND 运算符和通配符
SELECT * FROM users WHERE username LIKE 'j%' AND is_active = TRUE;

-- 使用 OR 运算符
SELECT * FROM users WHERE is_active = TRUE OR birthdate < '1990-01-01';

-- 使用 IN 子句
SELECT * FROM users WHERE birthdate IN ('1990-01-01', '1992-03-15', '1993-05-03');

核心总结

  • 增删改查对应 SQL 命令:INSERTDELETEUPDATESELECT
  • 核心目的:实现数据的 "新增录入、清理无用、修正错误、按需提取",覆盖数据生命周期的核心操作。

增删改查 (CRUD)和**CREATE** 建表是 "先有容器,再有操作" 的关系 ------CREATE 负责创建存储数据的 "容器"(表),增删改查负责对 "容器" 里的数据进行具体操作,二者是数据库使用的两个核心环节,缺一不可。

CREATE增加

语法

sql 复制代码
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
);

举例子:

sql 复制代码
-- AUTO_INCREMENT 关键字用于创建一个自增长的列,PRIMARY KEY 用于定义主键
CREATE TABLE student (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    birthdate DATE,
    is_active BOOLEAN DEFAULT TRUE
);

如果你希望在创建表时指定数据引擎,字符集和排序规则等,可以使用 CHARACTER SETCOLLATE 子句:

sql 复制代码
CREATE TABLE mytable (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

以上代码创建一个使用 utf8mb4 字符集和 utf8mb4_general_ci 排序规则的表。

UNION 操作符

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合,并去除重复的行。(eg:即如果某个 student_id 同时满足两个查询条件,最终结果中只保留一次)

UNION 操作符必须由两个或多个 SELECT 语句 组成,每个 SELECT 语句的列数和对应位置的数据类型必须相同。

1.基本语法

sql 复制代码
SELECT column1, column2, ...
FROM table1
WHERE condition1
UNION
SELECT column1, column2, ...
FROM table2
WHERE condition2
[ORDER BY column1, column2, ...];

ORDER BY 子句是一个可选的子句,用于指定合并后的结果集的排序顺序。

2.列数和对应位置的数据类型不相同的报错示例:

sql 复制代码
-- 第一个 SELECT 查 2 列,第二个查 1 列,列数不同,报错
SELECT name, age FROM students
UNION
SELECT score FROM scores;

-- 第一个列是 INT,第二个列是 VARCHAR(存储非数字),类型不兼容,报错
SELECT student_id FROM students
UNION
SELECT name FROM scores;
  1. 使用 UNION ALL 不去除重复行:
sql 复制代码
select student_id from students where class like "高一(%)班"
union ALL
select student_id from scores where chinese>80;

运行结果

ORDER BY(排序) 语句

MySQL 表中使用 SELECT 语句来读取数据。

如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

MySQL ORDER BY(排序) 语句可以按照一个或多个列的值进行升序(ASC)或降序(DESC)排序。

GROUP BY 语句

GROUP BY 语句根据一个或多个列对结果集进行分组。

在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

GROUP BY 语句是 SQL 查询中用于汇总和分析数据的重要工具,尤其在处理大量数据时,它能够提供有用的汇总信息。

语法

sql 复制代码
SELECT 列名, COUNT(*) AS 别名
FROM 表名
GROUP BY 列名;

举例:

sql 复制代码
-- 统计男女人数
select sex ,count(*) as 人数 from students group by sex;

运行结果

联合查询

联合查询(JOIN)是数据库中用于从多个表中获取关联数据的查询方式,它通过表之间的共同字段(通常是主键和外键)将不同表的记录连接起来,就像把多个表格中相关联的信息 "拼接" 在一起,方便一次性获取完整数据。

举个例子:假设有两个表,student表(存储学生 ID、姓名)和score表(存储学生 ID、科目、分数),通过 "学生 ID" 这个共同字段,用联合查询可以一次性查出 "学生姓名 + 对应科目分数" 的完整信息,而不用分别查两个表再手动对应。

常见的联合查询类型有:

内连接(INNER JOIN) :只保留两个表中匹配成功的记录(即 "交集"),比如只查有分数记录的学生。
左连接(LEFT JOIN) :保留左表所有记录,右表中没有匹配的部分用 NULL 填充,比如查所有学生的分数,包括没参加考试的(分数为 NULL)。
右连接(RIGHT JOIN):与左连接相反,保留右表所有记录,左表无匹配的用 NULL 填充。

基本语法(以两表内连接为例):

sql 复制代码
SELECT 表1.字段, 表2.字段
FROM 表1
INNER JOIN 表2 
ON 表1.关联字段 = 表2.关联字段;

联合查询的核心 是通过ON指定关联条件,确保不同表的记录能正确 "配对",是处理多表数据关联的重要手段。

作用:仅返回 "既在 students 表有记录,又在 scores 表有对应成绩" 的学生,即两表匹配的交集

NULL

我们已经知道 MySQL 使用 SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。

在 MySQL 中,NULL 用于表示缺失的或未知的数据,处理 NULL 值需要特别小心,因为在数据库中它可能会导致不同于预期的结果。

为了处理这种情况,MySQL提供了三大运算符:

  • IS NULL: 当列的值是 NULL,此运算符返回 true。
  • IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
  • <=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。

关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 NULL,即 NULL = NULL 返回 NULL 。

MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。

LIKE 子句

子句是在 MySQL 中用于在 WHERE 子句中进行模糊匹配的关键字。它通常与通配符一起使用,用于搜索符合某种模式的字符串。

LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。

如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。

正则表达式(REGEXP)

我们已经了解到 MySQL 可以通过 LIKE ...% 来进行模糊匹配

MySQL 同样也支持其他正则表达式的匹配, MySQL 中使用 REGEXP 和 RLIKE操作符来进行正则表达式匹配.

语法

sql 复制代码
SELECT 字段名 FROM 表名 WHERE 字段名 REGEXP '正则模式';

作用:筛选出 "字段值满足正则模式" 的记录。

区别于 LIKELIKE 需手动加 % 表示模糊(如 LIKE '%张%'),REGEXP 默认是 "包含匹配",无需额外通配符。

常用正则模式(带场景示例)

实用进阶场景

1. 匹配手机号(11 位数字,以 1 开头)
sql 复制代码
SELECT * FROM students WHERE phone REGEXP '^1[0-9]{10}$';
  • 解析:^1 开头是 1,[0-9]{10} 后面跟 10 位数字,$ 结束,确保刚好 11 位。
2. 匹配姓名(2-4 个汉字,不含数字和字母)
sql 复制代码
SELECT * FROM students WHERE name REGEXP '^[一-龥]{2,4}$';
  • 解析:[一-龥] 匹配任意汉字,{2,4} 限制长度 2-4 位,避免异常姓名(如 "李 123""张小明 666")。
3. 匹配包含特定字符组合的记录(如 "张" 且 "伟",顺序不限)
sql 复制代码
SELECT * FROM students WHERE name REGEXP '张.*伟|伟.*张';
  • 解析:张.*伟 表示 "张" 后面任意字符(.* 匹配 0 个及以上任意字符)再接 "伟",| 表示 "或",覆盖 "张伟""张宏伟""李伟明" 等情况。

REGEXP 与 LIKE 对比(什么时候用哪个?)

事务

MySQL 事务主要用于处理操作量大,复杂度高 的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!它们被视为一个单独的工作单元。

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

InnoDB 引擎(主流默认引擎)完全支持事务,其他引擎(如 MyISAM)不支持

事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

事务用来管理 insert、update、delete 语句

一般来说,事务是必须满足4个条件(ACID):原子性(A tomicity,或称不可分割性)、一致性(C onsistency)、隔离性(I solation,又称独立性)、持久性(Durability)。

**原子性:**一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

**一致性:**在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

**隔离性:**数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

**持久性:**事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

举例:

sql 复制代码
-- 开始事务
START TRANSACTION;

-- 执行一些SQL语句
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

-- 判断是否要提交还是回滚
IF (条件) THEN
    COMMIT; -- 提交事务
ELSE
    ROLLBACK; -- 回滚事务
END IF;

**联想理解:(来自菜鸟教程评论区)**假如有这样一款游戏,游戏分为一个个关卡,单个关卡内需要打败很多Boss才能闯关成功,每个关卡闯关成功游戏会自动进行记录游戏进度,并将游戏进度上传远程服务器,除非重置游戏,否则游戏进度不可回退。

原子性:最小操作逻辑,不可再进行分割; 就像游戏的一个关卡一样,关卡内不管闯到什么地方,只要失败了就会回到闯关卡前。

事务,将原本是一系列的数据库操作包裹成一个关卡(一个原子操作),要么闯过关卡,要么回到关卡前。

持久性:当事务执行完毕(事务提交),该操作将永久的改变了数据库中的数据。 即关卡闯关完成,游戏进度永久保存在了服务器中。

事务,能保证AID,即原子性,隔离性,持久性。 但是一致性无法通过事务来保证,一致性依赖于应用层,开发者。

ALTER 命令

当我们需要修改数据表名 或者修改数据表字段时,就需要使用到 MySQL ALTER 命令。

MySQL 的 ALTER 命令用于修改数据库、表和索引等对象的结构。

sql 复制代码
ALTER TABLE table_name
ADD COLUMN new_column_name datatype;

举例操作:

一、修改表结构(以 students 表为例)

sql 复制代码
-- 新增字段age,默认值为16
ALTER TABLE students 
ADD COLUMN age INT DEFAULT 16;

-- 其余修改操作
--将 students 表中 age 字段的默认值改为 15:
ALTER TABLE students 
MODIFY COLUMN age INT DEFAULT 15;

-- 删除 students 表中 "age" 字段:
ALTER TABLE students 
DROP COLUMN age;

执行后,students 表会新增 age 列,默认值为 16。

二、修改表名(可选操作)

若要将 scores 表重命名为 student_scores

sql 复制代码
-- 若要将 scores 表重命名为 student_scores:
ALTER TABLE scores 
RENAME TO student_scores;

三、修改字段名

students 表中 class 字段重命名为 class_name

sql 复制代码
ALTER TABLE students 
CHANGE COLUMN class class_name VARCHAR(20);

索引

MySQL 索引是一种数据结构,用于加快数据库查询的速度和性能

MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高 MySQL 的检索速度。

一、在students表创建索引

1. 单字段索引(加速按student_id的查询)
sql 复制代码
CREATE INDEX idx_student_id 
ON students(student_id);
  • 作用:当执行 SELECT * FROM students WHERE student_id = '20250001'; 时,索引会快速定位到该学号的记录,提升查询速度。
2. 复合索引(加速按classsex的组合查询)
sql 复制代码
CREATE INDEX idx_class_sex 
ON students(class, sex);
  • 作用:当执行 SELECT * FROM students WHERE class = '高一(3)班' AND sex = '男'; 时,复合索引会同时匹配classsex,比单字段查询更高效。

二、在scores表创建索引

1. 单字段索引(加速按chinese成绩的范围查询)
sql 复制代码
CREATE INDEX idx_chinese 
ON scores(chinese);
  • 作用:当执行 SELECT * FROM scores WHERE chinese > 90; 时,索引会快速筛选出语文成绩>90 的记录。
2. 唯一索引(保证student_idscores表中唯一,避免重复)
sql 复制代码
CREATE UNIQUE INDEX idx_unique_student_id 
ON scores(student_id);
  • 作用:scores表中每个student_id只能出现一次,若插入重复学号会直接报错,保证数据唯一性。

三、查看与删除索引(可选操作)

查看索引:

sql 复制代码
SHOW INDEX FROM students;
SHOW INDEX FROM scores;
show index from xxx;

删除索引:

sql 复制代码
DROP INDEX idx_student_id ON students;
DROP INDEX idx_chinese ON scores;

索引的作用总结

提升查询速度:通过索引结构(如 B + 树)快速定位数据,避免全表扫描。

保证数据唯一性:唯一索引可防止关键字段重复(如学号、身份证号)。

注意事项:索引会占用额外存储空间,且在插入、更新、删除数据时会增加开销,因此需根据查询场景合理创建(高频查询字段优先建索引,低频字段或小表可不用)。

临时表

一、什么是临时表?

它是临时创建的表,只在当前数据库会话(比如你打开一个查询窗口操作数据库的这段时间)内有效。

会话结束(比如关闭查询窗口),临时表会自动删除,不会占用数据库长期空间。

二、什么时候用临时表?

比如你要统计 "高一年级学生的平均成绩",但步骤很繁琐:

  1. 先从学生表筛选出高一年级的学生;
  2. 再关联成绩表计算他们的平均分;
  3. 最后可能还要和其他数据合并。这时候可以用临时表分步存储中间结果,让操作更清晰。

三、怎么创建和使用临时表?

示例:统计高一年级学生的平均数学成绩
sql 复制代码
-- 步骤1:创建临时表,存储高一年级学生的学号
CREATE TEMPORARY TABLE temp_grade1_students
SELECT student_id 
FROM students 
WHERE class LIKE '高一%';

-- 步骤2:关联临时表和成绩表,计算平均分
SELECT t.student_id, s.name, AVG(sc.math) AS 数学平均分
FROM temp_grade1_students t
JOIN students s ON t.student_id = s.student_id
JOIN scores sc ON t.student_id = sc.student_id
GROUP BY t.student_id, s.name;

-- 步骤3:会话结束后,temp_grade1_students 会自动删除,无需手动清理

四、临时表的特点

  • 会话私有:你创建的临时表,其他用户看不到,也不会互相干扰。
  • 自动删除 :关闭查询窗口(或结束数据库连接)后,临时表会被自动删除,不用手动 DROP
  • 支持所有操作:和普通表一样,能插入、删除、查询、关联,只是生命周期短。

总结

临时表就像 "临时的中转站",适合处理复杂的多步骤数据计算,把大任务拆成小步骤,每一步的结果存在临时表里,最后再汇总。用完自动消失,不用操心清理,非常灵活。

复制表

可以理解为 "创建一个和原表结构、数据一样的新表"

一、复制表结构 + 数据(完全复制)

sql 复制代码
CREATE TABLE 新表名 
AS 
SELECT * FROM 原表名;

比如复制 students 表到 students_copy;

sql 复制代码
CREATE TABLE students_copy AS SELECT * FROM students;

执行后,students_copy 会和 students 有完全一样的结构和数据。

二、只复制表结构(不含数据)

sql 复制代码
CREATE TABLE 新表名 
AS 
SELECT * FROM 原表名 WHERE 1=0;

WHERE 1=0 是个永假条件,所以只会复制结构,不会复制数据。例如:

sql 复制代码
CREATE TABLE students_structure AS SELECT * FROM students WHERE 1=0;

三、复制部分列或部分数据

如果只需要复制原表的部分列,或筛选部分数据,可以在 SELECT 中指定:

sql 复制代码
-- 只复制学号和姓名列,且只复制高一年级的学生
CREATE TABLE students_grade1 AS 
SELECT student_id, name 
FROM students 
WHERE class LIKE '高一%';

四、复制表并带索引、约束(更完整的复制)

如果原表有主键、唯一索引等约束,可先复制结构,再插入数据:

sql 复制代码
-- 步骤1:复制结构(含约束)
CREATE TABLE students_full LIKE students;
-- 步骤2:复制数据
INSERT INTO students_full SELECT * FROM students;

总结

复制表就像 "复印文件":

完全复制:连内容带格式一起复印;

只复制结构:只复印空白的表格模板;

部分复制:只复印某几列或某几行的内容。根据需求选择对应的 SQL 方式即可。

使用 mysqldump 命令

mysqldump 命令可以用于备份和还原 MySQL 数据库。

sql 复制代码
# 语法:mysqldump -u 用户名 -p 数据库名 > 备份文件路径.sql
mysqldump -u root -p school > /home/backup/school_backup_20251025.sql

处理重复数据

sql 复制代码
CREATE TABLE person_tbl
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);

导出数据

sql 复制代码
SELECT id, name, email
INTO OUTFILE '/tmp/user_data.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
FROM users;

聚合函数

对数据库表中一列数据进行 "汇总计算" 的工具

1. COUNT ():统计 "记录行数"

  • 作用:计算满足条件的记录有多少条(比如 "多少个学生""多少个余额大于 1000 的账户")。

  • 语法:COUNT(字段名)COUNT(*)(统计所有行,包括字段为 NULL 的情况)。

  • 示例(统计学生表中所有学生的数量):

    sql 复制代码
    SELECT COUNT(*) FROM students;  -- 结果是学生表的总记录数(比如50)
  • 示例(统计高一年级的学生数量):

    sql 复制代码
    SELECT COUNT(student_id) FROM students WHERE class = '高一';  -- 结果是高一年级学生数(比如20)

2. SUM ():计算 "数值总和"

  • 作用:对一列数值类型的数据求和(比如 "所有学生的年龄总和""所有账户的余额总和")。

  • 语法:SUM(数值字段名)(仅对非 NULL 的数值计算,NULL 会被忽略)。

  • 示例(计算所有账户的余额总和):

    sql 复制代码
    SELECT SUM(balance) FROM accounts;  -- 结果是所有用户余额相加的总和(比如50000)
  • 示例(计算高一年级学生的年龄总和):

    sql 复制代码
    SELECT SUM(age) FROM students WHERE class = '高一';  -- 结果是高一所有学生年龄相加(比如420)

3. AVG ():计算 "数值平均值"

作用:对一列数值类型的数据求平均(比如 "学生的平均年龄""账户的平均余额")。

语法:AVG(数值字段名)(计算逻辑:总和 ÷ 非 NULL 记录数,NULL 会被忽略)。

示例(计算所有学生的平均年龄):

sql 复制代码
SELECT AVG(age) FROM students;  -- 结果是所有学生年龄的平均值(比如18.5)

示例(计算高一年级学生的平均余额):

sql 复制代码
SELECT AVG(balance) FROM accounts WHERE user_id IN (SELECT student_id FROM students WHERE class = '高一');

作用:对所有行的指定列进行平均值运算;

sql 复制代码
 select avg(列名)from [表名];

4. MAX ():获取 "最大值"

作用:从指定的数值型字段中,找出最大的那个值(非数值字段不适用)。

语法:MAX(数值字段名)(忽略 NULL 值,仅对非 NULL 数据计算)。

示例(场景化用法):

sql 复制代码
-- 1. 查账户表中最高的余额(最有钱的用户余额)
SELECT MAX(balance) FROM accounts;  -- 结果如 20000 元

-- 2. 查高一年级学生的最大年龄(年级里年龄最大的学生)
SELECT MAX(age) FROM students WHERE class = '高一';  -- 结果如 20 岁

-- 3. 查每个班级的最高成绩(按班级分组找最大值)
SELECT class, MAX(score) FROM scores GROUP BY class;  -- 结果如"高一1班:98分"

5. MIN ():获取 "最小值"

作用:从指定的数值型字段中,找出最小的那个值(非数值字段不适用)。

语法:MIN(数值字段名)(同样忽略 NULL 值)。

示例(场景化用法):

sql 复制代码
-- 1. 查账户表中最低的余额(余额最少的用户)
SELECT MIN(balance) FROM accounts;  -- 结果如 10 元

-- 2. 查所有学生的最小年龄(最年轻的学生)
SELECT MIN(age) FROM students;  -- 结果如 16 岁

-- 3. 查数学成绩的最低分(且只显示分数,给结果起别名)
SELECT MIN(math_score) AS 数学最低分 FROM scores;  -- 结果列名为"数学最低分",值如 30 分

数据库的三大范式

1、第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。

2、第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。

3、第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。

SQL 注入:

SQL 注入可以简单理解为:"钻数据库的空子,用恶意输入的内容改变原本 SQL 语句的意思,达到非法操作的目的"

举个生活中的例子:你去餐厅吃饭,服务员问你:"需要加鸡蛋吗?" 正常回答是 "加" 或 "不加"。但如果有人说:"不加,而且把隔壁桌的账单算到我这儿"------ 这就相当于 "注入",用额外的话改变了原本的规则。

在数据库里是这样的:假设一个登录页面,背后的 SQL 语句是:

sql 复制代码
SELECT * FROM users WHERE username = '用户输入的名字' AND password = '用户输入的密码'

正常情况下,你输入 username=张三password=123,语句会变成:

sql 复制代码
SELECT * FROM users WHERE username = '张三' AND password = '123'  -- 正常验证

但如果有人在 username 里输入:' ' OR '1'='1'(注意带单引号),密码随便输,语句就会变成:

sql 复制代码
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '随便输'

因为 '1'='1' 永远是真,所以这个语句会返回所有用户的信息,相当于 "绕过密码直接登录"------ 这就是最典型的 SQL 注入。

核心原理 :程序没有过滤用户输入的特殊字符(比如单引号、OR-- 等),导致用户输入的内容被当成 SQL 代码的一部分执行,改变了原本的逻辑。

后果 :可能被偷数据(比如查看所有用户密码)、删数据(比如注入 DELETE 语句)、甚至控制整个数据库。

怎么防:简单说就是 "不让用户输入的内容直接变成 SQL 代码",比如用 "参数化查询"(让数据库把用户输入当成纯文本,不解析成代码),或者过滤掉特殊字符。

举例练习使用sql语句

假设你想新增一个'角色'的列,SQL 语句如下:

sql 复制代码
alter table student add column(role varchar(20),salary int);


alter table 表名 add column 字段名 字段类型

假设你想把张三的 role 改为某个具体值(比如 '教师'),SQL 语句如下:

sql 复制代码
UPDATE student 
SET role = '教师' 
WHERE name = '张三';

假设你想同时把张三和米菲的 role 改为某个具体值(比如 '教师'),SQL 语句如下:

sql 复制代码
UPDATE student
SET role = '老师'
WHERE name IN ('张三', '米菲');

菜鸟教程,mysql命令大全

链接在此MySQL 命令大全 | 菜鸟教程

相关推荐
菜鸟的迷茫2 小时前
线程池中的坑:线程数配置不当导致任务堆积与拒绝策略失效
java·后端
缺点内向2 小时前
Java 使用 Spire.XLS 库合并 Excel 文件实践
java·开发语言·excel
asdfsdgss2 小时前
多项目共享资源:Ruby 定时任务基于 Whenever 的动态扩缩容
java·网络·ruby
木辰風2 小时前
如何在MySQL中搜索JSON数据,并去除引号
数据库·mysql·json
zzhongcy2 小时前
分库分表详解,以及ShardingJDBC介绍
数据库·oracle
Deamon Tree3 小时前
Redis的过期策略以及内存淘汰机制
java·数据库·redis·缓存
Jing_jing_X3 小时前
Java 多线程:从单体到分布式的演进与陷阱
java·分布式
fouryears_234173 小时前
Redis缓存更新策略
java·spring boot·redis·spring
晓py3 小时前
SQL调优专题笔记:打造你的数据库性能优化思维体系
数据库·笔记·sql