המקרה של ביזלי (Beazley’s case)

בשנת 1994 ירה נפוליאון בג’ון לוטיג, איש עסקים בן 63, במוסך הביתי שלו תוך כדי ניסיון לגנוב את רכב המשפחה. מכיוון שהוא היה בן פחות מ-18 בזמן הרצח, עורר המקרה של ביזלי ויכוח בנוגע לעונש המוות לעבריינים צעירים. שלוש שנים לאחר הוצאתו להורג של ביזלי, בית המשפט העליון אסר על הוצאתם להורג של עבריינים שהיו בני פחות מ-18 בזמן ביצוע העבירה (Roper v Simmons, 2005).

המקרה הזה ראוי לציון גם מפני שהקורבן היה אביו של השופט הפדראלי ג’ון מייקל לוטיג. במסגרת הדיון בבית המשפט העליון, שלושה מתוך תשעה שופטים פסלו את עצמם בשל קשריהם האישיים עם השופט לוטיג, והותירו שישה שופטים בלבד לדון במקרה.

נפוליאון ביזלי טען בדברים הנלהבים שנשא לפני הוצאתו להורג כי העקרון של עין תחת עין אינו בסיס לצדק. המשימה שלנו היא לאחזר (retrieve) את הדברים שלו מתוך בסיס הנתונים.


שאילתת SQL ראשונה

שאילתת ה-SQL עשויה להיראות כמשפט רגיל, אבל כדאי שתסתכלו עליה כעל שלוש לבנים, או שלושה בלוקים:

SELECT * FROM executions LIMIT 3.
כמו בלגו, לכל לבנה יש מבנה קבוע והלבנים השונות צריכות להתחבר בדרך כזו או אחרת.


בלוק ה-SELECT

בלוק ה-SELECT מפרט אילו טורים אתם רוצים שייכללו בפלט. המבנה שלו הוא
SELECT <column>, <column>,... . כל טור צריך להיות מפורד על ידי פסיק, אבל הרווח שאחרי הפסיק אינו הכרחי. סימן הכוכב (*) הוא תו מיוחד שמסמן שאנחנו רוצים את כל הטורים שבטבלה.

הערות ב-SQL

שימו לב שלחיצה על "הצגת פתרון" מציגה בעורך הקוד את הפתרון כשלפני מופיעים הסימנים `*/`. התוכן שמופיע בין */ לבין /* נחשב כהערות ולא יופעל כחלק מהקוד. זוהי דרך נוחה למנוע באופן זמני הרצה של קוד שאיננו מעוניינים שיופעל. כדי להריץ את הפתרון שלנו, עליכם פשוט למחוק או לסמן כהערה את הקוד שלכם ולהסיר את סימני ההערה מסביב לפתרון שהצגנו לכם.

הרצף -- הוא דרך נוספת לסמן טקסט כהערה. הוא משמש לסמן את המשך השורה כהערה. כאשר יש לנו כמה שורות רצופות שברצוננו לסמן כהערה השימוש ב-/* ... */ יהיה נח יותר מאשר להוסיף -- בתחילת כל שורה.


בלוק ה-FROM

בלוק ה-FROM מפרט מאיזו טבלה אנחנו מבצעים את השאילתה. המבנה של הבלוק הוא <שם_טבלה> FROM . הוא תמיד יופיע אחר בלוק ה-SELECT

בדוגמה הבאה, שימו לב שאנחנו לא צריכים את בלוק ה-FROM אם איננו משתמשים בפריט כלשהוא מהטבלה.

האם זה לא מוזר ש- 51/2 מציג 25 במקום 25.5? זה קורה מפני ש-SQL מבצעת חלוקה בין מספרים שלמים (integers). על מנת לבצע חלוקה בין מספרים עשרוניים (decimals), לפחות אחד מן הגורמים (operands) חייב להיות מספר עשרוני, למשל 51.0/2. זה טריק מקובל להכפיל את אחד המספרים ב-1.0 כדי להמיר אותו למספר עשרוני. זה יהיה שימושי בפרקים הבאים.

אותיות אנגליות גדולות (Capitalization)

למרות שכתבתנו את המלים SELECT, FROM ו-LIMIT באותיות אנגליות גדולות, פקודות SQL אינן רגישות להבדלים בין אותיות גדולות וקטנות (case-insensitive). תוכלו לראות שעורך הקוד מכיר אותן ומתייחס אליהן כפקודות במנותק מצורת האותיות. למרות זאת, אני ממליץ לרשום את פקודות ה-SQL באותיות גדולות (capitalized) כדי להבדיל ביניהן לבין שמות הטורים, שמות הטבלאות ושמות משתנים.

שמות טורים, שמות טבלאות ושמות משתנים גם כן אינם רגישים להבדלים בין אותיות קטנות לגדולות בגרסה הזו של SQL, אבל הם כן case-sensitive בגרסאות רבות אחרות. כדי לעבוד בצורה בטוחה, אני ממליץ תמיד לניח שישנה רגישות להבדלים בין אותיות קטנות לגדולות.

רווחים

הכוונה ברווחים היא לרווח, טאבם, שבירת שורה ותווים אחרים שמוצגים בעמוד כמרווח ריק. בדומה לאותיות אנגליות גדולות/קטנות (Capitalization), SQL אינה רגישה מאוד לרווחים, כל עוד לא תאחדו שתי מלים נפרדות למילה אחת. המשמעות היא שחייב להיות לפחות תו אחד של רווח משני הצדדים של כל פקודה – לא משנה איזה מן התווים המייצגים מרווח ריק ובכמה תווים כאלו תשתמשו. למעט שאילתות קצרות, אני מעדיף לשים כל פקודה בשורה חדשה כדי להקל את הקריאה של השאילתה.


בלוק ה-WHERE

בלוק ה-`WHERE` מאפשר לנו לסנן את השורות שעומדות בתנאים מסויימים מתוך הטבלה. המבנה של הבלוק הוא WHERE <clause> והוא תמיד יופיע אחרי בלוק ה-`FROM`. כאן, הפסקה מייצרת ביטוי בוליאני (Boolean statement) שהמחשב יכול לחשב כאמת או שקר, כמו ex_number = 145. אתם יכולים לדמיין איך המחשב עובר שורה אחרי שורה בטבלה ויבדוק אם הביטוי בפסקה אמיתי, ואם כן, יוסיף את השורה.

די ברור איך אנחנו יכולים להשתמש באופרטרים אריתמטיים כמו < ו-=> בבניית הפסקאות. יש גם אוסף של תווים שמשמשים כאופרטורים לעבודה עם מחרוזות תווים.

הדוגמה החזקה ביותר מתוך לה היא כנראה 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 ....
זוהי עוד דוגמה שממחישה מדוע שמירה על כתיבה באותיות גדולות (capitalization) של פקודות SQL יכולה לעזור.

כמו שראיתם בתרגילים הקודמים, פסקאות מורכבות יכולות להיווצר מחיבור של פסקאות פשוטות באמצעות אופרטורים בוליאנים כמו NOT (לא), AND (ו-) ו-OR (או). SQL מעניקה קדימות ל-NOT ואז ל-AND ולבסוף ל-OR. אבל אם אתם, כמוני, עצלנים מידי בכדי לזכור את סדר הקדימויות, תוכלו להשתמש בסוגריים כדי להבהיר את הסדר הרצוי.

בואו נבצע בוחן קטן כדי לקבע את ההבנה שלכם.

כעת נמצאים בידיכם הכלים הדרושים לכם כדי להשלים את הפרוייקט שלנו.

זה לא מדהים עד כמה עמוק ורב עוצמה ביזלי? זכרו שהוא רק בן 25 בזמן שהשמיע את המלים הללו ושהה בכלא מאז שהיה בן 18.


לסיכום

המטרה של הפרק הזה היתה להציג את המקטע הבסיסי אך העוצמתי
SELECT <column> FROM <table> WHERE <clause>. הוא מאפשר לנו לסנן טבלה על ידי כך שהמחשב עובר שורה אחר שורה ובוחר את השורות עבורן פסקת ה-WHERE נכונה.למדנו גם איך לחבר חד כמה פסקות מורכבות יחסית שניתן להפעיל על תווים, מספרים וטורים עם ערכים בוליאנים (אמת/שקר).

עד כה פעלנו רק ברמת השורה הבודדת, מה שהגביל אותנו לחיפוש ואיתור של נקודות מידע בודדות ונפרדות. בפרק הבא נתרכז בצבירות (aggregations) שיאפשרו לנו לחקור תופעה ברמה המערכתית.