pafuイーランスクール 学んでできる

メニューへ戻る

データベース言語SQL文(データベース)

学習のポイント

データベースからデータを操作する言語「SQL」を理解します。特に、レコードを抽出する「SELECT文」、レコードを登録する「INSERT」、レコードのフィールドを更新する「UPDATE」、レコードを削除する「DELETE」をしっかりとマスターしましよう。

1. データベース言語
データベース言語には、以下の種類があります。
データ定義言語(DDL) DDL 概念スキーマと外部スキーマを記述する言語
DSDL 内部スキーマを記述する言語
DMCL 内部スキーマを実際の装置や媒体に割り付けたり、バッファの制御を行う言語
データ操作言語(DML) -- 概念スキーマで、データ操作のための言語
SELECT文(抽出)、INSERT文(登録)、UPDATE(更新)、DELETE文(削除)
実際に規定されているデーベース言語として以下のものがあります。
SQL
関係データベースを扱うための専用言語。
NDL
ネットワーク型データベースを扱うための言語。
2. SQL文(スマーマの定義)
データベースの定義、表の定義、ビュー表の定義、権限の定義等があります。
DDL 記述
データベース全体の定義 CREATE SCHEMA
表の定義 CREATE TABLR
ビュー表の定義 CREATE VIEW
権限定義 GRANT
ここでは、表の定義について学習します。
CREATE TABLE 生徒テーブル
  (生徒番号 CHAR(3),
  氏名 NCHAR(20) NOT NULL,
  性別 NCHAR(1) NOT NULL,
   PRIMARY KEY (生徒番号),
   FOREIGN KEY (性別) REFERENCES 性別表 )

これは、生徒テーブルを以下のように定義しています。
生徒番号 氏名 性別
 101    太郎  男
 102    花子  女
生徒番号が「PRIMARY KEY」で主キーとして定義しています。
NOT NULL」はデータの空白不可としています。
FOREIGN KEY (性別) REFERENCES 性別表 )」は、性別は、性別表を参照する外部キーとして定義しています。
3. SELECT文1 基礎
SELECT文は1つまたは複数の表(テーブル)からレコードを抽出するものです。
以下のような[生徒テーブル]があるとします。
生徒番号 氏名 科目 得点

SELECT 列名 FROM 表名
SELECT 氏名 FROM 生徒テーブル
これで氏名のみのレコードが表示されます。

SELECT DISTINCT 科目 FROM 生徒テーブル
DISTINCTは重複するデータを取り除く機能があります。この場合は、科目で存在するもののみ1個ずつ表示されます。

SELECT 生徒番号,氏名 FROM 生徒テーブル
上記は複数の列である生徒番号と氏名を表示します。「,(カンマ)」で区切ります。

SELECT 氏名,得点 FROM 生徒テーブル ORDER BY 得点 DESC
上記は、得点の降順(高い順)に氏名と得点を表示します。また、得点の昇順の場合は「ASC」とします。これは、省略可能です。

SELECT 氏名 AS NAME FROM 生徒テーブル
上記の「AS」は、別の列名を付けるときに使用します。この場合は、氏名を「NAME」に変更しています。
4. SELECT文2 レコードの条件
SELECT 氏名,得点 FROM 生徒テーブル WHERE 得点>=50
これは、条件を指定しています。得点が50以上のレコードで氏名と得点を表示しています。条件の比較演算子には以下のものがあります。

= 等しい
< 大きい
> 小さい
<= 以上
>= 以下
<> 等しくない

また、論理演算としては以下のものがあります。

・AND かつ
・OR または
・NOT 否定

SELECT 氏名,得点 FROM 生徒テーブル WHERE 得点>=50 AND 得点<=80
これは、得点が50以上で80以下のレコードを抽出しています。
SELECT 氏名,得点 FROM 生徒テーブル WHERE 得点>=50 NOT 科目='数学'
これは、得点が50以上でかつ科目が数学でないレコードを抽出しています。
WHERE 以下の文についてかっこ()をつけて優先順位を指定できます

SELECT 氏名,得点 FROM 生徒テーブル WHERE 得点 BETWEEN 50 AND 70
これは、50以上70以下の条件を満たすレコードを抽出しています。

SELECT 氏名,得点 FROM 生徒テーブル WHERE 得点 IN(50,51,52)
これは、得点が50、51、52の条件を満たすレコードを抽出しています。

SELECT 氏名,得点 FROM 生徒テーブル WHERE 氏名 LIKE '山田%' 
これは、氏名が山田で始まるレコードを抽出しています。
LIKEの指定で「%」は任意の複数の文字で、「_」は任意の1文字を表現します。

SELECT 氏名,得点 FROM 生徒テーブル WHERE 得点 IS NULL
これは、得点が空白の行についてのレコードを抽出しています。
空白でない場合は、WHERE 得点 IS NOT NULLと指定します。
5. SELECT文3 関数
SELECT AVG(得点) FROM 生徒テーブル
これは、生徒テーブルの得点の平均値を返します。

SELECT AVG(得点) AS 平均値 FROM 生徒テーブル
とすると平均値という列名になります。SEL文では以下の関数が用意されています。
関数 内容
COUNT(*) 行(レコード)の個数
COUNT(列名) 列名で空白でない個数
SUM(列名) 列名の合計
AVG(列名) 列名の平均値
MAX(列名) 列名での最大値
MIN(列名) 列名での最小値
上記の関数を指定した場合は、結果として返されるレコード数は必ず1件です。
6. SELECT文4 テーブルの結合
次に[科目テーブル]を用意します。
科目 科目名

生徒テーブルと科目テーブルを結合します。
SELECT 生徒テーブル.氏名 科目テーブル.科目名
  FROM 生徒テーブル,科目テーブル
  WHERE 生徒テーブル.科目 = 科目テーブル.科目

これで生徒テーブルと科目テーブルの結合が出来ます。フィールドを指定する時は、
テーブル名.フィールド名とします。また、以下のような記述も可能です。

生徒テーブルと科目テーブルを結合します。
SELECT A.氏名 B.科目名
  FROM 生徒テーブル A ,科目テーブル B
  WHERE A.科目 = B.科目

これは、FROMの後のテーブル名の指定で、AやBのように別名をつけることで、これを利用することが出来ます。
7. SELECT文5 グループ集計
SELECT 科目 AVG(得点) AS 平均点 FROM 生徒テーブル GROUP BY 科目
これは、グループ集計を行っています。科目でグループ集計を行い、その平均点を表示しています。例えば、科目種類が5種類の時は、5レコードとなります。

SELECT 科目 AVG(得点) AS 平均点 FROM 生徒テーブル
    GROUP BY 科目 ORDER BY 平均点 DESC
これは、グループ集計を行い、かつ平均点の降順に表示しています。

SELECT 科目 AVG(得点) AS 平均点 FROM 生徒テーブル
    GROUP BY 科目 HAVING AVG(得点) >=60
これは、グループ集計の際の条件を指定しています。グループ集計(GROUP BY)を指定した時は、その条件を指定する時には「HAVING」を指定します。この場合は、平均点が60以上の集計値のレコードを返します。

SELECT 科目,SUM(得点+10) FROM 生徒テーブル
   GROUP BY 科目
   ORDER BY SUM(得点+10)

上記のように算術演算子を使用することも可能です。この場合は、科目でグループ集計して、得点+10で昇順に並び替えて、科目とその値を表示しています。
最術演算子は以下のものがあります。

・+ 足し算
・- 引き算
・* 乗算
・/ 割り算

8. SELECT文6 副問い合わせ(サブクエリー)
SELECT文の中でSELECT文を使用することを「副問い合わせ(サブクエリー)」と言います。
以下のテーブルを用意します。
[生徒科目テーブル]
生徒番号 科目

SELECT 氏名,科目 FROM 生徒テーブル
  WHERE 得点 >= (SELECT AVG(得点) FROM 生徒テーブル)

これは、条件の箇所で、生徒テーブルの得点の平均点を求め、平均点以上のレコードを返します。

SELECT 生徒番号,科目 FROM 生徒科目テーブル
  WHERE 生徒番号 IN (SELECT 生徒番号 FROM 生徒テーブル
                       WHERE 科目='数学')

INを使用した副問い合わせです。この場合は、生徒テーブルより科目が数学の生徒番号を取り出し、生徒番号が等しい生徒科目テーブルの氏名と得点を表示しています。

SELECT 生徒番号,科目 FROM 生徒科目テーブル
  WHERE EXISTS (SELECT * FROM 生徒テーブル
             WHERE 生徒テーブル.科目='数学' AND
                 生徒科目テーブル.生徒番号 = 生徒テーブル.生徒番号)

上記とまったく同様の処理を「EXISTS」を利用した場合の記述です。
「EXISTS」は結果を真か偽のどちらかで返します。 

SELECT 生徒番号,科目 FROM 生徒科目テーブル
  WHERE 生徒番号 = ANY (SELECT 生徒番号 FROM 生徒テーブル
                       WHERE 科目='数学')

上記とまったく同様の処理を「=ANY」を利用した場合の記述です。
「ANY」は副問い合わせの結果のいずれかと等しいことを意味しています。
※このようにSELECT文は、0件以上のレコードを返します。これを「結果セット」と言います。
9. SQL文(登録・更新・削除処理)
次のSQL文は結果セットを返すことはありません。データベースのテーブルの「登録」「更新」「削除」です。
INSERT INTO 生徒テーブル(生徒番号,氏名,科目,得点)
                    VALUE('111','太郎','数学',30)
上記は、生徒テーブルへVALUEで指定してレコードを1件登録しています。
●INSERT INTO 生徒テーブル SELECT * FROM 生徒新人テーブル
これは、生徒テーフルと生徒新人テーブルのフィールドがまったく同じ場合は、上記のように記述できます。生徒新人テーブルの全件を登録しています。

UPDATE 生徒テーブル SET 得点=51 WHERE 科目='数学'
これは、生徒テーブルで科目が数学の得点を51点に更新しています。

DELEITE FROM 生徒テーブル WHERE 氏名="太郎"
これは、生徒テーブルで氏名が太郎のレコードを削除しています。
WHERE以下が存在しないと全件削除となります。
メニューへ戻る

pafuイーランスクール

pafuイーランスクール 学んでできる