Tippen ist nicht einfach, klicken Sie auf ein kostenloses „Gefällt mir“! ! !
3.1 Schreiben Sie im Universitätsmodus die folgende Abfrage in SQL. (Es wird empfohlen, diese Abfragen tatsächlich in einer Datenbank auszuführen und dabei die Beispieldaten zu verwenden, die wir auf der Website des Buchs, db-book.com, bereitstellen. Dort finden Sie auch Anweisungen zum Einrichten einer Datenbank und zum Laden der Beispieldaten.) Klassenzimmer (
Gebäude, Raumnummer, Kapazität)
Abteilung(Abteilungsname, Gebäude, Budget)
Kursinformationen (Kurs-ID, Titel, Abteilungsname, Credits).
Registrierung von Lehrerinformationen (ID, Name, Abteilungsname, Gehalt) für den Lehrer
Abschnitt (Kurs-ID, Sek.-ID, Semester, Jahr, Gebäude, Raumnummer, Zeitfenster-ID) Kursinformationen
Lehrt (ID, Kurs-ID, Sek.-ID, Semester, Jahr) Lehrinformationen
Student (ID, Name, Abteilungsname, Gesamtkredit)
Nimmt Kursauswahlinformationen (ID, Kurs-ID, Sek.-ID, Semester, Jahr, Note) entgegen
Informationen zum Berater (s_ID, i_ID).
Time_slot(time_slot_id, day, start_time, end_time)
Prereq(course_id, prereq_id)
A. Suchen Sie nach dem Namen eines 3-Credit-Kurses, der von der Comp.Sci.-Abteilung angeboten wird.
Titel auswählen
Formkurs
Wheredept_name = 'Comp.Sci.' und Credits = 3;
B. Finden Sie die Kennungen aller Schüler, die von einem Lehrer namens Einstein unterrichtet wurden, und stellen Sie sicher, dass die Ergebnisse keine Duplikate enthalten.
Ursprüngliche Antwort:
Wählt_ID aus
Von(Name auswählen, s_ID
Formlehrer, Berater
Whereinstructor.ID = Advisor.i_ID)
Wobei Name = 'Einstein'
Geänderte Antwort:
Grund für die Änderung: Das obige Screening richtet sich an Schüler unter dem Namen eines Lehrers namens Einstein als Berater. Die Frage sollte so verstanden werden, dass sie sich auf die Schüler bezieht, die in dem von dem Lehrer namens Einstein angebotenen Kurs unterrichtet werden. Daher wird die SQL-Abfrageanweisung wie folgt geändert:
Lehrerbeziehung:
Abschnitt naturaljoin unterrichtet Natural-Join-Lehrer
(Kurs-ID, Sek.-ID, Semester, Jahr, Gebäude, Raumnummer, Zeitfenster-ID, ID, Name, Abteilungsname, Gehalt)
Kursauswahl für Studierende
Studentnatural Join Takes
(ID, Name, Abteilungsname, Gesamtkredit, Kurs-ID, Sek.-ID, Semester, Jahr, Note)
Der Hauptcode, der einen Kurs bestimmt, ist (Kurs-ID, Sek_ID, Semester, Jahr).
Daher muss die Lehrerbeziehung mithilfe des Hauptcodes des Kurses mit der Schülerbeziehung verknüpft werden. Anschließend können die von einem bestimmten Lehrer unterrichteten Schüler herausgefiltert werden.
Die vollständige SQL-Anweisung lautet wie folgt:
Wählen Sie „distinctstudent.ID“ aus
Von (Abschnitt naturaljoin unterrichtet Natural-Join-Ausbilder)
Beitreten (Student nimmt natürlichen Beitritt an)
Verwendung von (Kurs-ID, Sek.-ID, Semester, Jahr)
Wo section.name = 'Einstein';
C. Finden Sie das höchste Gehalt für Lehrer heraus
Implementiert mit Set-Vergleichsanweisungen:
Gehalt auswählen
Formlehrer
Wheresalary >= all (Gehalt auswählen
VonAusbilder);
Implementiert mit Aggregatfunktionen:
Wählen Sie max(Gehalt)
VonAusbilder;
D. Finden Sie alle Lehrer mit dem höchsten Gehalt (es kann mehr als einen Lehrer mit demselben Gehalt geben).
SelectID, Name
Vom Lehrer
Wheresalary = (max(Gehalt) auswählen
VonAusbilder);
E. Finden Sie die Anzahl der Teilnehmer für jeden im Herbst 2009 angebotenen Kursabschnitt.
Ursprüngliche Antwort:
Selectcourse_id, count(eindeutige ID)
Fromtakes Natural-Join-Abschnitt
Dabei ist Semester = „Herbst“ und Jahr = 2009
Group bycourse_id;
Geänderte Antwort:
Selectcourse_id,sec_id, count(eindeutige ID)
Fromtakes Natural-Join-Abschnitt
Dabei ist Semester = „Herbst“ und Jahr = 2009
Group bycourse_id, sec_id;
Filterung für das Attribut sec_id hinzugefügt, da derselbe Kurs im Herbst 2009 möglicherweise zweimal angeboten wird und wir das Kurssegment berücksichtigen müssen.
F. Von allen im Herbst 2009 angebotenen Kursabschnitten finden sich die meisten Kursteilnehmer.
Ursprüngliche Antwort:
Withmax_student (course_id, sec_id,num) as
(Wählen Sie course_id,sec_id, count (distinctID)
Von nimmt natürlichen Join-Abschnitt
Wobei Semester = „Herbst“ und Jahr = 2009
Gruppieren Sie nach Kurs-ID, Sek.-ID
)
Wählen Sie max(num)
Von max_student;
Beachten Sie die Verwendung von with...as... zum Definieren temporärer Beziehungen
Verwenden Sie eine andere Schreibweise
Wählen Sie max. (Einschreibung)
Von (Wählen Sie die Anzahl (eindeutige ID) als Registrierung aus
Von nimmt natürlichen Join-Abschnitt
Wobei Semester = „Herbst“ und Jahr = 2009
Gruppieren nach course_id, sec_id);
G. Finden Sie den Kursabschnitt mit den meisten Einschreibungen im Herbst 2009.
Withmax_student (course_id, sec_id,num) as
(Wählen Sie course_id,sec_id, count (distinctID)
Von nimmt natürlichen Join-Abschnitt
Wobei Semester = „Herbst“ und Jahr = 2009
Gruppieren Sie nach Kurs-ID, Sek.-ID
)
Selectcourse_id, sec_id
Frommax_student
Wobei num = (select max(num)
Von max_student);
3.2 Angenommen, Sie erhalten eine Beziehung grade_points(note, Punkte), die die Umrechnung von Buchstabennoten in das Verhältnis zu numerischen Punktzahlen ermöglicht. Beispielsweise kann die Note „A“ 4 Punkten, „A-“ 3,7 Punkten, „B+“ 3,3 Punkten, „B“ 3 Punkten usw. zugeordnet werden. Der Notenwert, den ein Student in einem bestimmten Kurs (Kursabschnitt) erhält, ist definiert als die Punktzahl, die sich aus der Anzahl der Credits multipliziert mit der Zahl ergibt, die der Note entspricht, die der Student im Kursabschnitt erhalten hat. Schreiben Sie angesichts der oben genannten Beziehungen und unseres Universitätsschemas jede der folgenden Abfragen in SQL. Der Einfachheit halber kann davon ausgegangen werden, dass kein Tupel einen Nullwert für die Note annimmt.
A. Ermitteln Sie die Summe der Notenpunkte, die der Student mit der ID 12345 auf Grundlage aller vom Studenten belegten Kurse erreicht hat.
Summe auswählen (Credits*Punkte)
Von nimmt Natural Joincourse Natural Join Grade_Points
Wobei ID = '12345'
Um zu verhindern, dass der Student irgendwelche Kurse wählt, kann die obige Antwort wie folgt verbessert werden:
(Summe auswählen(Credits*Punkte)
Von nimmt Natural Join Kurs Natural Join Grade_Points
Wobei ID = '12345')
Union
(Wählen Sie 0
Vom Studenten
Wo nimmt.ID = '12345' und existiert nicht (wählen Sie *
Aus Takes
Wo nimmt.ID= '12345'));
Beachten Sie die Verwendung von Union-Operationen und die Verwendung der Existenzerkennung
B. Ermitteln Sie den durchschnittlichen Notendurchschnitt (GPA) der oben genannten Studenten, indem Sie die Summe der Notenpunkte durch die Gesamtzahl der Credits in den relevanten Kursen dividieren.
Wählen Sie (Summe (Credits*Punkte))/ (Summe(Credits))
Von nimmt Natural Joincourse Natural Join Grade_Points
Wobei ID = '12345';
C. Ermitteln Sie den Durchschnitt der Ausweise und Notenwerte jedes Schülers.
ID auswählen, (Summe(Credits*Punkte)) / (Summe(Credits))
Von nimmt Natural Joincourse Natural Join Grade_Points
Nach ID gruppieren;
3.3 Schreiben Sie im Universitätsmodus die folgenden Anweisungen zum Einfügen, Löschen und Aktualisieren in SQL.
A. Geben Sie jedem Lehrer in der Comp.Sci.-Abteilung eine Gehaltserhöhung von 10 %.
Update-Instruktor
Setsalary = Gehalt*1.1
Wheredept_name = 'Comp.Sci.';
B. Löschen Sie alle Kurse, die nicht angeboten wurden (d. h. nicht in der Abschnittsbeziehung erscheinen).
Aus Kurs löschen
Wherecourse.course_id nicht in (wählen Sie course_id aus
Formularabschnitt);
C. Fügen Sie jeden Schüler mit einem Wert über 100 im Attribut „tot_cred“ als Lehrer in derselben Abteilung mit einem Gehalt von 10.000 US-Dollar ein.
Einfügen in den Lehrer
SelectID, Name, Abteilungsname, 10000
VonStudent
Wheretot_cred > 10000;
3.4 Betrachten Sie die Datenbank der Versicherungsgesellschaft in Abbildung 3-18, wobei der Unterstrich der Primärschlüssel ist. Erstellen Sie die folgende SQL-Abfrage für diese relationale Datenbank:
A. Ermitteln Sie die Gesamtzahl der Personen, deren Fahrzeuge im Jahr 2009 in Verkehrsunfälle verwickelt waren.
Ursprüngliche Antwort:
Selectcount (eindeutige Fahrer-ID)
Vom beteiligtennatürlichen Beitrittsunfall
WoDatum = 2009;
Antwort ändern:
Beachten Sie, dass die Uhrzeit (Datum) nicht das Jahr (Jahr) darstellt. Ändern Sie die Antwort daher wie folgt
Selectcount (eindeutige Fahrer-ID)
Vonbeteiligter natürlicher Beitrittsunfall
Datum zwischen dem Datum „00.00.2009“ und dem Datum „31.12.2009“.
B. Fügen Sie der Datenbank einen neuen Vorfall hinzu und legen Sie für jedes erforderliche Attribut einen beliebigen Wert fest.
Diese Frage kann zunächst einige Parameter annehmen. Nach Abschluss des Datenbank-Hinzufügungsvorgangs können alle Attribute geändert werden.
Einfügung in einen Unfall
Werte(4007, '2009-09-01', 'Berkeley')
Einfügen in Teilgenommen
Wählen Sie 4007, c.license, P.driver_id, 3000
Von (Person als p) natürlich beitreten (besitzt aso) natürlich beitreten (Auto als c)
Wobei p.name ='Jones';
C. Entfernen Sie den Mazda von „John Smith“.
Aus dem Auto löschen
Wheremodel = 'Mazda' und Lizenz in (Lizenz auswählen
Von besitzt natürliche verbundene Person
Wobei Name = 'John Smith');
Person(Fahrer_ID,Name,Adresse)Versicherte Person
Auto (Führerschein, Modell, Jahr) versichertes Auto
Unfallinformationen (Berichtsnummer, Datum, Ort).
Owns(driver_id,license)Die Beziehung zwischen der versicherten Person und dem versicherten Auto
Details zum beteiligten Unfall (Berichtsnummer, Führerschein, Fahrer-ID, Schadenshöhe).
3.5 Angenommen, es besteht eine Beziehung zwischen den Noten (ID, Punktzahl) und wir hoffen, Schüler anhand der folgenden Kriterien zu benoten: wenn Punktzahl <40, erhalten Sie F; wenn 40≤Punktzahl<60, erhalten Sie C; wenn 60≤Punktzahl<80 , bekomme B; wenn 80≤score Habe ein A. Schreiben Sie eine SQL-Abfrage, um die folgenden Vorgänge abzuschließen:
A. Zeigt die Note jedes Schülers basierend auf der Notenbeziehung an.
SelectID,
Fall
Wenn die Punktzahl <40 ist, dann „F“
Wenn die Punktzahl <60 ist, dann „C“
Wenn die Punktzahl <80 ist, dann „B“
Sonst 'A'
Ende
Frommarks;
B. Finden Sie die Anzahl der Schüler in jeder Stufe.
Mit Noten wie (ID auswählen,
Fall
Wenn die Punktzahl <40 ist, dann „F“
Wenn die Punktzahl <60 ist, dann „C“
Wenn die Punktzahl <80 ist, dann „B“
Sonst'A'
Ende als Note
Von Noten)
Selectgrade-Anzahl (eindeutige ID)
Fromgrades
Gruppenweise;
3.6 Beim SQL-Operator „like“ wird die Groß-/Kleinschreibung beachtet, aber die Funktion „lower()“ für eine Zeichenfolge kann verwendet werden, um eine Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung zu erreichen. Um die Funktionsweise zu veranschaulichen, schreiben Sie eine Abfrage, die Systeme findet, deren Namen die Teilzeichenfolge „sci“ enthalten, wobei die Groß- und Kleinschreibung ignoriert wird.
Wählen Sie den Abteilungsnamen aus
Von der Abteilung
Wo niedriger(Abteilungsname) wie '%sci%';
3.7 Betrachten Sie die SQL-Abfrage
Selectdistinct p.a1
Fromp,r1,r2
Wobei p.a1=r1.a1 oder p.a1=r2.a1
Unter welchen Bedingungen wählt diese Abfrage p.a1-Werte aus, die entweder in r1 oder r2 liegen? Untersuchen Sie sorgfältig die Situation, in der r1 oder r2 leer sein könnten.
P, r1, r2 sind nicht leer
3.8 Betrachten Sie die Bankdatenbank in Abbildung 3-19, in der der unterstrichene Schlüssel der Primärschlüssel ist. Erstellen Sie die folgende SQL-Abfrage für diese relationale Datenbank:
A. Finden Sie alle Kunden der Bank, die Konten, aber keine Kredite haben.
Ursprüngliche Antwort
Wählen Sie Kundenname aus
Vom Einleger
Wherecustomer_name nicht in (wählen Sie den Kundennamen aus
Vom Kreditnehmer);
Ändern Sie die Schreibweise
(Wählen Sie den Kundennamen aus
VonEinleger)
Außer
(Wählen Sie den Kundennamen aus
Vom Kreditnehmer)
Achten Sie auf die Verwendung der Außer-Differenz-Operation
B. Finden Sie die Namen aller Kunden, die in derselben Stadt und in derselben Straße wie „Smith“ wohnen.
Ursprüngliche Antwort:
Wählen Sie Kundenname aus
Vom Kunden
Where(customer_street,customer_city) = (select customer_street,customer_city
Vom Kunden
Wo customer_name = 'Smith');
Eine andere Möglichkeit, es zu schreiben:
Wählen Sie F.Kundenname aus
From(customer as F) join (customer as S) using(ustomer_street,customer_city)
WhereS.customer_name = 'Smith';
C. Finden Sie die Namen aller Filialen, in denen Konten von Kunden mit Wohnsitz in „Harrison“ eröffnet wurden.
Wählen Sie einen eindeutigen Filialnamen aus
Fromaccount natural beitreten Einzahler natural beitreten Kunde
Wherecustomer_city = 'Harrison';
Filialinformationen (Branchenname, Filialstadt, Assets-Assets).
Kunde (Kundenname, Kundenstraße, Kundenstadt)Kundeninformationen
Kreditinformationen (Kreditnummer, Name der Filiale, Betrag).
Kreditnehmer (Kundenname, Kreditnummer)Kreditgeberinformationen
Kontoinformationen (Kontonummer, Filialname, Kontostand).
Einleger (Kundenname, Kontonummer) Informationen zur Kontoperson
Abbildung 3-19
3.9 Betrachten Sie die Mitarbeiterdatenbank in Abbildung 3-20, in der die Primärschlüssel unterstrichen sind. Schreiben Sie SQL-Ausdrücke für jede der folgenden Abfragen:
Employee(employee_name,street,city)
Werke(Mitarbeitername,Firmenname,Gehalt)
Firma(Firmenname,Stadt)
Manager(Mitarbeitername,Managername)
Abbildung 3-20
A. Hier finden Sie die Namen aller Mitarbeiter, die für „First Bank Corporation“ arbeiten, sowie deren Wohnort.
Wählen Sie Mitarbeitername und Stadt aus
Von den natürlichen Verbindungen der Mitarbeiter
Wo Firmenname = 'FirstBank Corporation';
B. Finden Sie den Namen, die Straße und den Wohnort aller Mitarbeiter, die für „First Bank Corporation“ arbeiten und deren Gehalt 10.000 US-Dollar übersteigt.
Wählen Sie Mitarbeitername, Straße und Stadt aus
Von den natürlichen Verbindungen der Mitarbeiter
Wobei Firmenname = „FirstBank Corporation“ und Gehalt >10000;
C. Finden Sie in der Datenbank alle Mitarbeiter, die nicht für „First Bank Corporation“ arbeiten.
(Wählen Sie den Mitarbeiternamen aus
Vom Mitarbeiter)
Außer
(wählen Sie Mitarbeitername aus
Von den natürlichen Verbindungen der Mitarbeiter
Wo Firmenname = 'FirstBank Corporation');
D. Finden Sie in der Datenbank alle Mitarbeiter, die ein höheres Gehalt haben als jeder Mitarbeiter bei „Small Bank Corporation“.
Wählen Sie Mitarbeitername aus
Aus Werken
Wo Gehalt > (selectmax(salary)
Aus Werken
Wobei Firmenname = „Kleine Bankgesellschaft“
Gruppieren nach Firmenname);
E. Angenommen, ein Unternehmen kann Niederlassungen in mehreren Städten haben. Finden Sie alle Unternehmen in allen Städten, in denen „Small Bank Corporation“ ansässig ist.
Ursprüngliche Antwort
Wählen Sie Firmenname aus
Firma gründen
Wo Stadt in (Stadt auswählen
Von der Firma
Wo Firmenname = 'SmallBank Corporation');
Überarbeitete Antwort
Der zuletzt generierte Firmenname in der ursprünglichen Antwort enthält „Small Bank Corporation“, vielleicht möchten wir „Small Bank Corporation“ nicht einbeziehen
(Wählen Sie den Firmennamen aus
Firma gründen
Wo Stadt in (Stadt auswählen
Von der Firma
Wobei Firmenname = 'SmallBank Corporation'))
Außer
(Wählen Sie den Firmennamen aus
Von der Firma
Wobei Firmenname = 'Small Bank Corporation');
F. Finden Sie das Unternehmen mit den meisten Mitarbeitern.
Mit A as(selectcompany_name, count(employee_name) as num
Aus Werken
Nach Firmenname gruppieren)
Firmenname auswählen, max(num)
Von einem;
Eine andere Art zu schreiben
Wählen Sie Firmenname aus
Aus Werken
Gruppieren Sie nach Firmenname
Mit count (employee_name) >= all(selectcount(employee_name)
Aus Werken
Gruppieren nach Firmenname);
G. Finden Sie die Unternehmen, bei denen das Durchschnittsgehalt höher ist als das Durchschnittsgehalt bei First Bank Corporation.
Mit A als (wählen Sie Firmenname, avg(salary) als avg_salary
Aus Werken
Nach Firmenname gruppieren)
Wählen Sie Firmenname aus
Von einem
Wobei avg_salary > (wählen Sie avg_salary
Von einem
Wo Firmenname = 'First Bank Corporation');
3.10 Betrachten Sie die relationale Datenbank in Abbildung 3-20 und geben Sie den SQL-Ausdruck für jede der folgenden Abfragen an:
A. Ändern Sie die Datenbank so, dass „Jones“ jetzt in der Stadt „Newtown“ lebt.
Mitarbeiter aktualisieren
Stadt setzen = 'Newtown'
Wo Employee_name = 'Jones';
B. Eine Gehaltserhöhung von 10 % für alle Manager der FirstBank Corporation, deren Gehälter 100.000 US-Dollar nicht übersteigen, und nur eine Erhöhung von 3 % für diejenigen, deren Gehälter 100.000 US-Dollar übersteigen
Updata funktioniert als T
Setze T.salary = t.salary *1.03
Wo T.employee_name in (selectmanager_name
Von verwaltet)
Und T.company_name = 'FirstBank Corporation'
Und t.salary >100000;
Updata funktioniert als T
Setze T.salary = t.salary *1.1
Wo T.employee_name in (selectmanager_name
Von verwaltet)
Und T.company_name = 'FirstBank Corporation'
Und t.salary <=100000;
Eine andere Art zu schreiben
Update funktioniert
Gehalt festlegen = Gehalt*(Fall
Wenn das Gehalt > 100.000 ist, dann 1,03
Sonst 1.1)
Wo Mitarbeiternamein (wählen Sie manager_name
Frome-Manager)
Und firmenname = 'First BankCorporation';
——————————————
Copyright-Erklärung: Dieser Artikel ist ein Originalartikel des CSDN-Bloggers „ccChen1211“ und folgt der CC 4.0 BY-SA-Copyright-Vereinbarung. Bitte erneut drucken Im Anhang finden Sie einen Link zur Originalquelle und zu dieser Erklärung.
Ursprünglicher Link: https://blog.csdn.net/LC_chentinghua/article/details/79891962