初识SQL(1.0 PLUS)

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

  1. 在找到对应的表 筛选掉对应的数据 展示对应的数据列 select

  2. 最后再根据 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课 学生名

相关推荐
卢傢蕊2 小时前
PostgreSQL 日常维护
数据库·postgresql·oracle
芯智工坊2 小时前
第10章 Mosquitto桥接模式
网络·数据库·人工智能·mqtt·开源·桥接模式
零陵上将军_xdr2 小时前
MySQL体系架构
数据库·mysql·架构
fLDiSQV1W2 小时前
【MongoDB】MongoDB 概述
数据库·mongodb
谢白羽2 小时前
图数据库语义搜索性能实测:Neo4j vs FalkorDB vs Memgraph,谁的向量检索最快?
数据库·neo4j·memgraph·falkordb
电子科技圈2 小时前
SmartDV展示AI & HPC连接与存储IP解决方案,以解锁下一代算力芯片和节点的“速度密码”
网络·数据库·人工智能·嵌入式硬件·aigc·边缘计算
腾科IT教育2 小时前
Oracle OCP 认证考试到底怎么考?(附备考路线)
数据库·oracle·开闭原则·ocp认证·ocp培训
柒.梧.3 小时前
MySQL索引优化+慢查询全解析
数据库·mysql
这辈子谁会真的心疼你3 小时前
如何修改视频媒体修改时间?两个方法介绍
java·服务器·数据库