下面是一些学习如何用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 | |
+++++