• ベストアンサー

学校の課題のSQLでVIEWの意味と作成方法がわかりません。

学校で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 ) よろしくお願いいたします。

  • kissiz
  • お礼率42% (307/718)

質問者が選んだベストアンサー

  • ベストアンサー
回答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を簡単にできるといったメリットがあります。

その他の回答 (3)

回答No.4

#1、#3回答者です。 ビューの役割や使い方を説明しましたが、ビューとは何かを説明していませんでしたね。 ビューというのは、実体(DB中のデータ)を持たない仮想の表です。 ビューを利用時に、ビューで参照している表から、実際のデータが持ってこられます。 使う目的や使い方は、既に回答の通りです。

  • cathy25
  • ベストアンサー率34% (8/23)
回答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;で消します。

kissiz
質問者

お礼

回答ありがとうございます。詳しい説明をいただき、なんとか少しづつ理解できそうです。 感謝いたします。

回答No.1

各列には、どのような値を入れるのですか? textなんて使用するのはやめて、varchar(n)にしましょう。 →「文章をそのまま格納する」といった要件以外では、文字数の上限がある程度分かるはずです。また、textは近い将来、削除される予定です。 floatなんて使用するのはやめて、intやdecを使用しましょう。 →floatは概数であり、大きな数値を表せる半面、小数点以下の値は誤差が出ます。 ビューの使用目的は、幾つかあります。 (1)特定の列のみ見せる (2)特定の行のみ見せる (3)複雑なSQLをビューで吸収し、操作時のSQLは簡単に書けるようにする などです。

kissiz
質問者

お礼

わざわざ丁寧な回答ありがとうございます。 とても参考になりました。感謝いたします。 それにしても、少し覚えるまでに、時間がかかりそうですね。頑張って覚えたいと思います。

関連するQ&A

  • データベースで「CREATE VIEW」で作成する「ビュー」の意義を教

    データベースで「CREATE VIEW」で作成する「ビュー」の意義を教えていただけますか? 以上、宜しくお願いします。

  • SQLのビューについて

    SQLServer:2005 OS:XP こんにちは。お世話になっています。 SQLServerでビューを作成し、テーブル「a」の構成データにプラスして、前月の1日を入力させようとしています。 ビューの列に↓を入力すると CAST(YEAR(DATEADD(m, - 1, GETDATE())) AS varchar) + CAST(MONTH(DATEADD(m, - 1, GETDATE())) AS varchar) + CAST('1' AS varchar) 「200811」と出力されるのですが、このデータを日付型にするにはどのような関数を追加したらいいのでしょうか? アドバイスをお願いいたします。

  • Laravel9のViewの作成について

    Laravel9でデータベースのテーブルのデータを表示させようとしています。 このページ( https://www.searchlight8.com/laravel-mysql-viewdata/ )にある「Viewの作成」なのですが、フォルダパスが書いていなくて、 どこに作ればよいか分かりません。 もし分かる方がいらっしゃいましたら、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • view作成時にデータ型を変更したい(SQLServer2000)

    何度もお世話になっております。 SQLServer2000にて、現状で300近くあるテーブルデータにText型であるフィールドが複数存在ます。 今回行ないたいことは、これらテーブルのVIEWを作成 → 各テーブル内で"Text型"に定義されているフィールドを"VarChar(max)型"に変更してVIEWを作成したいのです。 この作業をあまり労力をかけずにできれば一括で処理できる方法等ありませんでしょうか?どうかよろしくお願いします。

  • SQLServerでビューを作成する時のデータ型

    いつもお世話になっています。 SQLServer2005で複数テーブルを結合したビューを作成したいのですが フィールドの中にデータを演算した結果をセットしたいと思っています。 ここまでは問題なくできたのですが 演算した結果のデータ型が元のデータ型に依存しているのか floatになっていました。 実際には有効数字の観点から、intが適切なので データ型を指定したいのですが、その方法がよくわかりません。 ビューを作成する時に、データ型を指定する方法を教えていただきたいと思います。 よろしくお願いします。

  • ビューの作成で

    オラクルのテーブルデータでいつも使うデータをビューで作成したいと思っています。 ●テーブルデータ (No = 履歴順) 人 No 仕事 ----- --- -------------- 田中 1 青山商事 田中 2 山手商事 田中 3 寿商事 佐藤 1 関東北電気 鈴木 1 おにぎり工場 鈴木 2 せんべい工場 でそれぞれの人の最大Noと仕事をビューで作りたい ●ビューデータ (最大No = 最新の仕事) 人 No 仕事 ----- --- -------------- 田中 3 寿商事 佐藤 1 関東北電気 鈴木 2 せんべい工場 このようなビューを作成する場合のSQLをアドバイス下さい。 よろしくお願いします。

  • 二つのSQLサーバーのテーブルからビューを作成するには

    わけあってAサーバーとBサーバーに同じ項目構成の、同じ名前のテーブルがあります。只入っているデータが異なってます。 Aサーバーの"H"テーブルには 3行のデータがあります。   Bサーバーの"H"テーブルには2行のデータがあります。    ちなみにリンクサーバーはセットアップしてあり、二つのサーバーの間のセキュリティは確立してあります。 以上のような場合、ビューで二つの"H"テーブルのすべての行を表示できますか? 結合ではなく、AサーバーのテーブルのデータにBサーバーのテーブルのデータを追加した感じのビューを作りたいです。 どなたか知っている方がいましたら、教えてください。

  • SQLを使ったデータの作成

    コマンドプロントを使用し、SQLでデータベースを作成しています。 大きなテーブルを複数作り、複数のデータの作成をしています。 1.テーブルの方の定義を行い、キー項目を決める。 2.データは、一つ一つの項目ごとに、データの型やサイズを決める。 3.いくつか検索をした際に、ちゃんと結果の違いが確認できるように、100レコード程度のデータを作成する。 の制約で制作しています。 SQLに触って、まだあまり経っていないためどうプログラムを組めばいいのか分かりません。    テーブルの意味などや、キー項目、などの言葉の意味もあまり理解出来てません。 例えば データベース:ONLAINGAME テーブル1:MEMBER テーブル2:WEAPON を制作し、MENBERの中に50件、WEAPONの中に50件データを作ればいいのでしょうか。 データの作り方も少し心配です。 create table MENBERl(age int, name varchar(20) , primary key (aa); 上記の文を打ち、insert into MENBER ( age, name) values(20, 'takasi'); と書けば、制約通りデータが格納できるのでしょうか? 分かりずらいとは思いますが、詳しいお答えお願いいたします。

  • すでにあるsqlファイルを使用して、データベースを作成する方法

    すでにあるsqlファイルを使用して、データベースを作成する方法 もらったシステム(html,php,sqlで構成されるシステム)を自分の環境で動かそうとしているのですが、データベースを作成できないため、先に進むことが出来ず困っています。 もらったシステムには、テーブルのsqlファイルや、そのテーブルに入れるデータのsqlファイルがありました。 わかりにくい文章ですいません。 どなたかご存じの方、ご教授お願いいたします。 OS: CentOS5.3 postgresql8.1.18 apache2.2.3 php5.1.6

  • PerlでSQLiteのデータテーブルを作成し

    PerlでSQLiteのデータテーブルを作成し、作成したテーブルへデータを追加するようにしたいのですが、 下記のように作成し、実行すると、 テーブルの作成のみ、もしくは、既存のテーブルへのデータの追加のみは可能なのですが、 両方処理させると、テーブルの作成のみされて、作成されたテーブルの中身はカラのままです。 #データベースに接続 $dbh = DBI->connect("dbi:SQLite:dbname=c:\\database\\tyumon.db"); open (DATA,"c.dat"); $data = <DATA>; close(DATA); $data = $data+1; $table = "user"; $table .= $data; #テーブル作成実行 $hst = $dbh->do("CREATE TABLE '$table'(name text,area text,tel text,mail text,jikan text, hoka text)"); #レコードの追加(INSERT文の実行) $st = $dbh->do("insert into '$table' values('$data','$name','$area','$tel','$mail','$jikan','$hoka')"); 「c.dat」には、カウントされた数字が入っています。 テーブル名は「user」+カウント数字で作成しています。 データベースと、CGIの勉強を兼ねて作成しているもので、 根本的な間違いなどあるかもしれません。 どなたか、ご指摘いただければ幸いです。

    • ベストアンサー
    • CGI