SQL. Хөгжилтэй таавар

Сайн уу, Хабр!

Би 3 жил гаруйн хугацаанд янз бүрийн сургалтын төвүүдэд SQL-ийн хичээл зааж байгаа бөгөөд миний ажигласан нэг зүйл бол оюутнууд SQL-ийг зөвхөн боломж, онолын үндэслэлийн талаар ярихаас гадна тэдэнд даалгавар өгвөл илүү сайн эзэмшиж, ойлгодог.

Энэ нийтлэлд би оюутнуудад гэрийн даалгавар болгон өгч, SQL-ийн талаар гүнзгий бөгөөд тодорхой ойлголттой болоход хүргэдэг янз бүрийн төрлийн тархины шуурга хийдэг асуудлынхаа жагсаалтыг та бүхэнтэй хуваалцах болно.

SQL. Хөгжилтэй таавар

SQL (ˈɛsˈkjuˈɛl; Англи хэлний бүтэцтэй асуулгын хэл) нь өгөгдлийн сангийн зохих удирдлагын системээр удирддаг харилцааны өгөгдлийн сан дахь өгөгдлийг үүсгэх, өөрчлөх, удирдахад ашигладаг тунхаглалын програмчлалын хэл юм. Нэмэлт мэдээлэл

Та SQL-ийн талаар янз бүрийн зүйлээс уншиж болно эх сурвалжууд.
Энэ нийтлэл нь танд SQL-г эхнээс нь заах зорилготой биш юм.

Тэгэхээр явцгаая.

Бид сайн мэддэгийг ашиглах болно Хүний нөөцийн диаграм Oracle-д хүснэгтүүдтэйгээ (Дэлгэрэнгүй):

SQL. Хөгжилтэй таавар
Бид зөвхөн SELECT даалгавруудыг авч үзэх болно гэдгийг би анхаарна уу. Энд DML эсвэл DDL даалгавар байхгүй.

үүрэг

Өгөгдлийг хязгаарлах, эрэмбэлэх

Ажилчдын хүснэгт. Бүх ажилчдын талаарх мэдээлэл бүхий жагсаалтыг аваарай
шийдвэр

SELECT * FROM employees

Ажилчдын хүснэгт. "Дэвид" нэртэй бүх ажилчдын жагсаалтыг аваарай
шийдвэр

SELECT *
  FROM employees
 WHERE first_name = 'David';

Ажилчдын хүснэгт. 'IT_PROG'-тэй тэнцүү job_id бүхий бүх ажилчдын жагсаалтыг авах
шийдвэр

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Ажилчдын хүснэгт. 50-аас дээш цалинтай (цалин) 4000-р хэлтсээс (хэлтсийн_id) бүх ажилчдын жагсаалтыг авна уу.
шийдвэр

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

Ажилчдын хүснэгт. 20, 30-р хэлтсийн бүх ажилчдын жагсаалтыг авах (тэнхимийн_id)
шийдвэр

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

Ажилчдын хүснэгт. Нэрнийх нь сүүлчийн үсэг нь "a" гэсэн бүх ажилчдын жагсаалтыг аваарай.
шийдвэр

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

Ажилчдын хүснэгт. 50, 80-р хэлтсийн (тэнхимийн_id) урамшуулалтай бүх ажилтны жагсаалтыг авах (commission_pct баганын утга хоосон биш)
шийдвэр

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

Ажилчдын хүснэгт. Нэрс нь дор хаяж 2 "n" үсэг агуулсан бүх ажилчдын жагсаалтыг аваарай.
шийдвэр

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

Ажилчдын хүснэгт. Нэр нь 4-өөс дээш үсэгтэй бүх ажилчдын жагсаалтыг аваарай
шийдвэр

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

Ажилчдын хүснэгт. Цалин нь 8000-аас 9000 (хамааруулсан) хооронд байгаа бүх ажилчдын жагсаалтыг аваарай.
шийдвэр

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Ажилчдын хүснэгт. Нэр нь '%' тэмдэг агуулсан бүх ажилчдын жагсаалтыг авах
шийдвэр

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

Ажилчдын хүснэгт. Бүх менежерийн ID-н жагсаалтыг аваарай
шийдвэр

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Ажилчдын хүснэгт. Ажилчдын жагсаалтыг албан тушаалын хамт дараах форматаар авна уу: Donald(sh_clerk)
шийдвэр

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

Гаралтыг тохируулахын тулд нэг эгнээний функцуудыг ашиглах

Ажилчдын хүснэгт. Нэр нь 10-өөс дээш үсэгтэй бүх ажилчдын жагсаалтыг аваарай
шийдвэр

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

Ажилчдын хүснэгт. Нэрэндээ 'b' үсэгтэй бүх ажилчдын жагсаалтыг аваарай (үсгийн том үсгийг харгалзахгүй)
шийдвэр

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

Ажилчдын хүснэгт. Нэрс нь дор хаяж 2 "a" үсэг агуулсан бүх ажилчдын жагсаалтыг аваарай.
шийдвэр

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

Ажилчдын хүснэгт. Цалин нь 1000-ын үржвэртэй бүх ажилчдын жагсаалтыг аваарай
шийдвэр

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

Ажилчдын хүснэгт. Хэрэв ажилтны дугаар XXX.XXX.XXXX форматтай байвал түүний утасны дугаарын эхний 3 оронтой дугаарыг авна уу.
шийдвэр

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

Хэлтсийн хүснэгт. Нэрэнд нэгээс олон үг орсон хүмүүст тэнхимийн нэрнээс эхний үгийг аваарай
шийдвэр

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

Ажилчдын хүснэгт. Нэрийн эхний болон сүүлчийн үсэггүй ажилчдын нэрийг аваарай
шийдвэр

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

Ажилчдын хүснэгт. Нэрийн сүүлчийн үсэг нь 'm', нэр нь 5-аас урт байгаа бүх ажилчдын жагсаалтыг аваарай
шийдвэр

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

Хоёр хүснэгт. Ирэх баасан гарагийн товыг аваарай
шийдвэр

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

Ажилчдын хүснэгт. Компанид 17-оос дээш жил ажилласан бүх ажилчдын жагсаалтыг гарга
шийдвэр

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

Ажилчдын хүснэгт. Утасны дугаарынхаа сүүлийн орон сондгой, цэгээр тусгаарлагдсан 3 тооноос бүрдсэн бүх ажилчдын жагсаалтыг аваарай.
шийдвэр

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

Ажилчдын хүснэгт. '_' тэмдгийн дараах job_id утга нь дор хаяж 3 тэмдэгттэй боловч '_' тэмдэгтээс хойшхи энэ утга нь 'БИЧИГЧ'-тэй тэнцүү биш бүх ажилчдын жагсаалтыг авна уу.
шийдвэр

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

Ажилчдын хүснэгт. PHONE_NUMBER утгын бүх '.'-г орлуулснаар бүх ажилчдын жагсаалтыг авна уу '-' дээр
шийдвэр

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

Хувиргах функц ба нөхцөлт илэрхийллийг ашиглах

Ажилчдын хүснэгт. Сарын эхний өдөр ажилдаа ирсэн бүх ажилчдын жагсаалтыг авах (ямар ч)
шийдвэр

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

Ажилчдын хүснэгт. 2008 онд ажилдаа ирсэн бүх ажилчдын жагсаалтыг гарга
шийдвэр

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

Хүснэгт DUAL. Маргаашийн огноог дараах форматаар харуулах: Маргааш бол XNUMX-р сарын хоёр дахь өдөр
шийдвэр

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

Ажилчдын хүснэгт. Бүх ажилчдын жагсаалт, ажилтан бүр ажилдаа ирсэн огноог дараах форматаар авна уу: 21 оны 2007-р сарын XNUMX.
шийдвэр

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

Ажилчдын хүснэгт. Цалингаа 20 хувиар нэмсэн ажилчдын жагсаалтыг аваарай. Долларын тэмдэгтэй цалинг харуул
шийдвэр

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

Ажилчдын хүснэгт. 2007 оны XNUMX-р сард ажилд орсон бүх ажилчдын жагсаалтыг аваарай.
шийдвэр

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

DUAL хүснэгт. Одоогийн огноо, + секунд, + минут, + цаг, + өдөр, + сар, + жилийг гаргана уу
шийдвэр

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;

Ажилчдын хүснэгт. Бүрэн цалинтай бүх ажилчдын жагсаалтыг (цалин + комисс_pct(%): $24,000.00 форматаар авна уу.
шийдвэр

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

Ажилчдын хүснэгт. Бүх ажилчдын жагсаалт, цалингийн урамшууллын талаарх мэдээллийг авах (Тийм/Үгүй)
шийдвэр

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

Ажилчдын хүснэгт. Ажилтан бүрийн цалингийн түвшинг авах: 5000-аас доош бол доод түвшин, 5000-аас их эсвэл тэнцүү, 10000-аас доош бол хэвийн түвшин, 10000-аас дээш эсвэл тэнцүү бол өндөр түвшин гэж үзнэ.
шийдвэр

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;

Хүснэгтийн орнууд. Улс тус бүрийн хувьд оршин суугаа бүс нутгаа харуулна уу: 1-Европ, 2-Америк, 3-Ази, 4-Африк (нэгдэхгүй)
шийдвэр

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;

Бүлгийн функцуудыг ашиглан нэгтгэсэн өгөгдлийг мэдээлэх

Ажилчдын хүснэгт. Цалингийн доод ба дээд хэмжээ, ажилдаа эрт оройтож ирсэн хугацаа, ажилчдын тоо зэргийг хэлтэс_id-ээр хүлээн авна. Ажилчдын тоогоор эрэмбэлэх (буурах)
шийдвэр

  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;

Ажилчдын хүснэгт. Нэр нь ижил үсгээр эхэлсэн хэдэн ажилтан байдаг вэ? Тоо хэмжээгээр ангилах. Тоо хэмжээ нь 1-ээс их байгаа тохиолдолд л харуул
шийдвэр

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;

Ажилчдын хүснэгт. Нэг хэлтэст хэдэн ажилтан ажиллаж, ижил цалин авч байна вэ?
шийдвэр

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

Ажилчдын хүснэгт. Долоо хоногийн өдөр бүр хэдэн ажилтан авсан тухай тайланг аваарай. Тоо хэмжээгээр ангилах
шийдвэр

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

Ажилчдын хүснэгт. Жилээр хэдэн ажилчин авсан тухай тайлан аваарай. Тоо хэмжээгээр ангилах
шийдвэр

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

Ажилчдын хүснэгт. Ажилчидтай хэлтсийн тоог аваарай
шийдвэр

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

Ажилчдын хүснэгт. 30-аас дээш ажилтантай хэлтэс_ids жагсаалтыг аваарай
шийдвэр

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

Ажилчдын хүснэгт. хэлтсийн_ids жагсаалт болон хэлтэс тус бүрийн ажилчдын дугуйрсан дундаж цалин авах.
шийдвэр

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

Хүснэгтийн орнууд. Жагсаалтын бүс_id-г 60-аас дээш тооны улсын_нэрийн бүх үсгийн нийлбэрийг авна уу.
шийдвэр

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

Ажилчдын хүснэгт. Хэд хэдэн (>1) job_id-ийн ажилтнууд ажилладаг хэлтэс_ids-н жагсаалтыг аваарай
шийдвэр

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

Ажилчдын хүснэгт. Дэд албан тушаалтнуудын тоо 5-аас дээш, түүний доод албан тушаалтны бүх цалингийн нийлбэр нь 50000-аас дээш менежер_ids-ийн жагсаалтыг аваарай.
шийдвэр

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

Ажилчдын хүснэгт. Бүх доод албан тушаалтнуудынхаа дундаж цалин 6000-аас 9000 хүртэл байдаг, урамшуулал авдаггүй менежерүүдийн жагсаалтыг аваарай (комисс_хувь хоосон)
шийдвэр

  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;

Ажилчдын хүснэгт. "БИЧИГ" гэсэн үгээр төгссөн job_id бүх ажилчдын цалингийн дээд хэмжээг аваарай
шийдвэр

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

Ажилчдын хүснэгт. Хэлтсийн бүх дундаж цалингаас хамгийн дээд цалинг аваарай
шийдвэр

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

Ажилчдын хүснэгт. Тэдний нэр дээр ижил тооны үсэгтэй ажилчдын тоог аваарай. Үүний зэрэгцээ зөвхөн нэр нь 5-аас дээш, ижил нэртэй ажилчдын тоо 20-иос дээш бол зөвхөн нэрээр нь эрэмбэлэх.
шийдвэр

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

Холболт ашиглан олон хүснэгтээс өгөгдлийг харуулах

Хүснэгтийн ажилтнууд, хэлтэс, байршил, улс орон, бүс нутаг. Бүс нутгийн жагсаалт, бүс тус бүрийн ажилчдын тоог аваарай
шийдвэр

  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;

Хүснэгтийн ажилтнууд, хэлтэс, байршил, улс орон, бүс нутаг. Ажилтан бүрийн талаар дэлгэрэнгүй мэдээлэл авах:
Нэр, овог, хэлтэс, ажил, гудамж, улс, бүс
шийдвэр

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

Ажилчдын хүснэгт. Өөртөө харьяалагддаг 6-аас дээш ажилтантай бүх менежерүүдийг харуул
шийдвэр

  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;

Ажилчдын хүснэгт. Хэнд ч тайлагнадаггүй бүх ажилчдыг харуул
шийдвэр

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;

Хүснэгтийн ажилтнууд, Ажлын_түүх. Ажилчдын хүснэгт нь бүх ажилчдыг хадгалдаг. Ажлын_түүх хүснэгтэд компаниас гарсан ажилчдыг хадгалдаг. Бүх ажилчид болон тэдний компанид байгаа байдлын талаархи тайланг авах (ажлын өдөр эсвэл компанийг орхисон)
Жишээ нь:
нэр_нэр | байдал
Женнифер | 31 оны 2006-р сарын XNUMX-нд компаниас гарсан
Клара | Одоогоор ажиллаж байна
шийдвэр

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

Хүснэгтийн ажилтнууд, хэлтэс, байршил, улс орон, бүс нутаг. Европт амьдардаг ажилчдын жагсаалтыг авах (бүс нутгийн нэр)
шийдвэр

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

Хүснэгтийн ажилтнууд, хэлтэс. 30-аас дээш ажилтантай бүх хэлтсүүдийг харуул
шийдвэр

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

Хүснэгтийн ажилтнууд, хэлтэс. Аль ч хэлтэст байдаггүй бүх ажилчдыг харуул
шийдвэр

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;

Хүснэгтийн ажилтнууд, хэлтэс. Ажилтангүй бүх хэлтсүүдийг харуул
шийдвэр

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

Ажилчдын хүснэгт. Өөрт захирагдах хүнгүй бүх ажилчдыг харуул
шийдвэр

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

Ширээний ажилчид, ажлын байр, хэлтэс. Ажилчдыг нэр, албан тушаал, хэлтсийн нэр форматаар харуул.
Жишээ нь:
нэр_нэр | Ажлын_нэр | Хэлтсийн нэр
Дональд | Хүргэлт | Бичигч тээвэрлэлт
шийдвэр

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

Ажилчдын хүснэгт. Менежерүүд нь 2005 онд ажилд орсон, гэхдээ 2005 оноос өмнө эдгээр ажилтнууд өөрсдөө ажилд орсон ажилчдын жагсаалтыг аваарай.
шийдвэр

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

Ажилчдын хүснэгт. Менежерүүд нь аль нэг жилийн 15-р сард ажилд орсон, эдгээр ажилчдын ажлын_нэрийн урт нь XNUMX тэмдэгтээс дээш байгаа ажилчдын жагсаалтыг аваарай.
шийдвэр

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;

Асуултуудыг шийдвэрлэхийн тулд дэд асуулга ашиглах

Ажилчдын хүснэгт. Хамгийн урт нэртэй ажилчдын жагсаалтыг аваарай.
шийдвэр

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

Ажилчдын хүснэгт. Бүх ажилчдын дундаж цалингаас дээш цалинтай ажилчдын жагсаалтыг аваарай.
шийдвэр

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

Ажилтнууд, хэлтэс, байршлын хүснэгт. Ажилчид нь хамгийн бага цалинтай хотыг олоорой.
шийдвэр

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

Ажилчдын хүснэгт. Менежер нь 15000-аас дээш цалин авдаг ажилчдын жагсаалтыг аваарай.
шийдвэр

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

Хүснэгтийн ажилтнууд, хэлтэс. Ажилтангүй бүх хэлтсүүдийг харуул
шийдвэр

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

Ажилчдын хүснэгт. Менежер биш бүх ажилчдыг харуул
шийдвэр

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

Ажилчдын хүснэгт. Өөртөө харьяалагддаг 6-аас дээш ажилтантай бүх менежерүүдийг харуул
шийдвэр

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

Хүснэгтийн ажилтнууд, хэлтэс. Мэдээллийн технологийн хэлтэст ажилладаг ажилчдыг харуул
шийдвэр

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

Ширээний ажилчид, ажлын байр, хэлтэс. Ажилчдыг нэр, албан тушаал, хэлтсийн нэр форматаар харуул.
Жишээ нь:
нэр_нэр | Ажлын_нэр | Хэлтсийн нэр
Дональд | Хүргэлт | Бичигч тээвэрлэлт
шийдвэр

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;

Ажилчдын хүснэгт. Менежерүүд нь 2005 онд ажилд орсон, гэхдээ 2005 оноос өмнө эдгээр ажилтнууд өөрсдөө ажилд орсон ажилчдын жагсаалтыг аваарай.
шийдвэр

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

Ажилчдын хүснэгт. Менежерүүд нь аль нэг жилийн 15-р сард ажилд орсон, эдгээр ажилчдын ажлын_нэрийн урт нь XNUMX тэмдэгтээс дээш байгаа ажилчдын жагсаалтыг аваарай.
шийдвэр

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;

Одоохондоо ийм л байна.

Даалгаврууд сонирхолтой, сэтгэл хөдөлгөм байсан гэж найдаж байна.
Би энэ даалгаврын жагсаалтад аль болох ихийг нэмэх болно.
Мөн санал хүсэлт, санал хүсэлтийг хүлээн авахдаа баяртай байх болно.

Жич: Хэрэв хэн нэгэн сонирхолтой СОНГОХ даалгавар гарвал коммент хэсэгт бичээрэй, би үүнийг жагсаалтад нэмэх болно.

Баярлалаа.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх