一.表连接
1.左连接 left join
以左表为基础进行连接,左表如无与右边连接的字段则为null
参考SQL:
SELECT * FROM TABLE_NAME1 LEFT JOIN TABLE_NAME2 ON TABLE_NAME1.id = TABLE_NAME2.id
2.右连接 right join
以右表为基础进行连接,右表如无与左边连接的字段则为null
参考SQL:
SELECT * FROM TABLE_NAME1 RIGHT JOIN TABLE_NAME2 ON TABLE_NAME1.id = TABLE_NAME2.id
3.全连接 full jion(outer一般不写)
全连接将两表强行拼在一起,无法对应连接的字段为null相当于并集
参考SQL:
SELECT * FROM TABLE_NAME1 INNER JOIN TABLE_NAME2 ON TABLE_NAME1.id = TABLE_NAME2.id
4.内连接 inner jion
相当于两表的交集
参考SQL::
SELECT * FROM TABLE_NAME1 FULL JOIN TABLE_NAME2 ON TABLE_NAME1.id = TABLE_NAME2.id
可以参考博客:https://blog.csdn.net/rocling/article/details/90516802
二、相关关键字
1.using关键
SQL 参考:
SELECT * FROM STUDENT S INNER JOIN (SELECT STUDENT_ID,MIN(SCORE) SC FROM EMP)
GROUP BY STUDENT_ID ) D
USING (STUDENT_ID , SCORE)
2.BETWEEN AND
SQL 参考 :
SELECT * FROM TABLE_NAME WHERE AGE BETWEEN 1 AND 100
3.UNOIN
SQL 参考 :
SELECT * FROM TABLE_NAME1 UNION SELECT * FROM TABLE_NAME2
4.子查询
SQL 参考
SELECT * FROM TANLE_NAME where EXISTS (SELECT SCORES from STUDENT where age>21)
5.PARTITION
(2)把每个人学生的成绩按照升序排名 (思路:根据学生姓名分组 根据每个人成绩排序)
SQL 参考:
select *,ROW_NUMBER() over( partition by Name order by Score )排名 from STUDENT
查询结果
Id Name Course Score 排名
1004 王四 数学 60 1
1005 王四 语文 80 2
1001 王四 英语 100 3
1007 大五 数学 30 1
1006 大五 语文 50 2
1003 大五 英语 50 3
1008 小三 英语 60 1
1000 小三 语文 80 2
1002 小三 数学 90 3
(1)把每个学科的成绩分别进行排名 (思路:根据学科分组 根据成绩排序)
SQL 参考
select *,ROW_NUMBER() over( partition by Course order by Score )排名 from UserGrade
查询结果
Id Name Course Score 排名
1002 小三 数学 90 1
1004 王四 数学 60 2
1007 大五 数学 30 3
1001 王四 英语 100 1
1008 小三 英语 60 2
1003 大五 英语 50 3
1000 小三 语文 80 1
1005 王四 语文 80 2
1006 大五 语文 50 3
6.OVER 开窗函数
SQL 参考
SELECT * ,AVG(SCORES) OVER () AS ACG_SCORES FROM SCORE
三、MERGE INTO 语句
1.merge into 语句的功能:我们操作数据库的时候,有时候会遇到insert或者Update这种需求。我们操纵代码时至少需要写一个插入语句和更新语句并且还得单独写方法效验数据是否存在,这种操作完全可以用merge into语句代替,不仅省时省力而且条理更清晰,一个SQL语句直接完成插入,如果有相同主键进行更新操作。
使用场景:判断B表和A表是否满足ON中条件,如果满足则用B表去更新A表,否则将B表数据插入A表或者更多操作。
2.具体SQL:下边sql是我在工作中最常用使用的,功能是对接口板(表B)中通过批次ID查到的合同进行对正式表(表A)插入和更新。除此之外,还可以更具你的想法实现功能进行各种条件更新和插入。只有update和insert,将条件的update或者带条件的insert,全插入insert实现,带delete的update()
MERGE INTO后是更新的表,USING是对接口表进行筛选,(如果有重复数据,仅选取一行插入,用ORDER BY 控制)。ON中是具体的条件(表中标识字段,字段编码)满足执行 WHEN MATCHED THEN 下的语句不满足则执行WHEN NOT MATCHED THEN 后语句:
merge into t1 using (select t2.fname,t2.fmoney from t2) t on (t.fname = t1.fname) when matched then update set t1.fmoney = t.fmoney;