Structured Query Language (構造化問い合わせ言語) は標準的なデータベース言語で、リレーショナル データベースの作成、維持、検索に使用されます。

  • SQL は大文字と小文字を区別しません。 しかし、キーワード(SELECT、UPDATE、CREATEなど)は大文字で使用し、ユーザー定義のもの(テーブル名、カラム名など)は小文字で使用することが推奨されています。
  • SQLでコメントを書くには、先頭に”-“(ダブルハイフン)をつけるとよいでしょう。 (ダブルハイフン)を使ってコメントを書くことができます。
  • SQLは、MySQL、Oracle、Sybase、SQL Server、Postgreなどのリレーショナルデータベース(以下に説明)用のプログラミング言語です。 MongoDB、DynamoDBなどの他の非リレーショナルデータベース(NoSQLとも呼ばれる)のデータベースは、SQLを使用しません
  • SQLにはISO標準がありますが、ほとんどの実装では構文がわずかに異なります。
  • リレーショナルデータベースとは

    リレーショナルデータベースとは、データが関係(テーブル)の形で保存され、また検索されることを意味します。 表1は、学生のROLL_NO、NAME、ADDRESS、PHONE、AGEを格納するSTUDENTという1つの関係だけを持つリレーショナルデータベースです。

    STUDENT

    div

    です。

    です。

    ROLL_NO NAME ADDRESS PHONE AGE
    1 RAM DELHI 9455123451 18
    2 RAMESH GURGAON 9652431543 18
    3 SUJIT ROHTAK 9156253131 20
    4 SURESH DELHI 9156768971 18

    TABLE 1

    関係性を表す重要な用語をご紹介します。

    Attribute(属性)。 例えば、ROLL_NO、NAMEなどです。

    タプル(Tuple)。 リレーションの各行はタプルと呼ばれます。 上記のリレーションには4つのタプルがあり、そのうちの1つを以下に示します。

    td

    1 RAM DELHI 9455123451 18

    度数のことです。 関係に含まれる属性の数は、関係の次数として知られています。 上で定義したSTUDENT関係は次数5です。

    カーディナリティ。 関係におけるタプルの数はcardinalityと呼ばれる。 上で定義したSTUDENT関係のカーディナリティは4です。 カラムは特定の属性に対する値のセットを表します。

    ROLL_NOというカラムは、STUDENT関係から抽出されます。

    ROLL_NO

    リレーショナル・データベースを扱うためのクエリは、以下のように分類できます。 例:CREATE TABLE、ADD COLUMN、DROP COLUMNなど。

    Data Manipulation Language(データ操作言語)。 例:INSERT、DELETE、UPDATEなど。

    Data Query Language(データ問い合わせ言語)。 例:SELECT

    それではまず、データ問い合わせ言語について考えてみましょう。 リレーショナルデータベースからデータを取り出すための一般的なクエリは次のようになります。

  1. SELECT Attribute_List FROM R1,R2….RM
  2. ]
  3. ];

ステートメント1で表されるクエリの一部は、リレーショナルデータベースからデータを取り出す場合には必須です。 中に書かれている文は任意です。 ここでは、表1に示したリレーションに関する可能なクエリの組み合わせを見ていきます。

ケース1:全学生の属性ROLL_NOとNAMEを取得したい場合、クエリは次のようになります。

SELECT ROLL_NO, NAME FROM STUDENT;
ROLL_NO NAME
1 RAM
2 RAMESH
3 SUJIT
4 SURESH

ケース2です。 ROLL_NOが2より大きい学生のROLL_NOとNAMEを取得したい場合、クエリは次のようになります。

SELECT ROLL_NO, NAME FROM STUDENT WHERE ROLL_NO>2;
ROLL_NO NAME
3 SUJIT
4 SURESH

CASE 3: 学生のすべての属性を取得したい場合、すべての属性を記述する代わりに*を記述することができます。

SELECT * FROM STUDENT WHERE ROLL_NO>2;

です。

ROLL_NO NAME ADDRESS PHONE AGE
3 SUJIT ROHTAK 9156253131 20
4 SURESH DELHI 9156768971 18

CASE 4: リレーションを年齢の昇順で表現したい場合は、ORDER BY句を次のように使用します。

SELECT * FROM STUDENT ORDER BY AGE;

です。

ROLL_NO NAME ADDRESS PHONE AGE
1 RAM DELHI 9455123451 18
2 RAMESH GURGAON 9652431543 18
4 SURESH DELHI 9156768971 18
3 SUJIT ROHTAK 9156253131 20

注意。 ORDER BY AGEは、ORDER BY AGE ASCと同等です。 AGEの降順で結果を取得したい場合は、ORDER BY AGE DESCを使用できます。

CASE 5: ある属性や属性グループの異なる値を取得したい場合は、DISTINCTを使用します。

SELECT DISTINCT ADDRESS FROM STUDENT;

ADDRESS

DELHI

GURGAON

ROHTAK

DISTINCTを使用しない場合、DELHIは結果セットの中で2回繰り返されます。 GROUP BYとHAVINGを理解する前に、SQLの集約関数を理解する必要があります。

集約関数。 集約関数は、リレーションのデータ値に対して数学的な操作を行うために使用されます。 SQLで使用される一般的な集約関数には次のようなものがあります:

  • COUNT: 例えば、
SELECT COUNT (PHONE) FROM STUDENT;

COUNT(PHONE)

  • SUM: SUM関数は、リレーション内の属性の値を加算するのに使用されます。 例;

SELECT SUM (AGE) FROM STUDENT;

SUM(AGE)

同じように、MIN、MAX、AVGも使用できます。 上で見てきたように、すべての集約関数は1行しか返しません。

AVERAGE。 タップルの平均値を求めます。
Syntax:AVG(attributename)
OR
Syntax:SUM(attributename)/COUNT(attributename)
上記の構文でもタプルの平均値を取得します。

MAXIMUM:すべてのタプルの集合の中で最大の値を抽出します。
Syntax:MAX(attributename)

MINIMUM:すべてのタプルの集合の中で最小の値を抽出します。
Syntax:MIN(attributename)

GROUP BY: グループ・バイは、属性または属性のグループに基づいてタプルをグループ化するために使用されます。 例えば、

SELECT ADDRESS, SUM(AGE) FROM STUDENTGROUP BY (ADDRESS);

このクエリでは、SUM(AGE)はテーブル全体ではなく、各住所ごとに計算されます。 出力は以下の通りです。

ADDRESS SUM(AGE)
DELHI 36
GURGAON 18
ROHTAK 20

以下のようなクエリを実行しようとすると、エラーが発生します。 なぜなら、住所ごとにSUM(AGE)を計算しましたが、グループ化した住所ごとに1つ以上のROLL_NOが存在するため、エラーになります。 そのため、結果セットに表示することができません。 GROUP BYを使用する際には、結果セットの意味を理解するために、SELECT文の後に列に対して集約関数を使用する必要があります。

SELECT ROLL_NO, ADDRESS, SUM(AGE) FROM STUDENTGROUP BY (ADDRESS); 

注意: GROUP BY句の一部ではない属性は、選択に使用することはできません。 GROUP BY句の一部である属性は、選択に使用することができますが、それは必須ではありません。 しかし、GROUP BY句の一部ではない属性を集計関数で使用することはできます。
SQLに関するクイズ

GROUP BY句の一部ではない属性を選択することはできません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です