SQL. Teka-teki yang menghibur

Halo Habr!

Selama lebih dari 3 tahun saya mengajar SQL di berbagai pusat pelatihan, dan salah satu pengamatan saya adalah siswa lebih menguasai dan memahami SQL jika diberi tugas, dan tidak hanya berbicara tentang kemungkinan dan landasan teori.

Pada artikel ini, saya akan membagikan kepada Anda daftar tugas yang saya berikan kepada siswa sebagai pekerjaan rumah dan di mana kami melakukan berbagai jenis curah pendapat, yang mengarah pada pemahaman SQL yang mendalam dan jelas.

SQL. Teka-teki yang menghibur

SQL (ΛˆΙ›sˈkjuΛˆΙ›l; eng. structured query language) adalah bahasa pemrograman deklaratif yang digunakan untuk membuat, memodifikasi, dan mengelola data dalam basis data relasional yang dikelola oleh sistem manajemen basis data yang sesuai. Lebih detail ...

Anda dapat membaca tentang SQL dari berbagai sumber.
Artikel ini tidak dimaksudkan untuk mengajari Anda SQL dari awal.

Jadi ayo pergi.

Kami akan menggunakan yang terkenal skema SDM di Oracle dengan tabelnya (lebih):

SQL. Teka-teki yang menghibur
Saya perhatikan bahwa kami hanya akan mempertimbangkan tugas di SELECT. Tidak ada tugas di DML dan DDL.

tugas

Membatasi dan Menyortir Data

Meja karyawan. Dapatkan daftar dengan informasi tentang semua karyawan
keputusan

SELECT * FROM employees

Meja karyawan. Dapatkan daftar semua karyawan bernama 'David'
keputusan

SELECT *
  FROM employees
 WHERE first_name = 'David';

Meja karyawan. Dapatkan daftar semua karyawan dengan job_id sama dengan 'IT_PROG'
keputusan

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Meja karyawan. Dapatkan daftar semua karyawan dari departemen ke-50 (department_id) dengan gaji (salary) lebih besar dari 4000
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan dari tanggal 20 dan dari departemen ke-30 (department_id)
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang huruf terakhir namanya adalah 'a'
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan dari departemen ke-50 dan dari departemen ke-80 (department_id) yang memiliki bonus (nilai di kolom komisi_persen tidak kosong)
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang namanya mengandung setidaknya 2 huruf 'n'
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang namanya lebih dari 4 huruf
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang gajinya antara 8000 dan 9000 (inklusif)
keputusan

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Meja karyawan. Dapatkan daftar semua karyawan yang namanya mengandung simbol '%'
keputusan

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

Meja karyawan. Dapatkan daftar semua ID manajer
keputusan

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Meja karyawan. Dapatkan daftar karyawan dengan posisi mereka dalam format: Donald(sh_clerk)
keputusan

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

Menggunakan Fungsi Baris Tunggal untuk Menyesuaikan Output

Meja karyawan. Dapatkan daftar semua karyawan yang namanya lebih dari 10 huruf
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang memiliki huruf 'b' di namanya (peka huruf besar kecil)
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang namanya mengandung setidaknya 2 huruf 'a'
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang gajinya kelipatan 1000
keputusan

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

Meja karyawan. Dapatkan nomor 3 digit pertama dari nomor telepon karyawan jika nomornya dalam format Π₯Π₯Π₯.Π₯Π₯Π₯.Π₯Π₯Π₯Π₯
keputusan

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

tabel departemen. Dapatkan kata pertama dari nama departemen untuk nama yang memiliki lebih dari satu kata
keputusan

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

Meja karyawan. Dapatkan nama karyawan tanpa huruf pertama dan terakhir pada namanya
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang huruf terakhir namanya sama dengan 'm' dan panjang namanya lebih dari 5
keputusan

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

Meja ganda. Dapatkan tanggal Jumat depan
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang telah bekerja di perusahaan selama lebih dari 17 tahun
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang digit terakhir nomor teleponnya ganjil dan terdiri dari 3 angka yang dipisahkan oleh titik
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang nilai job_id setelah tanda '_' memiliki setidaknya 3 karakter, tetapi nilai ini setelah '_' 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 karyawan. Dapatkan daftar semua karyawan dengan mengganti semua '.' pada nilai PHONE_NUMBER pada '-'
keputusan

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

Menggunakan Fungsi Konversi dan Ekspresi Bersyarat

Meja karyawan. Dapatkan daftar semua karyawan yang datang bekerja pada hari pertama setiap bulan (apa saja)
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang masuk kerja pada tahun 2008
keputusan

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

meja GANDA. Tampilkan tanggal besok dalam format: Besok adalah Hari Kedua Januari
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan dan tanggal mulai mereka dalam format: 21 Juni 2007
keputusan

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

Meja karyawan. Dapatkan daftar karyawan dengan kenaikan gaji sebesar 20%. Tampilkan gaji dengan tanda dolar
keputusan

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

Meja karyawan. Dapatkan daftar semua karyawan yang masuk kerja 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'; 

meja GANDA. Ekspor tanggal saat ini, + detik, + menit, + 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 karyawan. Dapatkan daftar semua karyawan dengan gaji penuh (gaji + komisi_persen(%)) 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 karyawan. Dapatkan daftar semua karyawan dan informasi tentang ketersediaan bonus gaji (Ya/Tidak)
keputusan

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

Meja karyawan. Dapatkan tingkat gaji setiap karyawan: Kurang dari 5000 dianggap Tingkat rendah, Lebih besar dari atau sama dengan 5000 dan kurang dari 10000 dianggap Tingkat normal, Lebih besar dari atau sama dengan 10000 dianggap Tingkat 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;

Tabel negara. Untuk setiap negara, tunjukkan wilayah tempatnya berada: 1-Eropa, 2-Amerika, 3-Asia, 4-Afrika (tanpa Gabung)
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 Grup

Meja karyawan. Dapatkan laporan dari department_id dengan gaji minimum dan maksimum, tanggal kedatangan awal dan akhir dan jumlah karyawan. Urutkan berdasarkan jumlah karyawan (desc)
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 karyawan. Berapa banyak karyawan yang namanya dimulai dengan huruf yang sama? Urutkan berdasarkan kuantitas. Hanya tampilkan yang angkanya lebih besar dari 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 karyawan. Berapa banyak karyawan yang bekerja di departemen yang sama dan menerima gaji yang sama?
keputusan

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

Meja karyawan. Dapatkan laporan tentang berapa banyak karyawan yang dipekerjakan pada setiap hari dalam seminggu. Urutkan berdasarkan kuantitas
keputusan

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

Meja karyawan. Dapatkan laporan tentang berapa banyak karyawan yang dipekerjakan per tahun. Urutkan berdasarkan kuantitas
keputusan

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

Meja karyawan. Dapatkan jumlah departemen yang memiliki karyawan
keputusan

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

Meja karyawan. Dapatkan daftar department_id dengan lebih dari 30 karyawan
keputusan

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

Meja karyawan. Dapatkan daftar id_departemen dan rata-rata gaji karyawan di setiap departemen.
keputusan

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

Tabel negara. Dapatkan daftar jumlah id_wilayah dari semua huruf dari semua nama_negara yang lebih dari 60
keputusan

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

Meja karyawan. Dapatkan daftar department_id tempat karyawan dari beberapa (>1) job_id bekerja
keputusan

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

Meja karyawan. Dapatkan daftar manager_id yang jumlah bawahannya lebih dari 5 dan jumlah semua gaji bawahannya lebih dari 50000
keputusan

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

Meja karyawan. Dapatkan daftar manager_id yang gaji rata-rata semua bawahannya antara 6000 dan 9000 yang tidak menerima bonus (komisi_persen 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 karyawan. Dapatkan gaji maksimum dari semua karyawan job_id yang diakhiri dengan kata '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 karyawan. Dapatkan gaji maksimum di antara semua gaji rata-rata untuk departemen
keputusan

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

Meja karyawan. Dapatkan jumlah karyawan dengan jumlah huruf yang sama di namanya. Pada saat yang sama, tampilkan hanya mereka yang namanya lebih panjang dari 5 dan jumlah karyawan dengan nama yang sama lebih dari 20. Urutkan berdasarkan 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);

Menampilkan Data dari Beberapa Tabel Menggunakan Penggabungan

Tabel Karyawan, Departemen, Lokasi, Negara, Wilayah. Dapatkan daftar wilayah dan jumlah karyawan 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;

Tabel Karyawan, Departemen, Lokasi, Negara, Wilayah. Dapatkan informasi terperinci tentang setiap karyawan:
Nama_depan, Nama_belakang, Departemen, 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 karyawan. Tampilkan semua manajer yang memiliki lebih dari 6 karyawan
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 karyawan. Tampilkan semua karyawan yang tidak melapor kepada siapa pun
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;

Tabel karyawan, Job_history. Tabel Karyawan menyimpan semua karyawan. Tabel Job_history menyimpan karyawan yang keluar dari perusahaan. Dapatkan laporan tentang semua karyawan dan status mereka di perusahaan (Bekerja atau keluar dari perusahaan dengan tanggal keberangkatan)
Contoh:
nama_depan | status
jennifer | Meninggalkan perusahaan pada tanggal 31 Desember 2006
Klara | 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);

Tabel Karyawan, Departemen, Lokasi, Negara, Wilayah. Dapatkan daftar karyawan yang tinggal di Eropa (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';

Tabel Karyawan, Departemen. Tampilkan semua departemen dengan lebih dari 30 karyawan
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;

Tabel Karyawan, Departemen. Tampilkan semua karyawan yang tidak berada di departemen mana pun
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;

Tabel Karyawan, Departemen. Tampilkan semua departemen tanpa karyawan
keputusan

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

Meja karyawan. Tampilkan semua karyawan yang tidak memiliki bawahan
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;

Tabel Karyawan, Pekerjaan, Departemen. Tampilkan karyawan dalam format: First_name, Job_title, Department_name.
Contoh:
nama_depan | jabatan | Nama departemen
Donald | pengiriman | Petugas Pengiriman
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 karyawan. Dapatkan daftar karyawan yang manajernya mendapat pekerjaan pada tahun 2005, tetapi pada saat yang sama, para pekerja ini sendiri mendapat pekerjaan sebelum tahun 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 karyawan. Dapatkan daftar karyawan yang manajernya mendapat pekerjaan di bulan Januari setiap tahun dan panjang jabatan_pekerjaan karyawan ini lebih dari 15 karakter
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 Subquery untuk Memecahkan Query

Meja karyawan. Dapatkan daftar karyawan dengan nama terpanjang.
keputusan

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

Meja karyawan. Dapatkan daftar karyawan dengan gaji lebih besar dari gaji rata-rata semua karyawan.
keputusan

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

Tabel Karyawan, Departemen, Lokasi. Dapatkan kota di mana total penghasilan karyawan 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 karyawan. Dapatkan daftar karyawan yang manajernya menerima gaji lebih dari 15000.
keputusan

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

Tabel Karyawan, Departemen. Tampilkan semua departemen tanpa karyawan
keputusan

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

Meja karyawan. Tampilkan semua karyawan yang bukan manajer
keputusan

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

Meja karyawan. Tampilkan semua manajer yang memiliki lebih dari 6 karyawan
keputusan

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

Tabel Karyawan, Departemen. Tampilkan karyawan yang bekerja di departemen TI
keputusan

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

Tabel Karyawan, Pekerjaan, Departemen. Tampilkan karyawan dalam format: First_name, Job_title, Department_name.
Contoh:
nama_depan | jabatan | Nama departemen
Donald | pengiriman | Petugas Pengiriman
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 karyawan. Dapatkan daftar karyawan yang manajernya mendapat pekerjaan pada tahun 2005, tetapi pada saat yang sama, para pekerja ini sendiri mendapat pekerjaan sebelum tahun 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 karyawan. Dapatkan daftar karyawan yang manajernya mendapat pekerjaan di bulan Januari setiap tahun dan panjang jabatan_pekerjaan karyawan ini lebih dari 15 karakter
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 saja untuk saat ini.

Saya harap tugasnya menarik dan mengasyikkan.
Saya akan menambahkan daftar ini sebanyak mungkin.
Saya juga akan senang untuk setiap komentar dan saran.

PS: Jika seseorang datang dengan tugas yang menarik di SELECT, tulis di komentar, saya akan menambahkannya ke daftar.

Terima kasih.

Sumber: www.habr.com

Tambah komentar