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

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 可以比一些关联查询等方式更高效,尤其是当子查询关联的表数据量很大时,只要能快速判断有数据返回即可。

  • 应用场景举例

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

总体区别总结

  • 逻辑判断方向
    • INNOT 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 后面选择的属性信息就会作为最终结果的一部分输出。
相关推荐
st_332 分钟前
Junit5 单元测试入门
数据库·单元测试·log4j
s***g5403 分钟前
MySQL-操作数据库备份与恢复
数据库·mysql
CQU_JIAKE25 分钟前
11.5【算法】6-1 表彰优秀学生(多态)
数据库
Elastic 中国社区官方博客1 小时前
使用数据层进行数据生命周期管理
大数据·数据库·elasticsearch·搜索引擎·全文检索·时序数据库
我爱李星璇2 小时前
Spring Boot项目的创建
java·数据库·spring boot
锵锵锵锵~蒋2 小时前
实时数据开发|Flink异步IO--提升性能和吞吐量
jvm·数据库·flink·实时数据开发
小麦项目管理指南3 小时前
工程企业需要什么样的财务软件?
大数据·数据库·信息可视化·项目管理
涛思数据(TDengine)3 小时前
解密时序数据库的未来:TDengine Open Day技术沙龙精彩回顾
数据库·时序数据库·tdengine
cdut_suye4 小时前
Linux权限机制深度解读:系统安全的第一道防线
linux·运维·服务器·数据库·人工智能·系统安全·热榜
Elastic 中国社区官方博客4 小时前
使用历史索引监控 Elasticsearch 索引生命周期管理
大数据·数据库·elasticsearch·搜索引擎·全文检索·时序数据库