Mysql和Oracle的区别:https://www.cnblogs.com/bailing80/p/11440927.html
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都会被阻塞住。
https://www.cnblogs.com/lijingran/p/9001302.html
效率比较慢,笛卡尔积。
3.1为什么子查询比连接查询效率低
https://blog.csdn.net/wutian842929/article/details/106138138
https://www.bbsmax.com/A/MyJxw8VMzn/
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后面.
1、当对系统的性能高并数据量大时使用group by
2、当对系统的性能不高时使用数据量少时两者皆可
3、尽量使用group by
https://www.cnblogs.com/ewei/p/13050408.html
group by默认取分组的第一条记录
SELECT employees.emp_no FROM salaries EXCEPT SELECT dept_manager.emp_no FROM dept_manager; -- EXPECT 集合差运算 -- UNION 集合并运算 -- INTERSECT 集合交运算
sql中有两种方式表bai示不du等于,一种是zhi"<>"(不含引号dao),另一种zhuan是"!="(不含引号)。
https://blog.csdn.net/weixin_46909730/article/details/106479561
两句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'
)
窗口函数分组排序: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