【これからJP1に触れる人向け】SQL文

SQLとはデータベース(関連したデータをコンピューター上で一定の規則に従って集積し、整理されたもの)の表を作成したり、データを編集したりする際に用いられる言語である。

SQLには表やビュー、データベースなどを定義するデータ定義言語と、データベースのデータの編集(抽出、挿入など)を行うデータ操作言語がある。


1. SQLのデータ定義言語(DDL)


SQLのデータ操作言語を使用すると主にデータベースで表やビューの新規に作成及び定義をすることが可能になる。

1-1. 表の作成

SQL文のデータ定義言語(DDL)を使用して表を作成・定義する際には以下のようなSQL文を入力して表を定義する。

(SQL文) CREATE TABRE 表名(カラム名 データ型【オプション】,・・・)

番号  | 市名   | 人口
------+----------+------------
001  |札幌  |  1970000      
002  |仙台  |  1100000    
003  |横浜  |  3770000    
004  |名古屋 |  2320000     
005  |大阪  |  2750000     
006  |福岡  |  1630000   
     (表1<テーブル名:市と人口>)

例えば上記の表1のような<テーブル名:市と人口>を作成したい時、入力するSQL文は以下の通りになる。

(SQL文) CREATE TABLE 市と人口(
      番号CHAR (3) PRIMARY KEY,
      市名 VARCHAR (7), 人口 NUMERIC)

番号,カラムの設定の際は固定長(3バイト)の文字データを設定するためにCHAR (3)を記す。

さらにこのテーブルの主キー設定を番号,行にかけるためにデータ型の後ろにPRIMARY KEYを記述する。

名前カラムには可変長(7バイト)の文字データ、人口カラムには数値データを定義している。

1-2. ビューの作成

SQL文のデータ定義言語(DDL)を使用してビュー(既存の表から選択したデータを取り出して一時的に作成する表)を定義する際には以下のようなSQL文を入力して表を定義する。

(SQL文) CREATE VIEW ビュー名(表名1, 表名2,・・・)
AS SELECT 既存表のカラム名1, 既存表のカラム名2 FROM 既存表名

先ほどの表1の<テーブル名:市と人口>から番号カラムと名前カラムを取り出し、<ビュー名:県庁所在地>を作成したい時、入力するSQL文は以下の通りになる。

(SQL文) CREATE VIEW 県庁所在地(番号, 市名)
AS SELECT 番号, 市名 FROM 市と人口

番号  | 市名   
------+--------
001  |札幌
002  |仙台
003  |横浜
004  |東京
005  |名古屋
007  |大阪
008  |福岡
  (表2<ビュー名:県庁所在地>)

2. SQLのデータ操作言語(DML)


SQLのデータ操作言語を使用すると主に以下のことがデータベース上で可能になる。


・データの抽出
・データの結合
・データの追加
・データの削除
・データの更新
・データの整列
・データのグループ化

2-1. データの抽出

データの抽出とは既存の表に存在するデータベースから一つまたは複数のデータを全部または一部分を取得することである。

データベース処理で最も多く用いられるデータ処理である。主にSELECT文が使用される。

(SQL文) SELECT カラム名(, カラム名, カラム名, . . .)
FROM 表名

・射影

射影とは既存の表のデータベースのうち、特定のカラムを抽出することである。

表1<テーブル名:市と人口>から市名カラムを射影した場合のSQL文と射影後の表を以下に記す。

今回は表1<テーブル名:市と人口>のデータのうち、名前カラムを取得する。

(SQL文) SELECT 市名 FROM 市と人口

<射影結果>
市名
----------
札幌
仙台
横浜
東京
名古屋
大阪
福岡
(表3<テーブル名:市と人口(射影後)>)


・選択

選択とは既存の表のデータベースのうち、特定の行を抽出することである。

表1<テーブル名:市と人口>から市名カラムを選択した場合のSQL文と選択後の表を以下に記す。今回は表1<テーブル名:市と人口>のデータのうち、人口カラムが2500000以上である列を取得する。

(SQL文) SELECT * FROM 市と人口
      WHERE 2500000<人口

<選択結果>
番号  | 市名   | 人口
-----+----------+------------    
003  |横浜  |  3770000     
007  |大阪  |  2750000
 (表4<テーブル名:市と人口(選択後)>)

2-2. データの結合

データの結合とは既存の複数の表を結合して一つの表を作成することである。

表1<テーブル名:市と人口>と表5<テーブル名:県と県庁所在地>を結合するSQL文と結合後の表6を以下に記す。

今回は市と人口表の市名カラムと県と県庁所在地表の県庁所在地カラムを結合し、市と人口表の番号カラムと人口カラム及び県と県庁所在地表の都道府県カラムの表を作成する。

(SQL文) SELECT 
FROM 市と人口, 県と県庁所在地
      WHERE 市と人口.市名 = 県と県庁所在地. 県庁所在地

都道府県  | 県庁所在地   
------------+------------------
北海道   | 札幌      
宮城県   | 仙台      
神奈川県  | 横浜      
愛知県   | 名古屋     
大阪府   | 大阪     
福岡県   | 福岡    
(表5<テーブル名:県と県庁所在地>)

都道府県  | 番号  | 人口
------------+---------+------------
北海道   | 001 |  1970000     
宮城県   | 002 |  1100000     
神奈川県  | 003 |  3770000     
愛知県   | 004 |  2320000     
大阪府   | 005 |  2750000     
福岡県   | 006 |  1630000   
(表6<テーブル名:結合結果>)

2-3. データの追加

データの追加とは既存の表に存在するデータベースに設定したい新たなデータを挿入することである。

主にINSERT文が使用される。

(SQL文)  INSERT  INTO 表名 VALUES (値1, 値2,...);

表1<テーブル名:市と人口>に那覇市のデータを追加した場合のSQL文と追加後の表を以下に記す。

(SQL文)  INSERT  INTO 市と人口 VALUES (‘007‘, ‘那覇‘,310000);

 番号  | 市名   | 人口
-------+--------+------------
001  |札幌  |  1970000     
002  |仙台  |  1100000     
003  |横浜  |  3770000     
004  |名古屋 |  2320000     
005  |大阪  |  2750000     
006  |福岡  |  1630000
007  |那覇  |   310000
(表7<テーブル名:市と人口(追加後)>)

2-4. データの削除

データの削除とは既存の表に存在するデータベースから一つまたは複数のデータを全部または一部分を消去することである。

主にDELETE文が使用される。

(SQL文)  DELETE  FROM 表名 WHERE カラム名 = (値);

表1<テーブル名:市と人口>に名古屋市のデータを削除した場合のSQL文と削除後の表を以下に記す。

(SQL文)   DELETE  FROM 市と人口 WHERE 市名 = ‘名古屋’;

 番号  | 市名   | 人口
-------+--------+------------
001  |札幌  |  1970000     
002  |仙台  |  1100000     
003  |横浜  |  3770000     
005  |大阪  |  2750000     
006  |福岡  |  1630000   
(表8<テーブル名:市と人口(削除後)>)

2-5. データの更新

データの更新とは既存の表に存在するデータベースから一つまたは複数のデータを全部または一部分を書き換えることである。

主にUPDATE文が使用される。

(SQL文) UPDATE 表名SET カラム名= (値) WHERE (条件);

表1<テーブル名:市と人口>の人口が350万人以上の市名を川崎に変更した場合のSQL文と追加後の表を以下に記す。

(SQL文)  UPDATE 市と人口SET 市名= ‘川崎’  WHERE 人口>3500000;

 番号  | 市名   | 人口
-------+--------+------------
001  |札幌  |  1970000     
002  |仙台  |  1100000     
003  |川崎  |  3770000     
004  |名古屋 |  2320000     
005  |大阪  |  2750000     
006  |福岡  |  1630000
(表9<テーブル名:市と人口(更新後)>)

2-6. データの並べ替え

データの並べ替えとは既存の表に存在するデータベースとあるカラム列の昇順または降順に並べ替えることである。

主にSELECT ~ ORDER BY文が使用される。

(SQL文)  SELECT ~ ORDER BY 列名 ASC(昇順の場合)
(SQL文)  SELECT ~ ORDER BY 列名 DESC(降順の場合)

表1<テーブル名:市と人口>の人口を昇順に並べ替えた場合のSQL文と並べ替え後の表を以下に記す。

(SQL文)   SELECT * FROM 市と人口 ORDER BY 人口 ASC;

番号  | 名前   | 人口
-----+--------+------------
003  |横浜  |  3770000
005  |大阪  |  2750000
004  |名古屋 |  2320000
001  |札幌  |  1970000  
006  |福岡  |  1630000    
002  |仙台  |  1100000     
     (表10<テーブル名:市と人口>)

2-7. データのグループ化

データのグループ化とは既存の表に存在するデータベースに対して指定したカラムの内容が一致する行を一つの行にまとめることである。

主にSELECT ~ GROUP BY文が使用される。

(SQL文)  SELECT ~ GROUP BY カラム名 

支店  |パン      | 売り上げ数
----------+------------+------------
札幌  |カレーパン | 170   
仙台  |メロンパン | 150   
横浜  |カレーパン | 110   
名古屋 |メロンパン | 150   
大阪  |メロンパン | 180   
福岡  |チーズパン | 200   
(表11<テーブル名:支店とパンの売り上げ数>)

上記の表11<テーブル名:支店とパンの売り上げ数>をパンの種類別の支店における最大売り上げ数でグループ化した場合のSQL文とグループ化後の表を以下に記す。

(SQL文)   SELECT パン,MAX(売り上げ数)
      FROM 支店とパンの売り上げ数
GROUP BY パン;

パン    |
---------------+------------
カレーパン | 170     
メロンパン | 180         
チーズパン | 200   
(表12<テーブル名:支店とパンの売り上げ数(グループ化後)>)

また、この際に最大値を割り出す際に使用したMAX(売り上げ数)のように、選択したカラムの値をグループ別に集計する関数を集合関数という。

集合関数は以下の種類がある。


・MAX(カラム名) → 選択したカラムの最大値を割り出す。
・MIN(カラム名)  → 選択したカラムの最小値を割り出す。
・SUM(カラム名)  → 選択したカラムの合計値を割り出す。
・AVG(カラム名)  → 選択したカラムの平均値を割り出す。
・COUNT(*) → カラムの行数を割り出す。


ASを使用すると集合関数で割り出したカラムに新規で別名を付けることができるようになる。

表11<テーブル名:支店とパンの売り上げ数>をパンの種類別の支店における最大売り上げ数でグループ化したカラムに「最大売り上げ数」と名付けるSQL文と表を以下に記す。

(SQL文)   SELECT パン,MAX(売り上げ数) AS 最大売り上げ数
      FROM 支店とパンの売り上げ数
GROUP BY パン;

パン     | 最大売り上げ数
---------------+--------------------
カレーパン | 170
メロンパン | 180
チーズパン | 200
(表13<テーブル名:支店とパンの売り上げ数(グループ化・AS後)>)

HAVINGを使用すると「GROUP BYカラム名」で選択したグループに対して条件を付けることができる。

表11<テーブル名:支店とパンの売り上げ数>をパンの種類別の支店における最大売り上げ数に対して190以上の条件を付与したSQL文と表を以下に記す。

(SQL文)   SELECT パン,MAX(売り上げ数) AS 最大売り上げ数
      FROM 支店とパンの売り上げ数
GROUP BY パン HAVING  MAX(売り上げ数)>190;

パン      | 最大売り上げ数
--------------+------------
チーズパン | 200
(表14<テーブル名:支店とパンの売り上げ数(グループ化・AS・HAVING後)>)

3. エピローグ

このようにSQLはSQL文を使用してデータベースを編集したり、参照したりなどを可能にさせるため、データベースに携わる機会があった際は是非参考にすることを勧める。