数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

MySQL中文参考手册-- 常用查询的例子


发布日期:2023年03月14日
 
MySQL中文参考手册-- 常用查询的例子

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

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

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

CREATE TABLE shop (

article INT() UNSIGNED ZEROFILL DEFAULT NOT NULL

dealerCHAR() DEFAULT NOT NULL

price DOUBLE() DEFAULT NOT NULL

PRIMARY KEY(article dealer));

INSERT INTO shop VALUES

(A)(B)(A)(B)(C)

(D)(D);

好了例子数据是这样的

SELECT * FROM shop

++++

| article | dealer | price |

++++

| | A| |

| | B| |

| | A| |

| | B| |

| | C| |

| | D| |

| | D| |

++++

列的最大值

最大的物品号是什么?

SELECT MAX(article) AS article FROM shop

++

| article |

++

| |

++

拥有某个列的最大值的行

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

在ANSISQL中这很容易用一个子查询做到

SELECT article dealer price

FROM shop

WHEREprice=(SELECT MAX(price) FROM shop)

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

用一个SELECT语句从表中得到最大值

使用该值编出实际的查询

SELECT article dealer price

FROM shop

WHEREprice=

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

SELECT article dealer price

FROM shop

ORDER BY price DESC

LIMIT

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

列的最大值按组只有值

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

SELECT article MAX(price) AS price

FROM shop

GROUP BY article

+++

| article | price |

+++

| | |

| | |

| | |

| | |

+++

拥有某个字段的组间最大值的行

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

在ANSI SQL中我可以用这样一个子查询做到

SELECT article dealer price

FROM shop s

WHEREprice=(SELECT MAX(sprice)

FROM shop s

WHERE sarticle = sarticle)

在MySQL中最好是分几步做到

得到一个表(文章maxprice) 拥有某个域的组间最大值的行

对每篇文章得到对应于存储最大价格的行

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

CREATE TEMPORARY TABLE tmp (

article INT() UNSIGNED ZEROFILL DEFAULT NOT NULL

price DOUBLE() DEFAULT NOT NULL);

LOCK TABLES article read;

INSERT INTO tmp SELECT article MAX(price) FROM shop GROUP BY article;

SELECT article dealer price FROM shop tmp

WHERE shoparticle=tmparticel AND shopprice=tmpprice;

UNLOCK TABLES;

DROP TABLE tmp;

如果你不使用一个TEMPORARY表你也必须锁定tmp

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

是的但是只有使用我称之为MAXCONCAT诡计的一个相当低效的诡计

SELECT article

SUBSTRING( MAX( CONCAT(LPAD(price)dealer) ) ) AS dealer

+LEFT(MAX( CONCAT(LPAD(price)dealer) ) ) AS price

FROM shop

GROUP BY article;

++++

| article | dealer | price |

++++

| | B| |

| | A| |

| | C| |

| | D| |

++++

最后例子当然能通过在客户程序中分割连结的列使它更有效一点

使用外键

不需要外键联结个表

MySQL唯一不做的事情是CHECK以保证你使用的键确实在你正在引用表中存在并且它不自动从有一个外键定义的表中删除行如果你象平常那样使用你的键值它将工作得很好!

CREATE TABLE persons (

id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT

name CHAR() NOT NULL

PRIMARY KEY (id)

);

CREATE TABLE shirts (

id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT

style ENUM(tshirt polo dress) NOT NULL

color ENUM(red blue orange white black) NOT NULL

owner SMALLINT UNSIGNED NOT NULL REFERENCES persons

PRIMARY KEY (id)

);

INSERT INTO persons VALUES (NULL Antonio Paz);

INSERT INTO shirts VALUES

(NULL polo blue LAST_INSERT_ID())

(NULL dress white LAST_INSERT_ID())

(NULL tshirt blue LAST_INSERT_ID());

INSERT INTO persons VALUES (NULL Lilliana Angelovska);

INSERT INTO shirts VALUES

(NULL dress orange LAST_INSERT_ID())

(NULL polo red LAST_INSERT_ID())

(NULL dress blue LAST_INSERT_ID())

(NULL tshirt white LAST_INSERT_ID());

SELECT * FROM persons;

+++

| id | name|

+++

| | Antonio Paz |

| | Lilliana Angelovska |

+++

SELECT * FROM shirts;

+++++

| id | style | color| owner |

+++++

| | polo| blue | |

| | dress | white| |

| | tshirt | blue | |

| | dress | orange | |

| | polo| red| |

| | dress | blue | |

| | tshirt | white| |

+++++

SELECT s* FROM persons p shirts s

WHERE pname LIKE Lilliana%

AND sowner = pid

AND lor <> white;

+++++

| id | style | color| owner |

+++++

| | dress | orange | |

| | polo| red| |

| | dress | blue | |

+++++

上一篇:如何实现MySQL数据库的备份与恢复

下一篇:重置MySQL数据库密码的实际操作流程