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