WHERE 后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以 所以在运算的时候要注意聚集函数主要有:最大,最小,总数,总和,平均 ,这些是无法跟在WHERE后面的,left join 左边的表为基表 右表参照左边搜索符合的条件 左边也就是left左边的表,同理右关联的基表是right 右边的表(那个关联 就把基表放在那边)
+在左边就是右关联,+在右边就是左关联。
with as 也叫子查询部分,就是将查到的一大堆结果集封装到一个虚拟视图中取一个别名,WITH as 方法的优点:
增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标。
基本语法是 with temname as(select.............. from table....) as 别名
select ............... from 别名.....加一些条件
重点
over开窗函数: 首先 区分有无partition by
其中PARTITION BY 为分组字段,ORDER BY 指定排序字段
sum(sal) over (partition by deptno order by ename) 按部门“连续”求总和(最后只出现每个部门的总和 类似于第三个)
sum(sal) over (partition by deptno) 按部门求总和(只求每个部门的总和)
sum(sal) over (order by deptno,ename) 不按部门“连续”求总和(也就是累加的意思,在一个字段进行累加计算,第二个部门的总和等于第一个部门加第二个部门和)
sum(sal) over () 不按部门,求所有员工总和,效果等同于sum(sal)。(也就是最后每个部门出现的值是所有部门的值的总相加)
rank()over是分级函数,比如我要求出每个部门的前四名就可以这样写
SELECT A.AREA_ID, A.ACCT_MONTH, A.FEE, A.ITEM_ID, A.USER_ID
FROM (SELECT T.AREA_ID,
T.ACCT_MONTH,
T.FEE,
T.ITEM_ID,
T.USER_ID,
RANK() OVER(PARTITION BY T.ITEM_ID ORDER BY T.FEE DESC) RK
FROM TEST T) A
WHERE RK < 4;
rank 就是将数据进行分级排序,如数据出现相同, 则并列 但是会占用后面的名字 如12245
dense_rank用法和rank相似 但是如果出现相同的数据 他们会并列 但是并列不占后面的名次如 12234
row_number 这个无需考虑数据是否相同,即使相同 他们也会正常排序 如12345