中文参考手册--8.MySQL教程--8.3常用查询的例子

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

下面是一些学习如何用MySQL解决一些常见问题的例子

一些例子使用表“shop”,包含某个商人的每篇文章(物品号)的价格。假定每个商人的每篇文章有一个单独的固定价格,那么(物品,商人)是记录的主键。

你能这样创建例子数据库表:

CREATETABLEshop(articleINT(4)UNSIGNEDZEROFILLDEFAULT'0000'NOTNULL,dealerCHAR(20)DEFAULT''NOTNULL,priceDOUBLE(16,2)DEFAULT'0.00'NOTNULL,PRIMARYKEY(article,dealer));INSERTINTOshopVALUES(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

好了,例子数据是这样的:

SELECT*FROMshop+---------+--------+-------+|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|+---------+--------+-------+

“最大的物品号是什么?”

SELECTMAX(article)ASarticleFROMshop+---------+|article|+---------+|4|+---------+

“找出最贵的文章的编号、商人和价格”

在ANSI-SQL中这很容易用一个子查询做到:

SELECTarticle,dealer,priceFROMshopWHEREprice=(SELECTMAX(price)FROMshop)

MySQL中(还没有子查询)就用2步做到:

  1. 用一个 语句从表中得到最大值。使用该值编出实际的 查询
    SELECTarticle,dealer,priceFROMshopWHEREprice=19.95

另一个解决方案是按价格降序排序所有行并用MySQL特定子句只得到的第一行:

SELECTarticle,dealer,priceFROMshopORDERBYpriceDESCLIMIT1

注意:如果有多个最贵的文章(例如每个19.95)解决方案仅仅显示他们之一!

“每篇文章的最高的价格是什么?”

SELECTarticle,MAX(price)ASpriceFROMshopGROUPBYarticle+---------+-------+|article|price|+---------+-------+|0001|3.99||0002|10.99||0003|1.69||0004|19.95|+---------+-------+

“对每篇文章,找出有最贵的价格的交易者。”

中,我可以用这样一个子查询做到:

SELECTarticle,dealer,priceFROMshops1WHEREprice=(SELECTMAX(s2.price)FROMshops2WHEREs1.article=s2.article)

MySQL中,最好是分几步做到:

  1. 得到一个表(文章,maxprice)。见。对每篇文章,得到对应于存储最大价格的行。

这可以很容易用一个临时表做到:

CREATETEMPORARYTABLEtmp(articleINT(4)UNSIGNEDZEROFILLDEFAULT'0000'NOTNULL,priceDOUBLE(16,2)DEFAULT'0.00'NOTNULL);LOCKTABLESarticleread;INSERTINTOtmpSELECTarticle,MAX(price)FROMshopGROUPBYarticle;SELECTarticle,dealer,priceFROMshop,tmpWHEREshop.article=tmp.articelANDshop.price=tmp.price;UNLOCKTABLES;DROPTABLEtmp;

如果你不使用一个表,你也必须锁定“tmp”表。

“它能一个单个查询做到吗?”

是的,但是只有使用我称之为“MAX-CONCAT诡计”的一个相当低效的诡计:上一页 
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值