[0609] SQL文

平成15年度春期 基本情報技術者試験より
A表からB表を得るためのSQL文はどれか。
SELECT 部署コード, 社員コード, 名前 FROM A
GROUP BY 社員コード
SELECT 部署コード, 社員コード, 名前 FROM A
GROUP BY 部署コード
SELECT 部署コード, 社員コード, 名前 FROM A
ORDER BY 社員コード, 部署コード
SELECT 部署コード, 社員コード, 名前 FROM A
ORDER BY 部署コード, 社員コード

正解

解説

 SQL文に関する問題です。

 まずは,この問題を解く鍵となるGROUP BY句,ORDER BY句についてみてみましょう。


■ GROUP BY

 SELECTコマンドで抽出するレコードを,ある列の値をキーにしてグループ化する場合に,「GROUP BY 列名」のように指定します。GROUP BY句の制約として,SELECT句にはGROUP BY句で指定した列と集計関数しか指定することができません。

 キーとなる列を複数指定したい場合は,「,」(カンマ)で区切って「GROUP BY 列名1, 列名2」のように列名を列挙します。但しこの場合,どれか1つの列の値が異なると,他の列の値が重複していても,重複として扱われませんので注意してください。

 実際の構文は以下のようになります。

 SELECT 列名 FROM テーブル名 GROUP BY 列名;


■ ORDER BY

 SELECTコマンドで抽出するレコードを,ある列の値をキーにして昇順,降順に並び替える場合に,「ORDER BY 列名」のように指定します。昇順,降順の指定は「ASC」(昇順),「DESC」(降順)を追加して行ないます。(省略時は昇順となります)

 キーとなる列を複数指定したい場合は,「,」(カンマ)で区切って「ORDER BY 列名1, 列名2」のように列名を列挙します。この場合,列挙した順に,先ず列名1の値で並び替えが行なわれ,次に列名1の値が同じものの中で,列名2の値によって並び替えが行なわれます。(第1キーを列名1の値,第2キーを列名2の値として並び替えられる)

 実際の構文は以下のようになります。

 SELECT * FROM テーブル名 ORDER BY 列名 ASC;


 問題ではB表は,A表より「部署コード」,「社員コード」,「名前」を抽出していて,「部署コード」を第1キー,「社員コード」を第2キーとして,昇順に並べられています。また,B表の「部署コード」には重複した値がみられますので,「部署コード」によるグループ化は行なわれていません。

 それでは,選択肢を見ていきましょう。


 SELECT 部署コード, 社員コード, 名前 FROM A
GROUP BY 社員コード

SELECT句に,GROUP BY句で指定されていない「部署コード」が指定されています。間違ったSQL文です。

 SELECT 部署コード, 社員コード, 名前 FROM A
GROUP BY 部署コード

B表は,「部署コード」によるグループ化は行なわれていません。また,SELECT句に,GROUP BY句で指定されていない「社員コード」,「名前」が指定されています。こちらも間違ったSQL文です。

 SELECT 部署コード, 社員コード, 名前 FROM A
ORDER BY 社員コード, 部署コード

第1キーを「社員コード」,第2キーを「部署コード」として,昇順に並び替えが行なわれます。B表では,斉藤栄一さんの「社員コード」(10020)が,山田五郎さんの「社員コード」(10050)よりも後に並んでいます。「社員コード」を第1キーとして,昇順に並び替えられたものではありません。

 SELECT 部署コード, 社員コード, 名前 FROM A
ORDER BY 部署コード, 社員コード

第1キーを「部署コード」,第2キーを「社員コード」として,昇順に並び替えが行なわれます。正解です。


 以上より,A表からB表を得るためのSQL文はエとなります。
※ 解説の内容は執筆時点のものであり,含まれている情報の正確性,妥当性について保証するものではありません。ご注意ください・・・

関連する(かもしれない)問題