SQL Teka-teki yang menghibur

Halo, Habr!

Selama lebih dari 3 tahun sekarang saya telah mengajar SQL di berbagai pusat pelatihan, dan salah satu pengamatan saya adalah bahwa siswa menguasai dan memahami SQL dengan lebih baik jika mereka menetapkan tugas, dan tidak hanya berbicara tentang kemungkinan dan landasan teoretis.

Dalam artikel ini saya akan berbagi dengan Anda daftar tugas yang saya berikan kepada siswa sebagai pekerjaan rumah dan di mana kami melakukan berbagai jenis brainstorm, yang mengarah pada pemahaman SQL yang mendalam dan jelas.



SQL (ˈsˈkjuˈɛl; Bahasa query terstruktur bahasa Inggris) 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. Pelajari lebih lanjut

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

Jadi ayo pergi.

Kami akan menggunakan skema SDM yang terkenal di Oracle dengan tabel-tabelnya ( selengkapnya ):


Saya perhatikan bahwa kami hanya akan mempertimbangkan tugas SELECT. Tidak ada masalah dengan DML dan DDL.

Tugasnya


Membatasi dan Menyortir Data

Meja karyawan. Dapatkan daftar dengan informasi tentang semua karyawan
Solusi
SELECT * FROM employees 


Meja karyawan. Dapatkan daftar semua karyawan yang bernama 'David'
Solusi
 SELECT * FROM employees WHERE first_name = 'David'; 


Meja karyawan. Dapatkan daftar semua karyawan dengan job_id sama dengan 'IT_PROG'
Solusi
 SELECT * FROM employees WHERE job_id = 'IT_PROG' 


Meja karyawan. Dapatkan daftar semua karyawan dari departemen ke-50 (department_id) dengan gaji (gaji), lebih dari 4000
Solusi
 SELECT * FROM employees WHERE department_id = 50 AND salary > 4000; 


Meja karyawan. Dapatkan daftar semua karyawan dari departemen ke-20 dan dari departemen ke-30 (department_id)
Solusi
 SELECT * FROM employees WHERE department_id = 20 OR department_id = 30; 


Meja karyawan. Dapatkan daftar semua karyawan yang huruf terakhirnya adalah 'a'
Solusi
 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 commission_pct tidak kosong)
Solusi
 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'
Solusi
 SELECT * FROM employees WHERE first_name LIKE '%n%n%'; 


Meja karyawan. Dapatkan daftar semua karyawan yang namanya lebih dari 4 huruf
Solusi
 SELECT * FROM employees WHERE first_name LIKE '%_____%'; 


Meja karyawan. Dapatkan daftar semua karyawan yang gajinya berkisar antara 8000 hingga 9000 (inklusif)
Solusi
 SELECT * FROM employees WHERE salary BETWEEN 8000 AND 9000; 


Meja karyawan. Dapatkan daftar semua karyawan yang namanya mengandung karakter '%'
Solusi
 SELECT * FROM employees WHERE first_name LIKE '%\%%' ESCAPE '\'; 


Meja karyawan. Dapatkan daftar semua manajer ID
Solusi
 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)
Solusi
 SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees; 



Menggunakan Fungsi Single-Row untuk Menyesuaikan Output

Meja karyawan. Dapatkan daftar semua karyawan yang namanya lebih dari 10 huruf
Solusi
 SELECT * FROM employees WHERE LENGTH (first_name) > 10; 


Meja karyawan. Dapatkan daftar semua karyawan yang memiliki huruf 'b' dalam nama mereka (tidak peka huruf besar-kecil)
Solusi
 SELECT * FROM employees WHERE INSTR (LOWER (first_name), 'b') > 0; 


Meja karyawan. Dapatkan daftar semua karyawan yang namanya mengandung setidaknya 2 huruf 'a'
Solusi
 SELECT * FROM employees WHERE INSTR (LOWER (first_name),'a',1,2) > 0; 


Meja karyawan. Dapatkan daftar semua karyawan yang gajinya lebih dari 1.000
Solusi
 SELECT * FROM employees WHERE MOD (salary, 1000) = 0; 


Meja karyawan. Dapatkan nomor 3 digit pertama dari nomor telepon karyawan jika nomornya dalam format XXXX.XXX.XXXX
Solusi
 SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number FROM employees WHERE phone_number LIKE '___.___.____'; 


Meja departemen. Dapatkan kata pertama dari nama departemen untuk mereka yang memiliki lebih dari satu kata dalam nama
Solusi
 SELECT department_name, SUBSTR (department_name, 1, INSTR (department_name, ' ')-1) first_word FROM departments WHERE INSTR (department_name, ' ') > 0; 


Meja karyawan. Dapatkan nama-nama karyawan tanpa huruf pertama dan terakhir dalam nama
Solusi
 SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name FROM employees; 


Meja karyawan. Dapatkan daftar semua karyawan yang huruf terakhirnya adalah 'm' dan nama panjang lebih besar dari 5
Solusi
 SELECT * FROM employees WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5; 


Meja ganda. Dapatkan tanggal Jumat berikutnya
Solusi
 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
Solusi
 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
Solusi
 SELECT * FROM employees WHERE MOD (SUBSTR (phone_number, -1), 2) != 0 AND INSTR (phone_number,'.',1,3) = 0 AND INSTR (phone_number,'.',1,2) > 0; 


Meja karyawan. Dapatkan daftar semua karyawan yang memiliki setidaknya 3 karakter dalam nilai job_id setelah tanda '_', tetapi nilai ini setelah '_' tidak sama dengan 'CLERK'
Solusi
 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 '.' Dalam nilai PHONE_NUMBER. pada '-'
Solusi
 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 untuk bekerja pada hari pertama bulan itu (apa saja)
Solusi
 SELECT * FROM employees WHERE TO_CHAR (hire_date, 'DD') = '01'; 


Meja karyawan. Dapatkan daftar semua karyawan yang datang untuk bekerja di tahun 2008
Solusi
 SELECT * FROM employees WHERE TO_CHAR (hire_date, 'YYYY') = '2008'; 


Tabel DUAL. Tampilkan tanggal besok dalam format: Besok adalah Hari kedua Januari
Solusi
 SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month') info FROM DUAL; 


Meja karyawan. Dapatkan daftar semua karyawan dan tanggal semua orang datang untuk bekerja dalam format: 21 Juni 2007
Solusi
 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
Solusi
 SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary FROM employees; 


Meja karyawan. Dapatkan daftar semua karyawan yang datang bekerja pada Februari 2007.
Solusi
 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'; 


Tabel DUAL. Keluarkan tanggal saat ini, + detik, + menit, + jam, + hari, + bulan, + tahun
Solusi
 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_pct (%)) dalam format: $ 24.000,00
Solusi
 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)
Solusi
 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 10.000 dianggap Tingkat normal, Lebih besar dari atau sama dengan 10.000 dianggap Tingkat tinggi
Solusi
 SELECT first_name, salary, CASE WHEN salary < 5000 THEN 'Low' WHEN salary >= 5000 AND salary < 10000 THEN 'Normal' WHEN salary >= 10000 THEN 'High' ELSE 'Unknown' END salary_level FROM employees; 


Meja negara. Untuk setiap negara, perlihatkan wilayah di mana ia berada: 1-Eropa, 2-Amerika, 3-Asia, 4-Afrika (tanpa Bergabung)
Solusi
 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 tentang department_id dengan gaji minimum dan maksimum, dengan tanggal kedatangan awal dan akhir di tempat kerja dan dengan jumlah karyawan. Urutkan berdasarkan jumlah karyawan (menurun)
Solusi
  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 di mana kuantitas lebih besar dari 1
Solusi
 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?
Solusi
 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
Solusi
 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 jumlah karyawan yang dipekerjakan berdasarkan tahun. Urutkan berdasarkan kuantitas
Solusi
 SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*) FROM employees GROUP BY TO_CHAR (hire_date, 'YYYY'); 


Meja karyawan. Dapatkan jumlah departemen di mana ada karyawan
Solusi
 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
Solusi
  SELECT department_id FROM employees GROUP BY department_id HAVING COUNT (*) > 30; 


Meja karyawan. Dapatkan daftar department_id dan gaji rata-rata bulat untuk karyawan di setiap departemen.
Solusi
  SELECT department_id, ROUND (AVG (salary)) avg_salary FROM employees GROUP BY department_id; 


Meja negara. Dapatkan daftar region_id jumlah semua huruf dari semua nama negara di mana lebih dari 60
Solusi
  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
Solusi
  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 50.000
Solusi
  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 berada di kisaran 6000 hingga 9000 yang tidak menerima bonus (commission_pct kosong)
Solusi
  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'
Solusi
 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 di departemen
Solusi
  SELECT MAX (AVG (salary)) FROM employees GROUP BY department_id; 


Meja karyawan. Dapatkan jumlah karyawan dengan jumlah huruf yang sama dalam nama. Pada saat yang sama, tunjukkan hanya mereka yang memiliki panjang nama lebih dari 5 dan jumlah karyawan dengan nama itu lebih dari 20. Urutkan berdasarkan nama panjang
Solusi
  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 Bergabung

Tabel Karyawan, Departemen, Lokasi, Negara, dan Wilayah. Dapatkan daftar wilayah dan jumlah karyawan di setiap wilayah
Solusi
  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, dan Wilayah. Dapatkan informasi terperinci tentang setiap karyawan:
First_name, Last_name, Departament, Job, Street, Country, Region
Solusi
 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
Solusi
  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
Solusi
 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 meninggalkan perusahaan. Dapatkan laporan tentang semua karyawan dan status mereka di perusahaan (Bekerja atau meninggalkan perusahaan dengan tanggal keberangkatan)
Contoh:
first_name | status
Jennifer | Meninggalkan perusahaan pada tanggal 31 Desember 2006
Clara | Sedang bekerja
Solusi
 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, dan Wilayah. Dapatkan daftar karyawan yang tinggal di Eropa (region_name)
Solusi
  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'; 


Meja karyawan, Departemen. Tunjukkan semua departemen dengan lebih dari 30 karyawan
Solusi
 SELECT department_name, COUNT (*) FROM employees e JOIN departments d ON (e.department_id = d.department_id) GROUP BY department_name HAVING COUNT (*) > 30; 


Meja karyawan, Departemen. Tampilkan semua karyawan yang tidak ada di departemen mana pun
Solusi
 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; 


Meja karyawan, Departemen. Tampilkan semua departemen tanpa satu karyawan
Solusi
 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
Solusi
 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:
First_name | Job_title | Nama_departemen
Donald | Pengiriman | Pegawai pengiriman
Solusi
 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 2005, tetapi pada saat yang sama, karyawan ini sendiri mendapat pekerjaan sebelum 2005
Solusi
 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 tahun apa pun dan lamanya job_title karyawan ini lebih dari 15 karakter
Solusi
 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 Memecahkan Kueri

Meja karyawan. Dapatkan daftar karyawan dengan nama terpanjang.
Solusi
 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.
Solusi
 SELECT * FROM employees WHERE salary > (SELECT AVG (salary) FROM employees); 


Tabel Karyawan, Departemen, Lokasi. Dapatkan kota di mana total penghasilan karyawan lebih sedikit.
Solusi
 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 15.000.
Solusi
 SELECT * FROM employees WHERE manager_id IN (SELECT employee_id FROM employees WHERE salary > 15000) 


Meja karyawan, Departemen. Tampilkan semua departemen tanpa satu karyawan
Solusi
 SELECT * FROM departments WHERE department_id NOT IN (SELECT department_id FROM employees WHERE department_id IS NOT NULL); 


Meja karyawan. Tunjukkan semua karyawan yang bukan manajer
Solusi
 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
Solusi
 SELECT * FROM employees e WHERE (SELECT COUNT (*) FROM employees WHERE manager_id = e.employee_id) > 6; 


Meja karyawan, Departemen. Tampilkan karyawan yang bekerja di departemen TI
Solusi
 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:
First_name | Job_title | Nama_departemen
Donald | Pengiriman | Pegawai pengiriman
Solusi
 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 2005, tetapi pada saat yang sama, karyawan ini sendiri mendapat pekerjaan sebelum 2005
Solusi
 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 tahun apa pun dan lamanya job_title karyawan ini lebih dari 15 karakter
Solusi
 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 mempesona.
Jika memungkinkan, saya akan melengkapi daftar tugas ini.
Saya juga akan senang dengan komentar dan saran.

PS: Jika seseorang datang dengan tugas PILIH yang menarik, tulis di komentar, tambahkan ke daftar.

Terima kasih

Source: https://habr.com/ru/post/id461567/


All Articles