Салам, Хабр!
3 жылдан ашык убакыттан бери ар кандай окуу борборлорунда SQL тилин үйрөтүп келем, менин байкаганым, студенттер SQLди жакшыраак өздөштүрүшөт жана аларга тапшырма берилсе, мүмкүнчүлүктөрүн жана теориялык негиздерин айтып эле койбой, жакшыраак түшүнүшөт.
Бул макалада мен студенттерге үй тапшырмасы катары бере турган жана SQLди терең жана так түшүнүүгө алып келген ар кандай мээ чабуулдарын жүргүзгөн көйгөйлөрдүн тизмеси менен бөлүшөм.
SQL (ˈɛsˈkjuˈɛl; англисче структуралык суроо тили) – тиешелүү маалымат базасын башкаруу системасы тарабынан башкарылуучу реляциялык маалымат базасында маалыматтарды түзүү, өзгөртүү жана башкаруу үчүн колдонулган декларативдик программалоо тили.
Сиз ар кандай SQL жөнүндө окуй аласыз
Бул макала сизге 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