見出し画像

【高校情報1】リレーショナルデータベースとSQLをORACLEクラウド(ADW)を使って実践演習してみた

◆◆はじめに◆◆

文部科学省:高等学校情報科「情報1」教員研修用教材  
第4章 情報通信ネットワークとデータ活用
 学習21 リレーショナルデータベースとSQL(抜粋)

リレーショナルデータベースとSQLだけで入門書籍1冊は書ける内容ですが、研修用教材は、たった1ページなので、
「データベースとは何か?」から独自に基礎から解説しました。

研修用教材はAccessを使っていましたが、
システム業界の立場的には・・

①「AccessでSQLの勉強をしました!」
   →採用担当「えっ!用途違うんじゃない?」
(Accessって、SQL使えない人が、画面操作で表を作るもので裏で独自にSQL生成してくれるもの)

②「PostgreSQL/MySQLでSQLの勉強をしました!」
  →採用担当「ふ~ん」(普通にありえること&それくらいは独自に勉強してきてほしい)

③「ORACLE CLOUDのADWを使ってSQLの勉強をしました!」
  →採用担当「まじで!?すげ~」(ORACLEというだけでネームバリューがある+後発型クラウド)

で、実際の難易度は③(ORACLEクラウド)が一番簡単なのです!

以前の動画でORACLE CLOUDの初期構築方法について解説済みです。

本当に数十分でクラウド上にORACLEデータベースが無料で作れてしまいます。
社内でORACLEクラウドを導入しようとなったときに、日本オラクル社のコンサル方が来てくれて、私に数日間ほぼマンツーマンで教えてくれたノウハウの一部を公開しています。
※オールウェイズフリー(無料)でもクレジットカード情報は必要なので、学校で使うとした場合先生とかだれか1名が登録して、そのデータベースをみんなで使うという感じですかね。
  →ORACLE社の方、もし認識違ったらコメント頂けると嬉しいです。

自分自身の備忘メモを動画にした感じですが、
日本オラクル社の社長も見て、大変喜んでくれたらしく、日本オラクル 社内だけでなく、取引先まで拡散してくれたという嬉しいことがありました。

そのおかげで、ちょっと申し訳ないですが、本家が出しているORACLE CLOUDの説明動画より私の動画の方が再生数かなり上回って、「ORACLEクラウド」のキーワードでトップに出るようになりました。

ORALCE CLOUD(特にデータベースサービスのADW)は凄く良いので
高校情報Ⅰ対策としての教材で使わせてもらいました

それにしても、プログラミング学習に加えて、リレーショナルデータベース、SQLも高校で学ぶとなったら、授業進行すごく考えないと、半端ない学力格差(大学入学共通テストでの得点差)が生まれると思いました。

◆◆動画解説◆◆

情報Ⅰ共通テスト対策 書籍出版します!


◆◆文字おこし◆◆

今日は、リレーショナルデータベースについてデータベース関連ではトップシェアを誇るオラクル社が出しているOracleクラウドを使ってSQLの勉強をしていこう。

まずは、データベースについて説明していくね。

画像1

データベースとは、集めたデータを、検索や追加などが簡単にできるように整理したものなんだ。

データベースの種類に
 リレーショナルデータベース
 階層型データベース
 ネットワーク型データベースなどがある

今回は、世の中で多く使われているリレーショナルデータベースについて説明するね。


リレーショナルデータベースの特徴はデータを表形式で管理すること。
こんな感じで、エクセルの表と見た目は同じ感じになる。

画像2

リレーショナルデータベースは、この列や行を指定したり、表と表をつなぎ合わせたりしながらデータの検索ができる。

そして、SQLと呼ばれる、言語を使って、データの登録・検索・更新・削除をすることができる。
そして、データを格納する表を作るときにもこのSQLが使われる。

SQLはStructured Query Languageの略で、1970年代に開発されたデータベース言語なんだ。
見た目は英数文字でプログラム言語の様に思えるかもしれないけど、プログラム言語ではないよ。
でも、一般的なプログラム開発では、色んなデータはデータベースに格納するから、プログラミングをする上ではデータベースは切っても切れない関係にある。

画像3


この、リレーショナルデータベースの世界では、表のことを、テーブルという。そして、行のことをレコード、列のことをカラムというんだ。
そして、レコードの中にあるひとつの要素にあたる「入力項目」をフィールドという

今回は、「書籍」というテーブルと「作者」というテーブルを使って説明するね。

あれ?なんでわざわざ2つに分けているの?
一つのテーブルでもいいと思うけど。

いい質問だね。
作者名を書籍テーブルに持ってきて考えてみよう。

画像4


一見問題なさそうに見えるけど、仮に作者名が夏目漱石から秋目漱石に変わったとしよう。
1つの表の場合、いくつも夏目漱石がいたら、修正漏れがおこって、データが不整合になる可能性がある。

画像5


ただ、このようにIDをキーとしてテーブルを分割している場合は、作者テーブルの1か所だけ直せば不整合が起こらない。
このようなテーブル設計の工夫を,テーブルの正規化という

画像6


このテーブルを操作する方法として「選択」・「射影」・「結合」という関係演算を用いて処理することが多い。
選択はテーブルから条件を満たすレコードを抽出する操作で,
たとえば、書籍テーブルから作者ID が1001を取り出しなさいというSQLの命令文を書けばそのレコードが抽出される。

射影はテーブルから一部のカラムを取り出す操作で、例えば
書籍テーブルから「書籍名」のカラムを抜き出しなさいというSQLの命令文を書けば、そのカラムが抽出される。

結合は、複数のテーブルを1つのテーブルにする操作で、
例えば、書籍テーブルと作者テーブルを作者IDをキーに結合すると、このような感じになる。

この、選択、射影、結合はお互いを組み合わせて使う場合が多い。

このリレーショナルデータベースを管理するためのソフトウェアを
リレーショナルデータベース管理システムと言って、略してRDBMSという。

画像7

これは、データベースの人気ランキングを表しているけど
OracleとMySQLが人気だということが分かる。
MySQLもOracle社の製品だから、国内のデータベースシェアはOracle社の製品が多くの割合を占めていることが分かる。

MySQLは無料で手に入って、ORACLEは高機能で高額なイメージが強いけど、
最近ORACLE社が発表したオラクルクラウドのオールウェイズフリーのサービスを使えば、クラウド上にあるORACLEのデータベースを無料で使うことができる。
1つのデータベースをみんなで共有することも可能だから、1アカウントあれば複数人で演習することも可能なんだ。


以前の動画で、ORACLEクラウド上に10分足らずでデータベース構築する方法を纏めているから、今日はその方法で、すでに環境を作ってあるところから説明するね。
さっきの、書籍と作者のテーブルを作るためのSQLは概要欄にある、noteブログを参照してね。(一番下に記載)

テーブル名やカラム名は、基本的には日本語ではなく英数文字を使うけど
今回は分かりやすさを重視するために日本語を使うね。

さっき説明した、選択、射影、結合を実際のSQLで実行していこう。

画像8

書籍のテーブルから作者IDが1001であるレコードを抽出する、選択のSQLについて
はじめのSELECTは「どの列(カラム)のデータを検索するか」を指定する
 アスタリスクの場合はすべての列を抽出しなさいってこと。
FROMは「どの表から検索するか」を指定する 今回は書籍テーブルから抽出する。
WHEREは「どのような条件でレコードを検索するか」を指定する 今回は 作者IDが1001のものということになる。
最後にSQL文の終わりを意味するセミコロンを付ける

実行してみようちゃんと作者IDが1001のものが抽出されたね。

画像9

書籍名のカラムのみを抽出していこう。特定カラムの抜き出しは射影だったね。
さっきはSELECT アスタリスクだったけど、今度は SELECTの後に、抽出したいカラム名を記述している。
実行してみよう。
ちゃんと書籍名のカラムだけが抽出されたね。

画像10

次に 書籍テーブルと作者テーブルを作者IDが等しいレコードを結合しよう

SQLは内部結合というものを使う。
FROM の後のテーブル名までは一緒だけど、 その後にINNER JOIN と記述しその後に結合したいテーブル名を記述し ON の後に お互いのテーブルを紐づけるための条件を入れる
SELECT (取得するカラム) FROM テーブル名1
INNER JOIN テーブル名2 ON (結合条件);

今回は 書籍テーブルの作者IDと作者テーブルの作者IDを結合条件にするから
ONの後に 書籍.作者ID = 作者.作者IDと記述する。

実行してみよう。
ちゃんと2つのテーブルが結合されたね。

画像11

次は書籍テーブルに書籍IDが7の新しいレコードを追加していこう
INSERT INTO の後にテーブル名 かっこの中にカラムをカンマ区切りで記述する
そして実際に挿入する値はVALUESの後にカンマ区切りで記述する。文字列はシングルコーテーションで囲むことを忘れないようにしよう。
実行してみよう。
一応挿入はされているようだけど、これは未だ仮確定状態で他の人からは未だ存在しないレコードになっている。
確定するためにはCOMMIT;と記述して実行する。

画像12

最後に書籍テーブルから書籍IDが7のレコードを削除しよう。
DELETE FROMの後にテーブル名を記述し、WHEREの後に削除するレコードの条件を記述する
今回は書籍IDが7のレコードを指定する
実行してみよう。
再度検索すると、レコードが消えたことが分かるね。
これも確定するためにはCOMMIT;を忘れないようにしよう。

今回のリレーショナルデータベースやSQLについて覚えることは沢山あったと思うけど、
SQLは比較的簡単な言語だから基礎をしっかり把握しておこう。

初期セットアップSQL※ORACLE用

◆ORACLEのSQLです◆
■書籍テーブルの作成■
CREATE TABLE "書籍"
("書籍ID" varchar2(10),
"書籍名" varchar2(255),
"作者ID" varchar2(10));

■作者テーブルの作成■
CREATE TABLE "作者"
("作者ID" varchar2(10),
"作者名" varchar2(255));

■書籍テーブル初期セットアップ■
INSERT INTO  "書籍" ("書籍ID", "書籍名", "作者ID") 
VALUES(1,'羅生門',1001);
INSERT INTO  "書籍" ("書籍ID", "書籍名", "作者ID") 
VALUES(2,'こころ',1002);
INSERT INTO  "書籍" ("書籍ID", "書籍名", "作者ID") 
VALUES(3,'坊ちゃん',1002);
INSERT INTO  "書籍" ("書籍ID", "書籍名", "作者ID") 
VALUES(4,'鼻',1001);
INSERT INTO  "書籍" ("書籍ID", "書籍名", "作者ID") 
VALUES(5,'舞姫',1003);
INSERT INTO  "書籍" ("書籍ID", "書籍名", "作者ID") 
VALUES(6,'吾輩は猫である',1002);

■作者テーブル初期セットアップ■
INSERT INTO "作者" ("作者ID", "作者名") VALUES ('1001', '芥川龍之介');
INSERT INTO "作者" ("作者ID", "作者名") VALUES ('1002', '夏目漱石');
INSERT INTO "作者" ("作者ID", "作者名") VALUES ('1003', '森鴎外');





この記事が気に入ったらサポートをしてみませんか?