PostgreSQL / データの読み取りとクエリ
PostgreSQLで`SELECT`を使用した基本クエリを実行する方法
はじめに
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
コマンドに追加として指定できます。これらを使用して、特定のプロパティを持つデータを正確に特定したり、出力形式を変更したり、結果をさらに処理したりすることができます。
Prisma Clientでのクエリ方法については、CRUD操作に関するガイドで学ぶことができます。
SELECT
で表示する列を指定する
`SELECT`コマンドの列指定部分では、クエリするデータに対して表示したい列の名前を指定する必要があります。
アドホッククエリやデータ探索中には、利用可能なすべての列の値を表示したいことを示すアスタリスクを使用するのが最も役立つオプションの1つです。
SELECT * FROM my_table;
これは、結果を絞り込むためのフィルタリングを提供していないため、my_table
からすべてのレコードを表示します。各レコードのすべての列は、テーブル内で定義されている順序で表示されます。
利用可能な列のサブセットを名前で指定して表示することもできます。列名はコンマで区切られ、指定された順序で表示されます。
SELECT column2, column1 FROM my_table;
これはmy_table
からすべてのレコードを表示しますが、column2
とcolumn1
という名前の列のみをその順序で表示します。
Prisma Clientを使用している場合、フィールド選択を使用しても同じ結果を得ることができます。
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_name
、last_name
、address
、および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;
Prisma Clientでは、SQLクエリとほぼ同じ方法で結果をソートできます。
重複しない結果を得る
PostgreSQLで列の値の範囲を見つけたい場合は、SELECT DISTINCT
バリアントを使用できます。これは、列の各異なる値に対して単一の行を表示します。
基本的な構文は次のようになります
SELECT DISTINCT column1 FROM my_table;
これはcolumn1
内の各一意の値につき1行を表示します。
たとえば、shirt
テーブルに含まれるcolor
のすべての異なる値を表示するには、次のように入力します。
SELECT DISTINCT color FROM shirt;
color------bluegreenorangeredyellow
複数の列にわたる一意性を表示するには、コンマで区切って追加の列を追加できます。
たとえば、これはshirt
テーブルのcolor
とshirt_size
のすべての異なる組み合わせを表示します。
SELECT DISTINCT color,shirt_size FROM shirt;
color | shirt_size-------+-----------blue | Mblue | Sgreen | Mgreen | Lgreen | Sorange | Lorange | Mred | Myellow | S
これは、テーブル内のcolor
とshirt_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 | Mgreen | Lgreen | 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 | Sred | Mgreen | L
Prisma Clientでクエリから重複する行をフィルタリングするには、distinct機能を使用できます。
まとめ
このガイドでは、SELECT
コマンドを使用してテーブルやビューからレコードを識別し表示する基本的な方法について説明しました。SELECT
コマンドは、SQL指向データベース内で最も柔軟で強力な操作の1つであり、句、条件、フィルタリングを追加する多くの異なる方法があります。
このガイドでは基本的な使用法のみを扱いましたが、ここで学んだ一般的な形式は、他のすべての読み取りクエリや多くの書き込みクエリの基盤となります。結果をより正確にフィルタリングし、ターゲットにする方法を学ぶことで、今日カバーした機能が拡張されます。
Prisma Clientでのクエリのソートとフィルタリングの詳細については、フィルタリングとソートのドキュメントをご覧ください。