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 (ËÉ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.
Ăber SQL kann man aus verschiedenen Quellen lesen. .
Dieser Artikel verfolgt nicht das Ziel, Sie von Grund auf in SQL einzuarbeiten.
Also, legen wir los.
Wir verwenden das allgemein bekannte in Oracle mit seinen Tabellen ():

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
