SQL. Unterhaltsame Rätsel

Hallo Habr!

Seit mehr als 3 Jahren unterrichte ich SQL in verschiedenen Schulungszentren und eine meiner Beobachtungen ist, dass Studierende SQL besser beherrschen und verstehen, wenn ihnen eine Aufgabe gestellt wird und nicht nur über die Möglichkeiten und theoretischen Grundlagen gesprochen wird.

In diesem Artikel werde ich meine Liste von Aufgaben mit Ihnen teilen, die ich den Schülern als Hausaufgaben gebe und zu denen wir verschiedene Arten von Brainstormings durchführen, die zu einem tiefen und klaren Verständnis von SQL führen.

SQL. Unterhaltsame Rätsel

SQL (ˈɛsˈkjuˈɛl; dt. strukturierte Abfragesprache) ist eine deklarative Programmiersprache, die zum Erstellen, Ändern und Verwalten von Daten in einer relationalen Datenbank verwendet wird, die von einem geeigneten Datenbankverwaltungssystem verwaltet wird. Weitere Details ...

Sie können von verschiedenen Seiten über SQL lesen von Quellen.
Dieser Artikel ist nicht dazu gedacht, Ihnen SQL von Grund auf beizubringen.

Also lass uns gehen

Wir werden das Bekannte verwenden HR-Schema in Oracle mit seinen Tabellen (mehr):

SQL. Unterhaltsame Rätsel
Ich stelle fest, dass wir nur Aufgaben für SELECT berücksichtigen. Es gibt keine Aufgaben für DML und DDL.

Aufgaben

Daten einschränken und sortieren

Mitarbeitertisch. Erhalten Sie eine Liste mit Informationen zu allen Mitarbeitern
Lösung

SELECT * FROM employees

Mitarbeitertisch. Holen Sie sich eine Liste aller Mitarbeiter mit dem Namen „David“
Lösung

SELECT *
  FROM employees
 WHERE first_name = 'David';

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter mit job_id gleich „IT_PROG“.
Lösung

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter 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;

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter der 20. und der 30. Abteilung (department_id)
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, deren letzter Buchstabe „a“ ist.
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter der 50. und der 80. Abteilung (department_id), die einen Bonus haben (der Wert in der Spalte provisions_pct ist nicht leer).
Lösung

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

Mitarbeitertisch. 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%';

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, deren Name länger als 4 Buchstaben ist
Lösung

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

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

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, deren Name das Symbol „%“ enthält.
Lösung

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

Mitarbeitertisch. Rufen Sie eine Liste aller Manager-IDs ab
Lösung

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Mitarbeitertisch. Erhalten Sie eine Liste der Mitarbeiter mit ihren Positionen im Format: Donald(sh_clerk)
Lösung

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

Verwenden von einzeiligen Funktionen zum Anpassen der Ausgabe

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, deren Name länger als 10 Buchstaben ist
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, deren Name den Buchstaben „b“ enthält (Groß- und Kleinschreibung wird nicht beachtet)
Lösung

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

Mitarbeitertisch. Holen Sie sich eine Liste aller Mitarbeiter, deren Name mindestens 2 Buchstaben „a“ enthält
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, deren Gehalt ein Vielfaches von 1000 beträgt
Lösung

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

Mitarbeitertisch. Rufen Sie die erste dreistellige Nummer der Telefonnummer des Mitarbeiters ab, wenn seine Nummer das Format ХХХ.ХХХ.ХХХХ hat
Lösung

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

Abteilungstabelle. Erhalten Sie das erste Wort aus dem Abteilungsnamen 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;

Mitarbeitertisch. Erhalten Sie Mitarbeiternamen ohne den ersten und letzten Buchstaben im Namen
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, deren letzter Buchstabe im Namen gleich „m“ ist und deren Länge größer als 5 ist
Lösung

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

Doppeltisch. Holen Sie sich den Termin für nächsten Freitag
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, die seit über 17 Jahren im Unternehmen tätig sind
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, deren letzte Ziffer der Telefonnummer ungerade ist und aus 3 durch einen Punkt getrennten Zahlen besteht
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, deren job_id-Wert nach dem Zeichen „_“ mindestens 3 Zeichen enthält, dieser Wert nach dem Zeichen „_“ jedoch nicht gleich „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';

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, indem Sie alle „.“ im PHONE_NUMBER-Wert ersetzen An '-'
Lösung

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

Verwenden von Konvertierungsfunktionen und bedingten Ausdrücken

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, die am ersten Tag des Monats (beliebig) zur Arbeit gekommen sind.
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, die 2008 zur Arbeit kamen
Lösung

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

DUAL-Tisch. Zeigen Sie das morgige Datum im Format an: Morgen ist der zweite Tag im Januar
Lösung

SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month')     info
  FROM DUAL;

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter und deren Startdatum im Format: 21. Juni 2007
Lösung

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
  FROM employees;

Mitarbeitertisch. Erhalten Sie eine Liste der Mitarbeiter mit um 20 % erhöhten Gehältern. Gehalt mit Dollarzeichen anzeigen
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter, die im Februar 2007 zur Arbeit kamen.
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'; 

DUAL-Tisch. Aktuelles Datum, + Sekunde, + Minute, + Stunde, + Tag, + Monat, + Jahr exportieren
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;

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter mit vollen Gehältern (Gehalt + Provision_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;

Mitarbeitertisch. Erhalten Sie eine Liste aller Mitarbeiter und Informationen über die Verfügbarkeit von Gehaltsprämien (Ja/Nein)
Lösung

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
  FROM employees;

Mitarbeitertisch. Erhalten Sie das Gehaltsniveau jedes Mitarbeiters: Weniger als 5000 gelten als niedriges Niveau, größer oder gleich 5000 und weniger als 10000 gelten als normales Niveau, größer als und gleich 10000 gelten als hohes Niveau
Lösung

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

Ländertabelle. Zeigen Sie für jedes Land die Region an, in der es liegt: 1-Europa, 2-Amerika, 3-Asien, 4-Afrika (ohne Join)
Lösung

SELECT country_name country,
       DECODE (region_id,
               1, 'Europe',
               2, 'America',
               3, 'Asia',
               4, 'Africa',
               'Unknown')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Europe'
           WHEN 2 THEN 'America'
           WHEN 3 THEN 'Asia'
           WHEN 4 THEN 'Africa'
           ELSE 'Unknown'
       END
           region
  FROM countries;

Aggregierte Daten mithilfe der Gruppenfunktionen melden

Mitarbeitertisch. Erhalten Sie einen Bericht von „department_id“ mit Mindest- und Höchstgehalt, frühen und späten Ankunftsdaten und der Anzahl der Mitarbeiter. Sortieren nach 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;

Mitarbeitertisch. Wie viele Mitarbeiter beginnen mit demselben Buchstaben? Nach Menge sortieren. Zeigen Sie nur diejenigen an, bei denen die Zahl größer als 1 ist
Lösung

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

Mitarbeitertisch. Wie viele Mitarbeiter arbeiten in derselben Abteilung und erhalten das gleiche Gehalt?
Lösung

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

Mitarbeitertisch. Erhalten Sie einen Bericht darüber, wie viele Mitarbeiter an jedem Wochentag eingestellt wurden. Nach Menge sortieren
Lösung

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

Mitarbeitertisch. Erhalten Sie einen Bericht darüber, wie viele Mitarbeiter pro Jahr eingestellt wurden. Nach Menge sortieren
Lösung

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

Mitarbeitertisch. Ermitteln Sie die Anzahl der Abteilungen mit Mitarbeitern
Lösung

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

Mitarbeitertisch. Rufen Sie eine Liste der Abteilungs-IDs mit mehr als 30 Mitarbeitern ab
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste der Abteilungs-IDs und des gerundeten Durchschnittsgehalts der Mitarbeiter in jeder Abteilung.
Lösung

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

Ländertabelle. Erhalten Sie eine Liste der Regions-ID-Summe aller Buchstaben aller Ländernamen mit mehr als 60
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste der Abteilungs-IDs, in denen Mitarbeiter mehrerer (>1) Job-IDs arbeiten
Lösung

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

Mitarbeitertisch. Rufen Sie eine Liste der manager_id ab, deren Anzahl an Untergebenen größer als 5 ist und deren Summe aller Gehälter seiner Untergebenen größer als 50000 ist
Lösung

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

Mitarbeitertisch. Erhalten Sie eine Liste von manager_id, deren durchschnittliches Gehalt aller seiner 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;

Mitarbeitertisch. Holen Sie sich das Höchstgehalt aller Mitarbeiter. Job-ID, die 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';

Mitarbeitertisch. Erhalten Sie das Höchstgehalt aller Durchschnittsgehälter für die Abteilung
Lösung

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

Mitarbeitertisch. Ermitteln Sie die Anzahl der Mitarbeiter mit der gleichen Anzahl an Buchstaben im Namen. Gleichzeitig werden nur diejenigen angezeigt, deren Name länger als 5 ist und die Anzahl der Mitarbeiter mit demselben Namen mehr als 20 beträgt. Sortieren Sie nach Namenslänge
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);

Anzeigen von Daten aus mehreren Tabellen mithilfe von Joins

Tabelle Mitarbeiter, Abteilungen, Standorte, Länder, Regionen. Erhalten Sie eine Liste der Regionen und der Anzahl der Mitarbeiter in jeder Region
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. Erhalten Sie detaillierte Informationen zu jedem Mitarbeiter:
Vorname, Nachname, Abteilung, Job, Straße, Land, Region
Lösung

SELECT First_name,
       Last_name,
       Department_name,
       Job_id,
       street_address,
       Country_name,
       Region_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);

Mitarbeitertisch. Alle Manager anzeigen, die mehr als 6 Mitarbeiter haben
Lösung

  SELECT man.first_name, COUNT (*)
    FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
GROUP BY man.first_name
  HAVING COUNT (*) > 6;

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

SELECT emp.first_name
  FROM employees  emp
       LEFT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE man.FIRST_NAME IS NULL;

SELECT first_name
  FROM employees
 WHERE manager_id IS NULL;

Mitarbeitertabelle, Job_history. In der Mitarbeitertabelle werden alle Mitarbeiter gespeichert. In der Tabelle Job_history werden Mitarbeiter gespeichert, die das Unternehmen verlassen haben. Erhalten Sie einen Bericht über alle Mitarbeiter und deren Status im Unternehmen (angestellt oder aus dem Unternehmen ausgeschieden mit Austrittsdatum)
Beispiel:
Vorname | Status
jennifer | Verließ das Unternehmen zum 31. Dezember 2006
Clara | Funktioniert derzeit
Lösung

SELECT first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Left the company at"" DD ""of"" Month, YYYY'),
           'Currently Working')
           status
  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);

Tabelle Mitarbeiter, Abteilungen, Standorte, Länder, Regionen. Erhalten Sie eine Liste der Mitarbeiter, die in Europa leben (region_name)
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';

Tischmitarbeiter, Abteilungen. Alle Abteilungen mit mehr als 30 Mitarbeitern anzeigen
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;

Tischmitarbeiter, Abteilungen. Zeigen Sie alle Mitarbeiter an, die keiner Abteilung angehören
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;

Tischmitarbeiter, Abteilungen. Alle Abteilungen ohne Mitarbeiter anzeigen
Lösung

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

Mitarbeitertisch. Alle Mitarbeiter anzeigen, die keine Untergebenen haben
Lösung

SELECT man.first_name
  FROM employees  emp
       RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE emp.FIRST_NAME IS NULL;

Tabelle Mitarbeiter, Jobs, Abteilungen. Zeigen Sie Mitarbeiter im Format an: Vorname, Jobtitel, Abteilungsname.
Beispiel:
Vorname | Berufsbezeichnung | Abteilungsname
Donald | Versand | Sachbearbeiter Versand
Lösung

SELECT first_name, job_title, department_name
  FROM employees  e
       JOIN jobs j ON (e.job_id = j.job_id)
       JOIN departments d ON (d.department_id = e.department_id);

Mitarbeitertisch. Erhalten Sie eine Liste der Mitarbeiter, deren Manager im Jahr 2005 einen Job bekamen, aber gleichzeitig haben diese Arbeitnehmer selbst vor 2005 einen Job bekommen
Lösung

SELECT emp.*
  FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE     TO_CHAR (man.hire_date, 'YYYY') = '2005'
       AND emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Mitarbeitertisch. Rufen Sie eine Liste der Mitarbeiter ab, deren Vorgesetzte im Januar eines jeden Jahres eine Stelle angenommen haben und deren Jobtitel mehr als 15 Zeichen lang sind
Lösung

SELECT emp.*
  FROM employees  emp
       JOIN employees 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' AND LENGTH (j.job_title) > 15;

Verwenden von Unterabfragen zum Lösen von Abfragen

Mitarbeitertisch. Erhalten Sie eine Liste der Mitarbeiter mit dem längsten Namen.
Lösung

SELECT *
  FROM employees
 WHERE LENGTH (first_name) =
       (SELECT MAX (LENGTH (first_name)) FROM employees);

Mitarbeitertisch. Erhalten Sie eine Liste der Mitarbeiter, deren Gehalt über dem Durchschnittsgehalt aller Mitarbeiter liegt.
Lösung

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

Tabelle Mitarbeiter, Abteilungen, Standorte. Holen Sie sich die Stadt, in der die Mitarbeiter insgesamt am wenigsten verdienen.
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);

Mitarbeitertisch. Erhalten Sie eine Liste der Mitarbeiter, deren Manager ein Gehalt von mehr als 15000 erhält.
Lösung

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

Tischmitarbeiter, Abteilungen. Alle Abteilungen ohne Mitarbeiter anzeigen
Lösung

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

Mitarbeitertisch. Alle Mitarbeiter anzeigen, die keine Führungskräfte sind
Lösung

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

Mitarbeitertisch. Alle Manager anzeigen, die mehr als 6 Mitarbeiter haben
Lösung

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

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

SELECT *
  FROM employees
 WHERE department_id = (SELECT department_id
                          FROM departments
                         WHERE department_name = 'IT');

Tabelle Mitarbeiter, Jobs, Abteilungen. Zeigen Sie Mitarbeiter im Format an: Vorname, Jobtitel, Abteilungsname.
Beispiel:
Vorname | Berufsbezeichnung | Abteilungsname
Donald | Versand | Sachbearbeiter Versand
Lösung

SELECT first_name,
       (SELECT job_title
          FROM jobs
         WHERE job_id = e.job_id)
           job_title,
       (SELECT department_name
          FROM departments
         WHERE department_id = e.department_id)
           department_name
  FROM employees e;

Mitarbeitertisch. Erhalten Sie eine Liste der Mitarbeiter, deren Manager im Jahr 2005 einen Job bekamen, aber gleichzeitig haben diese Arbeitnehmer selbst vor 2005 einen Job bekommen
Lösung

SELECT *
  FROM employees
 WHERE     manager_id IN (SELECT employee_id
                            FROM employees
                           WHERE TO_CHAR (hire_date, 'YYYY') = '2005')
       AND hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Mitarbeitertisch. Rufen Sie eine Liste der Mitarbeiter ab, deren Vorgesetzte im Januar eines jeden Jahres eine Stelle angenommen haben und deren Jobtitel mehr als 15 Zeichen lang sind
Lösung

SELECT *
  FROM employees e
 WHERE     manager_id IN (SELECT employee_id
                            FROM employees
                           WHERE TO_CHAR (hire_date, 'MM') = '01')
       AND (SELECT LENGTH (job_title)
              FROM jobs
             WHERE job_id = e.job_id) > 15;

Das ist alles für jetzt.

Ich hoffe, die Aufgaben waren interessant und spannend.
Ich werde diese Liste so weit wie möglich ergänzen.
Auch über Kommentare und Anregungen freue ich mich.

PS: Wenn jemand eine interessante Aufgabe zu SELECT hat, schreibt es in die Kommentare, ich werde sie der Liste hinzufügen.

Vielen Dank.

Source: habr.com

Kommentar hinzufügen