2 SQL入門(解説)

サイト: LinuC Open Network
コース: 井上先生用コース
ブック: 2 SQL入門(解説)
印刷者: ゲストユーザ
日付: 2024年 09月 17日(火曜日) 05:02

説明

この章では、SQLの初歩的な事項について説明します。

2.1 リレーショナルデータベースとSQL
2.2 表の定義と削除
2.3 データの入力、検索、更新、削除

なお、SQLの詳しい使用方法については第3章で改めて説明することにします。

2.1 リレーショナルデータベースとSQL

この節では、リレーショナルデータベースの基本概念とSQLの基本事項について説明します。

リレーショナルデータベース(RDB: Relational Database)

リレーショナルデータベースは、データを表の形で管理するデータベースです。表のことをテーブルやリレーションと呼ぶこともあります。表は、商品や社員など、同じ概念に属するデータ集合の単位で作成します。一般に、表にはその内容を表す名前(表名)を付け、必要に応じて複数の表を1つのデータベース中に作成することになります。

表の縦方向のデータの並びを列、横方向の並びを行と呼びます。列のことをカラムや属性、行のことをタプルやレコードと呼ぶこともあります。列には名前(列名)を付けますが、行には名前が付きません。行を識別したい場合には、特定の列を主キーとして定義し、主キーの値によって識別します。以下は、社員に関する表(社員表)の例です。

社員表
社員番号 氏名 所属 生年月日
1 佐藤未来 総務部 1960-07-08
2 鈴木薫 技術本部 1970-05-05
3 高橋光 営業本部 1980-03-02


社員表は4つの列と3つの行で構成されています。各列は同じデータ型のデータで構成されており、例えば社員番号列には整数データ、氏名列と所属列には文字列データ、生年月日列には日付データが格納されています。また、各行は個々の社員のデータを表しており、例えば1行目は、社員番号1番、佐藤未来、総務部所属、1960年7月8日生まれの社員を表しています。

SQL

SQL(エスキューエル)は、リレーショナルデータベースの標準言語です。1987年に国際標準が制定され、基本機能はPostgreSQLを含むすべてのリレーショナルデータベースで利用できます。SQLはコマンドとして入力するほかに、一般のプログラミング言語に組み込んで使用することもできます。SQLには機能単位に多数の文(SQL文)が用意されています。一般に1つのSQL文は、複数の句から構成されます。以下は、社員表から社員番号1番の社員の氏名を検索するSQL文(SELECT文)の例です。

SELECT 氏名
  FROM 社員表
  WHERE 社員番号 = 1

このSELECT文は、SELECT句、FROM句、WHERE句の3つの句を含みます。

SQL文の基本ルール

SQL文には、以下の基本ルールがあります。

  • SQL文を構成するSELECT, FROM等の句を指定できる順序は固定であり、変更はできません。
  • SELECT, INSERT等のキーワードは半角で記述します。大文字と小文字は区別しません。本書では大文字を使用することにします。
  • 表名, 列名等の識別名の先頭文字は英字でなければなりません。2文字目以降は数字も使えます。また、全角文字も英字と同じ扱いになります。
  • 数値はそのまま何も付けず、文字列や日付時刻の値は一重引用符(')で前後を囲んで記述します。
  • 1つのSQL文を複数行に分けて記述することが可能です。ただし、キーワードの途中で改行できません。 
  • 文字列中に指定された場合を除き、空白、タブ、改行の各文字は同じスペースの扱いになります。
  • コメントは二重ハイフン(--)で始まる文字の並びで、行末まで続きます。実効的にはスペースの扱いになります。

2.2 表の定義と削除

この節では、SQLを使った表の定義と削除の方法について説明します。前節では、日本語の表名と列名を持った商品表を紹介しましたが、日本語の入力が面倒な状況があることを考慮して、英数字の表名と列名を使うことにします。なお、表に格納するデータは日本語を含みます。

表の定義(CREATE TABLE文)

データベースに新しい表を作成するには、以下の情報が最低限必要です。

  • 表名
  • 列名、データ型、[列制約]

列名、データ型は、表を構成するすべての列について必要です。列制約はオプションで、列に格納するデータに対する制約条件を設定します。

CREATE TABLE文は、データベースに新しい表を作成します。基本的な形式は以下の通りです。

CREATE TABLE 表名 (
    列名 データ型 [列制約]
    [, ...])

CREATE TABLE文で作成された表は、列のみが定義された行のない空の表になります。次節で説明するINSERT文で表に行を追加できます。

具体例として、employee表(社員表)を作成するCREATE TABLE文を以下に示します。

CREATE TABLE employee ( --社員表
    id INTEGER PRIMARY KEY, --社員番号
    name TEXT, --氏名
    section TEXT, --所属
    birth DATE) --生年月日

id列のデータ型はINTEGER(整数)で、name列とsection列のデータ型はTEXT(文字列)、birth列のデータ型はDATE(日付)です。また、id列には行を一意に識別することができるPRIMARY KEY(主キー)の列制約が付加されています。

作成した表は、以下のようにpsqlコマンドの\dメタコマンドで確認できます。

ossdb=# \d employee
                 テーブル"public.employee"
   列    | タイプ  | 照合順序 | Null 値を許容 | デフォルト
---------+---------+----------+---------------+------------
 id      | integer |          |               |
 name    | text    |          |               |
 section | text    |          |               |
 birth   | date    |          |               |
インデックス:
    "employee_id_key" UNIQUE CONSTRAINT, btree (id)

ossdb=#

少し分かりにくいかもしれませんが、id列には主キー制約を実現するためのインデックスが作成されています。インデックスについては4.4節で説明します。

表の削除(DROP TABLE文)

DROP TABLE文は、CREATE TABLE文で作成した表を削除します。基本的な形式は以下の通りです。

DROP TABLE 表名

DROP TABLE文は、表の中にある行をすべて削除した上で表自体も完全に削除します。

具体例として、employee表を削除するDROP TABLE文を以下に示します。

DROP TABLE employee

2.3 データの入力、検索、更新、削除

前節で作成したemployee表に対して、クラッド(CRUD: Create, Retrieve, Update, Delete)と呼ばれるデータの基本操作を行います。以下のSQL文がクラッドに対応します。

  • INSERT文: 表にデータを追加する(行単位で追加する)
  • SELECT文: 表のデータを検索する(列と行を指定できる)
  • UPDATE文: 表のデータを更新する(列と行を指定できる)
  • DELETE文: 表のデータを削除する(行単位で削除する)

INSERT文

INSERT文は、表に行単位でデータを追加します。基本的な形式は以下の通りです。

INSERT
    INTO 表名 [(列リスト)]
    VALUES (値リスト)[, ...]
  • INTO句は、データを追加する表名と列名のリスト(列リスト)を指定します。列リストを省略した場合は、表に定義されているすべての列を指定したものとみなされます。
  • VALUES句は、表に追加する1行分のデータのリスト(値リスト)を指定します。値リストと列リスト1対1対応である必要があります。すなわち、値リストの n 番目の値は、列リストの n 番目の列に格納されます。また、値リストは複数指定可能であり、1つのINSERT文で複数行をまとめて追加できます。

具体例として、employee表に1行追加するINSERT文を以下に示します。

INSERT INTO employee VALUES
    (1, '佐藤未来', '総務部', '1960-07-08')

以下は、employee表に8行追加するINSERT文です。

INSERT INTO employee(id, name, section, birth) VALUES
    (2, '鈴木薫', '技術本部', '1970-05-05'),
    (3, '高橋光', '営業本部', '1980-03-02'),
    (4, '田中飛鳥', '技術本部', '1985-01-29'),
    (5, '伊藤歩', '営業本部', '1985-11-26'),
    (6, '渡辺碧', '技術本部', '1987-09-23'),
    (7, '山本涼', '営業本部', '1989-07-20'),
    (8, '中村薫', '総務部', '1990-05-17'),
    (9, '小林瑞樹', '技術本部', '1991-03-14')

SELECT文

SELECT文は、表からデータを検索します。基本的な形式は以下の通りです。

SELECT { 列リスト | * }
    FROM 表名
   [WHERE 検索条件]
  • SELECT句は、検索結果として出力する列名等のリスト(列リスト)を指定します。列リストの代わりにアスタリスク(*)を書くと表中のすべての列を指定したものとみなされます。
  • FROM句は、検索対象とする表名を指定します。
  • WHERE句は、検索条件を指定します。検索条件は、列名、演算子(=, <, <=, >, >=, <>)、定数の組み合わせにより指定します。なお、演算子=は一致、<>は不一致を表します。複数の検索条件をAND, ORで連結することもできます。WHERE句を省略すると、すべての行が検索結果になります。

具体例として、employee表のすべてのデータを出力するSELECT文を以下に示します。

SELECT *
    FROM employee

以下は、employee表から社員番号が 1 の社員の氏名と所属を出力するSELECT文です。

SELECT name, section
    FROM employee
    WHERE id = 1

以下は、employee表から所属が技術本部で社員番号が 5 以下の社員の社員番号、氏名、生年月日を出力するSELECT文です。

SELECT id, name, birth
    FROM employee
    WHERE section = '技術本部' AND id <= 5

UPDATE文

UPDATE文は、表のデータを更新します。基本的な形式は以下の通りです。

UPDATE 表名
    SET 列名 = 値リスト[, ...]
   [WHERE 検索条件]
  • UPDATE句は、更新対象とする表名を指定します。
  • SET句は、更新する列名と更新後の値に等号(=)を挟んで指定します。列名と値は複数指定可能です。SET句で指定されなかった列の値は更新されません。
  • WHERE句は、更新条件を指定します。更新条件の指定方法はSELECT文の検索条件と同じで、条件に合致したすべての行が更新対象になります。また、WHERE句を省略するとすべての行が更新されます。

具体例として、employee表の所属が営業本部の社員を営業統括部所属に変更するUPDATE文を以下に示します。

UPDATE employee
    SET section = '営業統括部'
    WHERE section = '営業本部'

以下は、employee表の社員番号が 8 の社員の氏名を加藤薫に、生年月日を1990-05-24に変更するUPDATE文です。

UPDATE employee
    SET name = '加藤薫', birth = '1990-05-24'
    WHERE id = 8

DELETE文

DELETE文は、表のデータを削除します。基本的な形式は以下の通りです。

DELETE
    FROM 表名
   [WHERE 削除条件]
  • FROM句は、削除対象とするテーブル名を指定します。
  • WHERE句は、削除条件を指定します。条件の指定方法はSELECT文の検索条件と同じで、条件に合致したすべての行が削除対象になります。また、WHERE句を省略するとすべての行が削除されます。

具体例として、employee表の社員番号が 8 の社員を削除するDELETE文を以下に示します。

DELETE
    FROM employee
    WHERE id = 8

以下は、employee表からすべての社員の所属を削除するDELETE文です。

DELETE
    FROM employee

特にDELETE文は、WHERE句を書き忘れると表の中のすべての行が削除されてしまうので注意が必要です。