スッキリわかるSQL入門を読んだ感想


はじめに

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冊としてお勧めできると感じました。