学校でSQLを使って、データベースを作るという期末課題がでました。
当方バイクの知識が少々あるため、バイクとバイク販売店というデータベースを作ってみることにしました。
バイクのデータ100個分とお店のデータは10個ほどなのですが、課題の条件の中にVIEWを作成すること、とあるのですが、VIEWとは何者なのでしょうか?
授業のページを見ても、難しい事しか載っていなくて困っています。
またテーブルの入力と、データの入力はなんとか覚えたのですが、VIEWの作り方は全く意味がわかりません。なので・・・
VIEWの意味と役割を教えてください。
初心者なので出来るだけわかりやすく教えていただけたら幸いです。
またVIEWの作成方法(create viewだとかなんとか・・・)を教えてください。
ちなみにテーブルデータとかはこんな感じに作っております。なのでこんな感じでVIEWの作成方法をご教授いただけたらありがたい次第です。
create table bike(
maker text,
name text,
size int,
nennshiki date,
kaizou text,
shaken text,
nedann float,
shop text
)
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
#1回答者です。
バイクは詳しくないので、自動車の例で説明します。
一つの表で、メーカー名や車種名などを管理すると、冗長な情報を管理することになってしまいます。
=====表定義例=====
create table メーカー
(メーカーid smallint primary key,
メーカー名 varchar(16));
create table 車種
(メーカーid smallint,
車種id smallint,
車種名 varchar(30),
primary key(メーカーid,車種id));
create table 型名情報
(メーカーid smallint,
車種id smallint,
型名 varchar(30) primary key,
年式 smallint,
排気量 smallint,
定価 int);
create index 型名情報idx on 型名情報(メーカーid,車種id);
=====ここまで=====
このように分けることで、メーカー名を車の情報分、持たなくてすみます。
仮にメーカー名が変更になった場合は、「メーカー」表のみを更新すればよくなります。
「マーチ」といった車種で、いろいろな年式があるでしょうから、車種名と年式といった情報も、表を分けます。
このようにして置くと、情報変更時の更新箇所が限られるし、メーカーの検索、車種名の検索といったことが容易に行えます。
=====データ例=====
insert into メーカー values(1,'TOYOTA');
insert into メーカー values(2,'NISSAN');
insert into メーカー values(3,'HONDA');
insert into 車種 values(1,1,'カローラ XXXX');
insert into 車種 values(1,2,'クラウン XXXX');
insert into 車種 values(2,1,'スカイライン XXXX');
insert into 車種 values(2,2,'マーチ');
insert into 車種 values(3,1,'アコード');
insert into 型名情報 values(1,1,'ABC-DEF-1234',2003,1600,150);
insert into 型名情報 values(1,1,'ABC-DEF-1240',2005,1600,160);
insert into 型名情報 values(1,2,'ABC-XYZ-1111',2005,2000,250);
insert into 型名情報 values(2,1,'EFGH-IJK-LMN-12',2002,2000,200);
insert into 型名情報 values(2,2,'HIJK-LMN-OPQ-20',2005,1600,120);
insert into 型名情報 values(3,1,'XY-ZABC-DE-12345',2003,2000,200);
=====ここまで=====
いよいよ検索です。
三つに分けた表から、メーカー名や車種名、年式といった情報を検索します。
=====検索SQL例=====
select x.メーカー名,y.車種名,年式,排気量,定価
from (メーカー as x
left join 車種 as y
on x.メーカーid=y.メーカーid)
left join 型名情報 as z
on y.メーカーid=z.メーカーid and y.車種id=z.車種id;
=====ここまで=====
少し複雑になってしまいました。
これをビューにして登録しておき、検索SQLは簡単に記述できるようにしてしまいます。
=====ビュー定義例1=====
create view 車検索
as
select x.メーカー名,y.車種名,年式,排気量,定価
from (メーカー as x
left join 車種 as y
on x.メーカーid=y.メーカーid)
left join 型名情報 as z
on y.メーカーid=z.メーカーid and y.車種id=z.車種id;
=====ここまで=====
このビューを利用して検索する場合、検索SQLは以下のように簡単に記述できます。
=====ビューを使った検索1=====
select * from 車検索;
=====ここまで=====
ビューで、特定のデータのみ見せる(他のデータは見せない)ことが可能です。
例えば上述のビューを「TOYOTA」の車種のみを見せるビューに変えてみます。
=====ビュー定義例2=====
drop view 車検索;
create view 車検索
as
select x.メーカー名,y.車種名,年式,排気量,定価
from (メーカー as x
left join 車種 as y
on x.メーカーid=y.メーカーid)
left join 型名情報 as z
on y.メーカーid=z.メーカーid and y.車種id=z.車種id
where x.メーカー名='TOYOTA';
=====ここまで=====
以下の検索(「ビューを使った検索1」と同じ)を行うと、今度は「TOYOTA」の車種しか見えなくなります。
=====ビューを使った検索2=====
select * from 車検索;
=====ここまで=====
このようにビューを使うと、特定のデータだけ見せたり、SQLを簡単にできるといったメリットがあります。
No.4
- 回答日時:
#1、#3回答者です。
ビューの役割や使い方を説明しましたが、ビューとは何かを説明していませんでしたね。
ビューというのは、実体(DB中のデータ)を持たない仮想の表です。
ビューを利用時に、ビューで参照している表から、実際のデータが持ってこられます。
使う目的や使い方は、既に回答の通りです。
No.2
- 回答日時:
viewは元ある表から生成された表のことです。
以下のような表があるとしましょう。名前は商品一覧です。商品名 |倉庫|単価
Tシャツ |A1|100
ジーンズ |A1|200
スカート |B1|150
キャップ |B2|50
これが元の表のときに、例えば倉庫A1にあるものだけを一覧にして見たい、と。そのときこのようにviewを作ります↓
create view 倉庫A1 as select * from 商品一覧 where 倉庫='A1';
すると、倉庫A1というviewが生成され、テーブル一覧\dでもselect * from 倉庫a1;でもビューの内容は確認できます。
viewは元の表のように削除はできないため、viewを消すときはviewごとdrop view 倉庫a1;で消します。
No.1
- 回答日時:
各列には、どのような値を入れるのですか?
textなんて使用するのはやめて、varchar(n)にしましょう。
→「文章をそのまま格納する」といった要件以外では、文字数の上限がある程度分かるはずです。また、textは近い将来、削除される予定です。
floatなんて使用するのはやめて、intやdecを使用しましょう。
→floatは概数であり、大きな数値を表せる半面、小数点以下の値は誤差が出ます。
ビューの使用目的は、幾つかあります。
(1)特定の列のみ見せる
(2)特定の行のみ見せる
(3)複雑なSQLをビューで吸収し、操作時のSQLは簡単に書けるようにする
などです。
わざわざ丁寧な回答ありがとうございます。
とても参考になりました。感謝いたします。
それにしても、少し覚えるまでに、時間がかかりそうですね。頑張って覚えたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- HTML・CSS HTML、cssのatomつぅーやつで 課題Ex1ってやつを表示させたいのですが、 私は課題Ex1が 2 2022/12/15 16:56
- システム 帳票出力を行う単体テストのテストデータが作成できません 2 2023/08/26 21:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
副問合せの書き方について
-
エクセルの関数について教えて...
-
SQL Left Join で重複を排除す...
-
LEFT JOIN と GROUP BY
-
SQLサーバから、項目の属性(型...
-
SQLにて特定の文字を除いた検索...
-
VIEWの元のテーブルのindexって...
-
バインド変数について
-
select文のwhere句に配列を入れ...
-
URL と行番号の指定
-
inner joinをすると数がおかし...
-
LEFT JOINが2つあるSQL文でAND...
-
ストアドのエラーについて
-
複数テーブルのGROUP BY の使い...
-
php+mysqlで複数選択削除について
-
主キーレコードを削除する場合
-
「SELECTして取得できない場合...
-
min句のSQLを改造し二番目に小...
-
UPDATE my_items SET item_name...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
SQLサーバから、項目の属性(型...
-
副問合せの書き方について
-
VIEWの元のテーブルのindexって...
-
エクセルの関数について教えて...
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
select文のwhere句に配列を入れ...
-
sqlで、600行あるテーブルを100...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
Unionした最後にGROUP BYを追加...
-
期間の重複を調べるSQL文につい...
-
クエリ表示と、ADOで抽出したレ...
-
Access パラメータクエリをcsv...
-
PL/SQLの変数について
-
MySQLのDATE型カラム値がNULLの...
-
php+mysqlで複数選択削除について
-
上位3位を求めるSQL文は?
おすすめ情報