SQL. විනෝදාත්මක ප්‍රහේලිකා

හෙලෝ, හබ්ර්!

දැනට වසර 3 කට වැඩි කාලයක් තිස්සේ මම විවිධ පුහුණු මධ්‍යස්ථානවල SQL උගන්වමින් සිටින අතර, මගේ එක් නිරීක්ෂණයක් නම්, සිසුන්ට කාර්යයක් ලබා දෙන්නේ නම්, SQL වඩා හොඳින් ප්‍රගුණ කර අවබෝධ කර ගැනීම මිස, හැකියාවන් සහ න්‍යායාත්මක පදනම් ගැන පමණක් පැවසීම නොවේ.

මෙම ලිපියෙන්, මම සිසුන්ට ගෙදර වැඩ ලෙස ලබා දෙන සහ SQL පිළිබඳ ගැඹුරු සහ පැහැදිලි අවබෝධයකට තුඩු දෙන විවිධ ආකාරයේ මොළ කුණාටු සිදු කරන මගේ ගැටළු ලැයිස්තුව ඔබ සමඟ බෙදා ගන්නෙමි.

SQL. විනෝදාත්මක ප්‍රහේලිකා

SQL (ˈɛsˈkjuˈɛl; ඉංග්‍රීසි ව්‍යුහගත විමසුම් භාෂාව) යනු යෝග්‍ය දත්ත සමුදා කළමනාකරණ පද්ධතියක් මඟින් කළමනාකරණය කරනු ලබන සම්බන්ධතා දත්ත ගබඩාවක දත්ත නිර්මාණය කිරීමට, වෙනස් කිරීමට සහ කළමනාකරණය කිරීමට භාවිතා කරන ප්‍රකාශන ක්‍රමලේඛන භාෂාවකි. වැඩිපුර විස්තර ...

ඔබට SQL ගැන විවිධාකාරයෙන් කියවිය හැකිය මූලාශ්ර.
මෙම ලිපිය ඔබට 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) වෙතින් සියලුම සේවකයින්ගේ ලැයිස්තුවක් ලබා ගන්න (කොමිස්_පක්‍ට් තීරුවේ අගය හිස් නොවේ)
තීරණය

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

සේවක වගුව. අඩුම තරමින් 'n' අක්ෂර 2ක් අඩංගු සියලුම සේවකයින්ගේ ලැයිස්තුවක් ලබා ගන්න
තීරණය

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;

සේවක වගුව. අඩුම තරමින් 'a' අක්ෂර 2ක් අඩංගු සියලුම සේවකයින්ගේ ලැයිස්තුවක් ලබා ගන්න
තීරණය

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ක් ඇති සියලුම සේවකයින්ගේ ලැයිස්තුවක් ලබා ගන්න, නමුත් '_' ට පසු මෙම අගය 'CLERK' ට සමාන නොවේ
තීරණය

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;

සේවක වගුව. සම්පූර්ණ වැටුප් සහිත සියලුම සේවකයින්ගේ ලැයිස්තුවක් (වැටුප් + කොමිස්_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;

සමූහ කාර්යයන් භාවිතා කරමින් සමස්ථ දත්ත වාර්තා කිරීම

සේවක වගුව. අවම සහ උපරිම වැටුප, රැකියාවට පැමිණි මුල් සහ ප්‍රමාද දිනයන් සහ සේවක සංඛ්‍යාව සමඟ ඩිපාර්ට්මන්ට්_අයිඩී මගින් වාර්තාවක් ලබා ගන්න. සේවක සංඛ්‍යාව අනුව වර්ග කරන්න (බැසෙන)
තීරණය

  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කට වඩා සිටින දෙපාර්තමේන්තු_id ලැයිස්තුවක් ලබා ගන්න
තීරණය

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

සේවක වගුව. දෙපාර්තමේන්තු_id ලැයිස්තුවක් සහ එක් එක් දෙපාර්තමේන්තුවේ සේවකයින්ගේ වටකුරු සාමාන්‍ය වැටුප ලබා ගන්න.
තීරණය

  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) job_id කිහිපයක සේවකයින් වැඩ කරන දෙපාර්තමේන්තු_id ලැයිස්තුවක් ලබා ගන්න
තීරණය

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

සේවක වගුව. යටත් නිලධාරීන් සංඛ්‍යාව 5 ට වැඩි සහ ඔහුගේ යටත් නිලධාරීන්ගේ සියලුම වැටුප් එකතුව 50000 ට වඩා වැඩි කළමනාකරු_id ලැයිස්තුවක් ලබා ගන්න
තීරණය

  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;

සේවක වගුව. 'CLERK' යන වචනයෙන් අවසන් වන 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);

Joins භාවිතා කරමින් බහු වගු වලින් දත්ත ප්‍රදර්ශනය කිරීම

මේස සේවකයින්, දෙපාර්තමේන්තු, ස්ථාන, රටවල්, කලාප. කලාප ලැයිස්තුවක් සහ එක් එක් කලාපයේ සේවක සංඛ්යාව ලබා ගන්න
තීරණය

  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 වගුව සමාගම හැර ගිය සේවකයින් ගබඩා කරයි. සියලුම සේවකයින් සහ සමාගම තුළ ඔවුන්ගේ තත්ත්වය පිළිබඳ වාර්තාවක් ලබා ගන්න (වැඩ කිරීම හෝ පිටත් වූ දිනය සමඟ සමාගම හැර)
උදාහරණ:
මුල්_නම | තත්ත්වය
ජෙනිෆර් | 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);

මේස සේවකයින්, දෙපාර්තමේන්තු, ස්ථාන, රටවල්, කලාප. යුරෝපයේ වෙසෙන සේවකයින්ගේ ලැයිස්තුවක් ලබා ගන්න (region_name)
තීරණය

 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 ට වඩා වැඩිය
තීරණය

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 ට වඩා වැඩිය
තීරණය

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: යමෙකු සිත්ගන්නාසුළු SELECT කාර්යයක් ඉදිරිපත් කරන්නේ නම්, අදහස් දැක්වීමේදී ලියන්න, මම එය ලැයිස්තුවට එකතු කරමි.

ස්තුතියි.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න