Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DBとSQLについて

 DBとSQLについて

社内勉強会資料です。
この資料は、データベース(DB)とSQLの基本を学ぶためのものです。初心者の方でも分かりやすいように、基本的な考え方から実際の操作方法までを順番に説明しています。

Transcript

  1. DBモデルの種類  データベースモデルには大きく分けて  「階層型」  「ネットワーク型」  「リレーショナル型」 

    「NoSQL」 があります。  その中で、現在最も一般的に使用されているのは「リ レーショナルデータベース」(Relational Database:RDB) です。
  2. RDB(リレーショナルデータベース)の特徴  特徴 リレーションと二次元の表の集合  リレーショナルデータベースでは、すべてのデータを表形式で 表現します。表は列と行で構成され、列は必ず1つの意味を 持ちます ID 部門名

    1 総務 2 経理 3 営業 ID 名前 生年月日 入社日 退職日 部門ID 1 佐藤 1994/03/03 2015/04/01 1 2 鈴木 1991/12/11 2012/04/01 1 3 田中 1979/01/01 2000/08/01 2010/07/31 2 リレーション(訳:関係、つながり) 部門 従業員
  3. RDB(リレーショナルデータベース)の特徴  Bad:1つの表に全てのデータを持ってくればよいのでは? 注文ID 顧客ID お届け先 請求額 1 100 福岡市◦◦

    300 注文ID 商品名 単価 数量 1 ジュース 100 1 1 菓子 100 1 1 チョコ 50 2 注文 注文明細 注文ID 顧客ID お届け先 請求額 商品名 単価 数量 1 100 福岡市◦◦ 300 ジュース 100 1 1 100 福岡市◦◦ 300 ジュース 100 1 1 100 福岡市◦◦ 300 チョコ 50 2 注文 ※統合することでデータ量が増えてしまった為、良くない(ディスク領域の無駄)
  4. 代表的なRDBMS(DB2)  Oracle同様に長い歴史がある  大規模システムなどで使われている商用のRDBMS  RDBを提唱したのはIBMだったが、商用としてリリースするの はOracleが先立った。  一昔前まではAS400などのオフコン上でしか動作しなかった

     2015年にIBMCloudで利用出来るようになった(DB2 on cloud) ⇒通常のクラウドと一緒でハード面での心配もいらない。 ⇒IBMCloud上で構築するので導入も画一化できるはず ⇒使いどころがいまいち分からない
  5. 代表的なRDBMS(MySQL)  OSSのDBの中では最も使われている代表的なRDBMS  サンマイクロシステムズに買収される⇒サンマイクロシス テムズがOracleに買収される  ライセンス元がOracle  ライセンスが曖昧

    ⇒商用全てがアウトという人もいれば、受託開発はセーフで第三者に頒布し なければ大丈夫という人もいる  よく似たMariadbというRDBMSも存在する(MySQLとあま り変わらない)
  6. テーブルのキー 【複合キー】 ⇒1つのフィールドではなく、2つ以上のフィールドの組み合わせで1つのレ コードを識別できる場合、そのフィールドを組み合わせて主キーとして使 用できる。これを複合キーと呼ぶ。 社員名 生年月日 出身地 山田太郎 2000/4/15福岡

    山田花子 2012/12/1福岡 山田太郎 2002/6/25福岡 山田次郎 2015/4/15福岡 複合キー 社員名だけの指定では、同姓 同名がいるため一意のレコード が識別できない。そのため、社 員名と生年月日を複合キーとし て定義している。
  7. フィールドの制約、データ型 フィールド制約 ⇒フィールドに設定できる値に制限を設ける。 制約 説明 NOT NULL NULLを設定できなくする UNIQUE 同じ値を設定できなくする

    DEFAULT 値が設定されないときに、指定した値を初期値とする PRIMARY KEY 主キーとする(主キー制約) FOREIGN KEY 外部キーとする(外部キー制約) 主キー制約…一意である。NULLを許容しない。 外部キー制約…参照先のカラムにある値しか設定できなくなる。
  8. トランザクション  例) ある工場では、データベース内の在庫表と注文表を使用して、製品 の受発注を管理しています。  新たに、「2008年5月6日にD社から製品Aについて50個の注文があり販 売した」としたら、在庫表と注文表はSQLで以下のように変更します 処理の流れ 1.トランザクション開始(BeginTransaction)

    2.注文表に行を追加(INSERT) 3.在庫表の行を変更(UPDATE) 4.トランザクションコミット(CommitTransaction) トランザクション処理の重要性 ・3.の在庫表をUPDATEしているときに停電してしまっ た。 ・このとき、データベースを再起動して、2.の注文表の INSERTだけDBに反映されてしまっていたらまずい。 (中途半端な状態だから) ・そのような状態にならないために、トランザクション 処理が必要になってくる (コミットしないとDBに反映されないため中途半端な DBのデータができない)
  9. CREATE(テーブル作成)  テーブル作成するときは、CREATE文を使用します。  例) CREATE TABLE KT_EMP ( EMP_NO

    VARCHAR(4) NOT NULL DEFAULT '' ,EMP_NM VARCHAR(40) NOT NULL DEFAULT ‘’ ,BIRTH_DT SMALLINT NOT NULL DEFAULT 0 ,SEX_FLG VARCHAR(6) NOT NULL DEFAULT '‘ ,ENTRY_DT INT NOT NULL DEFAULT 0 ,RETIRE_DT SMALLINT NOT NULL DEFAULT 0 , DELETE_FLG SMALLINT NOT NULL DEFAULT 0 ,PRIMARY KEY(EMP_NO) ); テーブル名 列名 データ型 制約 主キー定義
  10. ALTER(テーブル列操作)  テーブルの列の変更、削除、追加などを行うときは、ALTER文を使用します。  列 変更 書き方) ALTER TABLE テーブル名

    ALTER COLUMN 列名 データ型 制約  列 削除 書き方) ALTER TABLE テーブル名 DROP COLUMN 列名  列 追加 書き方) ALTER TABLE テーブル名 ADD COLUMN 列名 データ型 制約
  11. 列と表の指定(SELECT FROM) 以下のような成績表テーブルがある。 学生番号 氏名 クラス 国語 数学 英語 11001山田

    太郎 A組 65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作1.出席番号と氏名を取り出す SELECT 学生番号, 氏名 FROM 成績表 学生番号 氏名 11001山田 太郎 11002田中 次郎 11003中村 花子 11004村山 三郎 ・取得したい列名を書く ・複数ある場合は「,」区切りで書く ・テーブル名
  12. 列と表の指定(SELECT FROM) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎

    A組 65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作2.すべての成績(すべてのデータ)を取り出す SELECT * FROM 成績表 ・テーブルのすべての列がほしい 場合は「*」を使用する 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎 A組 65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53
  13. 列と表の指定(SELECT FROM) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎

    A組 65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作3.学籍番号と合計点(国語と数学と英語の和)を取り出す SELECT 学生番号,(国語 + 数学 + 英語) AS 合計点 FROM 成績表 学生番号 合計点 11001 179 11002 244 11003 218 11004 201 ・数値ならば「列名 + 列名」で和を出力することができる ・「AS 新列名」で、新列名としてデータを取得することができる
  14. 条件の指定(WHERE) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎 A組

    65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作4.B組の学生の国語の点を取り出す SELECT 学生番号,氏名,国語 FROM 成績表 WHERE クラス = ‘B組’ ・WHERE句に条件を指定する ・文字列を指定する場合は、「’」で囲む 学生番号 氏名 国語 11004村山 三郎 60
  15. 条件の指定(WHERE) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎 A組

    65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作5.国語と英語がともに70点以上を取り出す SELECT 学生番号,氏名 FROM 成績表 WHERE 国語 >= 70 AND 英語 >= 70 ・条件には、「=,>=,>,<=,<,!=,<>」を指定することができる ・複数の条件をANDまたはORで結びつけることができる 学生番号 氏名 11002田中 次郎 11003中村 花子
  16. ソートの指定(ORDER BY) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎

    A組 65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作6.A組の学生の国語の点が高い順に学生番号と氏名を取り出す SELECT 学生番号,氏名 FROM 成績表 WHERE クラス = ‘A組’ ORDER BY 国語 DESC ・ORDER BY句に並び替えに使用する列を書く。 ・複数の列を指定した場合は、先に指定した列から順に並び替えを判断する ・列の後ろに「ASC」で昇順、「DESC」で降順を指定できる(何も付けないと昇順) 学生番号 氏名 11003中村 花子 11002田中 次郎 11001山田 太郎
  17. 関数の指定(SUM,AVG,MAX,MIN,COUNT) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎 A組

    65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作7.成績表の学生人数を取り出す SELECT COUNT(*) AS 人数 FROM 成績表 ・COUNT(*)で該当する行の件数を取得することができる 人数 4
  18. 関数の指定(SUM,AVG,MAX,MIN,COUNT) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎 A組

    65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作8.国語の平均点を取り出す SELECT AVG(国語) AS 国語平均 FROM 成績表 ・AVG(列名)で列名の平均値を取得することができる ・他にもSUM(列名)で合計。MAX(列名)で最大値。MIN(列名)で最小値を取得す ることができる 国語平均 73.5
  19. グループ化(GROUP BY) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎

    A組 65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作9.成績表のクラス毎の学生人数を取り出す SELECT クラス, COUNT(*) AS 人数 FROM 成績表 GROUP BY クラス ・GROUP BY句に書いた列名で、同一の値を持つ行のグループができる。 ・グループ化した列と、関数以外の列はSELECT句で指定できない クラス 人数 A組 3 B組 1
  20. グループ化(GROUP BY) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎

    A組 65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作10.国語の平均点が70以下のクラスを取り出す SELECT クラス FROM 成績表 GROUP BY クラス HAVING AVG(国語) <= 70 ・グループを条件で絞り込むならば、HAVING句を使用する。 クラス B組
  21. 条件指定に関する応用(BETWEEN) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎 A組

    65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作11.英語が70点以上80点未満の学生を取り出す SELECT 学籍番号, 氏名 FROM 成績表 WHERE 英語 BETWEEN 70 AND 79 ・BETWEEN 下限値 AND 上限値 という形式で下限値から上限値の範囲を指 定できる(下限値、上限値は範囲に含まれる) 学生番号 氏名 11001山田 太郎 11003中村 花子
  22. 条件指定に関する応用(LIKE) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎 A組

    65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作12.名前に山を含む学生の氏名を取り出す SELECT 学籍番号, 氏名 FROM 成績表 WHERE 氏名 LIKE ‘%山%’ ・列名 LIKE ‘文字列パターン’で、特定の文字列を含むという条件にできる ・文字列パターンは、例えばABCという文字を含むという指定にしたい場合は、 %ABC%のように記述し、ABCから始まる文字列の場合には、ABC%にする 学生番号 氏名 11001山田 太郎 11004村山 三郎
  23. その他の条件指定(IN,IS NULL) IN句 ⇒列名 IN (値1、値2、値3・・・)のように記述する。 ⇒値1、値2、値3のいずれかの値に一致するものを取得する。 ⇒列名 = 値1

    OR 列名 = 値2 OR 列名 = 値3 と同じ意味 IS NULL ⇒列名 IS NULL のように記述する。 ⇒NULL値であるものを取得する。 ⇒NULL値でないものを取得するにはIS NOT NULLと記述する。
  24. 重複の削除(DISTINCT) 学生番号 氏名 クラス 国語 数学 英語 11001山田 太郎 A組

    65 42 72 11002田中 次郎 A組 77 85 82 11003中村 花子 A組 92 48 78 11004村山 三郎 B組 60 88 53 成績表 操作13.クラスの一覧を取り出す SELECT DISTINCT クラス FROM 成績表 ・取り出した結果に重複がある場合に、重複を除き1つだけ取り出す場合には DISTINCTを使用する。 クラス A組 B組
  25. テーブルの結合  複数のテーブルを結合するときには、JOINで結合するこ とができる。  JOINの種類として主に ・INNER JOIN ・LEFT (OUTER)

    JOIN ・RIGHT (OUTER) JOIN の3つがある。 ※他(FULL JOIN,NATURAL JOIN,CROSS JOIN) ※DBによって異なる
  26. LEFT JOINとRIGHT JOIN (外部結合)  LEFT JOINとRIGHT JOINは、左右いずれかのテーブル を優先させたいときに指定する。 

    LEFT JOIN 左側に指定されたテーブルのすべての行が表示される  RIGHT JOIN 右側に指定されたテーブルのすべての行が表示される
  27. JOINの書き方  INNER JOIN FROM テーブルA INNER JOIN テーブルB ON

    テーブルA.カラム = テーブルB.カラム  LEFT JOIN FROM テーブルA LEFT JOIN テーブルB ON テーブルA.カラム = テーブルB.カラム 結合条件 結合条件
  28. INSERT (行の追加)  テーブルにデータを1行挿入するためのSQL文をINSERT文と呼ぶ。 一般形式) INSERT INTO テーブル名 VALUES(値リスト) ・値リストには、挿入するデータを列の順番にカンマで区切って指定する。

    ・値リストの値の数と、列の数は一致しなければならない 列指定形式) INSERT INTO テーブル名(列名リスト) VALUES(値リスト) ・列名リストには、値をセットしたい列名をカンマで区切って指定する。 ・値リストには、列名リストに列挙した列にセットする値を列名リストの順番にカンマで 区切って指定する。 ・値が指定されなかった列(列名リストにない列)は、列のデフォルト値が入る。
  29. UPDATE (行の更新)  テーブルにあるデータの、条件を満たす行の列を変更するた めのSQL文をUPDATE文と呼ぶ。 一般形式) UPDATE テーブル名 SET 列名

    = 値 WHERE 検索条件 ・SET句に変更する列名と値を指定する ・複数項目変更する場合は、カンマ区切りで指定する ・検索条件を省略した場合、すべての行の値が変更される。 ・検索条件がある場合は、その検索条件に一致する行のみが 変更される
  30. DELETE (行の削除)  テーブルにあるデータの、条件を満たす行を削除するた めのSQL文をDELETE文と呼ぶ。 一般形式) DELETE FROM テーブル名 WHERE

    検索条件 ・検索条件を満たす行をテーブルから削除する ・検索条件を省略した場合、テーブルのすべての行が削除 される
  31. 前準備  A5:SQL Mk-2を導入 → 汎用SQL開発ツール  DBの作成  DBのユーザー作成

     テーブルの作成  データの作成  A5:SQL Mk-2からDBへアクセス確認  テーブル定義書確認
  32. 実践問題 Q.35 2018/1~2019/4に注文されており、支払方法がクレジットの注文で、 以下の情報が乗っている注文明細一覧を取り出す 注文ヘッダID 注文日 顧客名前_姓 性別名 商品名 商品区分名

    メーカー名 単価(税抜) 数量 税込本体価格 取り出すデータの順序として、顧客名前_姓の昇順、注文日の昇順、商品名の昇順とする
  33. Q.SQLやりがちなミス 1.VARCHAR型とCHAR型の値の違い VARCHAR型 = 可変長 CHAR型 = 固定長 CHAR型は固定長のため、例えばCHAR(10)のカラムに、 ‘12345’という値を入れると’12345

    ’という風に10バイト になるように半角スペースが入る。そのため、SELECTで取得 した値には、半角スペースが入っていることに注意。 ※WHERE句で検索するときは、半角スペースは考慮する 必要はない
  34. Q. DBの種類ごとに注意点があれば知りたいで す。 いくつか種類ごとに違うところをご紹介 ・連番を振るフィールド制約 MySQL :AUTO_INCREMENT SQLServer :IDENTITY Oracle

    :存在しない。SEQUENCE,TRIGERを利用 ※Oracle 12 cからIDENTITYが使用できるようになった ・SELECTでのAS句 Oracleでは、テーブルのリネームにAS句は使用できない ・VIEW MySQLでは、VIEWにサブクエリが使用できない
  35. Q. DBの種類ごとに注意点があれば知りたいで す。 ・VARCHARの定義 VARCHAR(n) MySQL :nには文字数を指定する SQLServer :nにはバイト数を指定する Oracle

    : nにはバイト数を指定する ・NULLと空文字(‘’)の扱い MySQL :違うものとして扱う SQLServer :違うものとして扱う Oracle :どちらもNULLとして扱う などなど違いは、まだまだたくさんある。
  36. Q. SQLでデータ取得が遅いときの対処方法の考 え方。 ①SQL文をチューニングする 1.複雑なSQLの場合は、ボトルネックになっている箇所を特定する。 ⇒SQLの一部のみ実行していって、この部分を追加したら遅くなるというところを 特定 2.INNER JOIN と

    LEFT JOIN どちらでもいい結合の場合は、LEFT JOINに変更 ⇒絶対ではない 3.結合前にデータを絞りこむ ⇒結合後にWHERE句で絞り込んでいる場合、結合するときに無駄なデータに結 合していることになる(取得不要のデータにまで結合をしている)ので、無駄な 時間が掛ってしまう。そのため、サブクエリで結合前に絞り込んで、結合する と早くなることがある。
  37. Q. SQLでデータ取得が遅いときの対処方法の考 え方。 ②INDEXを張る 1.ボトルネックになっているテーブルに対して、INDEXを張る。検索キーになっている 項目に対して張る。 ⇒抽出条件の指定の仕方によっては、インデックスが利かないので注意 ・抽出項目にTRIMなどの命令を使ったあとに条件指定 ・インデックスに登録した項目の順番どおりに条件指定しないなど ③DBのスペックを上げる(かなりの効果が期待できる)

    1.サーバ自体のスペックを上げる ⇒月額料金が変わる場合があるので最終手段(顧客に要相談) 2.DBサーバが使用するメモリの使用量の限界を引き上げる ⇒他の箇所に影響が出ないように気をつける(DBサーバとWebサーバが同一サー バ上にいる場合などは特に気を使うこと) ④テーブル構成自体を変える 1.設計からダメだったってことで、テーブル構成を変える。 ⇒プロジェクト序盤ぐらいでしか出来ない。基本的には①~③で解決させる。