Сайн уу, Хабр!
Би 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-р хэлтсийн бүх ажилчдын жагсаалтыг авах (тэнхимийн_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