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

来源:互联网 发布:域名交易中心 编辑:程序博客网 时间:2024/05/22 06:43
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></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步做到:

    用一个语句从表中得到最大值。使用该值编出实际的查询
    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诡计”的一个相当低效的诡计:上一页 
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击