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排序的首个值的数据

原文地址:https://www.cnblogs.com/learning/p/5356560.html