• SQL语句编写心得(基础及进阶)


    sql语句非常博大精深,我仅奉上所知皮毛

    一 增加列

    (1)最基础的就是直接select,select 1,2

    (2)好,那么查一个表的某字段:select columna from tablea,地球人都知道

    (3)那么,查询有关联的2个表A,B的字段a1 b1,有2种写法:

        select A.a1,B.b1 from  A left join B on A.a2=B.b2  或者

        select A.a1,(select b1 from B where B.a2=A.a2) from A  ,这个很常见吧,是不是觉得so easy。

    那么第一种写法,最终得到的结果集行数,是大于或等于A表行数,依赖于A表与B表的关系字段(a2,b2)关联关系。

      当b2与a2一一对应,则结果行数=A表行数。

          当b2少于a2的对应,依然是行数=A表行数,对应不上的B表的值为null。

      当b2与a2是多对一的关系的时候,则结果集行数>A表行数。

    第二种写法:最终得到的结果集行数,必然等于A表的行数,那么问题来了,当a2有多个b2对应的时候,会怎样?答案是那样的话sql语句会报错,所以这种情况下该sql语句应该改为:

         select A.a1,(select top 1 b1 from B where B.a2=A.a2) from A  

    (4)那么,其实sql语句可以更加灵活,你要了解到from和left join 不仅仅可以作用于表,其本质作用的对象是数据集,下面的例子说明:

    select a1,b1 from 

    (

    select a1 from A left Join B on A.a2=B.b2

    ) as D

    left join 

    (

    select c1,c2 from c 

    ) as E on D.b1=E.c1 

    那么,这条sql语句结果出来是有4个字段,a1,b1,c1,c2。其结果集的行数应该表述为:最终得到的结果集行数,是大于或等于结果集D行数

    二、增加行

    增加行最长见的应该是union及union all的写法,这里需要注意的就是,union前后的数据集的字段个数及名称结构必须一致,union all会自动去重,效率高一点

    三、筛选行

    众所周知筛选行就是用where 了,那么,where后面可以常用的有以下几种方法:

    (1)=某个值 ,select a1 from A where a1=1 ,延伸一点:select a1 from A where a1=(select b1 from B)

    (2)使用in,即等于某些值,select a1 from A where a1 in(1,2),同上,select a1 from A where a1 in(select b1 from B)

    (3)使用exists,exists适用于一些稍微复杂一点的筛选条件,常见的用法如下:

    select a1 from A where  not exists( select 1 from B where  B.b2=A.a2)

    如此,我将表A中的a2的值与表B中b2相同的数据进行了排除,exists的效率是比较高的

    四、分组

    分组使用的关键字是group by ,那么经常配合使用的关键字是having,例如:

    select a1,count(1) from A group by A.a1 having count(1)>2

    则查出按a1分组后,每组的原数据行数大于2的数据集

    那么,我将上面所有的语法全部结合在一起的sql

    select a1,b1 from 

    (

    select a1 from A left Join B on A.a2=B.b2 where a1=1

    ) as D

    left join 

    (

    select c1,c2 from c  where not exist (select 1 from F where f1=c1 )

    ) as E on D.b1=E.c1 

    union all

    select a1,b1 from 

    (

    select a1 from A left Join B on A.a2=B.b2 where a1 in(2,3)

    ) as D

    left join 

    (

    select c1,c2 from c  where exist (

            select 1 from 

                          (

              select g1 from G 

                            group by G.g1 having count(1)>2

            ) as H where H.g1=c1

          )

    ) as E on D.b1=E.c1 

    五、非常实用的关键字:

    (1)case when 关键字,这个用来做sum的时候效率非常高,如:

    select sum(case a1 when '男' then 1 else 0 end ) from A 或者 查出所有a1值为男的数据行数

    select sum(case when a1>10 then 1 else 0 end ) from A  查出所有a1值大于10的数据行数

    (2)with as关键字:增加sql的可读性,

    with C as (select A.a1,A.a2,B.b1,B.b2 from A left join B on A.a2=B.b2) 

    select * from C

    (3)Partition By 关键字,分组并排序,常结合row_number使用

    select B.a1,B.s1 from 

    (

    select a1,ROW_NUMBER() OVER(PARTITION BY a2 ORDER BY a3 ASC) AS s1 FROM A

    ) B
    WHERE  B.s1=1   查出按a2分组,且按a3排序的首个值的数据

  • 相关阅读:
    prase arraylist where in to ParamsQuery on sql server 2008 using TVB: tvpdemo.cs(where in 转sql 参数化查询)
    手动依赖性注入 NInject(1) (转载)
    单件(单态,Singleton)模式部分
    详解Javascript中的Url编码/解码
    学习Web应用漏洞最好的教程WebGoat(转载)
    百度网盘 邀请码
    colorbox去除close关闭按钮,附上colorbox的基本使用方法
    P3974 [TJOI2015]组合数学
    P1772 [ZJOI2006]物流运输
    P1434 [SHOI2002]滑雪
  • 原文地址:https://www.cnblogs.com/learning/p/5356560.html
Copyright © 2020-2023  润新知