ترجمة آلية تحت المراجعة
أغاني
المصدر الأصليقائمة تنفيذ التمرين
تُحفظ علامات هذه القائمة على هذا الجهاز والمتصفح فقط. أنشئ حسابًا مفعّلًا لحفظ إنجاز التمرين في مسارك.
أغاني

مشكلة بحاجة إلى حل
اكتب استعلامات SQL للإجابة على الأسئلة حول قاعدة بيانات تضم أكثر 100 أغنية بثًا على سبوتيفاي في عام 2018.
تجريبي
البدء
بالنسبة لهذه المشكلة، ستستخدم قاعدة البيانات المقدمة لك من قبل موظفي CS50.
قم بتنزيل كود التوزيع
مفتوح VS Code.
ابدأ بالنقر داخل النافذة الطرفية، ثم قم بالتنفيذ cd بمفرده. يجب أن تجد أن "المطالبة" الخاصة بها تشبه ما يلي.
$
انقر داخل تلك النافذة الطرفية ثم قم بالتنفيذ
wget https://cdn.cs50.net/2026/x/psets/7/songs.zip
متبوعًا بـ Enter لتنزيل ملف مضغوط يسمى songs.zip في مساحة الشيفرة الخاصة بك. احرص على عدم إغفال المسافة بينهما wget وعنوان URL التالي، أو أي حرف آخر في هذا الشأن!
نفذ الآن
unzip songs.zip
لإنشاء مجلد يسمى songs. لم تعد بحاجة إلى ملف ZIP، حتى تتمكن من التنفيذ
rm songs.zip
ثم قم بالرد بـ "y" متبوعًا بـ Enter عند المطالبة لإزالة ملف ZIP الذي قمت بتنزيله.
الآن اكتب
cd songs
متبوعًا بـ Enter للانتقال إلى (i.e.، open) هذا الدليل. يجب أن تشبه مطالبتك الآن ما يلي.
songs/ $
إذا كان كل شيء ناجحًا، فيجب عليك التنفيذ
ls
ومن المفترض أن تشاهد 8 ملفات .sql، songs.dbو answers.txt.
إذا واجهت أي مشكلة، فاتبع نفس الخطوات مرة أخرى لترى ما إذا كان بإمكانك تحديد الخطأ الذي ارتكبته!
الفهم
تم توفير ملف يسمى songs.db، قاعدة بيانات SQLite التي تقوم بتخزين البيانات منها سبوتيفاي عن الأغاني وفنانيها. تحتوي مجموعة البيانات هذه على أفضل 100 أغنية يتم بثها على Spotify في عام 2018. في النافذة الطرفية، قم بتشغيل sqlite3 songs.db حتى تتمكن من البدء في تنفيذ الاستعلامات على قاعدة البيانات.
أولاً، متى
يطالبك sqlite3 بتقديم استعلام، اكتب .schema ثم اضغط على زر الإدخال. سيؤدي هذا إلى إخراج
عبارات CREATE TABLE التي تم استخدامها لإنشاء كل جدول من الجداول في قاعدة البيانات. ومن خلال فحص تلك البيانات، يمكنك التعرف على الأعمدة الموجودة في كل جدول.
لاحظ أن كل artist لديه id و أ name. لاحظ أيضًا أن كل أغنية لها عنوان name، أ artist_id (الموافق id لفنان الأغنية)، بالإضافة إلى قيم القدرة على الرقص، والطاقة، والمفتاح، وارتفاع الصوت، والكلام (وجود الكلمات المنطوقة في المسار)، والتكافؤ، والإيقاع، ومدة الأغنية (يتم قياسها بالمللي ثانية).
التحدي الذي أمامك هو كتابة استعلامات SQL للإجابة على مجموعة متنوعة من الأسئلة المختلفة عن طريق تحديد البيانات من واحد أو أكثر من هذه الجداول. بعد القيام بذلك، عليك التفكير في الطرق التي قد يستخدم بها Spotify هذه البيانات نفسها في بياناته السنوية غلاف سبوتيفي حملة لتوصيف عادات المستمعين.
تفاصيل التنفيذ
لكل مشكلة من المشاكل التالية، يجب عليك كتابة استعلام SQL واحد لإخراج النتائج المحددة بواسطة كل مشكلة. يجب أن تأخذ إجابتك شكل استعلام SQL واحد، على الرغم من أنه يمكنك دمج استعلامات أخرى داخل استعلامك. أنت لا ينبغي افترض أي شيء بخصوص idلأي أغانٍ أو فنانين معينين: يجب أن تكون استفساراتك دقيقة حتى لو كان id لأي أغنية أو شخص معين كانت مختلفة. أخيرًا، يجب أن يُرجع كل استعلام فقط البيانات اللازمة للإجابة على السؤال: إذا كانت المشكلة تطلب منك فقط إخراج أسماء الأغاني، على سبيل المثال، فيجب ألا يُخرج استعلامك أيضًا إيقاع كل أغنية.
- في
1.sql، اكتب استعلام SQL لسرد أسماء جميع الأغاني في قاعدة البيانات.- يجب أن يُخرج استعلامك جدولاً يحتوي على عمود واحد لاسم كل أغنية.
- في
2.sql، اكتب استعلام SQL لسرد أسماء جميع الأغاني بترتيب متزايد للإيقاع.- يجب أن يُخرج استعلامك جدولًا يحتوي على عمود واحد لاسم كل أغنية.
- في
3.sql، اكتب استعلام SQL لسرد أسماء أطول 5 أغانٍ، بترتيب تنازلي من حيث الطول.- يجب أن يُخرج استعلامك جدولاً يحتوي على عمود واحد لاسم كل أغنية.
- في
4.sql، اكتب استعلام SQL يسرد أسماء أي أغانٍ تتمتع بقدرة رقص وطاقة وتكافؤ أكبر من 0.75.- يجب أن يُخرج استعلامك جدولًا يحتوي على عمود واحد لاسم كل أغنية.
- في
5.sql، اكتب استعلام SQL يُرجع متوسط الطاقة لجميع الأغاني.- يجب أن يُخرج استعلامك جدولًا يحتوي على عمود واحد وصف واحد يحتوي على متوسط الطاقة.
- في
6.sql، اكتب استعلام SQL يسرد أسماء الأغاني التي كتبها Post Malone.- يجب أن يُخرج استعلامك جدولًا يحتوي على عمود واحد لاسم كل أغنية.
- يجب ألا تضع أي افتراضات حول ما يقوله Post Malone
artist_idهو.
- في
7.sql، اكتب استعلام SQL يُرجع متوسط طاقة الأغاني التي كتبها دريك.- يجب أن يُخرج استعلامك جدولًا يحتوي على عمود واحد وصف واحد يحتوي على متوسط الطاقة.
- يجب ألا تضع أي افتراضات حول ما يقوله دريك
artist_idهو.
- في
8.sql، اكتب استعلام SQL يسرد أسماء الأغاني التي تضم فنانين آخرين.- الأغاني التي تضم فنانين آخرين ستتضمن "الفذ". باسم الاغنية.
- يجب أن يُخرج استعلامك جدولاً يحتوي على عمود واحد لاسم كل أغنية.
تلميحات
انظر مرجع الكلمات الأساسية لـ SQL لبعض صيغ SQL التي قد تكون مفيدة!
قائمة بأسماء جميع الأغاني في قاعدة البيانات
تذكر أنه لتحديد كافة القيم في عمود الجدول، يمكنك استخدام SQL SELECT الكلمة الأساسية. SELECT يتبعه العمود (أو الأعمدة) الذي ترغب في تحديده، والذي يتبعه بدوره FROM table حيث table هو اسم الجدول الذي تريد الاختيار منه.
في 1.sql، حاول كتابة ما يلي:
-- All songs in the database.
SELECT name
FROM songs;
قم بإدراج أسماء جميع الأغاني بترتيب متزايد للإيقاع
تذكر أن SQL يحتوي على ORDER BY الكلمة الأساسية، والتي يمكنك من خلالها ترتيب نتائج استعلامك حسب القيمة الموجودة في عمود معين. على سبيل المثال،
سيقوم ORDER BY tempo بترتيب النتائج حسب العمود tempo.
في 2.sql، حاول كتابة ما يلي:
-- All songs in increasing order of tempo.
SELECT name
FROM songs
ORDER BY tempo;
قائمة بأسماء أطول 5 أغاني بترتيب تنازلي من حيث الطول
تذكر ذلك
يمكن ORDER BY ليس من الضروري دائمًا الفرز بترتيب تصاعدي. يمكنك تحديد فرز نتائجك تنازلي الترتيب عن طريق الإلحاق DESC. على سبيل المثال، ORDER BY duration_ms DESC سوف يسرد النتائج بترتيب تنازلي حسب المدة.
وتذكر ذلك أيضًا
يمكن لـ LIMIT n تحديد أنك تريد فقط الصفوف \(n\) الأولى التي تطابق استعلامًا محددًا. على سبيل المثال،
سيعرض LIMIT 5 النتائج الخمس الأولى فقط للاستعلام.
في 3.sql، حاول كتابة ما يلي:
-- The names of the top 5 longest songs, in descending order of length.
SELECT name
FROM songs
ORDER BY duration_ms DESC
LIMIT 5;
قم بإدراج أسماء أي أغاني تتمتع بقدرة رقص وطاقة وتكافؤ أكبر من 0.75
تذكر أنه يمكنك تصفية النتائج في SQL باستخدام
عبارات WHERE ، والتي تتبعها بعض الشروط التي تختبر عادةً القيم الموجودة في أعمدة الصف.
تذكر أيضًا أن عوامل تشغيل SQL تعمل بنفس الطريقة التي تعمل بها عوامل تشغيل C. على سبيل المثال،
يتم تقييم > إلى "صحيح" عندما تكون القيمة الموجودة على اليسار أكبر من القيمة الموجودة على اليمين. يمكنك ربط هذه التعبيرات معًا باستخدام AND أو OR، لتكوين شرط واحد أكبر.
في 4.sql، حاول كتابة ما يلي:
-- The names of any songs that have danceability, energy, and valence greater than 0.75.
SELECT name
FROM songs
WHERE danceability > 0.75 AND energy > 0.75 AND valence > 0.75;
ابحث عن متوسط الطاقة لجميع الأغاني
تذكر أن SQL تدعم الكلمات الأساسية ليس فقط لتحديد صفوف معينة، ولكن أيضًا مجمعة البيانات الموجودة في تلك الصفوف. على وجه الخصوص، قد تجد AVG الكلمة الأساسية (لحساب المتوسطات) مفيدة. لتجميع نتائج عمود، ما عليك سوى تطبيق وظيفة التجميع على هذا العمود. على سبيل المثال،
سيجد SELECT AVG(energy) متوسط القيم الموجودة في عمود الطاقة للاستعلام المحدد.
في 5.sql، حاول كتابة ما يلي:
-- The average energy of all the songs.
SELECT AVG(energy)
FROM songs;
قائمة بأسماء الأغاني التي كتبها Post Malone
لاحظ أنه إذا قمت بالتنفيذ .schema songs في موجه sqlite الخاص بك، songs يحتوي على أسماء الأغاني وليس أسماء الفنانين! بدلا من ذلك، songs لديه
عمود artist_id . لسرد أسماء الأغاني لـ Post Malone، ستحتاج أولاً إلى تحديد معرف الفنان لـ Post Malone.
-- Identify Post Malone's artist id
SELECT id
FROM artists
WHERE name = 'Post Malone';
يُرجع هذا الاستعلام 54. الآن، يمكنك الاستعلام عن songs جدول لأي أغنية بمعرف Post Malone.
SELECT name
FROM songs
WHERE artist_id = 54;
ولكن، وفقًا للمواصفات، يجب أن تضع في اعتبارك عدم افتراض المعرفة بأي معرفات. يمكنك تحسين تصميم هذا الاستعلام عن طريق التداخل استفسارك.
في 6.sql، حاول كتابة ما يلي:
-- The names of songs that are by Post Malone.
SELECT name
FROM songs
WHERE artist_id =
(
SELECT id
FROM artists
WHERE name = 'Post Malone'
);
ابحث عن متوسط طاقة الأغاني التي كتبها دريك
لاحظ أنه، كما هو الحال مع الاستعلام السابق، ستحتاج إلى دمج جداول متعددة لتشغيل هذا الاستعلام بنجاح. يمكنك مرة أخرى استخدام الاستعلامات الفرعية المتداخلة، ولكن فكر في طريقة أخرى أيضًا!
تذكر أنه يمكنك استخدام SQL JOIN الكلمة الأساسية لدمج جداول متعددة في جدول واحد، طالما أنك تحدد الأعمدة عبر تلك الجداول التي يجب أن تتطابق في النهاية. على سبيل المثال، ينضم الاستعلام التالي إلى songs و artists الجداول، مما يشير إلى أن
عمود artist_id في songs الجدول و
عمود id في
يجب أن يتطابق جدول artists مع:
SELECT *
FROM songs
JOIN artists ON songs.artist_id = artists.id
مع الجمع بين هذين الجدولين، فإن الأمر يتعلق فقط بتصفية اختيارك للعثور على متوسط طاقة الأغاني التي كتبها دريك.
في 7.sql، حاول كتابة ما يلي:
-- The average energy of songs that are by Drake
SELECT AVG(energy)
FROM songs
JOIN artists ON songs.artist_id = artists.id
WHERE artists.name = 'Drake';
قائمة بأسماء الأغاني التي تضم فنانين آخرين
بالنسبة لهذا الاستعلام، لاحظ أن الأغاني التي تضم فنانين آخرين عادةً ما تتضمن بعض الإشارة إلى "الفذ". في عنوانهم. تذكر أن SQL
يمكن استخدام الكلمة الرئيسية LIKE لمطابقة السلاسل بعبارات معينة (مثل "feat".!). للقيام بذلك، يمكنك استخدام %: حرف بدل يطابق أي تسلسل من الأحرف.
في 8.sql، حاول كتابة ما يلي:
-- The names of songs that feature other artists.
SELECT name
FROM songs
WHERE name LIKE '%feat.%';
الإرشادات التفصيلية
لست متأكدًا من كيفية الحل؟
غلاف سبوتيفي
غلاف سبوتيفي هي ميزة تعرض أكثر 100 أغنية تشغيلًا لمستخدمي Spotify خلال العام الماضي. في عام 2021، قام Spotify Wrapped بحساب "هالة الصوت" لكل مستخدم، "قراءة لأبرز حالتين مزاجيتين [لهما] وفقًا لما يمليه [هم] أفضل الأغاني والفنانين لهذا العام." لنفترض أن Spotify يحدد الهالة الصوتية من خلال النظر إلى متوسط الطاقة والتكافؤ والقدرة على الرقص لأفضل 100 أغنية لشخص ما من العام الماضي. في answers.txtفكر في الأسئلة التالية:
- إذا
songs.dbيحتوي على أفضل 100 أغنية لمستمع واحد من عام 2018، كيف تصف الهالة الصوتية الخاصة بهم؟ - افترض لماذا قد تكون الطريقة التي حسبت بها هذه الهالة لا يكون ممثلًا جدًا للمستمع. ما هي أفضل الطرق لحساب هذه الهالة التي تقترحها؟
تأكد من الإرسال answers.txt مع كل منكم .sql الملفات!
كيفية الاختبار
صحة
check50 cs50/problems/2026/x/songs
كيفية الإرسال
في جهازك الطرفي، قم بتنفيذ ما يلي لإرسال عملك، والإجابة على المطالبات التي تظهر أيضًا.
submit50 cs50/problems/2026/x/songs