1月22日(金)2コマ目

今日、やったこと

確認テスト(おもにview)

今日の確認テスト

解答例をあげときます。

問1

とくにややこしいところはないと思います。

CREATE OR REPLACE VIEW 蔵書一覧(蔵書ID, 蔵書名, ジャンル名)

AS

SELECT 蔵書マスタ.ID, 蔵書マスタ.タイトル, ジャンルマスタ.ジャンル名

FROM 蔵書マスタ, ジャンルマスタ

WHERE 蔵書マスタ.ジャンルID = ジャンルマスタ.ID;


問2

未返却=返却日列がnull です。

ヒントに書いてますが、「xx列がnull」はwhere句で xx is null です。nullか否かの判断には残念ながら=は使えません。

create or replace view 貸出中一覧(貸出ID, 会員名, 蔵書名, 貸出日)

as

select 貸出.ID, 会員マスタ.名前, 蔵書マスタ.タイトル, 貸出詳細.貸出日

from 蔵書マスタ, 会員マスタ, 貸出, 貸出詳細

where 会員マスタ.ID=貸出.会員ID and 貸出.ID=貸出詳細.貸出ID and 

蔵書マスタ.ID=貸出詳細.蔵書ID and 

貸出詳細.返却日 is null;


問3

またまた未返却が出てきます。

create or replace view ジャンル別貸出中蔵書数(ジャンル名, 貸出冊数)

as

select ジャンルマスタ.ジャンル名, count(*)

from ジャンルマスタ, 蔵書マスタ, 貸出詳細

where ジャンルマスタ.ID=蔵書マスタ.ジャンルID and 

蔵書マスタ.ID=貸出詳細.蔵書ID and 返却日 is null

group by ジャンルマスタ.ジャンル名;


問4

create or replace view 会員別貸出中蔵書数(会員名, 貸出蔵書冊数)

as

select 会員マスタ.名前, count(*)

from 会員マスタ, 貸出, 貸出詳細

where 会員マスタ.ID=貸出.会員ID and 貸出.ID=貸出詳細.貸出ID

group by 会員マスタ.名前;


問5

create or replace view 蔵書別貸出回数(蔵書名, 貸出回数)

as

select 蔵書マスタ.タイトル, count(*)

from 蔵書マスタ, 貸出詳細

where 蔵書マスタ.ID=貸出詳細.蔵書ID

group by 蔵書マスタ.タイトル;


問6

既存のビューの置き換えです。
ビューの変更はalter viewではなく、create or replace view です。

create or replace view 蔵書別貸出回数(蔵書名, ジャンル名, 貸出回数)
as
select 蔵書マスタ.タイトル, ジャンルマスタ.ジャンル名, count(*)
from 蔵書マスタ, ジャンルマスタ, 貸出詳細
where 蔵書マスタ.ID=貸出詳細.蔵書ID and 
蔵書マスタ.ジャンルID=ジャンルマスタ.ID
group by 蔵書マスタ.タイトル, ジャンルマスタ.ジャンル名;

おまけ count()の動き

採点して、count()関数の使い方に注意してほしいと思いました。
以下の商品マスタテーブルがあります。
ID商品名定価
1うどん500円
2冷やし中華
3カレーうどん700円
4なべ焼きうどん1000円
5冷やしうどん


このテーブルに対してcount()関数の引数が異なる2種類のSQLを実行してみます。

①count(*)

SELECT count(*) 
FROM 商品マスタ;

行数が表示されます。結果は5です。

②count(ID)

SELECT count(ID)
FROM 商品マスタ;

ID列の行数を数えます。結果は5です。

③count(定価)

SELECT count(定価)
FROM 商品マスタ;

商品マスタは5行ですが、定価列がnullな行が2行あります。
よって、結果は3になります。

count()関数は引数の指定方法で行の数え方が異なります。
  • count(列名)は指定列の値がnullではない行数を数えます。
  • count(*)は行の各列の値が1つでもnullではない行数を数えます。

一般的に単純に行数を数える場合はcount(*)を使います。

コメント

このブログの人気の投稿

1月15日(金)2コマ目

11月27日(金)2コマ目

1月29日(金)2コマ目