MySQLのクエリの概要
序章
データベースは、多くのWebサイトやアプリケーションの重要なコンポーネントであり、インターネットを介してデータを保存および交換する方法の中核を成しています。 データベース管理の最も重要な側面の1つは、アドホックベースであろうと、アプリケーションにコード化されたプロセスの一部であろうと、データベースからデータを取得する方法です。 データベースから情報を取得する方法はいくつかありますが、最も一般的に使用される方法の1つは、コマンドラインからクエリを送信することによって実行されます。
リレーショナルデータベース管理システムでは、queryはテーブルからデータを取得するために使用される任意のコマンドです。 構造化照会言語(SQL)では、ほとんどの場合、照会は SELECT
声明。
このガイドでは、SQLクエリの基本的な構文と、より一般的に使用される関数と演算子のいくつかについて説明します。 また、MySQLデータベースのサンプルデータを使用してSQLクエリを作成する練習も行います。
MySQL は、オープンソースのリレーショナルデータベース管理システムです。 最も広く展開されているSQLデータベースの1つであるMySQLは、速度、信頼性、および使いやすさを優先します。 MySQLが認識されている標準とは異なる操作を実行する場合がいくつかありますが、通常はANSISQL標準に準拠しています。
前提条件
一般に、このガイドに示されているコマンドと概念は、SQLデータベースソフトウェアを実行しているLinuxベースのオペレーティングシステムで使用できます。 ただし、MySQLを実行しているUbuntu18.04サーバーを念頭に置いて特別に作成されています。 これを設定するには、次のものが必要です。
- sudo権限を持つroot以外のユーザーがいるUbuntu18.04マシン。 これは、Ubuntu18.04の初期サーバーセットアップガイドを使用してセットアップできます。
- MySQLがマシンにインストールされています。 Ubuntu 18.04にMySQLをインストールする方法に関するガイドは、これを設定するのに役立ちます。
この設定が整ったら、チュートリアルを開始できます。
サンプルデータベースの作成
SQLでクエリを作成する前に、まずデータベースといくつかのテーブルを作成し、次にこれらのテーブルにサンプルデータを入力します。 これにより、後でクエリを作成し始めるときに、実践的な経験を積むことができます。
このガイド全体で使用するサンプルデータベースについて、次のシナリオを想像してください。
あなたとあなたの友人の何人かは皆、お互いにあなたの誕生日を祝います。 毎回、グループのメンバーは地元のボウリング場に向かい、フレンドリーなトーナメントに参加します。その後、全員があなたの場所に向かい、誕生日の人の好きな食事を準備します。
この伝統がしばらく続いているので、あなたはこれらのトーナメントからの記録を追跡し始めることに決めました。 また、夕食の計画を簡単にするために、友達の誕生日とお気に入りのプリモピアット、サイド、デザートの記録を作成することにしました。 この情報を物理的な元帳に保持するのではなく、MySQLデータベースに記録してデータベーススキルを行使することにします。
まず、 rootMySQLユーザーとしてMySQLプロンプトを開きます。
- sudo mysql
注: Ubuntu 18.04 へのMySQLのインストールに関するチュートリアルの前提条件に従っている場合は、rootユーザーがパスワードを使用して認証するように構成している可能性があります。 この場合、次のコマンドを使用してMySQLプロンプトに接続します。
- mysql -u root -p
次に、以下を実行してデータベースを作成します。
- CREATE DATABASE `birthdays`;
次に、次のように入力してこのデータベースを選択します。
- USE birthdays;
次に、このデータベース内に2つのテーブルを作成します。 最初のテーブルを使用して、ボウリング場での友達の記録を追跡します。 次のコマンドは、というテーブルを作成します tourneys
の列 name
あなたの友達のそれぞれの、彼らが勝ったトーナメントの数(wins
)、彼らのすべての時間 best
スコア、および彼らが着用するボウリングシューズのサイズ(size
):
- CREATE TABLE tourneys (
- name varchar(30),
- wins real,
- best real,
- size real
- );
実行したら CREATE TABLE
コマンドを実行して列見出しを入力すると、次の出力が表示されます。
OutputQuery OK, 0 rows affected (0.00 sec)
を入力します tourneys
いくつかのサンプルデータを含む表:
- INSERT INTO tourneys (name, wins, best, size)
- VALUES ('Dolly', '7', '245', '8.5'),
- ('Etta', '4', '283', '9'),
- ('Irma', '9', '266', '7'),
- ('Barbara', '2', '197', '7.5'),
- ('Gladys', '13', '273', '8');
次のような出力が表示されます。
OutputQuery OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
これに続いて、同じデータベース内に別のテーブルを作成します。このテーブルを使用して、友達のお気に入りの誕生日の食事に関する情報を保存します。 次のコマンドは、という名前のテーブルを作成します dinners
の列 name
あなたの友達のそれぞれの、彼らの birthdate
、彼らのお気に入り entree
、彼らの好み side
料理、そして彼らのお気に入り dessert
:
- CREATE TABLE dinners (
- name varchar(30),
- birthdate date,
- entree varchar(30),
- side varchar(30),
- dessert varchar(30)
- );
同様に、このテーブルについては、コマンドが正常に実行されたことを確認するフィードバックを受け取ります。
OutputQuery OK, 0 rows affected (0.01 sec)
このテーブルにもいくつかのサンプルデータを入力します。
- INSERT INTO dinners (name, birthdate, entree, side, dessert)
- VALUES ('Dolly', '1946-01-19', 'steak', 'salad', 'cake'),
- ('Etta', '1938-01-25', 'chicken', 'fries', 'ice cream'),
- ('Irma', '1941-02-18', 'tofu', 'fries', 'cake'),
- ('Barbara', '1948-12-25', 'tofu', 'salad', 'ice cream'),
- ('Gladys', '1944-05-28', 'steak', 'fries', 'ice cream');
OutputQuery OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
そのコマンドが正常に完了すると、データベースのセットアップは完了です。 次に、の基本的なコマンド構造について説明します。 SELECT
クエリ。
SELECTステートメントを理解する
はじめに述べたように、SQLクエリはほとんどの場合 SELECT
声明。 SELECT
クエリで使用され、テーブルのどの列が結果セットに返されるかを指定します。 クエリには、ほとんどの場合、 FROM
、ステートメントがクエリするテーブルを指定するために使用されます。
通常、SQLクエリは次の構文に従います。
- SELECT column_to_select FROM table_to_select WHERE certain_conditions_apply;
例として、次のステートメントは全体を返します name
からの列 dinners
テーブル:
- SELECT name FROM dinners;
Output+---------+
| name |
+---------+
| Dolly |
| Etta |
| Irma |
| Barbara |
| Gladys |
+---------+
5 rows in set (0.00 sec)
次のように、名前をコンマで区切ることにより、同じテーブルから複数の列を選択できます。
- SELECT name, birthdate FROM dinners;
Output+---------+------------+
| name | birthdate |
+---------+------------+
| Dolly | 1946-01-19 |
| Etta | 1938-01-25 |
| Irma | 1941-02-18 |
| Barbara | 1948-12-25 |
| Gladys | 1944-05-28 |
+---------+------------+
5 rows in set (0.00 sec)
特定の列または列のセットに名前を付ける代わりに、 SELECT
アスタリスク付きの演算子(*
)これは、テーブル内のすべての列を表すプレースホルダーとして機能します。 次のコマンドは、からすべての列を返します tourneys
テーブル:
- SELECT * FROM tourneys;
Output+---------+------+------+------+
| name | wins | best | size |
+---------+------+------+------+
| Dolly | 7 | 245 | 8.5 |
| Etta | 4 | 283 | 9 |
| Irma | 9 | 266 | 7 |
| Barbara | 2 | 197 | 7.5 |
| Gladys | 13 | 273 | 8 |
+---------+------+------+------+
5 rows in set (0.00 sec)
WHERE
指定された条件を満たすレコードをフィルタリングするためのクエリで使用され、その条件を満たす行は結果から削除されます。 A WHERE
句は通常、次の構文に従います。
- . . . WHERE column_name comparison_operator value
の比較演算子 WHERE
句は、指定された列を値と比較する方法を定義します。 一般的なSQL比較演算子は次のとおりです。
オペレーター | それが何をするか |
---|---|
= |
平等のテスト |
!= |
不等式のテスト |
< |
未満のテスト |
> |
より大きいテスト |
<= |
以下または等しいかどうかをテストします |
>= |
以上または等しいかどうかをテストします |
BETWEEN |
値が指定された範囲内にあるかどうかをテストします |
IN |
行の値が指定された値のセットに含まれているかどうかをテストします |
EXISTS |
指定された条件で行が存在するかどうかをテストします |
LIKE |
値が指定された文字列と一致するかどうかをテストします |
IS NULL |
のテスト NULL 値 |
IS NOT NULL |
以外のすべての値をテストします NULL |
たとえば、Irmaの靴のサイズを検索する場合は、次のクエリを使用できます。
- SELECT size FROM tourneys WHERE name = 'Irma';
Output+------+
| size |
+------+
| 7 |
+------+
1 row in set (0.00 sec)
SQLではワイルドカード文字を使用できます。ワイルドカード文字は、 WHERE
条項。 パーセント記号(%
)0個以上の不明な文字を表し、アンダースコア(_
)単一の不明な文字を表します。 これらは、テーブル内の特定のエントリを検索しようとしているが、そのエントリが正確に何であるかがわからない場合に役立ちます。 説明のために、数人の友達のお気に入りのプリモピアットを忘れたとしましょう。しかし、この特定のプリモピアットは「t」で始まると確信しています。 次のクエリを実行すると、その名前を見つけることができます。
- SELECT entree FROM dinners WHERE entree LIKE 't%';
Output+--------+
| entree |
+--------+
| tofu |
| tofu |
+--------+
2 rows in set (0.00 sec)
上記の出力に基づいて、忘れたプリモピアットは次のようになります。 tofu
.
比較的長い名前や読みにくい名前の列またはテーブルがあるデータベースを使用している場合があります。 このような場合、エイリアスを作成してこれらの名前を読みやすくすることができます。 AS
キーワード。 で作成されたエイリアス AS
は一時的なものであり、作成されたクエリの期間中のみ存在します。
- SELECT name AS n, birthdate AS b, dessert AS d FROM dinners;
Output+---------+------------+-----------+
| n | b | d |
+---------+------------+-----------+
| Dolly | 1946-01-19 | cake |
| Etta | 1938-01-25 | ice cream |
| Irma | 1941-02-18 | cake |
| Barbara | 1948-12-25 | ice cream |
| Gladys | 1944-05-28 | ice cream |
+---------+------------+-----------+
5 rows in set (0.00 sec)
ここでは、SQLに表示するように指示しました name
列として n
、 birthdate
列として b
、 そしてその dessert
列として d
.
これまでに行った例には、SQLクエリでより頻繁に使用されるキーワードと句が含まれています。 これらは基本的なクエリには役立ちますが、計算を実行したり、スカラー値(複数の異なる値のセットではなく単一の値)を導出しようとしている場合は役に立ちません。あなたのデータ。 ここで、集計関数が機能します。
集計関数
多くの場合、データを操作するとき、必ずしもデータ自体を見たいとは限りません。 むしろ、データに関する情報が必要です。 SQL構文には、データを発行するだけでデータの計算を解釈または実行できるようにする多数の関数が含まれています。 SELECT
クエリ。 これらは集計関数として知られています。
The COUNT
関数は、特定の基準に一致する行数をカウントして返します。 たとえば、誕生日のプリモピアに豆腐を好む友達の数を知りたい場合は、次のクエリを発行できます。
- SELECT COUNT(entree) FROM dinners WHERE entree = 'tofu';
Output+---------------+
| COUNT(entree) |
+---------------+
| 2 |
+---------------+
1 row in set (0.00 sec)
The AVG
関数は、列の平均(平均)値を返します。 サンプルテーブルを使用すると、次のクエリで友達の平均最高スコアを見つけることができます。
- SELECT AVG(best) FROM tourneys;
Output+-----------+
| AVG(best) |
+-----------+
| 252.8 |
+-----------+
1 row in set (0.00 sec)
SUM
特定の列の合計を見つけるために使用されます。 たとえば、あなたとあなたの友人が何年にもわたってボウリングしたゲームの数を確認したい場合は、次のクエリを実行できます。
- SELECT SUM(wins) FROM tourneys;
Output+-----------+
| SUM(wins) |
+-----------+
| 35 |
+-----------+
1 row in set (0.00 sec)
に注意してください AVG
と SUM
関数は、数値データで使用された場合にのみ正しく機能します。 数値以外のデータでそれらを使用しようとすると、エラーまたは単に 0
、使用しているRDBMSに応じて:
- SELECT SUM(entree) FROM dinners;
Output+-------------+
| SUM(entree) |
+-------------+
| 0 |
+-------------+
1 row in set, 5 warnings (0.00 sec)
MIN
指定された列内の最小値を見つけるために使用されます。 このクエリを使用して、これまでの全体的なボウリングの最悪の記録を確認できます(勝利数の観点から)。
- SELECT MIN(wins) FROM tourneys;
Output+-----------+
| MIN(wins) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
同様に、 MAX
特定の列で最大の数値を見つけるために使用されます。 次のクエリは、全体として最高のボウリング記録を示しています。
- SELECT MAX(wins) FROM tourneys;
Output+-----------+
| MAX(wins) |
+-----------+
| 13 |
+-----------+
1 row in set (0.00 sec)
ようではない SUM
と AVG
、 MIN
と MAX
関数は、数値データ型とアルファベットデータ型の両方に使用できます。 文字列値を含む列で実行すると、 MIN
関数は最初の値をアルファベット順に表示します。
- SELECT MIN(name) FROM dinners;
Output+-----------+
| MIN(name) |
+-----------+
| Barbara |
+-----------+
1 row in set (0.00 sec)
同様に、文字列値を含む列で実行すると、 MAX
関数は最後の値をアルファベット順に表示します:
- SELECT MAX(name) FROM dinners;
Output+-----------+
| MAX(name) |
+-----------+
| Irma |
+-----------+
1 row in set (0.00 sec)
集計関数には、このセクションで説明した以外にも多くの用途があります。 これらは、 GROUP BY
次のセクションでは、結果セットの並べ替え方法に影響を与える他のいくつかのクエリ句とともに説明します。
クエリ出力の操作
に加えて FROM
と WHERE
句、の結果を操作するために使用される他のいくつかの句があります SELECT
クエリ。 このセクションでは、より一般的に使用されるいくつかのクエリ句の例を説明し、提供します。
を除いて、最も頻繁に使用されるクエリ句の1つ FROM
と WHERE
、 それは GROUP BY
句。 これは通常、ある列で集計関数を実行しているときに使用されますが、別の列の値の一致に関連しています。
たとえば、作成した3つのエントリのそれぞれを好む友達の数を知りたいとします。 この情報は、次のクエリで見つけることができます。
- SELECT COUNT(name), entree FROM dinners GROUP BY entree;
Output+-------------+---------+
| COUNT(name) | entree |
+-------------+---------+
| 1 | chicken |
| 2 | steak |
| 2 | tofu |
+-------------+---------+
3 rows in set (0.00 sec)
The ORDER BY
句は、クエリ結果を並べ替えるために使用されます。 デフォルトでは、数値は昇順で並べ替えられ、テキスト値はアルファベット順に並べ替えられます。 説明のために、次のクエリは name
と birthdate
列ですが、結果を誕生日で並べ替えます。
- SELECT name, birthdate FROM dinners ORDER BY birthdate;
Output+---------+------------+
| name | birthdate |
+---------+------------+
| Etta | 1938-01-25 |
| Irma | 1941-02-18 |
| Gladys | 1944-05-28 |
| Dolly | 1946-01-19 |
| Barbara | 1948-12-25 |
+---------+------------+
5 rows in set (0.00 sec)
のデフォルトの動作に注意してください ORDER BY
結果セットを昇順で並べ替えます。 これを逆にして結果セットを降順で並べ替えるには、次のコマンドでクエリを閉じます。 DESC
:
- SELECT name, birthdate FROM dinners ORDER BY birthdate DESC;
Output+---------+------------+
| name | birthdate |
+---------+------------+
| Barbara | 1948-12-25 |
| Dolly | 1946-01-19 |
| Gladys | 1944-05-28 |
| Irma | 1941-02-18 |
| Etta | 1938-01-25 |
+---------+------------+
5 rows in set (0.00 sec)
前述のように、 WHERE
句は、特定の条件に基づいて結果をフィルタリングするために使用されます。 ただし、 WHERE
集計関数を使用した句では、エラーが返されます。これは、少なくとも3人の友達のお気に入りの側を見つけるための次の試みの場合と同様です。
- SELECT COUNT(name), side FROM dinners WHERE COUNT(name) >= 3;
OutputERROR 1111 (HY000): Invalid use of group function
The HAVING
SQLに句が追加され、 WHERE
集約関数とも互換性がある一方で、句。 これらの2つの句の違いを次のように考えると役立ちます WHERE
個々のレコードに適用されますが、 HAVING
グループレコードに適用されます。 この目的のために、あなたが発行するときはいつでも HAVING
条項、 GROUP BY
句も存在する必要があります。
次の例は、少なくとも3人の友人のお気に入りのおかずを見つけるための別の試みですが、これはエラーなしで結果を返します。
- SELECT COUNT(name), side FROM dinners GROUP BY side HAVING COUNT(name) >= 3;
Output+-------------+-------+
| COUNT(name) | side |
+-------------+-------+
| 3 | fries |
+-------------+-------+
1 row in set (0.00 sec)
集計関数は、特定のテーブルの特定の列の結果を要約するのに役立ちます。 ただし、複数のテーブルの内容をクエリする必要がある場合が多くあります。 次のセクションでは、これを行うためのいくつかの方法について説明します。
複数のテーブルのクエリ
多くの場合、データベースには複数のテーブルが含まれ、それぞれが異なるデータセットを保持しています。 SQLは、複数のテーブルに対して単一のクエリを実行するためのいくつかの異なる方法を提供します。
The JOIN
句を使用して、クエリ結果の2つ以上のテーブルの行を組み合わせることができます。 これは、テーブル間の関連する列を見つけることによってこれを行い、出力で結果を適切にソートします。
SELECT
を含むステートメント JOIN
句は通常、次の構文に従います。
- SELECT table1.column1, table2.column2
- FROM table1
- JOIN table2 ON table1.related_column=table2.related_column;
なぜなら JOIN
句は複数のテーブルの内容を比較します。前の例では、列の名前の前にテーブルの名前とピリオドを付けて、各列を選択するテーブルを指定しています。 前のセクションで行ったように、単一のテーブルから選択する場合は必要ありませんが、どのクエリに対してもこのように列を選択するテーブルを指定できます。 サンプルデータを使用して例を見ていきましょう。
友達の一人一人に誕生日プレゼントとしてボウリングシューズを買いたいと想像してみてください。 友達の生年月日と靴のサイズに関する情報は別々のテーブルに保持されているため、両方のテーブルを別々にクエリして、それぞれの結果を比較できます。 とともに JOIN
ただし、句を使用すると、1つのクエリで必要なすべての情報を見つけることができます。
- SELECT tourneys.name, tourneys.size, dinners.birthdate
- FROM tourneys
- JOIN dinners ON tourneys.name=dinners.name;
Output+---------+------+------------+
| name | size | birthdate |
+---------+------+------------+
| Dolly | 8.5 | 1946-01-19 |
| Etta | 9 | 1938-01-25 |
| Irma | 7 | 1941-02-18 |
| Barbara | 7.5 | 1948-12-25 |
| Gladys | 8 | 1944-05-28 |
+---------+------+------------+
5 rows in set (0.00 sec)
The JOIN
この例で使用されている句は、他の引数なしで、innerです。 JOIN
句。 これは、両方のテーブルで値が一致するすべてのレコードを選択して結果セットに出力し、一致しないレコードは除外されることを意味します。 このアイデアを説明するために、他のテーブルに対応するエントリがない新しい行を各テーブルに追加しましょう。
- INSERT INTO tourneys (name, wins, best, size)
- VALUES ('Bettye', '0', '193', '9');
- INSERT INTO dinners (name, birthdate, entree, side, dessert)
- VALUES ('Lesley', '1946-05-02', 'steak', 'salad', 'ice cream');
次に、前のを再実行します SELECT
とのステートメント JOIN
句:
- SELECT tourneys.name, tourneys.size, dinners.birthdate
- FROM tourneys
- JOIN dinners ON tourneys.name=dinners.name;
Output+---------+------+------------+
| name | size | birthdate |
+---------+------+------------+
| Dolly | 8.5 | 1946-01-19 |
| Etta | 9 | 1938-01-25 |
| Irma | 7 | 1941-02-18 |
| Barbara | 7.5 | 1948-12-25 |
| Gladys | 8 | 1944-05-28 |
+---------+------+------------+
5 rows in set (0.00 sec)
なぜなら、 tourneys
テーブルにはレスリーとのエントリがありません dinners
テーブルにはBettyeのエントリがなく、これらのレコードはこの出力に含まれていません。
ただし、 external を使用して、テーブルの1つからすべてのレコードを返すことは可能です。 JOIN
句。 MySQLでは、 JOIN
条項は次のいずれかとして記述されます LEFT JOIN
また RIGHT JOIN
.
A LEFT JOIN
句は、「左側」のテーブルからすべてのレコードを返し、右側のテーブルから一致するレコードのみを返します。 外部結合のコンテキストでは、左側のテーブルは、 FROM
句、および右のテーブルは、後に参照される他のテーブルです JOIN
声明。
前のクエリを再度実行しますが、今回は LEFT JOIN
句:
- SELECT tourneys.name, tourneys.size, dinners.birthdate
- FROM tourneys
- LEFT JOIN dinners ON tourneys.name=dinners.name;
このコマンドは、左側のテーブルからすべてのレコードを返します(この場合、 tourneys
)右側のテーブルに対応するレコードがない場合でも。 右側のテーブルに一致するレコードがない場合は常に、次のように返されます。 NULL
または、RDBMSに応じて、単なる空白の値:
Output+---------+------+------------+
| name | size | birthdate |
+---------+------+------------+
| Dolly | 8.5 | 1946-01-19 |
| Etta | 9 | 1938-01-25 |
| Irma | 7 | 1941-02-18 |
| Barbara | 7.5 | 1948-12-25 |
| Gladys | 8 | 1944-05-28 |
| Bettye | 9 | NULL |
+---------+------+------------+
6 rows in set (0.00 sec)
次に、クエリを再度実行します。今回は、 RIGHT JOIN
句:
- SELECT tourneys.name, tourneys.size, dinners.birthdate
- FROM tourneys
- RIGHT JOIN dinners ON tourneys.name=dinners.name;
これにより、右側のテーブルからすべてのレコードが返されます(dinners
). レスリーの誕生日は右側のテーブルに記録されていますが、左側のテーブルには対応する行がないため、 name
と size
列は次のように返されます NULL
その行の値:
Output+---------+------+------------+
| name | size | birthdate |
+---------+------+------------+
| Dolly | 8.5 | 1946-01-19 |
| Etta | 9 | 1938-01-25 |
| Irma | 7 | 1941-02-18 |
| Barbara | 7.5 | 1948-12-25 |
| Gladys | 8 | 1944-05-28 |
| NULL | NULL | 1946-05-02 |
+---------+------+------------+
6 rows in set (0.00 sec)
左結合と右結合は次のように記述できることに注意してください。 LEFT OUTER JOIN
また RIGHT OUTER JOIN
、ただし OUTER
条項の一部が暗示されています。 同様に、 INNER JOIN
書くだけで同じ結果が得られます JOIN
.
使用する代わりに JOIN
複数のテーブルからレコードをクエリするには、 UNION
句。
The UNION
演算子は、 JOIN
句:複数のテーブルの結果を単一の列を使用して一意の列として出力する代わりに SELECT
声明、 UNION
2つの結果を組み合わせる SELECT
ステートメントを1つの列にまとめます。
説明のために、次のクエリを実行します。
- SELECT name FROM tourneys UNION SELECT name FROM dinners;
このクエリは、重複するエントリを削除します。これは、 UNION
オペレーター:
Output+---------+
| name |
+---------+
| Dolly |
| Etta |
| Irma |
| Barbara |
| Gladys |
| Bettye |
| Lesley |
+---------+
7 rows in set (0.00 sec)
すべてのエントリ(重複を含む)を返すには、 UNION ALL
オペレーター:
- SELECT name FROM tourneys UNION ALL SELECT name FROM dinners;
Output+---------+
| name |
+---------+
| Dolly |
| Etta |
| Irma |
| Barbara |
| Gladys |
| Bettye |
| Dolly |
| Etta |
| Irma |
| Barbara |
| Gladys |
| Lesley |
+---------+
12 rows in set (0.00 sec)
結果テーブルの列の名前と数は、最初にクエリされた列の名前と数を反映しています。 SELECT
声明。 使用する場合は注意してください UNION
それぞれが複数のテーブルから複数の列をクエリする SELECT
ステートメントは同じ数の列をクエリする必要があり、それぞれの列は同様のデータ型である必要があり、それぞれの列は SELECT
ステートメントは同じ順序である必要があります。 次の例は、 UNION
2つの節 SELECT
異なる数の列を照会するステートメント:
- SELECT name FROM dinners UNION SELECT name, wins FROM tourneys;
OutputERROR 1222 (21000): The used SELECT statements have a different number of columns
複数のテーブルをクエリする別の方法は、サブクエリを使用することです。 サブクエリ(内部またはネストされたクエリとも呼ばれます)は、別のクエリに囲まれたクエリです。 これらは、クエリの結果を別の集計関数の結果に対してフィルタリングしようとしている場合に役立ちます。
このアイデアを説明するために、バーバラよりも多くの試合に勝った友達を知りたいとします。 バーバラが勝った試合の数をクエリしてから別のクエリを実行して、それより多くのゲームに勝った人を確認するのではなく、1つのクエリで両方を計算できます。
- SELECT name, wins FROM tourneys
- WHERE wins > (
- SELECT wins FROM tourneys WHERE name = 'Barbara'
- );
Output+--------+------+
| name | wins |
+--------+------+
| Dolly | 7 |
| Etta | 4 |
| Irma | 9 |
| Gladys | 13 |
+--------+------+
4 rows in set (0.00 sec)
このステートメントのサブクエリは1回だけ実行されました。 から値を見つける必要があるだけです wins
と同じ行の列 Barbara
の中に name
列、およびサブクエリと外部クエリによって返されるデータは互いに独立しています。 ただし、目的のデータを返すために、外部クエリが最初にテーブル内のすべての行を読み取り、それらの値をサブクエリによって返されたデータと比較する必要がある場合があります。 この場合、サブクエリは相関サブクエリと呼ばれます。
次のステートメントは、相関サブクエリの例です。 このクエリは、同じ靴のサイズの友達の平均よりも多くのゲームに勝った友達を見つけようとします。
- SELECT name, size FROM tourneys AS t
- WHERE wins > (
- SELECT AVG(wins) FROM tourneys WHERE size = t.size
- );
クエリを完了するには、最初にクエリを収集する必要があります name
と size
外部クエリの列。 次に、その結果セットの各行を内部クエリの結果と比較します。これにより、同じ靴のサイズを持つ個人の平均勝利数が決定されます。 同じ靴のサイズの友達が2人しかいないため、結果セットには1つの行しかありません。
Output+------+------+
| name | size |
+------+------+
| Etta | 9 |
+------+------+
1 row in set (0.00 sec)
前述のように、サブクエリを使用して、複数のテーブルからの結果をクエリできます。 最後の例でこれを説明するために、グループの史上最高のボウラーのためにサプライズディナーを投げたいとしましょう。 次のクエリを使用して、ボウリングの記録が最も優れている友達を見つけて、お気に入りの食事を返すことができます。
- SELECT name, entree, side, dessert
- FROM dinners
- WHERE name = (SELECT name FROM tourneys
- WHERE wins = (SELECT MAX(wins) FROM tourneys));
Output+--------+--------+-------+-----------+
| name | entree | side | dessert |
+--------+--------+-------+-----------+
| Gladys | steak | fries | ice cream |
+--------+--------+-------+-----------+
1 row in set (0.00 sec)
このステートメントにはサブクエリが含まれているだけでなく、そのサブクエリ内にサブクエリも含まれていることに注意してください。
結論
クエリの発行は、データベース管理の領域で最も一般的に実行されるタスクの1つです。 phpMyAdminやpgAdminなど、クエリを実行して結果を視覚化できるデータベース管理ツールがいくつかありますが、 SELECT
コマンドラインからのステートメントは、今でも広く実践されているワークフローであり、より高度な制御を提供することもできます。
SQLを初めて使用する場合は、 SQLチートシートを参照として使用し、公式MySQLドキュメントを確認することをお勧めします。 さらに、SQLおよびリレーショナルデータベースについて詳しく知りたい場合は、次のチュートリアルが役立つ場合があります。