Hallo, Habr!
Seit über 3 Jahren unterrichte ich SQL in verschiedenen Schulungszentren, und eine meiner Beobachtungen ist, dass die Studenten SQL besser erlernen und verstehen, wenn sie Aufgaben gestellt bekommen, anstatt nur über die Möglichkeiten und theoretischen Grundlagen zu sprechen.
In diesem Artikel werde ich meine Liste von Aufgaben mit Ihnen teilen, die ich meinen Schülern als Hausaufgaben gebe und über die wir verschiedene Brainstormings durchführen, was zu einem tiefen und klaren Verständnis von SQL führt.

SQL (ˈɛsˈkjuˈɛl; engl. structured query language — „Sprache für strukturierte Abfragen“) ist eine deklarative Programmiersprache, die verwendet wird, um Daten in einem relationalen Datenbankmanagementsystem zu erstellen, zu ändern und zu verwalten.
Über SQL kann man aus verschiedenen .
Dieser Artikel hat nicht das Ziel, Sie SQL von Grund auf zu lehren.
Also, lass uns anfangen.
Wir werden das allgemein bekannte in Oracle mit seinen Tabellen verwenden ():

Ich möchte anmerken, dass wir nur SELECT-Aufgaben betrachten werden. Es gibt keine Aufgaben zu DML und DDL.
Aufgaben
Daten einschränken und sortieren
Tabelle Employees. Holen Sie sich eine Liste mit Informationen über alle Mitarbeiter
Lösung
SELECT * FROM employees
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter mit dem Namen ‚David‘
Lösung
SELECT *
FROM employees
WHERE first_name = 'David';
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter mit job_id gleich ‚IT_PROG‘
Lösung
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter aus der 50. Abteilung (department_id) mit einem Gehalt (salary) über 4000
Lösung
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Tabelle Employees. Holen Sie sich eine 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. Holen Sie sich eine Liste aller Mitarbeiter, deren letzter Buchstabe im Namen ‚a‘ ist
Lösung
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Tabelle Employees. Holen Sie sich eine 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. 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%';
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Name mehr als 4 Buchstaben hat
Lösung
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Gehalt zwischen 8000 und 9000 (einschließlich) liegt.
Lösung
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Vorname das Zeichen '%' enthält.
Lösung
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Tabelle Employees. Holen Sie sich eine Liste aller ID von Managern.
Lösung
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Tabelle Employees. 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;
Verwendung von Einzeilenfunktionen zur Anpassung der Ausgabe.
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Vorname länger als 10 Buchstaben ist.
Lösung
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Tabelle Employees. 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 Employees. 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 Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren Gehalt durch 1000 teilbar ist.
Lösung
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Tabelle Employees. Holen Sie sich die ersten 3 Ziffern der Telefonnummer des 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 '___.___.____';
Tabelle Departments. Holen Sie sich das erste Wort aus dem Namen der Abteilung 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;
Tabelle Employees. 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;
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren letzter Buchstabe im Vorname 'm' ist und deren Vorname länger als 5 Buchstaben ist.
Lösung
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;
Tabelle Dual. Holen Sie sich das Datum des nächsten Freitags.
Lösung
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, die länger als 17 Jahre im Unternehmen arbeiten.
Lösung
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren letzte Ziffer der Telefonnummer ungerade und aus 3 Ziffern besteht, die durch einen Punkt getrennt sind.
Lösung
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, deren job_id nach dem Zeichen '_' mindestens 3 Zeichen lang ist, aber dieser Wert nach '_' nicht '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';
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, wobei im Wert PHONE_NUMBER alle '.' durch '-' ersetzt werden.
Lösung
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Benutzung von Konvertierungsfunktionen und bedingten Ausdrücken
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, die am ersten Tag eines Monats (irgendeiner) eingestellt wurden.
Lösung
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, die im Jahr 2008 eingestellt wurden.
Lösung
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
Tabelle DUAL. Zeige das Datum von morgen im Format: Morgen ist der zweite Tag im Januar
Lösung
SELECT TO_CHAR (SYSDATE, 'fm""Morgen ist ""Ddspth ""Tag von"" Monat') info
FROM DUAL;
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter und deren Einstellungsdatum im Format: 21. Juni 2007
Lösung
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""von"" Monat, YYYY') hire_date
FROM employees;
Tabelle Employees. Holen Sie sich eine Liste der Mitarbeiter mit erhöhten Gehältern um 20 %. Gehalt im Dollarzeichen anzeigen
Lösung
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter, die im Februar 2007 eingestellt wurden.
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 Employees. Holen Sie sich eine Liste aller Mitarbeiter mit dem Gesamtgehalt (salary + commission_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;
Tabelle Employees. Holen Sie sich eine Liste aller Mitarbeiter und Informationen über die Verfügbarkeit von Bonuszahlungen (Ja/Nein)
Lösung
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Ja', 'Nein') has_bonus
FROM employees;
Tabelle Employees. Bestimmen Sie die Gehaltsstufe jedes Mitarbeiters: Unter 5000 wird als niedrig eingestuft, 5000 oder mehr und weniger als 10000 wird als normal eingestuft, 10000 oder mehr wird als hoch eingestuft.
Lösung
WÄHLEN Sie Vorname,
Gehalt,
FALLS
WENN Gehalt = 5000 UND Gehalt < 10000 DANN 'Normal'
SONST 'Hoch'
ENDE Gehaltsstufe
VON Mitarbeitern;
Tabelle Länder. Für jedes Land den Region anzeigen, in dem es sich befindet: 1-Europa, 2-Amerika, 3-Asien, 4-Afrika (ohne Join)
Lösung
WÄHLEN Sie Ländervorname land,
DECODE (region_id,
1, 'Europa',
2, 'Amerika',
3, 'Asien',
4, 'Afrika',
'Unbekannt')
region
VON ländern;
WÄHLEN Sie Ländervorname
land,
FALLS region_id
WENN 1 DANN 'Europa'
WENN 2 DANN 'Amerika'
WENN 3 DANN 'Asien'
WENN 4 DANN 'Afrika'
SONST 'Unbekannt'
ENDE
region
VON ländern;
Berichterstattung über aggregierte Daten mit den Gruppenfunktionen
Tabelle Mitarbeiter. Bericht nach department_id mit dem niedrigsten und höchsten Gehalt, mit frühestem und spätestem Einstiegsdatum und Anzahl der Mitarbeiter. Sortieren nach der Anzahl der Mitarbeiter (absteigend)
Lösung
WÄHLEN Sie department_id,
MIN (gehalt) min_gehalt,
MAX (gehalt) max_gehalt,
MIN (einstellungsdatum) min_einstellungsdatum,
MAX (einstellungsdatum) max_einstellungsdatum,
ANZAHL (*) anzahl
VON mitarbeitern
GRUPPIEREN NACH department_id
ORDER BY ANZAHL(*) DESC;
Tabelle Mitarbeiter. Wie viele Mitarbeiter haben Namen, die mit demselben Buchstaben beginnen? Nach Anzahl sortieren. Nur die anzeigen, bei denen die Anzahl größer als 1 ist.
Lösung
WÄHLEN Sie SUBSTR (vorname, 1, 1) erster_buchstabe, ANZAHL (*)
VON mitarbeitern
GRUPPIEREN NACH SUBSTR (vorname, 1, 1)
HABEN ANZAHL (*) > 1
ORDER BY 2 DESC;
Tabelle Mitarbeiter. Wie viele Mitarbeiter arbeiten in demselben Abteilung und verdienen das gleiche Gehalt?
Lösung
WÄHLEN Sie department_id, gehalt, ANZAHL (*)
VON mitarbeitern
GRUPPIEREN NACH department_id, gehalt
HABEN ANZAHL (*) > 1;
Tabelle Mitarbeiter. Bericht, wie viele Mitarbeiter an jedem Wochentag eingestellt wurden. Nach Anzahl sortieren.
Lösung
WÄHLEN Sie TO_CHAR (einstellungsdatum, 'Tag') tag, ANZAHL (*)
VON mitarbeitern
GRUPPIEREN NACH TO_CHAR (einstellungsdatum, 'Tag')
ORDER BY 2 DESC;
Tabelle Mitarbeiter. Bericht, wie viele Mitarbeiter in den Jahren eingestellt wurden. Nach Anzahl sortieren.
Lösung
WÄHLEN Sie TO_CHAR (einstellungsdatum, 'YYYY') jahr, ANZAHL (*)
VON mitarbeitern
GRUPPIEREN NACH TO_CHAR (einstellungsdatum, 'YYYY');
Tabelle Mitarbeiter. Anzahl der Abteilungen, in denen Mitarbeiter sind.
Lösung
WÄHLEN Sie ANZAHL (ANZAHL (*)) abteilungsanzahl
VON mitarbeitern
WOHER department_id IST NICHT NULL
GRUPPIEREN NACH department_id;
Tabelle Mitarbeiter. Liste der department_id, in denen mehr als 30 Mitarbeiter arbeiten.
Lösung
WÄHLEN Sie department_id
VON mitarbeitern
GRUPPIEREN NACH department_id
HABEN ANZAHL (*) > 30;
Tabelle Mitarbeiter. Liste der department_id und gerundeten durchschnittlichen Gehälter der Mitarbeiter in jeder Abteilung.
Lösung
WÄHLEN Sie department_id, RUNDEN (DURCHSCHNITT (gehalt)) durchschnittsgehalt
VON mitarbeitern
GRUPPIEREN NACH department_id;
Tabelle Länder. Liste der region_id Summe aller Buchstaben aller Ländervornamen, in denen es mehr als 60 gibt.
Lösung
WÄHLEN Sie region_id
VON Ländern
GRUPPIEREN Sie NACH region_id
HABEN SUMME (LÄNGE (land_name)) > 60;
Tabelle Employees. Erlangen Sie eine Liste von department_id, in der Mitarbeiter mit mehreren (>1) job_id arbeiten.
Lösung
WÄHLEN Sie department_id
VON mitarbeitern
GRUPPIEREN Sie NACH department_id
HABEN COUNT (DISTINCT job_id) > 1;
Tabelle Employees. Erlangen Sie eine Liste von manager_id, bei denen die Anzahl der Untergebenen mehr als 5 beträgt und die Summe aller Gehälter seiner Untergebenen mehr als 50000 beträgt.
Lösung
WÄHLEN Sie manager_id
VON mitarbeitern
GRUPPIEREN Sie NACH manager_id
HABEN COUNT (*) > 5 UND SUMME (salary) > 50000;
Tabelle Employees. Erlangen Sie eine Liste von manager_id, bei denen das durchschnittliche Gehalt aller Untergebenen zwischen 6000 und 9000 liegt, die keine Boni erhalten (commission_pct leer).
Lösung
WÄHLEN Sie manager_id, AVG (salary) avg_salary
VON mitarbeitern
WOHER commission_pct IST NULL
GRUPPIEREN Sie NACH manager_id
HABEN AVG (salary) ZWISCHEN 6000 UND 9000;
Tabelle Employees. Erlangen Sie das maximale Gehalt aller Mitarbeiter job_id, das mit dem Wort ‘CLERK’ endet.
Lösung
WÄHLEN Sie MAX (salary) max_salary
VON mitarbeitern
WO die job_id LIKE '%CLERK';
WÄHLEN Sie MAX (salary) max_salary
VON mitarbeitern
WO SUBSTR (job_id, -5) = 'CLERK';
Tabelle Employees. Erlangen Sie das maximale Gehalt unter allen durchschnittlichen Gehältern nach Abteilung.
Lösung
WÄHLEN Sie MAX (DURCHSCHNITT (salary))
VON mitarbeitern
GRUPPIEREN Sie NACH department_id;
Tabelle Employees. Zählen Sie die Anzahl der Mitarbeiter mit der gleichen Anzahl an Buchstaben im Namen. Zeigen Sie nur die an, deren Name länger als 5 ist und dessen Mitarbeiteranzahl mit diesem Namen größer als 20 ist. Sortieren Sie nach Länge des Namens.
Lösung
WÄHLEN Sie LÄNGE (first_name), COUNT (*)
VON mitarbeitern
GRUPPIEREN Sie NACH LÄNGE (first_name)
HABEN LÄNGE (first_name) > 5 UND COUNT (*) > 20
BESTELLEN NACH LÄNGE (first_name);
WÄHLEN Sie LÄNGE (first_name), COUNT (*)
VON mitarbeitern
WO LÄNGE (first_name) > 5
GRUPPIEREN Sie NACH LÄNGE (first_name)
HABEN COUNT (*) > 20
BESTELLEN NACH LÄNGE (first_name);
Daten aus mehreren Tabellen mit Joins anzeigen
Tabelle Employees, Departements, Standorte, Länder, Regionen. Erlangen Sie eine Liste der Regionen und die Anzahl der Mitarbeiter in jeder Region.
Lösung
WÄHLEN Sie region_name, COUNT (*)
VON 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)
GRUPPIEREN Sie NACH region_name;
Tabelle Employees, Departements, Standorte, Länder, Regionen. Erlangen Sie detaillierte Informationen über jeden Mitarbeiter:
Vorname, Nachname, Abteilung, Job, Straße, Land, Region
Lösung
WÄHLEN Sie Vorname,
Nachname,
Abteilungsname,
Job_id,
straßenadresse,
Land_name,
Region_name
VON 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 Employees. Zeigen Sie alle Manager an, die mehr als 6 Mitarbeiter zu betreuen haben.
Lösung
WÄHLEN man.first_name, COUNT (*)
VON mitarbeitern emp JOIN mitarbeitern man ON (emp.manager_id = man.employee_id)
GROUP BY man.first_name
HAVING COUNT (*) > 6;
Tabelle Mitarbeiter. Zeige alle Mitarbeiter, die niemandem unterstellt sind
Lösung
WÄHLEN emp.first_name
VON mitarbeitern emp
LINK JOIN mitarbeitern man ON (emp.manager_id = man.employee_id)
WHERE man.FIRST_NAME IST NULL;
WÄHLEN first_name
VON mitarbeitern
WHERE manager_id IST NULL;
Tabelle Mitarbeiter, Job_history. In der Tabelle Mitarbeiter werden alle Mitarbeiter gespeichert. In der Tabelle Job_history werden Mitarbeiter gespeichert, die das Unternehmen verlassen haben. Einen Bericht über alle Mitarbeiter und deren Status im Unternehmen erhalten (Aktiv oder das Unternehmen mit Abgangsdatum verlassen)
Beispiel:
first_name | status
Jennifer | Verließ das Unternehmen am 31. Dezember 2006
Clara | Derzeit beschäftigt
Lösung
WÄHLEN first_name,
NVL2 (
end_date,
TO_CHAR (end_date, 'fm""Verließ das Unternehmen am"" DD ""von"" Monat, YYYY'),
'Derzeit beschäftigt')
status
VON mitarbeitern e LINK JOIN job_history j ON (e.employee_id = j.employee_id);
Tabelle Mitarbeiter, Abteilungen, Standorte, Länder, Regionen. Liste der Mitarbeiter abrufen, die in Europa (region_name) leben
Lösung
WÄHLEN first_name
VON mitarbeitern
JOIN abteilungen USING (department_id)
JOIN standorte USING (location_id)
JOIN länder USING (country_id)
JOIN regionen USING (region_id)
WHERE region_name = 'Europa';
WÄHLEN first_name
VON 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)
WHERE region_name = 'Europa';
Tabelle Mitarbeiter, Abteilungen. Zeige alle Abteilungen, in denen mehr als 30 Mitarbeiter arbeiten
Lösung
WÄHLEN department_name, COUNT (*)
VON mitarbeitern e JOIN abteilungen d ON (e.department_id = d.department_id)
GROUP BY department_name
HAVING COUNT (*) > 30;
Tabelle Mitarbeiter, Abteilungen. Zeige alle Mitarbeiter, die in keiner Abteilung sind
Lösung
WÄHLEN first_name
VON mitarbeitern e
LINK JOIN abteilungen d ON (e.department_id = d.department_id)
WHERE d.department_name IST NULL;
WÄHLEN first_name
VON mitarbeitern
WHERE department_id IST NULL;
Tabelle Mitarbeiter, Abteilungen. Zeige alle Abteilungen, in denen kein Mitarbeiter ist
Lösung
WÄHLEN department_name
VON mitarbeitern e
RECHTS JOIN abteilungen d ON (e.department_id = d.department_id)
WHERE first_name IST NULL;
Tabelle Mitarbeiter. Zeige alle Mitarbeiter, die niemanden unterstellt haben
Lösung
WÄHLEN man.first_name
VON mitarbeitern emp
RECHTS JOIN mitarbeitern man ON (emp.manager_id = man.employee_id)
WHERE emp.FIRST_NAME IST NULL;
Tabelle Mitarbeiter, Jobs, Abteilungen. Zeige Mitarbeiter im Format: First_name, Job_title, Department_name.
Beispiel:
First_name | Job_title | Department_name
Donald | Versand | Versandleiter
Lösung
WÄHLEN first_name, job_title, department_name
VON mitarbeitern e
JOIN jobs j ON (e.job_id = j.job_id)
JOIN abteilungen d ON (d.department_id = e.department_id);
Tabelle Mitarbeiter. Liste der Mitarbeiter abrufen, deren Manager im Jahr 2005 eingestellt wurden, während diese Mitarbeiter vor 2005 eingestellt wurden
Lösung
WÄHLEN Sie emp.*
AUS Mitarbeitern emp JOIN Mitarbeitern man ON (emp.manager_id = man.employee_id)
WHERE TO_CHAR (man.hire_date, 'YYYY') = '2005'
UND emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');
Tabelle Mitarbeiter. Holen Sie sich 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.*
AUS Mitarbeitern emp
JOIN Mitarbeitern 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' UND LENGTH (j.job_title) > 15;
Unterabfragen zur Lösung von Abfragen verwenden
Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern mit dem längsten Namen.
Lösung
WÄHLEN Sie *
AUS Mitarbeitern
WHERE LENGTH (first_name) =
(WÄHLEN MAX (LENGTH (first_name)) AUS Mitarbeitern);
Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern mit einem Gehalt, das über dem Durchschnittsgehalt aller Mitarbeiter liegt.
Lösung
WÄHLEN Sie *
AUS Mitarbeitern
WHERE salary > (WÄHLEN AVG (salary) AUS Mitarbeitern);
Tabelle Mitarbeiter, Abteilungen, Standorte. Holen Sie sich die Stadt, in der die Mitarbeiter insgesamt am wenigsten verdienen.
Lösung
WÄHLEN Sie city
AUS Mitarbeitern e
JOIN Abteilungen d ON (e.department_id = d.department_id)
JOIN Standorte l ON (d.location_id = l.location_id)
GROUP BY city
HAVING SUM (salary) =
( WÄHLEN MIN (SUM (salary))
AUS Mitarbeitern e
JOIN Abteilungen d ON (e.department_id = d.department_id)
JOIN Standorte l ON (d.location_id = l.location_id)
GROUP BY city);
Tabelle Mitarbeiter. Holen Sie sich eine Liste von Mitarbeitern, deren Manager mehr als 15000 verdienen.
Lösung
WÄHLEN Sie *
AUS Mitarbeitern
WHERE manager_id IN (WÄHLEN employee_id
AUS Mitarbeitern
WHERE salary > 15000)
Tabelle Mitarbeiter, Abteilungen. Zeige alle Abteilungen, in denen kein Mitarbeiter ist
Lösung
WÄHLEN Sie *
AUS Abteilungen
WHERE department_id NOT IN (WÄHLEN department_id
AUS Mitarbeitern
WHERE department_id IST NICHT NULL);
Tabelle Mitarbeiter. Zeigen Sie alle Mitarbeiter an, die keine Manager sind.
Lösung
WÄHLEN Sie *
AUS Mitarbeitern
WHERE employee_id NOT IN (WÄHLEN manager_id
AUS Mitarbeitern
WHERE manager_id IST NICHT NULL)
Tabelle Employees. Zeigen Sie alle Manager an, die mehr als 6 Mitarbeiter zu betreuen haben.
Lösung
WÄHLEN Sie *
AUS Mitarbeitern e
WHERE (WÄHLEN COUNT (*)
AUS Mitarbeitern
WHERE manager_id = e.employee_id) > 6;
Tabelle Mitarbeiter, Abteilungen. Zeigen Sie Mitarbeiter an, die in der IT-Abteilung arbeiten.
Lösung
WÄHLEN Sie *
AUS Mitarbeitern
WHERE department_id = (WÄHLEN department_id
AUS Abteilungen
WHERE department_name = 'IT');
Tabelle Mitarbeiter, Jobs, Abteilungen. Zeige Mitarbeiter im Format: First_name, Job_title, Department_name.
Beispiel:
First_name | Job_title | Department_name
Donald | Versand | Versandleiter
Lösung
WÄHLEN Sie first_name,
(WÄHLEN job_title
AUS jobs
WHERE job_id = e.job_id)
job_title,
(WÄHLEN department_name
AUS Abteilungen
WHERE department_id = e.department_id)
department_name
AUS Mitarbeitern e;
Tabelle Mitarbeiter. Liste der Mitarbeiter abrufen, deren Manager im Jahr 2005 eingestellt wurden, während diese Mitarbeiter vor 2005 eingestellt wurden
Lösung
WÄHLEN Sie *
AUS Mitarbeitern
WHERE manager_id IN (WÄHLEN employee_id
AUS Mitarbeitern
WHERE TO_CHAR (hire_date, 'YYYY') = '2005')
UND hire_date < TO_DATE ('01012005', 'DDMMYYYY');
Tabelle Mitarbeiter. Holen Sie sich 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 *
AUS Mitarbeitern e
WHERE manager_id IN (WÄHLEN employee_id
AUS Mitarbeitern
WHERE TO_CHAR (hire_date, 'MM') = '01')
UND (WÄHLEN LENGTH (job_title)
AUS jobs
WHERE job_id = e.job_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 jegliche 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
