MySQL / データの読み取りとクエリ
MySQLで`SELECT`を使用した基本的なクエリの実行方法
はじめに
SELECT
は、MySQLテーブル内の情報をクエリして返す際に最も適したSQLコマンドです。その名前が示すように、データベース内から一致するレコードを選択するための条件を指定するために使用されます。これは、データの読み取りだけでなく、更新やその他のアクションのターゲット設定にも適した、広く有用な役割です。
この記事では、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
からのすべてのレコードが表示されます。各レコードのすべての列は、テーブル内で定義されている順序で表示されます。
多数の列を持つテーブルをクエリする場合に検討したい変更の1つは、ステートメントをセミコロン;
の代わりに\G
で終了することです
SELECT * FROM my_table\G
\G
ステートメントターミネーターは、MySQLに結果を水平ではなく垂直に表示するよう指示します。これにより、多数の列や長い値を持つテーブルでの可読性が向上します。\G
は、SELECT
だけでなく、任意のステートメントを終了するために使用できます。
利用可能な列のサブセットを名前で指定して表示することもできます。列名はカンマで区切られ、指定された順序で表示されます
SELECT column2, column1 FROM my_table;
これにより、my_table
からのすべてのレコードが表示されますが、column2
とcolumn1
という名前の列のみがその順序で表示されます。
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;
Prisma Clientを使用すると、SQLクエリとほぼ同じ方法で結果をソートできます。
個別結果の取得
MySQLで列の値の範囲を見つけたい場合は、SELECT DISTINCT
バリアントを使用できます。これにより、列の個別の値ごとに1つの行が表示されます。
基本的な構文は次のようになります
SELECT DISTINCT column1 FROM my_table;
これにより、column1
内のユニークな値ごとに1行が表示されます。
たとえば、shirt
テーブルに含まれるcolor
のすべての異なる値を表示するには、次のように入力します
SELECT DISTINCT color FROM shirt;
+--------+color |+--------+blue |green |orange |red |yellow |+--------+5 rows in set (0.00 sec)
複数の列にわたる一意性を示すには、カンマで区切られた追加の列を追加できます。
たとえば、これにより、shirt
テーブルのcolor
とshirt_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 |+--------+------------+9 rows in set (0.00 sec)
これにより、テーブル内のcolor
とshirt_size
のすべてのユニークな組み合わせが表示されます。
Prisma Clientを使用すると、distinct機能を使用してクエリから重複する行をフィルタリングできます。
結論
この記事では、MySQLテーブルからデータを返す方法を示すために、SELECT
コマンドのいくつかの基本的な要素を紹介しました。このコマンドの動作を変更し、必要な結果を絞り込んだり、返す行数を指定したりするなど、さらに多くのオプションの句があります。今後の記事では、SELECT
の有用性を高めるためにこれらの修飾子を探求します。