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
