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
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つを以下に示します。
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
それではまず、データ問い合わせ言語について考えてみましょう。 リレーショナルデータベースからデータを取り出すための一般的なクエリは次のようになります。
- SELECT Attribute_List FROM R1,R2….RM
- ]
- ];
ステートメント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句の一部ではない属性を選択することはできません。