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の有用性を高めるためにこれらの修飾子を探求します。
