はじめに
前回までは関係データベースや、データベースの正規化について学んできました。
そして今回学ぶテーマは、データベースの抽出です。
データベースには様々なデータが入っているのですが、
テーブルから自分の取り扱いたいデータや項目のみを抽出して、自由に作り変えることもできるのです。
今回はそんなデータベースの抽出について学んでいきましょう!
前回までの記事をまだご覧になっていない方は、こちらも併せて読んでみてくださいね。
データの抽出
先ほども述べた通り、データベースでは自分が使いたいデータや項目のみを抽出することができます。
特に、項目(縦の列)を抽出することを射影、レコード(横の行)を抽出することを選択と言います。
また、複数のテーブルから抽出した項目を組み合わせることを結合と言います。少し詳しく見ていきますね。
射影
射影とは、テーブルから使いたい項目を抽出することです。
分かりやすく言うと、使いたい縦の列を丸ごと抽出することです。
上の画像で言うと、「部活動の列だけ使いたい」や、「得意科目の列だけ使いたい」
という場合に行うのがこの射影です。
選択
選択とは、テーブルから使いたいレコードを抽出することです。
分かりやすく言うと、使いたい横の行を丸ごと抽出することです。
こちらも上の画像で言うと、「石井さんのデータだけ使いたい」とか、「男の人のデータだけ使いたい」
という場合に行うのがこの選択です。
結合
結合とは、複数のテーブルから抽出した項目を組み合わせることです。
上の画像で説明しますね。
今、氏名テーブルと所属委員会テーブルの二種類があり、氏名テーブルには名字と名前が、所属委員会テーブルには委員会が入っています。
ここからもし名字、名前と委員会が一度に全て分かるような状態にしたいときどうすればいいでしょうか。
そんな時に使うのが結合なのです。データベースでは、
氏名テーブルから「名字」の項目と「名前」の項目を抽出し、所属委員会テーブルから「委員会」の項目を抽出して組み合わせるということができるんです。
この結合を行うことで、わざわざ二つのテーブルを見る必要がなくなります
しかし結合には1つ注意点があります。
結合は両方のテーブルに共通している項目がないと行えないのです。
両方のテーブルに共通した項目がないと、抽出した委員会の項目をどの名前と結合していいかわからなくなってしまうからです。
例えば「図書委員」と言っても、所属委員会テーブルからすると「石井さん」と結び付けていいのか、「神崎さん」と結び付けていいのかわかりません。
自分以外のテーブルに対する情報がないですからね。
そんな時に役に立つのが、両方のテーブルに共通している「出席番号」という項目なのです。
この項目のおかげで、図書委員は出席番号「1番」と結びつき、氏名も出席番号「1番」と結びつくので、
結果として正しく「石井」さんと「図書委員」を結合することができるのです。
抽出のSQL文(select文)
さて、ここまでデータの抽出についてお話ししてきましたが、
実際に抽出や結合を行うためにはSQLという言語を使ってコードを書かなければいけません。
ちょっとエンジニアっぽい内容になり、最初は抵抗があるかもしれませんね。
でも大丈夫!一問ずつ練習問題を入れていくので、確認しながら進めていきましょう!
それに、実はこのSQLですが、実務でもとてもよく使う内容になります。
なので、ここで理解しておくと後々楽になりますよ!
一つの項目を抽出するselect文
さて、まず初めは基本から行きましょう。
SQLの構文は、以下のようになっています。
始めて見る方も多いと思いますので、順番に解説していきます。
・select
最初のselectは、「抽出する」という意味で使われます。
基本情報技術者試験で学ぶ内容は、大体最初にこの「select」がついているので、お決まりの文言だと思ってください。
・項目名
次に来る「項目名」には、文字通り抽出したい項目の名前を入れます。
例えば先ほどの表で「名字」の列だけを抽出したいとき、その「名字」を入れます。
・from
このfromもお決まりだと思ってください。
意味は中学校で学んだ通り「~から」という意味なので、データを抽出するテーブル名の前に入れてください。
・テーブル名
最後の「テーブル名」は、取り出したい項目名が入っているテーブル名を記載してください。
以上、1単語ごとに説明してきましたが、ばらけさせてみると単語も簡単ですよね。
SQLで構文を書くときは、「どの項目をどのテーブルから抽出するか」という順番で書けばいいのです。
そのため、例えば先ほどの表で「得意科目」を抽出したいときは、以下のようになります。
仕組みが分かれば簡単ですよね。
それでは、皆さんも一問解いてみてください。
練習問題1
問)上の「3組の生徒」のテーブルから部活動を抽出するSQLを答えてください。
答)select 部活動 from 3組の生徒
特定の複数の項目を抽出するselect文
次は、二つ以上の項目を取得するSQLを考えてみましょう。
これは、取得する項目名を増やすだけで完成します。
こんな感じで、取得したい項目を「,」で区切って二つ記載すれば一緒に抽出してくれます。
この先増えても同じように「,」で区切れば問題なく取得できます。
それでは、先ほどの表から得意科目と苦手科目の二つの項目を取得するSQLはどうなるでしょうか。
こんな感じになりますね。
構文自体は抽出する項目が一つだった時とあまり変わらないですね。
練習問題2
問)先ほどの表から名字と性別を抽出するSQLを答えてください。
答)select 名字,性別 from 3組の生徒
すべての項目を取得するselect文
今まではいくつかの項目だけを取得してきましたが今度は全部の項目を取得する場合の紹介です。
そんな事必要なの?と思うかもしれませんが、テーブル内のデータを見たいときなどで使うので覚えておいてください。
テーブル内の項目を全部取得するためには、[項目名]のところに「*」を入れます。
使い方としては以下のようになりますね。
ちょっと違和感あるかもしれませんが、「*」を「すべての項目」と読み替えれば、
「○○テーブルから全ての項目を取得する」となり、感覚的に理解できるのではないでしょうか。
練習問題3
問)「3組の生徒」テーブルから全ての項目を抽出するSQLを答えてください。
答)select * from 3組の生徒
条件付き抽出のSQL文(select ~ where文)
条件が一つの時のwhere文
次は、抽出するときに条件を指定する場合の書き方を学んでいきましょう!
例えば、「性別が男の人のすべての項目を取得する」という場合について考えてみましょう。
すべての項目だけであれば、先ほど学んだ通り「*」で取得できます。
しかし今回は、「性別が男の」という条件が付いています。
このように抽出に条件を付けたいときに使うのがwhereです。
whereを使うときの構文は以下になっています。
where文以下は、「どの項目がどの値の時にデータを抽出するか」の条件を記載します。
ポイントは記載する場所です。
where文を使うときは必ずselect文の後ろにくっつけて使うので、記載する場所を間違えないようにしてくださいね。
これをもとに先ほどの「性別が男の生徒のすべての項目を取得する」を記載するとこのようになります。
今回の条件は、「性別が男の生徒」だったので、性別 = ‘男’という条件が入っています。
このように条件が入るときは、「『項目名』が『どんな値か』」を記載します。
文字列の時は「’」で囲むことも覚えておいてくださいね。
練習問題4
3組の生徒テーブルから、得意科目が国語の生徒の全部のデータを抽出してください。
答)select * from 3組の生徒 where 得意項目 = ‘国語’
どちらか一方でも条件を満たす場合のwhere文(OR)
次に考えるのは、条件Aまたは条件Bのどちらか一方でも満たすデータを抽出したい場合です。
例えば、「部活動が卓球部か野球部の生徒のデータを抽出したい」というときを考えてみましょう。
この条件を分割すると、「部活動が卓球部」か、「部活動が野球部」と、条件が二つ組み込まれていることが分かるでしょう。
このように条件が二つ以上あるときは、「OR]か「AND」を使うと条件を追加できます。
それぞれ以下のような意味があります。
上のように、「OR」は条件のどちらか片方でも満たしていればOK,
対して「AND」は条件をすべて満たしていればOKとなっています。
言い換えると、ORは「または」、ANDは「かつ」という意味になります。
今回は、野球部または卓球部に入部している生徒のデータが欲しいので、「OR」を使うといいでしょう。
ORを使って先ほどの抽出条件を記載すると以下のようになります。
こんな感じに条件をORで結ぶことで、複数の条件のうちどれか一つを満たしているデータを抽出できます。
練習問題5
問)3組の生徒のデータから、苦手科目が数学か社会科の生徒の全項目を抽出してください。
答)select * from 3組の生徒 where 苦手科目 = ‘数学’ or 苦手科目 = ‘社会科’
複数の条件をすべて満たす場合のwhere文(AND)
さて、最後に学ぶのは複数の条件をすべて満たすデータを抽出する場合です。
例えば、「部活動が卓球部かつ性別が女の人のデータを抽出したい」というときを考えてみましょう。
これをばらばらにすると「部活動が卓球部」かつ「性別が女」となり、両方の条件を満たしているデータを取得したいということになります。
そんな時に使えるのが先ほども出てきた「AND」です。
この「AND」を使えば、条件Aと条件Bの両方を満たしているデータだけを取得することができます。
書き方は先ほどの「OR」と全く同じで、「AND」に変えるだけです、
ANDを使って先ほどの抽出条件を記載すると以下のようになります。
このように、使い方は「OR」と全く一緒ですが、「AND」を使うことですべての条件を満たすデータを取得することができます。
練習問題6
問)3組の生徒テーブルから、得意科目が国語で苦手科目が理科の生徒のすべての項目を抽出してください。
答)select * from 3組の生徒 where 得意科目 = ‘国語’ and 苦手科目 = ‘理科’
まとめ
いかがだったでしょうか。
SQLの構文という、少し慣れないものだったかもしれませんが、なんとなく理解できましたでしょうか。
正直私はこの分野を捨て問にしていたのであまり偉そうには言えませんが、理解してしまえば単純な構文だと思いますので、絶対に捨て問にしないでくださいね(笑)
次回は、結合をする場合のSQLについて解説していきますので、是非見てみてください!