מדריך SQL למתחילים

[6 בינואר 2009] [30 תגובות]

כמעט כל היישומים והתוכנות משתמשות בבסיס נתונים (או "מסד נתונים") על מנת לשמור מידע. דוגמה אחת היא שמירת שמות כל הרחובות בארץ ישראל בתוכנת ניווט (GPS). דוגמה נוספת היא הרשת החברתית של Facebook, בה נשמרים הפרטים של מיליוני המשתמשים בשירות.

שפת SQL היא שפת מחשבים שמטרתה לתקשר עם מסדי הנתונים. המטרה היא לאפשר קריאת מידע קיים מבסיס הנתונים ולאפשר כתיבת מידע חדש לתוכו. ישנם בסיסי נתונים שונים שניתן להשתמש בהם: MS Access, MS SQL, mySQL ועוד. כל אלו תומכים בשפת ה-SQL ולכן התקשורת איתם כמעט זהה לחלוטין.

מושגים בסיסיים

בסיס נתונים מורכב מטבלאות המכילות נתונים. נביט בטבלה הבאה:

First_NameLast_NameAge
EliCohen29
AviLevi55

שדה הוא עמודה בטבלה. בטבלה זו ישנם שלושה שדות: שם-פרטי, שם-משפחה וגיל.
כניסה היא שורה בטבלה. בטבלה זו ישנן שתי כניסות: כניסה עבור Eli Cohen וכניסה עבור Avi Levi.

השדות בטבלה בדרך כלל נקבעות מראש ואילו הכניסות נוספות ונמחקות עם הזמן.

שאילתה היא שילוב של פקודות SQL שמטרתה לקבל מידע מבסיס הנתונים. שאילתה יכולה גם לשנות את בסיס הנתונים, למחוק כניסות או ליצור כניסות חדשות. דוגמה לשאילתה:

SELECT * FROM UsersTable

הכנת הקרקע

על מנת שנוכל לתרגל את פקודות ה-SQL שנלמד בהמשך, נשתמש בבסיס הנתונים Access של מיקרוסופט. על מנת שתוכלו לתרגל, על המחשב שלכם צריכה להיות מותקנת התוכנה Access (תוכנה זו היא חלק מחבילת Office).

הורידו את הקובץ sql.mdb (זהו בסיס נתונים המכיל מספר טבלאות ונתונים) ופיתחו אותו בתוכנת MS Access. הדרך הכי קלה לבדוק אם תוכנת Access מותקנת במחשב היא להוריד את קובץ ה-mdb ולבצע דאבל-קליק עליו. במידה ו-Access מותקנת - היא תיפתח.

אם אין לכם את התוכנה, תוכלו להמשיך בקריאה וללמוד את הפקודות, אך בלימוד נושא כמו זה, כדאי מאוד שתוכלו לתרגל את הפקודות שתלמדו על מנת להגיע להבנה מלאה.

פיתחו את קובץ ה-mdb וביחרו ב-Queries ואז Design כך:

שלב 1

בחרו בכפתור Close:

שלב 2

בחרו ב-SQL View מהתפריט שבצד שמאל:

שלב 3

כעת תוכלו לכתוב שאילתה (את הפקודות נלמד בהמשך) ולהקיש על סימן הקריאה האדום:

שלב 4

אלו הם למעשה התוצאות של השאילתה:

שלב 5

בחרו ב-SQL View מהתפריט שבצד שמאל לחזור חזרה לכתיבת השאילתה:

שלב 6


כעת תוכלו להריץ שאילותת ולראות את התוצאות.

קריאת נתונים - פקודת SELECT

הקובץ sql.mdb מכיל מידע על עובדי החברה שלנו, כעת נראה כיצד לכתוב שאילתות על מנת לראות את המידע הרצוי אודות העובדים.

בשלב הראשון נרצה לקרוא את כל הנתונים על כל העובדים בחברה שלנו. פעולה זו למעשה "תחזיר" לנו את כל הנתונים הנמצאים בטבלת העובדים:

SELECT * FROM UsersTable;

שאילתה זו מתחלקת לשתי פקודות פשוטות:

  1. SELECT * - המשמעות היא לבחור את כל (הכוכבית מסמלת "הכל")
  2. FROM UsersTable - מכיוון שיש במסד הנתונים מספר טבלאות, צריך לקבוע מאיזה טבלה נרצה לקרוא את המידע.

שימו לב: בסוף השאילתה הוספנו את הסימן נקודה-פסיק ( ; ) על מנת לסמן שזהו הסוף של הפקודה, אך למעשה הסימן אינו נחוץ והפקודה תפעל גם בלעדיו.

אלו הם הנתונים המתקבלים לאחר הרצת השאילתה:

idnamephoneagefromgroup
1Yael03-927546725Israel2
2Eliran03-903020140Israel3
3Joe00-1-304-33321England2
4Avi09-749375850Israel2
5Noa03-846392722Israel3
6Jane00-1-222-22220United States1
7Walter00-1-304-44430England1
8Hadas08-679274842Israel2

המשימה הראשונה שלנו היא לבנות דף-קשר עבור עובדי החברה - כלומר נציג רק את שם העובד ומספר הטלפון שלו. הרי לא נרצה להראות לכל העובדים מידע חסוי אודות החברים שלהם (כמו הגיל של העובד). לכן עלינו לבקש רק חלק מהנתונים:

SELECT name, phone FROM UsersTable

כעת במקום לבקש את כל השדות של בסיס הנתונים על ידי הסימן * (כוכבית) אנו מבקשים רק את השדות name ו-phone מהטבלה UsersTable. הריצו את השאילתה בעצמכם וראו אם התוצאה היא כפי שציפינו לקבל, כך:

namephone
Yael03-9275467
Eliran03-9030201
Joe00-1-304-333
Avi09-7493758
Noa03-8463927
Jane00-1-222-222
Walter00-1-304-444
Hadas08-6792748

סינון התוצאות - פקודת WHERE

ישנה בעיה קטנה. ישנם מספר עובדים שמקום עבודתם אינו בישראל. אנו רוצים ליצור דף קשר המכיל רק את העובדים מהסניף הישראלי של החברה. נוכל לסנן את התוצאות על ידי שימוש בפקודת WHERE בצורה הבאה:

SELECT name, phone FROM UsersTable WHERE UsersTable.from='Israel'

הפקודה WHERE למעשה מסננת את התוצאות. כל התוצאות שהשאילתה תחזיר עומדים בחוקים שנכתבו לאחר הפקודה WHERE. כאן החוק היה שרק כניסות בהן השדה from שווה למילה Israel יוצגו. שימו לב לצורת הכתיבה של השדה form: קודם כל נכתבת שם הטבלה UsersTable, נקודה, ואז שם השדה form.

שימו לב לסימני הגרשיים המקיפים את המילה Israel - מכיוון ש-from הוא שדה מסוג מחרוזת (Text) יש להשוות אותו למילים המוקפות בגרשיים. אילו השוונו את השדה group שהוא מסוג מספר (Number) לא היה צורך (וגם אסור) להשתמש בגרשיים אלו.

כך נראה דף הקשר החדש:

namephone
Yael03-9275467
Eliran03-9030201
Avi09-7493758
Noa03-8463927
Hadas08-6792748

ניתן לסנן את התוצאות על פי מספר תנאים: לאחר הפקודה WHERE יש לכתוב את התנאים ובינהם המילים AND ו-OR. בדוגמה הבאה נציג רק את העובדים מישראל שנמצאים בקבוצה מספר 2:

SELECT name, phone FROM UsersTable WHERE UsersTable.from='Israel' AND UsersTable.group=2

ותתקבל התוצאה:

namephone
Yael03-9275467
Avi09-7493758
Hadas08-6792748

מיון התוצאות - פקודת ORDER BY

העובדים התלוננו שדף הקשר מאוד מבולגן ועל מנת להקל עליהם הם הציעו לסדר את דף הקשר על פי שם המשתמש בסדר אלפא-בתי, מ-א' ועד ת'. ישנה פקודה פשוטה מאוד שניתן להוסיף לשאילתה על מנת למיין את התוצאות, הפקודה היא ORDER BY והשאילתה המלאה תיראה כך:

SELECT name, phone FROM UsersTable WHERE UsersTable.from='Israel' ORDER BY UsersTable.name ASC

צורת הכתיבה היא ORDER BY לאחריו השדה שלפיו יש למיין את הנתונים ולבסוף המילה ASC או DESC. המילה ASC משמעותה סדר-עולה ואילו המילה DESC פירושה סדר-יורד.

כעת דף הקשר מופיע לפי סדר א'-ב':

namephone
Avi09-7493758
Eliran03-9030201
Hadas08-6792748
Noa03-8463927
Yael03-9275467

רוצים את הטבלה בסדר הפוך? השתמשו ב-DESC כך:

SELECT name, phone FROM UsersTable WHERE UsersTable.from='Israel' ORDER BY UsersTable.name DESC

סיכום החלק הראשון

בחלק זה למדנו קצת על בסיסי נתונים התומכים בשפת SQL, מהם שאילתות, מהם שדות וכניסות.

אנו יודעים כיצד לשלוף נתונים על ידי הפקודה SELECT, לסנן תוצאות על ידי הפקודה WHERE ולסדר תוצאות על ידי ORDER BY.

בחלק השני, נלמד כיצד לאחד מידע משתי טבלאות וכיצד לערוך, להוסיף ולמחוק כניסות.

אם אהבת את הפוסט, אני שולח מדי פעם למייל עוד פוסטים מעניינים שלא תמיד מגיעים להתפרסם באתר. אתה מוזמן להצטרף לרשימה:
(אני שונא ספאם. אני מבטיח לעולם לא לשלוח משהו לא מעניין)

30 תגובות

  1. איתי | 1/7/2009 1:12:44 AM

    יש דברים שלדעתי לא ניגשת אליהם נכון, לדוגמה השירוש תנאים, הצגת אותו כחלק מהדרוש ב-WHERE, שלמעשה ניתן להריץ גם תנאי אחד. בנוסף גם אילו אופטורים קיימים לא הצגת, דבר כשם שהוא בעייתי בהתייחסות לנשוא ה-WHERE.

    עוד משהו הוא שם הטבלה, שהתעקשת כביכול לכתוב, אם כי בשאילתות רגילות אין בכך צורך, וזה בשלב של מתחילים עלול לבלבל.

    בנוגע למיון, לא חובה לכתוב ASC בסוף, הוא הברירות מחדל של הפקודה ORDER BY.

     

    לדעתי קצת (הרבה) רצת בכל הנוגע ל-SQL, וזו שפה דווקא שהעומק שלה הוא השימושי, ולא להציג את הבסיס עצמו.

    אין לי ספק שאתה יודע ומבין את השפה, אבל מי שיקרא את המדריך לא בהכרח, תתחשב בזה ואל תדלג על כלום.

  2. טל | 1/7/2009 11:15:42 PM

    זה באמת נושא שלכל פרט קטן אפשר להיכנס לפירוט עמוק, אך המטרה הייתה להציג מספר פקודות שאפשר ישירות להשתמש בהם.

    בגל מקרה, אני אשקול לעדכן את הפוסט הזה עם עוד מידע על SQL במבוא.

  3. תמר | 1/8/2009 4:10:30 AM

    ווואוו איזה יופי!

    טל, תודה רבה! לי זה עזר. עבדתי ע"פ ההוראות. והצלחתי!

    (זה קצת מבלבל למי שיש אקסס מתקדם)

  4. טל2 | 4/18/2009 4:12:23 AM
    תודה רבה על הפוסט, תמשיך עם עוד כאלה!
  5. לימור | 7/13/2010 6:30:55 AM

    טל שלום,

    ההדרכה שלך מדהימה. סוף כל סוף הבנתי דברים שבכתה לא הבנתי...יכול להיות שלאנשים בעלי ידע יש הארות של בעלי ידע, אבל אני מאד נהניתי והשכלתי. תודה!!!!!!

  6. טל | 7/15/2010 11:18:55 AM
    תודה לימור :) תגובות כאלה בהחלט עושות חשק לכתוב עוד.
  7. דור | 7/28/2010 2:49:49 PM

    טל תודה רבה אני הבנתי כל מילה כל דקה נהנתי גם בערב שראש שלי כאב עדיין נתת לי השראה! השפה הזאתי מענינת ביותר!

     

    תודה! 

  8. עמינדב | 9/17/2010 6:01:45 AM
    תודה זה עובד 200%!
  9. עמינדב | 9/18/2010 12:25:05 PM
    דרך אגב ניתן לפרוץ חלק(השאר מוגנים) בSQL INJECTIONS שזה ניצול לרעה של השפה המדהימה הזאת.
  10. שושו השועל | 12/2/2010 6:57:19 AM
    מאמר מדהים... באמת שלא צריך "לפחד" מהשפה הזאת... מתחיל לשחק עם זה בעבודה שלי. תודה!
  11. שושו השועל | 12/2/2010 6:59:31 AM
    שחכתי לציין... מחכה בקוצר רוח לחלק ב' של המדריך.
  12. איתן | 12/28/2010 11:14:32 PM

    תודה רבה טל

    פשוט ברור וטוב מאד בתור שיעור ראשון

  13. אלברט | 1/27/2011 2:17:39 PM

    טל שלום,

    תודה רבה, עזרת גם לי.

    יש לי שאלה, האם חייבים לכתוב "UsersTable.from", לא ניתן לכתוב רק "from"?

    אני שואל כי כאשר רק תנאי אחד "מישראל" זה עבד, וכאשר היו 2 תנאים "מישראל" "ומקבוצה 2" , במקרה כזה נאלצתי לכתוב גם את השם של הטבלה. השאלה שלי האם כאשר יש 2 תנאים תמיד חייבים להוסיף גם את שם של הטבלה?

    תודה רבה.

  14. תמר | 4/6/2011 4:04:34 PM

    היי טל!

    אני מחכה בקוצר רוח להמשך הדרכת SQL.

    זה חשוב מאד, וממש הכרחי לדעת את הנושא הזה כמעט בכל תחום..

    אני נתקלת בזה הרבה. וחסר לי ידע..

    הרבה פעמים אני נכנסת פה לאתר שלך וזה תורם המוון!! תודה.

     

    אשמח לראות מאמרים נוספים בנושא זה.

    אני רואה שאתה מחדש ומתחדש בכל העידכונים הכי חמים בשוק. וזה תמיד כייף לקרוא ולהתעדכן. ועדיין אני חושבת שהבסיס צריך להיות בצורה מורחבת ומעמיקה. מה עוד---שיש לך שפה קולחת ומענינת, אף פעם אי אפשר לקרוא רק חלקית.... אתה מעביר את המסר והחומר בצורה ברורה וכייפית. אז שוב תודה לך!

     

  15. חזי | 5/16/2011 12:53:14 AM

    שלום

    אני צריך עזרה בחיפוש חומר לימוד SQL בעברית.

    אצלי מותקן Microsoft SQL Server 2008.

    האם מישהו מכיר אתר רלוונטי? 

    לתשובתכם אודה :) 

  16. עופר | 2/6/2012 1:16:35 AM

    תודה רבה..בזכותך אני יודע כרגע לכתוב שאילתות בסיסיות ב-Sql . גם את זה לא ידעתי לבצע .

  17. בועז | 3/28/2012 3:11:21 AM

    כל הכבוד על הכתבה,

    יש חלק שני?

    איך משתמשים בנתון שמצאנו בעזרת השאילתה ?

  18. אורית | 6/10/2012 2:29:48 AM

    מדריך מצויין,

    יכולת ההסברה שלך מעולה, פשוטה וברורה!

    פירסמת כבר חלק ב'?

    אם כן אשמח מאוד לראות!

    תודה,

    אורית 

  19. אלינה | 7/1/2012 9:31:44 AM

    היי,

     

    מאוד נהניתי ממה שהסברת. היה מאוד מובן וההסברים היו ממש קלילים ומוסברים.

    הדוגמאות היו מעולות!

     

    יש מצב רק לראות חלק ב. עם תוכל לשלוח לי לינק למיל או לפרסם לכולם כאן אשמח מאוד.

     

    תודה!! 

     

     

     

     

     

     

  20. אפרת | 8/21/2012 10:00:47 AM

    תודה רבה!!

    עזר לי מאד!!

  21. חחח | 5/27/2013 11:34:31 AM
    תשתתכלו זה ישן תיכו!!!!!
  22. kuti | 7/29/2013 4:52:00 AM
    אז מה אם זה ישן פקודות SQL משתנות אם הזמן?
  23. שירלי | 10/20/2013 7:35:26 AM
    מקסים, אבל איפה החלק השני ?
  24. שירלי | 10/20/2013 7:35:38 AM
    מקסים, אבל איפה החלק השני ?
  25. טל | 10/21/2013 1:37:59 PM

    זה פוסט מלפני 4.5 שנים... צריך לשאול את טל של אז מה קרה לפוסט.

    אני כנראה כבר לא אשלים את ההמשך, אבל עם הבסיס הזה אפשר להמשיך ללמוד לבד מאלפי האתרים האחרים ברשת (אין לי אחד ספציפי להמליץ עליו).

      

  26. רחל | 2/9/2014 1:00:11 PM
    ממש עזר לי, תודה רבה
  27. אנונימי | 2/17/2014 9:23:31 AM
    גהדהדקעהדקהד
  28. אנונימי | 2/17/2014 9:23:55 AM
    file:///C:/Users/tomerha/Desktop/תמונה%204.JPG
  29. לולו | 4/24/2014 1:14:22 AM
    יפה מאד, תודה.היכן פרק שני ?
  30. יוליה | 10/26/2014 8:40:20 AM

    היי,

     

    מאוד נהניתי ממה שהסברת. היה מאוד מובן וההסברים היו ממש קלילים ומוסברים.

    הדוגמאות היו מעולות!

     

    יש מצב רק לראות חלק ב. עם תוכל לשלוח לי לינק למיל או לפרסם לכולם כאן אשמח מאוד.

     

    תודה!! 

     

התגובות נעולות