sql(复杂)

 

目录

1.两个字段确定唯一,查询有没有重复

2.删除ID不同其他字段都相同的数据

3.多个字段in查询

4.分组查询前N个

5.select distinct 后面跟left jion 分页可能会导致数据重复问题 

6.left jion 统计统计右表与右表每条数据的关联 数据

7.查询两个时间间隔的小时数

8.按照拼音排序

9.left join关联表可以添加条件

10.delete和left join 结合使用

11.更新和jion结合使用

12.求日期的间隔天数 

13.删除表的时候禁用外键索引


1.两个字段确定唯一,查询有没有重复

 

SELECT  A,B,"COUNT"(*) FROM 表 GROUP BY A,B

SELECT "MIN"(id) ,A,B,"COUNT"(*) FROM 表 WHERE **  GROUP BY A,B

单个

SELECT person_id ,COUNT(*)FROM t22000_member_points_info GROUP BY person_id HAVING  COUNT(*)>1
group by 之后不能用where 要用having

2.删除ID不同其他字段都相同的数据

delete tablename where ID not in(select min( ID) from tablename group by学号, 姓名, 课程编号, 课程名称, 分数)

3.多个字段in查询

单表

select * from SRO_ORDER where (FIRST_BIZ_ID,SECOND_BIZ_ID) in ((500,505),(502,503)); 

select * from b where exists ( select * from a where a.aaa=b.aaa and a.bbb=b.bbb);

// 多表

select * from SUPPLIER_UNIT_PRICE where (FIRST_BIZ_ID,SECOND_BIZ_ID) in (select BUSINESS_CATEGORY_ID,BUSINESS_SUBCLASS_ID from BUSINESS_RELATIONSHIP WHERE id = 500);

4.分组查询前N个

通用写法

select * from SUPPLIER_UNIT_PRICE t1 WHERE (select COUNT(*) from SUPPLIER_UNIT_PRICE t2 where t2.SUPPLIER_ID = t1.SUPPLIER_ID AND t2.PRICE >= t1.PRICE ) < 3 ORDER BY SUPPLIER_ID DESC

mysql写法一

(select * from fruits where type = 'apple' order by price limit 2)
union all
(select * from fruits where type = 'orange' order by price limit 2)
union all
(select * from fruits where type = 'pear' order by price limit 2)

oracle写法一 (采用rownum) 

ROWNUM和ORDER BY的优先级比较是要分情况的,order by 索引,主键时,即可让oracle先按该字段排序,然后再用rownum标号 ;order by 普通列时,先rownum后order by

(SELECT * FROM (select * from SUPPLIER_UNIT_PRICE where SUPPLIER_ID = '512' order by PRICE DESC)  WHERE  rownum <=3)
union all
(SELECT * FROM (select * from SUPPLIER_UNIT_PRICE where SUPPLIER_ID = '661' order by PRICE DESC)  WHERE  rownum <=3)

<if test="list !=null and list.size >0">
  <foreach item="item" index="index" collection="list"  separator="union all" >
    ( SELECT * FROM (select * from SUPPLIER_UNIT_PRICE where SUPPLIER_ID = #{item.id} order by PRICE DESC)  WHERE  rownum &lt;= 3 )
  </foreach>
</if>

5.select distinct 后面跟left jion 分页可能会导致数据重复问题 

必须有主表中唯一键 order by

6.left jion 统计统计右表与右表每条数据的关联 数据

SELECT
    t.ID,
    to_char( t.CREATE_DATE, 'yyyy-mm-dd hh24:mi:ss' ),
    t.TITLE,
    t.ACCOUNT_ID,
    e.USER_NOTESNAME,
    t.INVITED_USERS,
    e.USER_DEPTPATH,
    t.VIEWS,
  (SELECT COUNT(*) FROM DOC_COLLECTOR dc WHERE dc.DOC_ID = t.ID)  as DOC_COLLECTOR,
    (SELECT COUNT(*) FROM DOC_SHARE ds WHERE ds.DOC_ID = t.ID)  as DOC_SHARE,
    (SELECT COUNT(*) FROM DOC_EFFECTIVE de WHERE de.DOC_ID = t.ID AND de.EFFECTIVE_FLAG=1)  as DOC_EFFECTIVE1,
    (SELECT COUNT(*) FROM DOC_EFFECTIVE de WHERE de.DOC_ID = t.ID AND de.EFFECTIVE_FLAG=0)  as DOC_EFFECTIVE0    
FROM
    DOCUMENT t    
    LEFT JOIN v_emp_asset @oahr e ON t.INVITED_USERS = e.user_shortname 
WHERE
    t.CREATE_DATE > to_date( '2018-08-31 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ) 
ORDER BY
    t.CREATE_DATE DESC

7.查询两个时间间隔的小时数

ROUND(TO_NUMBER(b.SIGNIN_TIME - b.SUPPLIER_TIME) * 24,2)

8.按照拼音排序

举例如下:
表名为 dept ,其中name字段是中文,下面分别实现按照单位名称的笔划、部首和拼音排序。
//按照笔划排序
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
 //按照部首排序
 select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
//按照拼音排序,此为系统的默认排序方式
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');

9.left join关联表可以添加条件

select * from SRO_ORDER so

left join ORDER_SERIAL_NUMBER osn ON so.ORDER_CODE = osn.ORDER_CODE and osn.DELETE_STATUS =0

10.delete和left join 结合使用

指定删除哪张表不然有错误
DELETE g
FROM
    t${tenantId}_contactlinkgroup g
        LEFT JOIN t${tenantId}_contact c ON c.id = g.contactid
WHERE
    g.groupid = #{groupId}
  AND c.identity = #{identity}

11.更新和jion结合使用

UPDATE t12818_member t1
INNER JOIN  (SELECT * FROM (SELECT
    a.member_id,
    a.growth_log,
    m.growth,
    c.real_name
FROM
    (
        SELECT
            l.member_id,
            SUM(l.exchange_growth) AS growth_log
        FROM
            t12818_member_growth_log l
        GROUP BY
            l.member_id
    ) a
LEFT JOIN t12818_member m ON m.id = a.member_id
LEFT JOIN t12818_contact c ON m.id = c.member_id
WHERE
    a.growth_log != m.growth) a) t2  ON t2.member_id    = t1.id
SET t1.growth = t2.growth_log
 

12.求日期的间隔天数 

SELECT DATEDIFF(maxDate,minDate) div num FROM (SELECT MAX(create_time)as maxDate, MIN(create_time) as minDate ,COUNT(*)as num FROM t12818_order WHERE contact_id = 63357) a 
 

13.删除表的时候禁用外键索引

SET FOREIGN_KEY_CHECKS = 0; 

14.sql字符串替换

UPDATE t12818_short_link_long SET long_url = REPLACE(long_url,'imageTextGroup','2222') WHERE id = 21
 中替换函数 REPLACE(s,s1,s2) 使用字符串 s2 替换字符串 s 中所有的字符串 s1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值