Beispiele für Unterabfrageabfragen
Die folgenden Beispiele veranschaulichen die Susbelect-Abfrage.
- Beispiel 1 – Wählen Sie alle Spalten und Zeilen aus der Tabelle "EMPLOYEE" aus.
SELECT * FROM EMPLOYEE - Beispiel 2 – Fügen Sie die Tabellen EMP_ACT und EMPLOYEE zusammen, wählen Sie alle Spalten aus der Tabelle EMP_ACT aus und fügen Sie den Nachnamen des Mitarbeiters (LASTNAME) aus der Tabelle EMPLOYEE zu jeder Zeile des Ergebnisses hinzu.
SELECT EMP_ACT.*, LASTNAME FROM EMP_ACT, EMPLOYEE WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO - Beispiel 3 – Fügen Sie die Tabellen "EMPLOYEE" und "DEPARTMENT" zusammen und wählen Sie die Mitarbeiternummer (EMPNO), den Nachnamen des Mitarbeiters (LASTNAME), die Abteilungsnummer (WORKDEPT in der Tabelle "EMPLOYEE" und DEPTNO in der Tabelle "DEPARTMENT") und den Abteilungsnamen (DEPTNAME) aller Mitarbeiter aus, die vor 1955 geboren wurden (BIRTHDATE).
SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME FROM EMPLOYEE, DEPARTMENT WHERE WORKDEPT = DEPTNO AND YEAR(BIRTHDATE) < 1955 - Beispiel 4 – Wählen Sie die Stelle (JOB) und die Mindest- und Höchstgehälter (SALARY) für jede Gruppe von Zeilen mit demselben Stellenkode in der Tabelle EMPLOYEE aus, aber nur für Gruppen mit mehr als einer Zeile und mit einem Höchstgehalt von mindestens 27000.
SELECT JOB, MIN(SALARY), MAX(SALARY) FROM EMPLOYEE GROUP BY JOB HAVING COUNT(*) > 1 AND MAX(SALARY) >= 27000 - Beispiel 5 – Wählen Sie alle Zeilen der Tabelle EMP_ACT für Mitarbeiter (EMPNO) in der Abteilung (WORKDEPT) E11 " aus. (Die Mitarbeiterabteilungsnummern werden in der Tabelle EMPLOYEE angezeigt.)
SELECT * FROM EMP_ACT WHERE EMPNO IN (SELECT EMPNO FROM EMPLOYEE WHERE WORKDEPT = 'E11') - Beispiel 6 – Wählen Sie aus der Tabelle "EMPLOYEE" die Abteilungsnummer (WORKDEPT) und das maximale Abteilungsgehalt (SALARY) für alle Abteilungen aus, deren maximales Gehalt unter dem Durchschnittsgehalt aller Mitarbeiter liegt.
Die Unterabfrage in der HAVING-Klausel wird in diesem Beispiel einmal ausgeführt.SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE) - Beispiel 7 – Wählen Sie in der Tabelle "EMPLOYEE" die Abteilungsnummer (WORKDEPT) und das maximale Abteilungsgehalt (SALARY) für alle Abteilungen aus, deren maximales Gehalt unter dem Durchschnittsgehalt aller anderen Abteilungen liegt.
SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE EMP_COR GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)Im Gegensatz zu Beispiel 6 wird die Unterabfrage in der HAVING-Klausel für jede Gruppe ausgeführt.
- Beispiel 8 – Ermitteln Sie die Anzahl der Mitarbeiter und das Gehalt der Vertriebsmitarbeiter sowie das Durchschnittsgehalt und die Mitarbeiterzahl ihrer Abteilungen.Diese Abfrage muss zuerst einen verschachtelten Tabellenausdruck (DINFO) erstellen, um die Spalten AVGSALARY und EMPCOUNT sowie die Spalte DEPTNO abzurufen, die in der WHERE-Klausel verwendet wird.
SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT FROM EMPLOYEE THIS_EMP, (SELECT OTHERS.WORKDEPT AS DEPTNO, AVG(OTHERS.SALARY) AS AVGSALARY, COUNT(*) AS EMPCOUNT FROM EMPLOYEE OTHERS GROUP BY OTHERS.WORKDEPT ) AS DINFO WHERE THIS_EMP.JOB = 'SALESREP' AND THIS_EMP.WORKDEPT = DINFO.DEPTNODurch die Verwendung eines verschachtelten Tabellenausdrucks für diesen Fall werden die Verarbeitungsressourcen zum Erstellen der Sicht DINFO als reguläre Sicht gespeichert. Bei der Vorbereitung von Aussagen wird der Zugriff auf den Katalog für die Ansicht vermieden. Aufgrund des Kontexts der restlichen Abfrage werden in der Ansicht nur die Zeilen für die Abteilung der Vertriebsmitarbeiter berücksichtigt.
- Beispiel 9 – Geben Sie das durchschnittliche Bildungsniveau und das Durchschnittsgehalt für fünf zufällige Gruppen von Mitarbeitern an.Diese Abfrage erfordert die Verwendung eines verschachtelten Tabellenausdrucks, um einen Zufallswert für jeden Mitarbeiter festzulegen, damit dieser später in der GROUP BY-Klausel verwendet werden kann.
SELECT RANDID , AVG(EDLEVEL), AVG(SALARY) FROM ( SELECT EDLEVEL, SALARY, INTEGER(RAND()*5) AS RANDID FROM EMPLOYEE ) AS EMPRAND GROUP BY RANDID - Beispiel 10 – Abfrage der Tabelle EMP_ACT und Rückgabe der Projektnummern, bei denen ein Mitarbeiter zu den 10 bestbezahlten Mitarbeitern gehört.
SELECT EMP_ACT.EMPNO,PROJNO FROM EMP_ACT WHERE EMP_ACT.EMPNO IN (SELECT EMPLOYEE.EMPNO FROM EMPLOYEE ORDER BY SALARY DESC FETCH FIRST 10 ROWS ONLY) - Beispiel 11 – Angenommen, PHONES und IDS sind zwei SQL-Variablen mit Array-Werten derselben Kardinalität. Wandeln Sie diese Arrays in eine Tabelle mit drei Spalten (eine für jedes Array und eine für die Position) und einer Zeile pro Array-Element um.
SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS) WITH ORDINALITY AS T(PHONE, ID, INDEX) ORDER BY T.INDEX