בקורס זה נלמד לעבוד עם ממסד נתונים דרך SQL.
מה זה בכלל SQL? למה זה נועד?
שפת SQL הינה שפה ייעודית לצורך עבודה מול דאטה-בייס (להלן גם DB).
דאטה בייס זה כינוי למידע שיושב בצורה מאורגנת על דיסק במחשב (המחשב יכול להיות גם שרת כמובן).
בקורס זה נלמד ליצור דאטה בייס מסוג SQLite.
SQLite היא ספריית קוד שמאפשרת ניהול טבלאות נתונים בתוך קובץ אחד בודד. זה מאוד נוח אם למשל נרצה להעביר את הקובץ בין מחשבים שונים, או לעבוד מולו בממשקים שונים. אם כי יש לזה גם חסרונות, וניגע בהם במהלך הקורס.
בשונה משרתי SQL כמו postgresql וכן mySQL, הדורשים הרצת תוכנה ברקע (שרת) שינהל את העבודה מול ה-DB, ב-sqlite זו פשוט ספריית קוד שיודעת לעבוד מול קובץ בודד. אין צורך בהרמת שרת.
sqlite מאפשרת יצירת מסד נתונים רלציוני, שזה אומר שאפשר יהיה ליצור קשרים בין טבלאות שונות. נבין זאת טוב יותר בהמשך, אבל על רגל אחת, אם יש לנו טבלה בנתונים שמייצגת “אנשים”, ויש לנו טבלה שמייצגת “תפקידים”, נוכל לקשר כל רשומה בטבלת התפקידים לרשומה בטבלת האנשים.
המונח RDBMS הוא קיצור של:
Relational Database Management System
בשביל להריץ את ספריית הקוד של sqlite נוכל להשתמש בספרייה בשם sqlite3 בפייתון, הנתמכת באופן אוטומטי ללא צורך בהתקנה בגרסאות פייתון חדשות.
כל שנצטרך לעשות זה:
import sqlite3
לאחר מכן נוכל לשלוח “שאילתות” מסוג SQL מתוך קוד הפייתון שלנו.
אנו נלמד לעשות זאת בפרק ייעודי.
תחילה נלמד דווקא להריץ פקודות ל-DB דווקא מתוך שורת הפקודה (CLI) של תוכנת sqlite.
אז שלב ראשון נתחיל בלהתקין אותה.
לצורך התקנה, ניגש לקישור הבא.
נחפש ונוריד את:
נעשה un-zip לתיקיה שירדה, ונזהה בתוכה את הקובץ הנושא את השם: sqlite3.exe
נוכל ללחוץ עליו בשביל להיכנס לממשק שורת הפקודה של התוכנה. (לחילופין, נוכל להפעיל קובץ זה מתוך ה-CMD של מערכת ההפעלה).
נצפה לראות לאחר מכן את המסך הבא:
כעת מתוך שורת הפקודה, נוכל להריץ פקודות ב-sqlite.
כזכור, המידה ש-sqlite עובד איתו יושב בקובץ בודד ייעודי. הקובץ הזה יהיה בעצם ה-DB.
אז נתחיל בליצור קובץ DB משלנו,
לשם כך, נבחר לו שם, למשל my_first_db
ונריץ את הפקודה הבאה:
.open my_first_db.db
(חייב סיומת db)
לאחר פקודה זו, נצפה שיווצר קובץ חדש בתיקיה ממנה הרצנו את הפקודה.
כעת שיצרנו (ואוטומטית גם התחברנו) ל-DB החדש, נוכל ליצור בו טבלאות.
הערה קטנה: נוכל להריץ את הפקודות הבאות שנלמד כמו ליצור טבלאות גם אם לא נבצע פתיחה ל-db. אבל אז הנתונים יישמרו רק בזיכרון הנדיף של המחשב, ויימחקו כשנסגור את התוכנה. (מה שנקרא in-memory) וזו האזהרה באדום שרואים במסך כשפותחים לראשונה את התוכנה.
מידע שיושב ב-DB בדר”כ מסודר בטבלאות.
נוכל לדמיין שטבלה היא כמו טבלת אקסל שמייצגת מידע כלשהו.
למשל, הטבלה הבאה היא טבלה שמייצגת מכוניות עם מידע שונה עליהן.
נבחין בין הכותרות – שמות העמודות, לבין השורות, המייצגות כל שורה = מכונית ספציפית.
בעבודה עם DB, אנו נרצה ליצור טבלאות בהן נשמור את הנתונים שלנו.
למשל תהיה לנו טבלה של “משתמשים” עם עמודות: שם פרטי, שם משפחה, כתובת וכדו’. ותהיה לנו טבלה של “רכישות” אם אנו בונים מערכת לחנות וכדומ’.
בואו ננסה ליצור טבלה כזו ב-DB שלנו.
הפקודה הבאה היא פקודה בסיסית בשפת SQL, והיא יוצרת טבלה בשם car, עם שתי “עמודות”, אחת בשם id שהיא מסוג int (מספר), ואחת בשם model שהיא מסוג text (מחרוזת).
create table car (id int, model text);
הצלחתם להריץ?
שימו לב, יש נקודה-פסיק (;) בסוף השורה.
בתום ריצת שורה זו, נוצרה לנו טבלה ב-DB. ונוכל בהמשך (כפי שתכף נלמד) להוסיף לה שורות (רשומות).
נציין שהשתמשנו כאן בסוגי נתונים int וכן text, שהם טיפוסי הנתונים הבסיסיים, ואין עוד הרבה אופציות ב-sqlite (מוזמנים להרחיב על זה כאן).
אגב – למרות שהטבלה מתוכננת לשמור “מכוניות”, קראנו לה car ולא cars. באופן עקרוני זו מוסכמה שכדאי להיצמד איליה. (אבל ייתכן ונראה לפעמים אצל אחרים גם שימוש ברבים, זו לא שגיאה)
אם אכן הצלחנו ליצור טבלה זו, נוכל להשתמש בפקודה המציגה את הטבלאות שקיימות ב-DB שלנו בעזרת הפקודה:
.tables
נצפה שפלט פקודה זו בשלב הזה יהיה: car, שזו הטבלה היחידה שיצרנו.
שימו לב – פקודה זו לא דורשת שימוש בנקודה פסיק (;) לאחריה, שכן זו לא פקודה SQL כמו הפקודה שיוצרת את הטבלה, אלא פונקציה לתוכנית sqlite שמריצה את הפקודות שלנו.
פקודות של sql מקובל לרשום באותיות גדולות, למשל:
CREATE TABLE car (id INT, name TEXT);
אם כי, אפשר גם באותיות קטנות. שפת SQL לא מבדילה ביניהן. (case-insensitive)
כמו כן, בדר”כ השדה / עמודה הראשון יהיה id.
אוקיי, אז יצרנו טבלה בשם car עם שדה מספר בשם id ושדה text בשם name.
איך נוסיף עכשיו “מופעים” (רשומות) של מכוניות?
הפקודה הבאה מוסיפה מכונית עם id=0 ושם toyota:
INSERT INTO car (id, name) VALUES (0, 'Toyota');
נשים לב:
נשים לב גם לכך שאת שם המכונית “Toyota” עטפנו במרכאות, כדי שהוא יוכר כמחרוזת.
היינו יכולים גם להפוך את הסדר שבו ציינו את שמות העמודות שאנו מעדכנים:
INSERT INTO car (name, id) VALUES ('Toyota', 0);
והיינו יכולים גם להשמיט את הנתון name:
INSERT INTO car (id) VALUES (2);
באופן כזה תיווצר לנו רשומה עם id בלבד. הערך שיישב בעמודה (שדה) name של רשומה זו, יהיה null.
אם נבחר שלא להשמיט שדות מסוימים, אלא להזין את כולם לפי הסדר שהם נוצרו, נוכל לדלג על הסוגריים הראשונים בפקודת ההכנסה (המתארים איזה שדות אנו מתכננים להזין).
למשל:
INSERT INTO car VALUES (0, 'Toyota');
אם הצלחנו בחלק הקודם להוסיף רשומה לטבלה, אז הטבלה שלנו מכילה נתונים, ולכן נוכל “לבקש אותם” דרך הפקודה:
SELECT * FROM car;
השימוש בכוכבית מציין שאנו רוצים לקבל את כל המידע שיש בטבלה car. היינו יכולים במקום כוכבית, לציין רק את המידע שאנו רוצים, למשל רק את השם של המכונית:
SELECT name FROM car;
אגב יכולנו גם לציין את שם העמודה name באותיות גדולות
וטיפ: אם נרצה בעת ההדפסה לצפות גם בכותרות של השדות, נוכל להריץ פעם אחת את הפקודה:
.headers on
בשיעור הבא נלמד איך למחוק ולערוך רשומות קיימות, אבל לפני כן נרצה לתרגל את מה שלמדנו.
תרגיל:
השתמש בפקודת SQL בשביל ליצור טבלה בשם car המכילה את כל השדות מהטבלה למעלה (סה”כ 6 עמודות).
לאחר מכן, הכנס את כל הרשומות שבטבלה, באמצעות פקודת ה-sql שהכרנו: insert into.
לסיום, בצע “שאילתא” על הטבלה, כך שתוצגנה שנות הייצור (השדה year) של כל המכוניות.
פתרון:
create table car (id int, model text, year int, subtype text,
engine int, km int, cost int);
insert into car (id, model, year, subtype, engine, km, cost)
values (55798, 'Toyota', 2019, 'yaris', 1800, 45000, 300);
insert into car (id, model, year, subtype, engine, km, cost)
values (19465, 'Lamborghini', 2020, 'v3', 2800, 30000, 900);
..
..
select year from car;
אם נרצה שפקודה “תתפזר” על יותר משורה אחת, נוכל פשוט ללחוץ אנטר. מאחר ולא שמנו נקודה פסיק (;) השורה לא תבוצע עדיין.
תרגיל נוסף:
צרו טבלה בשם person המייצגת אנשים.
לטבלה תיצרו את השדות הבאים:
הוסיפו לטבלה מספר רשומות, לאחר מכן הציגו את שמות המשפחה של כל האנשים שהזנת.
שימו לב, אם כעת נסגור לגמרי את שורת הפקודה שדרכה עבדנו, ונפתח אותה מחדש, נוכל להתחבר שוב ל-DB שיצרנו, עם הפקודה:
.open my_first_db.db
ונזהה שכל הטבלאות והרשומות שהוספנו קודם לכן, מופיעים בו.
למדנו להוריד את sqlite, והכרנו את התחביר הבסיסי ליצור טבלאות, להכניס לתוכם רשומות, ואף לבצע שאילתות בסיסיות לקבל את המידע ששמנו ב-db.
בשיעורים הבא נכיר פעולות נוספות, כמו למחוק טבלה, למחוק רשומה, לערוך רשומה וכדומה.
נתראה 🙂