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
自己結合では、SQLServerはそれ自体でテーブルを結合します。これは、テーブル名がfrom句に2回表示されることを意味します。
以下に、従業員とそのマネージャーのデータを含むテーブル[Emp]を示します。自己結合は、階層データのクエリに役立ちます。たとえば、従業員テーブルでは、自己参加を使用して、各従業員とそのレポートマネージャーの名前を知ることができます。
上記のクエリは、[Emp]テーブルに自己結合を配置します。 EmpMgrID列をEmpID列と結合し、一致する行を返します。
クロス結合では、SQLServerは両方のテーブルからデカルト積を返します。たとえば、次の画像では、テーブルAとBの相互結合を実行しました。
クロス結合は、テーブルAの各行をテーブルBで使用可能なすべての行に結合します。したがって、出力は、両方のテーブルのデカルト積としても知られています。下の画像では、次の点に注意してください。
相互結合出力では、[Employee]テーブルの行1が[Address]テーブルのすべての行と結合し、残りの行についても同じパターンに従います。
最初のテーブルにx個の行があり、2番目のテーブルにn個の行がある場合、クロス結合は出力にx*n個の行を与えます。大量のレコードを返す可能性があり、SQL Serverはそのような大量のデータを処理するために多くの計算能力(CPU、メモリ、IO)を必要とするため、大きなテーブルでのクロス結合は避けてください。
前に説明したように、内部結合は両方のテーブルから一致する行を返します。 SQL外部結合を使用すると、一致する行が一覧表示されるだけでなく、他のテーブルから一致しない行も返されます。一致しない行は、左、右、または完全なキーワードによって異なります。
以下の画像は、左、右、および完全な外部結合の概要を示しています。
SQLの左外部結合は、両方のテーブルの一致する行と、左側のテーブルの一致しない行を返します。左側のテーブルのレコードの右側のテーブルに一致する行がない場合は、NULL値のレコードが表示されます。
次の例では、左外部結合は次の行を返します。
SQLの右外部結合は、両方のテーブルの一致する行と、右のテーブルの一致しない行を返します。右側のテーブルのレコードの左側のテーブルに一致する行がない場合は、NULL値のレコードが表示されます。
次の例では、次の出力行があります。
完全外部結合は、出力に次の行を返します。
前の例では、SQLクエリで2つのテーブルを使用して、結合操作を実行します。ほとんどの場合、複数のテーブルを結合して、関連するデータを返します。
以下のクエリは、複数の内部結合を使用しています。
次の手順でクエリを分析しましょう:
複数の結合を使用してクエリを実行すると、クエリオプティマイザが実行プランを準備します。リソース使用量のある結合条件を満たすコスト最適化実行プランを作成します。たとえば、以下の実際の実行プランでは、複数のネストされたループ(内部結合)とハッシュ一致(内部結合)を見て、複数の結合テーブルのデータを組み合わせることができます。 。
テーブルの列にNULL値があり、それらの列でテーブルを結合するとします。 SQL ServerはNULL値と一致しますか?
NULL値は互いに一致しません。したがって、SQLServerは一致する行を返すことができませんでした。次の例では、[Employees]テーブルのEmpID列にNULLがあります。したがって、出力では、[EmpID]2のみに一致する行が返されます。
一致しない行も返すため、SQL外部結合の場合に出力でこのNULL行を取得できます。
この記事では、さまざまなSQL結合タイプについて説明しました。 SQL結合を使用するときに覚えて適用する重要なベストプラクティスをいくつか示します。SQL自己結合
SQLクロス結合
SQL外部結合
左外側結合
右外側結合
完全な外部結合
SQLは複数のテーブルと結合します
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
NULL値とSQL結合
SQL結合のベストプラクティス