本節將講述SELECT語句的一些高級功能。
列和表的別名
列的別名
精選輸出的列可以用列名、列別名或列位置在ORDER BY和GROUP BY子句引用,列位置從1開始。
例如,我們從pet表中檢索出寵物和種類,直接引用列名:
mysql> SELECT name,species FROM pet ORDER BY name, species;
其輸出為:
+----------+---------+
| name | species |
+----------+---------+
| Bowser | dog |
| Buffy | dog |
| Chirpy | bird |
| Claws | cat |
| Fang | dog |
| Fluffy | cat |
| Puffball | hamster |
| Slim | snake |
| Whistler | bird |
+----------+---------+
在子句中使用列的位置:
mysql> SELECT name,species FROM pet ORDER BY 1,2;
這條語句的輸出與上面並無不同。
最後,你還可以為列命名:
mysql> SELECT name AS n,species AS s FROM pet ORDER BY n,s;
注意返回的結果:
+----------+---------+
| n | s |
+----------+---------+
| Bowser | dog |
| Buffy | dog |
| Chirpy | bird |
| Claws | cat |
| Fang | dog |
| Fluffy | cat |
| Puffball | hamster |
| Slim | snake |
| Whistler | bird |
+----------+---------+
返回的記錄順序並無不同。但是列的名字有了改變,這一點在使用CREATE TABLE…SELECT語句創建表時是有意義的。
例如,我們想從pet表生成包括其中name,owner字段的表,但是想把name和owner字段的名字重新命名為animal和child,一個很笨的方法就是創建表再錄入數據,如果使用別名,則僅僅一條SQL語句就可以解決問題,非常簡單,我們要使用的語句使CREATE TABLE:
mysql> CREATE TABLE pet1 -> SELECT name AS animal,owner AS child -> FROM pet;
然後,檢索生成的表,看看是否打到目的:
mysql> SELECT * FROM pet1;
+----------+--------+
| animal | child |
+----------+--------+
| Fluffy | Harold |
| Claws | Gwen |
| Buffy | Harold |
| Chirpy | Gwen |
| Fang | Benny |
| Bowser | Diane |
| Whistler | Gwen |
| Slim | Benny |
| Puffball | Diane |
+----------+--------+
在子句中使用列的別名
你可以在GROUP BY、ORDER BY或在HAVING部分中使用別名引用列。別名也可以用來為列取一個更好點的名字:
mysql> SELECT species,COUNT(*) AS total FROM pet -> GROUP BY species HAVING total>1;
+---------+-------+
| species | total |
+---------+-------+
| bird | 2 |
| cat | 2 |
| dog | 3 |
+---------+-------+
注意,你的 ANSI SQL 不允許你在一個WHERE子句中引用一個別名。這是因為在WHERE代碼被執行時,列值還可能沒有終結。例如下列查詢是不合法:
SELECT id,COUNT(*) AS total FROM pet WHERE total > 1 GROUP BY species
會有下面的錯誤:
ERROR 1054: Unknown column 'total' in 'where clause'
WHERE語句被執行以確定哪些行應該包括GROUP BY部分中,而HAVING用來決定應該只用結果集合中的哪些行。
表的別名
別名不僅可以應用於列,也可以引用於表名,具體方法類似於列的別名,這裡不再重復。
列的別名經常用於表自身的連接中。你不必有2個不同的表來執行一個聯結。如果你想要將一個表的記錄與同一個表的其他記錄進行比較,聯結一個表到自身有時是有用的。例如,為了在你的寵物之中繁殖配偶,你可以用pet聯結自身來進行相似種類的雄雌配對:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species -> FROM pet AS p1, pet AS p2 -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";
+--------+------+--------+------+---------+
| name | sex | name | sex | species |
+--------+------+--------+------+---------+
| Fluffy | f | Claws | m | cat |
| Buffy | f | Fang | m | dog |
| Buffy | f | Bowser | m | dog |
+--------+------+--------+------+---------+
在這個查詢中,我們為表名指定別名以便能引用列並且使得每一個列引用關聯於哪個表實例更直觀。