SQL. Makalingaw nga mga puzzle

Hello Habr!

Sulod sa kapin sa 3 ka tuig ako nagtudlo sa SQL sa lainlaing mga sentro sa pagbansay, ug usa sa akong mga obserbasyon mao nga ang mga estudyante nag-master ug mas nakasabut sa SQL kung hatagan sila usa ka buluhaton, ug dili lamang maghisgot bahin sa mga posibilidad ug mga pundasyon sa teoretikal.

Niini nga artikulo, akong ipaambit kanimo ang akong listahan sa mga buluhaton nga akong gihatag sa mga estudyante isip homework ug diin nagpahigayon kami og nagkalain-laing matang sa brainstorms, nga mosangpot sa usa ka lawom ug tin-aw nga pagsabot sa SQL.

SQL. Makalingaw nga mga puzzle

Ang SQL (ΛˆΙ›sˈkjuΛˆΙ›l; eng. structured query language) maoy usa ka declarative programming language nga gigamit sa paghimo, pag-usab ug pagdumala sa datos sa usa ka relational database nga gidumala sa usa ka angay nga database management system. Basaha ang dugang…

Makabasa ka bahin sa SQL gikan sa lainlain mga gigikanan.
Kini nga artikulo wala gituyo sa pagtudlo kanimo sa SQL gikan sa wala.

Mao na ningpadayon ta.

Atong gamiton ang ilado Skema sa HR sa Oracle uban sa mga lamesa niini (Basaha ang dugang pa):

SQL. Makalingaw nga mga puzzle
Akong namatikdan nga atong tagdon lamang ang mga buluhaton sa SELECT. Walay mga buluhaton sa DML ug DDL.

buluhaton

Pagpugong ug Pag-sort sa Data

Talaan sa mga empleyado. Pagkuha usa ka lista nga adunay kasayuran bahin sa tanan nga mga empleyado
desisyon

SELECT * FROM employees

Talaan sa mga empleyado. Pagkuha usa ka lista sa tanan nga mga empleyado nga ginganlag 'David'
desisyon

SELECT *
  FROM employees
 WHERE first_name = 'David';

Talaan sa mga empleyado. Pagkuha ug lista sa tanang empleyado nga adunay job_id nga katumbas sa 'IT_PROG'
desisyon

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Talaan sa mga empleyado. Pagkuha usa ka lista sa tanan nga mga empleyado gikan sa ika-50 nga departamento (department_id) nga adunay suweldo (suweldo) nga labaw sa 4000
desisyon

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

Talaan sa mga empleyado. Pagkuha og lista sa tanang empleyado gikan sa ika-20 ug gikan sa ika-30 nga departamento (department_id)
desisyon

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

Talaan sa mga empleyado. Pagkuha ug listahan sa tanang empleyado kansang kataposang letra sa ilang ngalan kay 'a'
desisyon

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

Talaan sa mga empleyado. Pagkuha ug listahan sa tanang empleyado gikan sa ika-50 ug gikan sa ika-80 nga departamento (department_id) nga adunay bonus (ang bili sa kolum sa commission_pct walay sulod)
desisyon

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

Talaan sa mga empleyado. Pagkuha usa ka lista sa tanan nga mga empleyado kansang ngalan adunay labing menos 2 ka letra 'n'
desisyon

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

Talaan sa mga empleyado. Pagkuha ug lista sa tanang empleyado kansang ngalan mas taas sa 4 ka letra
desisyon

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

Talaan sa mga empleyado. Pagkuha usa ka lista sa tanan nga mga empleyado kansang suweldo tali sa 8000 ug 9000 (inclusive)
desisyon

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Talaan sa mga empleyado. Pagkuha usa ka lista sa tanan nga mga empleyado kansang ngalan adunay simbolo nga '%'
desisyon

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

Talaan sa mga empleyado. Pagkuha og lista sa tanang manager ID
desisyon

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Talaan sa mga empleyado. Pagkuha ug lista sa mga empleyado nga adunay ilang mga posisyon sa pormat: Donald(sh_clerk)
desisyon

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

Paggamit sa Single-Row Functions aron Ipasibo ang Output

Talaan sa mga empleyado. Pagkuha ug lista sa tanang empleyado kansang ngalan mas taas sa 10 ka letra
desisyon

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

Talaan sa mga empleyado. Pagkuha ug listahan sa tanang empleyado nga adunay letrang 'b' sa ilang ngalan (case insensitive)
desisyon

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

Talaan sa mga empleyado. Pagkuha usa ka lista sa tanan nga mga empleyado kansang ngalan adunay labing menos 2 ka letra 'a'
desisyon

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

Talaan sa mga empleyado. Pagkuha usa ka lista sa tanan nga mga empleyado kansang sweldo usa ka multiple sa 1000
desisyon

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

Talaan sa mga empleyado. Kuhaa ang unang 3-digit nga numero sa numero sa telepono sa empleyado kon ang iyang numero anaa sa format nga Π₯Π₯Π₯.Π₯Π₯Π₯.Π₯Π₯Π₯Π₯
desisyon

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

Talaan sa mga departamento. Kuhaa ang unang pulong gikan sa ngalan sa departamento alang niadtong adunay labaw sa usa ka pulong sa ngalan
desisyon

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

Talaan sa mga empleyado. Pagkuha mga ngalan sa empleyado nga wala ang una ug katapusan nga letra sa ngalan
desisyon

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

Talaan sa mga empleyado. Pagkuha usa ka lista sa tanan nga mga empleyado kansang katapusan nga letra sa ngalan katumbas sa 'm' ug ang gitas-on sa ngalan labaw sa 5
desisyon

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

Doble nga lamesa. Kuhaa ang petsa sa sunod Biyernes
desisyon

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

Talaan sa mga empleyado. Pagkuha og lista sa tanang empleyado nga nakauban sa kompanya sulod sa kapin sa 17 ka tuig
desisyon

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

Talaan sa mga empleyado. Pagkuha ug lista sa tanang empleyado kansang kataposang digit sa numero sa telepono kay katingad-an ug naglangkob sa 3 ka numero nga gibulag sa tulbok
desisyon

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

Talaan sa mga empleyado. Pagkuha og lista sa tanang empleyado kansang job_id value human sa '_' sign adunay labing menos 3 ka karakter, apan kini nga value human sa '_' dili katumbas sa 'CLERK'
desisyon

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

Talaan sa mga empleyado. Pagkuha ug lista sa tanang empleyado pinaagi sa pag-ilis sa tanang '.' sa PHONE_NUMBER nga bili sa '-'
desisyon

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

Paggamit sa Conversion Function ug Conditional Expression

Talaan sa mga empleyado. Pagkuha og lista sa tanang empleyado nga mitrabaho sa unang adlaw sa bulan (bisan unsa)
desisyon

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

Talaan sa mga empleyado. Pagkuha og lista sa tanang empleyado nga mitrabaho niadtong 2008
desisyon

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

DUAL nga lamesa. Ipakita ang petsa ugma sa pormat: Ugma ang Ikaduhang adlaw sa Enero
desisyon

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

Talaan sa mga empleyado. Pagkuha ug lista sa tanang empleyado ug ang ilang petsa sa pagsugod sa pormat: ika-21 sa Hunyo, 2007
desisyon

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

Talaan sa mga empleyado. Pagkuha usa ka lista sa mga empleyado nga adunay pagtaas sa sweldo sa 20%. Ipakita ang suweldo nga adunay timaan sa dolyar
desisyon

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

Talaan sa mga empleyado. Pagkuha og lista sa tanang empleyado nga mitrabaho niadtong 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 nga lamesa. I-export ang karon nga petsa, + segundo, + minuto, + oras, + adlaw, + bulan, + tuig
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;

Talaan sa mga empleyado. Pagkuha ug lista sa tanang empleyado nga adunay bug-os nga sweldo (suweldo + commission_pct(%)) sa pormat: $24,000.00
desisyon

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

Talaan sa mga empleyado. Pagkuha usa ka lista sa tanan nga mga empleyado ug kasayuran bahin sa pagkaanaa sa mga bonus sa suweldo (Oo / Dili)
desisyon

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

Talaan sa mga empleyado. Pagkuha sa lebel sa suweldo sa matag empleyado: Wala’y 5000 ang gikonsiderar nga Ubos nga lebel, Labaw sa o katumbas sa 5000 ug ubos sa 10000 ang giisip nga Normal nga lebel, Labaw sa o katumbas sa 10000 giisip nga Taas nga lebel
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;

Talaan sa mga nasud. Alang sa matag nasud, ipakita ang rehiyon diin kini nahimutang: 1-Europe, 2-America, 3-Asia, 4-Africa (walay Apil)
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;

Pagreport sa Natibuok nga Data Gamit ang Mga Kalihokan sa Grupo

Talaan sa mga empleyado. Pagkuha ug report pinaagi sa department_id nga adunay minimum ug maximum nga sweldo, sayo ug ulahi nga mga petsa sa pag-abot ug gidaghanon sa mga empleyado. Pagsunud sa gidaghanon sa mga empleyado (desc)
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;

Talaan sa mga empleyado. Pila ka mga empleyado kansang mga ngalan nagsugod sa parehas nga letra? Paghan-ay sumala sa gidaghanon. Ipakita lamang kadtong diin ang gidaghanon mas dako pa 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;

Talaan sa mga empleyado. Pila ka mga empleyado ang nagtrabaho sa parehas nga departamento ug nakadawat parehas nga suweldo?
desisyon

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

Talaan sa mga empleyado. Pagkuha og report kung pila ka mga empleyado ang gi-hire sa matag adlaw sa semana. Paghan-ay sumala sa gidaghanon
desisyon

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

Talaan sa mga empleyado. Pagkuha og report kon pila ka empleyado ang na-hire sa tuig. Paghan-ay sumala sa gidaghanon
desisyon

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

Talaan sa mga empleyado. Kuhaa ang gidaghanon sa mga departamento nga adunay mga empleyado
desisyon

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

Talaan sa mga empleyado. Pagkuha ug lista sa department_id nga adunay kapin sa 30 ka empleyado
desisyon

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

Talaan sa mga empleyado. Pagkuha ug listahan sa mga department_id ug ang rounded average nga sweldo sa mga empleyado sa matag departamento.
desisyon

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

Talaan sa mga nasud. Pagkuha ug listahan sa region_id sum sa tanang letra sa tanang country_name diin kapin sa 60
desisyon

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

Talaan sa mga empleyado. Pagkuha ug lista sa department_id diin ang mga empleyado sa daghang (>1) job_id nagtrabaho
desisyon

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

Talaan sa mga empleyado. Pagkuha ug lista sa manager_id kansang gidaghanon sa mga sakop mas dako pa sa 5 ug ang sumada sa tanang sweldo sa iyang mga sakop labaw pa sa 50000
desisyon

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

Talaan sa mga empleyado. Pagkuha ug lista sa manager_id kansang kasagarang sweldo sa tanan niyang sakop kay tali sa 6000 ug 9000 nga wala makadawat ug bonus (komisyon_pct walay sulod)
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;

Talaan sa mga empleyado. Pagkuha sa pinakataas nga sweldo gikan sa tanang empleyado job_id nga natapos sa pulong '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';

Talaan sa mga empleyado. Pagkuha sa labing taas nga suweldo sa tanan nga kasagaran nga sweldo alang sa departamento
desisyon

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

Talaan sa mga empleyado. Kuhaa ang gidaghanon sa mga empleyado nga adunay parehas nga gidaghanon sa mga letra sa ilang ngalan. Sa samang higayon, ipakita lamang kadtong kansang ngalan mas taas kay sa 5 ug ang gidaghanon sa mga empleyado nga adunay samang ngalan labaw pa sa 20. Pagsunud-sunod sumala sa gitas-on sa ngalan
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);

Pagpakita sa Data gikan sa Daghang Mga Talaan Gamit ang mga Pagdugtong

Table Empleyado, Departamento, Lokasyon, Nasud, Rehiyon. Pagkuha og lista sa mga rehiyon ug ang gidaghanon sa mga empleyado sa matag 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, Nasud, Rehiyon. Pagkuha ug detalyadong impormasyon bahin sa matag empleyado:
First_name, Last_name, Departamento, Trabaho, Kalye, Nasud, Rehiyon
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);

Talaan sa mga empleyado. Ipakita ang tanan nga mga managers nga adunay labaw pa sa 6 nga mga empleyado
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;

Talaan sa mga empleyado. Ipakita ang tanan nga empleyado nga wala magreport sa bisan kinsa
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;

Talaan sa mga empleyado, Job_history. Ang lamesa sa Empleyado nagtipig sa tanan nga mga empleyado. Ang lamesa sa Job_history nagtipig sa mga empleyado nga mibiya sa kompanya. Pagkuha usa ka taho sa tanan nga mga empleyado ug ang ilang kahimtang sa kompanya (Nagtrabaho o mibiya sa kompanya nga adunay petsa sa pagbiya)
Pananglitan:
unang_ngalan | kahimtang
jennifer | Mibiya sa kompanya sa 31 sa Disyembre, 2006
Clara | Nagtrabaho karon
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, Nasud, Rehiyon. Pagkuha ug lista sa mga empleyado nga nagpuyo 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 lamesa, mga departamento. Ipakita ang tanan nga mga departamento nga adunay labaw sa 30 nga mga 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 lamesa, mga departamento. Ipakita ang tanan nga mga empleyado nga wala sa bisan unsang 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 lamesa, mga departamento. Ipakita ang tanang departamento nga walay empleyado
desisyon

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

Talaan sa mga empleyado. Ipakita ang tanang empleyado nga walay sakop
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;

Mga Empleyado sa lamesa, Trabaho, Departamento. Ipakita ang mga empleyado sa pormat: First_name, Job_title, Department_name.
Pananglitan:
unang_ngalan | titulo sa trabaho | Departamento_ngalan
Donald | pagpadala | 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);

Talaan sa mga empleyado. Pagkuha usa ka lista sa mga empleyado kansang mga manedyer nakakuha og trabaho kaniadtong 2005, apan sa parehas nga oras, kini nga mga trabahante mismo nakakuha trabaho sa wala pa 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');

Talaan sa mga empleyado. Pagkuha usa ka lista sa mga empleyado kansang mga manedyer nakakuha trabaho sa bulan sa Enero sa bisan unsang tuig ug ang gitas-on sa job_title niini nga mga empleyado labaw pa sa 15 nga mga karakter
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 sa mga Subquery sa Pagsulbad sa mga Pangutana

Talaan sa mga empleyado. Pagkuha usa ka lista sa mga empleyado nga adunay labing taas nga ngalan.
desisyon

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

Talaan sa mga empleyado. Pagkuha usa ka lista sa mga empleyado nga adunay suweldo nga mas dako kaysa sa kasagaran nga suweldo sa tanan nga mga empleyado.
desisyon

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

Mga empleyado sa lamesa, mga departamento, mga lokasyon. Kuhaa ang siyudad diin ang mga empleyado adunay labing gamay sa kinatibuk-an.
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);

Talaan sa mga empleyado. Pagkuha ug listahan sa mga empleyado kansang manedyer nakadawat ug suweldo nga labaw sa 15000.
desisyon

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

Mga empleyado sa lamesa, mga departamento. Ipakita ang tanang departamento nga walay empleyado
desisyon

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

Talaan sa mga empleyado. Ipakita ang tanang empleyado nga dili manedyer
desisyon

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

Talaan sa mga empleyado. Ipakita ang tanan nga mga managers nga adunay labaw pa sa 6 nga mga empleyado
desisyon

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

Mga empleyado sa lamesa, mga departamento. Ipakita ang mga empleyado nga nagtrabaho sa departamento sa IT
desisyon

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

Mga Empleyado sa lamesa, Trabaho, Departamento. Ipakita ang mga empleyado sa pormat: First_name, Job_title, Department_name.
Pananglitan:
unang_ngalan | titulo sa trabaho | Departamento_ngalan
Donald | pagpadala | 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;

Talaan sa mga empleyado. Pagkuha usa ka lista sa mga empleyado kansang mga manedyer nakakuha og trabaho kaniadtong 2005, apan sa parehas nga oras, kini nga mga trabahante mismo nakakuha trabaho sa wala pa 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');

Talaan sa mga empleyado. Pagkuha usa ka lista sa mga empleyado kansang mga manedyer nakakuha trabaho sa bulan sa Enero sa bisan unsang tuig ug ang gitas-on sa job_title niini nga mga empleyado labaw pa sa 15 nga mga karakter
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;

Kana lang sa pagkakaron.

Nanghinaut ko nga ang mga buluhaton makapaikag ug kulbahinam.
Idugang nako kini nga lista kutob sa mahimo.
Malipay usab ako sa bisan unsang mga komento ug sugyot.

PS: Kung adunay moabut nga usa ka makapaikag nga buluhaton sa PILI, isulat sa mga komentaryo, idugang ko kini sa lista.

Бпасибо.

Source: www.habr.com

Idugang sa usa ka comment