sql与数据库学习加深

时间:2022-01-17 01:26:14

一.表连接

  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;