数据开发面试:DQL,DDL,DTL
DQL常见面试题
where 和 having 的区别

三个排序开窗函数的区别

left join 用where 筛选 和 用on筛选的区别
-
ON
子句:用于定义连接条件,不会丢失左表的行。 -
WHERE
子句:用于过滤连接后的结果集,可能会丢失左表中没有匹配的行
示例
WHERE
子句在连接操作之后应用,用于过滤结果集中的行。在这个查询中,WHERE b.salary > 5000
会过滤掉所有 b.salary
小于或等于 5000 的行,包括那些 b.salary
为 NULL
的行(即左表中的行在右表中没有找到匹配的行)。
union 和 union all 的区别
union
-
去重:
UNION
会自动去除合并后结果集中的重复行。 -
性能:因为需要检查重复行,所以
UNION
通常比UNION ALL
执行得慢一些
union all
-
不去重:
UNION ALL
会保留合并后结果集中的所有行,包括重复行。 -
性能:因为不需要检查重复行,所以
UNION ALL
通常比UNION
执行得快。
count(*) count(1) count(字段)的区别
-
COUNT(*)
:计算所有行数,包括列值为NULL
的行。 -
COUNT(1)
:计算所有行数,与COUNT(*)
类似 -
COUNT(列)
:计算指定列非NULL
值的数量。
COUNT(*)
可能比 COUNT(列)
更快,因为它不需要检查列值是否为 NULL
COUNT(1)
和 COUNT(*)
的性能相似
a表有3条数据,b表有5条数。a left join b 最少多少条,最多多少条
最少3条>>b表没有与a表匹配的数据
最多15条>>b表的每一条数据都能和a表匹配上,产生笛卡尔积
DDL面试题
truncate 、 delete 、 drop的区别
1.drop删除对象,delete和truncate删除数据;
2.drop和truncate属于DDL(数据库定义语言); delete属于属于DML(数据库操作语言);
3.TRUNCATE只能删除全部数据,DELETE可以删除全部也可以条件删除;
4.性能: drop > TRUNCATE > DELETE;
5.数据恢复:
TRUNCATE的数据不能回滚也不能闪回,
DELETE掉的数据可以回滚(在事务未提交的前提下), 以及闪回查询
DROP可以闪回表,可以恢复数据,但是不能回滚(因为属于DDL);
如何避免索引失效
写文章-CSDN创作中心
什么时候使用索引
经常用于数据过滤的字段(where或having后面的字段)
经常用于表连接的字段,
经常用于排序或分组
需要保持唯一性的字段>>建唯一索引/主键索引
经常用于范围查询的字段>>索引可以加速查询范围的定位频繁查询但是更新较少的字段>>当表中的数据发生变化(插入、更新、删除)时,索引也需要同步更新, 频繁更新会降低索引性能
分区表类型
范围分区:适用于按时间或数值范围分布的数据,如销售记录、日志数据。
列表分区:适用于具有明确分类的数据,如部门信息、产品分类。
哈希分区/散列分区:适用于数据分布均匀的场景,如客户信息、订单数据。
复合分区/子分区:前3种分区的组合, 适用于需要多层次数据划分的场景,如销售数据按时间和区域复合分区>>范围分区+列表分区
视图和表的区别
表是实际存储数据的物理结构,而视图是基于SQL查询的虚拟表,是sql语句的映射, 不存储数据。
行列转换
oracle
多行转单行:listagg;
列转列: case when;
行转列:case when , decode, pivot;
列转行:union和unpivot
hive
列转行(一变多)>>explore爆炸函数(用于数组array或映射map)
行转列(多变一)>>collect_set函数(有去重效果); collect_list函数没有去重效果
如果不是数组, 行列转换使用case when(行转列) 和 union all (列转行)
分组的top n
即在每个分组中选择排名前N的记录
oracle
在一个临时表里面用窗口函数对数据进行分组降序排序>>select查询,用一个where过滤得到数据
连续登录
通常涉及到用户登录信息的分析, 监控用户活动、检测异常登录行为、统计用户活跃度等
以下SQL查询用于找出连续登录3天或以上天数的用户
WITH RankedLogins AS (SELECTuser_id,login_date,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn,LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date) AS prev_login_dateFROMuser_logins
)
SELECTuser_id,MIN(login_date) AS start_date,MAX(login_date) AS end_date,COUNT(*) AS consecutive_days
FROMRankedLogins
WHERElogin_date - prev_login_date = 1
GROUP BYuser_id,start_date
HAVINGconsecutive_days >= 3;
DTL面试题
什么是事务
表示一组不可分割的操作序列,这些操作要么全部成功,要么全部失败
事务的四个基本特性(ACID属性)
原子性(Atomicity),一致性(Consistency),一致性(Consistency),一致性(Consistency)
什么是隐式事务、什么是显示事务
隐式事务:
是指数据库系统自动管理的事务,不需要用户(即开发者)显式地声明事务的开始和结束。
增删改 (INSERT、UPDATE、DELETE) 都是隐式事务
显示事务
显式地声明事务的开始和结束, 允许开发者根据需要将多个数据库操作组合成一个事务。PL/SQL
什么是死锁,死锁怎么解决
两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象
解决
通过限制资源的分配来预防循环等待条件的出现。
强制回滚其中一个或多个事务,以打破循环等待状态。
通过减少锁的范围(如行级锁代替表级锁)来减少锁争用的机会
设置锁请求的超时时间,当事务等待锁超过这个时间后,自动放弃锁请求并回滚