SQL. câu đố giải trí

Xin chào Habr!

Trong hơn 3 năm nay, tôi đã dạy SQL ở nhiều trung tâm đào tạo khác nhau và một trong những quan sát của tôi là học sinh nắm vững và hiểu SQL tốt hơn nếu họ được giao một nhiệm vụ chứ không chỉ được nghe về các khả năng và nền tảng lý thuyết.

Trong bài viết này, tôi sẽ chia sẻ với bạn danh sách các vấn đề mà tôi giao cho học sinh làm bài tập về nhà và dựa trên đó chúng tôi tiến hành nhiều kiểu động não khác nhau để giúp bạn hiểu sâu sắc và rõ ràng về SQL.

SQL. câu đố giải trí

SQL (ˈɛsˈkjuˈɛl; ngôn ngữ truy vấn có cấu trúc tiếng Anh) là ngôn ngữ lập trình khai báo được sử dụng để tạo, sửa đổi và quản lý dữ liệu trong cơ sở dữ liệu quan hệ được quản lý bởi hệ thống quản lý cơ sở dữ liệu thích hợp. Tìm hiểu thêm

Bạn có thể đọc về SQL từ nhiều nguồn khác nhau nguồn.
Bài viết này không nhằm mục đích dạy bạn SQL từ đầu.

Vậy hãy đi đi.

Chúng tôi sẽ sử dụng những gì nổi tiếng Sơ đồ nhân sự trong Oracle với các bảng của nó (hơn):

SQL. câu đố giải trí
Tôi lưu ý rằng chúng tôi sẽ chỉ xem xét các nhiệm vụ CHỌN. Không có nhiệm vụ DML hoặc DDL nào ở đây.

nhiệm vụ

Hạn chế và sắp xếp dữ liệu

Bảng nhân viên. Nhận danh sách chứa thông tin về tất cả nhân viên
phán quyết

SELECT * FROM employees

Bảng nhân viên. Lấy danh sách tất cả nhân viên có tên 'David'
phán quyết

SELECT *
  FROM employees
 WHERE first_name = 'David';

Bảng nhân viên. Lấy danh sách tất cả nhân viên có job_id bằng 'IT_PROG'
phán quyết

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Bảng nhân viên. Lấy danh sách toàn bộ nhân viên phòng 50 (department_id) có mức lương (mức lương) lớn hơn 4000
phán quyết

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

Bảng nhân viên. Lấy danh sách toàn bộ nhân viên phòng 20 và 30 (department_id)
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên có chữ cái cuối cùng trong tên của họ là 'a'
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên từ bộ phận 50 và 80 (department_id) có thưởng (giá trị ở cột Commission_pct không được để trống)
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên có tên chứa ít nhất 2 chữ cái 'n'
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên có tên dài hơn 4 chữ cái
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên có mức lương nằm trong khoảng từ 8000 đến 9000 (bao gồm)
phán quyết

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Bảng nhân viên. Lấy danh sách tất cả nhân viên có tên chứa ký hiệu '%'
phán quyết

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

Bảng nhân viên. Nhận danh sách tất cả ID người quản lý
phán quyết

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Bảng nhân viên. Lấy danh sách nhân viên với các vị trí công việc theo dạng: Donald(sh_clerk)
phán quyết

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

Sử dụng các hàm một hàng để tùy chỉnh đầu ra

Bảng nhân viên. Lấy danh sách tất cả nhân viên có tên dài hơn 10 chữ cái
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên có chữ 'b' trong tên của họ (không phân biệt chữ hoa chữ thường)
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên có tên chứa ít nhất 2 chữ cái 'a'
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên có lương là bội số của 1000
phán quyết

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

Bảng nhân viên. Lấy số có 3 chữ số đầu tiên trong số điện thoại của nhân viên nếu số của anh ta ở định dạng XXX.XXX.XXXX
phán quyết

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

Bảng các khoa. Lấy từ đầu tiên trong tên phòng ban đối với những người có nhiều hơn một từ trong tên
phán quyết

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

Bảng nhân viên. Nhận tên nhân viên không có chữ cái đầu và cuối trong tên
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên có chữ cái cuối cùng trong tên của họ là 'm' và có tên dài hơn 5
phán quyết

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

Bảng kép. Nhận ngày thứ Sáu tiếp theo
phán quyết

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

Bảng nhân viên. Lấy danh sách toàn bộ nhân viên đã làm việc cho công ty trên 17 năm
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả các nhân viên có chữ số cuối trong số điện thoại của họ là số lẻ và gồm 3 số cách nhau bằng dấu chấm
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên có giá trị job_id sau dấu '_' có ít nhất 3 ký tự, nhưng giá trị này sau dấu '_' không bằng 'CLERK'
phán quyết

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

Bảng nhân viên. Nhận danh sách tất cả nhân viên bằng cách thay thế tất cả '.' trong giá trị PHONE_NUMBER TRÊN '-'
phán quyết

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

Sử dụng hàm chuyển đổi và biểu thức điều kiện

Bảng nhân viên. Lấy danh sách toàn bộ nhân viên đến làm việc ngày đầu tháng (bất kỳ)
phán quyết

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

Bảng nhân viên. Lấy danh sách toàn bộ CBCNV đến làm việc năm 2008
phán quyết

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

Bảng KÉP. Hiển thị ngày của ngày mai ở định dạng: Ngày mai là ngày thứ hai của tháng một
phán quyết

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

Bảng nhân viên. Lấy danh sách nhân viên và ngày đến làm việc theo mẫu: 21/2007/XNUMX
phán quyết

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

Bảng nhân viên. Lấy danh sách nhân viên được tăng lương 20%. Hiển thị mức lương bằng ký hiệu đô la
phán quyết

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

Bảng nhân viên. Lấy danh sách tất cả nhân viên bắt đầu làm việc vào tháng 2007 năm XNUMX.
phán quyết

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

Bảng KÉP. Đưa ra ngày hiện tại, + giây, + phút, + giờ, + ngày, + tháng, + năm
phán quyết

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;

Bảng nhân viên. Nhận danh sách tất cả nhân viên có mức lương đầy đủ (lương + hoa hồng_pct(%)) ở định dạng: 24,000.00 USD
phán quyết

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

Bảng nhân viên. Nhận danh sách tất cả nhân viên và thông tin về mức lương thưởng sẵn có (Có/Không)
phán quyết

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

Bảng nhân viên. Lấy mức lương của từng nhân viên: Nhỏ hơn 5000 được coi là Cấp thấp, Lớn hơn hoặc bằng 5000 và nhỏ hơn 10000 được coi là Cấp bình thường, Lớn hơn hoặc bằng 10000 được coi là Cấp cao
phán quyết

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;

Các nước trong bảng. Đối với mỗi quốc gia, hiển thị khu vực nơi quốc gia đó tọa lạc: 1-Châu Âu, 2-Châu Mỹ, 3-Châu Á, 4-Châu Phi (không tham gia)
phán quyết

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;

Báo cáo dữ liệu tổng hợp bằng các hàm nhóm

Bảng nhân viên. Nhận báo cáo theo Department_id với mức lương tối thiểu và tối đa, ngày đến nơi làm việc sớm và muộn cũng như số lượng nhân viên. Sắp xếp theo số lượng nhân viên (giảm dần)
phán quyết

  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;

Bảng nhân viên. Có bao nhiêu nhân viên có tên bắt đầu bằng cùng một chữ cái? Sắp xếp theo số lượng. Chỉ hiển thị những nơi có số lượng lớn hơn 1
phán quyết

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;

Bảng nhân viên. Có bao nhiêu nhân viên làm việc trong cùng một bộ phận và nhận được mức lương như nhau?
phán quyết

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

Bảng nhân viên. Nhận báo cáo về số lượng nhân viên được thuê vào mỗi ngày trong tuần. Sắp xếp theo số lượng
phán quyết

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

Bảng nhân viên. Nhận báo cáo về số lượng nhân viên được thuê theo năm. Sắp xếp theo số lượng
phán quyết

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

Bảng nhân viên. Lấy số phòng ban có nhân viên
phán quyết

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

Bảng nhân viên. Lấy danh sách các Department_id có hơn 30 nhân viên
phán quyết

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

Bảng nhân viên. Nhận danh sách các phòng ban và mức lương trung bình làm tròn của nhân viên trong mỗi phòng ban.
phán quyết

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

Các nước trong bảng. Lấy danh sách Region_id tổng của tất cả các chữ cái của tất cả các tên quốc gia trong đó có hơn 60
phán quyết

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

Bảng nhân viên. Lấy danh sách các Department_ids trong đó nhân viên của một số (>1) job_ids làm việc
phán quyết

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

Bảng nhân viên. Lấy danh sách manager_ids có số cấp dưới lớn hơn 5 và tổng lương của cấp dưới lớn hơn 50000
phán quyết

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

Bảng nhân viên. Nhận danh sách manager_ids có mức lương trung bình của tất cả cấp dưới của anh ta nằm trong khoảng từ 6000 đến 9000 và những người không nhận được tiền thưởng (commission_pct trống)
phán quyết

  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;

Bảng nhân viên. Nhận mức lương tối đa từ tất cả nhân viên job_id kết thúc bằng từ 'CLERK'
phán quyết

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

Bảng nhân viên. Nhận mức lương tối đa trong số tất cả mức lương trung bình của bộ phận
phán quyết

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

Bảng nhân viên. Lấy số lượng nhân viên có cùng số chữ cái trong tên của họ. Đồng thời chỉ hiển thị những người có độ dài tên lớn hơn 5 và số nhân viên có cùng tên lớn hơn 20. Sắp xếp theo độ dài tên
phán quyết

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

Hiển thị dữ liệu từ nhiều bảng bằng cách sử dụng các phép nối

Bảng Nhân viên, Phòng ban, Địa điểm, Quốc gia, Khu vực. Lấy danh sách các khu vực và số lượng nhân viên ở từng khu vực
phán quyết

  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;

Bảng Nhân viên, Phòng ban, Địa điểm, Quốc gia, Khu vực. Nhận thông tin chi tiết về từng nhân viên:
First_name, Last_name, Department, Job, Street, Country, Region
phán quyết

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

Bảng nhân viên. Hiển thị tất cả những người quản lý có hơn 6 nhân viên cấp dưới
phán quyết

  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;

Bảng nhân viên. Hiển thị tất cả nhân viên không báo cáo với bất cứ ai
phán quyết

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;

Bảng Nhân viên, Job_history. Bảng Nhân viên lưu trữ tất cả nhân viên. Bảng Job_history lưu trữ những nhân viên đã rời công ty. Nhận báo cáo về tất cả nhân viên và tình trạng của họ trong công ty (Làm việc hoặc rời công ty kể từ ngày khởi hành)
Ví dụ:
tên_đầu tiên | trạng thái
Jennifer | Rời công ty vào ngày 31 tháng 2006 năm XNUMX
Clara | Hiện đang làm việc
phán quyết

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

Bảng Nhân viên, Phòng ban, Địa điểm, Quốc gia, Khu vực. Lấy danh sách nhân viên sống tại Châu Âu (tên_vùng)
phán quyết

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

Bảng Nhân viên, Phòng ban. Hiển thị tất cả các phòng ban có trên 30 nhân viên
phán quyết

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

Bảng Nhân viên, Phòng ban. Hiển thị tất cả nhân viên không thuộc bộ phận nào
phán quyết

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;

Bảng Nhân viên, Phòng ban. Hiển thị tất cả các phòng ban không có nhân viên
phán quyết

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

Bảng nhân viên. Hiển thị tất cả nhân viên không có ai cấp dưới cho họ
phán quyết

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

Bảng Nhân viên, Công việc, Phòng ban. Hiển thị nhân viên theo định dạng: First_name, Job_title, Department_name.
Ví dụ:
Tên_tên | Job_title | Tên bộ phận
Donald | Vận chuyển | Thư ký vận chuyển
phán quyết

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

Bảng nhân viên. Lấy danh sách nhân viên có người quản lý có việc làm vào năm 2005, nhưng đồng thời bản thân những nhân viên này cũng có việc làm trước năm 2005
phán quyết

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

Bảng nhân viên. Lấy danh sách nhân viên có người quản lý nhận việc vào tháng 15 của năm bất kỳ và độ dài job_title của những nhân viên này lớn hơn XNUMX ký tự
phán quyết

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;

Sử dụng truy vấn con để giải quyết truy vấn

Bảng nhân viên. Lấy danh sách nhân viên có tên dài nhất.
phán quyết

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

Bảng nhân viên. Lấy danh sách nhân viên có mức lương lớn hơn mức lương trung bình của tất cả nhân viên.
phán quyết

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

Bảng Nhân viên, Phòng ban, Địa điểm. Lấy thành phố mà tổng số nhân viên kiếm được ít nhất.
phán quyết

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

Bảng nhân viên. Lấy danh sách nhân viên có người quản lý nhận lương trên 15000.
phán quyết

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

Bảng Nhân viên, Phòng ban. Hiển thị tất cả các phòng ban không có nhân viên
phán quyết

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

Bảng nhân viên. Hiển thị tất cả nhân viên không phải là người quản lý
phán quyết

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

Bảng nhân viên. Hiển thị tất cả những người quản lý có hơn 6 nhân viên cấp dưới
phán quyết

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

Bảng Nhân viên, Phòng ban. Hiển thị những nhân viên làm việc trong bộ phận CNTT
phán quyết

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

Bảng Nhân viên, Công việc, Phòng ban. Hiển thị nhân viên theo định dạng: First_name, Job_title, Department_name.
Ví dụ:
Tên_tên | Job_title | Tên bộ phận
Donald | Vận chuyển | Thư ký vận chuyển
phán quyết

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;

Bảng nhân viên. Lấy danh sách nhân viên có người quản lý có việc làm vào năm 2005, nhưng đồng thời bản thân những nhân viên này cũng có việc làm trước năm 2005
phán quyết

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

Bảng nhân viên. Lấy danh sách nhân viên có người quản lý nhận việc vào tháng 15 của năm bất kỳ và độ dài job_title của những nhân viên này lớn hơn XNUMX ký tự
phán quyết

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;

Đó là tất cả cho bây giờ.

Tôi hy vọng các nhiệm vụ thú vị và hấp dẫn.
Tôi sẽ thêm vào danh sách nhiệm vụ này nhiều nhất có thể.
Tôi cũng sẽ rất vui khi nhận được bất kỳ ý kiến ​​​​và đề xuất nào.

Tái bút: Nếu ai đó nghĩ ra một nhiệm vụ CHỌN thú vị, hãy viết bình luận và tôi sẽ thêm nó vào danh sách.

Cảm ơn bạn.

Nguồn: www.habr.com

Thêm một lời nhận xét