MySQL マルチテーブル クエリ (超詳細)

1. 複数テーブルの関係

        プロジェクト開発時、データベースのテーブル構造を設計する際、ビジネスニーズやビジネスモジュール間の関係に基づいてテーブル構造を分析・設計します。ビジネスは相互に関連しているため、各テーブル構造の間にはさまざまなつながりがあります。基本的には次の 3 種類があります。

  • 1対多(多対1)
  • 多対多
  • 1対1

1.1 1対多

ケース:部門と従業員の
関係:1つの部門は複数の従業員に対応し、1人の従業員は1つの部門に対応する
実装:一方の側の主キーを指す外部キーを多側に確立します(開発では外部キーの設定)キーは通常、キャンセルされます。つまり、多側で一方の当事者が一方の当事者の主キーを指すフィールドを作成できます)

1.2 多対多

ケース: 学生とコースの
関係: 学生は複数のコースを選択でき、1 つのコースを複数の学生が受講することもできます 実装
: 3 番目の中間テーブルを作成します 中間テーブルには、主キーに関連する少なくとも 2 つの外部キーが含まれます2 つのパーティの(開発 一般に、外部キーの設定をキャンセルできます。つまり、中間テーブルに両パーティの主キーを指す 2 つのフィールドを作成します)

1.3 1対1

ケース: ユーザーとユーザーの詳細
関係: 1 対 1 の関係、主に単一テーブルの分割に使用されます。テーブルの基本フィールドを 1 つのテーブルに配置し、その他の詳細フィールドを別のテーブルに配置して、運用効率を向上させます。実装: どちらかの側に
追加外部キーを取得し、それを相手の主キーに関連付け、外部キーを一意(UNIQUE)に設定します(開発中、外部キーの設定は通常キャンセルされます。つまり、どちらかのパーティにフィールドを追加します)相手の主キーを関連付けます)

2. マルチテーブルクエリ - デカルト積

結合クエリ (デカルト積、すべての結合結果が表示されます):
  select * from employee, dept;

デカルト積: 2 つのセット A と B のすべての組み合わせ (マルチテーブル クエリでは、無効なデカルト積を削除する必要があります)

無効なデカルト積を削除します。
  select * from employee, dept where employee.dept_id = dept.id;

3. 複数テーブルのクエリ内部結合

内部結合は、2 つのテーブルの共通部分をクエリします。

暗黙的な内部結合:
  SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;

明示的な内部結合:
  SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...;

例:

  1. -- 查询员工姓名,及关联的部门的名称
  2. -- 隐式
  3. select e.name, d.name from employee as e, dept as d where e.dept = d.id;
  4. -- 显式
  5. select e.name, d.name from employee as e inner join dept as d on e.dept = d.id;

4. 複数テーブルのクエリ外部結合(左外部結合、右外部結合)

左外部結合:
     左側のテーブルのすべてのデータと、2 つのテーブルの交差データをクエリします。
  SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;
     これは、テーブル 1 とテーブル 2 の交差データを含む、テーブル 1 のすべてのデータをクエリするのと同等です。

右外部結合:
     右側のテーブル内のすべてのデータと、2 つのテーブルの交差部分にある一部のデータをクエリします。
  SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;

例:

  1. -- 左
  2. select e.*, d.name from employee as e left join dept as d on e.dept = d.id;
  3. select d.name, e.* from dept d left join emp e on e.dept = d.id; -- 这条语句与下面的语句效果一样
  4. -- 右
  5. select d.name, e.* from employee as e right join dept as d on e.dept = d.id;

5. 複数テーブルのクエリ自己結合

現在のテーブルとそれ自体の間の接続をクエリします。自己結合にはテーブルのエイリアスを使用する必要があります。

文法:
  SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;

     自己結合クエリ。内部結合クエリまたは外部結合クエリのいずれかになります。

例:

  1. -- 查询员工及其所属领导的名字
  2. select a.name, b.name from employee a, employee b where a.manager = b.id;
  3. -- 没有领导的也查询出来
  4. select a.name, b.name from employee a left join employee b on a.manager = b.id;

6. 複数テーブルのクエリ - 結合クエリ

複数のクエリの結果を結合して新しいクエリ セットを形成します

文法:

    SELECT 字段列表 FROM 表A ...

    UNION [ALL]

    SELECT 字段列表 FROM 表B ...

予防

  • UNION ALL では重複した結果が得られますが、UNION では重複した結果は得られません
  • ユニオン クエリは or を使用するよりも効率的で、インデックスが無効になりません。
  • 結合クエリの場合、複数のテーブルの列数が一貫している必要があり、フィールド タイプも一貫している必要があります。

次に、ユニオン クエリを使用して 2 つのテーブルからデータを取得する方法を示す例を示します。

SELECT column1, column2 FROM table1 UNION SELECT column3, column4 FROM table2;

上の例では、SELECT column1, column2 FROM table1と はそれぞれとテーブルから特定の列データを取得するSELECT column3, column4 FROM table22 つの独立したSELECTステートメントです。演算子を使用してこれらをマージすると、両方のテーブルのデータを含む結果セットを取得できます。(一般に、結合クエリの table1 と table2 は同じテーブルです。たとえば、従業員テーブルに対して給与が 5,000 を超える従業員または年齢が 40 を超える従業員をクエリする場合、結合クエリを使用できます。)table1table2UNION

UNION結合クエリを使用する場合、 2 つのステートメントの列数、列名、データ型が一致する必要があることに注意してくださいSELECT重複した行を保持する必要がある場合は、UNION ALL代わりにを使用してくださいUNION

7. 複数テーブルのクエリ-サブクエリ (ネストされたクエリ)

SQL ステートメント内で SELECT ステートメントをネストすることは、ネストされたクエリと呼ばれ、サブクエリとも呼ばれます。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);
サブクエリの外側のステートメントは、INSERT / UPDATE / DELETE / SELECT のいずれかになります。

サブクエリの結果によれば、次のように分類できます。

  • スカラー サブクエリ (サブクエリの結果は単一の値)
  • 列サブクエリ(サブクエリ結果は1列)
  • 行サブクエリ(サブクエリの結果は1行)
  • テーブルサブクエリ (サブクエリの結果は複数の行と列です)

サブクエリの位置に応じて、次のように分類できます。

  • どこの後
  • 後から
  • 選択後

7.1 スカラーサブクエリ

 サブクエリによって返される結果は単一の値 (数値、文字列、日付など) です。
一般的に使用される演算子: - < > > >= < <=

例:

  1. -- 查询销售部所有员工
  2. select id from dept where name = '销售部';
  3. -- 根据销售部部门ID,查询员工信息
  4. select * from employee where dept = 4;
  5. -- 合并(子查询)
  6. select * from employee where dept = (select id from dept where name = '销售部');
  7. -- 查询xxx入职之后的员工信息
  8. select * from employee where entrydate > (select entrydate from employee where name = 'xxx');

7.2 リストサブクエリ

 返される結果は列です (複数行の場合もあります)。

一般的に使用される演算子:

オペレーター 説明する
指定された収集範囲内で、複数の中から 1 つを選択します
ありませんで 指定された収集範囲外です
どれでも サブクエリによって返されるリストでは、いずれか 1 つを満たすことができます。
いくつかの ANY と同様に、SOME が使用される場合はどこでも ANY を使用できます。
全て サブクエリによって返されるリスト内のすべての値は次の条件を満たす必要があります

例: 

  1. -- 查询销售部和市场部的所有员工信息
  2. select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部');
  3. -- 查询比财务部所有人工资都高的员工信息
  4. select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));
  5. -- 查询比研发部任意一人工资高的员工信息
  6. select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部'));

7.3 行サブクエリ

返される結果は行です (複数の列である場合もあります)。
一般的な演算子: =、<、>、IN、NOT IN

例:

  1. -- 查询与xxx的薪资及直属领导相同的员工信息
  2. select * from employee where (salary, manager) = (12500, 1);
  3. select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx');

7.4 テーブルサブクエリ

返される結果は複数の行と複数の列です。
一般的な演算子: IN

例:

  1. -- 查询与xxx1,xxx2的职位和薪资相同的员工
  2. select * from employee where (job, salary) in (select job, salary from employee where name = 'xxx1' or name = 'xxx2');
  3. -- 查询入职日期是2006-01-01之后的员工,及其部门信息
  4. select e.*, d.* from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;

おすすめ

転載: blog.csdn.net/weixin_55772633/article/details/132121779