独り言

プログラミングの講師をしています。新人研修で扱う技術の解説と個人の技術メモ、技術書の紹介など

【SQL】SQL入門(導入・DBMS概要・DDL編)

データベースを操作するための言語であるSQLについて解説していきます。
ここではデータベースの導入からデータベースの概要、SQLの中のDDLについて解説します。


目次

  • 導入
  • データベース概要
  • SQLとは
  • DDL

導入

SQLを学習するにはデータベースの環境が必要です。
データベースにも様々な種類がありますが、ここではPostgreSQLというデータベースを使用していきます。
下記URLからOSに合わせてインストーラをインストールして、インストールをしておいてください。
バージョンの指定は特にありません。
最新版をダウンロードしておけば問題ないでしょう。

https://www.postgresql.jp/download

Windowsの場合、インストールが完了したら、SQL Shellを起動して、ユーザー名やデータベース名、パスワードを指定することでデータベースへの接続ができます。
PostgreSQLで初期で存在するデータベースとユーザーは「Postgres」です。
パスワードはインストール時に設定したものを指定します。
または、環境変数のPathにSQL Shellがインストールされているパス(デフォルトの場合は、C:\Program Files\PostgreSQL\<バージョン>\bin)を設定して、コマンドプロンプトから

psql -U postgres -d postgres  

とすることで接続できます。
ここからSQLの操作をするときは一旦上記コマンドで接続した状態から始めます。

ちなみにSQLの学習自体はPostgreSQL以外でも可能です。
PostgreSQL以外でSQLの学習でよく用いられるのはMySQLSQLiteなどです。
ここではMySQLSQLiteに特化した内容には触れませんが、他のサイトを参考にそれらを導入して学習を進めても問題ありません。


データベース概要

SQLとはデータベース(特にRDB)を操作することを目的とした言語です。
なので、SQLの前にまずはデータベース(以下、DB)について説明していきます。

DBは、一言でいえばデータをため込んでおく場所です。
簡単なシステムであれば、DBを使用せずに、プログラミング言語の技術だけでも作成することは可能です。
しかし、規模が大きなプログラムや、業務で使用するプログラムを作りたい場合は、データを保持しておく場所が必要になります。

例えば、ユーザーを新規に登録して、ログインして使用するWebシステムを作成しようとした場合、登録されたユーザーの情報をどこかに保持しておく必要があります。
商品を購入したりするECサイトの場合、商品のデータや、購入の履歴などもデータで保存しておく必要があります。

プログラミング言語では、変数や配列などを使用してデータを保持してくことができますが、これらのデータはプログラムが終了すると消滅してしまいます。
プログラムの中で保持したデータは、どんなに長くても、プログラムが動いているコンピュータの電源が落ちてしまえば全て消えてしまします。

しかし、ユーザーのデータや商品のデータなどは、コンピュータの電源が落ちた時に同時に消えてしまっては困ります。
そこで、プログラムの外部にデータを保持しておく仕組みが必要になります。
これがDBと呼ばれるものです。

ここで、データを保持するだけであれば、テキストファイルやExcelにデータを保持しても良いのでは?
と思うかもしれません。
確かに、テキストやExcelにデータを書き込んで保持することも技術的には可能です。
しかし、テキストファイルやExcelなどというのは、元々データをため込むことを目的とはしていません。
そのため、複数人の人が同時にアクセスした際や、データの量が増えてきた際には思わぬ不具合が起きる可能性があります。
また、プログラムとの連携も簡単ではない場合が多いです。

DBは、ただデータをため込むだけではなく、複数人が同時にアクセスした場合でも不具合が起きないように、また、データが増えてきた際にも高速に動くように考えて作られています。
また、プログラミング言語との連携もExcelなどと比べると楽にできるようになっています。

DBMS

DBというのはデータをため込む場所のことだと説明しましたが、実際に世の中で使われているDB製品は、ただのデータの入れ物ではなく、様々機能が盛り込まれており、データを管理・操作するための一つのシステムとなっています。
これらを総称してDBMS(Database Management System)と呼びます。

一般にDBというと、DBMSのことを指している場合がほとんどです。
このサイトでも、以下特に断りがない限りはDBと書いてあるものは基本的にDBMSのことだと思ってください。

データベースの種類

データベースというのは、データをどのような形式で保持するかによって、実はいくつかの種類に分かれます。

RDB

Relational Databaseの略です。
RDBでは、テーブルと呼ばれる表形式の入れ物にデータを格納して管理するDBです。
Excelをイメージすると分かりやすいかと思います。
1行単位でデータを登録し、そこから欲しいデータを取得していきます。
今現在最も主流なデータベースはこのRDBです。

RDBでは、データは「テーブル」という単位で保存していきます。
テーブルは表と呼ばれ、ちょうどExcelの表と同じようなイメージです。

データはテーブルに対して行単位で作成されます。
この時、データを表す行のことを「レコード」や「ロウ」と呼びます。
ここでは「レコード」と呼ぶようにします。

また、テーブルには、データの項目を表すための列があります。
列のことは「カラム」や「タプル」と呼びます。
ここでは「カラム」と呼ぶようにします。

RDBの製品は

などがあります。
有償の製品もあれば無償で利用できるものもあります。
製品によって使用できる機能や性能などが異なってきます。
また、プログラム言語との相性などもあるので、作成するシステムによって最適なものを選びます。
学習目的では無償で利用できるPostgreSQLMySQLSQLiteなどが用いられます。

オブジェクト指向データベース

RDBは現在最も多く使用されているDBですが、プログラミング言語でよく使用されているオブジェクト指向とは相性が悪いと言われています。
(インピーダンスミスマッチ)
そこで、オブジェクト指向のオブジェクトと相性が良いように、オブジェクトをそのまま扱えるようにしたDBがオブジェクト指向DBです。
オブジェクトをそのまま扱える分、RDBよりも高速に動くらしいですが、筆者も利用したことがないので、詳しいことは分かりません。

XMLデータベース

XMLデータベースは、その名の通り、XMLを使ってデータを管理するDBです。
階層構造が扱いやすいなど、RDBにはない特徴もありますが、おそらく現在はあまり使用されていないと思います。

KVS(キーバリューストア)

NoSQLに分類されるDBです。
KeyとValueのセットでデータを保存するDBです。
製品にはRedisなどがあります。

ドキュメントDB

NoSQLに分類されるDBです。
JSONを格納することができるDBで、複雑なデータ構造でもJSON形式で丸ごと扱えることができます。
製品としてはMongoDBなどがあります。

グラフDB

NoSQLに分類されるDBです。
SNSソーシャルネットワークのような、データとデータの関連が強い場合のデータの管理に向いているDBです。
製品としてはneo4jなどがあります。

NoSQL

ビッグデータの時代にバズワードとして登場して注目を浴びた言葉です。
NoSQL自体は特定のDBを表すものではなく、KVS, ドキュメントDB, グラフDBを総じてNoSQLと呼びます。
それぞれ特徴があり、システムの機能によってRDBと併用して使用されることが多いです。
ここでは深くは触れません。

まとめ

  • SQLはデータベース(特にRDB)を操作するための言語
  • データベースとはプログラムが扱いやすい形でデータを保存するソフトウェア
  • データベースを管理するソフトウェアをDBMSと呼ぶ
  • データベースには色々な種類がある
  • 現在最も主流なのはDBはRDB(リレーショナルデータベース)
  • RDBは表形式でデータを管理するDB
  • 表の中の列のことをカラム、行(データ)のことをレコードと呼ぶ
  • RDBにはOracle DB, SQL Server, DB2, MySQL, PostgreSQLなどがある
  • NoSQLと呼ばれるRDB以外のDBも近年よく利用されている

SQLとは

SQLとは、DB(その中でも特にRDBMSを操作するための言語です。
Structure Query Language の略(と言われている)で、Query(問い合わせ)をDBMSに投げてDBを操作します。

手続き型言語

SQLは分類としてはプログラミング言語に分類される技術ですが、いわゆる、一般的なアプリケーション開発で使用される言語(C言語JavaPHPPythonなど)とは、違う考え方をしている言語です。
先に述べたような一般的なプログラミング言語は、手続き型言語と呼ばれます。
一方、SQLは非手続き型言語と呼ばれます。
ここでいう手続きとは、処理の流れ(アルゴリズム)を表す言葉です。
C言語などのプログラミング言語では、プログラムでやりたいことがあった時、やりたいことを実現するための処理の流れ(How)を書きます。
これが手続き型の言語の特徴です。
一方、SQLでは、処理の流れは意識せずに、どのデータが欲しいのか、あるいはどのデータを更新するのかという、何をするか(What)を書きます。

手続き型言語はHow、非手続き型言語はWhatを書くと認識してください。

DBMS毎のSQL

SQLは各DBMSの製品毎に実装されています。
RDBMSには、

などなど、様々な製品があります。
SQLには、ISO(国際標準化機構)が定めた「標準SQL規格」と呼ばれるものがあり、SQLの規格が決められています。
RDB製品のSQLは、ある程度この標準SQL規格に沿って実装されているため、どのRDB製品を使用する場合でも、SQLで覚えることはほぼ同じです。
ただし、一部特定の製品でしか使用できないような構文もあり、そのような構文は「方言」と呼ばれます。

また、SQLには関数の概念がありますが、使用できる関数は各製品ごとに異なります。
同じ機能の関数でも、関数名が異なることもあります。
SQLの書き方や、SQLでの実現方法をネットで検索する場合には、DBMSの製品名も検索キーワードに含めるようにしておくと良いでしょう。

ここではPostgreSQLの環境で動作するSQLを学習していきます。
DBMS毎に構文に違いがあるものは随時補足していきます。

SQLの分類

SQLは目的に応じて大きく3つの分類の分けることができます。

  • DDL(Data Definition Language)
  • DML(Data Manipulation Language)
  • DCL(Data Control Language)

の3つです。
更に細かく分類すると、以下のようになります。

  • DDL(Data Definition Language)
  • DML(Data Manipulation Language)
    • SELECT
    • INSERT
    • UPDATE
    • DELETE
  • DCL(Data Control Language)
    • COMMIT
    • ROLLBACK

ここに挙げた構文をある程度覚えてしまえば、SQLはある程度使いこなせます。
この中で最も使用頻度が高いのは、DMLで、その中でもSELECTが最も重要な構文になります。
DDLは最初にDBの環境を構築する際などに多く利用することになります。
環境が整えばその後は使用する頻度は少なくなるでしょう。
DMLはデータの操作で頻繁に使用されるSQLです。
DCLはトランザクション制御(データの整合性を保つ仕組み)などで使用する構文などがあります。

まとめ

  • SQLはデータベースを操作する言語
  • SQLは非手続き型言語型の言語
  • SQLは製品によって実装が異なる部分が、ISOの標準SQL規格があることである程度統一されている
  • SQLDDL, DML, DCLに分類される
  • その中で最も使用頻度が高いのはDML

DDL

DDLは「Data Definition Language」の略で、いわゆるDB内における「オブジェクト」の定義を操作するための構文があります。
ここでいうDBのオブジェクトとは、簡単に言えば機能のようなもので、例えば、

  • ユーザー
  • テーブル
  • インデックス
  • ビュー
  • ストアドプロシージャ
  • トリガー
  • シーケンス

などがあります。
DBMSによってどのようなオブジェクトが使用できるかは異なりますが、DDLはそのDBMSで扱えるオブジェクトを新しく作成したり、削除したり、内容を変更するための構文だと理解してください。

オブジェクトの操作でよく使用するのは主に3つです。

  • CREATE文
  • DROP
  • ALTER文

の3つです。
CREATE文は各オブジェクトを作成するための構文です。
DROP文は各オブジェクトを削除するための構文です。
ALTER文は各オブジェクトの定義を変更するための構文です。

対象のオブジェクトによって指定できるオプションなどが異なるため、詳しくは各製品毎のマニュアルなどを参照ください。
ここではPostgreSQLでの使用頻度の高いであろうものをいくつか紹介します。
サンプルを試しながら学習する場合は、SQL Shellか、コマンドプロンプトを使ってデータベースに接続してください。
別のツールを使っても構いません。

-- 1行コメント
/* 
複数行コメント
*/
-- ユーザー作成
-- CREATE USER <ユーザー名> PASSWORD '<パスワード>' CREATEDB;
CREATE USER testuser PASSWORD 'pass' CREATEDB;

ユーザーを切り替える

# psqlでは\cでDBとユーザーの切り替えが可能
\c postgres testuser
-- データベース
-- CREATE DATABASE <データベース名>; 
CREATE DATABASE testdb; 

データベースを切り替える

\c testdb

解説

PostgreSQLのコマンド

PostgreSQLでは、DBへ接続するときに、どのユーザーでどのDBへ接続するかを指定することになります。
SQL Shell またはコマンドプロンプトを使って接続した場合、接続の際に指定したユーザーやDBから切り替える時に、\cのコマンドが使用できます。

\c <DB名> <ユーザー名>

となります。
これはSQLとは直接は関係なく、PostgreSQLコマンドラインツールから接続した場合のみ使用されるコマンドのため、限られた場面でしか使用しません。
そのため無理に覚える必要はありませんが、切り替えができることは知っておきましょう。

他にもコマンドラインツールで使用できるコマンドがありますが、「\」から始まるコマンドはPostgreSQL特有のコマンドと認識しておきましょう。

コメント

SQL文では、ハイフン2つ「--」で1行コメントになります。
複数行コメントにしたい場合は「/ /」で囲った部分が複数行コメントになります。

大文字と小文字

SQLは、大文字と小文字を区別しません。
以下のSQLは全て同じになります。

-- 全て同じ
CREATE DATABASE TESTDB; 
create database testdb; 
CREATE DATABASE testdb; 
create database TESTDB; 

そのため、どの書き方でも構いませんが、キーワードとそれ以外(この例の場合、createとdatabaseがキーワード、testdbがそれ以外)で、大文字と小文字を区別して書くのが一般的です。
どちらを大文字にするかは、個人の好み次第ですが、プロジェクトによってコーディング規約で定められている場合もあります。
ここでは、基本的にはキーワードを大文字にして、それ以外を小文字で書く方法にします。
(個人的にはキーワードを小文字で書く方が好きですが、本やネットの情報だとキーワードが大文字の例の方が多く感じるので)

文字列

SQLは大文字と小文字を区別しないと書きましたが、ユーザー作成の部分の「'pass'」の部分は、大文字と小文字が区別されます。
これは、文字列に当たるからです。
SQLの場合、文字列はシングルクォーテーションで囲います。

セミコロン

SQLでは、1文の終わりをセミコロンで判断します。

CREATE文

CREATE文は、オブジェクトを新しく作成するときに使用される構文です。
ほとんどの場合構文は以下のようになります。

CREATE 対象のオブジェクト オブジェクトの名前

オブジェクトの種類によってこの後に続くオプションが異なるため、詳しくはマニュアルを参照ください。

CREATE USERでは、DBにログインするためのユーザーの作成が行えます。
PASSWORDオプションで、ログインの際のパスワードを指定します。
このパスワードは文字列として認識され、大文字と小文字を区別するので注意してください。
CREATEDBオプションを指定すると、そのユーザーでログインしているときにデータベースの作成が行える権限が付与されます。

CREATE DATABASEでは、データベースを作成することができます。
PostgreSQL自体がデータベースなので、その中でデータベースを作成するという操作は混乱するかもしれません。
CREATE DATABASEで作成するデータベースは、スキーマと呼ばれる、名前空間を分けるための概念だと考えてください。
例えば、「users」というテーブル(オブジェクト)を作成した場合、もう「users」という名前のテーブルは作成することができませんが、データベースが別であれば同じ名前で「users」というテーブルが作成可能になります。

ここまでのまとめ

  • DDLはDB内のオブジェクトを定義したりするためのSQL
  • DBのオブジェクトには、テーブル、インデックス、ビューなどがある
  • SQLのコメントは1行コメント「--」と複数行コメント「/ /」がある
  • SQLは大文字と小文字を区別しない
  • SQLで文字列は'(シングルクォーテーション)で加工
  • SQLは;(セミコロン)で文区切りを表す
  • オブジェクトを作成するにはCREATE文を使用する
  • データベースにログインするには、ユーザーとデータベースの指定が必要

CREATE TABLE

続いてはよく使用するであろうテーブルの作成について見ていきます。

構文

CREATE TABLE <テーブル名> (
    <カラム名> <データ型> <制約>
    ...
);

サンプル

-- テーブルの作成
CREATE TABLE items (
    id INT PRIMARY KEY
    , item_name VARCHAR(50)
    , price REAL
);

サンプルのSQLを実行すると、接続されているDBに対してitemsというテーブルが作成されます。

\dコマンドでテーブルが作成されたかどうかを確認することができます。

RDBではデータはテーブルに保存します。
通常、一つのシステムを作るのに複数のテーブルが使用されるので、CREATE TABLEは環境を作成する際に利用されます。

テーブルを作成する際には、CREATE TABLEの後にテーブル名を指定します。
その後に、()の中にそのテーブルのカラム(列)を指定します。

カラム

上の例では、id, item_name, price がそれぞれカラムになります。

データ型

カラム名の後には、データ型を指定します。
データ型はデータの種類のことで、整数、小数、文字(固定長、可変長)、日付、時間、日時、など様々な種類があります。
細かくはDMBSの製品によっても異なるので、詳しくは各製品のマニュアルを参照ください。

上の例では、INTは整数型、VARCHARは可変長文字列型、REALは小数型を表します。
VARCHAR(50)の50は、文字数を表します。

文字列にはもう一つCHAR型(固定長文字列型)があります。
CHAR(50)とした場合、データのサイズが50バイト未満だった場合、空白が入ってデータ長が必ず50バイトになるように調整されます。
VARCHARの場合、指定サイズに満たなかったとしても空白で補うことは行わません。

制約

制約は、その名の通り、カラムに対して付ける制約です。
制約には主に以下のようなものがあります。

  • PRIMARY KEY:主キーとも呼ばれる
  • UNIQUE:データの重複を許さない
  • NOT NULL:NULLを許容しない
  • DEFAULT:初期値を設定
  • CHECK:値の妥当性をチェックする
  • FOREIGN KEY:外部キー

DROP

CREATE文を使用するとオブジェクトを作成することができますが、一度作成したオブジェクトを削除するにはDROP文を使用します。

構文

DROP <オブジェクトの種類> <オブジェクト名>;

サンプル

-- テーブルの削除
-- DROP TABLE <テーブル名>;
DROP TABLE items;
-- テーブルの削除(テーブルが存在しなくてもエラーにならない)
-- DROP TABLE IF EXISTS <テーブル名>;
DROP TABLE IF EXISTS items;

指定できるオプションなどはオブジェクトによって異なるため、詳しくはマニュアルを参照ください。
DROPでテーブルを削除した場合、テーブルに格納されているデータも丸ごと削除されます。

ALTER

ALTERは、一度作成したオブジェクトの定義を変更する際に使用される構文です。

-- カラムの追加
ALTER TABLE items ADD COLUMN category varchar(50);
-- カラムの削除
ALTER TABLE items DROP COLUMN category;

ALTERについても、細かい指定の仕方はオブジェクトによって異なるので、詳しくはマニュアルを参照ください。

TRUNCATE

TRUNCATEはテーブルのデータを丸ごと削除する構文となります。
DROPを使用すると、テーブルの定義そのものがなくなりますが、TRUNCATEは、テーブルの定義はそのままに、中のデータを削除します。

-- itemsテーブルのレコードを丸ごと削除する
TRUNCATE items;

レコードを削除する構文に、DMLの中のDELETE文がありますが、DELETEとは細かい点で色々違いがあります。
DELETE文はどのレコードを削除するか指定できるのに対し、TRUNCATEはレコードの指定ができません。
また、トランザクションの制御が可能かどうかなどの違いがあります。

まとめ

  • テーブルの作成はCREATE TABLEを使用する
  • カラムにはデータ型を指定する
  • データ型には数値、文字列、日時などがある
  • カラムには制約を付けることができる
  • 制約には、PRIMARY KEY, UNIQUE, NOT NULL などがある
  • オブジェクトの削除にはDROPを使用する
  • オブジェクトの定義の変更にはALTERを使用する
  • テーブルのデータを丸ごと削除するにはTRUNCATEを使用する