はじめに
SQLの学習として「スッキリわかるSQL入門」を読んだので、感想をまとめました。
良かったところ
本書はSQLとデータベースの基礎を会話形式で解説しています。それに加え、イラストや図を使った解説もあったので、SQLの知識がProgateを1周した程度の私でも内容の理解がしやすいと感じました。
また、PCやモバイル端末のブラウザだけでSQL文の作成ができる「dokoQL」のおかげで、環境構築をせずに気軽に学習ができる点も良かったと感じました。
学んだこと
本書で学んだことの概要をまとめました。
1.DML(Data Manipulation Language)
-データ操作言語-
DMLとはデータの検索や追加、更新、削除などを行う命令のことです。 ほとんどのデータ操作はSELECT文、INSERT文、UPDATE文、DELETE文で実現することができ、これらは四大命令と言われています。
・SELECT文
SELECT文はテーブルから目的のデータを検索して取得することができます。
SELECT 列名 FROM テーブル名
・INSERT文
INSERT文はテーブルに新しいデータを追加することができます。
INSERT INTO テーブル名 (列名1,列名2,...) VALUES (値1,値2,...)
・UPDATE文
UPDATE文はすでにテーブルに存在するデータを更新することができます。
UPDATE テーブル名 SET 列名1=値1,列名2=値2,...
・DELETE文
DELETE文はすでにテーブルに存在するデータを削除することができます。 (DELETE文はWHERE句で操作する行の絞り込みを行わない場合、全ての行が対象になるため注意。WHERE句については後述参照。)
DELETE FROM テーブル名 WHERE 条件式
2.WHERE句による操作する行の絞り込み
SQLを用いてイメージ通りにデータ操作を行うためには「どの行を対象として、どのように操作するか」を指定する必要があります。 SQL文の中でWHERE句を使うことにより、処理対象となる行の絞り込みができます。
SELECT文、UPDATE文、DELETE文の記述 WHERE 条件式
3.SELECT文の検索結果の加工
SELECT文で抽出した検索結果は、さまざまな形に加工することができます。
・DISTINCT
検索結果から重複行を除外できます。
SELECT DISTINCT 列名 FROM テーブル名
・ORDER BY
検索結果の順序を並べ替えることができます。 並び順は昇順にする場合はASC、降順にする場合はDESCを指定します。(初期値は昇順)
SELECT 列名 FROM テーブル名 ORDER BY 列名 並び順
・OFFSET-FETCH
検索結果から件数を限定して取得することができます。 また、ORDER BYと併用することで検索結果の並び順を指定することができます。
SELECT 列名 FROM テーブル名 ORDER BY 列名 並び順 OFFSET 先頭から除外する行数 ROWS FETCH NEXT 取得行数 ROWS ONLY
・UNION -和集合-
検索結果に他の検索結果を足し合わせることができます。
SELECT文1 UNION SELECT文2
・EXCEPT -差集合-
検索結果から他の検索結果を差し引くことができます。
SELECT文1 EXCEPT SELECT文2
・INTERSECT -積集合-
検索結果と他の検索結果で重複する部分を取得することができます。
SELECT文1 INTERSECT SELECT文2
4.検索結果の集計とグループ化
SELECT文で抽出した検索結果をひとまとめにして集計をすることができます。
・集計関数
集計関数は検索対象の全てに対して集計処理を行うことができます。
SELECT SUM(列名) 合計 MAX(列名) 最大値 MIN(列名) 最小値 AVG(列名) 平均値 FROM テーブル名
・GROUP BY
集計関数の処理前に指定した基準で検索結果をグループ化することができます。
SELECT グループ化の基準列名,集計関数 FROM テーブル名 (WHERE 条件式) GROUP BY グループ化の基準列名
5.副問い合わせ(サブクエリ)
SQL文の中に別のSELECT文を記述することができます。副問い合わせは()で括って記述され、内側にあるSELECT文から外側へと処理がされていきます。
SELECT 列名 FROMテーブル名 WHERE 条件=(SELECT ...)
6.複数テーブルの結合
データベースは複数テーブルに分けてデータ管理を行い、格納されたデータを結合させ、同時に取り出すことで、表計算ソフトにはできない高度なデータ操作を実現することができます。人間にとっては複数のテーブルに分けられているより、1つのテーブルにまとまっている方がわかりやすいと感じます。しかし、コンピュータにとっては、複数テーブルに分けることにより、テーブル修正時の処理対象が少なくなるので、データを安全、確実、高速で取り扱いやすくなります。
・JOIN句/ON句
テーブルAとテーブルBを結合させることができます。
SELECT 列名 FROM テーブルA JOIN テーブルB ON テーブルAとテーブルBの結合条件
7.トランザクション
トランザクションとは1つ以上のSQL文をひとかたまりとして扱うように処理をすることです。トランザクションの指定をすることで、急にコンピュータの電源が落ち、SQLによる処理が途中で中断されてしまったとしても、トランザクションで指定したSQLについては「全ての実行が完了している」か「1つも実行されていない」かのどちらかの状態になるように制御することができます。
トランザクションを使うための指示として、BEGIN(トランザクションの開始の指示。この指示以降のSQL文を1つのトランザクションとする。)と、COMMIT(終了の指示。この指示までを1つのトランザクションとし、変更を確定する。)を使用します。
BEGIN 処理1 処理2 COMMIT
8.テーブルの作成方法
・CREATE TABLE文
CREATE TABLE文はテーブルの作成ができます。 また、DEFAULTキーワードを指定することで、デフォルト値の設定ができます。
CREATE TABLE テーブル名( 列名1 列名1の型名 DEFAULT デフォルト値, 列名2 列名2の型名 DEFAULT デフォルト値,... )
・DROP TABLE文
DROP TABLE文はテーブルそのものの削除ができます。
DROP TABLE テーブル名
・ALTER TABLE文
ALTER TABLE文はテーブル定義の内容を変更することができます。
・列の追加 ALTER TABLE テーブル名 ADD 列名 型 ・列の削除 ALTER TABLE テーブル名 DROP 列名 型
・制約
テーブルの作成時は、テーブルに異常な値が格納されないよう列定義の後ろに制約を指定することができます。
制約の種類として、NULLの格納を許可しないNOT NULL制約、列の内容の重複を許可しないUNIQUE制約、列に格納されつ値が妥当であるかを判定するCHECK制約、主キーの役割を担う列として付ける主キー制約、データの更新や削除によって外部キーによる参照整合性(外部キーで別テーブルの行を参照しているにもかかわらず、その行が存在しない状態のこと)が崩れることを防ぐ外部キー制約があります。
9.インデックス
データベースで指定した列に対して作成した索引情報をインデックスと言います。インデックスが存在する列に対する列の検索は高速処理ができます。しかし、インデックスを乱用すると、内容の書き換えの際のオーバーヘッドが増加するので注意が必要です。
・CREATE INDEX文
CREATE INDEX文はインデックスを作成することができます。
CREATE INDEX インデックス名 ON テーブル名(列名)
・DROP INDEX文
DROP INDEX文はインデックスを作成することができます。
DROP INDEX インデックス名
難しかったこと
各章末に練習問題がついているのですが、インプットとアウトプットの難易度に乖離があり、大まかに理解したつもりで取り組むと分からない問題が多々ありました。難問に挑むのは腰が重くなりがちですが、インプットした内容についての理解を深めることができたので、めんどくさがらずにやることが重要だと感じました。
まとめ
本書はSQLの構文を学ぶための最初の1冊としてお勧めできると感じました。