zoukankan      html  css  js  c++  java
  • MySQL中集合的差的运算方法

    MySql只支持Union(并集)集合运算,好像也是4.0以后才有的;
    但是对于交集Intersect、差集Except,就没有实现了。
    一般的解决方案用in和not in来解决,小量数据还可以,但数据量大了效率就很低了。
    其实,可以使用Union来实现另外两种的运算,当然是没有办法的办法。
    
    差集Except:
    
    SELECT ID FROM (
    SELECT DISTINCT A.AID AS ID FROM TABLE_A A
    UNION ALL
    SELECT DISTINCT B.BID AS ID FROM TABLE_B B
    )TEMP GROUP BY ID HAVING COUNT(ID) = 1
    
    交集Intersect:
    SELECT ID FROM (
    SELECT DISTINCT A.AID AS ID FROM TABLE_A A
    UNION ALL
    SELECT DISTINCT B.BID AS ID FROM TABLE_B B
    )TEMP GROUP BY ID HAVING COUNT(ID) = 2
    
    不过,上述方法的功能也有限,
    只能用来检查某个id是不是A、B表中都存在,
    或者只存在于A、B表其中之一,
    并不能对id在某表中多次出现做出检查。
    而且,差集是有先后之分,这里没有。

    2. http://hi.baidu.com/truetruelove/blog/item/f0fda8441bf22048510ffeba.html

    1。求两表差集, ewb_t_books 是图书表,ewb_t_title是图书分类表,通过bt_titleid(not null)连接。
    找出分类不存在的图书
    a.子查询使用not in
    #explain extended
    SELECT book_id,bt_titleid
    FROM ewb_t_books b
    WHERE bt_titleid NOT IN (SELECT bt_titleid FROM ewb_t_title)
    #show warnings;
    
    b.子查询 not exists
    #explain extended
    SELECT book_id,bt_titleid
    FROM ewb_t_books b
    WHERE NOT EXISTS (SELECT * FROM ewb_t_title a WHERE b.bt_titleid= a.bt_titleid )
    #show warnings;
    
    c.左连接判断右表is null
    #explain extended
    SELECT book_id,bt_titleid
    FROM ewb_t_books LEFT JOIN ewb_t_title b USING (bt_titleid)
    WHERE ISNULL(b.bt_titleid)
    #show warnings;
    
    总结:简单测试了一下,not in最慢,其他两个平分秋色,有待考证。
    
    select * from employee where salary<>3000;
    
      对这个查询,可以改写为不使用NOT:
    
    select * from employee where salary<3000 or salary>3000;
    
    虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许数据库对salary列使用索引,而第一种查询则不能使用索引
    

      

  • 相关阅读:
    QOS-Qos标记和QOS-Policy策略
    QOS-CBQ概述
    QOS-基本拥塞管理机制(PQ CQ WFQ RTPQ)
    QOS-QOS(服务质量)概述
    MariaDB数据库服务
    24、配置Oracle下sqlplus历史命令的回调功能
    11、nginx+tomcat+redis_session共享
    9、make和make install的区别
    10、nginx+uwsgi+django部署(动静分离)
    15、iptables_nat目标地址转换(外网访问内网)
  • 原文地址:https://www.cnblogs.com/liboware/p/12502387.html
Copyright © 2011-2022 走看看