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
后面选择的属性信息就会作为最终结果的一部分输出。