SQL. Nakakaaliw na mga palaisipan

Hello, Habr!

Mahigit 3 taon na akong nagtuturo ng SQL sa iba't ibang sentro ng pagsasanay, at isa sa aking mga obserbasyon ay ang mga mag-aaral ay nakakabisa at mas nauunawaan ang SQL kung sila ay bibigyan ng isang gawain, at hindi lamang sinabi tungkol sa mga posibilidad at teoretikal na pundasyon.

Sa artikulong ito, ibabahagi ko sa iyo ang aking listahan ng mga problema na ibinibigay ko sa mga mag-aaral bilang takdang-aralin at kung saan nagsasagawa kami ng iba't ibang uri ng brainstorms, na humahantong sa isang malalim at malinaw na pag-unawa sa SQL.

SQL. Nakakaaliw na mga palaisipan

Ang SQL (ΛˆΙ›sˈkjuΛˆΙ›l; English structured query language) ay isang declarative programming language na ginagamit upang lumikha, baguhin at pamahalaan ang data sa isang relational database na pinamamahalaan ng isang naaangkop na database management system. Higit pang mga detalye ...

Maaari mong basahin ang tungkol sa SQL mula sa iba't ibang mga mapagkukunan.
Ang artikulong ito ay hindi nilayon na turuan ka ng SQL mula sa simula.

Kaya umalis na tayo.

Gagamitin natin ang kilala Diagram ng HR sa Oracle kasama ang mga talahanayan nito (pa):

SQL. Nakakaaliw na mga palaisipan
Tandaan ko na isasaalang-alang lamang namin ang mga SELECT task. Walang DML o DDL na gawain dito.

gawain

Paghihigpit at Pag-uuri ng Data

Mesa ng mga empleyado. Kumuha ng listahan na may impormasyon tungkol sa lahat ng empleyado
desisyon

SELECT * FROM employees

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyadong pinangalanang 'David'
desisyon

SELECT *
  FROM employees
 WHERE first_name = 'David';

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na may job_id na katumbas ng 'IT_PROG'
desisyon

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado mula sa ika-50 departamento (department_id) na may suweldo (suweldo) na higit sa 4000
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado mula sa ika-20 at ika-30 na departamento (department_id)
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang huling titik sa kanilang pangalan ay 'a'
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado mula sa ika-50 at ika-80 departamento (department_id) na may bonus (ang halaga sa column na commission_pct ay walang laman)
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang mga pangalan ay naglalaman ng hindi bababa sa 2 letrang 'n'
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang mga pangalan ay mas mahaba sa 4 na titik
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang suweldo ay nasa hanay mula 8000 hanggang 9000 (kasama)
desisyon

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang pangalan ay naglalaman ng simbolo na '%'
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng manager ID
desisyon

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Mesa ng mga empleyado. Kumuha ng listahan ng mga empleyado kasama ang kanilang mga posisyon sa format: Donald(sh_clerk)
desisyon

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

Paggamit ng Single-Row Function para I-customize ang Output

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang mga pangalan ay mas mahaba sa 10 na titik
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyadong may letrang 'b' sa kanilang pangalan (case insensitive)
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang mga pangalan ay naglalaman ng hindi bababa sa 2 letrang 'a'
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang suweldo ay multiple ng 1000
desisyon

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

Mesa ng mga empleyado. Kunin ang unang 3-digit na numero ng numero ng telepono ng empleyado kung ang kanyang numero ay nasa format na XXX.XXX.XXXX
desisyon

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

talahanayan ng mga departamento. Kunin ang unang salita mula sa pangalan ng departamento para sa mga may higit sa isang salita sa pangalan
desisyon

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

Mesa ng mga empleyado. Kumuha ng mga pangalan ng empleyado nang walang una at huling titik sa pangalan
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang huling titik sa kanilang pangalan ay 'm' at ang pangalan ay mas mahaba sa 5
desisyon

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

Table Dual. Kunin ang susunod na petsa ng Biyernes
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na nagtrabaho para sa kumpanya nang higit sa 17 taon
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang huling digit ng kanilang numero ng telepono ay kakaiba at binubuo ng 3 numero na pinaghihiwalay ng isang tuldok
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na ang value ng job_id pagkatapos ng sign na '_' ay may hindi bababa sa 3 character, ngunit ang value na ito pagkatapos ng '_' ay hindi katumbas ng 'CLERK'
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado sa pamamagitan ng pagpapalit sa lahat ng '.' sa PHONE_NUMBER na halaga sa '-'
desisyon

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

Paggamit ng Conversion Function at Conditional Expression

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyadong pumasok sa trabaho sa unang araw ng buwan (anuman)
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyadong pumasok sa trabaho noong 2008
desisyon

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

DUAL ng talahanayan. Ipakita ang petsa bukas sa format na: Bukas ay Ikalawang araw ng Enero
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado at ang petsa ng pagdating ng bawat empleyado sa trabaho sa format na: ika-21 ng Hunyo, 2007
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga empleyado na may tumaas na suweldo ng 20%. Ipakita ang suweldo na may dollar sign
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na nagsimulang magtrabaho noong Pebrero 2007.
desisyon

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 ng talahanayan. Ilabas ang kasalukuyang petsa, + segundo, + minuto, + oras, + araw, + buwan, + taon
desisyon

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;

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado na may buong suweldo (suweldo + commission_pct(%)) sa format na: $24,000.00
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng lahat ng empleyado at impormasyon tungkol sa pagkakaroon ng mga bonus sa suweldo (Oo/Hindi)
desisyon

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

Mesa ng mga empleyado. Kunin ang antas ng suweldo ng bawat empleyado: Mas mababa sa 5000 ay itinuturing na Mababang antas, Higit sa o katumbas ng 5000 at mas mababa sa 10000 ay itinuturing na Normal na antas, Higit sa o katumbas ng 10000 ay itinuturing na Mataas na antas
desisyon

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;

Mga Bansa sa Talahanayan. Para sa bawat bansa, ipakita ang rehiyon kung saan ito matatagpuan: 1-Europe, 2-America, 3-Asia, 4-Africa (nang walang Sumali)
desisyon

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;

Pag-uulat ng Pinagsama-samang Data Gamit ang Group Functions

Mesa ng mga empleyado. Makatanggap ng ulat ng department_id na may pinakamababa at pinakamataas na suweldo, maaga at huli na mga petsa ng pagdating sa trabaho at ang bilang ng mga empleyado. Pagbukud-bukurin ayon sa bilang ng mga empleyado (pababa)
desisyon

  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;

Mesa ng mga empleyado. Ilang empleyado na ang mga pangalan ay nagsisimula sa parehong titik? Pagbukud-bukurin ayon sa dami. Ipakita lamang ang mga kung saan ang dami ay higit sa 1
desisyon

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;

Mesa ng mga empleyado. Ilang empleyado ang nagtatrabaho sa parehong departamento at tumatanggap ng parehong suweldo?
desisyon

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

Mesa ng mga empleyado. Kumuha ng ulat kung gaano karaming empleyado ang natanggap sa bawat araw ng linggo. Pagbukud-bukurin ayon sa dami
desisyon

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

Mesa ng mga empleyado. Kumuha ng ulat kung gaano karaming empleyado ang natanggap ayon sa taon. Pagbukud-bukurin ayon sa dami
desisyon

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

Mesa ng mga empleyado. Kunin ang bilang ng mga departamentong may mga empleyado
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga department_id na mayroong higit sa 30 empleyado
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga department_id at ang rounded average na suweldo ng mga empleyado sa bawat departamento.
desisyon

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

Mga Bansa sa Talahanayan. Kunin ang list region_id ang kabuuan ng lahat ng titik ng lahat ng country_name kung saan mayroong higit sa 60
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga department_id kung saan gumagana ang mga empleyado ng ilang (>1) job_id
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga manager_id na ang bilang ng mga nasasakupan ay higit sa 5 at ang kabuuan ng lahat ng mga suweldo ng kanyang mga nasasakupan ay higit sa 50000
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga manager_id na ang average na suweldo ng lahat ng kanyang mga nasasakupan ay nasa hanay mula 6000 hanggang 9000 at hindi tumatanggap ng mga bonus (walang laman ang commission_pct)
desisyon

  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;

Mesa ng mga empleyado. Kunin ang pinakamataas na suweldo mula sa lahat ng empleyado job_id na nagtatapos sa salitang 'CLERK'
desisyon

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

Mesa ng mga empleyado. Kunin ang pinakamataas na suweldo sa lahat ng karaniwang suweldo para sa departamento
desisyon

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

Mesa ng mga empleyado. Kunin ang bilang ng mga empleyado na may parehong bilang ng mga titik sa kanilang pangalan. Kasabay nito, ipakita lamang ang mga may haba ng pangalan na higit sa 5 at ang bilang ng mga empleyado na may parehong pangalan ay higit sa 20. Pagbukud-bukurin ayon sa haba ng pangalan
desisyon

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

Pagpapakita ng Data mula sa Maramihang Talahanayan Gamit ang Mga Pagsasama

Table Empleyado, Departamento, Lokasyon, Bansa, Rehiyon. Kumuha ng listahan ng mga rehiyon at ang bilang ng mga empleyado sa bawat rehiyon
desisyon

  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;

Table Empleyado, Departamento, Lokasyon, Bansa, Rehiyon. Kumuha ng detalyadong impormasyon tungkol sa bawat empleyado:
First_name, Last_name, Department, Job, Street, Country, Region
desisyon

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

Mesa ng mga empleyado. Ipakita ang lahat ng mga tagapamahala na may higit sa 6 na empleyadong nasasakupan sa kanila
desisyon

  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;

Mesa ng mga empleyado. Ipakita ang lahat ng empleyado na hindi nag-uulat sa sinuman
desisyon

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;

Mga Empleyado sa Talaan, Job_history. Iniimbak ng Employee table ang lahat ng empleyado. Ang talahanayan ng Job_history ay nag-iimbak ng mga empleyado na umalis sa kumpanya. Kumuha ng ulat tungkol sa lahat ng empleyado at ang kanilang katayuan sa kumpanya (Gumagana o umalis sa kumpanya na may petsa ng pag-alis)
Halimbawa:
unang_pangalan | katayuan
Jennifer | Umalis sa kumpanya noong 31 ng Disyembre, 2006
Clara | Kasalukuyang Nagtatrabaho
desisyon

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

Table Empleyado, Departamento, Lokasyon, Bansa, Rehiyon. Kumuha ng listahan ng mga empleyadong nakatira sa Europe (region_name)
desisyon

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

Mga Empleyado sa Table, Mga Departamento. Ipakita ang lahat ng mga departamento na may higit sa 30 empleyado
desisyon

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

Mga Empleyado sa Table, Mga Departamento. Ipakita ang lahat ng empleyado na wala sa anumang departamento
desisyon

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;

Mga Empleyado sa Table, Mga Departamento. Ipakita ang lahat ng mga departamento kung saan walang mga empleyado
desisyon

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

Mesa ng mga empleyado. Ipakita ang lahat ng mga empleyado na walang sinumang nasasakupan sa kanila
desisyon

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

Table Empleyado, Trabaho, Departamento. Ipakita ang mga empleyado sa format: First_name, Job_title, Department_name.
Halimbawa:
First_name | Job_title | Pangalan_kagawaran
Donald | Pagpapadala | Clerk Shipping
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga empleyado na ang mga tagapamahala ay nakakuha ng trabaho noong 2005, ngunit sa parehong oras ang mga empleyado mismo ay nakakuha ng trabaho bago ang 2005
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga empleyado na ang mga manager ay nakakuha ng trabaho noong Enero ng anumang taon at ang haba ng job_title ng mga empleyadong ito ay higit sa 15 character
desisyon

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;

Paggamit ng Mga Subquery upang Malutas ang Mga Query

Mesa ng mga empleyado. Kumuha ng listahan ng mga empleyado na may pinakamahabang pangalan.
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga empleyado na may suweldo na mas malaki kaysa sa karaniwang suweldo ng lahat ng empleyado.
desisyon

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

Empleyado, Departamento, Lokasyon talahanayan. Kunin ang lungsod kung saan ang mga empleyado sa kabuuan ay kumikita ng pinakamaliit.
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga empleyado na ang manager ay tumatanggap ng suweldo na higit sa 15000.
desisyon

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

Mga Empleyado sa Table, Mga Departamento. Ipakita ang lahat ng mga departamento kung saan walang mga empleyado
desisyon

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

Mesa ng mga empleyado. Ipakita sa lahat ng empleyado na hindi mga tagapamahala
desisyon

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

Mesa ng mga empleyado. Ipakita ang lahat ng mga tagapamahala na may higit sa 6 na empleyadong nasasakupan sa kanila
desisyon

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

Mga Empleyado sa Table, Mga Departamento. Ipakita ang mga empleyado na nagtatrabaho sa departamento ng IT
desisyon

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

Table Empleyado, Trabaho, Departamento. Ipakita ang mga empleyado sa format: First_name, Job_title, Department_name.
Halimbawa:
First_name | Job_title | Pangalan_kagawaran
Donald | Pagpapadala | Clerk Shipping
desisyon

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;

Mesa ng mga empleyado. Kumuha ng listahan ng mga empleyado na ang mga tagapamahala ay nakakuha ng trabaho noong 2005, ngunit sa parehong oras ang mga empleyado mismo ay nakakuha ng trabaho bago ang 2005
desisyon

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

Mesa ng mga empleyado. Kumuha ng listahan ng mga empleyado na ang mga manager ay nakakuha ng trabaho noong Enero ng anumang taon at ang haba ng job_title ng mga empleyadong ito ay higit sa 15 character
desisyon

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;

Yun lang muna.

Umaasa ako na ang mga gawain ay kawili-wili at kapana-panabik.
Idaragdag ko sa listahang ito ng mga gawain hangga't maaari.
Ikatutuwa ko rin na makatanggap ng anumang mga komento at mungkahi.

PS: Kung may makaisip ng isang kawili-wiling SELECT task, isulat sa mga komento at idaragdag ko ito sa listahan.

Salamat sa inyo.

Pinagmulan: www.habr.com

Magdagdag ng komento