はじめに
SQL 言語
SQL は、構造化照会言語の頭字語です。 SQL は、リレーショナル データベースとの情報のやり取りに使用されます。 SQL ステートメントを使用して、データベース内のデータの更新や、データベースからのデータの取得などのタスクを実行します。 たとえば、SQL SELECT ステートメントは、データベースに対してクエリを実行し、一連のデータ行を返すために使用されます。 SQL を使用する一般的なリレーショナル データベース管理システムには、Microsoft SQL Server、MySQL、PostgreSQL、MariaDB、Oracle などがあります。
SQL 言語には、米国規格協会 (ANSI) によって定められた標準があり、 各ベンダーによって、独自のバリエーションと拡張機能が追加されています。
このモジュールでは、次の方法を学習します。
- SQL とは何か、およびその使用方法を理解する
- スキーマ内のデータベース オブジェクトを識別する
- SQL ステートメントの種類を識別する
- SELECT ステートメントを使用してデータベース内のテーブルのクエリを実行する
- データ型を操作する
- NULL を処理する
Transact-SQL
SELECT、INSERT、UPDATE、DELETE などの基本的な SQL ステートメントは、使用しているリレーショナル データベース システムに関係なく使用することができます。 これらの SQL ステートメントは、ANSI SQL 標準に含まれますが、多くのデータベース管理システムには、独自の拡張機能も用意されています。 このような拡張機能には SQL 標準に含まれていない機能が備わっています。セキュリティ管理やプログラミングなどの領域も含まれます。 SQL Server、Azure SQL Database、Microsoft Fabric などの Microsoft のデータベース システムでは、Transact-SQL または T-SQL と呼ばれる SQL の方言が使用されています。 T-SQL には、データベース内に格納されるアプリケーション コードであるストアド プロシージャおよび関数を記述し、ユーザー アカウントを管理するための言語拡張機能が含まれています。
SQL は "宣言型" 言語
プログラミング言語は、"手続き型" または "宣言型" として分類することができます。 手続き型言語を使用すると、コンピューターがタスクを実行するために従う一連の命令を定義できます。 宣言型言語を使用すると、必要な出力を記述し、出力を生成するために必要な手順の詳細は実行エンジンに任せることができます。
SQL では、いくつかの手続き型構文がサポートされていますが、SQL を使用したデータのクエリは、通常、宣言型セマンティクスに従います。 SQL を使用して、必要な結果を記述すると、それを取得するための "クエリ プラン" がデータベース エンジンのクエリ プロセッサによって作成されます。 クエリ プロセッサでは、データベース内のデータに関する統計とテーブルで定義されたインデックスを使用して、適切なクエリ プランを作成します。
リレーショナル データ
SQL は、ほとんどの場合 (常にそうではありません)、"リレーショナル" データベースのデータに対してクエリを実行するために使用されます。 リレーショナル データベースは、データが複数のテーブル (技術的には "リレーション" と呼ばれます) に編成されており、それぞれが特定の種類のエンティティ (顧客、製品、販売注文など) を表します。 これらのエンティティの属性 (顧客の名前、製品の価格、販売注文の注文日など) は、テーブルの列 (つまり属性) として定義され、テーブルの各行は、エンティティの種類 (特定の顧客、製品、販売注文など) を表します。
データベース内のテーブルは、表される特定のエンティティを一意に識別する "キー" 列を使用して相互に関連付けられます。 "主キー" は、テーブルごとに定義され、このキーへの参照は、関連するテーブル内の "外部キー" として定義されます。 例を見た方がわかりやすいでしょう。
この図は、4 つのテーブルを含むリレーショナル データベースを示しています。
- 顧客
- SalesOrderHeader
- SalesOrderDetail
- Product
各顧客は、一意の CustomerID フィールドで識別されます。このフィールドは、Customer テーブルの主キーです。 SalesOrderHeader テーブルには、各注文を識別する OrderID という名前の主キーがあります。また、各注文がどの顧客に関連付けられているかを識別するために、Customer テーブル内の主キーを参照する外部キー CustomerID も含まれています。 注文の個々の項目に関するデータは、SalesOrderDetail テーブルに格納されています。このテーブルには、SalesOrderHeader テーブル内の OrderID と LineItemNo の値を組み合わせた "複合" 主キーがあります。 これらの値の組み合わせにより、行項目が一意に識別されます。 OrderID フィールドも外部キーとして使用され、行項目がどの注文に属するかを示します。ProductID フィールドは、Product テーブルの主キー ProductID への外部キーとして使用され、どの製品が注文されたかを示します。
セットベース処理
集合論は、データ管理のリレーショナル モデルの数学的基礎の 1 つであり、リレーショナル データベースを操作するための基本です。 集合を完全に理解していなくても T-SQL でクエリを記述できる場合もありますが、最終的には、最適なパフォーマンスを実現するために必要となる可能性のある、より複雑な種類のステートメントのいくつかを記述するのが困難な場合があります。
集合論の数学を詳しく調べなくても、集合は "全体と見なされる明確で個別のオブジェクトのコレクション" と考えることができます。SQL Server データベースに適用される用語では、セットは、同じ種類の 0 個以上のメンバーを含む個別のオブジェクトのコレクションと考えることができます。 たとえば、Customer テーブルはセット (具体的にはすべての顧客のセット) を表します。 SELECT ステートメントの結果もセットを形成していることがわかります。
T-SQL クエリ ステートメントの詳細を学習する際には、個々のメンバーではなく、常にセット全体を考えることが重要です。 この考え方により、一度に 1 行ずつ考えるのではなく、セットベースのコードを作成できるようになります。 セットを操作するには、一度に 1 つずつではなく、"一度にすべて" 発生する操作の観点から考える必要があります。
集合論について注意すべき重要な特徴の 1 つは、集合のメンバーの順序に関する仕様がないことです。 この順序の欠如は、リレーショナル データベース テーブルにも当てはまります。 "最初" の行、"2 番目" の行、または "最後" の行という概念はありません。 要素は、任意の順序でアクセス (および取得) できます。 結果を特定の順序で返す必要がある場合、SELECT クエリで ORDER BY 句を使用して明示的に指定する必要があります。