חידון: פוסטגרס עמוק – חלק 1
האם SQL גורם לך לצרוח?
חלק 1 מתוך 2. מעבר לחלק 2
PostgreSQL 🐘 הוא ללא ספק מסד הנתונים המועדף עלי! אני תמיד לומד טריקים ותפניות חדשים, ולכן החלטתי לשים אותם במבחן חדש!
המבחן הזה משלב תכונות PostgreSQL מוכרות ופחות מוכרות, כולל תופעות קצה: מצבצרים מובנים, המרות סוגים, מגבלות ועוד.
בהצלחה! 🍀
איזה מהמרי הסוגים האלה לא תקין ❌?
PostgreSQL תומך בשלושה תחבירי המרה:
- ANSI SQL:
CAST(expression AS type). - PostgreSQL:
expression::type. - ליטרל בעל טיפוס:
type 'literal'.
כולם שווים מבחינה פונקציונלית, אך:
CAST()הוא הנייד ביותר.::ספציפי ל‑PostgreSQL אך נפוץ.- התחביר
type 'literal'פחות נפוץ אך עדיין תקף.
כמה ערכי NULL מותרים כאן?
CREATE TABLE student_emails ( student_id INTEGER, email VARCHAR(255), UNIQUE(email));אילוצי UNIQUE ב‑PostgreSQL:
- מאפשרים מספר ערכי NULL.
NULL≠NULLבבדיקות ייחודיות.
כדי למנוע ערכי NULL, הוסיפו NOT NULL:
CREATE TABLE student_emails ( student_id INTEGER, email VARCHAR(255) NOT NULL, UNIQUE(email));מה זה מחזיר?
SELECT '2024-11-27'::date + interval '24 hours';המרווחים (Intervals) הם כלי חזק לפישוט פעולות על טווחי תאריכים!
אריתמטיקת תאריכים ב‑PostgreSQL:
+ interval '24 hours'מוסיף 24 שעות+ interval '1 day'מוסיף יום אחד+ interval '1 month'מוסיף חודש אחד+ interval '1 year'מוסיף שנה אחת
התוצאה היא 2024-11-28 00:00:00.
טיפוסים מסחררים
איזה מבין אלו ❌ אינו סוג PostgreSQL תקף?
ל-PostgreSQL יש מגוון עשיר של סוגי נתונים, אך STRING(100) אינו אחד מהם.
הסוגים המחרוזתיים הנכונים כוללים:
VARCHAR(100)(מחרוזת באורך משתנה)CHAR(100)(מחרוזת באורך קבוע)TEXT(אורך בלתי מוגבל)CHARACTER VARYING(100)(זהה ל-VARCHAR(100))
איזה מבין אלו ❌ אינו סוג PostgreSQL תקף?
זה עשוי להיראות מוכר מכיוון ש-decimal128 הוא סוג במקומות רבים (כולל Mongo ו‑Java). הוא אינו סוג PostgreSQL תקף, decimal הוא.
הסוגים המספריים התקינים כוללים:
int(מספר שלם של 4 בתים)bigint(מספר שלם של 8 בתים)real(נקודה צפה של 4 בתים)double precision(נקודה צפה של 8 בתים)bigserial(מספר שלם אוטומטי של 8 בתים)smallserial(מספר שלם אוטומטי של 2 בתים)
מה קורה כשמחושבים כל מזהי הסטודנטים האפשריים?
SELECT 256 * 256 * 256 * 256;סוג integer של PostgreSQL הוא 32‑ביט עם סימן, בטווח מ--2,147,483,648 עד 2,147,483,647.
החישוב 256^4 = 4,294,967,296 חורג מהטווח.
כדי להתמודד עם מספרים גדולים יותר:
-- Use BIGINTSELECT 256::bigint * 256 * 256 * 256;
-- Or numeric for arbitrary precisionSELECT 256::numeric * 256 * 256 * 256;באיזו מהאפשרויות יש מספר ספרות אחרי הנקודה שהוא הקטן ביותר שעדיין חורג מהדיוק המרבי של חותמת זמן ב־PostgreSQL (שש ספרות)?
לחותמות זמן ב‑PostgreSQL יש דיוק של מיקרו‑שנייה (6 ספרות אחרי הנקודה).
- מקסימום:
.123456(6 ספרות) - ספרות מעבר לדיוק הנתמך מעוגלות למיקרו־שניות
- מקדמי אזור זמן מתקבלים עבור
timestamptz, אך אינם חובה
פיתוי לא נפוץ: חלק מהשפות/מסגרות שולחות דיוק של ננו‑שניות, אך PostgreSQL שומרת חותמות זמן בדיוק של מיקרו‑שנייה.
מתי נבדקת מגבלת הציון הזו?
ALTER TABLE studentsADD CONSTRAINT valid_gradeCHECK ( (grade >= 0 AND grade <= 100) OR grade IS NULL) NOT VALID;אילוצים עם NOT VALID:
- נבדקות מיידית עבור הוספות ועדכונים חדשים
- אינן מאמתות שורות קיימות
- ניתן לאמת שורות קיימות מאוחר יותר עם
VALIDATE CONSTRAINT - שימושיות בטבלאות גדולות
ללא NOT VALID:
- המגבלה נבדקת מיידית
- כל השורות הקיימות מאומתות
- יכול להיות איטי בטבלאות גדולות
כל הכבוד! חקרת לעומק כמה תחומים ב‑PostgreSQL! 🐘
אני מקווה שלמדת משהו חדש, או לפחות קיבלת ציון להתגאות! 🏆
הסתכל על Part 2 לעוד כיף עם Postgres! 🚀
רוצה עוד ריגושים בחיים? הסתכל על האוסף שלי אוסף חידונים לכיף אינסופי*!
