数据库面试常见问题

INNER JOIN / LEFT JOIN / RIGHT JOIN 的区别

left join:
select * from tableA a left join tableB b on a.id = b.id;
right join:
select * from tableA a right join tableB on a.id = b.id;
inner join:
select * from tableA a inner join tableB b on a.id = b.id;

left join(左连接)返回包括左表中的所有记录和右表中联结字段相等的记录。
right join(右连接) 返回包括右表中的所有记录和左表中联结字段相等的记录。
inner join(等值连接) 只返回两个表中连接字段相等的行。


GROUP BY 以及 SUM AVG MAX MIN 的用法 (要求会手写SQL脚本)


WHERE 和 HAVING 的区别

  1. Where子句是用来指定“行”的条件的,而having子句是指定“组”的条件的,即、
    Where 子句 = 指定行所对应的条件
    Having 子句 = 指定组所对应的条件
  2. 当Where子句和Having子句中都可以使用的条件,从句的执行效率来看,最好写在Where中。
    在使用Count函数对表数据进行聚合操作时,DBMS内部会进行排序处理,而排序操作会增加机器的负担,减少排序的行数,可以增加处理速度。
    使用Where子句指定条件时,由于排序之前就对数据进行了过滤,所以能够减少排序的数据量。但是Having子句是在排序之后才对数据进行分组的,因此与前者相比,需要排序的数据量就多得多。
  3. 使用Where子句更具速度优势的另一个理由是,可以对Where子句指定条件所对应的列创建索引,这样可以大幅提高处理速度。
  4. Where子句中不可以使用聚合函数,而Having子句中可以。

SPRING的事务声明有几种方式 ? 是如何管理事务的?

spring的事务声明有两种方式,编程式和声明式。

Spring 的事务,可以说是 Spring AOP 的一种实现。

AOP面向切面编程,即在不修改源代码的情况下,对原有功能进行扩展,通过代理类来对具体类进行操作。

spring是一个容器,通过spring这个容器来对对象进行管理,根据配置文件来实现spring对对象的管理。

spring主要是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量。


sql查询

姓名科目分数
张三CHINESE100
李四CHINESE90
王五CHINESE50
张三MATHS80
李四MATHS90
王五MATHS99
李四ENGLISH60
王五ENGLISH79

请统计 :
(1) 各科目的第一名、最后一名 、总分、平均分
(2) 总分第一名
(3) 有缺考情况的人名(至少有1门不参加考试的人员)

-- 各科目的第一名,最后一名
SELECT * from (SELECT * FROM score s WHERE s.`subject` = 'MATHS' LIMIT 0,1) as t1
UNION 
SELECT * from (SELECT * FROM score s WHERE s.`subject` = 'MATHS' ORDER BY s.score DESC LIMIT 0,1) as t2;

-- 总分,平均分
SELECT * from (SELECT s.`subject` 科目, SUM(s.score) 总分, AVG(s.score) 平均分 FROM score s GROUP BY s.`subject`) AS t3;

-- 总分第一名
SELECT * FROM (SELECT s.name, SUM(s.score) sum FROM score s GROUP BY s.`name`) as t1 ORDER BY t1.sum desc limit 0,1;

SELECT 
    SUM(CASE s.`subject` WHEN 'MATHS' THEN 1 ELSE 0 END) 数学,
    SUM(CASE s.`subject` WHEN 'CHINESE' THEN 1 ELSE 0 END) 语文,
    SUM(CASE s.`subject` WHEN 'ENGLISH' THEN 1 ELSE 0 END) 英语
FROM score s WHERE s.`name` = '张三';

select COUNT(DISTINCT s.`subject`) 总科目数 from score s;

-- 至少有一门不参加开始的人员
select name from score s group by s.`name` having count(1)<3;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值