SQL. eğlenceli bulmacalar

Merhaba Habr!

3 yıldan fazla bir süredir çeşitli eğitim merkezlerinde SQL öğretiyorum ve gözlemlerimden biri, öğrencilerin yalnızca olasılıklar ve teorik temeller hakkında konuşmak yerine kendilerine bir görev verildiğinde SQL'de ustalaşıp daha iyi anladıklarıdır.

Bu yazımda sizlere SQL'i derinlemesine ve net bir şekilde anlamamızı sağlayan çeşitli beyin fırtınaları gerçekleştirdiğimiz ve öğrencilere ev ödevi olarak verdiğim görevler listemi paylaşacağım.

SQL. eğlenceli bulmacalar

SQL (ˈɛsˈkjuˈɛl; eng. yapılandırılmış sorgu dili), uygun bir veritabanı yönetim sistemi tarafından yönetilen ilişkisel bir veritabanındaki verileri oluşturmak, değiştirmek ve yönetmek için kullanılan bildirime dayalı bir programlama dilidir. Daha fazla detay

SQL hakkında farklı kaynaklardan okuyabilirsiniz. kaynakların.
Bu makale size SQL'i sıfırdan öğretmeyi amaçlamamaktadır.

Hadi, gidelim.

Bilinenleri kullanacağız İK şeması tablolarıyla Oracle'da (Daha fazla):

SQL. eğlenceli bulmacalar
Yalnızca SELECT üzerindeki görevleri dikkate alacağımızı unutmayın. DML ve DDL'de görev yoktur.

görevler

Verileri Kısıtlama ve Sıralama

Çalışanlar tablosu. Tüm çalışanlar hakkında bilgi içeren bir liste alın
karar

SELECT * FROM employees

Çalışanlar tablosu. 'David' adlı tüm çalışanların bir listesini alın
karar

SELECT *
  FROM employees
 WHERE first_name = 'David';

Çalışanlar tablosu. Job_id değeri "IT_PROG" değerine eşit olan tüm çalışanların listesini alın
karar

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Çalışanlar tablosu. 50. departmandan (department_id) maaşı (maaş) 4000'den fazla olan tüm çalışanların bir listesini alın
karar

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

Çalışanlar tablosu. 20. ve 30. departmandaki tüm çalışanların bir listesini alın (department_id)
karar

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

Çalışanlar tablosu. Adındaki son harfi 'a' olan tüm çalışanların bir listesini alın
karar

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

Çalışanlar tablosu. 50. ve 80. departmanlardan (department_id) ikramiye alan tüm çalışanların listesini alın (komisyon_pct sütunundaki değer boş değildir)
karar

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

Çalışanlar tablosu. Adında en az 2 harf 'n' bulunan tüm çalışanların bir listesini alın
karar

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

Çalışanlar tablosu. Adı 4 harften uzun olan tüm çalışanların listesini alın
karar

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

Çalışanlar tablosu. Maaşı 8000 ile 9000 (dahil) arasında olan tüm çalışanların listesini alın
karar

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Çalışanlar tablosu. Adı '%' sembolünü içeren tüm çalışanların bir listesini alın
karar

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

Çalışanlar tablosu. Tüm yönetici kimliklerinin bir listesini alın
karar

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Çalışanlar tablosu. Pozisyonlarıyla birlikte çalışanların bir listesini şu biçimde alın: Donald(sh_clerk)
karar

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

Çıktıyı Özelleştirmek için Tek Sıralı İşlevleri Kullanma

Çalışanlar tablosu. Adı 10 harften uzun olan tüm çalışanların listesini alın
karar

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

Çalışanlar tablosu. Adında 'b' harfi bulunan tüm çalışanların listesini alın (büyük/küçük harf duyarlı değildir)
karar

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

Çalışanlar tablosu. Adında en az 2 "a" harfi bulunan tüm çalışanların listesini alın
karar

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

Çalışanlar tablosu. Maaşı 1000'in katı olan tüm çalışanların listesini alın
karar

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

Çalışanlar tablosu. Numarası ХХХ.ХХХ.ХХХХ biçimindeyse, çalışanın telefon numarasının ilk 3 haneli numarasını alın
karar

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

Bölümler tablosu. Adında birden fazla kelime olanlar için ilk kelimeyi bölüm adından alın.
karar

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

Çalışanlar tablosu. Adındaki ilk ve son harf olmadan çalışan adlarını alın
karar

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

Çalışanlar tablosu. Adındaki son harfi 'm' olan ve adın uzunluğu 5'ten büyük olan tüm çalışanların bir listesini alın
karar

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

İkili masa. Gelecek Cuma tarihini al
karar

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

Çalışanlar tablosu. 17 yılı aşkın süredir şirkette olan tüm çalışanların bir listesini alın
karar

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

Çalışanlar tablosu. Telefon numarasının son rakamı tek olan ve nokta ile ayrılmış 3 sayıdan oluşan tüm çalışanların listesini alın
karar

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

Çalışanlar tablosu. '_' işaretinden sonraki job_id değeri en az 3 karakter olan ancak '_' işaretinden sonraki bu değer 'CLERK' değerine eşit olmayan tüm çalışanların listesini alın
karar

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

Çalışanlar tablosu. PHONE_NUMBER değerindeki tüm '.'leri değiştirerek tüm çalışanların bir listesini alın Açık '-'
karar

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

Dönüştürme İşlevlerini ve Koşullu İfadeleri Kullanma

Çalışanlar tablosu. Ayın ilk günü (herhangi biri) işe gelen tüm çalışanların listesini alın
karar

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

Çalışanlar tablosu. 2008'de işe gelen tüm çalışanların bir listesini alın
karar

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

ÇİFT tablo. Yarının tarihini şu biçimde göster: Yarın Ocak ayının ikinci günü
karar

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

Çalışanlar tablosu. Tüm çalışanların bir listesini ve başlangıç ​​tarihlerini şu biçimde alın: 21 Haziran 2007
karar

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

Çalışanlar tablosu. Maaşları %20 artan çalışanların listesini alın. Maaşı dolar işaretiyle göster
karar

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

Çalışanlar tablosu. Şubat 2007'de işe gelen tüm çalışanların bir listesini alın.
karar

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

ÇİFT tablo. Geçerli tarihi, + saniye, + dakika, + saat, + gün, + ay, + yılı dışa aktar
karar

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;

Çalışanlar tablosu. Tam maaşlı (maaş + komisyon_pct(%)) tüm çalışanların listesini şu biçimde alın: $24,000.00
karar

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

Çalışanlar tablosu. Tüm çalışanların bir listesini ve maaş ikramiyelerinin olup olmadığı hakkında bilgi alın (Evet/Hayır)
karar

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

Çalışanlar tablosu. Her çalışanın maaş seviyesini öğrenin: 5000'den az Düşük seviye, 5000'den büyük veya eşit ve 10000'den küçük normal seviye, 10000'den büyük veya ona eşit Yüksek seviye olarak kabul edilir
karar

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;

Ülkeler tablosu. Her ülke için bulunduğu bölgeyi gösterin: 1-Avrupa, 2-Amerika, 3-Asya, 4-Afrika (Katılmadan)
karar

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;

Grup İşlevlerini Kullanarak Toplu Verileri Raporlama

Çalışanlar tablosu. Minimum ve maksimum maaşı, erken ve geç varış tarihlerini ve çalışan sayısını içeren departman kimliğine göre bir rapor alın. Çalışan sayısına göre sırala (azalan)
karar

  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;

Çalışanlar tablosu. İsimleri aynı harfle başlayan kaç çalışan var? Miktara göre sırala. Yalnızca sayının 1'den büyük olduğu yerleri göster
karar

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;

Çalışanlar tablosu. Aynı departmanda kaç çalışan aynı maaşı alıyor?
karar

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

Çalışanlar tablosu. Haftanın her gününde kaç çalışanın işe alındığına dair bir rapor alın. Miktara göre sırala
karar

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

Çalışanlar tablosu. Yıllara göre kaç çalışanın işe alındığına dair bir rapor alın. Miktara göre sırala
karar

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

Çalışanlar tablosu. Çalışanı olan departmanların sayısını alın
karar

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

Çalışanlar tablosu. 30'dan fazla çalışanı olan departman_kimliği listesini alın
karar

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

Çalışanlar tablosu. Departman kimliklerinin bir listesini ve her departmandaki çalışanların ortalama maaşlarını alın.
karar

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

Ülkeler tablosu. 60'tan fazla olan tüm ülke_adlarının tüm harflerinin bölge_kimliği toplamının bir listesini alın
karar

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

Çalışanlar tablosu. Birkaç (>1) job_id çalışanının çalıştığı departman_id listesini alın
karar

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

Çalışanlar tablosu. Ast sayısı 5'ten fazla olan ve astlarının tüm maaşlarının toplamı 50000'den fazla olan manager_id listesini alın
karar

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

Çalışanlar tablosu. İkramiye almayan tüm astlarının ortalama maaşı 6000 ile 9000 arasında olan manager_id listesini alın (commission_pct boş)
karar

  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;

Çalışanlar tablosu. Tüm çalışanlardan maksimum maaşı alın 'CLERK' kelimesiyle biten job_id
karar

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

Çalışanlar tablosu. Bölüm için tüm ortalama maaşlar arasında en yüksek maaşı alın
karar

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

Çalışanlar tablosu. İsimlerinde aynı sayıda harf bulunan çalışan sayısını alın. Aynı zamanda sadece ismi 5'ten uzun ve aynı isme sahip çalışan sayısı 20'den fazla olanları gösterin. İsim uzunluğuna göre sırala
karar

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

Birleştirmeleri Kullanarak Birden Çok Tablodan Veri Görüntüleme

Tablo Çalışanları, Departmanlar, Lokasyonlar, Ülkeler, Bölgeler. Bölgelerin listesini ve her bölgedeki çalışan sayısını alın
karar

  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;

Tablo Çalışanları, Departmanlar, Lokasyonlar, Ülkeler, Bölgeler. Her çalışan hakkında ayrıntılı bilgi alın:
Ad, Soyad, Departman, Meslek, Sokak, Ülke, Bölge
karar

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

Çalışanlar tablosu. 6'dan fazla çalışanı olan tüm yöneticileri göster
karar

  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;

Çalışanlar tablosu. Kimseye rapor vermeyen tüm çalışanları göster
karar

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;

Çalışanlar tablosu, Job_history. Çalışan tablosu tüm çalışanları saklar. Job_history tablosu, şirketten ayrılan çalışanları saklar. Tüm çalışanlar ve şirketteki durumları hakkında rapor alın (İşten ayrılış tarihi ile çalışan veya şirketten ayrılan)
Örnek:
ilk_ad | durum
jennifer | 31 Aralık 2006 tarihinde şirketten ayrıldı.
Clara | Şuan çalışıyor
karar

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

Tablo Çalışanları, Departmanlar, Lokasyonlar, Ülkeler, Bölgeler. Avrupa'da (bölge_adı) yaşayan çalışanların listesini alın
karar

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

Masa Çalışanları, Departmanlar. 30'dan fazla çalışanı olan tüm departmanları göster
karar

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

Masa Çalışanları, Departmanlar. Herhangi bir departmanda olmayan tüm çalışanları göster
karar

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;

Masa Çalışanları, Departmanlar. Çalışanı olmayan tüm departmanları göster
karar

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

Çalışanlar tablosu. Astları olmayan tüm çalışanları göster
karar

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

Masa Çalışanları, İşler, Departmanlar. Çalışanları şu biçimde gösterin: Ad_adı, İş_unvanı, Departman_adı.
Örnek:
ilk_ad | iş unvanı | Bölüm Adı
Donald | nakliye | Katip Nakliye
karar

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

Çalışanlar tablosu. Yöneticileri 2005'te iş bulan, ancak aynı zamanda bu işçilerin kendileri de 2005'ten önce iş bulan çalışanların bir listesini alın.
karar

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

Çalışanlar tablosu. Yöneticileri herhangi bir yılın Ocak ayında iş bulan çalışanların listesini alın ve bu çalışanların iş_başlığının uzunluğu 15 karakterden fazla olsun
karar

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;

Sorguları Çözmek için Alt Sorguları Kullanma

Çalışanlar tablosu. En uzun ada sahip çalışanların bir listesini alın.
karar

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

Çalışanlar tablosu. Tüm çalışanların ortalama maaşından daha yüksek maaş alan çalışanların bir listesini alın.
karar

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

Tablo Çalışanları, Departmanlar, Konumlar. Çalışanların toplamda en az kazandığı şehri alın.
karar

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

Çalışanlar tablosu. Yöneticisi 15000'den fazla maaş alan çalışanların bir listesini alın.
karar

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

Masa Çalışanları, Departmanlar. Çalışanı olmayan tüm departmanları göster
karar

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

Çalışanlar tablosu. Yönetici olmayan tüm çalışanları göster
karar

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

Çalışanlar tablosu. 6'dan fazla çalışanı olan tüm yöneticileri göster
karar

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

Masa Çalışanları, Departmanlar. BT departmanında çalışan çalışanları göster
karar

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

Masa Çalışanları, İşler, Departmanlar. Çalışanları şu biçimde gösterin: Ad_adı, İş_unvanı, Departman_adı.
Örnek:
ilk_ad | iş unvanı | Bölüm Adı
Donald | nakliye | Katip Nakliye
karar

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;

Çalışanlar tablosu. Yöneticileri 2005'te iş bulan, ancak aynı zamanda bu işçilerin kendileri de 2005'ten önce iş bulan çalışanların bir listesini alın.
karar

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

Çalışanlar tablosu. Yöneticileri herhangi bir yılın Ocak ayında iş bulan çalışanların listesini alın ve bu çalışanların iş_başlığının uzunluğu 15 karakterden fazla olsun
karar

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;

Şimdilik hepsi bu.

Umarım görevler ilginç ve heyecan verici olmuştur.
Bu listeye mümkün olduğunca çok şey ekleyeceğim.
Ayrıca herhangi bir yorum ve öneriden memnuniyet duyacağım.

Not: Birisi SELECT'te ilginç bir görev bulursa, yorumlara yazın, listeye ekleyeceğim.

Teşekkür ederim.

Kaynak: habr.com

Yorum ekle