SQL 第2版 ゼロからはじめるデータベース操作

現場で通用する知識が身に付く!

データベースやSQLがはじめてという初心者の方向けの入門書です。SQLによるDB操作を基本から学習していきます。初心者がつまづきやすいポイントもまとまっているため、挫折せずに進めることができます。

はじめに

本書は、プログラミングやシステム開発の経験がまったくない初心者の方々を対象に、リレーショナルデータベースおよびそれを扱うための「SQL」という言語の使い方を解説する書籍です。各章では具体的なサンプルコードを中心に解説を行ない、章末には理解度を確認するための練習問題も用意しています。第1章から順に自分の手でサンプルコードを試しながら読み進めることで、自然とSQLの基礎とコツをマスターできる構成になっています。また、特に重要なポイントは「鉄則」としてまとめているため、本書の内容を一通り理解した後はリファレンスとしても活用できるでしょう。

近年、データベースという分野は、ほかのシステムの分野もそうであるように、急速な進展を見せています。新しい機能を持つデータベースが登場し、扱われるデータ量も飛躍的に増大するなど、その応用範囲を大きく広げています。

本書が扱うリレーショナルデータベースは、現在最も主流のデータベースであり、それゆえほかのデータベースを理解するうえでの基礎ともなります。その重要性は、通常、システムの分野で「データベース」と言えばリレーショナルデータベースを指す、という事実からもわかります。

皆さんの中には、これからさまざまな分野、規模のシステム開発を経験することになる方が多いでしょう(あるいはすでに開発に従事している方もいるかもしれません)。その際、データベースが使われていないシステムというのは、まず考えられません。そして、そのシステムで使われているデータベースは、きっとリレーショナルデータベース、あるいはそれを基礎とするデータベースです。これが意味することは、リレーショナルデータベースと(そのデータを操作する)SQLをマスターすれば、どんなシステム開発でも応用が利く“データベースのスペシャリスト”になれる、ということなのです。

本書の初版が刊行されてから6年が経過しましたが、その間、データベースの社会的な重要性は高まる一方でした。以前から、データベースを用いた統計的な分析は専門家の間では行なわれていましたが、それをきわめて大規模なデータに適用してビジネス全般の改革に応用しようという大きな潮流が起こりました。その動きを象徴する「ビッグデータ」や「データサイエンス」という言葉も、システムの世界にとどまらず、社会全体に広まりました。統計解析は、人工知能と並んで今後の社会のあり方を決定する要因だという意見すらあります。

一方で、データベースの世界でも技術的な革新が行なわれてきました。KVSに代表される非リレーショナル型のデータベースの利用は、もはや珍しいことではなくなりました。また、大規模データを処理するためのパフォーマンスを追求するために、インメモリデータベースやカラム指向データベースの技術も大きな進展を見せており、実用化が進んでいます。

その一方、変わらなかったこともあります。それは、データベースの主流が、やはりリレーショナルデータベースであることです。その意味で、リレーショナルデータベースと、それを操作する言語であるSQLの習得が、データベースの世界を究めていく最初のステップであることも、いまでも変わらぬ事実と言えます。しかしそれは、リレーショナルデータベースとSQL が進歩していないわけではありません。多くのDBMSがウィンドウ関数やGROUPING演算子 (いずれも第8章で解説)をサポートし、大規模データを効率的に処理するための機能を充実させてきました。SQLをマスターすることで、自由自在にデータを扱い、効率的なシステムを構築することができるようになるでしょう。
本書もまた、そうした動向にあわせてバージョンアップを行ないました。代表的なDBMSの新しいバージョンでのSQL構文のサポート状況にあわせて記述をアップデートするとともに、アプリケーションからデータベースを利用する方法をテーマとした第9章を新たに追加しています。

本書が、皆さんのステップアップの糸口として役立つこと、そしてデータベースという分野の面白さを伝える一端となることを、心から願っています。

《本書について》
本書は、プログラミング学習シリーズのSQLおよびリレーショナルデータベース編です。同シリーズの趣旨として、初心者でも無理なくプログラミングの力を養えるように配慮していま す。本書も、独習書としてはもちろん、大学、専門学校、企業での新人研修などの場でも利用 できるように作成しています。多くのサンプルコードと詳細な実行手順を記載しており、学習 者ひとりひとりが自分の手で具体的な問題に取り組むことで、着実にプログラミング力を向上 させることができるでしょう。
また、各章末には学習した重要ポイントをおさらいする練習問題を用意しています。巻末の付録Aには問題の解答と解説も収録していますので、学習の到達度の確認に役立ててください。

《本書の対象となる読者》
・データベースやSQLに関する知識がまったくない人
・自己流でSQLを覚えたものの、体系的にきちんと勉強しなおしたいと考えている人
・データベースを使うことになったものの、何から手をつければ良いかわからない人
・大学、専門学校、企業の教育部門などでデータベースとSQLを教える立場の人
・情報処理試験のSQL対策をしたい人

《本書で学習するための前提知識》
・Windowsの基本的な操作方法がわかること
・Windowsのエクスプローラを使って、フォルダの作成やファイルのコピーができる
・Windowsのメモ帳(あるいは、ほかのテキストエディタ)を使って、文書ファイルの作成ができること

《本書で対象とするリレーショナルデータベース》
本書に掲載しているSQL文は、次のリレーショナルデータベース(RDBMS)上で動作を確認しました。
・Oracle Database 12cRI
・SQL Server 2014
・DB2 10.5
・PostgreSQL 9.5.3
・MySQL 5.7
本書では、これら5つのRDBMSの間で記述に違いがあるSQL文、あるいは特定のRDBMSでしか動作しないSQL文に次のようなアイコンをつけ、そのSQL文が動作するRDBMSを示しています。
・Oracle
・SQL Server
・DB2
・PostgreSQL
・MySQL
逆に、これらすべてのRDBMSで動作するSQL文にはアイコンをつけていません。

《本書での学習にあたって》
本書では、まず第1章の前半でリレーショナルデータベースとSQLの基礎知識を習得したのち、具体的なSQLのサンプルコードを示しながら学習を進めていきます。
SQLの学習にあたって重要なのは、
・自分の手でSQLを書くこと
・SQLを実行して動作を知る、理解すること
です。より学習の効率をアップさせるため、できるだけ本書で示すサンプルコードを実際に入 力・実行して試しながら読み進めてください。
本書では、SQLの学習環境として初心者にも扱いやすいデータベース 「PostgreSQL」を紹介しています。学習に入る前に、これを自分のパソコンにインストールし、SQLを実行する準備を整えておきましょう。準備の整え方(インストール方法、SQLの実行方法)については、第0章にまとめています。
上記の「本書で対象とするリレーショナルデータベース」に記載したデータベースをすでにお持ちの方は、それをご利用いただいてもかまいません。
なお、本書内に記載しているSQLの実行結果は、特にことわりがない限り、PostgreSQL 9.5でのものです。

《サンプルのダウンロードについて》
本書に掲載しているサンプルコードは、次のWebサイトからダウンロードできます。
https://www.shoeisha.co.jp/book/download/9784798144450
サンプルコードはZip形式で圧縮されており、解凍すると次のようなフォルダ構成になって
います。
ReadMe.txtファイル
サンプルコードの内容、注意点についてまとめています。
ご利用になる前に必ずお読みください。
Sampleフォルダ
本書に掲載しているサンプルコードを、章と節ごとにフォルダを分けて収録しています。Sample\CreateTableフォルダには、本書で利用するサンプルテーブルを作成するためのSQL文をRDBMS 別に収録しています。


answerフォルダ
各章末に掲載されている練習問題の解答例(サンプルコード)を、章ごとにフォルダを分け
て収録しています。

《サンプルコードについて》
サンプルコードのファイル名は、本文に掲載されているリスト番号に対応しています。たと
えば、第1章の1-5節で掲載しているList O-3のサンプルコードは、次のような位置、ファイル名で収録しています。
また、次のリストのように、本書で対象とするRDBMSの間で記述に違いがあるSQL文の場合、ファイル名の最後にRDBMSの名前を入れています。

たとえば、この場合は次のようなファイル名でサンプルコードを収録しています。
・List1_4_DB2_PostgreSQL_MySQL.sql
・List1_4_Oracle.sql
・List1_4_SQL Server.sql

サンプルテーブル作成用SQL
Sample\CreateTableフォルダに収録している、テーブル作成用SQLのファイル名は、 「CreateTable<テーブル名>.sql」です。たとえば、PostgreSQL用のShohinテーブルを作成するSQLは、次のような位置、ファイル名で収録されています。

なお、Sampleフォルダに収録しているサンプルコードファイルは、Windowsのメモ帳(あるいは各種テキストエディタ)を使って開くことができます。

《ご注意ください》
本書のサンプルコードは、通常の運用においては何ら問題ないことを編集部株式除試割が社りますが、運用の結果、いかなる損害が発生したとしても著者、ソフトウェア開発者、(株) 翔泳社はいかなる責任も負いません。
Sampleフォルダに収録されたファイルの著作権は、著者が所有します。ただし、読者が個人的に利用する場合においては、ソースコードの流用や改変は自由に行なうことができます。
なお、個別の環境に依存するお問い合わせや、本書の対応範囲を超える環境で設定された場合の動作や不具合に関するお問い合わせは、受けつけておりません。

目次

はじめに
本書について
本書の対象となる読者
本書で学習するための前提知識
本書で対象とするリレーショナルデータベース
本書での学習にあたって
サンプルのダウンロードについて

第0章 イントロダクションSQL-学習環境を作ろう
PostgreSQLのインストールと接続設定
インストールの手順
設定ファイルの書き換え
PostgreSQLでSQLを実行する
PostgreSQL への接続(ログイン)
SQL の実行
学習用データベースの作成
学習用データベースへの接続(ログイン)

第1章 データベースとSQL
1-1 データベースとは何か
私たちのすぐそばにあるデータベース
なぜDBMS が必要なのか
DBMSにはいろんな種類がある
1-2 データベースの構成
RDBMSの一般的なシステム構成
テーブルの構造
1-3 SQLの概要
標準SQL
SQLの文とその種類
SQLの基本的な記述ルール
1-4 テーブルの作成
作成するテーブルの内容
データベースの作成(CREATE DATABASE文)
テーブルの作成(CREATE TABLE文)
命名ルール
データ型の指定
制約の設定
1-5 テーブルの削除と変更
テーブルの削除(DROP TABLES)
テーブル定義の変更(ALTER TABLE文)
Shohinテーブルへのデータ登録
練習問題

第2章 検索の基本
2-1 SELECT文の基本
列を出力する
すべての列を出力する
列に別名をつける
定数の出力
結果から重複行を省く
WHERE句による行の選択
コメントの書き方
2-2 算術演算子と比較演算子
算術演算子
NULLには要注意
比較演算子
文字列に不等号を使うときの注意
NULLに比較演算子は使えない
2-3 論理演算子
NOT演算子
AND演算子とOR演算子
カッコ()をつけると強くなる
論理演算子と真理値
NULLを含む場合の真理値
練習問題

第3章 集約と並べ替え
3-1 テーブルを集約して検索する
集約関数
テーブルの行数を数える
NULLを除外して行数を数える
合計を求める
平均値を求める
最大値・最小値を求める
重複値を除外して集約関数を使う(DISTINCTキーワード)
3-2 テーブルをグループに切り分ける
GROUP BY句
集約キーにNULLが含まれていた場合
WHERE句を使った場合のGROUP BYの動作
集約関数とGROUP BY句にまつわるよくある間違い
3-3 集約した結果に条件を指定する
HAVING 句
HAVING句に書ける要素
HAVING句よりもWHERE句に書いたほうが良い条件
3-4 検索結果を並べ替える
ORDER BY 句
昇順と降順の指定
複数のソートキーを指定する
NULLの順番
ソートキーに表示用の別名を使う
ORDER BY句に使える列
列番号は使ってはいけない
練習問題

第4章 データの更新
4-1 データの登録(INSERT文の使い方)
INSERTとは
INSERT文の基本構文
列リストの省略
NULLを挿入する
デフォルト値を挿入する
ほかのテーブルからデータをコピーする
4-2 データの削除(DELETE文の使い方)
DROP TABLEX DELETEX文とDELETEX文
DELETE文の基本構文
削除対象を制限したDELETE文(探索型DELETE)
4-3 データの更新(UPDATE文の使い方)
UPDATE文の基本構文
条件を指定したUPDATE文(探索型UPDATE)
NULLで更新するには
複数列の更新
4-4 トランザクション
トランザクションとは何か
トランザクションを作るには
ACID特性
練習問題

第5章 複雑な問い合わせ
5-1 ビュー
ビューとテーブル
ビューの作り方
ピューの制限事項①――ビュー定義でORDER BY句は使えない
ビューの制限事項②――ビューに対する更新
ビューを削除する
5-2 サブクエリ
サブクエリとビュー
サブクエリの名前
スカラ・サブクエリ
スカラ・サブクエリを書ける場所
スカラ・サブクエリを使うときの注意点
5-3 相関サブクエリ
普通のサブクエリと相関サブクエリの違い
相関サブクエリも、結局は集合のカットをしている
結合条件は必ずサブクエリの中に書く
練習問題

第6章 関数、述語、CASE式
6-1 いろいろな関数
関数の種類
算術関数
文字列関数
日付関数
変換関数
6-2 述語
述語とは
LIKE述語――文字列の部分一致検索
BETWEEN述語――範囲検索
IS NULL, IS NOT NULL――NULLか非NULLかの判定
IN述語――ORの便利な省略形
IN述語の引数にサブクエリを指定する
EXISTS述語
6-3 CASE式
CASE式とは
CASE式の構文
CASE式の使い方
練習問題

第7章 集合演算
7-1 テーブルの足し算と引き算
集合演算とは
テーブルの足し算――UNION
集合演算の注意事項
重複行を残す集合演算――ALLオプション
テーブルの共通部分の選択――INTERSECT
レコードの引き算――EXCEPT
7-2 結合(テーブルを列方向に連結する)
結合とは
内部結合――INNER JOIN
外部結合――OUTER JOIN
3つ以上のテーブルを使った結合
クロス結合――CROSS JOIN
結合の方言と古い構文
練習問題

第8章 SQLで高度な処理を行なう
8-1 ウィンドウ関数
ウィンドウ関数とは、
ウィンドウ関数の構文
構文の基本的な使い方――RANK関数の利用
PARTITION BYは指定しなくても良い
ウィンドウ専用関数の種類
ウィンドウ関数はどこで使うか
集約関数をウィンドウ関数として使う
移動平均を算出する
2つのORDER BY
8-2 GROUPING演算子
合計行も一緒に求めたい
ROLLUP――合計と小計を一度に求める
GROUPING関数――偽物のNULLを見分けろ
CUBE――データで積み木を作る
GROUPING SETS――ほしい積み木だけ取得する
練習問題

第9章 アプリケーションからデータベースへ接続する
9-1 データベースの世界とアプリケーションの世界をつなぐ
データベースとアプリケーションの関係
ドライバ――2つの世界の橋渡し
ドライバの種類
9-2 Javaの基礎知識
何はともあれHello, World
コンバイルとプログラムの実行
よくあるエラー
9-3 JavaからPostgreSQLへ接続する
SQL 文を実行するJavaプログラム
どうやってJavaはデータベースからデータをとってくるのか
データベース接続のプログラムを実行してみよう
テーブルのデータを選択してみよう
テーブルのデータを更新してみよう
まとめ
練習問題

付属A練習問題の解答
索引