よっぴブログ

【技術書メモ4】SQL ゼロからはじめるデータベース操作

f:id:yoppi-y:20190422223412p:plain

 
技術書メモ4冊目!
仕事でSQLのタスクをいただいたので、この本を読んで得た知識で精一杯頑張るぞ!
 

 

第1章 データベースとは何か

 
DBMSには5つの種類がある
・階層型データベース
・リレーショナルデータベース(RDB)⇨ MySQLPostgreSQLなど
オブジェクト指向データベース(OODB
XMLデータベース(XMLDB
キューバリュー型データストア(KVS)⇨キーと値の組合せだけの単純な形でデータを保存する
 
SQLの基本的な記述ルール
SQL文の最後に「 ; 」をつける
・大文字、小文字は区別されない
・文字列と日付の定数はシングルクォーテーションで囲む
・数値の定数は囲まない
・単語の間を半角スペース、または改行で区切る
 
データベースを作成する
CREATE DATABASE <データベース名>;
 
テーブルを作成する
CREATE TABLE <テーブル名>;
(<列名1> <列名2> <列名3>,
<列名1> <列名2> <列名3>,
<列名1> <列名2> <列名3>,
     ・
     ・
     ・
<このテーブルの制約1>, <このテーブルの制約2>, ・・・・);
 
テーブルを削除する
DROP TABLE <テーブル名>;
※削除したテーブルは復活できないので注意
 
列を追加する
ALTER TABLE <テーブル名> ADD COLUMN <列の定義>;
 
 
基本的なデータ型
・INTEGER型
整数を入れる列に指定するデータ型(数値型)。小数は入れられない。
 
・CHAR型
文字列を入れる列に指定するデータ型。
CHAR(10)やCHAR(200)のように列の中に入れることのできる文字列の長さをカッコで指定する。
固定長文字列が格納される。固定長文字列とは、列に入れる文字列の長さが最大長に満たない時、文字列が最大になるまで空きを半角スペースで埋める。
 
・VARCHAR型
CHAR型と同じく文字列を入れる列に指定するデータ型。
可変長文字列が格納される。可変長文字列とは、文字数が最大長に満たない場合でも半角スペースで埋めたりしない。
 
・DATE型
日付を入れる列に指定するデータ型。
 

第2章 検索の基本

 
基本的なSELECT文
SELECT <列名>, ・・・・
 FROM<テーブル名>;
 
SELECT句にはテーブルから出力したい列の名前を書く
FROM句にはデータを取り出すテーブルの名前を書く
 
列に別名をつける
SELECT shohin_id         AS id,
SELECT shohin_mei      AS "商品名",
SELECT shiire_tanka     AS tanka
  FROM shohin;
 
WHERE句による行の選択
SELECT    <列名>, ・・・・
  FROM <テーブル名>
 WHERE  <条件式>;
 ※WHERE句は必ずFROM句の直後に書く
 
NULLである行を選択したいときは条件式にIS NULL演算子を使う。
NULLでない行を選択したいときはIS NOT NULL演算子を使う。
 
OR演算子よりAND演算子が優先される
ORを優先させたいときは、()を使用する。
 

第3章 集約と並べ替え

 
SQLの基本的な集約関数
・COUNT  テーブルのレコード数(行数)を数える
  COUNT(*)はNULLを含む行数を、COUNT(<列名>)はNULLを除外した行数を数える。
・SUM  テーブルの数値列のデータを合計する
AVG  テーブルの数値列のデータを平均する
・MAX  テーブルの任意の列のデータの最大値を求める
・MIN  テーブルの任意の列のデータの最小値を求める
 
グループ分けをする
GROUP BY句を使用する
ケーキを切り分けるようにテーブルをカットしてグループ分けする。
SELECT <列名1>, <列名2>, <列名3>, ・・・・
 FROM <テーブル名>
 GROUP BY <列名1>, <列名2>, <列名3>,・・・;
 
GROUP BY句を使うときはSELECT句に集約キー以外の列名を書けない。
 
句の記述順序
SELECT⇨FROM⇨WHERE⇨GROUP BY⇨HAVING⇨ORDER BY
実行順序
FROM⇨WHERE⇨GROUP BY⇨HAVING⇨SELEC⇨ORDER BY
 
集約関数を書けるのはSELECT句とHAVING句とORDER BY句だけ
 
集合に対する条件を指定できる句がHAVING句
HAVING句はGROUP BY句の後ろに置く
 
集約キーに対する条件はWHERE句に書く
WHERE句=行に対する条件指定
HAVING句=グループに対する条件指定
 
並び替えをするときはORDER BY句
ORDER BY句は常にSELECT文の最後尾に書く
昇順 ASC(何も書かなければ昇順になる)
降順 DESC
ソートキーにNULLが含まれていた場合、先頭か末尾にまとめられる
 

第4章 データの更新

 
テーブルにデータを挿入
INSERT分の使い方
INSERT INTO <テーブル名> (列1、列2、列3、・・・) VALUES (値1、値2、値3・・・);
 
データを削除
DELETEの使い方
DELETE FROM <テーブル名>;
 
データの更新
UPDATEの使い方
UPDATE<テーブル名>
  SET <列名> = <式>;
 
 
セットで実行されるべき1つ以上の更新処理の集まりのこと。
 
     DML構文①;
     DML構文②;
     DML構文③;
    ・
    ・
    ・
トランザクション終了文(COMMIT または ROLLBACK);
 
MySQLトランザクション開始文は START TRANSACTION
使うDBMSによって開始文は異なる
 
ACID特性
・原子性
 全て実行されるか全て実行されないかの状態で終わることを保証する性質のこと
・一貫性
 トランザクションに含まれる処理はデータベースにあらかじめ設定された制約を満たす性質
・独立性
 トランザクション同士が互いに干渉を受けない
・永続性
 トランザクションが終了したらその時点でのデータの状態が保存されることを保証する性質
 

第5章 複雑な問い合わせ

 
ビュー
テーブルが「実データ」を保存するのに対し、ビューはテーブルからデータを取り出す「SELECT文」を保存する。
 
ビューの作り方
CREATE VIEW ビュー名 (<ビューの列名1>, <ビューの列名2>, ・・・)
AS
<SELECT文>
 
ビューの上にビューを重ねることはしない(できれば)
 
サブクエリ
サブクエリを一言で言うと、使い捨てのビュー
サブクエリの中にさらにサブクエリを入れる入れ子構造も(一応)可能
 
相関サブクエリ
相関サブクエリは小分けにしたグループ内での比較を行うときに使う
 

第6章 関数、述語、CASE式

LIKE述語
文字列の部分一致検索を行うときに使う
前方一致、中間一致、後方一致の3種類
 
BETWEEN述語
範囲検索、引数を3つ使うのが他の述語と違う
 
CASE式
検索CASE式
場合分けを行う
 

第7章 集合演算

 
テーブルの足し算
集合演算子は通常は重複行は削除する。
注意事項1、演算対象となるレコードの列数は同じであること
注意事項2、足し算の対象となるレコードの列のデータ型が一致していること
注意事項3、SELECT文はどんなものを指定しても良い。ただし、ORDER BY句は最後に一つだけ
 
結合
別のテーブルから列を持ってきて「列を増やす」操作。欲しいデータが1つのテーブルだけからでは選択できない場合にこの操作が役に立つ。
 
内部結合 INNER JOIN
Aに属する列を橋渡しの橋に使って、Bに属する列同士を一緒の結果に含めてしまうこと。
・ポイント
結合を行うときはFROM句に複数のテーブルを記述する
内部結合ではON句は必須。記述場所はFROM句とWHEREの間
結合を使った場合のSELECT句は全て<テーブルの別名>.<列名>の書式で書く
 
外部結合 OUTER JOIN
・ポイント
内部結合と違い、片方のテーブルの情報が全て出力される
どちらのテーブルをマスタにするか
 

第8章 SQLで高度な処理を行う

ウィンドウ関数
構文
<ウィンドウ関数> OVER ((PARTITION BY <列リスト>)ORDER BY <ソート用列リスト>)
 
RANK関数 レコードのランキングを算出する関数
PARTITION BYは順位をつける対象の範囲を指定
ORDER BYはどの列をどんな順序で順位づけを行うかを指定
 
PARTITION BYによって区切られた部分集合をウィンドウと呼ぶ
PARTITION BYは指定しなくても良い⇨テーブル一つが大きなウィンドウとして扱われる
ウィンドウ関数は原則としてSELECT句のみで使える
 
注意点
OVER句の中でORDER BYを使うので、勘違いをしてしまいそうだが、結果の並び順には影響しない。
 
GROUPING演算子 合計と小計を一度に求める
ROLLUP
集約キーの組み合わせが異なる結果を一度に計算する。合計、小計を一度に求められる便利な道具。
 
CUBE
CUBEは集約キーで切り分けたブロックを積み上げて立方体を作るイメージ