?? manual_tutorial.html
字號:
<h4><a NAME="Selecting_columns" HREF="manual_toc.html#Selecting_columns">8.4.4.3
選擇特定列</a></h4>
<p>如果你不想要看到你的表的整個行,就命名你感興趣的列,用逗號分開。例如,如果你想要知道你的動物什么時候出生的,精選<code>name</code>和<code>birth</code>列:
</p>
<pre>mysql> SELECT name, birth FROM pet;
+----------+------------+
| name | birth |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
</pre>
<p>找出誰擁有寵物,使用這個查詢: </p>
<pre>mysql> SELECT owner FROM pet;
+--------+
| owner |
+--------+
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Gwen |
| Benny |
| Diane |
+--------+
<p><a NAME="IDX602"></a>然而,注意到查詢簡單地檢索每個記錄的<code>owner</code>字段,并且他們中的一些出現(xiàn)多次。為了使輸出減到最少,通過增加關(guān)鍵詞<code>DISTINCT</code>檢索出每個唯一的輸出記錄:
</p>
<pre>mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner |
+--------+
| Benny |
| Diane |
| Gwen |
| Harold |
+--------+
</pre>
<p>你能使用一個<code>WHERE</code>子句把行選擇與列選擇相結(jié)合。例如,為了只得到狗和貓的出生日期,使用這個查詢:
</p>
<pre>mysql> SELECT name, species, birth FROM pet
-> WHERE species = "dog" OR species = "cat";
+--------+---------+------------+
| name | species | birth |
+--------+---------+------------+
| Fluffy | cat | 1993-02-04 |
| Claws | cat | 1994-03-17 |
| Buffy | dog | 1989-05-13 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
+--------+---------+------------+</pre>
<h4><a NAME="Sorting_rows" HREF="manual_toc.html#Sorting_rows">8.4.4.4 排序行</a></h4>
<p>你可能已經(jīng)注意到前面的例子中結(jié)果行沒有以特定的次序被顯示。然而,當(dāng)行以某個有意義的方式排序,檢驗查詢輸出通常是更容易的。為了排序結(jié)果,使用一個<code>ORDER
BY</code>子句。 </p>
<p>這里是動物生日,按日期排序: </p>
<pre>mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name | birth |
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
</pre>
<p>為了以逆序排序,增加<code>DESC</code>(下降 )關(guān)鍵字到你正在排序的列名上:
</p>
<pre>mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name | birth |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+
</pre>
<p>你能在多個列上排序。例如,按動物的種類排序,然后按生日,首先是動物種類中最年輕的動物,使用下列查詢:
</p>
<pre>mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
+----------+---------+------------+
| name | species | birth |
+----------+---------+------------+
| Chirpy | bird | 1998-09-11 |
| Whistler | bird | 1997-12-09 |
| Claws | cat | 1994-03-17 |
| Fluffy | cat | 1993-02-04 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
| Buffy | dog | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim | snake | 1996-04-29 |
+----------+---------+------------+
</pre>
<p>注意<code>DESC</code>關(guān)鍵詞僅適用于緊跟在它之前的列名字(<code>birth</code>);<code>species</code>值仍然以升序被排序。
</p>
<h4><a NAME="Date_calculations" HREF="manual_toc.html#Date_calculations">8.4.4.5
日期計算</a></h4>
<p><strong>MySQL</strong>提供幾個函數(shù),你能用來執(zhí)行在日期上的計算,例如,計算年齡或提取日期的部分。
</p>
<p>為了決定你的每個寵物有多大,用出生日期和當(dāng)前日期之間的差別計算年齡。通過變換2個日期到天數(shù),取差值,并且用365除(在一年里的天數(shù)):
</p>
<pre>mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 FROM pet;
+----------+-------------------------------------+
| name | (TO_DAYS(NOW())-TO_DAYS(birth))/365 |
+----------+-------------------------------------+
| Fluffy | 6.15 |
| Claws | 5.04 |
| Buffy | 9.88 |
| Fang | 8.59 |
| Bowser | 9.58 |
| Chirpy | 0.55 |
| Whistler | 1.30 |
| Slim | 2.92 |
| Puffball | 0.00 |
+----------+-------------------------------------+
</pre>
<p>盡管查詢可行,關(guān)于它還有能被改進的一些事情。首先,如果行以某個次序表示,其結(jié)果能更容易被掃描。第二,年齡列的標(biāo)題不是很有意義的。
</p>
<p>第一個問題通過增加一個<code>ORDER BY name</code>子句按名字排序輸出來解決。為了處理列標(biāo)題,為列提供一個名字以便一個不同的標(biāo)簽出現(xiàn)在輸出中(這被稱為一個列別名):
</p>
<pre>mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
-> FROM pet ORDER BY name;
+----------+------+
| name | age |
+----------+------+
| Bowser | 9.58 |
| Buffy | 9.88 |
| Chirpy | 0.55 |
| Claws | 5.04 |
| Fang | 8.59 |
| Fluffy | 6.15 |
| Puffball | 0.00 |
| Slim | 2.92 |
| Whistler | 1.30 |
+----------+------+
</pre>
<p>為了按<code>age</code>而非<code>name</code>排序輸出,只要使用一個不同<code>ORDER
BY</code>子句: </p>
<pre>mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
-> FROM pet ORDER BY age;
+----------+------+
| name | age |
+----------+------+
| Puffball | 0.00 |
| Chirpy | 0.55 |
| Whistler | 1.30 |
| Slim | 2.92 |
| Claws | 5.04 |
| Fluffy | 6.15 |
| Fang | 8.59 |
| Bowser | 9.58 |
| Buffy | 9.88 |
+----------+------+
</pre>
<p>一個類似的查詢可以被用來確定已經(jīng)死亡動物的死亡年齡。你通過檢查<code>death</code>值是否是<code>NULL</code>來決定那些是哪些動物,然后,對于那些有非<code>NULL</code>值,計算在<code>death</code>和<code>birth</code>值之間的差別:
</p>
<pre>mysql> SELECT name, birth, death, (TO_DAYS(death)-TO_DAYS(birth))/365 AS age
-> FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name | birth | death | age |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5.91 |
+--------+------------+------------+------+
</pre>
<p>差詢使用<code>death IS NOT NULL</code>而非<code>death != NULL</code>,因為<code>NULL</code>是特殊的值,這以后會解釋。見<a HREF="manual_Tutorial.html#Working_with_NULL">8.4.4.6 用<code>NULL</code>值工作</a>。
</p>
<p>如果你想要知道哪個動物下個月過生日,怎么辦?對于這類計算,年和天是無關(guān)的,你簡單地想要提取<code>birth</code>列的月份部分。<strong>MySQL</strong>提供幾個日期部分的提取函數(shù),例如<code>YEAR()</code>、<code>MONTH()</code>和<code>DAYOFMONTH()</code>。在這里<code>MONTH()</code>是適合的函數(shù)。為了看它怎樣工作,運行一個簡單的查詢,顯示<code>birth</code>和<code>MONTH(birth)</code>的值:
</p>
<pre>mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name | birth | MONTH(birth) |
+----------+------------+--------------+
| Fluffy | 1993-02-04 | 2 |
| Claws | 1994-03-17 | 3 |
| Buffy | 1989-05-13 | 5 |
| Fang | 1990-08-27 | 8 |
| Bowser | 1989-08-31 | 8 |
| Chirpy | 1998-09-11 | 9 |
| Whistler | 1997-12-09 | 12 |
| Slim | 1996-04-29 | 4 |
| Puffball | 1999-03-30 | 3 |
+----------+------------+--------------+
</pre>
<p>用下個月的生日找出動物也是容易的。假定當(dāng)前月是4月,那么月值是<code>4</code>并且你尋找在5月出生的動物
(5月), 象這樣: </p>
<pre>mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name | birth |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+
</pre>
<p>當(dāng)然如果當(dāng)前月份是12月,就有點復(fù)雜了。你不是只把加1到月份數(shù)(<code>12</code>)上并且尋找在13月出生的動物,因為沒有這樣的月份。相反,你尋找在1月出生的動物(1月)
。 </p>
<p>你甚至可以編寫查詢以便不管當(dāng)前月份是什么它都能工作。這種方法你不必在查詢中使用一個特定的月份數(shù)字,<code>DATE_ADD()</code>允許你把時間間隔加到一個給定的日期。如果你把一個月加到<code>NOW()</code>值上,然后用<code>MONTH()</code>提取月份部分,結(jié)果產(chǎn)生尋找生日的月份:
</p>
<pre>mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
</pre>
<p>完成同樣任務(wù)的一個不同方法是加<code>1</code>以得出當(dāng)前月份的下一個月(在使用取模函數(shù)(<code>MOD</code>)后,如果它當(dāng)前是<code>12</code>,則“繞回”月份到值<code>0</code>):
</p>
<pre>mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
</pre>
<p>注意,<code>MONTH</code>返回在1和12之間的一個數(shù)字,且<code>MOD(something,12)</code>返回在0和11之間的一個數(shù)字,因此必須在<code>MOD()</code>以后加1,否則我們將從11月(
11 )跳到1月(1)。 </p>
<h4><a NAME="Working_with_NULL" HREF="manual_toc.html#Working_with_NULL">8.4.4.6 <code>NULL</code>值操作</a></h4>
<p><code>NULL</code>值可能很奇怪直到你習(xí)慣于它。概念上,<code>NULL</code>意味著“沒有值”或“未知值”,且它被看作有點與眾不同的值。為了測試<code>NULL</code>,你不能使用算術(shù)比較運算符例如<code>=</code>、<code><</code>或<code>!=</code>。為了說明它,試試下列查詢:
</p>
<pre>mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
</pre>
<p>很清楚你從這些比較中得到毫無意義的結(jié)果。相反使用<code>IS NULL</code>和<code>IS
NOT NULL</code>操作符: </p>
<pre>mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
</pre>
<p>在<strong>MySQL</strong>中,0意味著假而1意味著真。 </p>
<p><code>NULL</code>這樣特殊的處理是為什么,在前面的章節(jié)中,為了決定哪個動物不再是活著的,使用<code>death
IS NOT NULL</code>而不是<code>death != NULL</code>是必要的。 </p>
<h4><a NAME="Pattern_matching" HREF="manual_toc.html#Pattern_matching">8.4.4.7
模式匹配</a></h4>
<p><strong>MySQL</strong>提供標(biāo)準的SQL模式匹配,以及一種基于象Unix實用程序如<code>vi</code>、<code>grep</code>和<code>sed</code>的擴展正則表達式模式匹配的格式。
</p>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -