SQL. مسلية الألغاز

مرحبا هبر!

لأكثر من 3 سنوات ، كنت أقوم بتدريس SQL في مراكز تدريب مختلفة ، ومن ملاحظاتي أن الطلاب يتقنون SQL ويفهمونه بشكل أفضل إذا تم تكليفهم بمهمة ، وليس الحديث فقط عن الاحتمالات والأسس النظرية.

في هذه المقالة ، سوف أشارككم قائمة المهام التي أعطيها للطلاب كواجب منزلي والتي نجري عليها أنواعًا مختلفة من العصف الذهني ، مما يؤدي إلى فهم عميق وواضح لـ SQL.

SQL. مسلية الألغاز

SQL (ˈɛsˈkjuˈɛl ؛ لغة الاستعلام المهيكلة) هي لغة برمجة تعريفية تُستخدم لإنشاء وتعديل وإدارة البيانات في قاعدة بيانات علائقية يُدار بواسطة نظام إدارة قاعدة بيانات مناسب. اقرأ المزيد ...

يمكنك أن تقرأ عن SQL من مختلف مصادر.
لا تهدف هذه المقالة إلى تعليمك SQL من البداية.

إذا هيا بنا.

سوف نستخدم المشهور مخطط الموارد البشرية في Oracle بجداولها (أكثر):

SQL. مسلية الألغاز
ألاحظ أننا سننظر فقط في المهام في SELECT. لا توجد مهام في DML و DDL.

المهام

تقييد وفرز البيانات

جدول الموظفين. احصل على قائمة بمعلومات عن جميع الموظفين
حل

SELECT * FROM employees

جدول الموظفين. احصل على قائمة بجميع الموظفين باسم "ديفيد"
حل

SELECT *
  FROM employees
 WHERE first_name = 'David';

جدول الموظفين. احصل على قائمة بجميع الموظفين مع job_id يساوي "IT_PROG"
حل

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

جدول الموظفين. الحصول على قائمة بجميع الموظفين من القسم الخمسين (معرف القسم) براتب (راتب) أكبر من 50
حل

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

جدول الموظفين. الحصول على قائمة بجميع الموظفين من قسم 20 ومن 30 (department_id)
حل

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

جدول الموظفين. احصل على قائمة بجميع الموظفين الذين يكون الحرف الأخير في اسمهم هو "أ"
حل

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

جدول الموظفين. احصل على قائمة بجميع الموظفين من الخمسين ومن القسم الثمانين (department_id) الذين حصلوا على مكافأة (القيمة في العمود Commission_pct ليست فارغة)
حل

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

جدول الموظفين. احصل على قائمة بجميع الموظفين الذين يحتوي اسمهم على حرفين على الأقل '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 '';

جدول الموظفين. احصل على قائمة بجميع معرفات المديرين
حل

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

جدول الموظفين. الحصول على قائمة الموظفين مع مناصبهم بالتنسيق: دونالد (sh_clerk)
حل

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

استخدام وظائف الصف الواحد لتخصيص الإخراج

جدول الموظفين. احصل على قائمة بجميع الموظفين الذين تزيد أسماؤهم عن 10 أحرف
حل

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

جدول الموظفين. احصل على قائمة بجميع الموظفين الذين لديهم الحرف "ب" في أسمائهم (غير حساس لحالة الأحرف)
حل

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

جدول الموظفين. احصل على قائمة بجميع الموظفين الذين يحتوي اسمهم على حرفين على الأقل "أ"
حل

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

جدول الموظفين. احصل على قائمة بجميع الموظفين الذين يتقاضون رواتبهم من مضاعفات 1000
حل

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

جدول الموظفين. احصل على أول رقم مكون من 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;

جدول الموظفين. احصل على قائمة بجميع الموظفين الذين يساوي حرفهم الأخير في الاسم "م" وطول الاسم أكبر من 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';

طاولة مزدوجة. اعرض تاريخ الغد بالتنسيق: غدًا هو اليوم الثاني من شهر يناير
حل

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

طاولة مزدوجة. تصدير التاريخ الحالي ، + ثانية ، + دقيقة ، + ساعة ، + يوم ، + شهر ، + سنة
حل

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;

جدول الموظفين. احصل على قائمة بجميع الموظفين مع رواتب كاملة (الراتب + العمولة (٪)) بالصيغة: 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;

الإبلاغ عن البيانات المجمعة باستخدام وظائف المجموعة

جدول الموظفين. احصل على تقرير من قبل department_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 موظفًا
حل

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

جدول الموظفين. احصل على قائمة بمعرفات الأقسام والمتوسط ​​التقريبي للراتب للموظفين في كل قسم.
حل

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

جدول البلدان. احصل على قائمة بمجموع معرف المنطقة لجميع الأحرف لجميع أسماء البلدان التي يزيد عدد أحرفها عن 60
حل

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

جدول الموظفين. احصل على قائمة معرف القسم الذي يعمل فيه موظفون من عدة (> 1) job_id
حل

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

جدول الموظفين. احصل على قائمة manager_id الذي يزيد عدد مرؤوسيه عن 5 ومجموع جميع رواتب مرؤوسيه أكبر من 50000
حل

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

جدول الموظفين. احصل على قائمة manager_id الذي يتراوح متوسط ​​راتبه لجميع مرؤوسيه بين 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;

جدول الموظفين. احصل على الحد الأقصى للراتب من جميع الموظفين job_id الذي ينتهي بكلمة CLERK
حل

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;

جدول الموظفين ، والإدارات ، والمواقع ، والبلدان ، والمناطق. احصل على معلومات مفصلة عن كل موظف:
First_name، Last_name، Department، Job، Street، Country، Region
حل

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. يخزن جدول الموظف جميع الموظفين. يخزن جدول 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);

جدول الموظفين ، والإدارات ، والمواقع ، والبلدان ، والمناطق. احصل على قائمة بالموظفين الذين يعيشون في أوروبا (اسم_المنطقة)
حل

 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;

جدول الموظفين والوظائف والإدارات. اعرض الموظفين بالتنسيق: First_name، Job_title، Department_name.
على سبيل المثال:
الاسم_الأول | المسمى الوظيفي | اسم القسم
دونالد | الشحن | كاتب الشحن
حل

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

جدول الموظفين والوظائف والإدارات. اعرض الموظفين بالتنسيق: First_name، Job_title، Department_name.
على سبيل المثال:
الاسم_الأول | المسمى الوظيفي | اسم القسم
دونالد | الشحن | كاتب الشحن
حل

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;

هذا كل شئ حتى الان.

آمل أن تكون المهام ممتعة ومثيرة.
سأضيف إلى هذه القائمة قدر الإمكان.
سأكون سعيدًا أيضًا لأي تعليقات واقتراحات.

ملاحظة: إذا جاء شخص ما بمهمة مثيرة للاهتمام في SELECT ، فاكتب في التعليقات ، وسأضيفها إلى القائمة.

شكرا لك.

المصدر: www.habr.com

إضافة تعليق