SQL. Interessante Aufgaben

Hallo, Habr!

Seit ĂŒber 3 Jahren unterrichte ich SQL in verschiedenen Schulungszentren. Dabei ist mir aufgefallen, dass die Studierenden SQL besser beherrschen und verstehen, wenn sie mit konkreten Aufgaben konfrontiert werden, anstatt nur ĂŒber die Möglichkeiten und theoretischen Grundlagen zu lernen.

In diesem Artikel teile ich meine Liste von Aufgaben, die ich den Studierenden als Hausaufgaben gebe. Gemeinsam arbeiten wir an verschiedenen Brainstorming-Sitzungen, die zu einem tiefen und klaren VerstĂ€ndnis von SQL fĂŒhren.

SQL. Interessante Aufgaben

SQL (ˈɛsˈkjuˈɛl; engl. structured query language – „strukturierte Abfragesprache“) ist eine deklarative Programmiersprache, die zur Erstellung, Modifizierung und Verwaltung von Daten in einer relationalen Datenbank verwendet wird, die von einem entsprechenden Datenbankmanagementsystem verwaltet wird. Mehr erfahren


Über SQL kann man aus verschiedenen Quellen lesen. Quellen.
Dieser Artikel verfolgt nicht das Ziel, Sie von Grund auf in SQL einzuarbeiten.

Also, legen wir los.

Wir verwenden das allgemein bekannte HR-Schema in Oracle mit seinen Tabellen (Mehr erfahren):

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

Aufgaben

Daten einschrÀnken und sortieren

Tabelle Employees. Eine Liste mit Informationen ĂŒber alle Mitarbeiter abrufen
Lösung

SELECT * FROM employees

Tabelle Employees. Abrufen Sie die Liste aller Mitarbeiter mit dem Namen ‚David‘
Lösung

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabelle Employees. Abrufen Sie die Liste aller Mitarbeiter mit der Job-ID ‚IT_PROG‘
Lösung

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG';

Tabelle Employees. Abrufen Sie die Liste aller Mitarbeiter aus der 50. Abteilung (department_id) mit einem Gehalt (salary) von mehr als 4000
Lösung

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

Tabelle Employees. Abrufen Sie die 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. Abrufen Sie die Liste aller Mitarbeiter, deren Name mit der letzten Buchstaben ‚a‘ endet
Lösung

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

Tabelle Employees. Abrufen Sie die 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. Abrufen Sie die Liste aller Mitarbeiter, deren Name mindestens 2 Buchstaben ‚n‘ enthĂ€lt
Lösung

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

Tabelle Employees. Abrufen Sie die Liste aller Mitarbeiter, deren Name mehr als 4 Buchstaben hat
Lösung

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

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

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tabelle Mitarbeiter. Holen Sie sich eine Liste aller Mitarbeiter, deren Vorname das Zeichen ‘%’ enthĂ€lt
Lösung

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

Tabelle Mitarbeiter. Holen Sie sich eine Liste aller ID der Manager
Lösung

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tabelle Mitarbeiter. 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;

Mit Einzelzeilenfunktionen Ausgaben anpassen

Tabelle Mitarbeiter. Holen Sie sich eine Liste aller Mitarbeiter, deren Vorname mehr als 10 Buchstaben hat
Lösung

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

Tabelle Mitarbeiter. 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 Mitarbeiter. 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 Mitarbeiter. Holen Sie sich eine Liste aller Mitarbeiter, deren Gehalt durch 1000 teilbar ist
Lösung

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

Mitarbeiter Tabelle. Holen Sie sich die ersten 3 Ziffern der Telefonnummer eines 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 '___.___.____';

Abteilungstabelle. Holen Sie sich das erste Wort aus dem Namen der Abteilung, fĂŒr die mehr als ein Wort im Titel vorhanden ist.
Lösung

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

Mitarbeiter Tabelle. 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;

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

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

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

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

Mitarbeiter Tabelle. Holen Sie sich eine Liste aller Mitarbeiter, die mehr als 17 Jahre in der Firma sind.
Lösung

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

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

WÄHLEN *
  AUS mitarbeitern
 WOHER     MOD (SUBSTR (telefon_nummer, -1), 2) != 0
       UND INSTR (telefon_nummer,'.',1,3) = 0;

Tabelle Mitarbeiter. Holen Sie sich eine Liste aller Mitarbeiter, deren job_id nach dem Zeichen '_' mindestens 3 Zeichen hat, wobei dieses Wert nach '_' nicht 'CLERK' gleich ist.
Lösung

WÄHLEN *
  AUS mitarbeitern
 WOHER     LÄNGE (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
       UND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';

Tabelle Mitarbeiter. Holen Sie sich eine Liste aller Mitarbeiter, indem Sie im Wert PHONE_NUMBER alle '.' durch '-' ersetzen.
Lösung

WÄHLEN telefon_nummer, ERSETZEN (telefon_nummer, '.', '-') neue_telefon_nummer
  AUS mitarbeitern;

Verwendung von Konversionsfunktionen und bedingten AusdrĂŒcken

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

WÄHLEN *
  AUS mitarbeitern
 WOHER TO_CHAR (eintrittsdatum, 'DD') = '01';

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

WÄHLEN *
  AUS mitarbeitern
 WOHER TO_CHAR (eintrittsdatum, 'YYYY') = '2008';

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

WÄHLEN TO_CHAR (SYSDATE, 'fm""Morgen ist ""Ddspth ""Tag von"" Monat') info
  AUS DUAL;

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

WÄHLEN vorname, TO_CHAR (eintrittsdatum, 'fmddth ""von"" Monat, YYYY') eintrittsdatum
  AUS mitarbeitern;

Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern mit einem Gehaltsanstieg von 20%. Zeigen Sie das Gehalt mit dem Dollarzeichen an.
Lösung

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

Tabelle Mitarbeiter. Holen Sie sich eine Liste aller Mitarbeiter, die im Februar 2007 in das Unternehmen eingetreten sind.
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 Mitarbeiter. Holen Sie sich eine Liste aller Mitarbeiter mit den GesamtgehÀltern (Gehalt + Kommission (%)) 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 Mitarbeiter. Holen Sie sich eine Liste aller Mitarbeiter und Informationen ĂŒber vorhandene Bonuszahlungen (Ja/Nein).
Lösung

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

Tabelle Mitarbeiter. Ermitteln Sie das Gehaltsniveau jedes Mitarbeiters: Weniger als 5000 gilt als niedrig, 5000 oder mehr und weniger als 10000 gilt als normal, 10000 oder mehr gilt als hoch.
Lösung

SELECT first_name,
       salary,
       CASE
           WHEN salary = 5000 AND salary < 10000 THEN 'Normal'
           ELSE 'Hoch'
       END salary_level
  FROM employees;

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

SELECT country_name country,
       DECODE (region_id,
               1, 'Europa',
               2, 'Amerika',
               3, 'Asien',
               4, 'Afrika',
               'Unbekannt')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Europa'
           WHEN 2 THEN 'Amerika'
           WHEN 3 THEN 'Asien'
           WHEN 4 THEN 'Afrika'
           ELSE 'Unbekannt'
       END
           region
  FROM countries;

Aggregierte Datenberichterstattung mit den Gruppierungsfunktionen

Tabelle Mitarbeiter. Erstellen Sie einen Bericht nach department_id mit dem niedrigsten und höchsten Gehalt, dem frĂŒhesten und spĂ€testen Einstellungsdatum und der Anzahl der Mitarbeiter. Sortieren Sie nach der Anzahl der Mitarbeiter (absteigend)
Lösung

  SELECT department_id,
         MIN (salary) min_salary,
         MAX (salary) max_salary,
         MIN (hire_date) min_hire_date,
         MAX (hire_date) max_hire_Date,
         COUNT (*) count
    FROM employees
GROUP BY department_id
ORDER BY COUNT(*) DESC;

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

SELECT SUBSTR(first_name, 1, 1) AS first_char, COUNT(*)
    FROM employees
GROUP BY SUBSTR(first_name, 1, 1)
  HAVING COUNT(*) > 1
ORDER BY 2 DESC;

Tabelle Mitarbeiter. Wie viele Mitarbeiter arbeiten in derselben Abteilung und erhalten dasselbe Gehalt?
Lösung

SELECT department_id, salary, COUNT(*)
    FROM employees
GROUP BY department_id, salary
  HAVING COUNT(*) > 1;

Tabelle Mitarbeiter. Erhalten Sie einen Bericht darĂŒber, wie viele Mitarbeiter an jedem Wochentag eingestellt wurden. Nach Anzahl sortieren.
Lösung

SELECT TO_CHAR(hire_Date, 'Day') AS day, COUNT(*)
    FROM employees
GROUP BY TO_CHAR(hire_Date, 'Day')
ORDER BY 2 DESC;

Tabelle Mitarbeiter. Erhalten Sie einen Bericht darĂŒber, wie viele Mitarbeiter jĂ€hrlich eingestellt wurden. Nach Anzahl sortieren.
Lösung

SELECT TO_CHAR(hire_date, 'YYYY') AS year, COUNT(*)
    FROM employees
GROUP BY TO_CHAR(hire_date, 'YYYY');

Tabelle Mitarbeiter. Erhalten Sie die Anzahl der Abteilungen, in denen Mitarbeiter beschÀftigt sind.
Lösung

SELECT COUNT(COUNT(*)) AS department_count
    FROM employees
   WHERE department_id IS NOT NULL
GROUP BY department_id;

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

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT(*) > 30;

Tabelle Mitarbeiter. Holen Sie sich die Liste der department_id und den gerundeten Durchschnittslohn der Angestellten in jeder Abteilung.
Lösung

  SELECT department_id, ROUND (AVG (salary)) avg_salary
    FROM employees
GROUP BY department_id;

Tabelle LĂ€nder. Holen Sie sich die Liste der region_id, fĂŒr die die Summe aller Buchstaben in den country_name mehr als 60 betrĂ€gt.
Lösung

  SELECT region_id
    FROM countries
GROUP BY region_id
  HAVING SUM (LENGTH (country_name)) > 60;

Tabelle Mitarbeiter. Holen Sie sich die Liste der department_id, in denen Angestellte mit mehreren (>1) job_id arbeiten.
Lösung

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (DISTINCT job_id) > 1;

Tabelle Mitarbeiter. Holen Sie sich die Liste der manager_id, deren Anzahl an Untergebenen grĂ¶ĂŸer als 5 ist und deren Gehaltssumme ĂŒber 50000 liegt.
Lösung

  SELECT manager_id
    FROM employees
GROUP BY manager_id
  HAVING COUNT (*) > 5 AND SUM (salary) > 50000;

Tabelle Mitarbeiter. Holen Sie sich die Liste der manager_id, deren durchschnittliches Gehalt aller Untergebenen zwischen 6000 und 9000 liegt und die keine Boni erhalten (commission_pct ist leer).
Lösung

  SELECT manager_id, AVG (salary) avg_salary
    FROM employees
   WHERE commission_pct IS NULL
GROUP BY manager_id
  HAVING AVG (salary) BETWEEN 6000 AND 9000;

Tabelle Mitarbeiter. Holen Sie sich das maximale Gehalt aller Angestellten, deren job_id mit dem Wort ‘CLERK’ endet.
Lösung

SELECT MAX (salary) max_salary
  FROM employees
 WHERE job_id LIKE '%CLERK';

SELECT MAX (salary) max_salary
  FROM employees
 WHERE SUBSTR (job_id, -5) = 'CLERK';

Tabelle Mitarbeiter. Die maximale Gehaltsspanne unter allen durchschnittlichen GehÀltern nach Abteilung erhalten.
Lösung

  SELECT MAX (AVG (salary))
    FROM employees
GROUP BY department_id;

Tabelle Mitarbeiter. Die Anzahl der Mitarbeiter mit der gleichen Anzahl an Buchstaben im Vornamen ermitteln. Dabei nur diejenigen anzeigen, deren Name lÀnger als 5 Buchstaben ist und deren Anzahl mehr als 20 betrÀgt. Nach der LÀnge des Namens sortieren.
Lösung

  SELECT LENGTH (first_name), COUNT (*)
    FROM employees
GROUP BY LENGTH (first_name)
  HAVING LENGTH (first_name) > 5 AND COUNT (*) > 20
ORDER BY LENGTH (first_name);

  SELECT LENGTH (first_name), COUNT (*)
    FROM employees
   WHERE LENGTH (first_name) > 5
GROUP BY LENGTH (first_name)
  HAVING COUNT (*) > 20
ORDER BY LENGTH (first_name);

Daten aus mehreren Tabellen mittels Joins anzeigen.

Tabelle Mitarbeiter, Abteilungen, Standorte, LĂ€nder, Regionen. Eine Liste der Regionen und die Anzahl der Mitarbeiter in jeder Region abrufen.
Lösung

  SELECT region_name, COUNT (*)
    FROM employees e
         JOIN departments d ON (e.department_id = d.department_id)
         JOIN locations l ON (d.location_id = l.location_id)
         JOIN countries c ON (l.country_id = c.country_id)
         JOIN regions r ON (c.region_id = r.region_id)
GROUP BY region_name;

Tabelle Mitarbeiter, Abteilungen, Standorte, LĂ€nder, Regionen. Detaillierte Informationen zu jedem Mitarbeiter abrufen:
Vorname, Nachname, Abteilung, Beruf, Straße, Land, Region
Lösung

WÄHLEN Sie Vorname,
       Nachname,
       Abteilungsname,
       Job-ID,
       Straßenadresse,
       Landesname,
       Regionsname
  AUS 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 Mitarbeiter. Zeigen Sie alle Manager an, die mehr als 6 Mitarbeiter unter sich haben.
Lösung

  WÄHLEN Sie man.vorname, COUNT (*)
    AUS Mitarbeitern emp JOIN Mitarbeitern man ON (emp.manager_id = man.employee_id)
GRUPPIEREN SIE NACH man.vorname
  HAVING COUNT (*) > 6;

Tabelle Mitarbeiter. Zeigen Sie alle Mitarbeiter an, die niemandem unterstellt sind.
Lösung

WÄHLEN Sie emp.vorname
  AUS Mitarbeitern emp
       LINKEN JOIN Mitarbeitern man ON (emp.manager_id = man.employee_id)
 WOHER man.VORNAME IST NULL;

WÄHLEN Sie vorname
  AUS Mitarbeitern
 WOHER manager_id IST NULL;

Tabelle Mitarbeiter, Jobhistorie. In der Tabelle Mitarbeiter sind alle Mitarbeiter gespeichert. In der Tabelle Jobhistorie sind Mitarbeiter gespeichert, die das Unternehmen verlassen haben. Berichten Sie ĂŒber alle Mitarbeiter und deren Status im Unternehmen (Aktiv oder das Unternehmen mit Abgangsdatum verlassen).
Beispiel:
vorname | status
Jennifer | Hat das Unternehmen am 31. Dezember 2006 verlassen.
Clara | Derzeit BeschÀftigt
Lösung

WÄHLEN Sie vorname,
       NVL2 (
           end_daumen,
           TO_CHAR (end_date, 'fm""Hat das Unternehmen verlassen am"" DD ""von"" Monat, YYYY'),
           'Derzeit BeschÀftigt')
           status
  AUS Mitarbeitern e LINKEN JOIN job_history j ON (e.employee_id = j.employee_id);

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

 SELECT first_name
  FROM employees
       JOIN departments USING (department_id)
       JOIN locations USING (location_id)
       JOIN countries USING (country_id)
       JOIN regions USING (region_id)
 WHERE region_name = 'Europe';
 
 SELECT first_name
  FROM employees e
       JOIN departments d ON (e.department_id = d.department_id)
       JOIN locations l ON (d.location_id = l.location_id)
       JOIN countries c ON (l.country_id = c.country_id)
       JOIN regions r ON (c.region_id = r.region_id)
 WHERE region_name = 'Europe';

Tabelle Mitarbeiter, Abteilungen. Zeigen Sie alle Abteilungen an, in denen mehr als 30 Mitarbeiter arbeiten.
Lösung

SELECT department_name, COUNT (*)
    FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
  HAVING COUNT (*) > 30;

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

SELECT first_name
  FROM employees e
       LEFT JOIN departments d ON (e.department_id = d.department_id)
 WHERE d.department_name IS NULL;

SELECT first_name
  FROM employees
 WHERE department_id IS NULL;

Tabelle Mitarbeiter, Abteilungen. Zeigen Sie alle Abteilungen an, in denen es keine Mitarbeiter gibt.
Lösung

SELECT department_name
  FROM employees e
       RIGHT JOIN departments d ON (e.department_id = d.department_id)
 WHERE first_name IS NULL;

Tabelle Mitarbeiter. Zeigen Sie alle Mitarbeiter, die keine Untergebenen haben.
Lösung

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

Tabelle Employees, Jobs, Abteilungen. Zeigen Sie Mitarbeiter im Format: First_name, Jobtitel, Abteilungsname.
Beispiel:
First_name | Jobtitel | Abteilungsname
Donald | Versand | Versandmitarbeiter
Lösung

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

Tabelle Employees. Erhalten Sie eine Liste von Mitarbeitern, deren Manager im Jahr 2005 eingestellt wurden, wÀhrend diese Mitarbeiter selbst vor 2005 eingestellt wurden.
Lösung

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

Tabelle Employees. Erhalten Sie 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.*
  VON employees emp
       JOIN employees man ON (emp.manager_id = man.employee_id)
       JOIN jobs j ON (emp.job_id = j.job_id)
 WO TO_CHAR (man.hire_date, 'MM') = '01' UND LENGTH (j.job_title) > 15;

Unterabfragen zur Lösung von Abfragen verwenden

Tabelle Employees. Erhalten Sie eine Liste der Mitarbeiter mit dem lÀngsten Namen.
Lösung

WÄHLEN Sie *
  VON employees
 WO LENGTH (first_name) =
       (WÄHLEN Sie MAX (LENGTH (first_name)) VON employees);

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

SELECT *
  FROM employees
 WHERE salary > (SELECT AVG (salary) FROM employees);

Tabelle Mitarbeiter, Abteilungen, Standorte. Finden Sie die Stadt, in der die Mitarbeiter insgesamt weniger verdienen als ĂŒberall sonst.
Lösung

SELECT city
    FROM employees e
         JOIN departments d ON (e.department_id = d.department_id)
         JOIN locations l ON (d.location_id = l.location_id)
GROUP BY city
  HAVING SUM (salary) =
         (  SELECT MIN (SUM (salary))
              FROM employees e
                   JOIN departments d ON (e.department_id = d.department_id)
                   JOIN locations l ON (d.location_id = l.location_id)
          GROUP BY city);

Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern, deren Manager ein Gehalt von ĂŒber 15.000 Euro erhĂ€lt.
Lösung

SELECT *
  FROM employees
 WHERE manager_id IN (SELECT employee_id
                        FROM employees
                       WHERE salary > 15000)

Tabelle Mitarbeiter, Abteilungen. Zeigen Sie alle Abteilungen an, in denen es keine Mitarbeiter gibt.
Lösung

SELECT *
  FROM departments
 WHERE department_id NOT IN (SELECT department_id
                               FROM employees
                              WHERE department_id IS NOT NULL);

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

SELECT *
  FROM employees
 WHERE employee_id NOT IN (SELECT manager_id
                             FROM employees
                            WHERE manager_id IS NOT NULL)

Tabelle Mitarbeiter. Zeigen Sie alle Manager an, die mehr als 6 Mitarbeiter unter sich haben.
Lösung

SELECT *
  FROM employees e
 WHERE (SELECT COUNT (*)
          FROM employees
         WHERE manager_id = e.employee_id) > 6;

Tabelle Mitarbeiter, Abteilungen. Zeigen Sie die Mitarbeiter an, die in der IT-Abteilung tÀtig sind.
Lösung

WÄHLEN *
  AUS Mitarbeitern
 WHERE abteilung_id = (WÄHLEN abteilung_id
                          AUS abteilungen
                         WHERE abteilungsname = 'IT');

Tabelle Employees, Jobs, Abteilungen. Zeigen Sie Mitarbeiter im Format: First_name, Jobtitel, Abteilungsname.
Beispiel:
First_name | Jobtitel | Abteilungsname
Donald | Versand | Versandmitarbeiter
Lösung

WÄHLEN vorname,
       (WÄHLEN beruf_bezeichnung
          AUS jobs
         WHERE beruf_id = e.beruf_id)
           beruf_bezeichnung,
       (WÄHLEN abteilungsname
          AUS abteilungen
         WHERE abteilung_id = e.abteilung_id)
           abteilungsname
  AUS Mitarbeitern e;

Tabelle Employees. Erhalten Sie eine Liste von Mitarbeitern, deren Manager im Jahr 2005 eingestellt wurden, wÀhrend diese Mitarbeiter selbst vor 2005 eingestellt wurden.
Lösung

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

Tabelle Employees. Erhalten Sie 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 *
  AUS Mitarbeitern e
 WHERE     manager_id IN (WÄHLEN mitarbeiter_id
                            AUS Mitarbeitern
                           WHERE TO_CHAR (einstellungsdatum, 'MM') = '01')
       UND (WÄHLEN LÄNGE (beruf_bezeichnung)
              AUS jobs
             WHERE beruf_id = e.beruf_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 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

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster