一、左连接

select *

FROM t_gooddel g
LEFT JOIN t_creatshop as shop on g.shoping_id = shop.creatshop_id,
t_apply_snapup_detail tasd
Left join t_apply_snapup as tas on tasd.apply_id=tas. id
where 1=1
and g.is_added=1 and shop.status = 1 and g.gooddeal_id= tasd.good_id

二、

1)not in 查询 left join 替代法 (参考:http://bbs.csdn.net/topics/370222093?locationNum=9)

     

not in:

    select * from tab2  t2 where t2.size not in (select t1.size from tab1 t1 where t2.size=t1.size)

left join

            select * from tab2 t2 left join tab1 t1 on t1.size=t2.size where t1.id is NULL

2)如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替。比如

in:

           select * from tab1 t1 where t1.size in (select t2.size from tab2 t2 where t2.size=t1.size)

inner join :

    select * from tab1 INNER JOIN tab2 on tab1.size=tab2.size

    或

    select * from tab1,tab2  where tab1.size=tab2.size

3) IN的相关子查询用EXISTS代替,比如:

in: 

    select * from tab1 t1 where t1.size in (select t2.size from tab2 t2 where t2.size=t1.size)
exits:

    select * from tab1 t1 where  exists  (select 1 from tab2 t2 where t2.size=t1.size)
三:尽量使用索引
  建立索引后,并不是每个查询都会使用索引,在使用索引的情况下,索引的使用效率也会有很大的差别。只要我们在查询语句中没有强制指定索引,索引的选择和使用方法是SQLSERVER的优化器自动作的选择,而它选择的根据是查询语句的条件以及相关表的统计信息,这就要求我们在写SQL语句的时候尽量使得优化器可以使用索引。为了使得优化器能高效使用索引,写语句的时候应该注意:
  (1)不要对索引字段进行运算,而要想办法做变换,比如:
SELECT ID FROM T WHERE NUM/2=100
应改为:
SELECT ID FROM T WHERE NUM=100*2

SELECT ID FROM T WHERE NUM/2=NUM1
如果NUM有索引应改为:
SELECT ID FROM T WHERE NUM=NUM1*2
如果NUM1有索引则不应该改。
  (2)发现过这样的语句:
SELECT 年,月,金额 FROM 结余表 WHERE100*年+月=2010*100+10
1
应该改为:
SELECT 年,月,金额 FROM 结余表 WHERE 年=2010 AND 月=10