記事ディレクトリ
実際の開発では、複数テーブルのクエリは非常に一般的な要件の 1 つです。SQL のマルチテーブルクエリ文は、複数のテーブル間の関連付けられたクエリを実現でき、非常に柔軟に使用できます。サブクエリは SQL において非常に重要なクエリメソッドであり、サブクエリの結果は別のクエリの条件や結果として使用できます。この記事では、読者が SQL のクエリ構文をよりよく理解できるように、SQL のマルチテーブル クエリ ステートメントとサブクエリ (内部結合クエリ、外部結合クエリ、自己結合クエリ、さまざまな種類のサブクエリなど) を詳しく紹介します。
複数テーブル クエリに関して、この記事では、暗黙的内部結合、明示的内部結合、左外部結合、右外部結合、自己結合などを含む、さまざまな一般的なクエリ方法を紹介します。各クエリ メソッドには、読者がよりよく理解して習得できるよう、詳細な構文とデモンストレーション ケースが用意されています。この記事では、サブクエリに関して、スカラー サブクエリ、列サブクエリ、行サブクエリ、テーブル サブクエリなどのさまざまな種類のサブクエリと、その使用シナリオと文法規則を詳しく紹介します。
日常の開発におけるクエリ要件であっても、SQL の学習と使用においても、マルチテーブル クエリとサブクエリは非常に基本的かつ重要な内容です。この記事は、読者が詳細な紹介と事例のデモを通じて SQL マルチテーブル クエリ ステートメントとサブクエリをよりよく理解して習得し、SQL クエリ機能とアプリケーション レベルを向上できるようにすることを目的としています。
複数テーブルのクエリ分類
- 接続クエリ
- 内部結合: A と B の交差データのクエリと同等
- 外部結合:
- 左外部結合: 左側のテーブル内のすべてのデータと、2 つのテーブルの交差部分にある一部のデータをクエリします。
- 右外部結合: 右側のテーブル内のすべてのデータと、2 つのテーブルの交差データをクエリします。
- 自己結合: 現在のテーブルとそれ自体の間の接続クエリ。自己結合ではテーブルのエイリアスを使用する必要があります。
- サブクエリ
結合クエリ - 内部結合
内部結合クエリの構文 (内部結合クエリは 2 つのテーブルの共通部分です):
-
暗黙的な内部結合
SELECT 字段列表 FROM 表1,表2 WHERE 条件 ...;
-
内部リンクを表示
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;
-
内部結合のデモ
- 各従業員の名前と関連する部門名をクエリします (暗黙的な内部結合の実装)。
- テーブル構造: emp、dept
- 結合条件: emp.dept_id = dept.id
select emp.name,dept.name from emp , dept where emp.dept_id = dept.id;
- 各従業員の名前と関連する部門名をクエリします (明示的な内部結合の実装)
- テーブル構造: emp、dept
- 結合条件: emp.dept_id = dept.id
select e.name,d.name from emp e inner join dept d on e.dept_id = d.id; e和d是别名
結合クエリ - 外部結合
外部結合のクエリ構文
-
左外部結合 (テーブル 1 とテーブル 2 の共通部分のデータを含む、テーブル 1 (左側のテーブル) 内のすべてのデータをクエリすることと同等)
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ... ;
-
右外部結合 (テーブル 1 とテーブル 2 の共通部分を含むテーブル 2 (右テーブル) のすべてのデータをクエリするのと同等)
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件 ... ;
-
外部結合のデモ
- emp テーブル内のすべてのデータと対応する部門情報をクエリします (左外部結合)。
- テーブル構造: emp、dept
- 結合条件: emp.dept_id = dept.id
select e.*,d.name from emp e left outer join dept d on e.dept_id = d.id;
- dept テーブル内のすべてのデータと対応する従業員情報をクエリします (右外部結合)。
- テーブル構造: emp、dept
- 結合条件: emp.dept_id = dept.id
select d.*,e.* from emp e right outer join dept d on e.dept_id = d.id;
結合クエリ - 自己結合
自己結合クエリ構文 (自己結合クエリ。内部結合クエリまたは外部結合クエリにすることができます)
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;
-
自己接続デモ
- 従業員とそのリーダーの名前を照会する
- テーブル構造: emp
select a.name,b.name from ema a ,emp b where a.managerid = b.id;
- すべての従業員 emp とそのリーダーの名前 emp をクエリします。従業員にリーダーがいない場合は、それもクエリする必要があります。
- テーブル構造: emp.a、emp.b
select a.nme '员工' , b.name '领导' from emp a left join emp b on a.managerid = b.id;
ユニオンクエリ - ユニオン、すべてユニオン
ユニオン クエリの場合、複数のクエリの結果が結合されて、新しいクエリ結果セットが形成されます。
注: 結合クエリ内の複数のテーブルの列数とフィールド タイプは一貫している必要があります。
Union all はすべてのデータを直接マージし、Union はマージされたデータを重複排除します。
SELECT 字段列表 FROM 表A ...
UNION[ALL]
SELECT 字段列表 FROM 表B ...;
-
クエリデモ
- 給与が 5000 未満のすべての従業員および年齢が 50 歳を超えるすべての従業員をクエリします。
select * from emp where salary < 5000 union all //查询时如果需要去重则直接把all去掉即可 select * from emp where age > 50;
サブクエリ
概念: SQL ステートメント内のネストされた SELECT ステートメントは、ネストされたクエリと呼ばれ、サブクエリとも呼ばれます。
サブクエリの外側のステートメントは、INSERT / UPDATE / DELETE / SELECT のいずれかになります。
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
-
さまざまなサブクエリ結果に応じて、次のように分類されます。
- スカラー サブクエリ (サブクエリの結果は単一の値)
- 列サブクエリ (サブクエリの結果は列です)
- 行サブクエリ(サブクエリの結果は1行)
- テーブルサブクエリ (サブクエリの結果は複数の行と複数の列です)
-
サブクエリの位置により、WHERE 後、FROM 後、SELECT 後と分かれます。
スカラーサブクエリ
サブクエリによって返される結果は、最も単純な形式では単一の値 (数値、文字列、日付など) であり、そのようなサブクエリはスカラー サブクエリと呼ばれます。
一般的に使用される演算子: = <> > = < < =
-
「営業部」の全社員情報を問い合わせる
select * from emp where dept_id = (select id from dept where name = '销售部');
列クエリ
サブクエリによって返される結果は列 (複数行の場合もあります) であり、このサブクエリは列サブクエリと呼ばれます。
よく使用される演算子: IN、NOT IN、ANY、SOME、ALL
オペレーター | 説明 |
---|---|
の | 指定された収集範囲内で、もう 1 つ選択します |
ありませんで | 指定されたコレクション内にありません |
どれでも | サブクエリによって返されるリストでは、どれも満たすことができます。 |
いくつかの | ANY と同等であり、SOME が使用される場合はどこでも ANY を使用できます。 |
全て | サブクエリによって返されるリスト内のすべての値は次の条件を満たす必要があります |
- 部門IDに応じて従業員情報を照会(営業部門およびマーケティング部門の全社員情報)
select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');
- 財務部門の全員よりも給与が高い従業員に関する情報を照会します。
select * from emp where salary > all (select salary from emp where dept_id = (select id from dept where name = '财务部'));
- 研究開発部門の誰よりも給与が高い従業員に関する情報をクエリする
select * from emp where salary > any (select salary from emp where dept_id = (select id from dept where name = '研发部'));
行サブクエリ
サブクエリは 1 つの行 (複数の列も可能) を返します。このサブクエリは行サブクエリと呼ばれます。
一般的な演算子: = 、 <> 、 IN 、 NOT IN
- 「Zhang San」の給与と直属のリーダーシップと同じ従業員情報をクエリします
select * from emp where (salary,managerid) = (select salary,managerid from emp where name = '张三');
テーブルサブクエリ
サブクエリによって返される結果は複数の行と複数の列であり、このサブクエリはテーブル サブクエリと呼ばれます。
よく使用される演算子: IN
- 「Zhang San」と「Li Si」と同じ役職と給与の従業員情報をクエリします。
select * from emp where (job,salary) in (select job,salary from emp where name = '张三' or name = '李四');
DISTINCT キーワードを使用して、クエリ結果の重複を排除できます。
SQL ステートメントでは、DISTINCT
キーワードを。
たとえば、すべての従業員の部門をクエリするには、次の SQL ステートメントを使用できます。
SELECT DISTINCT dept_id FROM emp;
これにより、各 ID が 1 回だけ出現するすべての異なる部門 ID のリストが返されます。
複数テーブルのリレーションシップ (概要)
1対多 | 多側に外部キーを設定し、一側に主キーを関連付けます |
---|---|
多対多 | 中間テーブルを作成します。中間テーブルには 2 つの外部キーが含まれ、2 つのテーブルの主キーを関連付けます。 |
一対一 | テーブル構造を分割する場合は、どちらか一方に外部キー(UNIQUE)を設定し、もう一方の主キーを対応付ける |
複数テーブルのクエリ (概要)
内连接
隐式:SELECT...FROM 表A,表B WHERE 条件...
显示:SELECT...FROM 表A INNER JOIN 表B ON 条件...
外连接
左外:SELECT...FROM 表A LEFT JOIN 表B ON 条件...
右外:SELECT...FROM 表A RIGHT JOIN 表B ON 条件...
自连接:SELECT...FROM 表A 别名1,表A 别名2 WHERE 条件...
子查询:标量子查询、列子查询、行子查询、表子查询