الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ألغاز في Sql

بدأه أبو خالد السوري في 22 مايو 2008 · 24 رد · 4,562 مشاهدة · في قواعد بيانات MySQL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

إخواني الأعزاء,

أقدم لكم في هذا الموضوع مجموعة من المسائل في لغة الاستعلامات SQL

و التي تحتاج لمهارات جيدة في هذه اللغة و أحياناً لبعض الذكاء في الحل ..

لذا فهي أقرب إلى الألغاز منها إلى المسائل العادية ..

أتمنى أن تجدوا فيها المتعة و الفائدة

اخترت وضع هذه المسائل في منتدى MySQL لأنه النظام الذي أقوم عليه باختبار حلول المسائل .. على أن اختيار أي نظام إدارة قواعد بيانات آخر لن يؤثر على عمومية المسائل إلا بقدر ما تقتضيه خصوصية هذا النظام في صياغة الاستعلامات ..

و الآن أترككم مع المجموعة الأولى من الألغاز ..

تم تعديل هذه المشاركة بواسطة أبو خالد السوري في 22 مايو 2008 في 00:20

أبو خالد السوري

#2

المجموعة الأولى :

1) اللغز الأول :

ليكن لدينا الجدول التالي T المكون من العمود C

post-152370-1211404240_thumb.png

المطلوب هو حساب الصيغة التالية : K = V + U + 1

حيث V هو الرقم السابق للحرف V في العمود C , و U هو الرقم السابق للحرف U في العمود C

أي المطلوب هو الاستعلام الذي يعيد القيم التالية :

post-152370-1211404231_thumb.png

2) اللغز الثاني :

ليكن لدينا الجدولين التاليين

الجدول Sons يتضمن أسماء الآباء ( العمود Father ) و أبنائهم (العمود Son )

و الجدول Employee يتضمن أسماء الموظفين في شركة ما ..

( ليس هناك أي مفاتيح رئيسية و لا خارجية )

post-152370-1211404253_thumb.png

المطلوب استعلام يعيد أسماء الآباء الذين لديهم أبناء موظفين في الشركة ..

أي النتيجة ستكون :

اقتباس
خالد

ماجد

لطفي

3) اللغز الثالث :

نفس معطيات اللغز السابق

و لكن المطلوب هو استعلام يعيد أسماء الآباء الذين كل أبناءهم موظفين في الشركة ..

أي النتيجة ستكون :

اقتباس
خالد

ماجد

لاحظوا هنا أن اسم لطفي لم يعد موجود .. لأن ابنه رامز غير موظف في الشركة ..

--------------------

في انتظار إجاباتكم و محاولاتكم ... سأعمل على تجهيز المجموعة الثانية ..

تم تعديل هذه المشاركة بواسطة أبو خالد السوري في 22 مايو 2008 في 00:21

أبو خالد السوري

#3

الثاني

select s.father from sons s , employee where s.som = employee.name;

I Say Nothing

#4

الجواب صحيح 100%

و لكن ليس هناك داعي لاستخدام الاسم البديل s

SELECT sons.father FROM sons , employee WHERE sons.son = employee.name

هناك حل آخر باستخدام IN كما يلي :

SELECT sons.father FROM sons WHERE sons.son IN ( SELECT employee.name FROM employee)

--------------------

في انتظار حلول اللغزين الأول و الثالث ..

أبو خالد السوري

#5

الثالث

Select sons.father from sons where sons.father NOT IN ( Select sons.father from sons where
sons.son NOT IN ( Select employee.name from employee );

I Say Nothing

#6

جزاك الله خير اخي ابو خالد على هذا الموضوع .

وهذا هو حل السؤال الثاني

select father from employee e , sons s

where s.son =e.name

وهذا حل السؤال الثالث

select name from employee e, sons s

where e.name= s.father

ولكن اخي ابو خالد هل لك ان تشرح لنا اكثر حول السؤال الاول . لم افهمه جيدا ولم استطيع لهذا السبب حلة

تم تعديل هذه المشاركة بواسطة Jsp في 23 مايو 2008 في 03:18

#7

الأخت mana80

بصراحة لم أكن أتوقع أن يصل أحد لحل السؤال الثالث بهذه السرعة و الدقة ..

لذا لا يسعني سوى أن أصفق لك :clapping: مع كل الاحترام و التقدير ..

(( فقط هناك قوس ناقص في نهاية الاستعلام ))

SELECT sons.father 

FROM sons 

WHERE sons.father NOT IN (

    SELECT sons.father 

    FROM sons 

    WHERE sons.son NOT IN (

        SELECT employee.name 

        FROM employee 

    )

)

---------------------

الأخ Jsp

حل السؤال الثاني صحيح

أما حل السؤال الثالث فغير صحيح إطلاقاً , برغم أنه يعطي الإجابة المطلوبة (مجرد مصادفة)

الإجابة الصحيحة هي إجابة الأخت mana80

الاستعلام الذي كتبته يعيد أسماء الموظفين الذين هم آباء .. (و هم خالد و ماجد)

بينما المطلوب هو استعلام يعيد أسماء الآباء الذين كل أبناءهم موظفين في الشركة ..

بمعنى آخر مجموعة الأباء الذين لديهم أبناء موظفين في الشركة (خالد و ماجد و لطفي) منقوصاً منها مجموعة الآباء الذين لديهم أبناء غير موظفين في الشركة (لطفي)

ملاحظة : الاستعلامين الثاني و الثالث ينمذجان قضايا تكميم الوجود و الشمول على الترتيب :

p><p>

p><p>

-----------

بخصوص اللغز الأول , المطلوب هو استخراج قيم عددية من قيم محرفية و من ثم إجراء عملية حسابية عليها ..

أي من أجل القيمة المحرفية 4V3U سنستخرج القيمتين 4 و 3 و من ثم نجمعهما مع 1 لنحصل على 8

تم تعديل هذه المشاركة بواسطة أبو خالد السوري في 23 مايو 2008 في 12:54

أبو خالد السوري

#8

شكرا لك وبارك الله فيك

الغاز مفيده لتنشيط الذاكرة ...

زادك الله علما

I Say Nothing

#9

السؤال الأول

Select Substr(C,1,1) + Substr(C,3,1) + 1 from T;

حيث أن T الجدول و C العمود

هذا الحل اذا كان مكان الحرفين U و V ثابت في كل ال Rows

ويمكن استخدام الجمع مباشرة بالرغم من الناتج من الداله SubStr عبارة عن String

I Say Nothing

#10

فكرة رائعة اخ ابوخالد , مفيدة للتنشيط والتفكير .. وماشاء الله , الاخ mana80 قام بالواجب :rolleyes:

اتمنى ان تمتعنا بالمزيد ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#11

جزاك تلله خير اخي ابو خالد

ولكن بالنسبة لحلي رغم انه يعطي نفس النتيجة فلقد بنيته على فهمي للجداول .

رغم ان جدول Empolyee لم تتضحي لي ما المقصود بصورة كاملة

ربما في المرات القدامة قد يكون حلي اكثر صواباً

تحياتي لك

#12

الأخت mana80

جواب السؤال الأول صحيح

اقتباس
ويمكن استخدام الجمع مباشرة بالرغم من الناتج من الداله SubStr عبارة عن String

كلام سليم

---------------

الأخ محمد معاشر

شكراً لمرورك من هنا .. و أرجو أن تشارك معنا بمحاولاتك .. أو بوضع ألغاز جديدة ..

--------------

اللغز الرابع :

الجدول التالي (و ليكن اسمه course) يمثل البرنامج الأسبوعي للمحاضرات في جامعة ما ..

post-152370-1211580520_thumb.png

العمود code يمثل رمز المادة (الكورس) و العمود title يمثل اسم المادة

العمود Time يمثل اليوم الذي تعطى فيه المحاضرات و التوقيت و اسم القاعة

مثلا في السطر الأول:

المحاضرة تعطى أيام الثلاثاء و الخميس (Tu = Tuesday, Th = Thursday)

من الساعة 12:30 إلى الساعة 1:45 في القاعة (CSI 3117)

المطلوب استعلام يقوم بتقسيم محتويات العمود Time إلى ثلاث حقول : الأيام , التوقيت , و القاعة ..

أي النتيجة يجب أن تكون بالشكل التالي :

post-152370-1211580527_thumb.png

:hmm:

أبو خالد السوري

#13

السلام عليكم

هذا الحل ينطبق اذا كان :

عدد خانات الايام = 4

لايوجد فراغات في النص اي بين الايام والزمن واسم القاعة

Select Substr( Time,1,4 ) Day , Substr(Time,5,Locate( '(' ,Time )-5) Time_ ,
Substr( Time,Locate( '(' ,Time ),Length( Time )) Room from Course;

I Say Nothing

#14

السلام عليكم

محاولة جيدة أخت mana80

و لكن كما هو واضح من البيانات المعطاة :

عدد خانات الأيام أحياناً 4 و أحياناً 3

هناك عدد غير ثابت من النقاط يليه عدد غير ثابت من الفراغات بين الأيام و الزمن

هناك فراغ واحد فقط بين الزمن و بين اسم الصالة

و بالتالي اللغز لا يزال برسم الإجابة ..

أعتقد أنه حان الوقت لمراجعة توابع السلاسل المحرفية في MySQL

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

هناك توابع أخرى مهمة .. قد تلزم لحل هذا اللغز ..

أبو خالد السوري

#15

السلام عليكم

لم انتبه حقيقة لباقي الايام

ممكن توضح ماذا تمثل النقاط هل بالامكان ان تكون ايام ..

وشكرا

I Say Nothing

#16

إطلاقاً ..

النقاط هي نقاط .. و ليست أي شيء آخر ..

TuTh...........   12:30pm- 1:45pm (CSI  3117)

أبو خالد السوري

#17

السلام عليكم

Select Left(Time,Locate('.',Time)-1) Day,
	  Mid(Time,Locate('(',Reverse(Time))+1,Locate(' ',Reverse(Time),Locate('(',Reverse(Time))+2)) Time_ ,
	  Right(Time,Locate('(',Reverse(Time))) Room
	  From Course;

I Say Nothing

#18

الجزء الأول المتعلق بالأيام صحيح,

و لكن يمكن استخدام substr بدلاً من left

الجزء الثالث المتعلق باسم القاعة صحيح أيضاً

و لكن لا داعي لعكس السلسلة (باستخدام reverse) ثم استخدام right

إذ أنه في كلتا الحالتين اسم الصالة سيبدأ بالقوس )

و بالتالي يمكن ببساطة استخدام

substr(Time,Locate('(',Time)) Room

الجزء الثاني المتعلق بالتوقيت غير صحيح .. يبدو أنه معقد زيادة عن اللزوم و يعطي نتائج غير صحيحة

post-152370-1211925295_thumb.png

على كل حال لن أطيل عليكم .. و هذا هو الجواب الصحيح :

SELECT 
SUBSTRING(Time FROM 1 FOR POSITION('.' IN Time)-1) AS Day,
SUBSTRING(TRIM(SUBSTRING_INDEX(Time, '.', -1))0,15)AS Time_,
SUBSTRING(Time FROM POSITION('(' IN Time) FOR 30) AS Room
FROM course

SUBSTRING_INDEX

http://dev.mysql.com/doc/refman/5.0/en/str...substring-index

TRIM

http://dev.mysql.com/doc/refman/5.0/en/str...l#function_trim

أبو خالد السوري

#19

اللغز الخامس

الجدول التالي (ليكن اسمه Course) يحوي معلومات عن المواد (الكورسات) التي تدرس في جامعة ما ..

العمود الأول Number يمثل رمز المادة.

العمود الثاني Title يمثل اسم المادة.

العمود الثالث Fall2003 يمثل اسم مدرس المادة في الفصل الدراسي الأول ( خريف عام 2003 )

العمود الرابع Winter2004 يمثل اسم مدرس المادة في الفصل الدراسي الثاني ( شتاء عام 2004 )

العمود الخامس Spring2004 يمثل اسم مدرس المادة في الفصل الدراسي الثالث ( ربيع عام 2004 )

post-152370-1211987405_thumb.png

من الملاحظ أن بعض المواد تدرس على مدار فصل واحد أو أكثر ..

في حال كون مادة ما لا تدرس في فصل ما فقد تم وضع إشارة (-) مكان اسم المدرس .. و أحياناً تكون الخانة خالية (NULL)

المطلوب استعلام يعيد جميع أسماء مدرسي كل مادة (على كامل الفصول) .. بحيث يفصل بينهم فاصلة (,) في حال وجود أكثر من مدرس ..

أي المطلوب استعلام يعيد النتيجة التالية :

post-152370-1211987412_thumb.png

:hmm:

أبو خالد السوري

#20

؟؟؟

:resentful:

هل اللغز صعب إلى هذه الدرجة ..؟؟!!

أم أنه بسيط و سهل لدرجة أنه لم يأبه له أحد ..؟؟!!

إن كان هناك شيء غامض أو غير واضح في البيانات أو في السؤال المطروح .. فسأجيب عن أي استفسار بهذا الشأن ..

أبو خالد السوري

#21

ملاحظة اخي خالد السوري وعفوا سلفا اذا كنت مخطيء

بعض الحلول في الحقيقة عبارة عن حلول في لغة اوراكل

ونحن نعلم ان اوراكل ترجع الصعب سهلا بفضل قوتها

خصوصا في هاته الحالة التي تتعامل فيها مع الدالة is not null

عموما بالتوفيق للمشاركين ويسعدنا دوما رؤيه الغازك الشيقة

#22

أخي محمد رياض أهلاً بك ..

أولاً : الحلول التي تم تقديمها حتى الآن تم تطبيقها على MySQL و ليس Oracle

ثانياً : جميع الحلول يمكن تطبيقها على أي نظام آخر (ربما مع بعض التعديلات البسيطة)

لأن معظم الدوال المستخدمة (إن لم يكن كلها) موجودة في SQL القياسية

و بالتالي موجودة بشكل أو بآخر في جميع نظم إدارة قواعد البيانات المعروفة مثل :

PostgreSQL , DB2 , MS SQL Server , MySQL , Oracle

http://troels.arvin.dk/db/rdbms/

ثالثاً : أي حل لا يعتمد على SQL القياسية بل ينطبق على نظام معين فقط .. هو حل مقبول أيضاً

رابعاً : عبارة is not null موجودة في SQL القياسية و في جميع النظم المذكورة ..

خامساً : اسمي أبو خالد , و ليس خالد ..

(( سأبدأ أغار من ابني ..!! ))

سادساً : أنا أيضاً يسعدني رؤية تعليقاتاكم و تفاعلكم مع موضوعي .. حتى لو لم تكن مشاركات في حل الألغاز

أبو خالد السوري

#23

شكرا على التوضيح سيد أبو خالد والله يحفظلك خالد يارب

#24

السلام عليكم

السؤال الخامس


IF(Winter2004 ='-',NULL,Winter2004),
IF(Spring2004 ='-',NULL,Spring2004)
) Lecturer from Course;
Select Concat_ws(',',IF(Fall2003 ='-',NULL,Fall2003),

I Say Nothing

#25

:clapping:

مرحى لكِ

الجواب صحيح 100%

أبو خالد السوري

مواضيع مشابهة