CRUD(2.0)
书接上回.....
在经过create(增加) retrieve(查询)之后
在每次多次查询后有没有 注意到每次查询的数据总是太多了,想要查询的结果总是包含在其中
对此要筛选掉不需要的数据
条件语句WHERE
比较运算符
| 运算符 | 作用 | SQL 示例 |
|---|---|---|
= |
等于 | WHERE age = 20 |
<> / != |
不等于 | WHERE name <> '张三' |
> |
大于 | WHERE score > 60 |
< |
小于 | WHERE price < 100 |
>= |
大于等于 | WHERE num >= 10 |
<= |
小于等于 | WHERE create_time <= '2025-01-01' |
逻辑运算符
| 运算符 | 作用 | SQL 示例 |
|---|---|---|
AND |
同时满足多个条件 | WHERE age>18 AND score>=90 |
OR |
满足任意一个条件 | WHERE city='北京' OR city='上海' |
NOT |
取反,排除条件 | WHERE NOT age=20 |
注意:逻辑运算符本身就有着优先级 ,所以在连续使用时 要自己添加
范围运算符
| 运算符 | 作用 | SQL 示例 |
|---|---|---|
BETWEEN ... AND ... |
在指定范围内(包含边界) | WHERE score BETWEEN 80 AND 100 |
NOT BETWEEN ... AND ... |
不在指定范围内 | WHERE price NOT BETWEEN 10 AND 50 |
SELECT * FROM 表名 WHERE 条件;
条件 : 不仅可以是一个 字段 而且还可以是 表达式
但是 where中的 子句不可以使用 别名 作为 过滤条件
查询 employees 表中工资大于 50000 的员工,并按工资降序排列:
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > 50000
ORDER BY salary DESC;
但在这一个sql 的执行顺序又是如何呢?
1.首先要找到处理的数据,搜查到表中 from
2.在查找过程中要完成过滤条件过滤掉找到合适的数据,这时执行的是 where
-
在找到对应的表 筛选掉对应的数据 展示对应的数据列 select
-
最后再根据 order by 选择对应的显示方式order by
如果有数据不小心增添的有误数据该如何修改数据呢
Update(更新)
UPDATE 表名 SET column(表中对应的列) = 值,column(表中对应的列) = 值.....
where 修改字段 order by 排序
在update 一定要注意添加where 条件 否则会导致整个数据列修改

所以 ,在使用update 时 要指定条件要有 唯一性 否则出现以上情况
Delete(删除)
DELETE FROM 表名 WHERE 条件 ORDER BY LIMIT ;


删除时 只要找到对应的条件 就会 执行删除
所以说 删除一件危险的操作
如果发生误删操作该如何怎么办呢?
一般地 每一句SQL语句都会存入在 日志 中 ,只需要把 日志 再次执行即可
生产环境中 不会单独使用 会在表中加入deleteState
deleteState 表示这条记录是否会被删除 0 表示未被删除 1为已删除
这样使用 update 更新 deleteState 就会完成删除操作 但是实质上数据一直保存在数据库中
约束
数据库约束 是关系型数据库重要的功能之一
主要用于限制表中数据的规则,确保数据的准确性和一致性。通过约束,可以防止无 效数据进入数据库,维护数据的完整性。
创建表里增添约束 约束 会帮助了程序猿👨💻在写入数据库中的数据 让数据库做校验工作
下列是一些主要常见的约束类型
非空约束(NOT NULL)

desc + 表名 查看表的类型 这里包括着表中一些基本信息 这里容我一一介绍
强制列不接受空值,必须包含有效数据。
NO 表示不可以为空
YES 表示可以为空
CREATE TABLE Products (
ProductID INT NOT NULL,
ProductName VARCHAR(100) NOT NULL
);
如果在插入数据时 指定不能为空的数据 插入时却为空 将插入失败

那这里为什么会插入成功呢?
auto_increment : 通常用于主键列,确保每条记录都有一个唯一的标识符,无需手动指定值。
所以即使这里填写 NULL数据库 也会帮你填入值
注意 : 自增有时会出现不连续的现象
因为在写入记录时 insert会先生成主键值 无论记录使用是否 都会认为主键值已被使用
所以 在写入记录时可能会遇到各种各样的的报错 一旦有报错存在 也将会被存入 也就出现了不连 续的现象
主键约束(PRIMARY KEY)
对应上述图中的 KEY 为 PRI
唯一标识表中的每一行数据,确保列值的唯一性且不允许为空。
简单地说 是 UNIQUE + NOT NULL
CREATE TABLE if not EXISTS c(
c_cno CHAR(10) NOT NULL PRIMARY KEY COMMENT'课程号',
sn VARCHAR(10) NOT NULL COMMENT'课程名'
) ;
单个表中不能存在多个主键 但是允许 复合主键 的存在
如下:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
PRIMARY KEY (column1, column2)
);
外键约束(FOREIGN KEY)
建立表之间的关系,确保引用另一个表的主键或唯一键的值有效。
CREATE TABLE if not EXISTS tc(
tno varCHAR(10) NOT NULL COMMENT'教师号',
cno varCHAR(10) NOT NULL COMMENT'课程号',
FOREIGN key (tno) REFERENCES t (tno)
) ;
这里将外键的创立 强调一下
FOREIGN key 这里添加的是 tc 子表中 tno (要和主表 c 中要保持类型一致)
REFERENCES 引用主表的创建含有主键的字段 t(tno)
通过外键约束 保证数据的完整性 与 关系的正确性
如果要删除主键中的数据 一定要先删除的子表中所对应的数据
主外键的缘由 才能删除主表中的数据
唯一约束(UNIQUE)
确保列中的所有值唯一,但允许有空值(与主键区别)。
CREATE TABLE Employees (
EmployeeID INT UNIQUE ,
Email VARCHAR(100) UNIQUE
);
此外 null 可以重复加入
检查约束(CHECK)
定义列值必须满足的条件,如范围或格式限制。
check的使用不太常见 这里不在过多讨论
默认约束(DEFAULT)
为列指定默认值,当插入数据未提供值时自动填
CREATE TABLE Users (
UserID INT,
JoinDate DATE DEFAULT ' '
);
此外 当你填入 null 时 输出结果 是 null 而不会是 deafult 的值
因为 用户指定高于默认约束
只有你未填入任何数据时才会 使用默认约束的值
三大范式
表的设计需要遵循数据库规范化原则 ,确保数据的一致性、完整性和高效性。通常采用三范式
第一范式(1NF)
确保每一列的原子性,即每一列都是不可再分的最小数据单元。(字段不可以再拆分)
举例:
建立学生表
表内包含
学号 姓名 性别 班级名 学校
这里的学校就可以继续再次分为 学校名 学校地址 学校电话
所以不满足第一范式
正确示例:
建立学生表
表内包含
学号 姓名 性别 班级名 学校名 学校地址 学校电话
第二范式(2NF)
在满足1NF的基础上,确保非主键字段完全依赖于主键(消除部分依赖)。
举例:
建立学生选修课的成绩表
表内包含
学号 姓名 年龄 课程名 学分 成绩
显然易见地这与我们一般建立表的不同
这里好像存在了多个主键的依赖学号 课程名
所以一个表中单主键 天然符合 了 第二范式
正确示例:
建立学生表
学号 姓名 年龄
建立课程表
课程编号 课程名 学分
建立成绩表
学号****课程编号 成绩
联合查询得到成绩结果 (随后会提及)
如果不满足第二范式:
数据冗余增加
更新异常(由于数据冗余,可能需要同时更新多条记录 如果更新不完全,会导致数据不一致)
插入异常
删除异常(因为部分依赖导致数据耦合度过高)
第三范式(3NF)
在满足2NF的基础上,消除非主键字段对主键的传递依赖(即非主键字段不能依赖其他非主键字段)。
举例:
建立学生表
表内包含
学号 姓名 性别 班级名 学院编号 所在学院 学校名 学校地址 学校电话
本质是存在了 两张表 学生表 与 学校表 但是存到了同一张表中
就会出现了 强相关关系
传递依赖 : 学号 --> 班级名 --> 学院编号 --> 所在学院 --> 学校名 -->学校地址
这里不符合第三范式 因为存在了 传递依赖
正确示例:
建立学生表
学号 姓名 性别 班级名 学院编号
建立学院表
学院编号 所在学院 学校名 学校地址 学校电话
所以 第三范式 可以解决 数据冗余增加 更新异常 插入异常 删除异常
表设计的方法
一对一关系
通过主键关联或共享主键实现。例如用户表和用户详情表,主键相同或互为外键。
一对多关系
一个学生只能在一个班级
一个班级内有许多学生
class (class_id , name)
student(class_id, name ,gender,age)
多对多关系
一个学生有多门选修课
一门课也有许多学生
先创立实体表
student(student_id, name ,gender)
course(**course_id,**name)
再建立关系表
student_course(id,**course_id,**student_id)
1 xx课 学生名
2 xx课 学生名