SQL. Interessante oppgÄver

Hallo, Habr!

Eg har undervist i SQL i over 3 Är i ulike treningssenter, og ei av mine observasjonar er at studentar meislar og forstÄr SQL betre nÄr dei blir sett oppgÄver, snarare enn berre Ä bli fortalt om moglegheiter og teoretiske grunnlag.

I denne artikkelen vil eg dele med deg mi liste over oppgÄver som eg gir studentar som heimlek og som vi har diverse brainstorming pÄ, noko som fÞrer til djup og klar forstÄing av SQL.

SQL. Interessante oppgÄver

SQL (ˈɛsˈkjuˈɛl; eng. structured query language — «sprĂ„k for strukturerte spĂžrringar») — er eit deklarativt programmeringssprĂ„k som blir brukt for Ă„ lage, endre og administrere data i relasjonsdatabasar, styrt av den aktuelle databasedefinisjonen. Les meir


Du kan lese om SQL frÄ fleire kjelder.
Denne artikkelen har ikkje som mÄl Ä lÊre deg SQL frÄ grunnen av.

SĂ„ la oss starte.

Vi skal bruke den velkjente HR-skjemaet i Oracle med dens tabeller (Les mer):

SQL. Interessante oppgÄver
Eg vil merke at vi berre vil sjÄ pÄ oppgÄver knytt til SELECT. Det finnes ingen DML og DDL oppgÄver.

Oppgaver

Avgrense og sortere data

Tabell Employees. Hent ei liste med informasjon om alle tilsette
Solution

SELECT * FROM employees

Tabell Employees. Hent ei liste over alle tilsette som heiter ‘David’
Solution

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabell Employees. Hent ei liste over alle tilsette med job_id lik ‘IT_PROG’
Solution

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabell Employees. Hent ei liste over alle tilsette frÄ avdeling 50 (department_id) med lÞnn (salary) over 4000
Solution

SELECT *
  FROM employees
 WHERE department_id = 50 AND salary > 4000;

Tabell Employees. Hent ei liste over alle tilsette frÄ avdeling 20 og avdeling 30 (department_id)
Solution

SELECT *
  FROM employees
 WHERE department_id = 20 OR department_id = 30;

Tabell Employees. Hent ei liste over alle tilsette der siste bokstav i namnet er ‘a’
Solution

SELECT *
  FROM employees
 WHERE first_name LIKE '%a';

Tabell Employees. Hent ei liste over alle tilsette frÄ avdeling 50 og avdeling 80 (department_id) som har ein bonus (verdi i kolonnen commission_pct er ikkje tom)
Solution

SELECT *
  FROM employees
 WHERE     (department_id = 50 OR department_id = 80)
       AND commission_pct IS NOT NULL;

Tabell Employees. Hent ei liste over alle tilsette der namnet inneheld minst 2 bokstavar ‘n’
Solution

SELECT *
  FROM employees
 WHERE first_name LIKE '%n%n%';

Tabell Employees. Hent ei liste over alle tilsette der lengda pÄ namnet er meir enn 4 bokstavar
Solution

SELECT *
  FROM employees
 WHERE first_name LIKE '%_____%';

Tabell over ansatte. Hent en liste over alle ansatte som har en lĂžnn mellom 8000 og 9000 (inkludert)
Solution

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tabell over ansatte. Hent en liste over alle ansatte som har et symbol '%' i navnet sitt
Solution

SELECT *
  FROM employees
 WHERE first_name LIKE '%%%' ESCAPE '';

Tabell over ansatte. Hent en liste over alle ID-er til ledere
Solution

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tabell over ansatte. Hent en liste over ansatte med deres posisjoner i formatet: Donald(sh_clerk)
Solution

SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;

Bruke enkeltlinjefunksjoner for Ă„ tilpasse utdata

Tabell over ansatte. Hent en liste over alle ansatte hvor lengden pÄ navnet er mer enn 10 bokstaver
Solution

SELECT *
  FROM employees
 WHERE LENGTH (first_name) > 10;

Tabell over ansatte. Hent en liste over alle ansatte som har bokstaven 'b' i navnet (uavhengig av stor og liten skrift)
Solution

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name), 'b') > 0;

Tabell over ansatte. Hent en liste over alle ansatte som har minst 2 bokstaver 'a' i navnet
Solution

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name),'a',1,2) > 0;

Tabell over ansatte. Hent en liste over alle ansatte hvis lĂžnn er delelig med 1000
Solution

SELECT *
  FROM employees
 WHERE MOD (salary, 1000) = 0;

Tabell over ansatte. Hent de fĂžrste 3 sifferne fra ansattes telefonnummer hvis nummeret er i formatet XXX.XXX.XXXX
Solution

SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
  FROM employees
 WHERE phone_number LIKE '___.___.____';

Tabell over avdelinger. Hent det fĂžrste ordet fra avdelingsnavnet for de som har mer enn ett ord i navnet
Solution

SELECT department_name,
       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
           first_word
  FROM departments
 WHERE INSTR (department_name, ' ') > 0;

Tabell over ansatte. Hent ansattes navn uten fĂžrste og siste bokstav i navnet
Solution

SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
  FROM employees;

Tabell over ansatte. Hent en liste over alle ansatte hvor den siste bokstaven i navnet er 'm' og lengden pÄ navnet er mer enn 5
Solution

SELECT *
  FROM employees
 WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;

Tabell over Dual. Hent datoen for neste fredag
Solution

SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;

Tabell over ansatte. Hent en liste over alle ansatte som har vÊrt i selskapet i mer enn 17 Är
Solution

SELECT *
  FROM employees
 WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;

Tabell over ansatte. Hent en liste over alle ansatte hvor den siste sifferen i telefonnummeret er oddetall og bestÄr av 3 siffer delt med punktum
Solution

SELECT *
  FROM employees
 WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
       AND INSTR (phone_number,'.',1,3) = 0;

Ansatt-tabellen. Hente listen over alle ansatte hvor verdien for job_id etter '_' har minst 3 tegn, men denne verdien etter '_' er ikke lik 'CLERK'
Solution

SELECT *
  FROM employees
 WHERE     LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
       AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';

Ansatt-tabellen. Hente listen over alle ansatte ved Ă„ erstatte alle '.' i PHONE_NUMBER med '-'
Solution

SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
  FROM employees;

Bruke konverteringsfunksjoner og betingede uttrykk

Ansatt-tabellen. Hente listen over alle ansatte som begynte i fÞrste dag i en mÄned (hvilken som helst)
Solution

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'DD') = '01';

Ansatt-tabellen. Hente listen over alle ansatte som begynte i 2008
Solution

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'YYYY') = '2008';

DUAL-tabellen. Vise i morgen dato i format: Tomorrow is Second day of January
Solution

SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month')     info
  FROM DUAL;

Ansatt-tabellen. Hente listen over alle ansatte og ansettelsesdatoen for hver i formatet: 21st of June, 2007
Solution

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
  FROM employees;

Ansatt-tabellen. Hente listen over ansatte med 20 % Ăžkning i lĂžnn. Vise lĂžnnen med dollartegn
Solution

SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
  FROM employees;

Ansatt-tabellen. Hente listen over alle ansatte som begynte i februar 2007.
Solution

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-tabellen. Vise den aktuelle datoen, + sekund, + minutt, + time, + dag, + mÄned, + Är
Solution

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;

Ansatt-tabellen. Hente listen over alle ansatte med full lĂžnn (salary + commission_pct(%)) i formatet: $24,000.00
Solution

SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
  FROM employees;

Ansatt-tabellen. Hente listen over alle ansatte og informasjon om bonusene til lĂžnnen (Ja/Nei)
Solution

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
  FROM employees;

Ansatt-tabellen. Hente lÞnnsnivÄet for hver ansatt: Mindre enn 5000 regnes som Lavt nivÄ, StÞrre eller lik 5000 og mindre enn 10000 regnes som Normalt nivÄ, StÞrre eller lik 10000 regnes som HÞyt nivÄ
Solution

SELECT first_name,
       salary,
       CASE
           WHEN salary = 5000 AND salary < 10000 THEN 'Normal'
           ELSE 'HĂžg'
       END salary_level
  FROM employees;

Tabell Countries. Vis regionen for hvert land: 1-Europa, 2-Amerika, 3-Asia, 4-Afrika (uten Join)
Solution

SELECT country_name country,
       DECODE (region_id,
               1, 'Europa',
               2, 'Amerika',
               3, 'Asia',
               4, 'Afrika',
               'Ukjent')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Europa'
           WHEN 2 THEN 'Amerika'
           WHEN 3 THEN 'Asia'
           WHEN 4 THEN 'Afrika'
           ELSE 'Ukjent'
       END
           region
  FROM countries;

Rapportere aggregert data ved hjelp av gruppefunksjoner

Tabell Employees. FĂ„ en rapport for department_id med minimum og maksimum lĂžnn, tidlig og sent ansettelsesdato og antall ansatte. Sorter etter antall ansatte (synkende rekkefĂžlge)
Solution

  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;

Tabell Employees. Hvor mange ansatte har navn som begynner med samme bokstav? Sorter etter antall. Vis kun de med antall stĂžrre enn 1
Solution

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;

Tabell Employees. Hvor mange ansatte arbeider i samme avdeling og har samme lĂžnn?
Solution

SELECT department_id, salary, COUNT (*)
    FROM employees
GROUP BY department_id, salary
  HAVING COUNT (*) > 1;

Tabell Employees. FĂ„ en rapport om hvor mange ansatte som ble ansatt hver ukedag. Sorter etter antall
Solution

SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;

Tabell Employees. FÄ en rapport om hvor mange ansatte som ble ansatt hvert Är. Sorter etter antall
Solution

SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');

Tabell Employees. FĂ„ antall avdelinger som har ansatte
Solution

SELECT COUNT (COUNT (*)) department_count
    FROM employees
   WHERE department_id IS NOT NULL
GROUP BY department_id;

Tabell Employees. FĂ„ en liste over department_id der mer enn 30 ansatte jobber
Solution

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (*) > 30;

Tabell Employees. FĂ„ en liste over department_id og avrundet gjennomsnittlig lĂžnn for ansatte i hver avdeling.
Solution

  SELECT department_id, ROUND (AVG (salary)) avg_salary
    FROM employees
GROUP BY department_id;

Tabell Countries. FĂ„ en liste over region_id med summen av alle bokstaver i country_name der det er mer enn 60
Solution

  SELECT region_id
    FROM countries
GROUP BY region_id
  HAVING SUM (LENGTH (country_name)) > 60;

Tabell over ansatte. Hent en liste over department_id der arbeidere jobber med flere (>1) job_id
Solution

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (DISTINCT job_id) > 1;

Tabell over ansatte. Hent en liste over manager_id der antallet av underordnede er mer enn 5 og summen av alle lĂžnningene til underordnede er mer enn 50000
Solution

  SELECT manager_id
    FROM employees
GROUP BY manager_id
  HAVING COUNT (*) > 5 AND SUM (salary) > 50000;

Tabell over ansatte. Hent en liste over manager_id der gjennomsnittlig lÞnn for alle underordnede ligger mellom 6000 og 9000 som ikke fÄr bonuser (commission_pct er tomt)
Solution

  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;

Tabell over ansatte. Hent den hÞyeste lÞnnen blant alle ansatte med job_id som slutter pÄ ordet 'CLERK'
Solution

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';

Tabell over ansatte. Hent den hĂžyeste lĂžnnen blant alle gjennomsnittlige lĂžnninger per avdeling
Solution

  SELECT MAX (AVG (salary))
    FROM employees
GROUP BY department_id;

Tabell over ansatte. Hent antall ansatte med samme antall bokstaver i navnet. Vise kun de med navn lengre enn 5 og antall ansatte med det navnet stÞrre enn 20. Sorter etter lengden pÄ navnet
Solution

  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);

Visning av data fra flere tabeller ved hjelp av joins

Tabell over ansatte, avdelinger, lokasjoner, land, regioner. Hent en liste over regioner og antall ansatte i hver region
Solution

  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;

Tabell over ansatte, avdelinger, lokasjoner, land, regioner. Hent detaljert informasjon om hver ansatt:
Fornavn, Etternavn, Avdeling, Jobb, Gate, Land, Region
Solution

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);

Tabell over ansatte. Vis alle ledere som har mer enn 6 ansatte under seg
Solution

  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;

Tabell over ansatte. Vise alle ansatte som ikke har noen underordnede.
Solution

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;

Tabell over ansatte, arbeidshistorikk. I tabellen Ansatte lagres alle ansatte. I tabellen Arbeidshistorikk lagres ansatte som har forlatt selskapet. Hent rapport om alle ansatte og deres status i selskapet (Jobber eller har forlatt selskapet med dato for avgang).
Eksempel:
first_name | status
Jennifer | Forlot selskapet 31. desember 2006
Clara | Jobber for tiden
Solution

SELECT first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Forlot selskapet pÄ"" DD ""i"" MÄned, YYYY'),
           'Jobber for tiden')
           status
  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);

Tabell over ansatte, avdelinger, beliggenheter, land, regioner. Hent liste over ansatte som bor i Europa (region_name).
Solution

 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';

Tabell over ansatte, avdelinger. Vise alle avdelinger der mer enn 30 ansatte jobber.
Solution

SELECT department_name, COUNT (*)
    FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
  HAVING COUNT (*) > 30;

Tabell over ansatte, avdelinger. Vise alle ansatte som ikke tilhĂžrer noen avdeling.
Solution

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;

Tabell over ansatte, avdelinger. Vise alle avdelinger som ikke har noen ansatte.
Solution

SELECT department_name
  FROM employees e
       RIGHT JOIN departments d ON (e.department_id = d.department_id)
 WHERE first_name IS NULL;

Tabell over ansatte. Vise alle ansatte som ikke har noen som rapporterer til dem.
Solution

SELECT man.first_name
  FROM employees emp
       RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE emp.FIRST_NAME IS NULL;

Tabell over ansatte, jobber, avdelinger. Vise ansatte i formatet: First_name, Job_title, Department_name.
Eksempel:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Solution

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);

Tabell over ansatte. Hent liste over ansatte hvis ledere begynte i jobben i 2005, men som selv begynte Ă„ jobbe fĂžr 2005.
Solution

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

Tabell for ansatt. Hent liste over ansatte hvis ledere startet i januar mÄned i et hvilket som helst Är, og lengden pÄ stillingstittelen til disse ansatte er mer enn 15 tegn.
Solution

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;

Bruke subspĂžrringer for Ă„ lĂžse spĂžrringer

Tabell for ansatt. Hent liste over ansatte med det lengste navnet.
Solution

SELECT *
  FROM employees
 WHERE LENGTH (first_name) =
       (SELECT MAX (LENGTH (first_name)) FROM employees);

Tabell for ansatt. Hent liste over ansatte med lĂžnn over gjennomsnittlig lĂžnn for alle ansatte.
Solution

SELECT *
  FROM employees
 WHERE salary > (SELECT AVG (salary) FROM employees);

Tabell for ansatte, avdelinger, steder. Hent byen der ansatte totalt tjener minst.
Solution

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);

Tabell for ansatt. Hent liste over ansatte hvis leder tjener mer enn 15000.
Solution

SELECT *
  FROM employees
 WHERE manager_id IN (SELECT employee_id
                        FROM employees
                       WHERE salary > 15000)

Tabell over ansatte, avdelinger. Vise alle avdelinger som ikke har noen ansatte.
Solution

SELECT *
  FROM departments
 WHERE department_id NOT IN (SELECT department_id
                               FROM employees
                              WHERE department_id IS NOT NULL);

Tabell for ansatt. Vis alle ansatte som ikke er ledere.
Solution

SELECT *
  FROM employees
 WHERE employee_id NOT IN (SELECT manager_id
                             FROM employees
                            WHERE manager_id IS NOT NULL)

Tabell over ansatte. Vis alle ledere som har mer enn 6 ansatte under seg
Solution

SELECT *
  FROM employees e
 WHERE (SELECT COUNT (*)
          FROM employees
         WHERE manager_id = e.employee_id) > 6;

Tabell for ansatte, avdelinger. Vis ansatte som jobber i IT-avdelingen.
Solution

SELECT *
  FROM employees
 WHERE department_id = (SELECT department_id
                          FROM departments
                         WHERE department_name = 'IT');

Tabell over ansatte, jobber, avdelinger. Vise ansatte i formatet: First_name, Job_title, Department_name.
Eksempel:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Solution

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;

Tabell over ansatte. Hent liste over ansatte hvis ledere begynte i jobben i 2005, men som selv begynte Ă„ jobbe fĂžr 2005.
Solution

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

Tabell for ansatt. Hent liste over ansatte hvis ledere startet i januar mÄned i et hvilket som helst Är, og lengden pÄ stillingstittelen til disse ansatte er mer enn 15 tegn.
Solution

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;

Det er alt for nÄ.

Eg hÄpar oppgÄvene var interessante og spennande.
Eg vil sÄ langt som mogleg oppdatere denne oppgavelista.
Eg set ogsÄ pris pÄ eventuelle merknader og forslag.

P.S.: Om nokon kjem pÄ ei interessant oppgÄve pÄ SELECT, skriv i kommentarfeltet, sÄ legg eg den til lista.

Takk.

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster