SQL. Interessante Aufgaben

Hallo, Habr!

Seit ĂŒber 3 Jahren unterrichte ich SQL in verschiedenen Schulungszentren, und eine meiner Beobachtungen ist, dass die Studenten SQL besser erlernen und verstehen, wenn sie Aufgaben gestellt bekommen, anstatt nur ĂŒber die Möglichkeiten und theoretischen Grundlagen zu sprechen.

In diesem Artikel werde ich meine Liste von Aufgaben mit Ihnen teilen, die ich meinen SchĂŒlern als Hausaufgaben gebe und ĂŒber die wir verschiedene Brainstormings durchfĂŒhren, was zu einem tiefen und klaren VerstĂ€ndnis von SQL fĂŒhrt.

SQL. Interessante Aufgaben

SQL (ˈɛsˈkjuˈɛl; engl. structured query language — „Sprache fĂŒr strukturierte Abfragen“) ist eine deklarative Programmiersprache, die verwendet wird, um Daten in einem relationalen Datenbankmanagementsystem zu erstellen, zu Ă€ndern und zu verwalten. Mehr erfahren


Über SQL kann man aus verschiedenen Quellen.
Dieser Artikel hat nicht das Ziel, Sie SQL von Grund auf zu lehren.

Also, lass uns anfangen.

Wir werden das allgemein bekannte HR-Schema in Oracle mit seinen Tabellen verwenden (Weitere Informationen):

SQL. Interessante Aufgaben
Ich möchte anmerken, dass wir nur SELECT-Aufgaben betrachten werden. Es gibt keine Aufgaben zu DML und DDL.

Aufgaben

Daten einschrÀnken und sortieren

Tabelle Employees. Holen Sie sich eine Liste mit Informationen ĂŒber alle Mitarbeiter
Lösung

SELECT * FROM employees

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter mit dem Namen ‚David‘
Lösung

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter mit job_id gleich ‚IT_PROG‘
Lösung

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter aus der 50. Abteilung (department_id) mit einem Gehalt (salary) ĂŒber 4000
Lösung

SELECT *
  FROM employees
 WHERE department_id = 50 AND salary > 4000;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter aus der 20. und 30. Abteilung (department_id)
Lösung

SELECT *
  FROM employees
 WHERE department_id = 20 OR department_id = 30;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren letzter Buchstabe im Namen ‚a‘ ist
Lösung

SELECT *
  FROM employees
 WHERE first_name LIKE '%a';

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter aus der 50. und 80. Abteilung (department_id), die einen Bonus haben (Wert in der Spalte commission_pct ist nicht leer)
Lösung

SELECT *
  FROM employees
 WHERE     (department_id = 50 OR department_id = 80)
       AND commission_pct IS NOT NULL;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Name mindestens 2 Buchstaben ‚n‘ enthĂ€lt
Lösung

SELECT *
  FROM employees
 WHERE first_name LIKE '%n%n%';

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Name mehr als 4 Buchstaben hat
Lösung

SELECT *
  FROM employees
 WHERE first_name LIKE '%_____%';

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Gehalt zwischen 8000 und 9000 (einschließlich) liegt.
Lösung

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Vorname das Zeichen '%' enthÀlt.
Lösung

SELECT *
  FROM employees
 WHERE first_name LIKE '%%%' ESCAPE '';

Tabelle Employees. Holen Sie sich eine Liste aller ID von Managern.
Lösung

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tabelle Employees. Holen Sie sich eine Liste der Mitarbeiter mit ihren Positionen im Format: Donald(sh_clerk).
Lösung

SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;

Verwendung von Einzeilenfunktionen zur Anpassung der Ausgabe.

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Vorname lÀnger als 10 Buchstaben ist.
Lösung

SELECT *
  FROM employees
 WHERE LENGTH (first_name) > 10;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Vorname den Buchstaben 'b' enthĂ€lt (ohne BerĂŒcksichtigung der Groß- und Kleinschreibung).
Lösung

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name), 'b') > 0;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Vorname mindestens 2 Buchstaben 'a' enthÀlt.
Lösung

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name),'a',1,2) > 0;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Gehalt durch 1000 teilbar ist.
Lösung

SELECT *
  FROM employees
 WHERE MOD (salary, 1000) = 0;

Tabelle Employees. Holen Sie sich die ersten 3 Ziffern der Telefonnummer des Mitarbeiters, wenn seine Nummer im Format XXX.XXX.XXXX vorliegt.
Lösung

SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
  FROM employees
 WHERE phone_number LIKE '___.___.____';

Tabelle Departments. Holen Sie sich das erste Wort aus dem Namen der Abteilung fĂŒr diejenigen, deren Name mehr als ein Wort enthĂ€lt.
Lösung

SELECT department_name,
       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
           first_word
  FROM departments
 WHERE INSTR (department_name, ' ') > 0;

Tabelle Employees. Holen Sie sich die Vornamen der Mitarbeiter ohne den ersten und letzten Buchstaben.
Lösung

SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
  FROM employees;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren letzter Buchstabe im Vorname 'm' ist und deren Vorname lÀnger als 5 Buchstaben ist.
Lösung

SELECT *
  FROM employees
 WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;

Tabelle Dual. Holen Sie sich das Datum des nÀchsten Freitags.
Lösung

SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, die lÀnger als 17 Jahre im Unternehmen arbeiten.
Lösung

SELECT *
  FROM employees
 WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren letzte Ziffer der Telefonnummer ungerade und aus 3 Ziffern besteht, die durch einen Punkt getrennt sind.
Lösung

SELECT *
  FROM employees
 WHERE     MOD (SUBSTR (phone_number, -1), 2) != 0
       AND INSTR (phone_number,'.',1,3) = 0;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren job_id nach dem Zeichen '_' mindestens 3 Zeichen lang ist, aber dieser Wert nach '_' nicht 'CLERK' ist.
Lösung

SELECT *
  FROM employees
 WHERE     LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
       AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, wobei im Wert PHONE_NUMBER alle '.' durch '-' ersetzt werden.
Lösung

SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
  FROM employees;

Benutzung von Konvertierungsfunktionen und bedingten AusdrĂŒcken

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, die am ersten Tag eines Monats (irgendeiner) eingestellt wurden.
Lösung

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'DD') = '01';

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, die im Jahr 2008 eingestellt wurden.
Lösung

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'YYYY') = '2008';

Tabelle DUAL. Zeige das Datum von morgen im Format: Morgen ist der zweite Tag im Januar
Lösung

SELECT TO_CHAR (SYSDATE, 'fm""Morgen ist ""Ddspth ""Tag von"" Monat')     info
  FROM DUAL;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter und deren Einstellungsdatum im Format: 21. Juni 2007
Lösung

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""von"" Monat, YYYY') hire_date
  FROM employees;

Tabelle Employees. Holen Sie sich eine Liste der Mitarbeiter mit erhöhten GehÀltern um 20 %. Gehalt im Dollarzeichen anzeigen
Lösung

SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
  FROM employees;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, die im Februar 2007 eingestellt wurden.
Lösung

SELECT *
  FROM employees
 WHERE hire_date BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')
                     AND LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));

SELECT *
  FROM employees
 WHERE to_char(hire_date,'MM.YYYY') = '02.2007'; 

Tabelle DUAL. Geben Sie das aktuelle Datum aus, + Sekunde, + Minute, + Stunde, + Tag, + Monat, + Jahr
Lösung

SELECT SYSDATE                          now,
       SYSDATE + 1 / (24 * 60 * 60)     plus_second,
       SYSDATE + 1 / (24 * 60)          plus_minute,
       SYSDATE + 1 / 24                 plus_hour,
       SYSDATE + 1                      plus_day,
       ADD_MONTHS (SYSDATE, 1)          plus_month,
       ADD_MONTHS (SYSDATE, 12)         plus_year
  FROM DUAL;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter mit dem Gesamtgehalt (salary + commission_pct(%)) im Format: $24.000,00
Lösung

SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
  FROM employees;

Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter und Informationen ĂŒber die VerfĂŒgbarkeit von Bonuszahlungen (Ja/Nein)
Lösung

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Ja', 'Nein') has_bonus
  FROM employees;

Tabelle Employees. Bestimmen Sie die Gehaltsstufe jedes Mitarbeiters: Unter 5000 wird als niedrig eingestuft, 5000 oder mehr und weniger als 10000 wird als normal eingestuft, 10000 oder mehr wird als hoch eingestuft.
Lösung

WÄHLEN Sie Vorname,
       Gehalt,
       FALLS
           WENN Gehalt = 5000 UND Gehalt < 10000 DANN 'Normal'
           SONST 'Hoch'
       ENDE Gehaltsstufe
  VON Mitarbeitern;

Tabelle LĂ€nder. FĂŒr jedes Land den Region anzeigen, in dem es sich befindet: 1-Europa, 2-Amerika, 3-Asien, 4-Afrika (ohne Join)
Lösung

WÄHLEN Sie LĂ€ndervorname land,
       DECODE (region_id,
               1, 'Europa',
               2, 'Amerika',
               3, 'Asien',
               4, 'Afrika',
               'Unbekannt')
           region
  VON lÀndern;

WÄHLEN Sie LĂ€ndervorname
           land,
       FALLS region_id
           WENN 1 DANN 'Europa'
           WENN 2 DANN 'Amerika'
           WENN 3 DANN 'Asien'
           WENN 4 DANN 'Afrika'
           SONST 'Unbekannt'
       ENDE
           region
  VON lÀndern;

Berichterstattung ĂŒber aggregierte Daten mit den Gruppenfunktionen

Tabelle Mitarbeiter. Bericht nach department_id mit dem niedrigsten und höchsten Gehalt, mit frĂŒhestem und spĂ€testem Einstiegsdatum und Anzahl der Mitarbeiter. Sortieren nach der Anzahl der Mitarbeiter (absteigend)
Lösung

  WÄHLEN Sie department_id,
         MIN (gehalt) min_gehalt,
         MAX (gehalt) max_gehalt,
         MIN (einstellungsdatum) min_einstellungsdatum,
         MAX (einstellungsdatum) max_einstellungsdatum,
         ANZAHL (*) anzahl
    VON mitarbeitern
GRUPPIEREN NACH department_id
ORDER BY ANZAHL(*) DESC;

Tabelle Mitarbeiter. Wie viele Mitarbeiter haben Namen, die mit demselben Buchstaben beginnen? Nach Anzahl sortieren. Nur die anzeigen, bei denen die Anzahl grĂ¶ĂŸer als 1 ist.
Lösung

WÄHLEN Sie SUBSTR (vorname, 1, 1) erster_buchstabe, ANZAHL (*)
    VON mitarbeitern
GRUPPIEREN NACH SUBSTR (vorname, 1, 1)
  HABEN ANZAHL (*) > 1
ORDER BY 2 DESC;

Tabelle Mitarbeiter. Wie viele Mitarbeiter arbeiten in demselben Abteilung und verdienen das gleiche Gehalt?
Lösung

WÄHLEN Sie department_id, gehalt, ANZAHL (*)
    VON mitarbeitern
GRUPPIEREN NACH department_id, gehalt
  HABEN ANZAHL (*) > 1;

Tabelle Mitarbeiter. Bericht, wie viele Mitarbeiter an jedem Wochentag eingestellt wurden. Nach Anzahl sortieren.
Lösung

WÄHLEN Sie TO_CHAR (einstellungsdatum, 'Tag') tag, ANZAHL (*)
    VON mitarbeitern
GRUPPIEREN NACH TO_CHAR (einstellungsdatum, 'Tag')
ORDER BY 2 DESC;

Tabelle Mitarbeiter. Bericht, wie viele Mitarbeiter in den Jahren eingestellt wurden. Nach Anzahl sortieren.
Lösung

WÄHLEN Sie TO_CHAR (einstellungsdatum, 'YYYY') jahr, ANZAHL (*)
    VON mitarbeitern
GRUPPIEREN NACH TO_CHAR (einstellungsdatum, 'YYYY');

Tabelle Mitarbeiter. Anzahl der Abteilungen, in denen Mitarbeiter sind.
Lösung

WÄHLEN Sie ANZAHL (ANZAHL (*))     abteilungsanzahl
    VON mitarbeitern
   WOHER department_id IST NICHT NULL
GRUPPIEREN NACH department_id;

Tabelle Mitarbeiter. Liste der department_id, in denen mehr als 30 Mitarbeiter arbeiten.
Lösung

  WÄHLEN Sie department_id
    VON mitarbeitern
GRUPPIEREN NACH department_id
  HABEN ANZAHL (*) > 30;

Tabelle Mitarbeiter. Liste der department_id und gerundeten durchschnittlichen GehÀlter der Mitarbeiter in jeder Abteilung.
Lösung

  WÄHLEN Sie department_id, RUNDEN (DURCHSCHNITT (gehalt)) durchschnittsgehalt
    VON mitarbeitern
GRUPPIEREN NACH department_id;

Tabelle LĂ€nder. Liste der region_id Summe aller Buchstaben aller LĂ€ndervornamen, in denen es mehr als 60 gibt.
Lösung

  WÄHLEN Sie region_id
    VON LĂ€ndern
GRUPPIEREN Sie NACH region_id
  HABEN SUMME (LÄNGE (land_name)) > 60;

Tabelle Employees. Erlangen Sie eine Liste von department_id, in der Mitarbeiter mit mehreren (>1) job_id arbeiten.
Lösung

  WÄHLEN Sie department_id
    VON mitarbeitern
GRUPPIEREN Sie NACH department_id
  HABEN COUNT (DISTINCT job_id) > 1;

Tabelle Employees. Erlangen Sie eine Liste von manager_id, bei denen die Anzahl der Untergebenen mehr als 5 betrÀgt und die Summe aller GehÀlter seiner Untergebenen mehr als 50000 betrÀgt.
Lösung

  WÄHLEN Sie manager_id
    VON mitarbeitern
GRUPPIEREN Sie NACH manager_id
  HABEN COUNT (*) > 5 UND SUMME (salary) > 50000;

Tabelle Employees. Erlangen Sie eine Liste von manager_id, bei denen das durchschnittliche Gehalt aller Untergebenen zwischen 6000 und 9000 liegt, die keine Boni erhalten (commission_pct leer).
Lösung

  WÄHLEN Sie manager_id, AVG (salary) avg_salary
    VON mitarbeitern
   WOHER commission_pct IST NULL
GRUPPIEREN Sie NACH manager_id
  HABEN AVG (salary) ZWISCHEN 6000 UND 9000;

Tabelle Employees. Erlangen Sie das maximale Gehalt aller Mitarbeiter job_id, das mit dem Wort ‘CLERK’ endet.
Lösung

WÄHLEN Sie MAX (salary) max_salary
  VON mitarbeitern
 WO die job_id LIKE '%CLERK';

WÄHLEN Sie MAX (salary) max_salary
  VON mitarbeitern
 WO SUBSTR (job_id, -5) = 'CLERK';

Tabelle Employees. Erlangen Sie das maximale Gehalt unter allen durchschnittlichen GehÀltern nach Abteilung.
Lösung

  WÄHLEN Sie MAX (DURCHSCHNITT (salary))
    VON mitarbeitern
GRUPPIEREN Sie NACH department_id;

Tabelle Employees. ZĂ€hlen Sie die Anzahl der Mitarbeiter mit der gleichen Anzahl an Buchstaben im Namen. Zeigen Sie nur die an, deren Name lĂ€nger als 5 ist und dessen Mitarbeiteranzahl mit diesem Namen grĂ¶ĂŸer als 20 ist. Sortieren Sie nach LĂ€nge des Namens.
Lösung

  WÄHLEN Sie LÄNGE (first_name), COUNT (*)
    VON mitarbeitern
GRUPPIEREN Sie NACH LÄNGE (first_name)
  HABEN LÄNGE (first_name) > 5 UND COUNT (*) > 20
BESTELLEN NACH LÄNGE (first_name);

  WÄHLEN Sie LÄNGE (first_name), COUNT (*)
    VON mitarbeitern
   WO LÄNGE (first_name) > 5
GRUPPIEREN Sie NACH LÄNGE (first_name)
  HABEN COUNT (*) > 20
BESTELLEN NACH LÄNGE (first_name);

Daten aus mehreren Tabellen mit Joins anzeigen

Tabelle Employees, Departements, Standorte, LĂ€nder, Regionen. Erlangen Sie eine Liste der Regionen und die Anzahl der Mitarbeiter in jeder Region.
Lösung

  WÄHLEN Sie region_name, COUNT (*)
    VON mitarbeitern e
         JOIN abteilungen d ON (e.department_id = d.department_id)
         JOIN standorte l ON (d.location_id = l.location_id)
         JOIN lÀnder c ON (l.country_id = c.country_id)
         JOIN regionen r ON (c.region_id = r.region_id)
GRUPPIEREN Sie NACH region_name;

Tabelle Employees, Departements, Standorte, LĂ€nder, Regionen. Erlangen Sie detaillierte Informationen ĂŒber jeden Mitarbeiter:
Vorname, Nachname, Abteilung, Job, Straße, Land, Region
Lösung

WÄHLEN Sie Vorname,
       Nachname,
       Abteilungsname,
       Job_id,
       straßenadresse,
       Land_name,
       Region_name
  VON mitarbeitern e
       JOIN abteilungen d ON (e.department_id = d.department_id)
       JOIN standorte l ON (d.location_id = l.location_id)
       JOIN lÀnder c ON (l.country_id = c.country_id)
       JOIN regionen r ON (c.region_id = r.region_id);

Tabelle Employees. Zeigen Sie alle Manager an, die mehr als 6 Mitarbeiter zu betreuen haben.
Lösung

  WÄHLEN man.first_name, COUNT (*)
    VON mitarbeitern emp JOIN mitarbeitern man ON (emp.manager_id = man.employee_id)
GROUP BY man.first_name
  HAVING COUNT (*) > 6;

Tabelle Mitarbeiter. Zeige alle Mitarbeiter, die niemandem unterstellt sind
Lösung

WÄHLEN emp.first_name
  VON mitarbeitern emp
       LINK JOIN mitarbeitern man ON (emp.manager_id = man.employee_id)
 WHERE man.FIRST_NAME IST NULL;

WÄHLEN first_name
  VON mitarbeitern
 WHERE manager_id IST NULL;

Tabelle Mitarbeiter, Job_history. In der Tabelle Mitarbeiter werden alle Mitarbeiter gespeichert. In der Tabelle Job_history werden Mitarbeiter gespeichert, die das Unternehmen verlassen haben. Einen Bericht ĂŒber alle Mitarbeiter und deren Status im Unternehmen erhalten (Aktiv oder das Unternehmen mit Abgangsdatum verlassen)
Beispiel:
first_name | status
Jennifer | Verließ das Unternehmen am 31. Dezember 2006
Clara | Derzeit beschÀftigt
Lösung

WÄHLEN first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Verließ das Unternehmen am"" DD ""von"" Monat, YYYY'),
           'Derzeit beschÀftigt')
           status
  VON mitarbeitern e LINK JOIN job_history j ON (e.employee_id = j.employee_id);

Tabelle Mitarbeiter, Abteilungen, Standorte, LĂ€nder, Regionen. Liste der Mitarbeiter abrufen, die in Europa (region_name) leben
Lösung

 WÄHLEN first_name
  VON mitarbeitern
       JOIN abteilungen USING (department_id)
       JOIN standorte USING (location_id)
       JOIN lÀnder USING (country_id)
       JOIN regionen USING (region_id)
 WHERE region_name = 'Europa';
 
 WÄHLEN first_name
  VON mitarbeitern e
       JOIN abteilungen d ON (e.department_id = d.department_id)
       JOIN standorte l ON (d.location_id = l.location_id)
       JOIN lÀnder c ON (l.country_id = c.country_id)
       JOIN regionen r ON (c.region_id = r.region_id)
 WHERE region_name = 'Europa';

Tabelle Mitarbeiter, Abteilungen. Zeige alle Abteilungen, in denen mehr als 30 Mitarbeiter arbeiten
Lösung

WÄHLEN department_name, COUNT (*)
    VON mitarbeitern e JOIN abteilungen d ON (e.department_id = d.department_id)
GROUP BY department_name
  HAVING COUNT (*) > 30;

Tabelle Mitarbeiter, Abteilungen. Zeige alle Mitarbeiter, die in keiner Abteilung sind
Lösung

WÄHLEN first_name
  VON mitarbeitern e
       LINK JOIN abteilungen d ON (e.department_id = d.department_id)
 WHERE d.department_name IST NULL;

WÄHLEN first_name
  VON mitarbeitern
 WHERE department_id IST NULL;

Tabelle Mitarbeiter, Abteilungen. Zeige alle Abteilungen, in denen kein Mitarbeiter ist
Lösung

WÄHLEN department_name
  VON mitarbeitern e
       RECHTS JOIN abteilungen d ON (e.department_id = d.department_id)
 WHERE first_name IST NULL;

Tabelle Mitarbeiter. Zeige alle Mitarbeiter, die niemanden unterstellt haben
Lösung

WÄHLEN man.first_name
  VON mitarbeitern emp
       RECHTS JOIN mitarbeitern man ON (emp.manager_id = man.employee_id)
 WHERE emp.FIRST_NAME IST NULL;

Tabelle Mitarbeiter, Jobs, Abteilungen. Zeige Mitarbeiter im Format: First_name, Job_title, Department_name.
Beispiel:
First_name | Job_title | Department_name
Donald | Versand | Versandleiter
Lösung

WÄHLEN first_name, job_title, department_name
  VON mitarbeitern e
       JOIN jobs j ON (e.job_id = j.job_id)
       JOIN abteilungen d ON (d.department_id = e.department_id);

Tabelle Mitarbeiter. Liste der Mitarbeiter abrufen, deren Manager im Jahr 2005 eingestellt wurden, wÀhrend diese Mitarbeiter vor 2005 eingestellt wurden
Lösung

WÄHLEN Sie emp.*
  AUS Mitarbeitern emp JOIN Mitarbeitern man ON (emp.manager_id = man.employee_id)
 WHERE     TO_CHAR (man.hire_date, 'YYYY') = '2005'
       UND emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern, deren Manager im Januar eines beliebigen Jahres eingestellt wurden und deren job_title lÀnger als 15 Zeichen ist.
Lösung

WÄHLEN Sie emp.*
  AUS Mitarbeitern emp
       JOIN Mitarbeitern man ON (emp.manager_id = man.employee_id)
       JOIN Jobs j ON (emp.job_id = j.job_id)
 WHERE TO_CHAR (man.hire_date, 'MM') = '01' UND LENGTH (j.job_title) > 15;

Unterabfragen zur Lösung von Abfragen verwenden

Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern mit dem lÀngsten Namen.
Lösung

WÄHLEN Sie *
  AUS Mitarbeitern
 WHERE LENGTH (first_name) =
       (WÄHLEN MAX (LENGTH (first_name)) AUS Mitarbeitern);

Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern mit einem Gehalt, das ĂŒber dem Durchschnittsgehalt aller Mitarbeiter liegt.
Lösung

WÄHLEN Sie *
  AUS Mitarbeitern
 WHERE salary > (WÄHLEN AVG (salary) AUS Mitarbeitern);

Tabelle Mitarbeiter, Abteilungen, Standorte. Holen Sie sich die Stadt, in der die Mitarbeiter insgesamt am wenigsten verdienen.
Lösung

WÄHLEN Sie city
    AUS Mitarbeitern e
         JOIN Abteilungen d ON (e.department_id = d.department_id)
         JOIN Standorte l ON (d.location_id = l.location_id)
GROUP BY city
  HAVING SUM (salary) =
         (  WÄHLEN MIN (SUM (salary))
              AUS Mitarbeitern e
                   JOIN Abteilungen d ON (e.department_id = d.department_id)
                   JOIN Standorte l ON (d.location_id = l.location_id)
          GROUP BY city);

Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern, deren Manager mehr als 15000 verdienen.
Lösung

WÄHLEN Sie *
  AUS Mitarbeitern
 WHERE manager_id IN (WÄHLEN employee_id
                        AUS Mitarbeitern
                       WHERE salary > 15000)

Tabelle Mitarbeiter, Abteilungen. Zeige alle Abteilungen, in denen kein Mitarbeiter ist
Lösung

WÄHLEN Sie *
  AUS Abteilungen
 WHERE department_id NOT IN (WÄHLEN department_id
                               AUS Mitarbeitern
                              WHERE department_id IST NICHT NULL);

Tabelle Mitarbeiter. Zeigen Sie alle Mitarbeiter an, die keine Manager sind.
Lösung

WÄHLEN Sie *
  AUS Mitarbeitern
 WHERE employee_id NOT IN (WÄHLEN manager_id
                             AUS Mitarbeitern
                            WHERE manager_id IST NICHT NULL)

Tabelle Employees. Zeigen Sie alle Manager an, die mehr als 6 Mitarbeiter zu betreuen haben.
Lösung

WÄHLEN Sie *
  AUS Mitarbeitern e
 WHERE (WÄHLEN COUNT (*)
          AUS Mitarbeitern
         WHERE manager_id = e.employee_id) > 6;

Tabelle Mitarbeiter, Abteilungen. Zeigen Sie Mitarbeiter an, die in der IT-Abteilung arbeiten.
Lösung

WÄHLEN Sie *
  AUS Mitarbeitern
 WHERE department_id = (WÄHLEN department_id
                          AUS Abteilungen
                         WHERE department_name = 'IT');

Tabelle Mitarbeiter, Jobs, Abteilungen. Zeige Mitarbeiter im Format: First_name, Job_title, Department_name.
Beispiel:
First_name | Job_title | Department_name
Donald | Versand | Versandleiter
Lösung

WÄHLEN Sie first_name,
       (WÄHLEN job_title
          AUS jobs
         WHERE job_id = e.job_id)
           job_title,
       (WÄHLEN department_name
          AUS Abteilungen
         WHERE department_id = e.department_id)
           department_name
  AUS Mitarbeitern e;

Tabelle Mitarbeiter. Liste der Mitarbeiter abrufen, deren Manager im Jahr 2005 eingestellt wurden, wÀhrend diese Mitarbeiter vor 2005 eingestellt wurden
Lösung

WÄHLEN Sie *
  AUS Mitarbeitern
 WHERE     manager_id IN (WÄHLEN employee_id
                            AUS Mitarbeitern
                           WHERE TO_CHAR (hire_date, 'YYYY') = '2005')
       UND hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern, deren Manager im Januar eines beliebigen Jahres eingestellt wurden und deren job_title lÀnger als 15 Zeichen ist.
Lösung

WÄHLEN Sie *
  AUS Mitarbeitern e
 WHERE     manager_id IN (WÄHLEN employee_id
                            AUS Mitarbeitern
                           WHERE TO_CHAR (hire_date, 'MM') = '01')
       UND (WÄHLEN LENGTH (job_title)
              AUS jobs
             WHERE job_id = e.job_id) > 15;

Das ist vorerst alles.

Ich hoffe, die Aufgaben waren interessant und spannend.
Ich werde diese Liste von Aufgaben nach Möglichkeit ergÀnzen.
Ich freue mich auch ĂŒber jegliche Anmerkungen und VorschlĂ€ge.

P.S.: Wenn jemand eine interessante SELECT-Aufgabe einfĂ€llt, schreibt in die Kommentare, ich werde sie zur Liste hinzufĂŒgen.

Danke.

Quelle: habr.com

60GB SSD 8Gb DDR4