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 (ˈɛ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.
Sie können von verschiedenen Seiten über SQL lesen
Dieser Artikel ist nicht dazu gedacht, Ihnen SQL von Grund auf beizubringen.
Also lass uns gehen
Wir werden das Bekannte verwenden
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