Здравей, Хабр!
Вече повече от 3 години преподавам SQL в различни тренировъчни центрове, и едно от наблюденията ми е, че студентите овладяват и разбират SQL по-добре, когато им се постави задача, а не просто им се разказва за възможностите и теоретичните основи.
В тази статия ще споделя с вас своя списък с задачи, които давам на студентите като домашна работа и по които провеждаме различни мозъчни атаки, което води до дълбоко и ясно разбиране на SQL.

SQL (ˈɛsˈkjuˈɛl; англ. structured query language — «език за структурирани заявки») — декларативен език за програмиране, използван за създаване, модифициране и управление на данни в релационна база данни, управлявана от съответната система за управление на бази данни.
Можете да прочетете за SQL от различни .
Тази статия не цели да ви обучи на SQL от нулата.
Така че, да започваме.
Ще използваме известната в Oracle с нейните таблици ():

Забелязвам, че ще разгледаме само задачи на SELECT. Няма да има задачи на DML и DDL.
Задачи
Ограничаване и подреждане на данни
Таблица Employees. Получете списък с информация за всички служители.
Решение
SELECT * FROM employees
Таблица Employees. Получете списък на всички служители с име ‘David’
Решение
SELECT *
FROM employees
WHERE first_name = 'David';
Таблица Employees. Получете списък на всички служители с job_id равен на ‘IT_PROG’
Решение
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Таблица Employees. Получете списък на всички служители от 50-ти отдел (department_id) с заплата(salary) над 4000
Решение
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Таблица Employees. Получете списък на всички служители от 20-ти и 30-ти отдел (department_id)
Решение
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Таблица Employees. Получете списък на всички служители, чието име завършва на ‘a’
Решение
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Таблица Employees. Получете списък на всички служители от 50-ти и 80-ти отдел (department_id), които имат бонус (стойност в колоната commission_pct не е празна)
Решение
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Таблица Employees. Получете списък на всички служители, които имат минимум 2 букви ‘n’ в името си
Решение
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Таблица Employees. Получете списък на всички служители, чието име е по-дълго от 4 букви
Решение
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Таблица Employees. Получете списък на всички служители, чиято заплата е в диапазона от 8000 до 9000 (включително)
Решение
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Таблица Employees. Получете списък на всички служители, в чието име съдържа символ ‘%’
Решение
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Таблица Employees. Получете списък на всички ID на мениджъри
Решение
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Таблица Employees. Получете списък на служителите с техните позиции в формат: Donald(sh_clerk)
Решение
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Използване на функции за един ред, за да персонализирате изхода
Таблица Employees. Получете списък на всички служители, чиято дължина на името е повече от 10 букви
Решение
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Таблица Employees. Получете списък на всички служители, в чието име има буква ‘b’ (без да се отчита регистърът)
Решение
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Таблица Employees. Получете списък на всички служители, в чиито имена се съдържат най-малко 2 букви ‘a’
Решение
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Таблица Employees. Получете списък на всички служители, чиято заплата е кратна на 1000
Решение
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Таблица Employees. Получете първите 3 цифрови числа от телефонния номер на служителя, ако номерът му е във формат ХХХ.ХХХ.ХХХХ
Решение
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Таблица Departments. Получете първата дума от името на департамента за тези, чийто наименование има повече от една дума
Решение
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Таблица Employees. Получете имената на служителите без първата и последната буква в името
Решение
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Таблица Employees. Получете списък на всички служители, при които последната буква в името е ‘m’ и дължината на името е по-голяма от 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;
Таблица Employees. Получете списък на всички служители, които работят в компанията повече от 17 години
Решение
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Таблица Employees. Получете списък на всички служители, при които последната цифра на телефонния номер е нечетна и се състои от 3 цифри, разделени с точка
Решение
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Таблица Employees. Получете списък на всички служители, при които стойността на job_id след знака '_' съдържа минимум 3 символа, но тази стойност след '_' не е 'CLERK'
Решение
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Таблица Employees. Получете списък на всички служители, заменяйки в стойността PHONE_NUMBER всички '.' на '-'
Решение
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Използване на функции за конверсия и условни изрази
Таблица Employees. Получете списък на всички служители, които са започнали работа в първия ден на месеца (някой месец)
Решение
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Таблица Employees. Получете списък на всички служители, които започнали работа през 2008 година
Решение
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
Таблица DUAL. Показване на утрешната дата във формата: Утре е втори ден на януари
Решение
SELECT TO_CHAR (SYSDATE, 'fm""Утре е ""Ddspth ""ден на"" Month') info
FROM DUAL;
Таблица Employees. Получете списък на всички служители и датата на постъпването им на работа във формата: 21-ви юни, 2007
Решение
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""на"" Month, YYYY') hire_date
FROM employees;
Таблица Employees. Получете списък на служители с увеличени заплати с 20%. Заплатата да бъде показана със знак долар
Решение
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Таблица 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;
Таблица Employees. Получете списък на всички служители с общи заплати (salary + commission_pct(%)) във формата: $24,000.00
Решение
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Таблица Employees. Получете списък на всички служители и информация относно наличието на бонуси към заплатата (Да/Не)
Решение
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Да', 'Не') has_bonus
FROM employees;
Таблица Employees. Получете нивото на заплатата на всеки служител: под 5000 се счита за ниско ниво, между 5000 и 10000 се счита за нормално ниво, равно или над 10000 се счита за високо ниво
Решение
ИЗБЕРЕТЕ first_name,
salary,
СЛУЧАЙ
КОГАТО salary = 5000 И salary < 10000 ТОГАВА 'Нормална'
ИНАЧЕ 'Висока'
КРАЙ salary_level
ОТ employees;
Таблица Countries. За всяка страна да покажете региона, в който се намира: 1-Европа, 2-Америка, 3-Азия, 4-Африка (без Join)
Решение
ИЗБЕРЕТЕ country_name country,
DECODE (region_id,
1, 'Европа',
2, 'Америка',
3, 'Азия',
4, 'Африка',
'Непознат')
region
ОТ countries;
ИЗБЕРЕТЕ country_name
country,
СЛУЧАЙ region_id
КОГАТО 1 ТОГАВА 'Европа'
КОГАТО 2 ТОГАВА 'Америка'
КОГАТО 3 ТОГАВА 'Азия'
КОГАТО 4 ТОГАВА 'Африка'
ИНАЧЕ 'Непознат'
КРАЙ
region
ОТ countries;
Отчет за агрегирани данни, използвайки групови функции
Таблица Employees. Получете отчет по department_id с минимална и максимална заплата, с ранна и късна дата на постъпване и с количество служители. Сортирайте по количеството служители (по намаляване)
Решение
ИЗБЕРЕТЕ department_id,
MIN (salary) min_salary,
MAX (salary) max_salary,
MIN (hire_date) min_hire_date,
MAX (hire_date) max_hire_Date,
COUNT (*) count
ОТ employees
GROUP BY department_id
ORDER BY COUNT(*) DESC;
Таблица Employees. Колко служители с имена, започващи с една и съща буква? Сортирайте по количество. Показвайте само тези, където количеството е над 1
Решение
ИЗБЕРЕТЕ SUBSTR (first_name, 1, 1) first_char, COUNT (*)
ОТ employees
GROUP BY SUBSTR (first_name, 1, 1)
HAVING COUNT (*) > 1
ORDER BY 2 DESC;
Таблица Employees. Колко служители работят в един и същ отдел и получават еднаква заплата?
Решение
ИЗБЕРЕТЕ department_id, salary, COUNT (*)
ОТ employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Таблица Employees. Получете отчет колко служители са приети на работа всеки ден от седмицата. Сортирайте по количество
Решение
ИЗБЕРЕТЕ TO_CHAR (hire_Date, 'Day') day, COUNT (*)
ОТ employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Таблица Employees. Получете отчет колко служители са приети на работа по години. Сортирайте по количество
Решение
ИЗБЕРЕТЕ TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
ОТ employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Таблица Employees. Получете броя на департаментите, в които има служители
Решение
ИЗБЕРЕТЕ COUNT (COUNT (*)) department_count
ОТ employees
КЪДЕ department_id IS NOT NULL
GROUP BY department_id;
Таблица Employees. Получете списък с department_id, в които работят повече от 30 служители
Решение
ИЗБЕРЕТЕ department_id
ОТ employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Таблица Employees. Получете списък с department_id и закръглена средна заплата на работниците във всеки департамент.
Решение
ИЗБЕРЕТЕ department_id, ROUND (AVG (salary)) avg_salary
ОТ employees
GROUP BY department_id;
Таблица Countries. Получете списък с region_id и сумата на всички букви на country_name, в които има повече от 60
Решение
ИЗБЕРИ region_id
ОТ countries
ГРУПИРАЙ ПО region_id
ИМАЙКИ SUM (LENGTH (country_name)) > 60;
Таблица Employees. Получете списък с department_id, в който работят служители с повече от един job_id
Решение
ИЗБЕРИ department_id
ОТ employees
ГРУПИРАЙ ПО department_id
ИМАЙКИ COUNT (DISTINCT job_id) > 1;
Таблица Employees. Получете списък с manager_id, при които броят на подчинените е повече от 5 и сумата на всички заплати на подчинените е повече от 50000
Решение
ИЗБЕРИ manager_id
ОТ employees
ГРУПИРАЙ ПО manager_id
ИМАЙКИ COUNT (*) > 5 И SUM (salary) > 50000;
Таблица Employees. Получете списък с manager_id, при които средната заплата на всички подчинени е в интервала от 6000 до 9000 и те не получават бонуси (commission_pct е празно)
Решение
ИЗБЕРИ manager_id, AVG (salary) avg_salary
ОТ employees
КЪДЕ commission_pct IS NULL
ГРУПИРАЙ ПО manager_id
ИМАЙКИ AVG (salary) МЕЖДУ 6000 И 9000;
Таблица Employees. Получете максималната заплата от всички служители с job_id, завършващ на думата 'CLERK'
Решение
ИЗБЕРИ MAX (salary) max_salary
ОТ employees
КЪДЕ job_id LIKE '%CLERK';
ИЗБЕРИ MAX (salary) max_salary
ОТ employees
КЪДЕ SUBSTR (job_id, -5) = 'CLERK';
Таблица Employees. Получете максималната заплата сред всички средни заплати по департамент
Решение
ИЗБЕРИ MAX (AVG (salary))
ОТ employees
ГРУПИРАЙ ПО department_id;
Таблица Employees. Получете броя на служителите с еднакъв брой букви в името. С показване само на тези, чиято дължина на името е по-голяма от 5 и броя на служителите с такова име е повече от 20. Сортирайте по дължина на името
Решение
ИЗБЕРИ LENGTH (first_name), COUNT (*)
ОТ employees
ГРУПИРАЙ ПО LENGTH (first_name)
ИМАЙКИ LENGTH (first_name) > 5 И COUNT (*) > 20
ORDER BY LENGTH (first_name);
ИЗБЕРИ LENGTH (first_name), COUNT (*)
ОТ employees
КЪДЕ LENGTH (first_name) > 5
ГРУПИРАЙ ПО LENGTH (first_name)
ИМАЙКИ COUNT (*) > 20
ORDER BY LENGTH (first_name);
Показване на данни от множество таблици, използвайки JOINs
Таблица Employees, Departaments, Locations, Countries, Regions. Получете списък на регионите и броя служители във всеки регион
Решение
ИЗБЕРИ region_name, COUNT (*)
ОТ 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)
ГРУПИРАЙ ПО region_name;
Таблица Employees, Departaments, Locations, Countries, Regions. Получете подробна информация за всеки служител:
First_name, Last_name, Departament, Job, Street, Country, Region
Решение
ИЗБЕРИ First_name,
Last_name,
Department_name,
Job_id,
street_address,
Country_name,
Region_name
ОТ 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);
Таблица Employees. Показване на всички мениджъри, които имат повече от 6 подчинени
Решение
ИЗБЕРЕТЕ man.first_name, COUNT (*)
ОТ служители emp СВЪРЗАНИ с служители man ON (emp.manager_id = man.employee_id)
ГРУПИРАЙТЕ ПО man.first_name
ИМА COUNT (*) > 6;
Таблица Служители. Покажете всички служители, които не подлежат на никого
Решение
ИЗБЕРЕТЕ emp.first_name
ОТ служители emp
ЛЯВА СВЪРЗАНИЕ с служители man ON (emp.manager_id = man.employee_id)
КЪДЕ man.FIRST_NAME Е NULL;
ИЗБЕРЕТЕ first_name
ОТ служители
КЪДЕ manager_id Е NULL;
Таблица Служители, История на работа. В таблицата Служители се съхраняват всички служители. В таблицата История на работа се записват служителите, които са напуснали компанията. Получете отчет за всички служители и статуса им в компанията (Работи или е напуснал с дата на напускане)
Пример:
first_name | статус
Дженифър | Напусна компанията на 31 декември 2006
Клара | В момента работи
Решение
ИЗБЕРЕТЕ first_name,
NVL2 (
end_date,
TO_CHAR (end_date, 'fm""Напусна компанията на"" DD ""от"" Месец, YYYY'),
'В момента работи')
статус
ОТ служители e ЛЯВА СВЪРЗАНИЕ с история на работа j ON (e.employee_id = j.employee_id);
Таблица Служители, Департаменти, Локации, Държави, Регионите. Получете списък на служителите, които живеят в Европа (region_name)
Решение
ИЗБЕРЕТЕ first_name
ОТ служители
СВЪРЗАНИЕ с департаменти ИЗПОЛЗВАЙКИ (department_id)
СВЪРЗАНИЕ с локации ИЗПОЛЗВАЙКИ (location_id)
СВЪРЗАНИЕ с държави ИЗПОЛЗВАЙКИ (country_id)
СВЪРЗАНИЕ с региони ИЗПОЛЗВАЙКИ (region_id)
КЪДЕ region_name = 'Европа';
ИЗБЕРЕТЕ first_name
ОТ служители e
СВЪРЗАНИЕ с департаменти d ON (e.department_id = d.department_id)
СВЪРЗАНИЕ с локации l ON (d.location_id = l.location_id)
СВЪРЗАНИЕ с държави c ON (l.country_id = c.country_id)
СВЪРЗАНИЕ с региони r ON (c.region_id = r.region_id)
КЪДЕ region_name = 'Европа';
Таблица Служители, Департаменти. Покажете всички департаменти, в които работят повече от 30 служители
Решение
ИЗБЕРЕТЕ department_name, COUNT (*)
ОТ служители e СВЪРЗАНИ с департаменти d ON (e.department_id = d.department_id)
ГРУПИРАЙТЕ ПО department_name
ИМА COUNT (*) > 30;
Таблица Служители, Департаменти. Покажете всички служители, които не са част от никой департамент
Решение
ИЗБЕРЕТЕ first_name
ОТ служители e
ЛЯВА СВЪРЗАНИЕ с департаменти d ON (e.department_id = d.department_id)
КЪДЕ d.department_name Е NULL;
ИЗБЕРЕТЕ first_name
ОТ служители
КЪДЕ department_id Е NULL;
Таблица Служители, Департаменти. Покажете всички департаменти, в които няма нито един служител
Решение
ИЗБЕРЕТЕ department_name
ОТ служители e
ДЯСНО СВЪРЗАНИЕ с департаменти d ON (e.department_id = d.department_id)
КЪДЕ first_name Е NULL;
Таблица Служители. Покажете всички служители, които нямат подчинени
Решение
ИЗБЕРЕТЕ man.first_name
ОТ служители emp
ДЯСНО СВЪРЗАНИЕ с служители man ON (emp.manager_id = man.employee_id)
КЪДЕ emp.FIRST_NAME Е NULL;
Таблица Служители, Работи, Департаменти. Покажете служителите в следния формат: First_name, Job_title, Department_name.
Пример:
First_name | Job_title | Department_name
Доналд | Доставка | Клерк по доставка
Решение
ИЗБЕРЕТЕ first_name, job_title, department_name
ОТ служители e
СВЪРЗАНИЕ с работни места j ON (e.job_id = j.job_id)
СВЪРЗАНИЕ с департаменти d ON (d.department_id = e.department_id);
Таблица Служители. Получете списък на служителите, чиито мениджъри са започнали работа през 2005 година, но самите те са започнали работа преди 2005 година
Решение
ИЗБЕРИ emp.*
ОТ служители emp СЪЕДИНИ служители man ОН (emp.manager_id = man.employee_id)
КЪДЕ TO_CHAR (man.hire_date, 'YYYY') = '2005'
И emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');
Таблица Служители. Получаване на списък на служителите, чиито мениджъри са започнали работа през януари на всяка година и дължината на job_title на тези служители е повече от 15 символа.
Решение
ИЗБЕРИ emp.*
ОТ служители emp
СЪЕДИНИ служители man ОН (emp.manager_id = man.employee_id)
СЪЕДИНИ работни места j ОН (emp.job_id = j.job_id)
КЪДЕ TO_CHAR (man.hire_date, 'MM') = '01' И LENGTH (j.job_title) > 15;
Използване на подзапитвания за решаване на заявки
Таблица Служители. Получаване на списък на служителите с най-дълго име.
Решение
ИЗБЕРИ *
ОТ служители
КЪДЕ LENGTH (first_name) =
(ИЗБЕРИ MAX (LENGTH (first_name)) ОТ служители);
Таблица Служители. Получаване на списък на служителите с заплата по-голяма от средната заплата на всички служители.
Решение
ИЗБЕРИ *
ОТ служители
КЪДЕ salary > (ИЗБЕРИ AVG (salary) ОТ служители);
Таблица Служители, Отдели, Локации. Получаване на града, в който служителите общо получават най-малко.
Решение
ИЗБЕРИ city
ОТ служители e
СЪЕДИНИ отдели d ОН (e.department_id = d.department_id)
СЪЕДИНИ локации l ОН (d.location_id = l.location_id)
GROUP BY city
HAVING SUM (salary) =
( ИЗБЕРИ MIN (SUM (salary))
ОТ служители e
СЪЕДИНИ отдели d ОН (e.department_id = d.department_id)
СЪЕДИНИ локации l ОН (d.location_id = l.location_id)
GROUP BY city);
Таблица Служители. Получаване на списък на служителите, чиито мениджъри получават заплата над 15000.
Решение
ИЗБЕРИ *
ОТ служители
КЪДЕ manager_id В (ИЗБЕРИ employee_id
ОТ служители
КЪДЕ salary > 15000)
Таблица Служители, Департаменти. Покажете всички департаменти, в които няма нито един служител
Решение
ИЗБЕРИ *
ОТ отдели
КЪДЕ department_id НЕ В (ИЗБЕРИ department_id
ОТ служители
КЪДЕ department_id Е НЕ NULL);
Таблица Служители. Показване на всички служители, които не са мениджъри.
Решение
ИЗБЕРИ *
ОТ служители
КЪДЕ employee_id НЕ В (ИЗБЕРИ manager_id
ОТ служители
КЪДЕ manager_id Е НЕ NULL);
Таблица Employees. Показване на всички мениджъри, които имат повече от 6 подчинени
Решение
ИЗБЕРИ *
ОТ служители e
КЪДЕ (ИЗБЕРИ COUNT (*)
ОТ служители
КЪДЕ manager_id = e.employee_id) > 6;
Таблица Служители, Отдели. Показване на служителите, които работят в отдела ИТ.
Решение
ИЗБЕРИ *
ОТ служители
КЪДЕ department_id = (ИЗБЕРИ department_id
ОТ отдели
КЪДЕ department_name = 'ИТ');
Таблица Служители, Работи, Департаменти. Покажете служителите в следния формат: First_name, Job_title, Department_name.
Пример:
First_name | Job_title | Department_name
Доналд | Доставка | Клерк по доставка
Решение
ИЗБЕРИ first_name,
(ИЗБЕРИ job_title
ОТ работни места
КЪДЕ job_id = e.job_id)
job_title,
(ИЗБЕРИ department_name
ОТ отдели
КЪДЕ department_id = e.department_id)
department_name
ОТ служители e;
Таблица Служители. Получете списък на служителите, чиито мениджъри са започнали работа през 2005 година, но самите те са започнали работа преди 2005 година
Решение
ИЗБЕРИ *
ОТ служители
КЪДЕ manager_id В (ИЗБЕРИ employee_id
ОТ служители
КЪДЕ TO_CHAR (hire_date, 'YYYY') = '2005')
И hire_date < TO_DATE ('01012005', 'DDMMYYYY');
Таблица Служители. Получаване на списък на служителите, чиито мениджъри са започнали работа през януари на всяка година и дължината на job_title на тези служители е повече от 15 символа.
Решение
ИЗБЕРИ *
ОТ служители e
КЪДЕ manager_id В (ИЗБЕРИ employee_id
ОТ служители
КЪДЕ TO_CHAR (hire_date, 'MM') = '01')
И (ИЗБЕРИ LENGTH (job_title)
ОТ работни места
КЪДЕ job_id = e.job_id) > 15;
На това засега е всичко.
Надявам се, задачите да бяха интересни и увлекателни.
Ще допълвам този списък с задачи, когато имам възможност.
Също така ще се радвам на всякакви коментари и предложения.
P.S.: Ако на някого му дойде наум интересна задача за SELECT, пишете в коментарите, ще я добавя в списъка.
Благодаря.
Източник: habr.com
