共有

はじめに

PostgreSQLでは、SELECTコマンドがデータベーステーブルに保存されているレコードに関する情報をクエリおよび読み取る主要な方法です。ただし、その有用性は読み取り専用操作に限定されません。SELECT構文は、更新、削除、およびより複雑な操作のために、データベース内の特定のレコードまたはフィールドを対象とする多くの他のコマンドと組み合わされます。

このガイドでは、SELECTの基本構文がテーブルからデータを収集する方法について説明します。このコマンドの多数のオプション句については他の記事に譲りますが、最も基本的な要素であっても、データクエリの強力な基盤を提供することが明らかになることを願っています。これらの基本は、いくつかの句と構成を学ぶだけで済みます。

SELECTコマンドの一般的な構文

`SELECT`コマンドの基本的な形式は次のようになります

SELECT <column_names> FROM <table_name> <additional_conditions_and_formatting>;

このステートメントはいくつかの異なる要素で構成されています

  • SELECT: SELECTコマンド自体。このSQLステートメントは、テーブルまたはビューが含むデータをクエリしたいことを示します。その周囲の引数と句は、基準を定義することで、出力の内容と形式の両方を決定します。
  • <column_names>: SELECTステートメントは、行全体(*ワイルドカード文字で示される)または利用可能なのサブセットを返すことができます。特定の列のみを出力したい場合は、表示したい列名をコンマで区切って指定します。
  • FROM <table_name>: FROMキーワードは、クエリ対象となるテーブルまたはビューを示すために使用されます。ほとんどの単純なクエリでは、これは関心のあるデータを含む単一のテーブルで構成されます。
  • <additional_conditions_and_formatting>: 多数のフィルター、出力修飾子、および条件をSELECTコマンドに追加として指定できます。これらを使用して、特定のプロパティを持つデータを正確に特定したり、出力形式を変更したり、結果をさらに処理したりすることができます。

SELECTで表示する列を指定する

`SELECT`コマンドの列指定部分では、クエリするデータに対して表示したい列の名前を指定する必要があります。

アドホッククエリやデータ探索中には、利用可能なすべての列の値を表示したいことを示すアスタリスクを使用するのが最も役立つオプションの1つです。

SELECT * FROM my_table;

これは、結果を絞り込むためのフィルタリングを提供していないため、my_tableからすべてのレコードを表示します。各レコードのすべての列は、テーブル内で定義されている順序で表示されます。

利用可能な列のサブセットを名前で指定して表示することもできます。列名はコンマで区切られ、指定された順序で表示されます。

SELECT column2, column1 FROM my_table;

これはmy_tableからすべてのレコードを表示しますが、column2column1という名前の列のみをその順序で表示します。

ASを使用した列エイリアスで結果テーブルを変更する

オプションで、出力での列に使用される名前を変更するために*列エイリアス*を設定できます。

SELECT column1 AS "first column" FROM my_table;

これはmy_table内のcolumn1の各値を表示します。ただし、出力の列はcolumn1の代わりにfirst columnとラベル付けされます。

これは、出力が複数のテーブルからの列名を結合する場合や、既に名前を持たない計算された列が含まれる場合に特に役立ちます。

ORDER BYでソート順を定義する

`ORDER BY`句は、与えられた基準に従って結果の行をソートするために使用できます。一般的な構文は次のようになります。

SELECT * FROM my_table ORDER BY <sort_expression>;

これはmy_table内のすべてのレコードのすべての列の値を表示します。結果は、プレースホルダー<sort_expression>で表される式に従って順序付けされます。

たとえば、first_namelast_nameaddress、およびphone_numberの列を含むcustomerテーブルがあるとします。last_nameでアルファベット順に結果を表示したい場合、次のコマンドを使用できます。

SELECT * FROM customer ORDER BY last_name;
結果を表示

結果はlast_name列で昇順のアルファベット順にソートされます。

順序を逆にするには、ORDER BY句の最後にDESC修飾子を追加します。

SELECT * FROM customer ORDER BY last_name DESC;
結果を表示

複数の列でソートすることもできます。ここでは、最初にlast_nameでソートし、次に同じlast_name値を持つ列に対してfirst_nameでソートします。どちらのソートも昇順です。

SELECT * FROM customer ORDER BY last_name, first_name;
結果を表示

もう1つの重要なオプションは、ソート順でNULL値がどこに表示されるべきかを明確にすることです。これは、任意のソート列に対してNULLS FIRST(デフォルト)またはNULLS LASTを追加することで行えます。

SELECT * FROM customer ORDER BY last_name NULLS LAST;

重複しない結果を得る

PostgreSQLで列の値の範囲を見つけたい場合は、SELECT DISTINCTバリアントを使用できます。これは、列の各異なる値に対して単一の行を表示します。

基本的な構文は次のようになります

SELECT DISTINCT column1 FROM my_table;

これはcolumn1内の各一意の値につき1行を表示します。

たとえば、shirtテーブルに含まれるcolorのすべての異なる値を表示するには、次のように入力します。

SELECT DISTINCT color FROM shirt;
color
------
blue
green
orange
red
yellow

複数の列にわたる一意性を表示するには、コンマで区切って追加の列を追加できます。

たとえば、これはshirtテーブルのcolorshirt_sizeのすべての異なる組み合わせを表示します。

SELECT DISTINCT color,shirt_size FROM shirt;
color | shirt_size
-------+-----------
blue | M
blue | S
green | M
green | L
green | S
orange | L
orange | M
red | M
yellow | S

これは、テーブル内のcolorshirt_sizeのすべての一意な組み合わせを表示します。

より柔軟なバリアントとして、PostgreSQLのSELECT DISTINCT ONコマンドがあります。この形式では、組み合わせて一意であるべき列のリストを指定し、表示したい列を個別にリストできます。

一般的な構文は次のようになります。SELECT DISTINCT ONの後に括弧内に一意であるべき列がリストされ、その後に表示したい列が続きます。

SELECT DISTINCT ON (column1) column1, column2 FROM my_table ORDER BY column1;

たとえば、各シャツサイズに対して単一の色を表示したい場合は、次のように入力できます。

SELECT DISTINCT ON (shirt_size) color,shirt_size FROM shirt;
color | shirt_size
------+-----------
red | M
green | L
green | S

これはshirt_sizeの各一意の値に対して単一の行を表示します。各行では、color列、続いてshirt_size列が表示されます。

ORDER BY句を使用する場合、出力が予測可能な結果となるように、順序付けのために選択された列はDISTINCT ONの括弧内で選択された列と一致する必要があります。

SELECT DISTINCT ON (shirt_size) color,shirt_size FROM shirt ORDER BY shirt_size DESC;
color | shirt_size
------+-----------
green | S
red | M
green | L

まとめ

このガイドでは、SELECTコマンドを使用してテーブルやビューからレコードを識別し表示する基本的な方法について説明しました。SELECTコマンドは、SQL指向データベース内で最も柔軟で強力な操作の1つであり、句、条件、フィルタリングを追加する多くの異なる方法があります。

このガイドでは基本的な使用法のみを扱いましたが、ここで学んだ一般的な形式は、他のすべての読み取りクエリや多くの書き込みクエリの基盤となります。結果をより正確にフィルタリングし、ターゲットにする方法を学ぶことで、今日カバーした機能が拡張されます。

著者について
Justin Ellingwood

ジャスティン・エリングウッド

ジャスティンは2013年からデータベース、Linux、インフラストラクチャ、開発者ツールについて執筆しています。現在はベルリンで妻と2匹のウサギと一緒に暮らしています。通常、三人称で書く必要がないため、関係者全員にとって安心です。
© . All rights reserved.