ホームページ >データベース >mysql チュートリアル >MySQL マルチテーブルクエリのケース分析

MySQL マルチテーブルクエリのケース分析

WBOY
WBOY転載
2023-05-27 10:52:061677ブラウズ

複数テーブル クエリ

ケースの説明

デカルト積の理解

select id,department_name
from employees,departments;#错的

select id,department_id,department_name
from employees CROSS JOIN departments;#错的

各従業員と各部門が 1 回照合されました (見つかったエントリの数 = ID の数 * 数値

エラーの原因: 接続条件がありません

デカルト積の解決策

接続条件を書き込みます: 表 1. 列 = 表 2. 列 (複数接続する場合)テーブル、少なくとも n-1 個の接続条件を使用する必要があります)

select id,employees.name,department_name 
from employees,departments
WHERE employees.name = departments.name;

注: 表示される列がクエリ対象のテーブル内で同じ名前を持つ場合は、それがどのテーブルからのものであるかを示す必要があります。 :employees .name

複数のテーブルをクエリするときにどのテーブル情報を表示するかを指定することをお勧めします (最適化)

最適化: FROM の後にテーブルの別名を使用できますが、別名は一度使用します。必ずエイリアスを使用してください。

複数テーブル クエリの分類

等価結合と非等価結合

  • 等価結合:上記 =

  • ##非等結合: No=

  • select t1.id,t1.name,t2.grade
    from employees t1,departments t2
    WHERE ti.salary BETWEEN t2.lowest_salary AND t2.highest_salary ;#非等值
自己結合と非自己結合

  • 非セルフリンク: テーブル 1 とテーブル 2 が接続されています

  • セルフリンク: テーブル 1 とそれ自体が接続されています

  • #显示员工(t1)和其管理者(t2)的基本信息
    select t1.id,t1.name,t2.id,t2.name
    from employees t1,employees t2#一个表看作两个表
    WHERE t1.manage_id = t2.id ;#自连接
内部接続と外部接続 Connection

  • 内部結合: 同じ列を含むテーブルをマージします。結果には、あるテーブルと別のテーブルに一致しない行は含まれません

  • 結合を除く: 同じ列を含むテーブルを結合します。内部結合の結果に加えて、一致しない行もクエリされます。

外部結合の分類:左外部結合 (左側のテーブルを増やし、右側を補完)、右外部結合 (右側のテーブルを増やし、左側を埋める)、完全外部結合

SQL92: () を使用して接続を作成します

内部結合: 上記を参照

外部結合: 左側のテーブル データの不一致がある場合は、右側のテーブルに ( ) を追加します。そうでない場合は、左側のテーブルに ( ) を追加します。ただし、MySQL は

WHERE t1.department_id = t2.department_id(+)#左连接
をサポートしていません

SQL99: JOIN...ON メソッドを使用します

内部結合

select t1.id,t1.name,t2.department_name,t3.environment
from employees t1 JOIN departments t2
ON t1.department_id = t2.department_id
JOIN locations t3#加入第二个人表
ON t2.department_location = t3.department_location;

OUTER JOIN

OUTER JOIN...ON...

## を使用します

    #左外部結合: LEFT OUTER JOIN
  • 右外部結合
  • 完全外部結合: 完全外部結合 (MySQL)はサポートしていません)
  • select t1.name,t2.department_name#左外连接
    from employees t1 LEFT OUTER(可省略) JOIN departments t2
    ON t1.department_id = t2.department_id;
  • UMION の使用

クエリ結果のマージ

SELECT colum... FROM table1
UNION (ALL)
SELECT colum... FROM table2

    UNION 演算子
  • 2 つのクエリ結果の結合、重複排除 (低効率)

    UNION ALL 演算子 (推奨)
  • 重複排除なしの 2 つのクエリ結果の結合 (高効率)

7 種類の SQL JOINS の実装

MySQL マルチテーブルクエリのケース分析中央の図 (内部結合):

select t1.name,t2.department_name
from employees t1 JOIN departments t2
ON t1.department_id = t2.department_id;

左上の図 (左外部結合):

select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id;

右上の図 (右外部結合):

select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id;

中左の図:

select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t2.department_id IS NULL;

中右図:

select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t1.department_id IS NULL;

左下の図 (完全外部結合):

#方式一:左上图 UNION ALL 右中图
select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id
UNION ALL 
select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t1.department_id IS NULL;

#方式二:左中图 UNION ALL 右上图
select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t2.department_id IS NULL
UNION ALL
select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id;

右下の図:

#左中图 UNION ALL 右中图
select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t2.department_id IS NULL
UNION ALL
select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t1.department_id IS NULL;

SQL 構文の新機能

自然な接続

キーワードを使用: NATURAL JOIN (柔軟性に欠ける)、自動クエリ テーブル内のすべての同じフィールドを使用し、等しい値接続を実行します

USING 接続 (自己結合には適用されません)

キーワード: USING (同じ名前のフィールド) を使用して、テーブル内の同じ名前のフィールドを自動的に結合します Equijoining

select t1.name,t2.department_name
from employees t1 JOIN departments t2
ON t1.department_id = t2.department_id;
等价于
select t1.name,t2.department_name
from employees t1 JOIN departments t2
USING(department_id);

以上がMySQL マルチテーブルクエリのケース分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。