IT初心者のための基本情報ではじめる SQL 入門 ~データベース分野 2
この連載は、これから IT の勉強をはじめる人を対象としたものです。 基本情報技術者試験の出題分野ごとに、仕組み、主要な用語、および過去問題を紹介します。 受験対策としてだけでなく、 IT の基礎知識を幅広く得るために、ぜひお読みください。
今回は、データベース 分野 その 2 として SQL を取り上げます。
もくじ
SQL が必要な理由
現在主流のデータベース方式は、データを表形式で格納する関係データベースです。 Oracle Database 、 SQL Server 、 DB2 、 MySQL などの代表的な DBMS 製品が、関係データベースを採用しています。 これらの DBMS をサーバーマシンにインストールすることで、データベースを実現できます。
info_outline関係データベースを説明した前回の記事
ユーザーは、専用の言語で DBMS に命令を与えて、表の作成や操作などを行います。 そのための言語が、 SQL ( Structures Query Language 、構造化照会言語)です。 DBMS を使うために SQL が必要なのです。
SQL の仕様は、 ISO( International Organization for Standardization 、国際標準化機構)や JIS ( Japanese Industrial Standards 、日本産業規格)で標準化されています。 したがって、どの DBMS 製品を使っていても、基本的に SQL のキーワードや構文は同じです。
ここで、基本的と断っているのは、 DBMS 製品によって若干の違いがあるからです。 情報処理推進機構が公開している「試験で使用する情報技術に関する用語・プログラム言語など Ver.5.0 」では、 JIS X 3005 規格群の SQL を使うと示されています。 この規格の内容を調べる必要はありません。 基本情報技術者試験には、特定の DBMS 製品に依存しない基本的な SQL が出題されるからです。
SQL の構文と主要な命令
SQL のキーワードや構文を使って記述された文を SQL 文と呼びます。 SQL 文は、すべて「~せよ」を意味する命令文です。 C 言語、 Java 、 Python などのプログラミング言語では、複数の命令を使って処理の流れを表しますが、 SQL では、基本的に 1 つの命令で 1 つの操作を表します(複数の命令をまとめることもできます)。
試験によく出る SQL の命令
SQL の構文は、英語の命令文と同様であり、
の順に言葉を並べます。
命令の種類は、
- データを定義する命令
- データを操作する命令
- データを制御する命令
に大きく分けられます。
以下は、試験によく出題される命令です。 基本情報技術者試験のシラバスにある「データベース言語( SQL )」にも、これらの命令が示されています。
- CREATE TABLE 命令
- テーブル(表)を作成せよ
- SELECT 命令
- データを選択(検索)せよ
- INSERT 命令
- データを挿入(登録)せよ
- UPDATE 命令
- データを更新せよ
- DELETE 命令
- データを削除せよ
import_contacts 試験によく出る SQL の命令
CREATE TABLE は、データを定義する命令です。
SELECT 、 INSERT 、 UPDATE 、 DELETE は、データを操作する命令です。
関係データベースは、データを表形式で格納するので、命令の対象となる目的語は、表全体や表の中にあるデータです。
SQL 文を読んでみよう
SQL 文では、動詞と目的語の他にも、前置詞や関係副詞などが使われることもあります。 単語を並べる順序は、英語の構文と同様なので、英語の命令文だと思って SQL 文を見れば、意味を読み取れるでしょう。
以下に、 SQL 文の例を示します。
code 検索を行う SQL 文の例
SELECT 氏名, 給与 FROM 社員 WHERE 給与 >= 300000
lightbulb 赤色文字は、 SQL として意味が決められたキーワードや記号です。
これは、
FROM 社員
)、給与が300000以上という条件で(
WHERE 給与 >= 300000
)、氏名列と給与列を検索せよ(
SELECT 氏名, 給与
)format_quote
という意味です。 SELECT は動詞、 FROM は前置詞、 WHERE は関係副詞であり、 SQL として意味が決められたキーワードです。 これらのキーワードの後に、表や列や条件などを置くことで、 1 つの SQL 文が構成されます。
SQL は、英語の大文字と小文字を区別しません。 たとえば、 SELECT という命令は、 select と記述することも、 Select と記述することもできます。
この SQL 文を実行すると、実行結果が表形式で得られます。 この表は、 FROM
の後に指定された表から条件に一致する行を選択し、指定された列だけを取り出したものです。 たとえば、以下のような表が得られます。
氏名 | 給与 |
---|---|
山田太郎 | 320000 |
鈴木花子 | 350000 |
佐藤三郎 | 330000 |
SQL の過去問題
SQL の分野の過去問題を 3 問ほど紹介しましょう。
CREATE TABLE で表を作成する SQL 文 と UPDATE でデータを更新する SQL 文
最初は、表を作成する SQL 文と、データを更新する SQL 文の問題です。
表を作成する SQL 文 は、
CREATE TABLE 表名(列名 データ型, 列名 データ型, ・・・, PRIMARY KEY(列名))
という構文で表を作成します。 データ型には、CHAR(文字数)
で指定する文字列型や、INT
で指定する整数型などがあります。
PRIMARY KEY(列名)
は、列名で指定された列が主キー(レコードを一意に識別するためのユニークなデータ)であることを設定します。
データを更新する SQL 文は、
UPDATE 表名 SET 列名 = 更新後の値 WHERE 条件
という構文でデータを更新します。
“商品” 表に対してデータの更新処理が正しく実行できる UPDATE 文はどれか。 ここで, “商品” 表は次の CREATE 文で定義されている。
CREATE TABLE 商品
(商品番号 CHAR(4), 商品名 CHAR(20), 仕入先番号 CHAR(6), 単価 INT,
PRIMARY KEY(商品番号))
商品番号 | 商品名 | 仕入先番号 | 単価 |
---|---|---|---|
S001 | A | XX0001 | 18000 |
S002 | A | YY0002 | 20000 |
S003 | B | YY0002 | 35000 |
S004 | C | ZZ0003 | 40000 |
S005 | C | XX0001 | 38000 |
ア
UPDATE 商品 SET 商品番号 = 'S001' WHERE 商品番号 = 'S002'
イ
UPDATE 商品 SET 商品番号 = 'S006' WHERE 商品名 = 'C'
ウ
UPDATE 商品 SET 商品番号 = NULL WHERE 商品番号 = 'S002'
エ
UPDATE 商品 SET 商品番号 = 'D' WHERE 商品番号 = 'S003'
問題に示された CREATE TABLE 命令の SQL 文は、
20 文字の文字列型の商品名列、
6 文字の文字列型の仕入先番号列、
整数型の単価列を持ち、
商品番号列を主キーとして、
商品表を作成せよ format_quote
という意味です。
問題の選択肢に示された SQL 文は、どれも商品表を更新する内容になっています。
問題を解くポイントは、主キーが重複する結果になる更新は、許可されない( SQL 文の実行結果がエラーになる)ということです。
先ほどの CREATE TABLE 命令によって、商品表の商品番号列が主キーに設定されています。 したがって、選択肢に示された SQL 文の中で、商品番号列が重複する結果にならない更新が、正しく実行できます。
- 選択肢アの SQL 文
-
商品番号列が ‘S002’ という条件で、商品表の商品番号列を ‘S001’ に更新せよ
という意味です。 この SQL 文を実行すると、商品番号列で ‘S001’ が重複してしまうので、エラーになります。
- 選択肢イの SQL 文
-
商品名列が ‘C’ という条件で、商品表の商品番号列を ‘S006’ に更新せよ
という意味です。 この SQL 文を実行すると、商品番号列で ‘S006’ が重複してしまうので、エラーになります。
- 選択肢ウの SQL 文
-
商品番号列が ‘S002’ という条件で、商品表の商品番号列を NULL に更新せよ
という意味です。 主キーは、重複が許可されませんが、 NULL (未設定)にすることも許可されないので、この SQL 文を実行するとエラーになります。
- 選択肢エの SQL 文
-
商品番号列が ‘S003’ という条件で、商品表の商品名列を ‘D’ に更新せよ
という意味です。 主キーが重複することも、 NULL になることもないので、この SQL 文は、正しく実行できます。
したがって、正解は、選択肢エです。
SELECT と WHERE でデータを検索する SQL 文
次は、表を検索する表を検索する SQL 文の問題です。
SELECT 列名 FROM 表名 WHERE 条件
という構文でデータを検索します。
複数の列を指定する場合は、列名をカンマで区切って並べます。
次の表は,営業担当者のある年度の販売実績である。 この表の第 1 期から第 4 期の販売金額の平均が 4,000 万円以上で,どの期でも 3,000 万円以上販売している営業担当者の名前を求める SQL 文として,適切なものはどれか。 ここで,金額の単位は千円とする。
番号 | 名前 | 第 1 期 | 第 2 期 | 第 3 期 | 第 4 期 |
---|---|---|---|---|---|
123 | 山田一 郎 | 29,600 | 31,900 | 36,600 | 41,500 |
594 | 鈴木 太郎 | 43,500 | 45,300 | 30,400 | 46,400 |
612 | 佐藤 花子 | 49,600 | 39,400 | 42,300 | 51,100 |
︙ | ︙ | ︙ | ︙ | ︙ | ︙ |
ア
SELECT 名前 FROM 販売実績
WHERE (第 1 期 + 第 2 期 + 第 3 期 + 第 4 期) / 4 >= 40000 OR
第 1 期 >= 30000 OR 第 2 期 >= 30000 OR
第 3 期 >= 30000 OR 第 4 期 >= 30000
イ
SELECT 名前 FROM 販売実績
WHERE (第 1 期 + 第 2 期 + 第 3 期 + 第 4 期) >= 40000 AND
第 1 期 >= 30000 AND 第 2 期 >= 30000 AND
第 3 期 >= 30000 AND 第 4 期 >= 30000
ウ
SELECT 名前 FROM 販売実績
WHERE 第 1 期 > 40000 OR 第 2 期 > 40000 OR
第 3 期 > 40000 OR 第 4 期 > 48800 AND
第 1 期 >= 30000 OR 第 2 期 >= 30000 OR
第 3 期 >= 30000 OR 第 4 期 >= 30000
エ
SELECT 名前 FROM 販売実績
WHERE (第 1 期 + 第 2 期 + 第 3 期 + 第 4 期) >= 160000 AND
第 1 期 >= 30000 AND 第 2 期 >= 30000 AND
第 3 期 >= 30000 AND 第 4 第 >= 30000
選択肢に示された SQL 文は、どれも SELECT 名前 FROM 販売実績
までが同じであり、 WHERE
以降の条件が異なります。 ここでは、
第 1 期から第 4 期の販売金額の平均が 4,000 万円以上で、かつ、どの期でも 3,000 万円以上販売している
という条件に該当するものを選びます。
- 選択肢ア
- 「かつ」を意味する AND ではなく、「または」意味する OR で条件が結ばれているので、不適切です。
- 選択肢イ
- 第 1 期から第 4 期の販売金額の平均ではなく、合計が 4,000 万円以上という条件になっているので、不適切です。
- 選択肢ウ
- 第 1 期から第 4 期の販売金額の平均ではなく、それぞれの期の金額に関する条件になっているので(かなりメチャクチャな条件です)、不適切です。
- 選択肢エ
- 第 1 期から第 4 期の販売金額の合計が 16,000 万円以上という条件になっていますが、これは平均が 4,000 万円以上と同じ意味であり、かつ、どの期でも 3,000 万円以上販売しているという条件があるので、適切です。
したがって、正解は、選択肢エです。
関数を使った SQL 文
SQL には、データの合計値や平均値などを求める関数が用意されています。 最後に紹介するのは、関数を使った SQL 文の問題です。
“出庫記録” 表に対する SQL 文のうち,最も大きな値が得られるものはどれか。
商品番号 | 日付 | 数量 |
---|---|---|
NP200 | 2015-10-10 | 3 |
FP233 | 2015-10-10 | 2 |
NP200 | 2015-10-11 | 1 |
FP233 | 2015-10-11 | 2 |
ア
SELECT AVG(数量) FROM 出庫記録 WHERE 商品番号 = 'NP200'
イ
SELECT COUNT(*) FROM 出庫記録
ウ
SELECT MAX(数量) FROM 出庫記録
エ
SELECT SUM(数量) FROM 出庫記録 WHERE 日付 = '2015-10-11'
- 選択肢ア
AVG(数量)
は、数量列の平均値を求めます。商品番号 = 'NP200'
という条件に一致する行の数量は、 3 と 1 なので、それらの平均の 2 が得られます。- 選択肢イ
COUNT(*)
は、検索で一致したレコード数を求めます。
ここでは、 WHERE による条件の指定がないので、出庫記録表のすべてのレコードが検索に一致し、出庫記録表のレコード数である 4 が得られます。COUNT(*)
のカッコの中の*
は、列が NULL に設定されているレコードもカウントすることを意味します。 このカッコの中に特定の列名を指定すると、その列が NULL でないレコードだけがカウントされます。- 選択肢ウ
MAX(数量)
は、数量列の最大値を求めます。
ここでも、 WHERE による条件の指定がないので、出庫記録表のすべてのレコードの数量の最大値である 3 が得られます。- 選択肢エ
SUM(数量)
は、数量列の合計値を求めます。日付 = '2015-10-11'
という条件に一致する行の数量は、 1 と 2 なので、それらの合計値の 3 が得られます。
以上のことから、最も大きな値は4であり、正解は選択肢イです。
今回は「データベース」その 2 として「 SQL 」が必要な理由、 SQL の構文と主要な命令、および SQL の過去問題を紹介しました。
次回は、「ネットワーク」その 1 として「ネットワーク全般」の分野を取り上げます。
それでは、またお会いしましょう!
label 関連タグ免除試験を受けた 74.9% の方が、 科目A免除資格を得ています。
IT初心者のための アルゴリズムとデータ構造入門 ~ 基本情報ではじめるコンピュータ科学の基礎理論(4)
updateIT初心者のための 論理回路 入門 ~ 基本情報ではじめるコンピュータ科学の基礎理論(3)
updateIT初心者のための 2進数 入門 ~ 基本情報ではじめるコンピュータ科学の基礎理論(2)
updateIT初心者のための基本情報ではじめる ストラテジ 入門
updateIT初心者のための基本情報ではじめる サービスマネジメント 入門 ~マネジメント分野 2
updateIT初心者のための基本情報ではじめる プロジェクトマネジメント 入門 ~マネジメント分野 1
updateIT初心者のための基本情報ではじめる 開発技術 入門
updateIT初心者のための基本情報ではじめる 暗号化 入門 ~セキュリティ分野 2
updateIT初心者のための基本情報ではじめる セキュリティ 入門 ~セキュリティ分野 1
updateIT初心者のための基本情報ではじめる OSI基本参照モデル 入門 ~ネットワーク分野 2
update『プログラムはなぜ動くのか』(日経BP)が大ベストセラー
IT技術を楽しく・分かりやすく教える“自称ソフトウェア芸人”
大手電気メーカーでPCの製造、ソフトハウスでプログラマを経験。独立後、現在はアプリケーションの開発と販売に従事。その傍ら、書籍・雑誌の執筆、またセミナー講師として活躍。軽快な口調で、知識0ベースのITエンジニアや一般書店フェアなどの一般的なPCユーザの講習ではダントツの評価。
お客様の満足を何よりも大切にし、わかりやすい、のせるのが上手い自称ソフトウェア芸人。
主な著作物
- 「プログラムはなぜ動くのか」(日経BP)
- 「コンピュータはなぜ動くのか」(日経BP)
- 「出るとこだけ! 基本情報技術者」 (翔泳社)
- 「ベテランが丁寧に教えてくれる ハードウェアの知識と実務」(翔泳社)
- 「ifとelseの思考術」(ソフトバンククリエイティブ) など多数