データベース システムの概念 (中国語第 6 版) - 第 3 章のレッスンの質問への回答

入力するのは簡単ではありません。無料の「いいね!」をクリックしてください。

3.1 ユニバーシティ モードを使用して、SQL で次のクエリを記述します。(この本の Web サイト db-book.com で提供されているサンプル データを使用して、データベース上でこれらのクエリを実際に実行することをお勧めします。データベースのセットアップ方法とサンプル データのロード方法も説明されています。) (
建物、部屋番号、定員)

部門(部門名、建物、予算)

Course(course_id、title、dept_name、credits) コース情報

講師(ID、名前、部署名、給与) 講師情報登録

セクション(course_id, sec_id, 学期, 年, 建物, room_number, time_slot_id) コース情報

Teaches(ID、course_id、sec_id、学期、年) 指導情報

学生(ID、名前、部門名、合計クレジット)

(ID, course_id, sec_id, 学期, 年, 学年) コース選択情報を取得します

Advisor(s_ID, i_ID) カウンセラー情報

Time_slot(time_slot_id, day, start_time, end_time)

前提条件(コースID, 前提条件ID)

A. Comp.Sci. 部門が提供する 3 単位のコースの名前を見つけます。

タイトルの選択

フォームコース

Wheredept_name = 'Comp.Sci.' クレジット = 3;

B. アインシュタインという名前の教師が指導するすべての生徒の識別子を検索し、結果に重複がないことを確認します。

元の答え:

Selects_ID

From(名前、s_ID を選択

講師・アドバイザー

ここで、instructor.ID = Advisor.i_ID)

       ここで、名前 = 'アインシュタイン'

       修正された回答:

       修正理由:上記の審査はアインシュタインという教師をカウンセラーとして生徒を対象としたものです。この質問は、アインシュタインという名前の教師が提供するコースで教えられた学生について言及していると理解する必要があるため、SQL クエリ ステートメントは次のように変更されます。

       先生との関係:

              セクション Naturaljoin が Natural Join インストラクターを教える

              (course_id, sec_id, 学期, 年, 建物, room_number, time_slot_id, ID, 名前, 部門名, 給与)

       学生コース選択

              学生の自然な結合が必要

              (ID、名前、部門名、tot_cred、course_id、sec_id、学期、年、学年)

       コースを決定する主なコードは (course_id、sec_id、semester、year) です。

       したがって、コースのメイン コードを使用して教師の関係を生徒の関係に接続する必要があります。その後、特定の教師によって指導される生徒を選別することができます。

       完全な SQL ステートメントは次のとおりです。

       [distinctstudent.ID] を選択します。

       (セクション Naturaljoin が Natural Join インストラクターを教える) より

                     結合(学生の自然結合が必要)

                            (course_id、sec_id、学期、年) を使用する

       ここで、section.name = 'アインシュタイン';

C. 教師の最高給与を調べてください

set 比較ステートメントを使用して実装されます。

給与を選択

講師

Wheresalary >= all (給与を選択してください)

講師より);

集計関数を使用して実装します。

最大(給与)を選択してください

講師より;

D. 最も高い給与の教師をすべて検索します (同じ給与の教師が複数存在する場合があります)。

ID、名前を選択

講師より

Wheresalary = (max(salary) を選択)

講師より);

E. 2009 年秋に提供された各コース セグメントの登録者数を調べます。

元の答え:

selectcourse_id、count(固有ID)

Fromtake 自然結合セクション

ここで、semester = '秋'、年 = 2009

course_id ごとにグループ化します。

修正された回答:

selectcourse_id,sec_id,count(固有ID)

Fromtake 自然結合セクション

ここで、semester = '秋'、年 = 2009

course_id、sec_id ごとにグループ化します。

2009 年秋には同じコースが 2 回提供される可能性があり、コース セグメントを考慮する必要があるため、sec_id 属性のフィルタリングが追加されました。

F.2009 年の秋に提供されたすべてのコース セグメントから、コース登録者数の最大数を見つけます。

元の答え:

Withmax_student (course_id, sec_id,num) として

(course_id、sec_id、count (distinctID) を選択)

From は自然結合セクションを取得します

ここで、学期 = '秋'、年 = 2009

course_id、sec_idでグループ化

)

              最大(数値)を選択してください

              max_student より;

一時的な関係を定義するために with...as... を使用することに注意してください。

別の書き方を使う

     最大数を選択 (登録)

  From (登録としてカウント (固有 ID) を選択)

From は自然結合セクションを取得します

ここで、学期 = '秋'、年 = 2009

course_id、sec_id) でグループ化します。

G. 2009 年秋に登録者数が最も多かったコース セグメントを見つけます。

Withmax_student (course_id, sec_id,num) として

(course_id、sec_id、count (distinctID) を選択)

From は自然結合セクションを取得します

ここで、学期 = '秋'、年 = 2009

course_id、sec_idでグループ化

)

              コースID、秒IDを選択してください

              Frommax_student

              ここで、num = (max(num)を選択

max_student より);

3.2 テイク関係の文字成績から数値スコアへの変換を提供する、grade_points(grade, Points) という関係が与えられたとします。たとえば、「A」グレードは 4 ポイント、「A-」は 3.7 ポイント、「B+」は 3.3 ポイント、「B」は 3 ポイントなどに対応するように割り当てられます。ある科目(科目区分)において学生が取得した成績ポイント値は、学生が科目区分において取得した成績に相当する数値を単位数に乗じて表される得点として定義される。上記の関係と大学のスキーマを考慮して、次の各クエリを SQL で作成します。簡単にするために、no take タプルはグレードに関して null 値を取ると仮定できます。
A.学生が受講したすべてのコースに基づいて、ID 12345 の学生が取得した成績ポイントの合計を見つけます。

合計(クレジット*ポイント)を選択してください

From は自然結合コース自然結合 Grade_points を取得します

ここで、ID = '12345'

学生がコースを選択できないようにするには、上記の回答を次のように改善できます。

(合計(クレジット*ポイント)を選択してください

からは、自然結合コース、自然結合、grade_points を取得します

ID = '12345')

連合

(0を選択してください

生徒さんから

ここで、takes.ID = '12345' が存在しません (select*

テイクから

ここでは、.ID= '12345'));

結合演算の使用と存在検出の使用に注意してください。

B. 成績ポイントの合計を関連するコースの合計単位数で割ることにより、上記の学生の平均成績ポイント平均 (GPA) を求めます。

(合計(クレジット*ポイント))/(合計(クレジット))を選択します。

From は自然結合コース自然結合 Grade_points を取得します

ID = '12345';

C.各学生の ID と成績の平均を求めます。

IDを選択、(合計(クレジット*ポイント)) / (合計(クレジット))

From は自然結合コース自然結合 Grade_points を取得します

ID ごとにグループ化します。

3.3 ユニバーシティ モードを使用して、SQL で次の挿入、削除、および更新ステートメントを記述します。
A.Comp.Sci. 部門のすべての教師に給与を 10% 増額します。

インストラクターを更新する

給与設定 = 給与*1.1

Wheredept_name = 'Comp.Sci.';

B. 提供されていない (つまり、セクション関係に表示されていない) コースをすべて削除します。

コースから削除

Wherecourse.course_id がありません (course_id を選択してください)

フォームセクション);

C.tot_cred 属性の値が 100 を超えるすべての生徒を、同じ学部の給与 10,000 ドルの教師として挿入します。

インストラクターに挿入

SelectID、名前、部門名、10000

From学生

Wheretot_cred > 10000;

3.4 図 3-18 の保険会社データベースを考えてみましょう。下線が主キーです。このリレーショナル データベースに対して次の SQL クエリを作成します
2009 年にその車両で交通事故に遭った人の総数を求めます。

元の答え:

Selectcount (個別の driver_id)

参加した自然結合事故から

日付 = 2009;

回答を変更します:

時間(日付)は年(年)を表さないことに注意してください。そのため、答えを次のように修正します

Selectcount (個別の driver_id)

自然結合事故から

日付「2009-00-00」と日付「2009-12-31」の間の日付

B. 新しいインシデントをデータベースに追加し、必要な属性ごとに任意の値を設定します。

この質問では、最初にいくつかのパラメータを想定することができます。データベースの追加操作が完了した後、すべての属性を変更できます。

事故に巻き込まれる

       値(4007、'2009-09-01'、'バークレー')

参加者に挿入

       4007、c.license、P.driver_id、3000を選択します。

       From (人を p) 自然結合 (aso を所有) 自然結合 (車を c)

       ここで、p.name ='ジョーンズ';

C. 「ジョン・スミス」が所有するマツダを削除します。

車から削除

Wheremodel = 'Mazda' およびライセンス (ライセンスを選択)

自身の自然参加者から

ここで、名前 = 'ジョン・スミス');

本人(運転者id,氏名,住所)被保険者

車(免許証・車種・年式)保険付車

事故(報告番号,日付,場所) 事故情報

Owns(driver_id,license)被保険者と被保険車の関係

参加した事故(届出番号、免許証、運転者ID、損害賠償額)事故内容

3.5 点数 (ID、スコア) 間に関係があると仮定し、次の基準に基づいて学生を採点したいとします: スコア < 40 の場合は F、40 ≤ スコア < 60 の場合は C、60 ≤ スコア < 80 の場合、B を取得します。80 ≤ スコアの場合は A を取得します。SQL クエリを作成して、次の操作を完了します。
A. 得点関係に基づいて各生徒の成績を表示します。

IDを選択して、

              場合

                     スコアが 40 未満の場合は「F」

                     スコアが 60 未満の場合は「C」

                     スコアが 80 未満の場合は「B」

                     それ以外の場合は「A」

              終わり

フロムマーク;

B. 各レベルの生徒の数を求めます。

成績を (ID を選択、

              場合

                     スコアが 40 未満の場合は「F」

                     スコアが 60 未満の場合は「C」

                     スコアが 80 未満の場合は「B」

                     それ以外の場合は「A」

              成績として終了

マークより)

選択グレード数 (個別 ID)

フロムグレード

グループ別。

3.6 SQL の like 演算子は大文字と小文字を区別しますが、文字列の lower() 関数を使用すると、大文字と小文字を区別しない一致を実現できます。これがどのように機能するかを説明するには、大文字と小文字を区別せずに、名前に部分文字列「sci」が含まれるシステムを検索するクエリを作成します。
部門名を選択してください

所属部門

where lower(dept_name) は '%sci%' のようになります。

3.7 SQL クエリ
Selectdistinct p.a1を検討してください。

フロム、r1、r2

ここで、p.a1=r1.a1 または p.a1=r2.a1

このクエリはどのような条件で、r1 または r2 にある p.a1 値を選択しますか? r1 または r2 が空である可能性がある状況を注意深く調べてください。

P、r1、r2 が空ではありません

3.8 図 3-19 の銀行データベースを考えてみましょう。下線付きのキーが主キーです。このリレーショナル データベースに対して次の SQL クエリを作成します
銀行に口座はあるがローンを持っていないすべての顧客を見つけます。

元の回答

顧客名を選択してください

預金者から

顧客名が含まれていない場合 (顧客名を選択してください)

借り手から);

書き方を変える

(顧客名を選択してください

預金者から)

を除外する

(顧客名を選択してください

借主から)

Except 差分演算の使用に注意してください

B. 「Smith」と同じ都市、同じ通りに住んでいるすべての顧客の名前を見つけます。

元の答え:

顧客名を選択してください

お客様より

Where(customer_street,customer_city) = (customer_street,customer_city を選択してください)

お客様から

ここで、customer_name = 'Smith');

別の書き方:

F.顧客名を選択してください

From(顧客をF) 結合(顧客をS) using(ustomer_street,customer_city)

WhereS.customer_name = 'スミス';

C. 「ハリソン」に住む顧客が開設した口座があるすべての支店の名前を検索します。

別のブランチ名を選択してください

フロムアカウント ナチュラル ジョイン 預金者 ナチュラル ジョイン 顧客

Wherecustomer_city = 'ハリソン';

支店 (支店名、支店市、資産 アセット) 支店情報

お客様 (お客様名、お客様番地、お客様市区町村)お客様情報

ローン(ローン番号、支店名、金額)ローン情報

借り手 (顧客名、ローン番号) 貸し手情報

口座(口座番号、支店名、残高)口座情報

入金者(顧客名、口座番号)口座者情報

図 3-19

3.9 図 3-20 の従業員データベースを考えてみましょう。主キーに下線が付けられています。次のクエリごとに SQL 式を作成します:
Employee(employee_name,street,city)

勤務先(従業員名,会社名,給与)

会社(会社名,都市)

マネージャー(従業員名、マネージャー名)

図 3-20

A. 「First Bank Corporation」に勤務するすべての従業員の名前と居住地を調べます。

従業員名、都市を選択してください

従業員のナチュラルジョイントワークスより

ここで、 company_name = 'FirstBank Corporation';

B. 「First Bank Corporation」に勤務し、給与が 10,000 ドルを超えるすべての従業員の名前、番地、および居住地都市を検索します。

従業員名、番地、市区町村を選択してください

従業員のナチュラルジョイントワークスより

ここで、 company_name = 'FirstBank Corporation' および給与 >10000;

C.「First Bank Corporation」に勤務していないすべての従業員をデータベース内で検索します。

(従業員名を選択してください

社員より)

を除外する

(従業員名を選択してください

従業員のナチュラルジョイントワークスより

ここで、 company_name = 'FirstBank Corporation');

D.「Small Bank Corporation」の各従業員よりも高い給与を持つ従業員をデータベース内ですべて検索します。

従業員名を選択してください

作品から

ここで、給与 > (selectmax(給与)

作品から

ここで、 company_name = '小規模銀行会社'

company_name ごとにグループ化します);

E. ある企業が複数の都市に支店を持つことができるとします。「Small Bank Corporation」があるすべての都市にあるすべての会社を検索します。

元の回答

company_nameを選択してください

会社を設立する

都市のどこ (都市を選択してください)

会社から

ここで、 company_name = 'SmallBank Corporation');

       修正された回答

       元の回答で最後に生成された会社名には Small Bank Corporation が含まれますが、Small Bank Corporation は含めたくないかもしれません。

(会社名を選択してください

会社を設立する

都市のどこ (都市を選択してください)

会社から

ここで、 company_name = 'SmallBank Corporation'))

       を除外する

(会社名を選択してください

会社から

ここで、 company_name = '小規模銀行会社');

F. 従業員数が最も多い会社を見つけます。

A を (selectcompany_name, count(employee_name) を num として使用)

作品から

company_name ごとにグループ化)

       company_name、max(num) を選択してください

       から;

       別の書き方

       company_nameを選択してください

       作品から

       company_name ごとにグループ化する

       保有数 (employee_name) >= all(selectcount(employee_name)

作品から

company_name ごとにグループ化します);

G. 第一銀行株式会社の平均給与よりも平均給与が高い企業を見つけてください。

A を (会社名、avg(給与) を avg_salary として選択)

作品から

company_name ごとにグループ化)

       company_nameを選択してください

       から

       ここで、avg_salary > (avg_salary を選択します)

から

ここで、 company_name = '第一銀行株式会社');

3.10 図 3-20 のリレーショナル データベースを考慮して、次の各クエリの SQL 式を与えてください
「ジョーンズ」が「ニュータウン」市に住むようにデータベースを変更します。

       従業員を更新する

       都市を「ニュータウン」に設定します

       ここで、従業員名 = 'ジョーンズ';

B. 給与が 100,000 ドルを超えないすべての FirstBank Corporation マネージャーの給与は 10% 増加し、給与が 100,000 ドルを超えるマネージャーの場合は 3% のみ増加します。

       更新は T として機能します

       T.salary = t.salary *1.03 を設定します。

       ここで、T.employee_name の (selectmanager_name

経営者より)

                     そして T.company_name = 'FirstBank Corporation'

そしてt.salary >100000;

       更新は T として機能します

       T.salary = t.salary *1.1 を設定します。

       ここで、T.employee_name の (selectmanager_name

経営者より)

                     そして T.company_name = 'FirstBank Corporation'

そして、t.salary <=100000;

別の書き方

アップデート作品

給与を設定 = 給与*(ケース

給与>100000の場合は1.03

それ以外の場合 1.1)

ここで、employee_name は (manager_name を選択してください)

フロムマネージャー)

              And company_name = 'First BankCorporation';
——————————————
著作権に関する声明: この記事は CSDN ブロガー「ccChen1211」によるオリジナル記事であり、CC 4.0 BY-SA 著作権契約に従っています。元のソースとこの声明へのリンクが添付されています。
元のリンク: https://blog.csdn.net/LC_chentinghua/article/details/79891962

おすすめ

転載: blog.csdn.net/m0_55315930/article/details/120385814