データベース言語SQL文(データベース)
学習のポイント
データベースからデータを操作する言語「SQL」を理解します。特に、レコードを抽出する「SELECT文」、レコードを登録する「INSERT」、レコードのフィールドを更新する「UPDATE」、レコードを削除する「DELETE」をしっかりとマスターしましよう。
1. データベース言語 | ||||||||||||||
データベース言語には、以下の種類があります。
●SQL 関係データベースを扱うための専用言語。 ●NDL ネットワーク型データベースを扱うための言語。 |
||||||||||||||
2. SQL文(スマーマの定義) | ||||||||||||||
データベースの定義、表の定義、ビュー表の定義、権限の定義等があります。
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 かつ これは、得点が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文では以下の関数が用意されています。
|
||||||||||||||
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以下が存在しないと全件削除となります。 |