תיעוד SQLite
מדריך עיון תמציתי ל-SQLite, מבוסס דוגמאות. קוראים את המושג, רואים את הקוד, ואז מתרגלים אותו במסלול של Coddy.
להתחיל מסלול SQLite מודרךGetting Started
- מה זה SQLiteSQLite הוא מסד נתונים SQL ללא שרת, מבוסס קובץ, שרץ בתוך האפליקציה שלכם. הנה מה הוא באמת, במה הוא שונה משרת מסד נתונים, ומתי הוא מצטיין.
- רשימת פקודות SQLפקודות ה-SQL שמשתמשים בהן כל יום, מקובצות לפי מה שהן עושות (DDL, DML, DQL ו-TCL), וכל אחת עם דוגמה שאפשר להריץ ב-SQLite.
- SQLite vs MySQLבמה SQLite ו-MySQL באמת שונים: ארכיטקטורה, מקביליות, טיפוסים, וסוגי הפרויקטים שכל אחד מהם נבנה בשבילם.
- SQLite vs Postgresבמה SQLite ו-PostgreSQL באמת שונים: ארכיטקטורה, מקביליות, טיפוסים, וסוגי הפרויקטים שכל אחד מהם מתאים להם הכי טוב.
- מתי להשתמש ב-SQLiteמדריך מעשי למתי SQLite הוא מסד הנתונים הנכון, ומתי כדאי לבחור במקומו ב-Postgres או ב-MySQL.
- התקנת SQLiteאיך מתקינים SQLite ב-Windows, ב-macOS וב-Linux: הורדת כלי שורת הפקודה, הוספה ל-PATH ובדיקה שהכול עובד.
- SQLite CLIאיך משתמשים ב-shell של sqlite3 בשורת הפקודה: פתיחת מסדי נתונים, הרצת שאילתות, פקודות נקודה, וייבוא או ייצוא נתונים בלי לצאת מהטרמינל.
- כלים גרפייםסיור מעשי בכלים הגרפיים לפתיחה, עיון ועריכה של קבצי מסד נתונים של SQLite: DB Browser for SQLite, SQLiteStudio וצופים אונליין.
- יצירת מסד נתוניםאיך יוצרים מסד נתונים של SQLite: המודל המבוסס על קובץ, הפקודה `sqlite3`, ולמה אין פקודת `CREATE DATABASE`.
- מסד נתונים בזיכרוןאיך עובד מסד נתונים בזיכרון ב-SQLite, מתי כדאי להשתמש ב-`:memory:`, ובמה הוא שונה ממסד נתונים מבוסס קובץ שאפשר לשמור.
Tables & Types
- CREATE TABLEאיך יוצרים טבלאות ב-SQLite: הגדרות עמודות, אילוצים, IF NOT EXISTS, טבלאות זמניות ו-CREATE TABLE AS SELECT.
- טיפוסי נתוניםאיך SQLite שומרת ערכים: חמש מחלקות האחסון, למה הטיפוסיות דינמית, והמלכודות שתופסות את מי שמגיע מ-Postgres או מ-MySQL.
- Type Affinityאיך מערכת ה-type affinity של SQLite עובדת: חמשת סוגי ה-affinity, הכללים שבוחרים אחד מהם לפי הגדרת העמודה, ולמה עמודת INTEGER יכולה להכיל מחרוזת.
- טבלאות STRICTאיך טבלאות STRICT ב-SQLite מכבות את האחסון הגמיש בטיפוסים, דוחות ערכים לא תואמים, ונותנות לכם את בדיקת הטיפוסים שכנראה ציפיתם לה מההתחלה.
- מפתחות ראשייםאיך מפתחות ראשיים עובדים ב-SQLite: ה-INTEGER PRIMARY KEY המיוחד, מפתחות מורכבים, AUTOINCREMENT, והמוזרויות שתופסות מתחילים.
- ROWIDמה זה בעצם ROWID ב-SQLite, מתי INTEGER PRIMARY KEY הופך אותו לעמודה שלכם, ולמה קיימות טבלאות WITHOUT ROWID.
- NOT NULL וערכי ברירת מחדלאיך NOT NULL ו-DEFAULT עובדים ב-SQLite: מה הם אוכפים בפועל, הטריק של CURRENT_TIMESTAMP והמלכודות בהוספתם לטבלאות קיימות.
- אילוצי CHECKאיך משתמשים באילוצי CHECK ב-SQLite כדי לאכוף כללים על ערכי עמודות: בדיקות על עמודה אחת, בדיקות על כמה עמודות, אילוצים עם שם, והמלכודות.
- אילוצי UNIQUEאיך אילוצי UNIQUE עובדים ב-SQLite: ברמת העמודה, ברמת הטבלה, מפתחות מורכבים, המוזרות של NULL, ומה עושים כשאילוץ נכשל.
- DROP ו-ALTER TABLEאיך מוחקים טבלאות, משנים את שמן ומשנים אותן ב-SQLite: מה ALTER TABLE תומך בו, במה לא, וטריק הבנייה מחדש לשינויים שהוא לא יכול לעשות.
Inserting & Modifying Data
- INSERTאיך INSERT עובד ב-SQLite: שורה בודדת, הכנסה של כמה שורות, INSERT...SELECT, ערכי ברירת מחדל ומשני ההתנגשות OR IGNORE ו-OR REPLACE.
- SQL UPDATEאיך משנים שורות קיימות ב-SQLite: התחביר של UPDATE, פסוקית WHERE ששומרת עליכם, עדכון כמה עמודות, ו-UPDATE ... FROM לעריכה בין טבלאות.
- DELETEאיך DELETE עובד ב-SQLite: כתיבת פסוקית WHERE בטוחה, מחיקת כל השורות, מחיקה מדורגת לטבלאות קשורות, וקבלת השורות שנמחקו עם RETURNING.
- UPSERTאיך UPSERT עובד ב-SQLite: פסוקית ON CONFLICT, הטבלה excluded, DO NOTHING מול DO UPDATE, ובמה הוא שונה מ-INSERT OR REPLACE.
- פסוקית RETURNINGאיך פסוקית RETURNING עובדת ב-SQLite: שליפת השורות שה-INSERT, ה-UPDATE או ה-DELETE שלכם שינו עכשיו, בלי שאילתה שנייה.
- ייבוא CSVאיך מייבאים קובצי CSV ל-SQLite עם הפקודה .import: טיפול בכותרות, בטבלאות קיימות, במפרידים מותאמים ובשגיאות הנפוצות ביותר.
- ייצוא נתוניםאיך מייצאים נתונים מ-SQLite: CSV עם כותרות, JSON, dump מלא של SQL וגיבוי של טבלה בודדת בעזרת מעטפת שורת הפקודה sqlite3.
Querying Data
- יסודות SELECTאיך פקודת SELECT עובדת ב-SQLite: בחירת עמודות, חישוב ביטויים, מתן כינויים לתוצאות, והמודל המנטלי שמאחורי כל שאילתה שתכתבו.
- פסוקית WHEREאיך פסוקית WHERE מסננת שורות ב-SQLite: אופרטורי השוואה, AND/OR, LIKE, IN, BETWEEN, ומלכודת ה-NULL שתופסת את כולם.
- אופרטורים ו-NULLאיך האופרטורים של SQLite מתנהגים מול NULL: למה `=` ו-`<>` לא עובדים כמו שמצפים, ואילו כלים כן עובדים: IS, IS NOT, COALESCE ו-IFNULL.
- ORDER BYאיך ORDER BY עובד ב-SQLite: מיון בסדר עולה ויורד, שבירת שוויון עם כמה עמודות, טיפול ב-NULL ומיון שלא מבחין בין אותיות גדולות לקטנות.
- LIMIT ו-OFFSETאיך LIMIT ו-OFFSET עובדים ב-SQLite: הגבלת מספר השורות, דילוג על שורות, דפדוף בטוח ומלכודת הביצועים שכדאי להימנע ממנה בטבלאות גדולות.
- DISTINCTאיך SELECT DISTINCT עובד ב-SQLite: עמודה אחת, כמה עמודות, טיפול ב-NULL, COUNT(DISTINCT), ומתי GROUP BY הוא הכלי הטוב יותר.
- SQL CASEאיך CASE עובד ב-SQLite: הצורה הפשוטה והצורה המחפשת, שימוש בו ב-SELECT, ב-ORDER BY וב-WHERE, ומתי עדיף להשתמש ב-IIF.
Functions & Aggregates
- פונקציות מחרוזתפונקציות מחרוזת שימושיות ב-SQLite: שרשור, SUBSTR, INSTR, REPLACE, TRIM, והדפוסים לניקוי ועיצוב מחדש של טקסט בתוך שאילתות.
- פונקציות מספריותאיך עושים חשבון ב-SQLite: ROUND, ABS, CEIL, FLOOR, MOD, POWER, SQRT, RANDOM, ומלכודת החילוק בשלמים שתופסת כל אחד לפחות פעם אחת.
- תאריך ושעהאיך SQLite שומרת תאריכים ומטפלת בהם: חמש פונקציות התאריך, מחרוזות פורמט, modifiers, ובחירות האחסון ששומרות על השאילתות שלכם מהירות.
- פונקציות צבירה ב-SQLאיך פונקציות צבירה ב-SQLite מכווצות שורות רבות לערך אחד: COUNT, SUM, AVG, MIN, MAX ו-GROUP_CONCAT, וגם DISTINCT, FILTER והכללים של NULL.
- GROUP BY ו-HAVINGאיך GROUP BY מקבץ שורות לקבוצות ב-SQLite, ואיך HAVING מסנן את הקבוצות האלה אחרי הצבירה, כולל ההבדל המוחשי בין WHERE ל-HAVING.
Relationships & Joins
- מפתחות זריםאיך מפתחות זרים עובדים ב-SQLite: הצהרה עם REFERENCES, הפעלת האכיפה עם PRAGMA ובחירת התנהגות ה-ON DELETE הנכונה.
- INNER JOINאיך INNER JOIN עובד ב-SQLite: המודל המנטלי, פסוקית ON, חיבור של שלוש טבלאות וקיצור הדרך USING.
- LEFT JOINאיך LEFT JOIN עובד ב-SQLite: שמירה על שורות ללא התאמה, קריאת ערכי NULL, סינון בטוח וחיבור של יותר משתי טבלאות.
- Self Joinאיך self join עובד ב-SQLite: התאמת שורות מאותה טבלה בעזרת כינויים, עם דוגמאות מעשיות של עובד ומנהל ושל נתונים היררכיים.
- Subqueriesאיך מקננים SELECT אחד בתוך אחר ב-SQLite: subquery סקלרי, IN/EXISTS, טבלאות נגזרות, subquery מתואם, ומתי JOIN קריא יותר.
- CTEאיך Common Table Expressions עובדים ב-SQLite: שימוש ב-WITH כדי לתת שם לתת שאילתות, לשרשר כמה CTE ולכתוב שאילתות שנקראות מלמעלה למטה.
- CTE רקורסיביאיך CTE רקורסיבי עובד ב-SQLite: המבנה של עוגן וחלק רקורסיבי, מעבר על עצים של הורה וילד, יצירת סדרות והימנעות מלולאות אינסופיות.
Indexes & Performance
- אינדקסיםאיך אינדקסים עובדים ב-SQLite, מתי הם עוזרים, מתי הם מזיקים, ואיך בודקים אם המתכנן באמת משתמש בהם.
- אינדקסים מורכביםאיך עובדים אינדקסים על כמה עמודות ב-SQLite, למה סדר העמודות חשוב, ומתי אינדקס מורכב עוזר ומתי הוא רק מבזבז מקום.
- אינדקסים חלקייםאיך אינדקסים חלקיים עובדים ב-SQLite: אינדוקס רק של השורות שאתם באמת שולפים, והדפוסים (מחיקה רכה, ייחודיות חלקית, תת-קבוצות חמות) שבהם הם משתלמים.
- EXPLAIN QUERY PLANאיך משתמשים ב-EXPLAIN QUERY PLAN ב-SQLite כדי לבדוק אם השאילתה משתמשת באינדקס, מה המשמעות של SCAN ו-SEARCH, ואיך קוראים תוכניות של JOIN.
- ANALYZE ו-VACUUMאיך `ANALYZE` ו-`VACUUM` שומרים על מסד נתונים של SQLite מהיר וקומפקטי: מה כל אחד עושה בפועל, מתי להריץ אותם, והגרסאות ששווה להכיר.
Advanced Features
- טרנזקציותאיך טרנזקציות עובדות ב-SQLite: BEGIN, COMMIT, ROLLBACK, מצב autocommit, והמצבים DEFERRED/IMMEDIATE/EXCLUSIVE שקובעים מתי נלקחות נעילות.
- Savepointsאיך savepoints עובדים ב-SQLite: סימניות עם שם בתוך טרנזקציה, שאפשר לחזור אליהן בלי לזרוק את כל הטרנזקציה.
- Viewsאיך views עובדים ב-SQLite: שמירת שאילתות כטבלאות וירטואליות, מתי להשתמש ב-views זמניים, ולמה ה-views של SQLite הם לקריאה בלבד כברירת מחדל.
- טריגריםאיך טריגרים עובדים ב-SQLite: BEFORE ו-AFTER, INSTEAD OF על views, ההפניות לשורות OLD ו-NEW, ומתי טריגרים הם הכלי הנכון.
- תמיכה ב-JSONאיך SQLite שומרת ושולפת JSON: חילוץ שדות, עדכון ערכים, פריסת מערכים עם json_each ואינדוקס נתיבי JSON למהירות.
- חיפוש טקסט מלאאיך מוסיפים חיפוש טקסט מלא ל-SQLite עם FTS5: יצירת טבלאות וירטואליות, האופרטור MATCH, דירוג BM25 ושמירה על סנכרון בין האינדקס לנתונים.
- Window Functionsאיך window functions (פונקציות חלון) עובדות ב-SQLite: OVER, PARTITION BY, פונקציות דירוג, LAG/LEAD, ופסוקיות מסגרת לסכומים מצטברים.
- עמודות מחושבותאיך עמודות מחושבות (generated columns) עובדות ב-SQLite: הצהרה עליהן, בחירה בין VIRTUAL ל-STORED ואינדוקס שלהן לחיפוש מהיר.
- ATTACH DATABASEאיך ATTACH DATABASE מאפשר לפתוח כמה קבצי SQLite בחיבור אחד, לתשאל את כולם עם קידומות סכמה, ולנתק אותם כשמסיימים.
Safety & Application Integration
- Prepared Statementsמה הם prepared statements ב-SQLite, למה הם קיימים, ומחזור החיים prepare/bind/step/finalize שכל דרייבר עוטף.
- קשירת פרמטריםאיך עובדת קשירת פרמטרים ב-SQLite: מצייני מקום לפי מיקום, פרמטרים עם שם, והכללים להעברת ערכים בבטחה מהאפליקציה שלכם.
- SQL Injectionלמה שרשור מחרוזות מסוכן, איך SQL injection עובד בפועל, ואיך שאילתות עם פרמטרים ב-SQLite חוסמות אותו לתמיד.
- חיבור מאפליקציותאיך אפליקציות פותחות מסד נתונים של SQLite ומשתמשות בו: מחרוזות חיבור, נתיבי קבצים, דרייברים בשפות שונות, וההגדרות ששווה לעשות נכון כבר מהיום הראשון.
- מיגרציותאיך משנים סכמה של SQLite לאורך זמן בבטחה, בעזרת PRAGMA user_version, סקריפטים ממוספרים של מיגרציה וטרנזקציות ששומרות על אפשרות לחזור אחורה.
- WAL ומקביליותאיך ה-write-ahead logging של SQLite משנה את תמונת המקביליות: קוראים וכותבים מפסיקים לחסום זה את זה, ומה בעצם עושים קובצי ה-wal וה-shm.
Production & Operations
- גיבוי ושחזוראיך לגבות ולשחזר מסד נתונים של SQLite בבטחה: הפקודה .backup, VACUUM INTO, ה-API לגיבוי מקוון, ולמה העתקת הקובץ היא הצעד הלא נכון.
- הגדרות PRAGMAפקודות ה-PRAGMA שבאמת חשובות: journal_mode, synchronous, foreign_keys, busy_timeout ו-cache_size, והערכים שכדאי להשתמש בהם בסביבת ייצור.
- שגיאות נפוצותשגיאות ה-SQLite שבאמת תיתקלו בהן בפרודקשן: database is locked, readonly database, disk image malformed, כישלונות של אילוצים, ואיך לתקן אותן.