この記事では、リレーショナル データベースの設計哲学を紹介します。SQLでは、すべてが関係です。
コンピューター時代の分野には、次のような優れたデザインコンセプトやアイデアがたくさんあります。
Unix では、すべてがファイルです。
オブジェクト指向プログラミング言語では、すべてがオブジェクトです。
リレーショナル データベースにも独自の設計哲学があります。つまり、 SQL では すべてがリレーションです。
01
リレーショナル モデルリレーショナル モデル (リレーショナル モデル) は、集合論における 関係概念 に基づいて 1970 年に EFCodd 博士によって提案され、現実世界のエンティティ オブジェクトとそれらの間のリンクの両方が 関係によって表現されます 。データベース システムで見られる関係は、 行(Row) と列 ( Column)で構成される 2 次元のテーブル (Table) です。したがって、リレーショナル テーブルはデータ行の集合である とも言えます 。
リレーショナル モデルは、データ構造、リレーショナル操作、整合性制約の 3 つの部分で構成されます。
リレーショナル モデルのデータ構造は、ベース テーブル、派生テーブル(クエリ結果)、および仮想テーブル(ビュー)を含むリレーショナル テーブルです。
一般的に使用されるリレーショナル操作には、SQL 言語を使用したadd 、delete 、modify 、およびquery (CRUD)が含まれます。その中で、選択、射影、和集合、交差、例外、デカルト積などのクエリ操作が最も複雑です。
整合性制約は、データの整合性を維持したり、エンティティの整合性(主キー制約)、参照整合性(外部キー制約)、ユーザー定義の整合性(非 NULL 制約、一意制約、チェック制約など) などのビジネス制約のニーズを満たすために使用されます。デフォルト値)。
今日のトピックはリレーショナル操作言語 (SQL) です。
02
セット指向SQL (構造化照会言語) は、 リレーショナル データベースを操作するための標準言語です 。 SQL は英語に非常に近く、非常に簡単に使用できます。 設計の初期段階では、技術者以外の人のニーズも考慮されており、通常は望ましい結果 ( What) を説明するだけで済み、データ処理プロセス (How) はデータベース管理システムに任せられます。 つまり、SQL は人々にとっての真のプログラミング言語なのです。 次に、関係のさまざまな演算ステートメントを詳細に分析しましょう。その目的は、SQL が集合指向のプログラミング言語であり、その演算オブジェクトが集合であり、演算の結果も集合であることを
誰もが理解できるようにすることです。
リレーショナル データベースでは、通常、リレーション、テーブル、コレクションは同じ概念を表します。
03
次のSELECT は単純なクエリ ステートメントです:
SELECT employee_id, first_name, last_name, recruit_date
FROM employees; その機能は、 employees テーブルから従業員情報をクエリする
ことです。
明らかに、FROM の後にテーブル (リレーション、コレクション) があることは誰もが知っています。それだけでなく、クエリ ステートメント全体の結果も table になります。
したがって、上記のクエリをテーブルとして使用できます。
選択 *
FROM ( SELECT 従業員 ID、名、姓、 recruit_date & nbsp
; FROM employees) t; 括弧内のクエリ ステートメントは派生テーブルと呼ばれ、それに t という別名が割り当てられてい
ます。また、クエリ結果全体は table です。これは、退屈ではありますが、ネストを続けることができることを意味します。
PostgreSQL の別の例を見てみましょう:
-- PostgreSQL
SELECT *
FROM upper( 'sql');
| upper |
| -------|
| SQL |
upper() は関数です大文字変換用。これは FROM 句に表示されます。これは、その結果もテーブルですが、1 行 1 列の特殊なテーブルであることを意味します。
SELECT 句は、クエリ対象のフィールドを指定するために使用されます。フィールドには式や関数値を含めることができます。待って。SELECT は関係演算では射影と呼ばれますが、以下の模式図を見るとわかりやすいと思います。
SELECT に加えて、一般的に使用される SQL 句がいくつかあります。
WHERE は、リレーショナル操作で選択と呼ばれるデータ フィルタリングの条件を指定するために使用されます。概略図は次のとおりです:
ORDER BY は、クエリ結果の並べ替え
に使用されます 。概略図は次のとおりです: SQL は、フィルタリング、グループ化、並べ替え、数量制限などの各種のデータ操作を完了できます。これらすべての操作のオブジェクトはリレーショナル テーブルであり、結果もリレーショナル テーブルです。
これらの関係演算の中には、グループ化という特別な演算があります。
04
GROUP BYグループ化 (GROUP BY) 操作は、リレーションの構造を変更するため、他のリレーショナル操作とは異なります。 次の例を考えてみましょう。
SELECT Department_id, count(*), first_name
FROM employees
GROUP BY Department_id;
このステートメントの目的は、部門ごとに従業員数をカウントすることですが、構文エラーがあります。つまり、first_name はクエリ リストに含めることはできません。その理由は、部門ごとにグループ化する場合、各部門には複数の従業員が含まれるため、どの従業員の名前を表示する必要があるかを判断できないのは論理的なエラーです。
したがって、GROUP BY はコレクション要素 (データ行) の構造を変更し、まったく新しい関係を作成します。
グループ化操作の概略図は次のとおりです。
それでも、GROUP BY の結果はコレクションです。
05
UNIONSQLのコレクション指向の機能を最も明白に示しているのは次のとおりです。
UNION (和集合演算)
INTERSECT (交差演算)
EXCEPT/MINUS (減算演算)
両側のコレクション内のフィールドの数と順序は同じである必要があります。
両側のコレクション内の対応するフィールドの型は一致するか、互換性がある必要があります。
具体的には、UNION と UNION ALL を使用して 2 つのコレクションの和集合を計算し、最初のクエリ結果または 2 番目のクエリ結果のいずれかに表示されるデータを返します。
両者の違いは、UNION では結果から重複データが除外されるのに対し、 UNION ALL では重複データが保持されることです。
以下は UNION 演算の概略図です:
INTERSECT 演算子は2 つのセットの共通部分、つまり最初のクエリ結果と 2 番目のクエリ結果に同時に現れるデータを返すために使用されます。結果内の重複データは除外されます。
INTERSECT 操作の概略図は次のとおりです。
EXCEPT または MINUS 演算子は、2 つのセットの差分セット、つまり、最初のクエリ結果には表示されるが 2 番目のクエリ結果には表示されないレコードを返し、結果内の重複データを除外するために使用されます。
EXCEPT 演算子の概略図は次のとおりです:
さらに、DISTINCT 演算子は、重複データを削除する、つまりコレクション内の重複要素を除外するために使用されます。
SQL のリレーショナル概念は数学の集合論から来ているため、UNION、INTERSECT、EXCEPT はそれぞれ集合論の和集合 (∪\cup∪)、積集合 (∩\cap∩)、差分 (∖\setminus∖) の演算から来ています。 。
集合論のコレクションでは重複データが許可されませんが、SQL では許可されることに注意してください。したがって、SQL のコレクションはマルチセットとも呼ばれます。集合理論のマルチセットとコレクションは順序付けされていませんが、SQL では ORDER BY 句を使用してクエリ結果を並べ替えることができます。
06
JOINSQL では、エンティティ オブジェクトがリレーショナル テーブルに格納されるだけでなく、 オブジェクト間の関係も リレーショナル テーブルに格納されます。 したがって、これらの関連データを取得したい場合は、別の操作である結合クエリ (JOIN) を使用する必要があります 。一般的な SQL 結合クエリ タイプには、内部結合、外部結合、クロス結合などが含まれます。このうち、外部結合は、左外部結合、右外部結合、完全外部結合に分けられます。内部結合(Inner Join) は、結合条件を満たす2 つのテーブルのデータを返します。内部結合の原理は、次の図に示されています。左外部結合(左外部結合) は、左側のテーブルのすべてのデータを返します。右のテーブルでは、結合条件データを満たすデータを返します。結合条件がない場合は null を返します。左外部結合の原理は次の図に示されています:右外部結合(右外部結合)は、右側のテーブル内のすべてのデータを返します。左側のテーブルについては、結合条件を満たすデータを返し、NULL 値を返します。そうでなければ。右外部結合と左外部結合は交換できます。次の 2 つは同等です: t1 RIGHT JOIN t2
t2 LEFT JOIN t1完全
外部結合(完全外部結合) は、左外部結合と右外部結合と同等であり、左のテーブルと右のテーブルのすべてのデータを同時に返します。結合条件を満たしていない場合は、null 値を返します。
完全外部結合の原理を次の図に示します。
クロス結合はデカルト積とも呼ばれます。2 つのテーブルのクロス結合は、一方のテーブルのすべての行ともう一方のテーブルのすべての行を結合することに相当し、結果の数は2 つのテーブルの行数の乗算になります。
クロスコネクトの原理を次の図に示します。
他のタイプの接続には、セミ結合 (SEMI JOIN) およびアンチ結合 (ANTI JOIN) があります。
select & nbsp; 部門 ID
& nbsp; & nbsp; from & nbsp; 部門
& nbsp; Union
select & nbsp; 部門 ID
& nbsp. ; & nbsp;
from
& nbsp ; 従業員; e.デパートメント_id)
FROM デパートメント d
FULL JOIN 従業員 e ON (e.デパートメント_id = d.デパートメント_id); クエリの例をたくさん取り上げましたが、他のクエリの例も見てみましょ
うデータ操作。
07
DMLDML は、データ操作言語 ( Insert、Update、および Delete) の略です 。以下は挿入ステートメントの例です: CREATE TABLE test( id int); -- MySQL、SQL Server などINSERT INTO test( id) VALUES ( 1),( 2), ( 3); -- Oracle INSERT INTO test( id) ( SELECT 1 AS id FROM DUAL UNION ALL SELECT 2 FROM DUAL UNION ALL SELECT 3 FROM デュアル); INSERT ステートメントによって 3 つのレコードが挿入されるか、3 つのレコードを含むリレーショナル テーブルが挿入されます。UNION ALL はリレーショナル テーブルを返すためです。VALUES はリレーショナル テーブルも指定し、SQL Server および PostgreSQL の次のステートメントをサポートします: SELECT *
FROM (
VALUES( 1),( 2),( 3)
) test( id);
前に述べたように、FROM の後にはリレーショナル テーブルが続くため、ここでも VALUES 同じ。挿入するのは単一レコードであることが多いため、実際にはテーブル単位で操作。
同様に、UPDATE ステートメントと DELETE ステートメントもリレーショナル テーブル単位での操作です。これは、データ行が更新される、または複数のレコードが削除されると言うことに慣れているだけです。