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:
テーブルからデータを取り出すために、テーブルへ問い合わせをします。
このためにSQLのSELECT
文が使用されます。
この文は選択リスト(返される列のリスト部分)とテーブルリスト(データを取り出すテーブルのリスト部分)、および、省略可能な条件(制限を指定する部分)に分けることができます。
例えば、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
句は論理(真値)式を持ち、この論理式が真となる行のみを返します。
よく使われる論理演算子(AND
、OR
、NOT
)を条件付けに使用できます。
例えば以下は、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:
ここでも、結果行の順序は変動するかもしれません。
DISTINCT
とORDER 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
句が行の順序付けを行うことを保証していません。