任务:找出最贵物品的编号、销售商和价格。
表如下:
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | A      |  3.45 |
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | B      |  1.45 |
|    0003 | C      |  1.69 |
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+
比较以下几条sql语句执行效率:
1.SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop);2. select s1.article,s1.dealer,s1.price
 from shop s1,(select max(price) price from shop) s2
 where s1.price = s2.price;3.SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;以上三条那条执行效率高?
如果您有更好的请写下来,谢谢各位!!

解决方案 »

  1.   

    3 执行效率高price 加索引
      

  2.   


    SELECT article, dealer, price 
    FROM  shop s
    WHERE  not exists(SELECT * FROM shop where price>s.price); 
    运用EXISTS子句不管子查询从表中抽取什么数据它只查看where子句
    正如1楼所说,如果在price上建立索引的话,这种用法速度会更快,不必遍历整个表而仅根据索引就可完成工作。
      

  3.   

    shop表比较大的情况下,可以在price字段上建立索引,如下:create index idx_shop_price on shop(price);这样采用第三种方式的效率比较高,因为使用price字段上的索引,只需要一次索引扫描就可以完成.
      

  4.   

    哇哈哈哈,你问对地方了哦,我曾经遇到过这种问题,虽然我是用postgreSQL但原理都一样。
    在数据库里建立一个maxnumber表,专门记载shop表的最大值
    在数据库里建立一个事务,没变更一次shop表变更一次shop的最大值,这么说可能你不明白,我再说具体点,
    比如shop表什么都没有的情况下,maxnumber表中maxnumber字段只有一个值,就是'0000',price字段是'0',如果shop被更新了,则触发事务比较那个新的price值是否比maxnumber表中的price字段中原有的值大,如果大则更新maxnumber字段为shop表中article的字段的值。。
    这样就省去了每次都要max的麻烦了
    以上是偶的经验之谈,没有什么高深的技术,只是个土办法,不过绝对有效,哈哈。
      

  5.   

    3.SELECT article, dealer, price 
    FROM shop 
    ORDER BY price DESC 
    LIMIT 1; 
    这个高,前提是PRICE有索引。
      

  6.   

    SELECT article, dealer, price
    FROM shop
    where price=max(price)
      

  7.   

    楼上最好把写的sql语句在库上跑跑看
      

  8.   

    3.SELECT article, dealer, price 
    FROM shop 
    ORDER BY price DESC 
    LIMIT 1; 
    这个高,前提是PRICE有索引。