SQL Unterhaltsame RĂ€tsel

Hallo Habr!

Seit ĂŒber 3 Jahren unterrichte ich SQL in verschiedenen Schulungszentren. Eine meiner Beobachtungen ist, dass die SchĂŒler SQL besser beherrschen und verstehen, wenn sie eine Aufgabe festlegen, und nicht nur ĂŒber die Möglichkeiten und theoretischen Grundlagen sprechen.

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



SQL (ˈɛsˈkjuˈɛl; englische strukturierte Abfragesprache) ist eine deklarative Programmiersprache, mit der Daten in einer relationalen Datenbank erstellt, geĂ€ndert und verwaltet werden, die von einem geeigneten Datenbankverwaltungssystem verwaltet wird. Erfahren Sie mehr

Sie können SQL aus verschiedenen Quellen lesen.
Dieser Artikel soll Ihnen SQL nicht von Grund auf beibringen.

Also lass uns gehen.

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


Ich stelle fest, dass wir nur SELECT-Aufgaben berĂŒcksichtigen werden. Es gibt keine Probleme mit DML und DDL.

Die Aufgaben


Daten einschrÀnken und sortieren

Mitarbeitertabelle. Holen Sie sich eine Liste mit Informationen zu allen Mitarbeitern
Lösung
SELECT * FROM employees 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter mit dem Namen "David"
Lösung
 SELECT * FROM employees WHERE first_name = 'David'; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter mit job_id gleich 'IT_PROG'
Lösung
 SELECT * FROM employees WHERE job_id = 'IT_PROG' 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter aus der 50. Abteilung (department_id) mit einem Gehalt (Gehalt) von mehr als 4000
Lösung
 SELECT * FROM employees WHERE department_id = 50 AND salary > 4000; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter der 20. und 30. Abteilung (abteilungs_id)
Lösung
 SELECT * FROM employees WHERE department_id = 20 OR department_id = 30; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter, deren letzter Buchstabe im Namen "a" ist.
Lösung
 SELECT * FROM employees WHERE first_name LIKE '%a'; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter der 50. und 80. Abteilung (department_id), die einen Bonus haben (der 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; 


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


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter, deren Name lÀnger als 4 Buchstaben ist
Lösung
 SELECT * FROM employees WHERE first_name LIKE '%_____%'; 


Mitarbeitertabelle. Erhalten Sie eine Liste aller Mitarbeiter, deren Gehalt im Bereich von 8000 bis 9000 (einschließlich) liegt.
Lösung
 SELECT * FROM employees WHERE salary BETWEEN 8000 AND 9000; 


Mitarbeitertabelle. Rufen Sie eine Liste aller Mitarbeiter ab, deren Name das Zeichen '%' enthÀlt.
Lösung
 SELECT * FROM employees WHERE first_name LIKE '%\%%' ESCAPE '\'; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller ID-Manager
Lösung
 SELECT DISTINCT manager_id FROM employees WHERE manager_id IS NOT NULL; 


Mitarbeitertabelle. 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; 



Verwenden einzeiliger Funktionen zum Anpassen der Ausgabe

Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter, deren Name lÀnger als 10 Buchstaben ist
Lösung
 SELECT * FROM employees WHERE LENGTH (first_name) > 10; 


Mitarbeitertabelle. Erhalten Sie eine Liste aller Mitarbeiter, deren Name den Buchstaben "b" enthĂ€lt (Groß- und Kleinschreibung wird nicht berĂŒcksichtigt).
Lösung
 SELECT * FROM employees WHERE INSTR (LOWER (first_name), 'b') > 0; 


Mitarbeitertabelle. 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; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter, deren Gehalt ein Vielfaches von 1000 ist
Lösung
 SELECT * FROM employees WHERE MOD (salary, 1000) = 0; 


Mitarbeitertabelle. Rufen Sie die erste dreistellige Nummer der Telefonnummer des Mitarbeiters ab, wenn seine Nummer das Format XXXX.XXX.XXXX hat
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 diejenigen mit mehr als einem Wort im Namen
Lösung
 SELECT department_name, SUBSTR (department_name, 1, INSTR (department_name, ' ')-1) first_word FROM departments WHERE INSTR (department_name, ' ') > 0; 


Mitarbeitertabelle. Holen Sie sich die Namen der Mitarbeiter 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; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter, deren letzter Buchstabe im Namen 'm' und ein langer Name 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 nÀchsten Freitag Datum
Lösung
 SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL; 


Mitarbeitertabelle. 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; 


Mitarbeitertabelle. Holen Sie sich 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 AND INSTR (phone_number,'.',1,2) > 0; 


Mitarbeitertabelle. Rufen Sie eine Liste aller Mitarbeiter ab, deren Job_id-Wert nach dem Zeichen '_' mindestens 3 Zeichen enthÀlt. Dieser Wert nach '_' entspricht jedoch nicht 'CLERK'.
Lösung
 SELECT * FROM employees WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3 AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK'; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter, indem Sie alle '.' Im Wert PHONE_NUMBER ersetzen. auf '-'
Lösung
 SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number FROM employees; 



Verwenden von Konvertierungsfunktionen und bedingten AusdrĂŒcken

Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter, die am ersten Tag des Monats zur Arbeit gekommen sind (beliebig)
Lösung
 SELECT * FROM employees WHERE TO_CHAR (hire_date, 'DD') = '01'; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter, die 2008 zur Arbeit kamen
Lösung
 SELECT * FROM employees WHERE TO_CHAR (hire_date, 'YYYY') = '2008'; 


DUAL Tabelle. Zeigen Sie das Datum von morgen 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; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter und das Datum, an dem alle zur Arbeit kamen, im Format: 21. Juni 2007
Lösung
 SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date FROM employees; 


Mitarbeitertabelle. Holen Sie sich eine Liste der Mitarbeiter mit um 20% höheren 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; 


Mitarbeitertabelle. Holen Sie sich eine Liste aller Mitarbeiter, die im Februar 2007 zur Arbeit kommen.
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 Tabelle. Nehmen Sie das aktuelle Datum, + Sekunde, + Minute, + Stunde, + Tag, + Monat, + Jahr heraus
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; 


Mitarbeitertabelle. Erhalten Sie eine Liste aller Mitarbeiter mit vollem Gehalt (Gehalt + Provision_Pkt (%)) im Format: 24.000,00 USD
Lösung
 SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary FROM employees; 


Mitarbeitertabelle. Erhalten Sie eine Liste aller Mitarbeiter und Informationen zur VerfĂŒgbarkeit von GehaltsprĂ€mien (Ja / Nein)
Lösung
 SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus FROM employees; 


Mitarbeitertabelle. Ermitteln Sie das Gehaltsniveau jedes Mitarbeiters: Weniger als 5000 gelten als niedrig, mehr als oder gleich 5000 und weniger als 10000 als normal, mehr als oder gleich 10000 als hoch
Lösung
 SELECT first_name, salary, CASE WHEN salary < 5000 THEN 'Low' WHEN salary >= 5000 AND salary < 10000 THEN 'Normal' WHEN salary >= 10000 THEN 'High' ELSE 'Unknown' END salary_level FROM employees; 


LĂ€ndertabelle. Zeigen Sie fĂŒr jedes Land die Region an, in der es sich befindet: 1-Europa, 2-Amerika, 3-Asien, 4-Afrika (ohne Beitritt)
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

Mitarbeitertabelle. Erhalten Sie einen Bericht ĂŒber department_id mit einem Mindest- und Höchstgehalt, einem frĂŒhen und spĂ€ten Ankunftsdatum bei der Arbeit 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; 


Mitarbeitertabelle. Wie viele Mitarbeiter, deren Namen mit demselben Buchstaben beginnen? Nach Menge sortieren. Zeigen Sie nur, wo die Menge 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; 


Mitarbeitertabelle. 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; 


Mitarbeitertabelle. 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; 


Mitarbeitertabelle. 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'); 


Mitarbeitertabelle. Ermitteln Sie die Anzahl der Abteilungen, in denen Mitarbeiter beschÀftigt sind
Lösung
 SELECT COUNT (COUNT (*)) department_count FROM employees WHERE department_id IS NOT NULL GROUP BY department_id; 


Mitarbeitertabelle. Holen Sie sich eine Liste von department_id mit mehr als 30 Mitarbeitern
Lösung
  SELECT department_id FROM employees GROUP BY department_id HAVING COUNT (*) > 30; 


Mitarbeitertabelle. Holen Sie sich eine Liste von department_id und ein gerundetes Durchschnittsgehalt fĂŒr Mitarbeiter in jeder Abteilung.
Lösung
  SELECT department_id, ROUND (AVG (salary)) avg_salary FROM employees GROUP BY department_id; 


LĂ€ndertabelle. Holen Sie sich eine Liste von region_id die Summe aller Buchstaben aller country_name, in denen mehr als 60
Lösung
  SELECT region_id FROM countries GROUP BY region_id HAVING SUM (LENGTH (country_name)) > 60; 


Mitarbeitertabelle. Rufen Sie eine Liste der Abteilungs-ID ab, in der Mitarbeiter mehrerer (> 1) Job-ID arbeiten
Lösung
  SELECT department_id FROM employees GROUP BY department_id HAVING COUNT (DISTINCT job_id) > 1; 


Mitarbeitertabelle. Holen Sie sich eine Liste von manager_id, deren Anzahl der Untergebenen mehr als 5 betrÀgt und deren Summe aller GehÀlter seiner Untergebenen mehr als 50.000 betrÀgt
Lösung
  SELECT manager_id FROM employees GROUP BY manager_id HAVING COUNT (*) > 5 AND SUM (salary) > 50000; 


Mitarbeitertabelle. Holen Sie sich eine Liste von manager_id, fĂŒr die das durchschnittliche Gehalt aller seiner Untergebenen im Bereich von 6000 bis 9000 liegt, 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; 


Mitarbeitertabelle. Holen Sie sich das maximale Gehalt von allen Mitarbeitern job_id, die mit dem Wort "CLERK" enden.
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'; 


Mitarbeitertabelle. Holen Sie sich das maximale Gehalt unter allen DurchschnittsgehÀltern in der Abteilung
Lösung
  SELECT MAX (AVG (salary)) FROM employees GROUP BY department_id; 


Mitarbeitertabelle. Ermitteln Sie die Anzahl der Mitarbeiter mit der gleichen Anzahl von Buchstaben im Namen. Zeigen Sie gleichzeitig nur diejenigen mit einer NamenslÀnge von mehr als 5 und einer Anzahl von Mitarbeitern mit diesem Namen von mehr als 20 an. 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 VerknĂŒpfungen

Tabelle Mitarbeiter, Abteilungen, Standorte, LĂ€nder, Regionen. Holen Sie sich eine Liste der Regionen und die 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); 


Mitarbeitertabelle. Zeigen Sie alle Manager mit mehr als 6 Mitarbeitern
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; 


Mitarbeitertabelle. Zeigen Sie alle Mitarbeiter an, die niemandem Bericht erstatten
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 die Mitarbeiter gespeichert, die das Unternehmen verlassen haben. Erhalten Sie einen Bericht ĂŒber alle Mitarbeiter und ihren Status im Unternehmen (arbeitet oder verlĂ€sst das Unternehmen mit dem Datum der Abreise)
Ein Beispiel:
Vorname | Status
Jennifer | Hat das Unternehmen am 31. Dezember 2006 verlassen
Clara | Derzeit arbeitet
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. Holen Sie sich 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'; 


Mitarbeitertabelle, Abteilungen. Zeigen Sie alle Abteilungen mit mehr als 30 Mitarbeitern
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; 


Mitarbeitertabelle, 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; 


Mitarbeitertabelle, Abteilungen. Alle Abteilungen ohne einen 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; 


Mitarbeitertabelle. Zeigen Sie alle Mitarbeiter an, 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; 


Tischangestellte, Jobs, Abteilungen. Zeigen Sie Mitarbeiter im Format: Vorname, Jobtitel, Abteilungsname.
Ein Beispiel:
Vorname | Job_title | 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); 


Mitarbeitertabelle. Holen Sie sich eine Liste der Mitarbeiter, deren Manager 2005 einen Job bekommen haben, aber gleichzeitig haben diese Mitarbeiter 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'); 


Mitarbeitertabelle. Holen Sie sich eine Liste der Mitarbeiter, deren Manager im Januar eines jeden Jahres einen Job bekommen haben, und die LÀnge des job_title dieser Mitarbeiter betrÀgt mehr als 15 Zeichen
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

Mitarbeitertabelle. Holen Sie sich 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); 


Mitarbeitertabelle. Holen Sie sich eine Liste der Mitarbeiter mit einem Gehalt, das ĂŒ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 eine Stadt, in der Mitarbeiter insgesamt weniger 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); 


Mitarbeitertabelle. Holen Sie sich eine Liste der Mitarbeiter, deren Manager ein Gehalt von mehr als 15.000 erhÀlt.
Lösung
 SELECT * FROM employees WHERE manager_id IN (SELECT employee_id FROM employees WHERE salary > 15000) 


Mitarbeitertabelle, Abteilungen. Alle Abteilungen ohne einen Mitarbeiter anzeigen
Lösung
 SELECT * FROM departments WHERE department_id NOT IN (SELECT department_id FROM employees WHERE department_id IS NOT NULL); 


Mitarbeitertabelle. Zeigen Sie alle Mitarbeiter, 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) 


Mitarbeitertabelle. Zeigen Sie alle Manager mit mehr als 6 Mitarbeitern
Lösung
 SELECT * FROM employees e WHERE (SELECT COUNT (*) FROM employees WHERE manager_id = e.employee_id) > 6; 


Mitarbeitertabelle, Abteilungen. Zeigen Sie Mitarbeitern, die in der IT-Abteilung arbeiten
Lösung
 SELECT * FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'IT'); 


Tischangestellte, Jobs, Abteilungen. Zeigen Sie Mitarbeiter im Format: Vorname, Jobtitel, Abteilungsname.
Ein Beispiel:
Vorname | Job_title | 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; 


Mitarbeitertabelle. Holen Sie sich eine Liste der Mitarbeiter, deren Manager 2005 einen Job bekommen haben, aber gleichzeitig haben diese Mitarbeiter 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'); 


Mitarbeitertabelle. Holen Sie sich eine Liste der Mitarbeiter, deren Manager im Januar eines jeden Jahres einen Job bekommen haben, und die LÀnge des job_title dieser Mitarbeiter betrÀgt mehr als 15 Zeichen
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 faszinierend.
Wenn möglich, werde ich diese Aufgabenliste ergÀnzen.
Ich freue mich auch ĂŒber Kommentare und VorschlĂ€ge.

PS: Wenn jemand eine interessante SELECT-Aufgabe hat, schreibe in die Kommentare und fĂŒge sie der Liste hinzu.

Vielen Dank.

Source: https://habr.com/ru/post/de461567/


All Articles