第13回の目標:プログラミングを通してデータベースについて理解を深める。
データベース(DataBase,DB)とはデータを構造化して蓄積し、利用しやすいようにするものである。2025年時点では関係データベース(Relational DataBase,RDB)が多く使われている。以降はRDBの説明である。
| 生徒ID | 氏名 | 住所 |
| 1001 | A子 | MM町 |
| 1002 | B子 | NN町 |
| 1003 | C子 | OO町 |
RDBではエクセルの表のようなデータを扱う。表をテーブルという。普通データベースはいくつものテーブルを持つ。
| 生徒ID | 氏名 | 住所 |
| 1001 | A子 | MM町 |
| 1002 | B子 | NN町 |
| 1003 | C子 | OO町 |
表の列をカラムやフィールドという。この講座ではカラムと呼ぶことにする。通常、カラムごとに数値のデータが格納されるとか、文字列のデータが格納されるなどのデータの型が決まっている。
| 生徒ID | 氏名 | 住所 |
| 1001 | A子 | MM町 |
| 1002 | B子 | NN町 |
| 1003 | C子 | OO町 |
テーブルにおける行をレコードやロウという。この講座ではレコードと呼ぶことにする。エクセル等の表計算ソフトではせいぜい数千行のデータを扱うが、データベースではそれより多くのデータを扱うことができる。
| 生徒ID | 氏名 | 住所 |
| 1001 | A子 | MM町 |
| 1002 | B子 | NN町 |
| 1003 | C子 | OO町 |
フィールドという用語には少々注意が必要で、2-2の意味で(つまりカラムと同じ意味で)フィールドということもあれば、表における一つのセルの値を指すこともある。
DBが倉庫だとすると、倉庫を管理する存在としてデータベースマネージメントシステム(DBMS)がある。DBMSがデータを操作する機能を提供しており、データを操作する命令を記述する言語はSQL(Structured Query Language)とよばれる。
他にも、例えばAさんがBさんにお金を1000円振り込むとする。Aさんの口座から1000円を引く操作とBさんの口座に1000円を足す操作はかならずセットで行われなければならないことが分かるだろう。このように操作のかたまりを決めて、それが全部行われる(またはエラー時にはまったく行われない)ようにするような気の利いた機能などをDBMSは持っている。が、この講座では詳しく触れない。
SQLはDBMSに「こういうデータが欲しい」「このデータを追加して」と命令するための言語である。DBMSに対する命令をクエリということもある。
SQLの文法はこれまで学んできたjavascriptとは別である。新たな言語を覚えるのを大変に感じる人もいるかもしれないが、SQLの文法は簡単であるので心配はいらない。
SQLは大文字と小文字を区別しないが、SQLのキーワードは大文字、テーブル名やカラム名は小文字で書くのが慣例である。
また、あるレコードのあるカラムに値が設定されていない場合、NULLという特別な値になる。値が設定されていないという意味の値である。
まずはデータベースからデータを取り出すため命令を扱う。
SELECT * FROM students;
上記はstudentsテーブルの全てのレコードを取得する命令である。*はすべてのカラムを表す。セミコロン(;)は、命令の終わりを示す。
例題1 studentsテーブルの全てのレコードを取得せよ。
SELECT studentID, name FROM students;
SELECT文ではすべてのカラムを取得しなくともよい。上記でstudentsテーブルのstudentIDとnameのカラムを取得することができる。
例題2 studentsテーブルのstudentID, name, addressのカラムを取得せよ。
SELECT * FROM students WHERE address = 'HH町';
SELECT文ではすべてのレコードを取得しなくともよい。上記でstudentsテーブルのaddressが HH町 であるデータを取得できる。
文法としてはWHERE 絞り込み条件である。
SQLにおいて、等しいは=である。文字列はシングルクオーテーション(')で挟む必要がある。数値はシングルクオーテーション(')で挟まない。使える比較演算子をいくつか示す。
| 比較演算子 | 意味 |
| A=B | AとBが等しい |
| A<>B | AとBが等しくない |
| A>B | AがBより大きい |
| A>=B | AがB以上である |
| A<B | AがBより小さい |
| A<=B | AがB以下である |
| A BETWEEN B AND C | AがBとCの間にある(境界は含む) |
| A IS NULL | AがNULLである |
例題3 studentsテーブルのすべてのカラムをweightが55以上のもののみ取得せよ。
例題4 studentsテーブルのstudentID, name, heightをheightが150から160までのもののみ取得せよ。
WHERE節では複数の条件を指定することもできる。
SELECT * FROM students WHERE height >= 160 AND weight >= 60;
上記でheightが160以上でかつweightが60以上のレコードを取得することができる。
この例のANDのようなものを論理演算子というが、ANDのほか、OR、NOTも使える。
例題5 studentsテーブルのstudentID,name,addressをaddressが HH町 かまたは II町 であるもののみ取得せよ。
これまでは1つのテーブルからデータを取り出してきた。一方、実際の運用では複数のテーブルにまたがった情報が必要になることがある。
そんなときは共通のキーを基にテーブルを結合し、一つの大きなテーブルのように扱ってデータを抽出するJOIN(結合)という機能を使う。JOINにはINNER JOINとOUTER JOINがある。
INNER JOINは2つのテーブルを結合するが、キーが両方のテーブルに存在するデータたちのみ取得する。
SELECT students.name, club.clubname FROM students JOIN club ON students.clubID = club.clubID;
文法としてはFROM students JOIN club ON 結合の条件となっているところに注意せよ。
そして取得する内容や結合の条件を記述する際に、カラム名を指定するにはテーブル名.カラム名のように、ドット(.)でつないで書くことにも注意せよ。
この例では、studentsとclubという2つのテーブルを結合している。結合するときキーになっているのがclubIDカラムである。studentsテーブルにも、clubテーブルにもclubIDカラムがある。それらが値を持ち、さらに等しいデータのみが取得される。
この方法だとstudentsの全員は表示されない。studentsテーブルの何人かはclubIDを持っていない(NULL)からである。
例題6 studentsテーブルとclubテーブルをclubIDをキーにINNER JOINせよ。
INNER JOINは両方のテーブルにキーが存在するデータたちのみ取得する方法であった。つまりINNER JOINで2つのテーブルを結合すると、どちらのテーブルのデータも欠ける可能性がある。
これに対して、片方のテーブルを優先し、優先するテーブルのレコードはすべて含まれるようにする結合方法をOUTER JOINという。キーが無い部分はNULLとなる。
SELECT students.name, club.clubname FROM students LEFT JOIN club ON students.clubID = club.clubID;
文法としてはFROM students LEFT JOIN club ON 結合の条件である。文法はINNER JOINとよく似ていて、LEFTが増えただけである。
この方法だと、studentsの全員が表示され、clubIDを持っていないもののclubnameはNULLになる。
例題7 studentsテーブルとclubテーブルをclubIDをキーにLEFT OUTER JOINせよ。
JOINとWHERE節は併用できる。WHERE節はJOIN節の後に書く。
SELECT * FROM students JOIN club ON students.clubID = club.clubID WHERE club.clubID = 1;
例題8 studentsテーブルとclubテーブルをclubIDをキーにINNER JOINし、さらにclubIDが3のもののみ取得せよ。
取得するレコードたちを並び変えることもできる。
SELECT * FROM students ORDER BY height ASC;
この例では、studentsテーブルのデータたちをheightの順に(小さいほうから大きいほうへ)並べて取得する。
文法としては、ORDER BY カラム名 ASC(またはDESC)であることに注意せよ。またWHERE節がある場合は、ORDER BY節はその後に書く。
大きいほうから小さいほうへ並べるためにはASCの代わりにDESCと書く。ASC、DESCの記載は省略してもよいがその場合はASCとして扱われる。
OERDER BYの後に、コンマ(,)でつなげて複数のカラム名を書くと、書いた順に優先されて、複数の条件で並び変えることができる。まず優先度の高いカラムの値で並べ、その値が等しいときのみ優先度の低いカラムの順で並べる方式である。
例題9 studentsテーブルのデータをweightの大きい順に取得せよ。
例題10 compositionテーブルには、studentIDカラム、nendoカラム(年度)、gakunenカラム(学年)、classカラム(組)、bangouカラム(出席番号)がある。すべてのカラムは数値型である。例題1などで用いたstudentsテーブルとcompositionテーブルを用いて、2025年度の名簿を表示せよ。名簿には、学年、組、出席番号、氏名が表示されるようにせよ。
ここまでSQLで最もよく使われる、データを取得する機能であるSELECT文を扱った。SELECT文には、ここで紹介した他にも合計、平均を算出する機能などがある。
SQLにはSELECT文の他にも、テーブルにレコードを追加するINSERT文、テーブルからレコードを削除するDELETE文、テーブルのレコードを更新するUPDATE文、テーブルを作成するCREATE文、テーブルを削除するDROP文などがある。