《MySQL数据库基础》6.表的增删查改

💡Yupureki:个人主页

✨个人专栏:《C++》 《算法》《Linux系统编程》《高并发内存池》《MySQL数据库》

《个人在线OJ平台》《Linux网络编程》《CMake自动化构建工具》《Redis数据库》


🌸Yupureki🌸的简介:


目录

[1. Create](#1. Create)

[1.1 单行数据和全列插入](#1.1 单行数据和全列插入)

[1.2 多行数据和指定列插入](#1.2 多行数据和指定列插入)

[1.3 存在则更新](#1.3 存在则更新)

[1.4 替换](#1.4 替换)

[2. Retrieve](#2. Retrieve)

[2.1 基本查询](#2.1 基本查询)

[2.1.1 全列查询](#2.1.1 全列查询)

[2.1.2 指定列查询](#2.1.2 指定列查询)

[2.1.3 查询字段为表达式](#2.1.3 查询字段为表达式)

[2.1.4 为查询结果指明别名](#2.1.4 为查询结果指明别名)

[2.1.5 结果去重](#2.1.5 结果去重)

[2.2 WHERE条件](#2.2 WHERE条件)

[2.2.1 比较运算符](#2.2.1 比较运算符)

[2.2.2.1 语文不及格的同学](#2.2.2.1 语文不及格的同学)

[2.2.2.2 语文成绩在80,90之间的同学](#2.2.2.2 语文成绩在[80,90]之间的同学)

[2.2.2.3 语文成绩大于80或者数学成绩大于70的同学](#2.2.2.3 语文成绩大于80或者数学成绩大于70的同学)

[2.2.2.3 姓张的同学](#2.2.2.3 姓张的同学)

[2.2.2.4 语文成绩好于英语成绩的同学](#2.2.2.4 语文成绩好于英语成绩的同学)

[2.2.2.5 总分低于240的同学](#2.2.2.5 总分低于240的同学)

[2.2.2.6 姓张的同学,否则成绩大于230](#2.2.2.6 姓张的同学,否则成绩大于230)

[2.3 排序](#2.3 排序)

[2.3.1 按照语文成绩升序排序](#2.3.1 按照语文成绩升序排序)

[2.3.2 按照总分降序排序](#2.3.2 按照总分降序排序)

[2.4 筛选分页](#2.4 筛选分页)

[2.4.1 查询总分最高的同学](#2.4.1 查询总分最高的同学)

[2.4.2 查询总分第二名的同学](#2.4.2 查询总分第二名的同学)

[3. Update](#3. Update)

[3.1 将某同学的语文成绩变更为90](#3.1 将某同学的语文成绩变更为90)

[3.2 将某同学数学成绩变更为80,英文成绩变更为70](#3.2 将某同学数学成绩变更为80,英文成绩变更为70)

[3.3 将成绩倒数第一名的同学的语文成绩加20分](#3.3 将成绩倒数第一名的同学的语文成绩加20分)

[4. Delete](#4. Delete)

[4.1 删除某列](#4.1 删除某列)

[4.2 删除全列](#4.2 删除全列)


1. Create

语法:

sql 复制代码
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...

案例:创建一张学生表

sql 复制代码
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);

1.1 单行数据和全列插入

1.2 多行数据和指定列插入

1.3 存在则更新

由于主键和唯一键的约束,如果两个建冲突则提示报错

因此如果发现键冲突时,可以进行更新

语法:

sql 复制代码
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...

1.4 替换

  • 主键 或者 唯一键 没有冲突,则直接插入;
  • 主键 或者 唯一键 如果冲突,则删除后再插入

2. Retrieve

语法:

sql 复制代码
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...

2.1 基本查询

2.1.1 全列查询

通常情况下,不建议全列查询。因为如果数据量过多,将全部的数据都显示出来对性能的开销很大

2.1.2 指定列查询

2.1.3 查询字段为表达式

2.1.4 为查询结果指明别名

2.1.5 结果去重

出现某字段重复的列

对结果去重

2.2 WHERE条件

WHERE条件的本质是筛选,相当于if条件判断

符合条件的数据才会被显示出来

运算符:

类别 运算符 说明 示例
比较运算符 = 等于 WHERE age = 18
<=> NULL 安全的等于(NULL <=> NULL 为 1) WHERE col <=> NULL
<> / != 不等于 WHERE status <> 'closed'
< 小于 WHERE price < 100
<= 小于等于 WHERE price <= 100
> 大于 WHERE price > 100
>= 大于等于 WHERE price >= 100
逻辑运算符 AND / && 逻辑与 WHERE a=1 AND b=2
OR / ` `
NOT / ! 逻辑非 WHERE NOT (a=1)
XOR 逻辑异或(一真一假时为真) WHERE a=1 XOR b=2
区间判断 BETWEEN ... AND ... 在闭区间内(包含边界) WHERE age BETWEEN 18 AND 30
NOT BETWEEN ... AND ... 不在区间内 WHERE age NOT BETWEEN 18 AND 30
集合成员 IN (...) 等于列表中的任一值(也支持子查询) WHERE status IN ('open','pending')
NOT IN (...) 不等于列表中任何值 WHERE id NOT IN (1,2,3)
空值判断 IS NULL 是空值 WHERE email IS NULL
IS NOT NULL 不是空值 WHERE email IS NOT NULL
模式匹配 LIKE 通配符匹配(% 任意多字符,_ 单字符) WHERE name LIKE 'A%'
NOT LIKE 不匹配 WHERE name NOT LIKE '%test%'
REGEXP / RLIKE 正则表达式匹配 WHERE email REGEXP '^[a-z]+@'
NOT REGEXP 正则不匹配 WHERE email NOT REGEXP 'spam'
布尔值判断 (8.0.16+) IS TRUE 值为真 WHERE active IS TRUE
IS FALSE 值为假 WHERE active IS FALSE
IS UNKNOWN 值为 NULL(结果等价于 IS NULL WHERE active IS UNKNOWN
子查询运算符 EXISTS (子查询) 子查询是否返回至少一行 WHERE EXISTS (SELECT 1 FROM orders WHERE uid=u.id)
NOT EXISTS (子查询) 子查询一行都没返回 WHERE NOT EXISTS (SELECT 1 FROM blacklist WHERE id=u.id)
表达式 比较符 ANY (子查询) 满足子查询中任一值(比较符可为 >,<,=,<> 等) WHERE score > ANY (SELECT score FROM exams)
表达式 比较符 ALL (子查询) 必须满足子查询得到的所有值 WHERE score > ALL (SELECT score FROM exams)
其他特殊运算符 MEMBER OF (...) (8.0.17+) 值是否属于 JSON 数组 WHERE 'apple' MEMBER OF(fruits_arr)
SOUNDS LIKE 发音相似比较(内部调用 SOUNDEX() WHERE name SOUNDS LIKE 'John'
&, ` , ^`, `~` 位运算符(按位与、或、异或、取反)

2.2.1 比较运算符

案例:

sql 复制代码
CREATE TABLE `exam` (
  `name` varchar(20) DEFAULT NULL,
  `chinese` int DEFAULT NULL,
  `math` int DEFAULT NULL,
  `english` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
2.2.2.1 语文不及格的同学
2.2.2.2 语文成绩在80,90之间的同学
2.2.2.3 语文成绩大于80或者数学成绩大于70的同学
2.2.2.3 姓张的同学
2.2.2.4 语文成绩好于英语成绩的同学

2.2.2.5 总分低于240的同学

2.2.2.6 姓张的同学,否则成绩大于230

2.3 排序

  • ASC 为升序(从小到大)
  • DESC 为降序(从大到小)
  • 默认为 ASC
sql 复制代码
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];

2.3.1 按照语文成绩升序排序

2.3.2 按照总分降序排序

2.4 筛选分页

从0开始,筛选n条结果

sql 复制代码
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n

从s开始,筛选n条结果

sql 复制代码
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n

2.4.1 查询总分最高的同学

2.4.2 查询总分第二名的同学

3. Update

语法:

sql 复制代码
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]

3.1 将某同学的语文成绩变更为90

3.2 将某同学数学成绩变更为80,英文成绩变更为70

3.3 将成绩倒数第一名的同学的语文成绩加20分

4. Delete

语法:

sql 复制代码
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

4.1 删除某列

4.2 删除全列

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
倔强的石头_1 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横1 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二1 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
冬奇Lab2 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
小猿姐2 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
ClouGence2 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle