数据库原理-期末复习基础知识第二弹

1、数据的逻辑独立性是指

外模式/模式映像 当模式改变的时候,由数据库管理员对各个外模式/模式的映像做出相应改变,使外模式保持不变。由于应用程序是按照外模式进行编写的,故应用程序不必修改,保证了数据与程序的逻辑独立性。

2、数据的物理独立性是指

模式/内模式映像 当数据库的存储结构发生改变时,由数据库管理员对模式/内模式映像做出相应改变,可以使模式保持不变,从而应用程序也不必改变,保证了数据与程序的物理独立性。

3、基本的关系操作包括

投影、选择、并、差、笛卡尔积。

4、专门的关系运算包括

选择、投影、连接、除。

5、试述数据、数据库、数据库管理系统、数据库系统的概念。

数据:描述事务的符号记录。

数据库:长期存储在计算机内的、有组织的、可共享的数据集合。

数据库管理系统:是位于用户和操作系统之间的具有数据定义、操纵、数据库的运行管理、数据库的建立与维护功能的一层数据管理软件。

数据库系统:在计算机系统中引入数据库后的系统、一般由数据库、数据库管理系统、应用系统、数据库管理员以及用户构成。

6、视图和基本表的区别?

视图是从一个或几个基本表导出 的表,它与基本表不同,是一个虚表,数据库中只存放视图的定义,而不存放视图对应的数据,这些数据存放在原来的基本表中,当基本表中的数据发生变化,从视图中查询出的数据也就随之改变。视图一经定义可以像基本表一样被查询,删除,也可以在一个视图上定义新的视图。

7、故障的类型?

事务故障,系统故障,介质故障。

8、EXISTS关键字

EXISTS 关键字

  • 语法及基本用法 :
    EXISTS 用于检查子查询是否返回至少一行数据,语法格式一般是 EXISTS (subquery),这里的 subquery 就是一个子查询语句。例如,有两张表,orders(订单表)包含 order_id(订单编号)、customer_id(客户编号)等字段,customers(客户表)包含 customer_id(客户编号)和 customer_name(客户姓名)等字段,要查询有订单的客户信息,可以这样写:

    SELECT customer_name
    FROM customers c
    WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
    );

其核心思路是对于 customers 表中的每一行数据,去执行括号内的子查询,如果子查询能返回至少一行数据,那就说明对应的客户有订单,该行客户记录就会被筛选出来。

  • 执行原理 :

    数据库在执行 EXISTS 语句时,一旦发现子查询返回了一行数据,就会停止继续检查该子查询(因为它只关心是否有数据返回,而不关心具体返回的数据内容),接着处理下一条外层查询的记录。所以从性能角度来看,在合适的场景下,EXISTS 可以比一些关联查询等方式更高效,尤其是当子查询关联的表数据量很大时,只要能快速判断有数据返回即可。

  • 应用场景举例 :

    常用于判断主表中的记录在关联表中是否存在对应数据的情况,比如查找有下属员工的部门信息、查找发布过文章的作者信息等,本质上是一种基于关联关系去判断存在性的操作。

总体区别总结

  • 逻辑判断方向 :
    • IN 和 NOT IN 侧重于判断某个值与一组给定值之间的包含关系,是对具体值集合的比对操作。
    • EXISTS 重点关注的是子查询是否有返回结果,是从是否存在数据的角度进行逻辑判断。
  • 性能特点及适用场景差异 :
    • IN 在值列表较短时通常性能较好,但列表过长可能影响性能;适合明确列举具体值进行筛选的场景。
    • NOT IN 同样受值列表中 NULL 值影响较大,使用时要小心;常用于排除特定值集合的筛选场景。
    • EXISTS 依赖子查询的逻辑构建,性能优势在于一旦确定有数据返回就停止子查询执行;更适合处理主从表之间判断存在性关联的复杂场景,尤其是大数据量情况下能体现其高效性优势。

在执行带有 NOT EXISTS 的查询时,数据库会针对主查询(外层查询)中的每一条记录,去执行对应的子查询操作。如果子查询返回的结果集为空(也就是没有返回行数据),那么对于当前这条主查询记录来说,NOT EXISTS 条件成立,该记录就会被包含在最终的查询结果中;反之,如果子查询返回了至少一行数据,那 NOT EXISTS 条件就不成立,对应的主查询记录则不会被选中。

示例说明

假设有两张表,一张是 employees(员工表),包含 employee_id(员工编号)、department_id(部门编号)等字段,用于记录员工所属部门等信息;另一张是 departments(部门表),包含 department_id(部门编号)、department_name(部门名称)等字段。

现在想要查询出没有员工的部门信息,就可以使用 NOT EXISTS 关键字来实现,示例 SQL 语句如下:

复制代码
SELECT department_name
FROM departments d
WHERE NOT EXISTS (
    SELECT 1
    FROM employees e
    WHERE e.department_id = d.department_id
);

在上述语句中:

  • 对于 departments 表中的每一个部门记录(由外层查询遍历每一条记录)。
  • 都会执行一次子查询,这个子查询是去查找在 employees 表中是否存在员工的 department_id 与当前遍历到的 department 表中的 department_id 相等(也就是判断这个部门是否有员工)。
  • 如果子查询没有找到这样的员工(即返回结果集为空),那就意味着这个部门没有员工,此时外层查询中对应的这个部门记录就会基于 NOT EXISTS 条件被筛选出来,最终查询结果就是那些没有员工的部门的相关信息(这里是部门名称)。

关于 EXISTS

  • 确实是先执行子查询来判断是否有满足条件的数据,只要子查询返回至少一行数据,对于当前正在处理的外层(父)查询中的那条记录来说,EXISTS 条件就成立。但子查询并非完全与父查询 "无关",通常子查询会和父查询存在关联条件,通过这个关联条件去判断相关的存在性情况。比如前面提到的员工和部门的例子中,子查询里会通过 e.department_id = d.department_id 这个关联条件来判断对于部门表中的某个部门,在员工表中是否存在属于该部门的员工。

关于 NOT EXISTS

  • 你的理解很形象,它类似嵌套循环的操作逻辑。对于父查询中的每一条记录,都会拿这条记录相关的属性值(通过关联条件)去和子查询里对应的属性进行匹配、判断。当子查询依据关联条件去查找时,如果没有返回任何行(也就是找不到对应的匹配数据),那么对于父查询中正在处理的这条记录而言,NOT EXISTS 条件就成立了,父查询中相应的记录以及 SELECT 后面选择的属性信息就会作为最终结果的一部分输出。
相关推荐
ClickHouseDB7 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906947 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺9 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw9 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社9 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙10 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
captain37611 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你021411 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川12 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组12 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制