Java教程

牛客数据库刷题

本文主要是介绍牛客数据库刷题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Mysql和Oracle的区别:https://www.cnblogs.com/bailing80/p/11440927.html

1 Mysql的LIMIT,Oracle的ROWNUM

2 Mysql和Oracle的隔离级别

mysql默认是可重复读;oracle默认是读已提交。

Mysql的可重复读为什么没有解决幻读:https://blog.csdn.net/godloveleo9527/article/details/109554263

2.1、读未提交

这种事务隔离级别下,select语句不加锁

2.2、读已提交

(1)普通读是快照读;

(2)加锁的select, update, delete等语句,除了在外键约束检查(foreign-key constraint checking)以及重复键检查(duplicate-key checking)时会封锁区间,其他时刻都只使用记录锁;

此时,其他事务的插入依然可以执行,就可能导致,读取到幻影记录。

2.3、可重复读

普通的select使用快照读(snapshot read),这是一种不加锁的一致性读(Consistent Nonlocking Read),底层使用MVCC来实现

2.4、串行化

这种事务的隔离级别下,所有select语句都会被隐式的转化为select ... in share mode。

这可能导致,如果有未提交的事务正在修改某些行,所有读取这些行的select都会被阻塞住。

3 left join,right join,inner join,full join

https://www.cnblogs.com/lijingran/p/9001302.html

效率比较慢,笛卡尔积。

3.1为什么子查询比连接查询效率低

https://blog.csdn.net/wutian842929/article/details/106138138

IN/NOT IN/EXISTS 关键字  多表查询中的IN和JOIN关键字

https://www.bbsmax.com/A/MyJxw8VMzn/

4 where,group by,having

group by和where的位置关系:

可以。注意:where肯定在group by 之前。

一,group by 字句也和where条件语句结合在一起使用。当结合在一起时,where在前,group by 在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组 使用having字句对分组后的结果进行筛选。

二,需要注意having和where的用法区别:

1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。

2.where肯定在group by 之前。

3.where后的条件表达式里不允许使用聚合函数,而having可以。

关于为什么where后面不能放聚合函数:

因为聚合函数是做统计用的,所有的聚合方式使用都是,函数名(字段) 对这一个字段进行聚合.但在mysql内部运行容机制中,where后面还没有结果,只有select后面才有结果集。所以聚合函数是不能放在where后面,却可以放在select后面.
为什么聚合函数却可以放在having后面呢?原因是having是分组后的过滤,也就意味着having是对分组的结果进行过滤.所以having之前一定是分组,一定是有结果的,也就意味着having后面的聚合函数可以统计到结果.所以聚合函数却可以放在having后面. 

5 distinct和group by的效率问题

1、当对系统的性能高并数据量大时使用group by

2、当对系统的性能不高时使用数据量少时两者皆可

3、尽量使用group by

解决MySQL默认ONLY_FULL_GROUP_BY引起的错误:

https://www.cnblogs.com/ewei/p/13050408.html

GROUP BY:

group by默认取分组的第一条记录

6 SQL支持集合运算

SELECT employees.emp_no
FROM salaries
EXCEPT
SELECT dept_manager.emp_no
FROM dept_manager;

	

	-- EXPECT  集合差运算

	-- UNION  集合并运算

	-- INTERSECT 集合交运算

sql中有两种方式表bai示不du等于,一种是zhi"<>"(不含引号dao),另一种zhuan是"!="(不含引号)。

7 sql中的运算符

https://blog.csdn.net/weixin_46909730/article/details/106479561

8 关于聚合函数的问题

两句sql分析:

一、错误

select t1.emp_no,MAX(t2.salary),t1.last_name,t1.first_name from employees t1
left join salaries t2 on t1.emp_no =t2.emp_no where t2.salary not in
(select MAX(salary) from salaries);

原因是MAX(t2.salary)是正确的,但是其余的字段会随机选择,而不是对应的字段。

二、正确

select e.emp_no,s.salary,e.last_name,e.first_name
from
employees e
join 
salaries s on e.emp_no=s.emp_no 
and  s.to_date='9999-01-01'
and s.salary = (select max(salary)
                from salaries
                where salary<(select max(salary) 
                              from salaries 
                              where to_date='9999-01-01'
                             )
                        and to_date='9999-01-01'
                )

9 SQL23

窗口函数分组排序:https://zhuanlan.zhihu.com/p/92654574

1、RANK()
    在计算排序时,若存在相同位次,会跳过之后的位次。
    例如,有3条排在第1位时,排序为:1,1,1,4······

2、DENSE_RANK()
    这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次。
    例如,有3条排在第1位时,排序为:1,1,1,2······

3、ROW_NUMBER()
    这个函数赋予唯一的连续位次。
    例如,有3条排在第1位时,排序为:1,2,3,4······

Mysql关键字和保留字:

https://blog.csdn.net/hfut_wowo/article/details/81011952?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EsearchFromBaidu%7Edefault-4.pc_relevant_baidujshouduan&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EsearchFromBaidu%7Edefault-4.pc_relevant_baidujshouduan

都不建议作为列名使用。保留字可以加‘保留字’作为列名。

mysql执行顺序:https://blog.csdn.net/u014044812/article/details/51004754


 

这篇关于牛客数据库刷题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!