• ベストアンサー

データベースの問題

 (テーブル名)     (フィールド名)   学生表       番号,氏名,電話番号,アドレス,コースコード,出身県コード   コース表     コースコード,コース名   出身県表      出身県コード,出身県名 *コースコードは2文字で、経営コース(BM)、会計コース(AC)、情報コース(IS)、国際コース(IB) *出身県コードは2文字とし、データ入力時に各自定義するものとします。 ●上記のようなテーブルからなるデータベースを作成したいのですが、 (1)各テーブルの基本キーを教えてください。また、外部キーがあれば、その項目名と、その外部キーによって関係付けられているテーブル名を教えてください。  (2)各項目に適するデータ型を決めて、このデータベースのデータ定義をどのようなSQL-DDLで記述すればよろしいのでしょうか? ●このデータベースを用いて、つぎの検索を行うためのSELECT文をSQL-DMLでの記述の仕方を教えてください。 (3) 学籍番号、氏名、電話番号からなる表Aを作る。 (4) コース名、学籍番号、氏名からなる表Bを作る。 (5) 学籍番号、氏名、メールアドレス、出身県名からなる表Cを作る。 (6) 自分と同じコースの人の氏名とメールアドレスからなる表Dを作る。 (7) 学籍番号、氏名、コース名、出身県名からなる表Eを作る。 ちなみに、自分の解答は下記のようになったのですが、間違っている部分があるかと思うのでご指摘おねがいします。 (1) (テーブル名) (主キー)   (外部キー)    (外部キーによって関連付けられるテーブル)    学生表       番号    コースコード   コース表(コースコード)                     出身県コード   出身県表(出身県コード)        コース表    コースコード    なし        出身県表    出身県コード    なし (2)<データ定義(SQL-DDL)>  CREATE SCHEMA  AUTHORIZATION HAMADA  CREATE TABLE 学生表 (番号      CHAR(10) NOT NULL PRIMARY KEY,  氏名      CHAR(20),  電話番号   CHAR(30),  アドレス    CHAR(30),  コースコード CHAR(2) NOT NULL REFERENCES コース表)  出身県コード CHAR(2) NOT NULL REFERENCES 出身県表)  CREATE TABLE コース表 (コースコード CHAR(2) NOT NULL PRIMARY KEY,  コース名   CHAR(20) NOT NULL )  CREATE TABLE 出身県表 (出身県コード CHAR(2) NOT NULL PRIMARY KEY,   出身県名   CHAR(20) NOT NULL ) (3) SELECT 番号, 氏名, 電話番号 FROM 学生表 INTO 表A (4) SELECT コース名, 番号, 氏名 FROM 学生表, コース表 INTO 表B WHERE 学生表, コースコード = コース表, コースコード (5) SELECT 番号, 氏名, アドレス, 出身県名 FROM 学生表, 出身県名 INTO 表C WHERE 学生表, 出身県コード = 出身県表, 出身県コード (6) SELECT 氏名, アドレス FROM 学生表, コース表 INTO 表D WHERE 学生表, コースコード = コース表, コースコード AND コース名 = "情報コース" (7) SELECT 番号, 氏名, コース名, 出身県名 FROM 学生表, 出身県名 INTO 表E WHERE 学生表, 出身県コード = 出身県表, 出身県コード AND 学生表, コースコード = コース表, コースコード

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

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

テーブル設計に問題があります 学生とコースとは多対多の関係にあるはずですから   学生表       学生番号*,氏名,電話番号,アドレス,出身県コード   コース表     コースコード*,コース名   出身県表      出身県コード*,出身県名   受講状況     学生番号*、コースコード* のようにしなければなりません 主キーは*を付加したものです これで疑問点はほとんど解消するはずですよ

その他の回答 (2)

回答No.2

連投すいません。 (4),(5),(7)ですが、外部結合にしたほうがよろしいかと思います。 コース表,出身県表に存在しないものは行が表示されなくなってしまいますので。 ※表A等は用意されているものとして考えていいのでしょうか? 表がなければエラーになってしまうし、INTO句って必要なのかな?と思ってしまったもので^^;

hamasaki--
質問者

補足

表は用意されているものとして考えてくださって結構です。 なので、INTO句は必要になります。

回答No.1

(3)以降ですが、INTOの位置が違う気がします。 FROM句の前じゃないでしょうか? SELECT 番号, 氏名, 電話番号 INTO 表A FROM 学生表

関連するQ&A

  • 同じ表を複数回結合する場合

    例えば、名前、出身県、現住所 のような表があります。 出身県と現住所は県名マスターを参照したいのですが、 select (名前、 県名マスター.県名 as 出身県、 県名マスター.県名 as 現住所 from 人名表 p left join 県名マスター k on p.出身県 = k.コード) left join 県名マスター on p.現住所 = k.コード; としたのですが、出身県も現住所も同じになってしまいます。 どのような結合が良いのでしょうか?  

  • データベース

    [表]社員 と [表]組織 SQLと関係代数で記述して、結果を導出表として作成したいのですが・・・ 「社員」....................................................│..............「組織」 [社員ID]...[名前]....[年収]...[課ID]............│........[課ID].....[課名].....[課長] [1001].....[浅野]....[800]....[D].............. │..........[D].........[設計].....[1001] [1002].....[坂口]....[600]....[D]...............│..........[S].........[営業]......[1003] [1003].....[山口]....[800]....[S]...............│..........[P].........[社長室]...[NULL] [1004].....[森]........[900]....[S] [1005].....[田中]....[700]....[S] [1006].....[山田]....[600]....[NULL] 「表」社員を定義する。 CREATE TABLE 社員 ( 社員ID CHAR(4)    NOT NULL , 名前   NCHAR VARYING(20) , 年収  INTEGER , 課ID CHAR(1) , PRIMARY KEY (社員ID) , FOREIGN KEY (課ID) PEFERENCES 組織) 表「組織」を定義する CREATE TABLE 組織 ( 課ID CHAR (1) NOT NULL , 課名  NCHAR (10) , 課長  CHAR (4) , PRIMARY KEY (課 ID) , FOREIGN KEY (課長)  REFERENCES 社員) 1)表「社員」から年収800万未満の社員のすべての情報が知りたい 2)表「社員」と表「組織」から課名が設計である社員の社員IDと名前、課名を知りたい このように「データベース」という本に問題があるんですがわかります方、教えていただけませんでしょうか。 表など見にくいかとは思いますが、宜しくお願い致します。

  • データベース(アクセス)の問題

    【テーブル名】       【フィールド(項目)名】  履修表      学籍番号,授業コード,履修年度,成績  科目表      授業コード,科目名,教員コード,単位  教員表      教員コード,教員名 *授業コードは数字4桁で、「曜日・時限・コード」からなる。曜日は月~金に1~5の数字を割り当 て、コードは時間割に記載してある2桁の数字とする。 例) データベース論: 2363 *教員コードは4文字とし、データ入力時に各自定義しなさい。 【質問】 ●アクセスで上記のテーブルを作成する場合、追加する3つのテーブルの基本キー、連結キー、外部キー、また、リレーションシップで結ばれるテーブルを示す場合、下記のような解答で合っていますでしょうか? 間違いの指摘をお願いします! 【自分の解答】  【テーブル名】  【基本キー】   【連結キー】        【外部キー】    【リレーションシップで結ばれ                                                     るテーブル】        ・履修表       学籍番号     授業コード                      科目表  ・科目表       授業コード    授業コード・教員コード   授業コード      履修表・教員表 ・教員表       教員コード    教員コード          教員コード      科目表

  • データベースの考え方で。

    データベースの考え方、で教えてください。 路線検索と、路線にひもづく駅名の時刻表を表示させる、データベースを作りたいと思っているのですが、 その場合、考え方としては、以下のような感じになるのでしょうか? 路線名のtbl sql文: create table transit ( id integer not null, name varchar(20) not null ); 路線名tblにひもづく、駅名tbl sql文: create table station ( id integer not null primary key, transit_id integer not null, name varchar(20) not null ); 駅名tblにひもづく、時刻表tbl sql文: create table timetable ( id integer not null primary key, station_id integer not null, hour integer not null, minute integer not null ); 表示パターンとしては、 ================================= ○○線: XX駅 6:10 20 7:30 55 . . . . . . 22:15 36 ================================== のような感じです。 よろしくお願いします。

  • リレーショナル型データベースについて

     このような問題についてです。  以下に示す学生の成績表をリレーショナル型データベースで管理することとした。第3正規化の結果できあがるリレーションのスキーマを表の下に示した「スキーマの表現例」に倣って記述しなさい(1つとは限らない)。正規化されたリレーションスキーマの名称は適切なものを指定すること。また、主キーには○を施すこと。なお、学籍番号、科目番号は、それぞれ学生と科目を一意に識別する値である。学生は1つの学部に所属している。学部名は一意であり、所在地も学部によって一意に決まっているものとする。担当科目教員も課目によって一意に決まっているものとする。 成績表 (学籍番号、学生氏名、所属学部名、学部所在地、科目番号、科目名、担当教員名、成績) ※スキーマ表現例  商品を表すリレーションが3つの属性、商品コード、商品名、価格から構成されているとき、「商品(商品コード、商品名、価格)」と表す。ここで、商品コードが主キーである。 自分なりに考えた答えがこれです。 学生(○学籍番号、学生指名、所属学部名) 学部(○所属学部名、学部所在地) 科目(○科目番号、科目名、担当教員名) 成績(○学籍番号、○科目番号、成績) になりました。これでよいでしょうか。よろしくお願いします。

  • ACCESSについて

    Accessの入力フォームについて教えてください。 現在のテーブル構成の一部↓ [学生]テーブル〔主キー:学生コード〕 学生コード 氏名 コースコード [コース]テーブル〔主キー:コースコード〕 コースコード コース名 現在入力フォーム作成に当たって 入力されるテーブルには事前に学生コードだけは全て はいっています。 入力フォーム上で学生コードに対応する氏名を表示することはできたのですが、コース名を表示させたいのですができません。 誰かわかる人がいれば是非ご教授いただきたいのですが よろしくお願いいたします。

  • 同じ表内の比較

    oracle SQLに関する質問なのですが 社員マスタという表の中に 社員コード、社員名、上司、給料 という列があります。 上司より給料の低い社員名を検索する場合どうしたらよいでしょうか。 列 社員コード→NOT NULL CHAR(5) 社員名→NOT NULL VARCHAR2(20) 上司→CHAR(5) ※上司の社員コードが入ります。 給料→NUMBER(7) よろしくお願いします。

  • 漢字名のテーブルとカラムのCREATE TABLEについて

    Oracle9iで以下のCREATE文を実行しようと思っています。 漢字名のテーブルで、漢字名のカラムのあるCREATE文です。 SQL> CREATE TABLE "TAB_あいう"( 2 "かきコード" varchar2(5) NOT NULL , 3 "くけ開始月" varchar2(2) NOT NULL , 4 "フラグ" char(1) NOT NULL , 5 "さCD" char(6) NOT NULL , 6 "日時" date NOT NULL , 7 canstraint PK_FISCALTERM primary key ("かきコード")); canstraint PK_FISCALTERM primary key ("かきコード"))                            * 行7でエラーが発生しました。: ORA-00907: 右カッコがありません。 しかし、 ORA=00907;右カッコがありません。といわれてしまいます。 見た目、右かっこはあります。 なにか、お作法的なものがあるのでしょうか?

  • データベース:二つのテーブルの繋ぎ方

    私(あなた)が検査担当者だとします。 そして、測定担当者から CREATE TABLE measurement ( lot VARCHAR(10) NOT NULL, test_id INTEGER NOT NULL, data NUMERIC(17,7), PRIMARY KEY(lot, test_id) ); という、あるロットでのテスト番号に対する測定値データが送られてきたとします。 そして、設計担当者から CREATE TABLE spec ( test_name VARCHAR(10) NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_name) ); という、テスト項目名に対する上限・下限の仕様データが送られてきたとします。 ここで、テスト番号とテスト項目名は同じ数だけあって、お互いが一致するように同じ順番で並んでいるとします。 この二つのテーブルを使って、測定値が範囲内か範囲外かを調べるのが目的です。 この場合、どうやって二つのテーブルを繋ぐのが一般的ですか? 自分の考えだと、一旦、specテーブルにtest_idを加えて CREATE TABLE spec ( test_id INTEGER NOT NULL, test_name VARCHAR(10) NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_id, test_name) ); とするのですが、第二(第三?)正規化に基づいて CREATE TABLE spec ( test_id INTEGER NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_id) ); と CREATE TABLE test ( test_id INTEGER NOT NULL, test_name VARCHAR(10), PRIMARY KEY(test_id) ); の二つに分けるのかな、と思っています。 正規化の観点から言うと、きっとこれが正しいのかなと思っています。 でも、元々、specテーブルにはテスト項目名が入っていたのでテスト項目名と上限・下限が一目で分かっていたのに、このように分けると、いちいちspecテーブルでテスト番号を確認してから、testテーブルでそのテスト番号に該当するテスト項目名を見つけなくてはならなくなってしまいます。クエリーでの検索もJOINをしなければならなくなって遅くなりませんか? 敢えて正規化しないでおく、なんて手段もありますか? こんな場合、皆さんならどうしますか? 「こうするように決められている」なのか、 「ああもできるし、こうもできるんですが、どっちでもいいですよ」なのか、 温度差みたいなものもできれば知りたいです。

  • データベースの検索について

    ORACLE8.0.5において 日付を管理するテーブル(Work)において <構成>  workday char(08) not null (key) work7day char(01) workym char(06) 上記の構成のテーブルにおいて 指定日付(例:20020125)から、5レコード目の データを抽出するときの、SQLの組み方を教えてください。 PLSQLを使用して、上記のDBをアクセスし、5レコード目 (レコードが持っている営業日)を抽出しようとしています。よろしくお願いします。