“最大的物品号是什麼?”
任務:找出最貴物品的編号、銷售商和價格。這很容易用一個子查詢做到:
另一個解決方案是按價格降序排序所有行并用MySQL特定LIMIT子句隻得到第一行:
注:如果有多項最貴的物品( 例如每個的價格為19.95),LIMIT解決方案僅僅顯示其中一個!
任務:每項物品的的最高價格是多少?
任務:對每項物品,找出最貴價格的物品的經銷商。
可以用這樣一個子查詢解決該問題:
例如,要找出價格最高或最低的物品的,其方法是:
隻是聯接兩個表時,不需要外部關鍵字。對于除InnoDB類型的表,當使用REFERENCES tbl_name(col_name)子句定義列時可以使用外部關鍵字,該子句沒有實際的效果,隻作為備忘錄或注釋來提醒,你目前正定義的列指向另一個表中的一個列。執行該語句時,實作下面很重要:
· MySQL不執行表tbl_name 中的動作,例如作為你正定義的表中的行的動作的響應而删除行;換句話說,該句法不會緻使ON DELETE或ON UPDATE行為(如果你在REFERENCES子句中寫入ON DELETE或ON UPDATE子句,将被忽略)。
· 該句法可以建立一個column;但不建立任何索引或關鍵字。
· 如果用該句法定義InnoDB表,将會導緻錯誤。
你可以使用作為聯接列建立的列,如下所示:
CREATE TABLE person (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name CHAR(60) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE shirt (
style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
INSERT INTO person VALUES (NULL, 'Antonio Paz');
SELECT @last := LAST_INSERT_ID();
INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', @last),
(NULL, 'dress', 'white', @last),
(NULL, 't-shirt', 'blue', @last);
INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
(NULL, 'dress', 'orange', @last),
(NULL, 'polo', 'red', @last),
(NULL, 'dress', 'blue', @last),
(NULL, 't-shirt', 'white', @last);
SELECT * FROM person;
+----+---------------------+
| id | name |
| 1 | Antonio Paz |
| 2 | Lilliana Angelovska |
SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style | color | owner |
| 1 | polo | blue | 1 |
| 2 | dress | white | 1 |
| 3 | t-shirt | blue | 1 |
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
| 7 | t-shirt | white | 2 |
SELECT s.* FROM person p, shirt s
WHERE p.name LIKE 'Lilliana%'
AND s.owner = p.id
AND s.color <> 'white';
+----+-------+--------+-------+
| id | style | color | owner |
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
按照這種方式使用,REFERENCES子句不會顯示在SHOW CREATE TABLE或DESCRIBE的輸出中:
SHOW CREATE TABLE shirt\G
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum('t-shirt','polo','dress') NOT NULL,
`color` enum('red','blue','orange','white','black') NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
在列定義中,按這種方式使用REFERENCES作為注釋或“提示”适用于表MyISAM和BerkeleyDB。
一個比較靈活的例子是尋找兩個通過OR組合到一起的關鍵字:
SELECT field1_index, field2_index FROM test_table
WHERE field1_index = '1' OR field2_index = '1'
每個SELECT隻搜尋一個關鍵字,可以進行優化:
SELECT field1_index, field2_index
FROM test_table WHERE field1_index = '1'
UNION
FROM test_table WHERE field2_index = '1';
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
day INT(2) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
(2000,2,23),(2000,2,23);
示例表中含有代表使用者通路網頁的年-月-日值。可以使用以下查詢來确定每個月的通路天數:
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;
将傳回:
+------+-------+------+
| year | month | days |
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
該查詢計算了在表中按年/月組合的不同天數,可以自動去除重複的詢問。
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
SELECT * FROM animals;
+----+---------+
| id | name |
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
你可以使用LAST_INSERT_ID()SQL函數或mysql_insert_id() C API函數來查詢最新的AUTO_INCREMENT值。這些函數與具體連接配接有關,是以其傳回值不會被其它執行插入功能的連接配接影響。
注釋:對于多行插入,LAST_INSERT_ID()和mysql_insert_id()從插入的第一行實際傳回AUTO_INCREMENT關鍵字。在複制設定中,通過該函數可以在其它伺服器上正确複制多行插入。
對于MyISAM和BDB表,你可以在第二欄指定AUTO_INCREMENT以及多列索引。此時,AUTO_INCREMENT列生成的值的計算方法為:MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。如果想要将資料放入到排序的組中可以使用該方法。
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
+--------+----+---------+
| grp | id | name |
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
請注意在這種情況下(AUTO_INCREMENT列是多列索引的一部分),如果你在任何組中删除有最大AUTO_INCREMENT值的行,将會重新用到AUTO_INCREMENT值。對于MyISAM表也如此,對于該表一般不重複使用AUTO_INCREMENT值。
如果AUTO_INCREMENT列是多索引的一部分,MySQL将使用該索引生成以AUTO_INCREMENT列開始的序列值。。例如,如果animals表含有索引PRIMARY KEY (grp, id)和INDEX(id),MySQL生成序列值時将忽略PRIMARY KEY。結果是,該表包含一個單個的序列,而不是符合grp值的序列。
要想以AUTO_INCREMENT值開始而不是1,你可以通過CREATE TABLE或ALTER TABLE來設定該值,如下所示:
關于AUTO_INCREMENT的詳細資訊:
本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/908931,如需轉載請自行聯系原作者