前一阵把力扣上的sql题刷了一遍,下面呢是我一些淌过的水排过的雷,再加一些小心得,可能更适合记性不好、经常不练习、基础一般的同学哦!(大神请划过)网上这种个人心得我看了看还是不多的,下面很多都是我平时我的随笔,比较随意哈。有什么更干的货一起分享啊,评论区欢迎你们!
-
有时候不得不使用嵌套连接
-
having只用来在group by之后,having不可单独用,必须和group by用 having后面一般跟聚和函数,也可跟被 group by的字段 也有可能加该表的一些字段 但是不能加其他表的
-
(自连接)相当于单独的两张外键关联的表
-
select * from emp where sal >all(select sal from emp where deptno=30); all()************************
-
select d.DEPTNO,d.DNAME,d.LOC ,count(emp.DEPTNO) total from dept d left join emp on emp.DEPTNO=d.DEPTNO group by emp.DEPTNO left join******************
-
临时表 *************************
-
主表 + join表 先判断哪个是主表 哪个是join表 ----这个可能是个人习惯吧 其实也不太重要
-
join时条件摞列上去
select ss.HISAL from emp m join salgrade ss on m.ENAME='SMITH'and m.sal BETWEEN ss.LOSAL and ss.HISAL
`select s.* ,a.score, b.score from student s join sc a on s.sno=a.sno and a.cno=1 left join sc b on s.sno=b.sno and b.cno=2 **where** a.score>b.score
select s.* ,a.score, b.score from student s join sc a on s.sno=a.sno and a.cno=1 left join sc b on s.sno=b.sno and b.cno=2 **and** a.score>b.score `
有时候join on 条件就相当于一个临时表一样`
SELECT s.* FROM
(SELECT sno,score FROM sc WHERE cno=1 ) AS a,
(SELECT sno,score FROM sc WHERE cno=2 ) AS b,
student s
WHERE a.sno=b.sno AND a.score > b.score and s.sno=a.sno;在这里插入代码片`
- 一看 “所有” / 没做过 反向思维用not in
- 换一种思路来解决 ,找解决的"idea",然后用并结合sql语法实现****************** 也就是先想一般思路 不行了就想嵌套啊 临时表啊 case啊等等 或组合 嵌套可以无处不在(很厉害)
- case when then else end : case when可以被group by影响 / SUM(CASE WHEN ssex=‘男’ THEN 1 ELSE 0 END) 聚和函数(case when…)
- 仅mysql 无窗口函数 : 查名次 需要用到两个相同的表 +count() "count()+1"就是名次 比如:前三名的记录 / 名次 简单的用limit就ok
SELECT cno,sno,score vc FROM sc a WHERE (SELECT COUNT(1) FROM sc WHERE cno=a.cno AND score>a.score) <=2 ORDER BY a.cno,a.score DESC
- limit 2,3 从第三个开始往下数3个
- group by两个 两个都要分组
- 只要一分组,查询的除了被分组的字段,都是聚和函数的或者case when, 查具体的只能保留分组的第一行 》》》》 譬如这个:SELECT * FROM sc GROUP BY cno HAVING cno=5
- distinct sc.sno != s.sno ************ 查询的数据有时候会有一个默认的排序方式,有时候得注意下排序的问题
- null与 1 2 3的区别 null
- ORDER BY COUNT(*) DESC LIMIT 1 ORDER BY+聚和函数
- COUNT(IF(action = ‘show’, 1, 0))
- 一个聚和不能作用于另一个聚和函数上, 譬如:出现过一次的数字中,最大的一个数字 max() count() 要用嵌套
- max / 》=all 可以保留并列 / 》= order by ye_ji desc limit 1 可以保留并列 /开窗函数 三种都可以得到最大值 开窗函数
- 两个表如果有外键相连 一般join on 都得加上外键 on a.product_id = b.product_id
- left join case 可能会出现null
- rank 1 2 2 4 5
dense_rank 1 2 2 3 4
row_number 1 2 3 4 5
还要很多适合进阶的干货,有时间再总结吧,今天就先写到这里,有什么疑问跟指正可以在评论区留言,当然,也期待你们更干的货!