SQL. Vermaaklike raaisels

Hallo Habr!

Vir meer as 3 jaar gee ek SQL aan in verskeie opleidingsentrums, en een van my waarnemings is dat studente SQL beter bemeester en verstaan ​​as hulle 'n taak kry, en nie net oor die moontlikhede en teoretiese grondslae praat nie.

In hierdie artikel sal ek my lys take wat ek studente as huiswerk gee en waarop ons verskillende soorte dinkskrums doen, met jou deel, wat lei tot 'n diep en duidelike begrip van SQL.

SQL. Vermaaklike raaisels

SQL (ˈɛsˈkjuˈɛl; eng. gestruktureerde navraagtaal) is 'n verklarende programmeertaal wat gebruik word om data te skep, te wysig en te bestuur in 'n relasionele databasis wat deur 'n toepaslike databasisbestuurstelsel bestuur word. Meer ...

Jy kan lees oor SQL van verskillende bronne.
Hierdie artikel is nie bedoel om jou SQL van nuuts af te leer nie.

Dus, kom ons gaan.

Ons sal die bekende gebruik HR-skema in Oracle met sy tafels (meer):

SQL. Vermaaklike raaisels
Ek neem kennis dat ons slegs take op SELECT sal oorweeg. Daar is geen take op DML en DDL nie.

take

Beperk en sorteer data

Werknemers tafel. Kry 'n lys met inligting oor alle werknemers
besluit

SELECT * FROM employees

Werknemers tafel. Kry 'n lys van alle werknemers genaamd 'David'
besluit

SELECT *
  FROM employees
 WHERE first_name = 'David';

Werknemers tafel. Kry 'n lys van alle werknemers met job_id gelykstaande aan 'IT_PROG'
besluit

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Werknemers tafel. Kry 'n lys van alle werknemers van die 50ste departement (departement_id) met 'n salaris (salaris) groter as 4000
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers van die 20ste en van die 30ste departement (department_id)
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wie se laaste letter in hul naam 'a' is
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers van die 50ste en van die 80ste departement (departement_id) wat 'n bonus het (die waarde in die commission_pct kolom is nie leeg nie)
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wie se naam ten minste 2 letters 'n' bevat
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wie se naam langer as 4 letters is
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wie se salaris tussen 8000 en 9000 is (insluitend)
besluit

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Werknemers tafel. Kry 'n lys van alle werknemers wie se naam die simbool '%' bevat
besluit

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

Werknemers tafel. Kry 'n lys van alle bestuurder-ID's
besluit

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Werknemers tafel. Kry 'n lys van werknemers met hul posisies in die formaat: Donald(sh_clerk)
besluit

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

Gebruik enkelry-funksies om uitset aan te pas

Werknemers tafel. Kry 'n lys van alle werknemers wie se naam langer as 10 letters is
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wat die letter 'b' in hul naam het (hoofletter-onsensitief)
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wie se naam ten minste 2 letters 'a' bevat
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wie se salaris 'n veelvoud van 1000 is
besluit

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

Werknemers tafel. Kry die eerste 3-syfernommer van die werknemer se telefoonnommer as sy nommer in die formaat ХХХ.ХХХ.ХХХХ is
besluit

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

Afdelings tabel. Kry die eerste woord van die departement se naam vir diegene met meer as een woord in die naam
besluit

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

Werknemers tafel. Kry werknemersname sonder die eerste en laaste letter in die naam
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wie se laaste letter in die naam gelyk is aan 'm' en die lengte van die naam groter as 5 is
besluit

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

Dubbele tafel. Kry die datum van volgende Vrydag
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wat al meer as 17 jaar by die maatskappy is
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wie se laaste syfer van die telefoonnommer vreemd is en bestaan ​​uit 3 nommers geskei deur 'n kolletjie
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wie se job_id-waarde na die '_'-teken ten minste 3 karakters het, maar hierdie waarde na die '_' is nie gelyk aan 'CLERK'
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers deur alle '.' in die PHONE_NUMBER-waarde te vervang op '-'
besluit

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

Gebruik omskakelingsfunksies en voorwaardelike uitdrukkings

Werknemers tafel. Kry 'n lys van alle werknemers wat op die eerste dag van die maand kom werk het (enige)
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wat in 2008 kom werk het
besluit

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

DUBBELE tafel. Wys môre se datum in die formaat: Môre is Tweede dag van Januarie
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers en hul begindatum in die formaat: 21 Junie 2007
besluit

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

Werknemers tafel. Kry 'n lys van werknemers met verhoogde salarisse met 20%. Wys salaris met dollarteken
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers wat in Februarie 2007 kom werk het.
besluit

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

DUBBELE tafel. Voer huidige datum, + sekonde, + minuut, + uur, + dag, + maand, + jaar uit
besluit

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;

Werknemers tafel. Kry 'n lys van alle werknemers met volle salarisse (salaris + kommissie_pct(%)) in die formaat: $24,000.00
besluit

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

Werknemers tafel. Kry 'n lys van alle werknemers en inligting oor die beskikbaarheid van salarisbonusse (Ja/Nee)
besluit

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

Werknemers tafel. Kry die salarisvlak van elke werknemer: Minder as 5000 word beskou as Lae vlak, Groter as of gelyk aan 5000 en minder as 10000 word as normale vlak beskou, Groter as of gelyk aan 10000 word as hoë vlak beskou
besluit

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;

Lande tabel. Vir elke land, wys die streek waarin dit geleë is: 1-Europa, 2-Amerika, 3-Asië, 4-Afrika (sonder aansluiting)
besluit

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;

Rapporteer saamgevoegde data deur die groepfunksies te gebruik

Werknemers tafel. Kry 'n verslag deur department_id met minimum en maksimum salaris, vroeë en laat aankomsdatums en aantal werknemers. Sorteer volgens aantal werknemers (beskrywing)
besluit

  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;

Werknemers tafel. Hoeveel werknemers wie se name met dieselfde letter begin? Sorteer volgens hoeveelheid. Wys slegs dié waar die getal groter as 1 is
besluit

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;

Werknemers tafel. Hoeveel werknemers werk in dieselfde departement en ontvang dieselfde salaris?
besluit

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

Werknemers tafel. Kry 'n verslag van hoeveel werknemers op elke dag van die week aangestel is. Sorteer volgens hoeveelheid
besluit

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

Werknemers tafel. Kry 'n verslag oor hoeveel werknemers per jaar aangestel is. Sorteer volgens hoeveelheid
besluit

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

Werknemers tafel. Kry die aantal departemente wat werknemers het
besluit

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

Werknemers tafel. Kry lys van department_id met meer as 30 werknemers
besluit

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

Werknemers tafel. Kry 'n lys van department_ids en die afgeronde gemiddelde salaris van werknemers in elke departement.
besluit

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

Lande tabel. Kry 'n lys van streek_id som van alle letters van alle landname waarin meer as 60
besluit

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

Werknemers tafel. Kry 'n lys van department_id waarin werknemers van verskeie (>1) job_id werk
besluit

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

Werknemers tafel. Kry 'n lys van bestuurder_id wie se aantal ondergeskiktes meer as 5 is en die som van alle salarisse van sy ondergeskiktes groter as 50000 XNUMX is
besluit

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

Werknemers tafel. Kry 'n lys van bestuurder_id wie se gemiddelde salaris van al sy ondergeskiktes tussen 6000 en 9000 is wat nie bonusse ontvang nie (commission_pct is leeg)
besluit

  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;

Werknemers tafel. Kry die maksimum salaris van alle werknemers job_id wat eindig met die woord 'KLERK'
besluit

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

Werknemers tafel. Kry die maksimum salaris onder al die gemiddelde salarisse vir die departement
besluit

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

Werknemers tafel. Kry die aantal werknemers met dieselfde aantal letters in hul naam. Wys terselfdertyd net diegene wie se naam langer as 5 is en die aantal werknemers met dieselfde naam meer as 20 is. Sorteer volgens naamlengte
besluit

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

Vertoon data van veelvuldige tabelle deur verbindings te gebruik

Tabel werknemers, departemente, liggings, lande, streke. Kry 'n lys van streke en die aantal werknemers in elke streek
besluit

  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;

Tabel werknemers, departemente, liggings, lande, streke. Kry gedetailleerde inligting oor elke werknemer:
Voornaam, Van, Departement, Werk, Straat, Land, Streek
besluit

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

Werknemers tafel. Wys alle bestuurders wat meer as 6 werknemers het
besluit

  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;

Werknemers tafel. Wys alle werknemers wat aan niemand rapporteer nie
besluit

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;

Werknemerstabel, Job_history. Die Werknemerstabel stoor alle werknemers. Die Job_history-tabel stoor werknemers wat die maatskappy verlaat het. Kry 'n verslag oor alle werknemers en hul status in die maatskappy (In diens of die maatskappy verlaat met die datum van vertrek)
Voorbeeld:
voornaam | status
jennifer | Het die maatskappy op 31 Desember 2006 verlaat
Clara | Werk tans
besluit

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

Tabel werknemers, departemente, liggings, lande, streke. Kry 'n lys van werknemers wat in Europa woon (streeknaam)
besluit

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

Tafelwerknemers, Departemente. Wys alle departemente met meer as 30 werknemers
besluit

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

Tafelwerknemers, Departemente. Wys alle werknemers wat nie in enige afdeling is nie
besluit

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;

Tafelwerknemers, Departemente. Wys alle departemente met geen werknemers nie
besluit

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

Werknemers tafel. Wys alle werknemers wat geen ondergeskiktes het nie
besluit

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

Tafel Werknemers, Poste, Departemente. Wys werknemers in die formaat: First_name, Job_title, Department_name.
Voorbeeld:
voornaam | postitel | Departement_naam
Donald | gestuur | Klerk Versending
besluit

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

Werknemers tafel. Kry 'n lys van werknemers wie se bestuurders in 2005 werk gekry het, maar terselfdertyd het hierdie werkers self voor 2005 werk gekry
besluit

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

Werknemers tafel. Kry 'n lys van werknemers wie se bestuurders 'n werk gekry het in die maand Januarie van enige jaar en die lengte van die postitel van hierdie werknemers is meer as 15 karakters
besluit

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;

Gebruik subnavrae om navrae op te los

Werknemers tafel. Kry 'n lys van werknemers met die langste naam.
besluit

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

Werknemers tafel. Kry 'n lys van werknemers met 'n salaris groter as die gemiddelde salaris van alle werknemers.
besluit

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

Tafelwerknemers, departemente, liggings. Kry die stad waarin werknemers altesaam die minste verdien.
besluit

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

Werknemers tafel. Kry 'n lys van werknemers wie se bestuurder 'n salaris van meer as 15000 XNUMX ontvang.
besluit

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

Tafelwerknemers, Departemente. Wys alle departemente met geen werknemers nie
besluit

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

Werknemers tafel. Wys alle werknemers wat nie bestuurders is nie
besluit

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

Werknemers tafel. Wys alle bestuurders wat meer as 6 werknemers het
besluit

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

Tafelwerknemers, Departemente. Wys werknemers wat in die IT-afdeling werk
besluit

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

Tafel Werknemers, Poste, Departemente. Wys werknemers in die formaat: First_name, Job_title, Department_name.
Voorbeeld:
voornaam | postitel | Departement_naam
Donald | gestuur | Klerk Versending
besluit

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;

Werknemers tafel. Kry 'n lys van werknemers wie se bestuurders in 2005 werk gekry het, maar terselfdertyd het hierdie werkers self voor 2005 werk gekry
besluit

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

Werknemers tafel. Kry 'n lys van werknemers wie se bestuurders 'n werk gekry het in die maand Januarie van enige jaar en die lengte van die postitel van hierdie werknemers is meer as 15 karakters
besluit

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;

Dit is al vir nou.

Ek hoop die take was interessant en opwindend.
Ek sal soveel as moontlik by hierdie lys voeg.
Ek sal ook bly wees vir enige kommentaar en voorstelle.

NS: As iemand met 'n interessante taak op SELECT vorendag kom, skryf in die kommentaar, ek sal dit by die lys voeg.

Dankie.

Bron: will.com

Voeg 'n opmerking