バージョンごとのドキュメント一覧

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

<title>Querying a Table</title>

To retrieve data from a table, the table is <firstterm>queried</firstterm>. An <acronym>SQL</acronym> <command>SELECT</command> statement is used to do this. The statement is divided into a select list (the part that lists the columns to be returned), a table list (the part that lists the tables from which to retrieve the data), and an optional qualification (the part that specifies any restrictions). For example, to retrieve all the rows of table <structname>weather</structname>, type: テーブルからデータを取り出すために、テーブルへ問い合わせをします。 このためにSQLSELECT文が使用されます。 この文は選択リスト(返される列のリスト部分)とテーブルリスト(データを取り出すテーブルのリスト部分)、および、省略可能な条件(制限を指定する部分)に分けることができます。 例えば、weatherの全ての行を取り出すには、以下を入力します。

SELECT * FROM weather;

Here <literal>*</literal> is a shorthand for <quote>all columns</quote>. ここで*全ての列の省略形です。 [2] So the same result would be had with: したがって、以下のようにしても同じ結果になります。

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

The output should be: 出力は、以下のようになります。

     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)

You can write expressions, not just simple column references, in the select list. For example, you can do: 選択リストには、単なる列参照だけではなく式を指定することもできます。 例えば、以下を行うことができます。

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

This should give: この結果は次のようになります。

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

Notice how the <literal>AS</literal> clause is used to relabel the output column. (The <literal>AS</literal> clause is optional.) AS句を使用した出力列の再ラベル付けの部分に注意してください (AS句は省略できます)。

A query can be <quote>qualified</quote> by adding a <literal>WHERE</literal> clause that specifies which rows are wanted. The <literal>WHERE</literal> clause contains a Boolean (truth value) expression, and only rows for which the Boolean expression is true are returned. The usual Boolean operators (<literal>AND</literal>, <literal>OR</literal>, and <literal>NOT</literal>) are allowed in the qualification. For example, the following retrieves the weather of San Francisco on rainy days: 必要な行が何かを指定するWHERE句を追加して問い合わせに条件付けできます。 WHERE句は論理(真値)式を持ち、この論理式が真となる行のみを返します。 よく使われる論理演算子(ANDORNOT)を条件付けに使用できます。 例えば以下は、San Franciscoの雨天時の気象データを取り出します。

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

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

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

You can request that the results of a query be returned in sorted order: 問い合わせの結果をソートして返すように指定できます。

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

In this example, the sort order isn't fully specified, and so you might get the San Francisco rows in either order. But you'd always get the results shown above if you do: この例では、ソート順は十分に指定されていません。 ですので、San Franciscoの行は順序が異なるかも知れません。 しかし、次のようにすれば常に上記の結果になります。

SELECT * FROM weather
    ORDER BY city, temp_lo;

You can request that duplicate rows be removed from the result of a query: 問い合わせの結果から重複行を除くように指定できます。

SELECT DISTINCT city
    FROM weather;

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

Here again, the result row ordering might vary. You can ensure consistent results by using <literal>DISTINCT</literal> and <literal>ORDER BY</literal> together: ここでも、結果行の順序は変動するかもしれません。 DISTINCTORDER BYを一緒に使用することで確実に一貫した結果を得ることができます。 [3]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;



[2] While <literal>SELECT *</literal> is useful for off-the-cuff queries, it is widely considered bad style in production code, since adding a column to the table would change the results. SELECT *は即興的な問い合わせで有用ですが、テーブルに列を追加することにより結果が変わってしまいますので、実用システムのコードでは悪いやり方であると一般的には考えられています。

[3] In some database systems, including older versions of <productname>PostgreSQL</productname>, the implementation of <literal>DISTINCT</literal> automatically orders the rows and so <literal>ORDER BY</literal> is unnecessary. But this is not required by the SQL standard, and current <productname>PostgreSQL</productname> does not guarantee that <literal>DISTINCT</literal> causes the rows to be ordered. PostgreSQLの古めのバージョンを含む一部のデータベースシステムでは、DISTINCTの実装に行の自動順序付けが含まれており、ORDER BYは不要です。 しかし、これは標準SQLにおける要求ではなく、現在のPostgreSQLではDISTINCT句が行の順序付けを行うことを保証していません。