SQL. Əyləncəli bulmacalar

Salam Habr!

3 ildən artıqdır ki, müxtəlif tədris mərkəzlərində SQL-dən dərs deyirəm və müşahidələrimdən biri də odur ki, tələbələr onlara tapşırıq verildikdə SQL-i daha yaxşı mənimsəyirlər və başa düşürlər, nəinki imkanlar və nəzəri əsaslar haqqında danışırlar.

Bu yazıda tələbələrə ev tapşırığı kimi verdiyim və SQL-in dərin və aydın başa düşülməsinə səbəb olan müxtəlif növ beyin fırtınaları apardığımız tapşırıqlar siyahısını sizinlə paylaşacağam.

SQL. Əyləncəli bulmacalar

SQL (ˈɛsˈkjuˈɛl; ingilis. strukturlaşdırılmış sorğu dili) müvafiq verilənlər bazası idarəetmə sistemi tərəfindən idarə olunan əlaqəli verilənlər bazasında verilənləri yaratmaq, dəyişdirmək və idarə etmək üçün istifadə edilən bəyanedici proqramlaşdırma dilidir. Daha ətraflı ...

SQL haqqında müxtəlif yazılardan oxuya bilərsiniz mənbələr.
Bu məqalə sizə SQL-i sıfırdan öyrətmək üçün nəzərdə tutulmayıb.

Beləliklə, gedək.

Tanınmışlardan istifadə edəcəyik HR sxemi cədvəlləri ilə Oracle-da (daha):

SQL. Əyləncəli bulmacalar
Qeyd edim ki, biz yalnız SELECT-dəki tapşırıqları nəzərdən keçirəcəyik. DML və DDL-də tapşırıq yoxdur.

vəzifələri

Məlumatların məhdudlaşdırılması və çeşidlənməsi

İşçilər masası. Bütün işçilər haqqında məlumatların siyahısını əldə edin
qərar

SELECT * FROM employees

İşçilər masası. 'David' adlı bütün işçilərin siyahısını əldə edin
qərar

SELECT *
  FROM employees
 WHERE first_name = 'David';

İşçilər masası. 'IT_PROG' ilə bərabər job_id olan bütün işçilərin siyahısını əldə edin
qərar

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

İşçilər masası. 50-ci şöbədən (department_id) maaşı (əmək haqqı) 4000-dən yuxarı olan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. 20-ci və 30-cu şöbədən bütün işçilərin siyahısını əldə edin (department_id)
qərar

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

İşçilər masası. Adlarında son hərfi "a" olan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. 50-ci və 80-ci şöbədən (department_id) bonusu olan bütün işçilərin siyahısını əldə edin (komisyon_pct sütununda dəyər boş deyil)
qərar

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

İşçilər masası. Adında ən azı 2 "n" hərfi olan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. Adı 4 hərfdən uzun olan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. Əmək haqqı 8000 ilə 9000 arasında olan bütün işçilərin siyahısını əldə edin (daxil olmaqla)
qərar

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

İşçilər masası. Adında '%' simvolu olan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. Bütün menecer ID-lərinin siyahısını əldə edin
qərar

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

İşçilər masası. İşçilərin siyahısını öz vəzifələri ilə aşağıdakı formatda əldə edin: Donald(sh_clerk)
qərar

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

Çıxışı fərdiləşdirmək üçün tək sıra funksiyalarından istifadə

İşçilər masası. Adı 10 hərfdən uzun olan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. Adında 'b' hərfi olan bütün işçilərin siyahısını əldə edin (hərfsiz)
qərar

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

İşçilər masası. Adında ən azı 2 "a" hərfi olan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. Əmək haqqı 1000-ə çox olan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. İşçinin nömrəsi ХХХ.ХХХ.ХХХХ formatındadırsa, onun telefon nömrəsinin ilk 3 rəqəmli nömrəsini alın.
qərar

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

Şöbələr cədvəli. Adında birdən çox söz olanlar üçün şöbə adından ilk sözü alın
qərar

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

İşçilər masası. Adında ilk və son hərf olmadan işçi adlarını alın
qərar

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

İşçilər masası. Adındakı son hərfi "m" hərfinə bərabər olan və adın uzunluğu 5-dən çox olan bütün işçilərin siyahısını əldə edin.
qərar

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

İkili masa. Gələn cümə gününün tarixini əldə edin
qərar

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

İşçilər masası. 17 ildən artıqdır şirkətdə işləyən bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. Telefon nömrəsinin son rəqəmi tək olan və nöqtə ilə ayrılmış 3 rəqəmdən ibarət olan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. '_' işarəsindən sonra job_id dəyəri ən azı 3 simvoldan ibarət olan, lakin '_' işarəsindən sonra bu dəyər 'KİTABÇI' ilə bərabər olmayan bütün işçilərin siyahısını əldə edin
qərar

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

İşçilər masası. PHONE_NUMBER dəyərindəki bütün '.' hərflərini əvəz etməklə bütün işçilərin siyahısını əldə edin '-' üzərində
qərar

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

Konversiya funksiyalarından və şərti ifadələrdən istifadə

İşçilər masası. Ayın ilk günü işə gələn bütün işçilərin siyahısını əldə edin (hər hansı)
qərar

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

İşçilər masası. 2008-ci ildə işə gələn bütün işçilərin siyahısını əldə edin
qərar

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

DUAL masa. Sabahın tarixini formatda göstərin: Sabah yanvarın ikinci günüdür
qərar

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

İşçilər masası. Bütün işçilərin siyahısını və onların başlama tarixini aşağıdakı formatda əldə edin: 21 iyun 2007-ci il
qərar

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

İşçilər masası. Maaşları 20% artırılan işçilərin siyahısını əldə edin. Dollar işarəsi ilə maaşı göstərin
qərar

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

İşçilər masası. 2007-ci ilin fevral ayında işə gələn bütün işçilərin siyahısını əldə edin.
qərar

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 masa. Cari tarixi, + saniyə, + dəqiqə, + saat, + gün, + ay, + ili ixrac edin
qərar

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;

İşçilər masası. Tam əmək haqqı (maaş + komissiya_pct(%)) olan bütün işçilərin siyahısını aşağıdakı formatda əldə edin: $24,000.00
qərar

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

İşçilər masası. Bütün işçilərin siyahısını və maaş bonuslarının mövcudluğu haqqında məlumat əldə edin (Bəli/Xeyr)
qərar

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

İşçilər masası. Hər bir işçinin əmək haqqı səviyyəsini əldə edin: 5000-dən az aşağı səviyyə, 5000-dən çox və ya ona bərabər və 10000-dən aşağı normal səviyyə, 10000-dən çox və ya ona bərabər yüksək səviyyə hesab olunur.
qərar

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;

Ölkələr cədvəli. Hər bir ölkə üçün onun yerləşdiyi regionu göstərin: 1-Avropa, 2-Amerika, 3-Asiya, 4-Afrika (qoşulmadan)
qərar

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;

Qrup funksiyalarından istifadə edərək ümumiləşdirilmiş məlumatların hesabatı

İşçilər masası. Minimum və maksimum əmək haqqı, erkən və gec gəlmə tarixləri və işçilərin sayı ilə departament_id tərəfindən hesabat alın. İşçilərin sayına görə çeşidləyin (az)
qərar

  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;

İşçilər masası. Adları eyni hərflə başlayan neçə işçi var? Kəmiyyətə görə çeşidləyin. Yalnız ədədin 1-dən çox olduğu yerləri göstərin
qərar

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;

İşçilər masası. Neçə işçi eyni şöbədə işləyir və eyni maaşı alır?
qərar

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

İşçilər masası. Həftənin hər günü neçə işçinin işə götürüldüyü barədə hesabat alın. Kəmiyyətə görə çeşidləyin
qərar

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

İşçilər masası. İllər üzrə neçə işçinin işə götürüldüyü barədə hesabat alın. Kəmiyyətə görə çeşidləyin
qərar

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

İşçilər masası. İşçiləri olan şöbələrin sayını alın
qərar

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

İşçilər masası. 30-dan çox işçisi olan departament_id siyahısını əldə edin
qərar

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

İşçilər masası. Departament_idlərinin siyahısını və hər bir şöbədə işçilərin yuvarlaqlaşdırılmış orta əmək haqqını əldə edin.
qərar

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

Ölkələr cədvəli. 60-dan çox olan bütün ölkə_adlarının bütün hərflərinin region_id cəminin siyahısını əldə edin
qərar

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

İşçilər masası. Bir neçə (>1) job_id işçilərinin işlədiyi departament_id siyahısını əldə edin
qərar

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

İşçilər masası. Tabeliyində olanların sayı 5-dən çox və tabeliyində olanların bütün maaşlarının cəmi 50000-dən çox olan manager_id siyahısını əldə edin
qərar

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

İşçilər masası. Bütün tabeliyində olan işçilərin orta əmək haqqı 6000 ilə 9000 arasında olan və bonus almayan menecer_id siyahısını əldə edin (komissiya_pct boşdur)
qərar

  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;

İşçilər masası. Bütün işçilərdən maksimum maaşı əldə edin job_id 'KLERK' sözü ilə bitən
qərar

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

İşçilər masası. Şöbə üçün bütün orta əmək haqqı arasında maksimum əmək haqqı alın
qərar

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

İşçilər masası. Adlarında eyni sayda hərf olan işçilərin sayını alın. Eyni zamanda, yalnız adı 5-dən uzun və eyni adlı işçilərin sayı 20-dən çox olanları göstərin. Ad uzunluğuna görə çeşidləyin
qərar

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

Qoşulmalardan istifadə edərək çoxlu cədvəllərdən verilənlərin göstərilməsi

Cədvəl İşçiləri, Departamentlər, Yerlər, Ölkələr, Regionlar. Bölgələrin siyahısını və hər bir bölgədə işçilərin sayını əldə edin
qərar

  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;

Cədvəl İşçiləri, Departamentlər, Yerlər, Ölkələr, Regionlar. Hər bir işçi haqqında ətraflı məlumat əldə edin:
Ad_ad, Soyad, Departament, İş, Küçə, Ölkə, Region
qərar

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

İşçilər masası. 6-dan çox işçisi olan bütün menecerləri göstərin
qərar

  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;

İşçilər masası. Heç kimə hesabat verməyən bütün işçiləri göstərin
qərar

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;

İşçilər cədvəli, İş_tarixi. İşçi cədvəli bütün işçiləri saxlayır. Job_history cədvəlində şirkəti tərk edən işçilər saxlanılır. Bütün işçilər və onların şirkətdəki statusu haqqında hesabat alın (İşdə olub və ya getmə tarixi ilə şirkətdən ayrılıb)
Misal:
ad_ad | status
jennifer | 31 dekabr 2006-cı ildə şirkəti tərk etdi
Clara | Hal-hazırda İşləyir
qərar

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

Cədvəl İşçiləri, Departamentlər, Yerlər, Ölkələr, Regionlar. Avropada yaşayan işçilərin siyahısını əldə edin (region_name)
qərar

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

Cədvəl işçiləri, şöbələr. 30-dan çox işçisi olan bütün şöbələri göstərin
qərar

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

Cədvəl işçiləri, şöbələr. Heç bir şöbədə olmayan bütün işçiləri göstərin
qərar

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;

Cədvəl işçiləri, şöbələr. İşçi olmayan bütün şöbələri göstərin
qərar

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

İşçilər masası. Heç bir tabeliyində olmayan bütün işçiləri göstərin
qərar

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

Cədvəl İşçiləri, İşlər, Şöbələr. İşçiləri formatda göstərin: Ad_ad, Vəzifə_titulu, Departament_adı.
Misal:
ad_ad | iş adı | Şöbə_adı
Donald | göndərmə | Kargüzar Göndərmə
qərar

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

İşçilər masası. Menecerləri 2005-ci ildə işə düzələn, lakin eyni zamanda, bu işçilərin özləri 2005-ci ildən əvvəl işə düzələn işçilərin siyahısını əldə edin.
qərar

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

İşçilər masası. Menecerləri istənilən ilin yanvar ayında işə düzələn və bu işçilərin iş_adının uzunluğu 15 simvoldan çox olan işçilərin siyahısını əldə edin.
qərar

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;

Sorğuları həll etmək üçün alt sorğulardan istifadə

İşçilər masası. Ən uzun adı olan işçilərin siyahısını əldə edin.
qərar

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

İşçilər masası. Bütün işçilərin orta maaşından çox maaş alan işçilərin siyahısını əldə edin.
qərar

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

Cədvəl işçiləri, şöbələr, yerlər. İşçilərin cəmi ən az qazandığı şəhəri əldə edin.
qərar

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

İşçilər masası. Meneceri 15000 XNUMX-dən çox maaş alan işçilərin siyahısını əldə edin.
qərar

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

Cədvəl işçiləri, şöbələr. İşçi olmayan bütün şöbələri göstərin
qərar

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

İşçilər masası. Menecer olmayan bütün işçiləri göstərin
qərar

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

İşçilər masası. 6-dan çox işçisi olan bütün menecerləri göstərin
qərar

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

Cədvəl işçiləri, şöbələr. İT şöbəsində işləyən işçiləri göstərin
qərar

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

Cədvəl İşçiləri, İşlər, Şöbələr. İşçiləri formatda göstərin: Ad_ad, Vəzifə_titulu, Departament_adı.
Misal:
ad_ad | iş adı | Şöbə_adı
Donald | göndərmə | Kargüzar Göndərmə
qərar

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;

İşçilər masası. Menecerləri 2005-ci ildə işə düzələn, lakin eyni zamanda, bu işçilərin özləri 2005-ci ildən əvvəl işə düzələn işçilərin siyahısını əldə edin.
qərar

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

İşçilər masası. Menecerləri istənilən ilin yanvar ayında işə düzələn və bu işçilərin iş_adının uzunluğu 15 simvoldan çox olan işçilərin siyahısını əldə edin.
qərar

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;

Hələlik bu qədər.

Ümid edirəm ki, tapşırıqlar maraqlı və həyəcanlı idi.
Bu siyahıya mümkün qədər əlavə edəcəyəm.
Mən də hər hansı bir şərh və təklifə şad olaram.

P.S: SELECT-də kimsə maraqlı tapşırıq çıxarsa, şərhlərdə yazın, siyahıya əlavə edəcəm.

Təşəkkür edirik.

Mənbə: www.habr.com

Добавить комментарий