Powered by SmartDoc

12 (7/7):SQL実習

12.1 はじめに

宿題提出

12.1.1 グループ発表

なし.

12.1.2 復習

12.1.3 今回の学習目標

・リレーショナルデータベース言語SQLのDMLは,前章のリレーショナル代数の演算機能を備えている.

・SQLのDDLとDML実習

12.2 (PostgreSQLの)データ型

Postgres SQL92/SQL3 説明
bool boolean 論理ブール型(真/偽)
char(n) character(n) 固定長文字列
date date 時刻を除くカレンダー日付
float4/8 float(p) 精度pを持つ浮動小数点数
float8 real, double precision 倍精度浮動小数点数
int2 smallint 符号付き2バイト整数
int4 int, integer 符号付き4バイト整数
int4 decimal(p,s) p <= 9, s = 0である正確な数値
int4 numeric(p,s) p == 9, s = 0である正確な数値
money decimal(9,2) USスタイルの通貨
time time 時刻
timespan interval 汎用の時間間隔
timestamp timestamp with time zone 日付/時刻
varchar(n) character varying(n) 可変長文字列

日本語は1文字1-3バイト必要.

12.3 実習の仕方

学内限定公開のURLでSQLの実習ができるようになっています.URLやユーザ名やパスワードは授業で指示します.このURLで動作しているWebアプリケーションは,教科書7-2章「データベースとWWWの連携」の一例にもなっています.

また,コマンドラインでRDBMSをフル操作することもできます.

12.4 諸注意

SQLのひとつの命令文の最後にはセミコロンをつけます.改行しただけでは文の終わりとはみなされませんので,命令文の最後のセミコロンをお忘れなく.この性質を使って,適当に(SELECT句やFROM句などの単位で)改行した方が見やすくなります.

SQLでは大文字と小文字は区別されません.SELECTなどのあらかじめ予約されている語は大文字で書き,変数やテーブル名を小文字で書くのが良い作法とされているようですが,ここでは全部小文字で書いています.

12.5 典型的なSQL(DDL)

12.5.1 テーブル定義

CREATE TABLE 品物g02c999 (
 品名コード CHAR(5) PRIMARY KEY,
 品名 CHAR(20),
 値段 INTEGER
);

PRIMARY KEYという修飾語で主キーを指定しています.

12.5.2 テーブルの修正

ALTER TABLE 品物g02c999
ADD COLUMN 材質 CHAR(20);

ADDの他に,DROP,MODIFYなどもあります.

ALTER TABLE 品物g02c999
DROP COLUMN 材質;

12.5.3 テーブルの削除

これは最後にやります:

DROP TABLE 品物g02c999;

12.5.4 View表

RDBでは,仮想的な表を作ることも出来ます.View表はDBMSが作り出した仮想的な表で,外部スキーマをあらわします.

CREATE VIEW 推薦枠g02c099
AS SELECT 新卒個人データ.整理番号, 新卒個人データ.氏名, 採用内定者.出身大学
FROM 新卒個人データ, 採用内定者
WHERE 新卒個人データ.整理番号=採用内定者.整理番号;

VIEW表を削除するには,

DROP VIEW 推薦枠g02c099;

12.6 典型的なSQL(DML)

12.6.1 挿入

INSERT INTO 品物g02c999 VALUES ('00010', 'みかん', 200);
INSERT INTO 品物g02c999 VALUES ('00011', 'りんご', 400);
INSERT INTO 品物g02c999 VALUES ('00012', 'イチゴ', 600);

12.6.2 更新

UPDATE 品物g02c999 SET 値段=値段*0.9 WHERE 品名='みかん';

WHERE修飾を忘れると全部更新されてしまいます!

12.6.3 削除

DELETE FROM 品物g02c999 WHERE 品名='みかん';

WHERE修飾を忘れると全部消えてしまいます!

12.6.4 表示

SELECT *
FROM 品物g02c999;

品物テーブルの全データを表示します.

SELECT 品名, 値段
FROM 品物g02c999 
WHERE 値段<200;

WHERE句で選択条件を指定できます.

SELECT 品名
FROM 品物g02c999 
WHERE 値段 BETWEEN 200 AND 1000 AND 品名='イチゴ';
SELECT 品名
FROM 品物g02c999 
 ORDER BY 品名 ASC;

昇順表示がASC(ascendant),降順表示がDESC(descendent)です.

12.7 サブクエリー,計算,グループ化,結合

12.7.1 サブクエリー

SELECT * FROM 売上明細 WHERE 売上明細.商品ID=
(SELECT 商品ID FROM 商品 WHERE 商品名='マウス');

2段構えにばらして考えるとわかりやすい.

前段(2行目):
SELECT 商品ID FROM 商品 WHERE 商品名='マウス';は,003(マウスの商品ID)を返す.
後段(1行目):
SELECT * FROM 売上明細 WHERE 売上明細.商品ID='003';は,商品IDが003の売上明細を返す.
合体:
SELECT * FROM 売上明細 WHERE 売上明細.商品ID= (SELECT 商品ID FROM 商品 WHERE 商品名='マウス');は,商品IDを知らなくても,マウスの売上明細を調べることができる.

12.7.2 計算

SELECT AVG(単価) FROM 商品;
SELECT MAX(単価) FROM 商品;
SELECT MIN(単価) FROM 商品;
SELECT SUM(単価) FROM 商品;
SELECT COUNT(*) FROM 商品;

12.7.3 グループ化

SELECT 出身大学, COUNT(*) FROM 採用内定者 GROUP BY 出身大学;

12.7.4 結合

直積になってしまう:

SELECT * 
FROM 売上明細, 商品;

ので,等結合をとる.

SELECT * 
FROM 売上明細, 商品
WHERE 売上明細.商品ID=商品.商品ID;

今度は自然結合

SELECT 売上明細.受付ID, 売上明細.商品ID, 商品.商品名, 商品.単価, 売上明細.個数 
FROM 売上明細, 商品
WHERE 売上明細.商品ID=商品.商品ID;
SELECT U.受付ID, U.商品ID, S.商品名, S.単価, U.個数 
FROM 売上明細 U, 商品 S
WHERE U.商品ID=S.商品ID;

12.8 おわりに

12.8.1 課題

12.8.2 次回の学習目標

12.8.3 予習範囲