您的位置:首页 > 数据库 > MySQL

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

2008-04-30 09:30 369 查看

下面是一些学习如何用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步做到:用一个
语句从表中得到最大值。使用该值编出实际的查询
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中,最好是分几步做到:得到一个表(文章,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诡计”的一个相当低效的诡计:上一页
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: