モジュール詳細:残忍SQL

大きな数字の表を使いこなして類似点を探すのはなんと楽しいことだろう……。

このモジュールは、SQL文シミュレータである。解除するには、与えられた結果を出力するSQLクエリ(命令)を作成する。入力データはこのマニュアル内にあり、それを使って与えられた結果を表現する。このドキュメントを使用して、入力データから希望通りの結果を表現するSQLクエリを作る。

ゴールボタン

Goalボタンを押すと、モジュールが求めている結果を見ることができる。求められるのは、1~3段、3列の数字の表である。以下はその例である。

296
421
714
296
421
296

チェックボタン

Checkボタンを押すと、モジュールはSQLクエリを組み立て入力データに対してそれを実行する。結果がゴールの表と比較される。それが一致した場合モジュールは解除され、そうでない場合、ミスが記録される。

モジュールの解除

モジュールを解除するには、入力データから、ゴール表のどのようなオプションが使用されたかを示せる数字を見つける。段は常に上から下に並んでいるが、列は並べ替えが可能である。例を以下に示す。

ゴール表

901
114
107

ゴール表の3列目がF列目と一致していそうだ!

これはF列を使用して値をグループ化したことを意味するのかもしれない!

入力データの例

ABCDEF
938691
930431
121624
170437

入力データ

モジュールの解除に使用される入力データを以下に示す。この表の中のゴール表から値を見つけ、同じ出力を生成するSQLクエリを作成する。

ABCDEFG
9502103
7831064
7574653
9804104
1272663
1831605
9272155
1572664
7804004
9201155

補足

SQL結果は必ずしも読み順ではない。は上から下へだが、はクエリ内のSELECT句で任意に並べ替えられる。

モジュール詳細:SQL

SQLは、データソースを操作して結果を生成する方法を示す問い合わせ言語である。多様なキーワードが含まれているが、このモジュールではそのうちの小さなサブセットのみが使用される。

SQLの処理方法

SQLは以下のように処理される。

  1. 各段はまずWHERE句と比較される(後述)。WHERE句に合致する段がある場合、その段は以降の処理のために保持される。
  2. その後、すべての段はGROUP BY句(後述)に基づいてグループ化される。必ず1つのグループ表現を与えなければならない。
  3. 各グループの段はSELECT句と設定された集計関数(後述)の処理が行われる。GROUP BY句を使用している1つの表現を除き、必ずすべてに集約関数を使用しなければならない。
  4. 最後に、LIMIT句(後述)で結果から最初のX段をスキップして、その次のY段を取ることで、特定の数の段を破棄することができる。

SELECT X, Y, Z

SELECT句はどの列が(どの順に)返されるべきかを選択する。モジュールは、単一の列参照を最大3つまで提供している。各列をクリックすると、AからG、「-」を循環させることができ、「-」はその選択を無効にする。この例を以下に示す。

ABCDEFG
9302046
7861298
2054731
4715309
6279865
1937654
8543182

SQL: SELECT D, A

3番目の参照列は無いことに注意。「-」を使用している。

DA
29
17
42
54
96
71
38

WHERE X 演算子 Y

WHEREは「フィルタ」の役割を果たしている。段は条件と比較される。フィルタ条件に一致した段のみが出力として保持される。このシンプルなSQLシミュレータでは、列と一定の値のみの比較が可能である(例:A < 2、C = 3、F >= 5)。有効な演算子は、以下の単純かつ身近な算術演算子である。

  • =:同値(イコール)
  • <>:同値ではない(ノットイコール)
  • <:未満
  • <=:以下
  • >:より大きい
  • >=:以上

単純なフィルタの基本例を以下に示す。

ABCDEFG
9302046
7861298
2054731
4715309
6279865
1937654
8543182

SQL: WHERE C >= 5

ABCDEFG
7861298
2054731
6279865

 

注意:条件はSELECTされた列だけではなく、どの列にも適用される。

GROUP BY X

GROUP BY句はどの列を使用して段のグループを作るか選択する。ある列をグループ化する場合、その列にあるすべての値が上からチェックされ、それらの値によってグループが作られ、生成された順に並べられる。さらに、その段のグループに集計関数 = Aggregators(後述)を適用する。例を以下に示す。

ABCDEFG
9502103
7831064
7574653
9804104
1272663
1831605
9272155

SQL: GROUP BY C

ABDEFG
C = 0
952103
984104
C = 3
781064
181605
C = 7
754653
122663
922155

SELECT Aggregators

このモジュールはSELECTに対する集計関数が使用可能である。集計関数は、複数の段のグループを一つの値にまとめるグループ関数である。集計関数を使用する際には、 GROUP BY句の表現も必ず使用しなければならない。集計関数が段のグループにどのように影響を与えるかについて、いくつかの例を示す。

例のデータ 条件 結果
AB
C = 0
95
98
AB
C = 3
78
18
AB
C = 7
75
12
92
SELECT MIN(A), MAX(B), C
980
183
157
AB
C = 0
95
98
AB
C = 3
78
18
AB
C = 7
75
12
92
SELECT COUNT(A), AVG(B), C
260
283
337
A
C = 0
9
9
A
C = 3
7
1
A
C = 7
7
1
9
SELECT SUM(A), C
180
83
177

注意:AVG集計関数では、小数は整数に変換されるため、自動的に小数点以下が切り捨てされる。このため、処理において小数は削除される。このモジュールでは小数を扱うことはない。

LIMIT X, Y

LIMITの後には、次の二つの値が続く。

二つ目の値(スキップ)が最初に適用され、結果の最上段からその段数だけスキップされることに注意する。その後、最初の値が適用され、その中から最大個数の段を返す。

例:

例のデータ条件結果
930
786
205
471
LIMIT 2, 0
(制限2、スキップなし)
930
786
930
786
205
471
LIMIT 999, 1
(制限999(なし); 1段スキップ)
786
205
471
930
786
205
471
LIMIT 1, 2
(制限1; 2段スキップ)
205