פקודות SQL במבט אחד
פקודות SQL מתחלקות לכמה קבוצות לפי מה שהן עושות. הטבלה מפרטת את אלה שתשתמשו בהן הכי הרבה, וכל אחד מהסעיפים שבהמשך מריץ אחת מהן.
| פקודה | קבוצה | מה היא עושה |
|---|---|---|
CREATE TABLE | DDL | מגדירה טבלה חדשה ואת העמודות שלה |
ALTER TABLE | DDL | מוסיפה עמודה או משנה את שמה, או משנה את שם הטבלה |
DROP TABLE | DDL | מוחקת טבלה ואת כל השורות שלה |
INSERT | DML | מוסיפה שורות חדשות |
UPDATE | DML | משנה ערכים בשורות קיימות |
DELETE | DML | מסירה שורות |
SELECT | DQL | קוראת שורות, מסננת עם WHERE וממיינת עם ORDER BY |
BEGIN, COMMIT, ROLLBACK | TCL | מקבצות שינויים כך שיצליחו או ייכשלו יחד |
DDL היא שפת הגדרת נתונים (data definition language), DML היא שפת טיפול בנתונים (data manipulation language), DQL היא שפת שאילתות (data query language) ו-TCL היא שפת בקרת טרנזקציות (transaction control language). השמות פחות חשובים מהחלוקה: DDL משנה את הצורה של מסד הנתונים, ו-DML משנה את מה שבתוכו.
CREATE TABLE: הגדרת טבלה
CREATE TABLE נותנת שם לטבלה ומפרטת את העמודות שלה עם הטיפוסים והכללים שלהן. כל פקודה אחרת בעמוד הזה צריכה טבלה לעבוד עליה.
העמוד על CREATE TABLE מסביר כללים כמו NOT NULL, UNIQUE ו-DEFAULT.
INSERT: הוספת שורות
INSERT INTO מוסיפה שורה אחת או כמה. רשמו את העמודות, ואז את הערכים באותו סדר.
עמודת ה-id התמלאה מעצמה: INTEGER PRIMARY KEY מקבל את המספר הבא כשמשמיטים אותו. עוד על זה ב-INSERT.
SELECT: קריאת שורות
SELECT היא הפקודה שתכתבו הכי הרבה. בחרו את העמודות, סננו שורות עם WHERE ומיינו אותן עם ORDER BY.
רק שורות שעוברות את בדיקת ה-WHERE חוזרות, מהציון הגבוה לנמוך. ראו יסודות SELECT ו-WHERE לפרטים.
UPDATE: שינוי שורות
UPDATE קובעת ערכים חדשים בשורות שכבר קיימות. פסוקית ה-WHERE קובעת באילו שורות מדובר, ואם משמיטים אותה, כל שורה משתנה.
כשאתם לא בטוחים למה פסוקית WHERE מתאימה, הריצו אותה קודם כ-SELECT. העמוד על UPDATE מראה עוד דפוסים.
DELETE: הסרת שורות
DELETE FROM מסירה את השורות שמתאימות לפסוקית ה-WHERE שלה. כמו UPDATE, היא משפיעה על כל שורה אם הפסוקית חסרה.
השורה של Chen נעלמה והשאר לא נפגעו. ראו DELETE.
ALTER TABLE ו-DROP TABLE: שינוי או הסרה של טבלה
ALTER TABLE משנה טבלה קיימת בלי לאבד את השורות שלה. DROP TABLE מסירה את הטבלה לגמרי.
עמודה חדשה מתחילה כ-NULL בשורות קיימות עד שממלאים אותה. ALTER ו-DROP TABLE מפרט מה SQLite מאפשרת.
JOIN: שילוב טבלאות
JOIN קורא שורות משתי טבלאות בבת אחת, לפי התאמה בעמודה משותפת.
ל-Boris אין הרשמות, ולכן INNER JOIN משאיר אותו בחוץ. LEFT JOIN היה שומר אותו, עם קורס ריק.
GROUP BY: סיכום שורות
GROUP BY מכווץ שורות שחולקות ערך לשורה אחת, ופונקציית צבירה כמו COUNT או AVG מסכמת כל קבוצה.
פונקציות צבירה ו-GROUP BY ו-HAVING מעמיקים יותר.
BEGIN, COMMIT ו-ROLLBACK: קיבוץ שינויים
טרנזקציה גורמת לכמה שינויים להיחשב כאחד. COMMIT שומרת את כולם, ו-ROLLBACK מבטלת את כולם.
ההעברה בוצעה, והשינוי השני בוטל, כך ש-Ada מסיימת עם 70 ו-Boris עם 80. טרנזקציות מסביר מתי להשתמש בהן.
במה SQLite שונה
הפקודות בעמוד הזה הן SQL תקני, ומה שלומדים כאן עובר גם ל-MySQL ול-PostgreSQL. הדוגמאות להרצה כתובות ל-SQLite, ושלושה פרטים משתנים במסדי הנתונים הגדולים יותר:
- רשימת הטבלאות. הדוגמאות קוראות את
sqlite_master, טבלת הסכמה של SQLite עצמה. MySQL משתמשת ב-SHOW TABLES, ו-PostgreSQL משתמשת ב-viewinformation_schema.tables(או ב-\dtב-psql). - מזהים אוטומטיים. עמודה שמוצהרת כ-
INTEGER PRIMARY KEYממספרת שורות חדשות בעצמה ב-SQLite, ולכן דוגמאות ה-INSERTמשמיטות אתid. MySQL צריכהAUTO_INCREMENTעל העמודה, ו-PostgreSQL צריכה עמודת identity (GENERATED BY DEFAULT AS IDENTITY) אוSERIAL. - הרשאות ושינויי סכמה. ל-SQLite אין
GRANTאוREVOKE, כי מסד נתונים של SQLite הוא קובץ יחיד בלי חשבונות משתמשים, וה-ALTER TABLEשלה לא יכול לשנות טיפוס של עמודה.
שאלות נפוצות
מהן פקודות ה-SQL הבסיסיות?
חמש פקודות מכסות את רוב העבודה היומיומית: CREATE TABLE להגדרת טבלה, INSERT להוספת שורות, SELECT לקריאתן, UPDATE לשינוין ו-DELETE להסרתן. אחריהן באות ALTER TABLE, DROP TABLE, JOIN, GROUP BY ופקודות הטרנזקציה BEGIN, COMMIT ו-ROLLBACK.
מה ההבדל בין DDL ל-DML?
DDL (שפת הגדרת נתונים) משנה את המבנה של מסד הנתונים: CREATE, ALTER ו-DROP. DML (שפת טיפול בנתונים) משנה את השורות שבתוך הטבלאות: INSERT, UPDATE ו-DELETE. SELECT רק קוראת, ולכן היא מופיעה לעתים קרובות בנפרד בתור DQL.
האם פקודות SQL רגישות לאותיות גדולות וקטנות?
לא. SELECT, select ו-Select כולן עובדות. כתיבת מילות מפתח באותיות גדולות היא מוסכמה שגורמת להן לבלוט מול שמות טבלאות ועמודות. עם זאת, טקסט בתוך מרכאות מושווה בדיוק, ולכן 'Ada' ו-'ada' הן מחרוזות שונות ב-SQLite, אלא אם מבקשים השוואה שלא מבחינה ברישיות.
האם הפקודות האלה עובדות אותו דבר ב-MySQL וב-PostgreSQL?
הפקודות הן SQL תקני ומשמעותן זהה בשלושתם, כך שמה שלומדים כאן עובר הלאה. הדוגמאות להרצה כתובות ל-SQLite: כאן רשימת הטבלאות נקראת מ-sqlite_master, מזהים אוטומטיים דורשים AUTO_INCREMENT ב-MySQL או עמודת identity ב-PostgreSQL, ול-SQLite אין GRANT או REVOKE.