表の抽出
問い合わせ
データベースに保存されている表を見るには、どうするべきでしょうか
方法の 1 つとして、データベースが提供するユーザーインタフェースがあります
これは、GUI システムにおいて最も直観的な方法です
しかし、データベースを参照する端末が必ずしも GUI とは限りません
端末が同じシステムを使っているかどうかもわかりません
データベースは、低スペックのモバイルや携帯端末からもアクセスされます
こうした未知の端末からも、データを利用できる用にするべきだと考えられます
端末から表を参照するには、やはり SQL を用います
SQL で最も利用される機能は、表の参照であるとも言えます
SQL を使えば、統一された方法で、どの端末からもデータを参照できますね
表を参照するには
SELECT 文を使います
この文は SQL の中で最も重要であり、最も利用される文です
SELECT 選択項目リスト FROM 表名
選択項目リストには、参照する列名のリストを指定します
複数の列を指定する場合は、カンマで区切って列名を指定すればよいでしょう
選択項目リストの後は
FROM 句 が必須となります
FROM 句は、参照する表を指定します
つまり、この文は FROM 句で指定された表のうち
選択項目リストで挙げられた列名のデータを取得するのです
このようなデータベースへの参照を
問い合わせまたは
クエリと呼びます
データベースは、指定された条件に基づいた結果を返します
問い合わせの実験を行うために、次のような社員表を用意してください
表 Staff
Code | Name | Blood | Height | Weight |
0001 | アルクェイド ブリュンスタッド | NULL | 167 | 52 |
0002 | シエル | O | 165 | 52 |
0003 | 遠野 秋葉 | A | 160 | 45 |
0004 | 翡翠 | B | 156 | 43 |
0005 | 琥珀 | B | 156 | 43 |
Code は社員番号、Name は名前、Blood は血液型、Height は身長、Weight は体重です
この表を、とりあえす Staff という名前で作成し、データを上記のように追加します
SELECT Name FROM Staff
+-------------------------------+
| Name |
+-------------------------------+
| アルクェイド ブリュンスタッド |
| シエル |
| 遠野 秋葉 |
| 翡翠 |
| 琥珀 |
+-------------------------------+
この SQL 文は、表 Staff から Name 列を問い合わせています
見てのとおり、データベースは Name 列のデータを返しました
選択項目リストは、カンマで区切ることで複数の列を指定できます
単一の列ではなく、表の複数の列を問い合わせることもできるのです
SELECT Name , Blood FROM Staff
+-------------------------------+-------+
| Name | Blood |
+-------------------------------+-------+
| アルクェイド ブリュンスタッド | NULL |
| シエル | O |
| 遠野 秋葉 | A |
| 翡翠 | B |
| 琥珀 | B |
+-------------------------------+-------+
この SQL 文は、Name と Blood 列のデータを取得しています
表全体を参照したい場合は、すべての列名を指定すればよいでしょう
しかし、表を見るために、表のすべての列名を列挙するのは面倒ですね
そこで、アスタリスク * を選択項目リストに指定すれば
FROM 句で指定した表のすべての列を参照することを意味します
単純に、表全体を参照したい場合は便利でしょう
SELECT * FROM Staff
+------+-------------------------------+-------+--------+--------+
| Code | Name | Blood | Height | Weight |
+------+-------------------------------+-------+--------+--------+
| 1 | アルクェイド ブリュンスタッド | NULL | 167 | 52 |
| 2 | シエル | O | 165 | 52 |
| 3 | 遠野 秋葉 | A | 160 | 45 |
| 4 | 翡翠 | B | 156 | 43 |
| 5 | 琥珀 | B | 156 | 43 |
+------+-------------------------------+-------+--------+--------+
この SQL 文は、単純に Staff 表全体を取得しています
すべての列を表す * を選択項目リストに指定していることがわかりますね
重複の無視
特定の列の値が重複することがしばしばあります
社員番号や商品番号などの ID は一意の値なので重複はありえませんが
社員の血液型、身長、体重などの重複は十分考えられます
もし、問い合わせの結果で重複した値に興味がない場合、無視することができます
表 Staff では、翡翠と琥珀の血液型や身長、体重が重複しています
(きっと、この二人は双子の姉妹なのでしょう…)
重複した行を無視する場合、SELECT の直後に DISTINCT を指定します
SQL99 では、次のような構文として定められています
SELECT [ALL | DISTINCT] 選択項目リスト FROM 表名
ALL を指定すれば、値が重複した行も参照されます
省略された場合、ALL が設定されていると解釈されます
ここに、DISTINCT を明示的に指定すれば、値は重複しません
SELECT ALL Weight FROM Staff
+--------+
| Weight |
+--------+
| 52 |
| 52 |
| 45 |
| 43 |
| 43 |
+--------+
この SQL 文は ALL を指定して Weight 列を表示した場合です
次に DISTINCT を指定して表示させてみましょう
SELECT DISTINCT Weight FROM Staff
+--------+
| Weight |
+--------+
| 52 |
| 45 |
| 43 |
+--------+
表 Staff の Weight 列ではアルクェイドとシエル、翡翠と琥珀がそれぞれ同じです
ALL を指定するか、省略した場合はすべての行が表示されますが
DISTINCT を指定すると、重複した部分は無視されていることがわかります
複数の列を指定した場合は、すべての列の値が重複した行が無視されます
Blood、Height、Weight で検索すれば、これらすべてが重複するのは翡翠と琥珀です
アルクェイドとシエルは、体重以外重複しないので無視されません
列の別名
選択項目リストで、表の列に対して別の名前を指定することができます
ここで指定した列の別名は、問い合わせの結果に反映されます
問い合わせ結果の列の見出しを変更したい場合に使うことができるでしょう
列の別名を与えるには、選択項目リストで列の名前を指定した後
AS キーワードに続いて別名を表す識別子を指定します
列名 [AS] 列の別名
構文としては AS キーワードを省略することができます
省略した場合、識別子が連続するため読みにくくなる可能性があります
列の別名には、新しい名前となる識別子を指定できます
列の別名が指定されている場合、列の見出しには別名が使われます
SELECT Name AS 氏名, Height 身長 FROM Staff
+-------------------------------+------+
| 氏名 | 身長 |
+-------------------------------+------+
| アルクェイド ブリュンスタッド | 167 |
| シエル | 165 |
| 遠野 秋葉 | 160 |
| 翡翠 | 156 |
| 琥珀 | 156 |
+-------------------------------+------+
この SQL 文は、列の別名を指定して問い合わせています
結果を見てわかるように、列の見出しには別名が利用されています
Name の別名には AS キーワードの後に識別子を指定していますが
Height の別名は AS を省略して指定しています