SELECT النجمة: تعلّم SQL بالقراءة والتمرين › آخر عبارة لـ Beazley 2 / 6 السابق التالي

التصريح الأخير لبيزلي

قضية بيزلي

في عام 1994، أطلق Napoleon Beazley النار على رجل الأعمال John Luttig، البالغ 63 عامًا، في مرآب سيارته أثناء محاولته سرقة سيارة العائلة. ولأنه كان قد ناهز الثامنة عشرة بقليل وقت القتل، أشعلت قضية بيزلي جدلًا حادًا حول عقوبة الإعدام بحق الأحداث. وبعد ثلاث سنوات من إعدام بيزلي، حظرت المحكمة العليا إعدام الجناة الذين كانوا دون الثامنة عشرة وقت ارتكاب جريرتهم (Roper v Simmons, 2005).

وكانت القضية جديرة بالملاحظة أيضًا لأن الضحية كان والد القاضي الفدرالي John Michael Luttig. وأثناء الطعون المرفوعة إلى المحكمة العليا، تنحّى ثلاثة من القضاة التسعة بسبب صلاتهم الشخصية بالقاضي Luttig، فلم يبقَ سوى ستة لمراجعة القضية.

أدلى Napoleon Beazley بتصريح أخير مفعم بالمشاعر يحتجّ فيه بأن العين بالعين لا تحقق العدالة. ومهمتنا هي استرجاع تصريحه من قاعدة البيانات (database).

أول استعلام SQL

قد يبدو استعلام (query) SQL كجملة عادية، لكن ينبغي أن تراه ثلاث قطع من مكعبات الليغو: SELECT * FROM executions LIMIT 3. ومثل الليغو، لكل قطعة صيغة ثابتة، وعلى القطع المختلفة أن تتلاءم معًا بطرق محدّدة.

كتلة SELECT

تحدّد كتلة SELECT الأعمدة (columns) التي تريد إخراجها. صيغتها SELECT <column>, <column>, ... . يجب فصل كل عمود عن الذي يليه بفاصلة، لكن المسافة بعد الفاصلة اختيارية. والنجمة (أي *) محرف خاص يدل على أننا نريد كل الأعمدة في الجدول (table).

تعليقات SQL

لاحظ أن النقر على "Show Solution" يعرض الحل في المحرّر مسبوقًا بـ /*. ويُعتبر ما بين /* و*/ تعليقًا لا يُنفَّذ كشيفرة. وهذا مفيد لإخفاء شيفرة لا نريد تشغيلها مؤقتًا. ولتشغيل الحل، ما عليك سوى حذف شيفرتك أو تحويلها إلى تعليق وإلغاء تعليق الحل.

و-- طريقة أخرى للإشارة إلى التعليقات. تُستخدم لتحويل بقية السطر الواحد إلى تعليق. وعندما تكون لدينا أسطر متعددة نريد تحويلها إلى تعليقات، يكون /* ... */ أكثر ملاءمة من إضافة -- إلى بداية كل سطر.

كتلة FROM

تحدّد كتلة FROM الجدول الذي نستعلم منه. صيغتها FROM <table> . وتأتي دائمًا بعد كتلة SELECT.

في المثال التالي، لاحظ أننا لا نحتاج كتلة FROM إن لم نكن نستخدم شيئًا من جدول.

أليس غريبًا أن 51 / 2 تعطي 25 بدلًا من 25.5؟ السبب أن SQL تجري قسمة صحيحة (integer division). ولإجراء قسمة عشرية، يجب أن يكون أحد المعاملين على الأقل عشريًا، مثل 51.0 / 2. ومن الحيل الشائعة ضرب أحد العددين في 1.0 لتحويله إلى عدد عشري. وسيكون هذا مفيدًا في الفصول اللاحقة.

حالة الأحرف

رغم أننا كتبنا SELECT وFROM وLIMIT بأحرف كبيرة، فإن أوامر SQL ليست حساسة لحالة الأحرف (case-sensitive). ويمكنك أن ترى أن محرّر الشيفرة يتعرّف عليها وينسّقها كأمر مهما كانت حالة الأحرف. ومع ذلك، أنصح بكتابتها بأحرف كبيرة لتمييزها عن أسماء الأعمدة والجداول والمتغيرات.

كما أن أسماء الأعمدة والجداول والمتغيرات ليست حساسة لحالة الأحرف في هذه النسخة من SQL، وإن كانت حساسة لها في نسخ أخرى كثيرة. وللاحتياط، أنصح بافتراض أنها حساسة لحالة الأحرف دائمًا.

المسافات البيضاء

تشير المسافات البيضاء (whitespace) إلى المسافات وعلامات الجدولة وفواصل الأسطر وغيرها من المحارف التي تُعرض فراغًا على الصفحة. وكما في حالة الأحرف، ليست SQL حساسة كثيرًا للمسافات البيضاء ما دمت لا تدمج كلمتين في كلمة واحدة. أي أنه يكفي وجود محرف مسافة بيضاء واحد على الأقل حول كل أمر — ولا يهم أي محرف هو أو كم عددها. وما لم يكن الاستعلام قصيرًا، أفضّل وضع كل أمر في سطر جديد لتحسين الوضوح.

كتلة WHERE

تتيح لنا كتلة WHERE تصفية الجدول لاستخراج الصفوف (rows) التي تحقق شروطًا معيّنة. صيغتها WHERE <clause> وتأتي دائمًا بعد كتلة FROM. وهنا تشير العبارة الشرطية (clause) إلى عبارة منطقية يمكن للحاسوب تقييمها إلى صواب أو خطأ مثل ex_number = 145. ويمكنك أن تتخيل أن الحاسوب سيمرّ على كل صف في الجدول فاحصًا ما إذا كانت العبارة صحيحة، وإن كانت كذلك أعاد الصف.

من الواضح كيف يمكننا استخدام معاملات حسابية (operators) مثل < و<= لبناء عبارات شرطية. وهناك أيضًا مجموعة من معاملات النصوص (strings) للتعامل مع النصوص.

وأقواها على الأرجح هو LIKE. فهو يتيح لنا استخدام محارف بديلة (wildcards) مثل % و_ لمطابقة محارف متنوعة. على سبيل المثال، first_name LIKE '%roy' ستُعيد صوابًا للصفوف التي تحمل الأسماء الأولى 'roy' و'Troy' و'Deroy' لكن ليس 'royman'. أما المحرف البديل _ فيطابق محرفًا واحدًا، لذا first_name LIKE '_roy' سيطابق 'Troy' فقط.

علامات التنصيص

في SQL، تُكتب النصوص بعلامات تنصيص مفردة. ويمكن استخدام علامات الاقتباس العكسية (backticks) (أي `) للإشارة إلى أسماء الأعمدة والجداول. وهذا مفيد عندما يكون اسم العمود أو الجدول مطابقًا لكلمة مفتاحية في SQL، وعندما يحتوي على مسافة. فمن الممكن أن تكون لدينا قاعدة بيانات فيها جدول باسم 'where' وعمود باسم 'from'. (ومن قد يقسو إلى هذا الحد؟!) عندئذ سيتعيّن عليك كتابة SELECT `from` FROM `where` WHERE ... . وهذا مثال آخر على فائدة كتابة أوامر SQL بأحرف كبيرة.

وكما رأيت في التمرين السابق، يمكن بناء عبارات شرطية معقّدة من عبارات بسيطة باستخدام معاملات منطقية (Boolean) مثل NOT وAND وOR. وتعطي SQL أعلى أسبقية لـ NOT ثم AND وأخيرًا OR. ولكن إن كنت مثلي كسولًا ولا تحب تذكّر ترتيب الأسبقية، فيمكنك استخدام الأقواس لتوضيح الترتيب الذي تريده.

لنُجرِ اختبارًا سريعًا لترسيخ فهمك.

الآن أصبحت لديك الأدوات اللازمة لإكمال مشروعنا.

أليس مذهلًا كم كان بيزلي عميقًا وبليغًا؟ تذكّر أنه لم يكن سوى في الخامسة والعشرين حين أدلى بتصريحه، وقد ظل في السجن منذ الثامنة عشرة.

الخلاصة

كان هدف هذا الفصل تقديم الصيغة الأساسية لكن القوية SELECT <column> FROM <table> WHERE <clause> . فهي تتيح لنا تصفية جدول بأن يمرّ الحاسوب صفًا صفًا ويختار تلك الصفوف التي تكون فيها عبارة WHERE صحيحة. وقد تعلّمنا أيضًا كيف نركّب عبارات شرطية معقّدة إلى حد ما تعمل على أعمدة نصية ورقمية ومنطقية القيم.

وحتى الآن، كنا نعمل على مستوى الصف (row)، وهو ما حصرنا في النظر إلى نقاط بيانات فردية. وفي الفصل التالي، سنركّز على التجميعات (aggregations) التي ستتيح لنا دراسة ظواهر على مستوى النظام.