2.5. テーブルへの問い合わせ

テーブルからデータを取り出すために、テーブルへ問い合わせをします。 このためにSQLSELECT文が使用されます。 この文は選択リスト(返される列のリスト部分)とテーブルリスト(データを取り出すテーブルのリスト部分)、および、省略可能な条件(制限を指定する部分)に分けることができます。 例えば、weatherの全ての行を取り出すには、以下を入力します。

SELECT * FROM weather;

ここで*"全ての列"の省略形です。 [1] したがって、以下のようにしても同じ結果になります。

SELECT city, temp_lo, temp_hi, prcp, date FROM weather;

出力は、以下のようになります。

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      43 |      57 |    0 | 1994-11-29
 Hayward       |      37 |      54 |      | 1994-11-29
(3 rows)

選択リストには、単なる列参照だけではなく任意の式を指定することができます。 例えば、以下を行うことができます。

SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

この結果は次のようになります。

     city      | temp_avg |    date
---------------+----------+------------
 San Francisco |       48 | 1994-11-27
 San Francisco |       50 | 1994-11-29
 Hayward       |       45 | 1994-11-29
(3 rows)

AS句を使用した出力列の再ラベル付けの部分に注意してください (AS句は省略することができます)。

必要な行が何かを指定するWHERE句を追加して問い合わせに"条件付け"することができます。 WHERE句は論理(真値)式を持ち、この論理式が真となる行のみを返します。 よく使われる論理演算子(ANDORNOT)を条件付けに使用することができます。 例えば以下は、San Franciscoの雨天時の気象データを取り出します。

SELECT * FROM weather
    WHERE city = 'San Francisco' AND prcp > 0.0;

結果は次のようになります。

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

問い合わせの結果をソートして返すように指定することができます。

SELECT * FROM weather
    ORDER BY city;

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 Hayward       |      37 |      54 |      | 1994-11-29
 San Francisco |      43 |      57 |    0 | 1994-11-29
 San Francisco |      46 |      50 | 0.25 | 1994-11-27

この例では、ソート順は十分に指定されていません。 ですので、San Franciscoの行は順序が異なるかも知れません。 しかし、次のようにすれば常に上記の結果になります。

SELECT * FROM weather
    ORDER BY city, temp_lo;

問い合わせの結果から重複行を除くように指定することができます。

SELECT DISTINCT city
    FROM weather;

     city
---------------
 Hayward
 San Francisco
(2 rows)

繰り返しますが、結果行の順序は変動するかもしれません。 DISTINCTORDER BYを一緒に使用することで確実に一貫した結果を得ることができます。 [2]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;

もちろん、DISTINCTおよびORDER BYは単体でも使用することができます。

注意

[1]

SELECT *は即興的な問い合わせで有用ですが、製品レベルのコードでは、テーブルに列を追加することにより結果が異なってしまいますので、通常好まれません。

[2]

PostgreSQLの古めのバージョンを含む一部のデータベースシステムでは、DISTINCTの実装に行の自動順序付けが含まれており、ORDER BYは不要です。 しかし、これは標準SQLにおける要求ではなく、現在のPostgreSQLではDISTINCT句が行の順序付けを行うことを保証していません。