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 的区别
- Where子句是用来指定“行”的条件的,而having子句是指定“组”的条件的,即、
Where 子句 = 指定行所对应的条件
Having 子句 = 指定组所对应的条件 - 当Where子句和Having子句中都可以使用的条件,从句的执行效率来看,最好写在Where中。
在使用Count函数对表数据进行聚合操作时,DBMS内部会进行排序处理,而排序操作会增加机器的负担,减少排序的行数,可以增加处理速度。
使用Where子句指定条件时,由于排序之前就对数据进行了过滤,所以能够减少排序的数据量。但是Having子句是在排序之后才对数据进行分组的,因此与前者相比,需要排序的数据量就多得多。 - 使用Where子句更具速度优势的另一个理由是,可以对Where子句指定条件所对应的列创建索引,这样可以大幅提高处理速度。
- Where子句中不可以使用聚合函数,而Having子句中可以。
SPRING的事务声明有几种方式 ? 是如何管理事务的?
spring的事务声明有两种方式,编程式和声明式。
Spring 的事务,可以说是 Spring AOP 的一种实现。
AOP面向切面编程,即在不修改源代码的情况下,对原有功能进行扩展,通过代理类来对具体类进行操作。
spring是一个容器,通过spring这个容器来对对象进行管理,根据配置文件来实现spring对对象的管理。
spring主要是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量。
sql查询
姓名 | 科目 | 分数 |
---|---|---|
张三 | CHINESE | 100 |
李四 | CHINESE | 90 |
王五 | CHINESE | 50 |
张三 | MATHS | 80 |
李四 | MATHS | 90 |
王五 | MATHS | 99 |
李四 | ENGLISH | 60 |
王五 | ENGLISH | 79 |
请统计 :
(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;