SQL. Кызыктуу пазлдар

Салам, Хабр!

3 жылдан ашык убакыттан бери ар кандай окуу борборлорунда SQL тилин үйрөтүп келем, менин байкаганым, студенттер SQLди жакшыраак өздөштүрүшөт жана аларга тапшырма берилсе, мүмкүнчүлүктөрүн жана теориялык негиздерин айтып эле койбой, жакшыраак түшүнүшөт.

Бул макалада мен студенттерге үй тапшырмасы катары бере турган жана SQLди терең жана так түшүнүүгө алып келген ар кандай мээ чабуулдарын жүргүзгөн көйгөйлөрдүн тизмеси менен бөлүшөм.

SQL. Кызыктуу пазлдар

SQL (ˈɛsˈkjuˈɛl; англисче структуралык суроо тили) – тиешелүү маалымат базасын башкаруу системасы тарабынан башкарылуучу реляциялык маалымат базасында маалыматтарды түзүү, өзгөртүү жана башкаруу үчүн колдонулган декларативдик программалоо тили. Кененирээк маалымат ...

Сиз ар кандай SQL жөнүндө окуй аласыз булактар.
Бул макала сизге SQLди нөлдөн баштап үйрөтүү үчүн арналган эмес.

Ошентип, кеттик.

Биз белгилүү болгондорду колдонобуз HR диаграммасы таблицалары менен Oracle (More):

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-бөлүмдөрдүн бардык кызматкерлеринин тизмесин алыңыз (department_id)
чечим

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

Кызматкерлердин столу. Атындагы акыркы тамгасы "a" болгон бардык кызматкерлердин тизмесин алыңыз
чечим

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

Кызматкерлердин столу. 50 жана 80-бөлүмдөрдүн (department_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 '';

Кызматкерлердин столу. Бардык менеджер идентификаторлорунун тизмесин алыңыз
чечим

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;

Кызматкерлердин столу. Кызматкердин телефон номеринин биринчи 3 орундуу номерин алыңыз, эгерде анын номери XXX.XXX.XXXX форматында болсо
чечим

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;

Кызматкерлердин столу. Атындагы акыркы тамгасы "м" жана аты 5тен узун болгон бардык кызматкерлердин тизмесин алыңыз
чечим

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

Таблица Dual. Кийинки жума күнүн алыңыз
чечим

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. Эртеңки күндү форматта көрсөтүңүз: Эртең январдын экинчи күнү
чечим

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

Кызматкерлердин столу. Бардык кызматкерлердин тизмесин жана ар бир кызматкер жумушка келген күнүн форматта алыңыз: 21-июнь, 2007-ж.
чечим

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-жылдын февраль айында иштей баштаган бардык кызматкерлердин тизмесин алыңыз.
чечим

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;

Кызматкерлердин столу. Толук маянасы бар бардык кызматкерлердин тизмесин алыңыз (айлык + komissiya_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;

Топтун функцияларын колдонуу менен топтолгон маалыматтарды отчеттуулук

Кызматкерлердин столу. Minimum жана максималдуу эмгек акы, жумушка эрте жана кеч келген даталар жана кызматкерлердин саны менен департамент_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дан ашык кызматкери бар бөлүмдүн идентификаторлорунун тизмесин алыңыз
чечим

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

Кызматкерлердин столу. Department_ids тизмесин жана ар бир бөлүмдөгү кызматкерлердин тегеректелген орточо эмгек акысын алыңыз.
чечим

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

Таблица өлкөлөрү. 60тан ашык бардык өлкөнүн_аттарынын бардык тамгаларынын суммасынын регион_id тизмесин алыңыз
чечим

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

Кызматкерлердин столу. Бир нече (>1) жумуш_идентификаторлорунун кызматкерлери иштеген бөлүм_иддеринин тизмесин алыңыз
чечим

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

Кызматкерлердин столу. Кол алдындагылардын саны 5тен ашкан жана анын кол алдындагылардын бардык эмгек акыларынын суммасы 50000 XNUMXден ашкан менеджер_идентификаторлорунун тизмесин алыңыз
чечим

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

Кызматкерлердин столу. Бардык кол алдындагылардын орточо айлыгы 6000ден 9000ге чейинки диапазондо болгон жана бонустарды албаган менеджер_идентификаторлорунун тизмесин алыңыз (commission_pct бош)
чечим

  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;

Стол кызматкерлери, Job_history. Кызматкерлер үстөлүндө бардык кызматкерлер сакталат. Job_history таблицасында компаниядан кеткен кызматкерлер сакталат. Бардык кызматкерлер жана алардын компаниядагы абалы жөнүндө отчет алыңыз (иштейт же кеткен күнү менен компаниядан кеткен)
мисалы:
first_name | статусу
Jennifer | 31-жылдын 2006-декабрында компаниядан кеткен
Клара | Учурда иштеп жатат
чечим

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;

Стол кызматкерлери, жумуш орундары, бөлүмдөр. Кызматкерлерди форматта көрсөтүңүз: Аты-жөнү, Жумуштун_аты, Бөлүмдүн_аты.
мисалы:
First_name | Job_name | Бөлүмдүн аты
Дональд | Жеткирүү | Катчы жеткирүү
чечим

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 белгиден ашкан
чечим

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 XNUMXден жогору айлык алган кызматкерлердин тизмесин алыңыз.
чечим

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;

Столдун кызматкерлери, белумдеру. IT бөлүмүндө иштеген кызматкерлерди көрсөтүңүз
чечим

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

Стол кызматкерлери, жумуш орундары, бөлүмдөр. Кызматкерлерди форматта көрсөтүңүз: Аты-жөнү, Жумуштун_аты, Бөлүмдүн_аты.
мисалы:
First_name | Job_name | Бөлүмдүн аты
Дональд | Жеткирүү | Катчы жеткирүү
чечим

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 белгиден ашкан
чечим

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;

Азырынча баары ушул.

Тапшырмалар кызыктуу жана кызыктуу болду деп ишенем.
Мен мүмкүн болушунча бул милдеттердин тизмесин толуктайм.
Ошондой эле ар кандай сын-пикирлерди жана сунуштарды алууга кубанычта болом.

PS: Эгер кимдир бирөө кызыктуу ТАНДОО тапшырмасы менен келсе, комментарийге жазыңыз, мен аны тизмеге кошом.

рахмат.

Source: www.habr.com

Комментарий кошуу