sql >> データベース >  >> RDS >> Sqlserver

SQL結合タイプの概要と例

    SQL JOINは、複数のテーブルを結合し、リレーショナルデータベースの共通フィールドに基づいてデータを取得するために使用される句です。データベースの専門家は、データの整合性を確保および改善するために正規化を使用します。さまざまな正規化形式では、データは複数の論理テーブルに分散されます。これらのテーブルは、参照制約(主キーと外部キー)を使用して、SQLServerテーブルのデータ整合性を強化します。次の画像では、データベースの正規化プロセスを垣間見ることができます。

    さまざまなSQLJOINタイプを理解する

    SQL JOINは、複数のリレーショナルテーブルを組み合わせて意味のあるデータを生成します。これらのテーブルはキーを使用して関連付けられ、1対1または1対多の関係があります。正しいデータを取得するには、データ要件と正しい結合メカニズムを知っている必要があります。 SQL Serverは複数の結合をサポートしており、各メソッドには複数のテーブルからデータを取得するための特定の方法があります。次の画像は、サポートされているSQLServerの結合を示しています。

    SQL内部結合

    SQL内部結合には、結合条件が満たされるテーブルの行が含まれます。たとえば、次のベン図では、内部結合はテーブルAとテーブルBから一致する行を返します。

    以下の例では、次のことに注意してください。

    • [従業員]と[住所]の2つのテーブルがあります。
    • SQLクエリは、[Employees]。[EmpID]列と[Address]。[ID]列で結合されます。

    クエリ出力は、両方のテーブルに存在するEmpIDの従業員レコードを返します。

    内部結合は、両方のテーブルから一致する行を返します。したがって、Equijoinとも呼ばれます。 innerキーワードを指定しない場合、SQLServerは内部結合操作を実行します。

    別のタイプの内部結合であるシータ結合では、ON句で等式演算子(=)を使用しません。代わりに、<や>などの非等式演算子を使用します。

    SELECT * FROM Table1 T1、Table2 T2 WHERE T1.Price

    SQL自己結合

    自己結合では、SQLServerはそれ自体でテーブルを結合します。これは、テーブル名がfrom句に2回表示されることを意味します。

    以下に、従業員とそのマネージャーのデータを含むテーブル[Emp]を示します。自己結合は、階層データのクエリに役立ちます。たとえば、従業員テーブルでは、自己参加を使用して、各従業員とそのレポートマネージャーの名前を知ることができます。

    上記のクエリは、[Emp]テーブルに自己結合を配置します。 EmpMgrID列をEmpID列と結合し、一致する行を返します。

    SQLクロス結合

    クロス結合では、SQLServerは両方のテーブルからデカルト積を返します。たとえば、次の画像では、テーブルAとBの相互結合を実行しました。

    クロス結合は、テーブルAの各行をテーブルBで使用可能なすべての行に結合します。したがって、出力は、両方のテーブルのデカルト積としても知られています。下の画像では、次の点に注意してください。

    • テーブル[Employee]には、Emp ID 1、2、および3の3つの行があります。
    • テーブル[アドレス]には、Emp ID 1、2、7、および8のレコードがあります。

    相互結合出力では、[Employee]テーブルの行1が[Address]テーブルのすべての行と結合し、残りの行についても同じパターンに従います。

    最初のテーブルにx個の行があり、2番目のテーブルにn個の行がある場合、クロス結合は出力にx*n個の行を与えます。大量のレコードを返す可能性があり、SQL Serverはそのような大量のデータを処理するために多くの計算能力(CPU、メモリ、IO)を必要とするため、大きなテーブルでのクロス結合は避けてください。

    SQL外部結合

    前に説明したように、内部結合は両方のテーブルから一致する行を返します。 SQL外部結合を使用すると、一致する行が一覧表示されるだけでなく、他のテーブルから一致しない行も返されます。一致しない行は、左、右、または完全なキーワードによって異なります。

    以下の画像は、左、右、および完全な外部結合の概要を示しています。

    左外側結合

    SQLの左外部結合は、両方のテーブルの一致する行と、左側のテーブルの一致しない行を返します。左側のテーブルのレコードの右側のテーブルに一致する行がない場合は、NULL値のレコードが表示されます。

    次の例では、左外部結合は次の行を返します。

    • 一致した行:EmpID1と2は左右のテーブルの両方に存在します。
    • 一致しない行:EmpID3が右側のテーブルに存在しません。したがって、クエリ出力にはNULL値があります。

    右外側結合

    SQLの右外部結合は、両方のテーブルの一致する行と、右のテーブルの一致しない行を返します。右側のテーブルのレコードの左側のテーブルに一致する行がない場合は、NULL値のレコードが表示されます。

    次の例では、次の出力行があります。

    • 一致する行:EmpID1と2は両方のテーブルに存在します。したがって、これらの行は一致する行です。
    • 一致しない行:右側のテーブルには、Emp ID 7および8の追加の行がありますが、これらの行は左側のテーブルでは使用できません。したがって、これらの行の右側の外部結合でNULL値を取得します。

    完全な外部結合

    完全外部結合は、出力に次の行を返します。

    • 2つのテーブル間で行を照合します。
    • 左外部結合に類似した一致しない行:右側のテーブルの一致しない行のNULL値。
    • 右外部結合に類似した一致しない行:左側のテーブルの一致しない行のnull値。

    SQLは複数のテーブルと結合します

    前の例では、SQLクエリで2つのテーブルを使用して、結合操作を実行します。ほとんどの場合、複数のテーブルを結合して、関連するデータを返します。

    以下のクエリは、複数の内部結合を使用しています。

    USE [AdventureWorks2019]
    GO
    SELECT 
    e.[BusinessEntityID] 
    ,p.[FirstName] 
    ,p.[MiddleName] 
    ,p.[LastName] 
    ,e.[JobTitle]
    ,d.[Name] AS [Department] 
    ,d.[GroupName] 
    ,edh.[StartDate] 
    FROM [HumanResources].[Employee] e
    INNER JOIN [Person].[Person] p
    ON p.[BusinessEntityID] = e.[BusinessEntityID]
    INNER JOIN [HumanResources].[EmployeeDepartmentHistory] edh 
    ON e.[BusinessEntityID] = edh.[BusinessEntityID] 
    INNER JOIN [HumanResources].[Department] d 
    ON edh.[DepartmentID] = d.[DepartmentID] 
    WHERE edh.EndDate IS NULL
    GO

    次の手順でクエリを分析しましょう:

    • 中間結果1: 最初の内部結合は、[HumanResources]。[Employees]と[Person]。[Person]テーブルの間です。
    • 中間結果2: [中間結果1]と[HumanResources]。[EmployeeDepartmentHistory]テーブルの間の内部結合。
    • 中間結果3: [中間結果2]と[HumanResources]。[Department]テーブルの間の内部結合。

    複数の結合を使用してクエリを実行すると、クエリオプティマイザが実行プランを準備します。リソース使用量のある結合条件を満たすコスト最適化実行プランを作成します。たとえば、以下の実際の実行プランでは、複数のネストされたループ(内部結合)とハッシュ一致(内部結合)を見て、複数の結合テーブルのデータを組み合わせることができます。 。

    NULL値とSQL結合

    テーブルの列にNULL値があり、それらの列でテーブルを結合するとします。 SQL ServerはNULL値と一致しますか?

    NULL値は互いに一致しません。したがって、SQLServerは一致する行を返すことができませんでした。次の例では、[Employees]テーブルのEmpID列にNULLがあります。したがって、出力では、[EmpID]2のみに一致する行が返されます。

    一致しない行も返すため、SQL外部結合の場合に出力でこのNULL行を取得できます。

    SQL結合のベストプラクティス

    この記事では、さまざまなSQL結合タイプについて説明しました。 SQL結合を使用するときに覚えて適用する重要なベストプラクティスをいくつか示します。

    • 内部結合は、両方のテーブルの結合条件から一致する行を出力します。
    • クロス結合は、両方のテーブルのデカルト積を返します。
    • 外部結合は、左、右、および完全なキーワードに応じて、一致した行と一致しなかった行を返します。
    • SQL自己結合はテーブルをそれ自体に結合します。
    • クエリで結合を使用するときは、常にテーブルエイリアスを使用する必要があります。
    • クエリの列には、常に2つの部分からなる名前[テーブルエイリアス]。[列]の名前形式を使用してください。
    • クエリで複数のSQL結合を使用する場合は、データ要件を満たし、実行プランのさまざまな演算子間のデータフローを最小限に抑えるように、テーブルの論理順序を使用する必要があります。
    • 内部結合、外部結合、自己結合などの複数の結合を組み合わせることができます。ただし、必要なデータを取得するには、結合とその順序を使用する必要があります。

    1. Postgresドロップテーブルの構文エラー

    2. MySQL errnoを与える外部キーを使用したテーブルの作成:150

    3. exec結果をSQL変数に割り当てる方法は?

    4. 更新可能なビューのCHECK句