この章は、前章で説明したコンセプトを組み合わせたものです。

1. エイリアスとORDER BYの結びつけ

従業員とその給与の月額に関するデータが欲しいとしましょう。月額給与のデータを昇順で表示させてみましょう。

SELECT Last_name AS LastName, First_name AS FirstName, Salary/12 AS MonthlySalary
FROM Employee
ORDER BY MonthlySalary ASC

下記の表が取得出来ます。

{{h}}
{{r}}

2. 補集合

従業員のRyu Tanakaが参加していない全てのプロジェクトに関するデータが欲しいと仮定しましょう。この種類のクエリは、1部の人を混乱させるようなので、このようなクエリにどのように対処するかさらに詳細をお話ししましょう。 下記のような間違った答えを言う人もいるでしょう。

SELECT p.name AS Project
FROM Involvement AS inv, Project AS p, Employee AS emp
WHERE inv.Project_id = p.ID AND inv.Employee_id = emp.ID
AND emp.First_name <> 'Ryu' AND emp.Last_name <> 'Tanaka'

下記の表が取得できます。

{{h}}
{{r}}

ここでは何が問題でしょうか? Involvement表[テーブル]は、特別な表[テーブル]で結合表[テーブル]と呼ばれています。(または、junction table) この表は、EmployeeとProject表[テーブル]の間を連結する役割をしています。その表は、1案件に関するたくさんのレコードが含まれているでしょう。 前に見たように、結合 節が表を結合します。(集合) その後、SQLは結合された表から  WHERE 節の条件状態に合うレコードのみを保持します。この場合では、従業員Ryu Tanakaではなくそれを満たす全てのレコードでなければなりません。(図10.2でオレンジ色に色掛けしてあります)最後に、プロジェクト(案件)名のデータのみ必要となります。図10.2がどのようにクエリが構成されているかを示しています。

multiple join in SQL

図 10.2 : SQL 複数結合構築

別のアプローチをしてみましょう。初めにサブクエリを使用して該当する従業員を含む全てのプロジェクトの集合を作成してみましょう。その集合を全てのプロジェクトの集合から除くと、補集合が取得します。

SELECT p.Name
FROM Project AS p
WHERE p.ID NOT IN (
	SELECT inv.project_id
	FROM Involvement AS inv, Employee AS emp
	WHERE inv.Employee_id = emp.ID
	AND emp.First_name = 'Ryu' AND emp.Last_name = 'Tanaka'
)

下記の表となります。

{{h}}
{{r}}

まとめ

この章ではこれまでに学んだ全ての様々な技術をどのように組み立てるかを確認しました。