ביצוע שאילתות באמצעות SQL
הוצג| English | משמעות |
|---|---|
| SQL/ˌes kjuː ˈel/ | שפת שאלות מבנית (SQL) |
| JOIN/dʒɔɪn/ | חיבור |
| GROUP BY/ɡruːp baɪ/ | קבוצה לפי |
שני קורסים שוניםpartageing כותרת
- שני קורסים נקראים שניהם רובוטיקה. קיבוץ רק לפי כותרת מאחד את ההרשמות שלהם ומסתיר שהם קורסים שונים.
- SQL מתאר את תוצאת הנתונים שאתה רוצה. בדוק זהות שורה ותפוקה מצופה לפני שתסמוך לספירה סבירה.
מעקב אחר היחס ב-JOIN
- JOIN משלב שורות באמצעות יחס כמו
e.course_id = c.id. כתוב את היחס הרצוי במפורש. - Cross join זוגי כל ש בצד אחד עם כל ש בצד השני. ב-SQLite, JOIN ללא הגבלות יכול לייצר מכפל כזה; מערכות SQL אחרות עשויות לדחות תנאי JOIN חסרים.
ב-SQLite, חיבור ללא הגבלה (unconstrained join) זוגי שלושה קורסים עם שלוש הרשמות. כמה זוגות הוא יכול ליצור?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
מכפלת צלב מייצרת 3 × 3 שורות, לפני כל סינון נוסף.
שמירת קורסים ללא רשום
- שילוב שמאלי (LEFT JOIN) שומר על כל הקורסים, כולל קורס שאין לו רישום תואם. שדות הרישום שאינם תואמים יהיו null.
- ספירה ב-
e.student_id, שמשתמעת nulls, במקום ב-COUNT(*), שהיא סופרת גם את השורה הבלתי תואמת שנשמרה. הקורס הריק אמור לדווח על אפס.
איזה ביטוי סופר נכון אפס הרשמות לקורס המחובר משמאל שאינו תואם?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
COUNT בשדה ה-nullable שאינו תואם לא כולל ערכים NULL; COUNT(*) סופר את השורה הנשמרת.
הרצת שאילתה עם תשובות ידועות
- הרץ סקריפט מלא זה במאגר נתונים SQLite מקומי. שני קורסי הרובוטיקה שלו הם בעלי IDs שונים, ואילו לאמנות אין בהם רשומים.
- GROUP BY מקבץ לפי ID קורס וכותרת. השורות המצופות הן
(7, Robotics, 1),(8, Robotics, 2)ו-(9, Art, 0).
CREATE TABLE courses (id INTEGER PRIMARY KEY, title TEXT NOT NULL);
CREATE TABLE enrolments (student_id INTEGER, course_id INTEGER);
INSERT INTO courses VALUES (7, 'Robotics'), (8, 'Robotics'), (9, 'Art');
INSERT INTO enrolments VALUES (1, 7), (1, 8), (2, 8);
SELECT c.id, c.title, COUNT(e.student_id) AS enrolled
FROM courses AS c
LEFT JOIN enrolments AS e ON e.course_id = c.id
GROUP BY c.id, c.title
ORDER BY c.id;
השלם את הסעיף שמסדר לפי זהות הקורס וכותרת: ____ c.id, c.title
Difficulty 1/5 · 100 coins + a small bonus on first completion today
GROUP BY מגדיר את הקבוצות. כלל ID שומר על הפרדה בין קורסים בעלי אותה כותרת.
אילו ספירות הרשמה מחזירה השאלה המלאה עבור מזהי קורס 7, 8 ו-9?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
בדוגמה יש התאמה אחת ל-7, שתיים ל-8 ואף אחת ל-9.
סינון שורות ומחלקות בשלבים שונים
WHEREמסנן שורות כניסה לפני המקבוצה.HAVINGמסנן מחלקות באמצעות תנאי כמוCOUNT(e.student_id) >= 2.- בדוגמה זו, הוספת תנאי HAVING לפני ORDER BY תחזיר רק את הקורס 8. סינון
e.student_idב-WHERE עלול להסיר את השורות הבלתי תואמות שרצית לשמור.
איזה סעיף מסנן קבוצות לאלו שמכילות לפחות שני תלמידים רשומים?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
HAVING חל תנאי על קבוצות; WHERE מסנן שורות קלט.
הסבר את WHERE ו-HAVING באמצעות דוגמת ספירת הקורסים.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
WHERE מסנן שורות; HAVING בודק את הספירה בכל קבוצה.
שימוש במקרים קיצוניים לבדיקת התוצאה
- בדוק כותרות חוזרות, התאמות אפס והתאמות מרובות מול ספירות ידועות. תוצאה שנראית הגיונית אינה מספקת.
- הסבר את השדות הנבחרים, תנאי השילוב, המקבוצה והספירה. החלט האם שורות יחס כפולות תקפות או שיש למנוע אותן באמצעות הסכמה.
שלב על היחס, מקבץ לפי זהות, וספור את הדבר המתכוון. מאגר נתונים קטן וידוע הופך שאילתות שגויות לקלות יותר לזיהוי.
ספירה סבירה מספיקה כדי להוכיח שהשאלה ב-SQL נכונה.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
השווה שורות צפויים ידועים, כולל אפס התאמות וכותרות חוזרות.
הערכת קבוצות רק לפי הכותרת שומרת על ההפרדה בין שני קורסי הרובוטיקה.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
כותרות זהות יוצרות קבוצה אחת. הסדר לפי זהות הקורס גם כן.