SQL. Teka-teki yang menghiburkan

Hello, Habr!

Selama lebih dari 3 tahun saya telah mengajar SQL di pelbagai pusat latihan, dan salah satu pemerhatian saya ialah pelajar menguasai dan memahami SQL dengan lebih baik jika mereka diberi tugas, dan bukan hanya diberitahu tentang kemungkinan dan asas teori.

Dalam artikel ini, saya akan berkongsi dengan anda senarai masalah saya yang saya berikan kepada pelajar sebagai kerja rumah dan di mana kami menjalankan pelbagai jenis sumbang saran, yang membawa kepada pemahaman yang mendalam dan jelas tentang SQL.

SQL. Teka-teki yang menghiburkan

SQL (ΛˆΙ›sˈkjuΛˆΙ›l; bahasa pertanyaan berstruktur Inggeris) ialah bahasa pengaturcaraan deklaratif yang digunakan untuk mencipta, mengubah suai dan mengurus data dalam pangkalan data hubungan yang diuruskan oleh sistem pengurusan pangkalan data yang sesuai. Baca lebih lanjut…

Anda boleh membaca tentang SQL dari pelbagai sumber.
Artikel ini tidak bertujuan untuk mengajar anda SQL dari awal.

Jadi mari kita pergi.

Kami akan menggunakan yang terkenal gambarajah HR dalam Oracle dengan jadualnya (lebih):

SQL. Teka-teki yang menghiburkan
Saya ambil perhatian bahawa kami hanya akan mempertimbangkan tugas SELECT. Tiada tugasan DML atau DDL di sini.

tugas-tugas

Menyekat dan Mengisih Data

Meja pekerja. Dapatkan senarai dengan maklumat tentang semua pekerja
keputusan

SELECT * FROM employees

Meja pekerja. Dapatkan senarai semua pekerja bernama 'David'
keputusan

SELECT *
  FROM employees
 WHERE first_name = 'David';

Meja pekerja. Dapatkan senarai semua pekerja dengan job_id bersamaan dengan 'IT_PROG'
keputusan

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Meja pekerja. Dapatkan senarai semua pekerja dari jabatan ke-50 (department_id) dengan gaji (gaji) melebihi 4000
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja dari jabatan ke-20 dan ke-30 (id_jabatan)
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang huruf terakhir dalam nama mereka ialah 'a'
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja dari jabatan ke-50 dan ke-80 (department_id) yang mempunyai bonus (nilai dalam ruangan commission_pct tidak kosong)
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang namanya mengandungi sekurang-kurangnya 2 huruf 'n'
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang namanya lebih panjang daripada 4 huruf
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang gajinya dalam lingkungan 8000 hingga 9000 (termasuk)
keputusan

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Meja pekerja. Dapatkan senarai semua pekerja yang namanya mengandungi simbol '%'
keputusan

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

Meja pekerja. Dapatkan senarai semua ID pengurus
keputusan

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Meja pekerja. Dapatkan senarai pekerja dengan jawatan mereka dalam format: Donald(sh_clerk)
keputusan

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

Menggunakan Fungsi Satu Baris untuk Menyesuaikan Output

Meja pekerja. Dapatkan senarai semua pekerja yang namanya lebih panjang daripada 10 huruf
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang mempunyai huruf 'b' dalam nama mereka (tidak peka huruf besar-besaran)
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang namanya mengandungi sekurang-kurangnya 2 huruf 'a'
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang gajinya adalah gandaan 1000
keputusan

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

Meja pekerja. Dapatkan nombor 3 digit pertama nombor telefon pekerja jika nombornya dalam format XXX.XXX.XXXX
keputusan

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

Meja jabatan. Dapatkan perkataan pertama daripada nama jabatan bagi mereka yang mempunyai lebih daripada satu perkataan dalam nama itu
keputusan

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

Meja pekerja. Dapatkan nama pekerja tanpa nama huruf pertama dan terakhir
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang huruf terakhir dalam nama mereka ialah 'm' dan namanya lebih panjang daripada 5
keputusan

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

Jadual Dual. Dapatkan tarikh Jumaat depan
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang telah bekerja untuk syarikat selama lebih daripada 17 tahun
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang digit terakhir nombor telefon mereka adalah ganjil dan terdiri daripada 3 nombor yang dipisahkan dengan titik
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang mempunyai nilai job_id selepas tanda '_' mempunyai sekurang-kurangnya 3 aksara, tetapi nilai ini selepas '_' tidak sama dengan 'CLERK'
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja dengan menggantikan semua '.' dalam nilai PHONE_NUMBER pada '-'
keputusan

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

Menggunakan Fungsi Penukaran dan Ungkapan Bersyarat

Meja pekerja. Dapatkan senarai semua pekerja yang datang bekerja pada hari pertama bulan itu (mana-mana)
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang datang bekerja pada tahun 2008
keputusan

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

Jadual DUAL. Tunjukkan tarikh esok dalam format: Esok ialah hari Kedua bulan Januari
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja dan tarikh setiap pekerja tiba di tempat kerja dalam format: 21 Jun, 2007
keputusan

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

Meja pekerja. Dapatkan senarai pekerja dengan kenaikan gaji sebanyak 20%. Tunjukkan gaji dengan tanda dolar
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja yang mula bekerja pada Februari 2007.
keputusan

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

Jadual DUAL. Keluarkan tarikh semasa, + saat, + minit, + jam, + hari, + bulan, + tahun
keputusan

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;

Meja pekerja. Dapatkan senarai semua pekerja dengan gaji penuh (gaji + komisen_pct(%)) dalam format: $24,000.00
keputusan

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

Meja pekerja. Dapatkan senarai semua pekerja dan maklumat tentang ketersediaan bonus gaji (Ya/Tidak)
keputusan

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

Meja pekerja. Dapatkan tahap gaji setiap pekerja: Kurang daripada 5000 dianggap Tahap Rendah, Lebih daripada atau sama dengan 5000 dan kurang daripada 10000 dianggap Tahap Normal, Lebih daripada atau sama dengan 10000 dianggap Tahap Tinggi
keputusan

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;

Negara Meja. Untuk setiap negara, tunjukkan wilayah di mana ia berada: 1-Eropah, 2-Amerika, 3-Asia, 4-Afrika (tanpa Sertai)
keputusan

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;

Melaporkan Data Agregat Menggunakan Fungsi Kumpulan

Meja pekerja. Terima laporan oleh department_id dengan gaji minimum dan maksimum, tarikh awal dan lewat tiba di tempat kerja dan bilangan pekerja. Isih mengikut bilangan pekerja (menurun)
keputusan

  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;

Meja pekerja. Berapa ramai pekerja yang namanya bermula dengan huruf yang sama? Isih mengikut kuantiti. Tunjukkan hanya yang kuantitinya lebih besar daripada 1
keputusan

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;

Meja pekerja. Berapa ramai pekerja yang bekerja di jabatan yang sama dan menerima gaji yang sama?
keputusan

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

Meja pekerja. Dapatkan laporan tentang bilangan pekerja yang diambil pada setiap hari dalam seminggu. Isih mengikut kuantiti
keputusan

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

Meja pekerja. Dapatkan laporan bilangan pekerja yang diambil mengikut tahun. Isih mengikut kuantiti
keputusan

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

Meja pekerja. Dapatkan bilangan jabatan yang mempunyai pekerja
keputusan

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

Meja pekerja. Dapatkan senarai department_id yang mempunyai lebih daripada 30 pekerja
keputusan

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

Meja pekerja. Dapatkan senarai jabatan_id dan purata gaji pekerja di setiap jabatan.
keputusan

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

Negara Meja. Dapatkan senarai region_id jumlah semua huruf semua negara_nama yang mengandungi lebih daripada 60
keputusan

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

Meja pekerja. Dapatkan senarai department_id di mana pekerja beberapa (>1) job_id berfungsi
keputusan

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

Meja pekerja. Dapatkan senarai pengurus_id yang bilangan pekerjanya lebih daripada 5 dan jumlah semua gaji pekerja bawahannya melebihi 50000
keputusan

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

Meja pekerja. Dapatkan senarai pengurus_id yang purata gaji semua pekerja bawahannya berada dalam lingkungan 6000 hingga 9000 dan yang tidak menerima bonus (komisen_pct kosong)
keputusan

  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;

Meja pekerja. Dapatkan gaji maksimum daripada semua job_id pekerja yang berakhir dengan perkataan 'CLERK'
keputusan

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

Meja pekerja. Dapatkan gaji maksimum antara semua gaji purata untuk jabatan
keputusan

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

Meja pekerja. Dapatkan bilangan pekerja dengan bilangan huruf yang sama dalam nama mereka. Pada masa yang sama, tunjukkan hanya mereka yang panjang namanya lebih daripada 5 dan bilangan pekerja dengan nama yang sama adalah lebih daripada 20. Isih mengikut panjang nama
keputusan

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

Memaparkan Data daripada Berbilang Jadual Menggunakan Cantuman

Kakitangan Meja, Jabatan, Lokasi, Negara, Wilayah. Dapatkan senarai wilayah dan bilangan pekerja di setiap wilayah
keputusan

  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;

Kakitangan Meja, Jabatan, Lokasi, Negara, Wilayah. Dapatkan maklumat terperinci tentang setiap pekerja:
First_name, Last_name, Jabatan, Pekerjaan, Jalan, Negara, Wilayah
keputusan

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

Meja pekerja. Tunjukkan semua pengurus yang mempunyai lebih daripada 6 pekerja bawahan kepada mereka
keputusan

  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;

Meja pekerja. Tunjukkan semua pekerja yang tidak melaporkan kepada sesiapa
keputusan

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;

Pekerja Jadual, Job_history. Meja Pekerja menyimpan semua pekerja. Jadual Job_history menyimpan pekerja yang telah meninggalkan syarikat. Dapatkan laporan tentang semua pekerja dan status mereka dalam syarikat (Bekerja atau meninggalkan syarikat dengan tarikh berlepas)
Contoh:
nama_pertama | status
Jennifer | Meninggalkan syarikat pada 31 Disember 2006
Clara | Sedang bekerja
keputusan

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

Kakitangan Meja, Jabatan, Lokasi, Negara, Wilayah. Dapatkan senarai pekerja yang tinggal di Eropah (region_name)
keputusan

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

Kakitangan Meja, Jabatan. Tunjukkan semua jabatan yang mempunyai lebih daripada 30 pekerja
keputusan

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

Kakitangan Meja, Jabatan. Tunjukkan semua pekerja yang tidak berada di mana-mana jabatan
keputusan

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;

Kakitangan Meja, Jabatan. Tunjukkan semua jabatan yang tiada pekerja di dalamnya
keputusan

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

Meja pekerja. Tunjukkan semua pekerja yang tidak mempunyai sesiapa di bawahnya
keputusan

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

Pekerja Meja, Pekerjaan, Jabatan. Tunjukkan pekerja dalam format: First_name, Job_title, Department_name.
Contoh:
First_name | Job_title | Nama jabatan
Donald | Penghantaran | Kerani Penghantaran
keputusan

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

Meja pekerja. Dapatkan senarai pekerja yang pengurusnya mendapat pekerjaan pada tahun 2005, tetapi pada masa yang sama pekerja ini sendiri mendapat pekerjaan sebelum 2005
keputusan

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

Meja pekerja. Dapatkan senarai pekerja yang pengurusnya mendapat pekerjaan pada bulan Januari bagi mana-mana tahun dan tempoh job_title pekerja ini adalah lebih daripada 15 aksara
keputusan

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;

Menggunakan Subqueries untuk Menyelesaikan Pertanyaan

Meja pekerja. Dapatkan senarai pekerja dengan nama terpanjang.
keputusan

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

Meja pekerja. Dapatkan senarai pekerja dengan gaji lebih besar daripada gaji purata semua pekerja.
keputusan

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

Kakitangan, Jabatan, Jadual lokasi. Dapatkan bandar di mana pekerja secara keseluruhan memperoleh pendapatan paling sedikit.
keputusan

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

Meja pekerja. Dapatkan senarai pekerja yang pengurusnya menerima gaji lebih daripada 15000.
keputusan

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

Kakitangan Meja, Jabatan. Tunjukkan semua jabatan yang tiada pekerja di dalamnya
keputusan

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

Meja pekerja. Tunjukkan semua pekerja yang bukan pengurus
keputusan

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

Meja pekerja. Tunjukkan semua pengurus yang mempunyai lebih daripada 6 pekerja bawahan kepada mereka
keputusan

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

Kakitangan Meja, Jabatan. Tunjukkan pekerja yang bekerja di bahagian IT
keputusan

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

Pekerja Meja, Pekerjaan, Jabatan. Tunjukkan pekerja dalam format: First_name, Job_title, Department_name.
Contoh:
First_name | Job_title | Nama jabatan
Donald | Penghantaran | Kerani Penghantaran
keputusan

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;

Meja pekerja. Dapatkan senarai pekerja yang pengurusnya mendapat pekerjaan pada tahun 2005, tetapi pada masa yang sama pekerja ini sendiri mendapat pekerjaan sebelum 2005
keputusan

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

Meja pekerja. Dapatkan senarai pekerja yang pengurusnya mendapat pekerjaan pada bulan Januari bagi mana-mana tahun dan tempoh job_title pekerja ini adalah lebih daripada 15 aksara
keputusan

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;

Itu sahaja buat masa ini.

Saya harap tugasan itu menarik dan menarik.
Saya akan menambah senarai tugasan ini sebanyak mungkin.
Saya juga akan gembira menerima sebarang komen dan cadangan.

PS: Jika seseorang datang dengan tugas PILIH yang menarik, tulis dalam ulasan dan saya akan menambahkannya ke senarai.

Terima kasih.

Sumber: www.habr.com

Tambah komen