6 常用查詢的例子

下面是一些學(xué)習(xí)如何用MySQL解決一些常見(jiàn)問(wèn)題的例子憨奸。

在一些例子中驱富,使用數(shù)據(jù)庫(kù)表“shop”來(lái)儲(chǔ)存某個(gè)商人(經(jīng)銷商)的每件物品(物品號(hào))的價(jià)格锚赤。假定每個(gè)商人對(duì)每項(xiàng)物品有一個(gè)固定價(jià)格,那么(物品褐鸥,商人)即為該記錄的主關(guān)鍵字线脚。

啟動(dòng)命令行工具mysql并選擇數(shù)據(jù)庫(kù):
  • 你可以使用以下語(yǔ)句創(chuàng)建示例表:
mysql> CREATE TABLE shop (article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,dealer  CHAR(20)   DEFAULT ''  NOT NULL, price   DOUBLE(16,2) DEFAULT '0.00' NOT NULL, PRIMARY KEY(article, dealer));

mysql> INSERT INTO shop VALUES (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);
  • 執(zhí)行語(yǔ)句后,表應(yīng)包含以下內(nèi)容:
mysql> SELECT * FROM shop;
+---------+--------+-------+
| 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 |
+---------+--------+-------+
  • 列的最大值
    “最大的物品號(hào)是什么叫榕?”
SELECT MAX(article) AS article FROM shop;

+---------+
| article |
+---------+
|       4 |
+---------+
  • 擁有某個(gè)列的最大值的行
    任務(wù):找出最貴物品的編號(hào)浑侥、銷售商和價(jià)格。
    這很容易用一個(gè)子查詢做到:
SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop);

另一個(gè)解決方案是按價(jià)格降序排序所有行并用MySQL特定LIMIT子句只得到第一行:

SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;

注:如果有多項(xiàng)最貴的物品( 例如每個(gè)的價(jià)格為19.95)晰绎,LIMIT解決方案僅僅顯示其中一個(gè)寓落!

  • 列的最大值:按組
    任務(wù):每項(xiàng)物品的的最高價(jià)格是多少?
SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article

+---------+-------+
| article | price |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+
  • 擁有某個(gè)字段的組間最大值的行
    任務(wù):對(duì)每項(xiàng)物品寒匙,找出最貴價(jià)格的物品的經(jīng)銷商零如。

可以用這樣一個(gè)子查詢解決該問(wèn)題:

SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article);
  • 使用用戶變量
    你可以清空MySQL用戶變量以記錄結(jié)果躏将,不必將它們保存到客戶端的臨時(shí)變量中。

例如考蕾,要找出價(jià)格最高或最低的物品的祸憋,其方法是:

mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+
  • 使用外鍵
    在MySQL中,InnoDB表支持對(duì)外部關(guān)鍵字約束條件的檢查肖卧。

只是聯(lián)接兩個(gè)表時(shí)蚯窥,不需要外部關(guān)鍵字。對(duì)于除InnoDB類型的表塞帐,當(dāng)使用REFERENCES tbl_name(col_name)子句定義列時(shí)可以使用外部關(guān)鍵字拦赠,該子句沒(méi)有實(shí)際的效果,只作為備忘錄或注釋來(lái)提醒葵姥,你目前正定義的列指向另一個(gè)表中的一個(gè)列荷鼠。執(zhí)行該語(yǔ)句時(shí),實(shí)現(xiàn)下面很重要:

· MySQL不執(zhí)行表tbl_name中的動(dòng)作榔幸,例如作為你正定義的表中的行的動(dòng)作的響應(yīng)而刪除行允乐;換句話說(shuō),該句法不會(huì)致使ON DELETE或ON UPDATE行為(如果你在REFERENCES子句中寫(xiě)入ON DELETE或ON UPDATE子句削咆,將被忽略)牍疏。

· 該句法可以創(chuàng)建一個(gè)column;但不創(chuàng)建任何索引或關(guān)鍵字拨齐。

·如果用該句法定義InnoDB表鳞陨,將會(huì)導(dǎo)致錯(cuò)誤。

你可以使用作為聯(lián)接列創(chuàng)建的列瞻惋,如下所示:

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

 
CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    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),
    PRIMARY KEY (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');
 
SELECT @last := LAST_INSERT_ID();
 
INSERT INTO shirt VALUES
(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子句不會(huì)顯示在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熟史。

  • 根據(jù)兩個(gè)鍵搜索

可以充分利用使用單關(guān)鍵字的OR子句馁害,如同AND的處理。

一個(gè)比較靈活的例子是尋找兩個(gè)通過(guò)OR組合到一起的關(guān)鍵字:

SELECT field1_index, field2_index FROM test_table
WHERE field1_index = '1' OR  field2_index = '1'

該情形是已經(jīng)優(yōu)化過(guò)的蹂匹。

還可以使用UNION將兩個(gè)單獨(dú)的SELECT語(yǔ)句的輸出合成到一起來(lái)更有效地解決該問(wèn)題碘菜。

每個(gè)SELECT只搜索一個(gè)關(guān)鍵字,可以進(jìn)行優(yōu)化:

SELECT field1_index, field2_index
    FROM test_table WHERE field1_index = '1'
UNION
SELECT field1_index, field2_index
    FROM test_table WHERE field2_index = '1';
  • 根據(jù)天計(jì)算訪問(wèn)量

下面的例子顯示了如何使用位組函數(shù)來(lái)計(jì)算每個(gè)月中用戶訪問(wèn)網(wǎng)頁(yè)的天數(shù)限寞。

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);

示例表中含有代表用戶訪問(wèn)網(wǎng)頁(yè)的年-月-日值忍啸。可以使用以下查詢來(lái)確定每個(gè)月的訪問(wèn)天數(shù):

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 |
+------+-------+------+

該查詢計(jì)算了在表中按年/月組合的不同天數(shù)履植,可以自動(dòng)去除重復(fù)的詢問(wèn)计雌。

  • 使用AUTO_INCREMENT

可以通過(guò)AUTO_INCREMENT屬性為新的行產(chǎn)生唯一的標(biāo)識(shí):

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函數(shù)或mysql_insert_id() C API函數(shù)來(lái)查詢最新的AUTO_INCREMENT值。這些函數(shù)與具體連接有關(guān)玫霎,因此其返回值不會(huì)被其它執(zhí)行插入功能的連接影響凿滤。

注釋:對(duì)于多行插入妈橄,LAST_INSERT_ID()和mysql_insert_id()從插入的第一行實(shí)際返回AUTO_INCREMENT關(guān)鍵字。在復(fù)制設(shè)置中翁脆,通過(guò)該函數(shù)可以在其它服務(wù)器上正確復(fù)制多行插入眷蚓。

對(duì)于MyISAM和BDB表,你可以在第二欄指定AUTO_INCREMENT以及多列索引反番。此時(shí)沙热,AUTO_INCREMENT列生成的值的計(jì)算方法為:MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。如果想要將數(shù)據(jù)放入到排序的組中可以使用該方法罢缸。

CREATE TABLE animals (
    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 |
+--------+----+---------+

請(qǐng)注意在這種情況下(AUTO_INCREMENT列是多列索引的一部分)篙贸,如果你在任何組中刪除有最大AUTO_INCREMENT值的行,將會(huì)重新用到AUTO_INCREMENT值枫疆。對(duì)于MyISAM表也如此,對(duì)于該表一般不重復(fù)使用AUTO_INCREMENT值爵川。

如果AUTO_INCREMENT列是多索引的一部分,MySQL將使用該索引生成以AUTO_INCREMENT列開(kāi)始的序列值养铸。雁芙。例如,如果animals表含有索引PRIMARY KEY (grp, id)和INDEX(id)钞螟,MySQL生成序列值時(shí)將忽略PRIMARY KEY。結(jié)果是谎碍,該表包含一個(gè)單個(gè)的序列鳞滨,而不是符合grp值的序列。

要想以AUTO_INCREMENT值開(kāi)始而不是1蟆淀,你可以通過(guò)CREATE TABLE或ALTER TABLE來(lái)設(shè)置該值拯啦,如下所示:

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市熔任,隨后出現(xiàn)的幾起案子褒链,更是在濱河造成了極大的恐慌,老刑警劉巖疑苔,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甫匹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惦费,警方通過(guò)查閱死者的電腦和手機(jī)兵迅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)薪贫,“玉大人恍箭,你說(shuō)我怎么就攤上這事∏剖。” “怎么了扯夭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鳍贾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我交洗,道長(zhǎng)骑科,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任藕筋,我火速辦了婚禮纵散,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隐圾。我一直安慰自己伍掀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布暇藏。 她就那樣靜靜地躺著蜜笤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盐碱。 梳的紋絲不亂的頭發(fā)上把兔,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音瓮顽,去河邊找鬼县好。 笑死,一個(gè)胖子當(dāng)著我的面吹牛暖混,可吹牛的內(nèi)容都是我干的缕贡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拣播,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晾咪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起贮配,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谍倦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后泪勒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昼蛀,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年酣藻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曹洽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辽剧,死狀恐怖送淆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怕轿,我是刑警寧澤偷崩,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布辟拷,位于F島的核電站,受9級(jí)特大地震影響阐斜,放射性物質(zhì)發(fā)生泄漏衫冻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一谒出、第九天 我趴在偏房一處隱蔽的房頂上張望隅俘。 院中可真熱鬧,春花似錦笤喳、人聲如沸为居。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒙畴。三九已至,卻和暖如春呜象,著一層夾襖步出監(jiān)牢的瞬間膳凝,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工恭陡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹬音,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓休玩,卻偏偏與公主長(zhǎng)得像祟绊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哥捕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 什么是數(shù)據(jù)庫(kù)? 數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序嘉熊。每個(gè)數(shù)據(jù)庫(kù)具有一個(gè)或多個(gè)不同的API遥赚,用于創(chuàng)建,訪問(wèn)阐肤,管理...
    chen_000閱讀 4,035評(píng)論 0 19
  • 關(guān)系型數(shù)據(jù)庫(kù)和SQL SQL語(yǔ)言的三個(gè)部分DML:Data Manipulation Language凫佛,數(shù)據(jù)操縱語(yǔ)...
    Awey閱讀 1,947評(píng)論 0 13
  • SQL與MySQL簡(jiǎn)介 數(shù)據(jù)庫(kù)基礎(chǔ) 從SQL的角度來(lái)看,數(shù)據(jù)庫(kù)就是一個(gè)以某種有組織的方式存儲(chǔ)的數(shù)據(jù)集合孕惜。我們可以采...
    heming閱讀 3,080評(píng)論 1 8
  • SQL SELECT 語(yǔ)句 一愧薛、查詢SQL SELECT 語(yǔ)法 (1)SELECT 列名稱 FROM 表名稱 (2...
    有錢(qián)且幸福閱讀 5,446評(píng)論 0 33
  • 現(xiàn)在的我努力的去學(xué)習(xí),去生活衫画,去健身………我希望在遇見(jiàn)那個(gè)走進(jìn)我心里的人時(shí)毫炉,不會(huì)因?yàn)橥饷埠蜕聿亩o他造成困擾,讓他...
    我是誰(shuí)Who閱讀 214評(píng)論 0 0