格納したデータを引き出すしくみ〜SQL概説の例


図6−1 SQLによる発注書管理データベースのスキーマ定義
CREATE TALBE 取引先業者 (
	取引先ID  CHAR(5)	NOT NULL,
	会社名    CHAR(30),
	住所      CHAR(100),
	PRIMARY KEY	(取引先ID)  );

CREATE TABLE 発注書 (
	発注番号  CHAR(5)	NOT NULL,
	取引先ID  CHAR(5),
	扱い者    CHAR(40),
	PRIMARY KEY	(発注番号),
	FOREIGN KEY	(取引先ID) REFERENCES 取引先業者 );

CREATE TABLE 商品 (
	商品ID    CHAR(5)	NOT NULL,
	品名      CHAR(40),
	正価      DECIMAL(4),
	PRIMARY KEY	(商品ID)  );

CREATE TABLE 発注項目 (
	発注番号  CHAR(5)	NOT NULL,
	商品ID    CHAR(5)	NOT NULL,
	数量      INTEGER,
	単価      FLOAT,
	PRIMARY KEY	(発注番号,商品ID),
	FOREIGN KEY	(発注番号) REFERENCES  発注書,
	FOREING KEY	(商品ID)   REFERENCES  商品  );


図6−2 発注書管理データベースの表のタプル
アンダーラインのついている属性は、主キーであることを示している
取引先業者

	取引先ID	会社名		住所
	--------------------------------------------------
	c45		三木商店	千代田区神田神保町
	c61		菓子の山本	文京区根津

発注書

	発注番号	取引先ID	扱い者
	------------------------------------------
	3492		c61		井沢
	3494		c45		代田
	3499		c45		井沢

発注項目

	発注番号	商品ID		数量	単価
	--------------------------------------------
	3492		ch100		50	98
	3492		se100		30	218
	3492		ca103		50	92
	3492		ku101		100	185
	3494		ch100		100	95
	3494		ca103		50	87
	3494		ch200		20	145
	3494		ca142		100	80
	3494		ga107		50	77
	3499		ch100		40	99

商品

	商品ID		品名		正価
	--------------------------------------
	ch100		チョコレート	100
	se100		センベイ	250
	ca103		キャラメル	100
	ku101		クッキー	200
	ch200		棒チョコ	160
	ca142		キャンディ	100
	ga107		ガム		90

例6−1 表”発注項目”から単価が100円未満の項目の商品IDと数量と単価が知りたい
SELECT 商品ID,数量,単価
FROM 発注項目
WHERE 単価 < 100.0 ;

**結果**

商品ID	数量	単価
---------------------
ch100	50	98
ca103	50	92
ch100	100	95
ca103	50	87
ca142	100	80
ga107	50	77
ch100	40	99


例6−2 表”発注書”の取引先IDを会社名で置き換えたい
SELECT 発注番号,会社名,扱い者
FROM 取引先業者,発注書
WHERE 取引先業者.取引先ID = 発注書.取引先ID;
**途中のようす(直積)**

取引先ID  会社名 住所 発注番号  取引先ID  扱い者 
----------------------------------------------
c45 三木商店 ・・・  3492 c61 井沢
c61 菓子の山本  ・・・ 3492 c61 井沢←
c45 三木商店 ・・・ 3494 c45 代田←
c61 菓子の山本 ・・・ 3494 c45 代田
c45 三木商店 ・・・ 3499 c45 井沢←
c61 菓子の山本 ・・・ 3499 c45 井沢

**結果**

発注番号  会社名 扱い者
-----------------------
3494 三木商店 代田
3499 三木商店 井沢
3492 菓子の山本  井沢


例6−3 チョコレートを卸している業者の名前が知りたい
SELECT 会社名
FROM   取引先業者,発注書,商品,発注項目
WHERE  商品.品名 = 'チョコレート"
AND    取引先業者.取引先ID = 発注書.取引先ID
AND    発注書.発注番号 = 発注項目.発注番号
AND    発注項目.商品ID = 商品.商品ID ;

**結果**

会社名
-----------
三木商店
三木商店
菓子の山本


例6−4 表”発注項目”から、商品IDごとの発注数の合計を求めたい
SELECT 商品ID,SUM(数量)
FROM   発注項目
GROUP BY  商品ID ;

**結果**

商品ID		SUM(数量)
---------------------------
ca103		100
ca142		100
ch100		190
ch200		20
ga107		50
ku101		100
se100		30


例6−5 例6−4の問い合わせに、商品IDごとの発注数の合計が100個未満という条件をつけた
SELECT 商品ID,SUM(数量)
FROM   発注項目
GROUP BY  商品ID
HAVING    SUM(数量) < 100 ;

**結果**

商品ID		SUM(数量)
-------------------------
ch200		20
ga107		50
se100		30


例6−6 表”発注項目”から、同じ商品でありながら発注番号によって単価が違った商品IDを求めたい
SELECT DISTINCT  AA.商品ID
FROM   発注項目 AA, 発注項目 BB
WHERE  AA.商品ID = BB.商品ID
AND    AA.単価 <> BB.単価 ;

**結果**

商品ID
-----------
ca103
ch100


例6−7 1商品につき50個以上の発注をしたことのある扱い者の名前を求めたい
SELECT DISTINCT 扱い者
FROM   発注書
WHERE  発注番号 IN
     ( SELECT 発注番号
    FROM   発注項目
       WHERE  数量 >= 50 ) ;

**結果**

扱い者
----------
井沢
代田


例6−8 商品ごとに発注数の平均を求め、その商品について平均よりも多くの数量を発注したことのある扱い者の名前を求めたい
SELECT DISTINCT 扱い者
FROM   発注書
WHERE  発注番号 IN
     ( SELECT 発注番号
    FROM   発注項目 XX
       WHERE  数量 >
	     ( SELECT AVG(数量)
	       FROM   発注項目
	       WHERE  商品ID = XX.商品ID  )) ;

**結果**

扱い者
----------
代田