HTML וכל מה שמסביב

מה זה SQL?

הקדמה

SQL הם ראשי תיבות של Structured Query Language, ובמלים פשוטות "שפת שאילתות מובנית". בעזרת פקודות SQL מעדכנים נתונים בטבלאות או מקבלים מהן נתונים.

ל SQL יש מספר גרסאות (דיאלקטים) והשפה תלויה בבסיס התונים שאנחנו עובדים אתו (Oracle, MySQL וכו').

פקודות SQL

שפת SQL מחולקת ל 4 פקודות עיקריות: SELECT, INSERT, UPDATE DELETE. הפקודות האלו הן מסוג DML (כלומר Data Manipulation Language).

בנוסף קיימות ב SQL פקודות DDL (כלומר Data Definition Language) שהן פקודות ליצירה של טבלאות.

טבלאות בבסיס הנתונים

בדף זה אני מסביר רק על בסיסי נתונים רלציוניים שהם הנפוצים ביותר. אני לא מסביר על סוגים אחרים של בסיסי נתונים.

בסיסי נתונים מורכבים מטבלאות, כאשר כל טבלה שומרת סוג מסוים של נתונים.

לכל טבלה יש את המאפיינים הבאים:

  1. שם הטבלה – שם שמסביר את מהות הטבלה, כמו Customer או Bill.
  2. העמודות בטבלה – לכל עמודה יש שם (למשל name או price) וסוג (למשל integer או varchar). בנוסף לכל טבלה יכולים להיות אלוצים (constraints) כמו not null. עוד על כך בהמשך.

בנוסף לטבלאות קיימים המבנים הבאים:

  1. תצפיות (veiws) – מבנים הדומים לטבלה שנוצרים ע"י שאילתה.
  2. פרוצדורות (stored procedures) – פונקציות שאפשר להפעיל אותן.
  3. טריגרים (triggers) – פונקציות שמופעלות בתנאים מסויימים.
  4. רצפים (sequences) – מבנים שמחוללים ערכים מספריים.

פקודות DML

  1. SELECT – זוהי הפקודה העשירה ביותר בשפת SQL. פקודת SELECT בסיסית היא בפורמט הבא:
    כאשר:

    • SELECT ו FROM הן הפקודות היחידות שחייבות להופיע.
    • ב SELECT אפשר לציין עמודה אחת או יותר, או שאפשר להשתמש ב * (תביא הכל). אפשר להשתמש ב SELECT DISTINCT כאשר רוצים להביא רק ערכים שונים אחד מהשני.
    • ב FROM אפשר לציין טבלה אחת או יותר. אפשר להשתמש ב Alias לשם הטבלה בעזרת AS.
    • ה WHERE הוא תנאי לסינון נתונים.
    • GROUP BY משמש לקיבוץ נתונים לפי עמודה, כלומר כל הערכים הזהים בעמודה יתנו לנו שורה אחת.
    • HAVING הוא תנאי על הערכים שקובצו ע"י GROUP BY.
    • ORDER BY הוא מיון התוצאה לפי עמודות.

    למשל, עבור הטבלאות הבאות:

    הפקודה select id from persons תביא לנו עמודה אחת עם כל ה id של persons:

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

    שימוש ב Left Outer Join: כדי להביא את כל האנשים עם הנכסים שלהם, גם אם אין להם נכסים, נשתמש בפקודה הבאה:
    במקרה שאין נכס, יוצג NULL במקום הנכס. באותו אופן אפשר להשתמש ב Right Outer Join.

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

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

    כדי להביא את כל האנשים שאין להם assets, נשתמש בפקודה הבאה:
    כאן יש שימוש ב NOT EXISTS וב SUBQUERY. באותו אופן אפשר להשתמש ב EXISTS במקום ב NOT EXITS.

    כדי להביא את כל האנשים שהשם שלהם מתחיל באות T, נשתמש בפקודה הבאה:

    כדי להביא את כל האנשים שהם בין הגילאים 60 ל 62, נשתמש בפקודה הבאה:

    ניתן לאחד 2 פקודות SELECT בעזרת UNION.למשל כדי להביא את כל האנשים בני 60 לפחות, וגם את אלה שהם בני פחות מ 60, נשתמש בפקודה הבאה:

  2. INSERT – פקודה זו משמשת להכנסת נתונים לטבלה, למשל:
  3. UPDATE – פקודה זו משמשת לעדכון נתונים בטבלה, למשל:
    שימו לב שכאן צריך להשתמש ב WHERE (אחרת נעדכן את כל השורות בטבלה).
  4. DELETE – פקודה זו משמשת למחיקת נתונים מהטבלה, למשל:
    שימו לב שגם כאן צריך להשתמש ב WHERE.

פקודות DDL

  1. CREATE TABLE – יצירת טבלה. הפקודה הבסיסית ליצירת טבלה היא:

    כדי לקבל מידע על עמודות הטבלה, אפשר להשתמש בפקודה הבאה:
    כל שורה בפקודת Describe מביאה מידע על עמודה ב employee.
    העמודה הראשונה ב describe היא שם השדה.
    העמודה השניה היא סוג השדה וכמה בתים הוא תופס.
    העמודה השלישית היא האם השדה מקבל NULL.
    העמודה הרביעית היא סוג המפתח.
    העמודה החמישית היא ערכי ברירת מחדל.כמובן שזאת הפקודה הבסיסית ליצירת טבלה. הפקודה הכללית היא:
    כאשר

    • col_type יכול להיות (ב MySQL) אחד הערכים הבאים: Bit, TinyInt, SmallInt, Int, Integer, BigInt, Real, Double, Float, Decimal, Numeric, Date, Time, Char, Varchar, Binary, VarBinary ועוד.
    • col_constraints יכול להיות אחד או יותר האילוצים הבאים:
      1. PRIMARY KEY – כאשר השדה הוא מפתח ראשי.
      2. INDEX – כאשר השדה הוא אינדקס. אינדקס משמש לזירוז שאילתות.
      3. UNIQUE – אותו הערך לא יכול להופיע פעמיים.
      4. REFERENCES – השדה הוא מפתח זר, כלומר השדה מצביע למפתח ראשי מאותו הסוג בטבלה אחרת. בעזרת FOREIGN KEY אפשר להגביל שדות לערכים מסויימים.
      5. COMMENT – הוספת הערה לשדה.
      6. DEFAULT – ערך ברירת מחדל.
      7. AUTO_INCREMENT – קידום אוטומטי של הערכים בשדה.
      8. NULL או NOT NULL.
      9. ועוד…
    • בנוסף additional_constraints דומים ל col_constraints אבל הם משמשים להוספת אילוץ למספר שדות יחד (למשל PRIMARY KEY שמורכב ממספר שדות).
  2. CREATE TRIGGER – יצירת טריגר, כלומר פונקציה שמעדכנת טבלאות כתוצאה מפעולת INSERT, UPDATE או DELETE:
    כאשר

    • trigger_time הוא BEFORE או AFTER (לפני או אחרי ביצוע הפעולה).
    • trigger_event זה INSERT, UPDATE או DELETE.
    • trigger_body הן הפקודות שאותן רוצים לבצע.
  3. CREATE VIEW – יצירת תצפית על טבלה או טבלאות בעזרת שאילתה:
    למשל:
  4. CREATE SEQUENCE – יצירת סדרה של מספרים (לא עובד ב MySQL):
    (הערה: זה ה SYNTAX של ORACLE).
    כאשר:

    • START WITH הוא הערך ההתחלתי של הסדרה.
    • INCREMENT BY הוא הערך שבו מקדמים את הסדרה.
    • MINVALUE הוא ערך מינימלי לסדרה.
    • MAXVALUE הוא ערך מקסימלי לסדרה.
    • CYCLE אומר לחזור לערך המינימלי כאשר מגיעים למקסימום.
    • CACHE אומר לשמור ערכים של הסדרה ב CACHE.
    • ORDER אומר לשמור על סדר כאשר עובדים עם מספר Connections.
  5. CREATE PROCEDURE – יצירת פרוצדורה. לפרוצדורה יכולים להיות פרמטרים מסוג IN, OUT או INOUT. פרוצדורה יכולה לבצע מספר פקודות בבת אחת.
  6. DROP TABLE או כל פקודת DROP אחרת – השמדת המבנה שיצרנו.

רפרנס

קיים חומר רב ברשת על SQL, למשל ב w3schools.

3 תגובות »

  1. ציטוט שלך:
    "כדי להביא את כל האנשים עם הנכסים שלהם, נשתמש בפקודה הבאה:
    שימו לב שכאן הייתי חיב לשים את שם הטבלה לפני id כי יש id גם ב persons וגם ב assets.
    בנוסף הייתי חיב כאן WHERE כדי לקבל את התוצאה הנכונה (ללא ה WHERE הייתי מקבל 12 שורות)."

    ואני שואל: למה היית מקבל 12 שורות?? נראה לי שהיית מקבל רק 7, לא?

    תגובה של aaa — 20 באפריל 2012 @ 0:08 | הגב

    • היית מקבל גודל טבלה ראשונה X גודל טבלה שנייה שזה 12
      ולא גודל טבלה ראשונה + גודל טבלה שנייה שזה אכן 7.
      כדאי לך לבדוק את זה בעצמך!

      תגובה של רן — 20 באפריל 2012 @ 20:23 | הגב

  2. אני יודע קצת SQL, וע"פ הידע שלי השאילתה הזאת: SELECT * FROM table1,table2 אומרת: ש"תשלוף את כל השורות מהטבלה 1 ומהטבלה 2 " – כך שזה לא מכפיל אלא רק שולף, ולכן אם בטבלה1 יש 4 שורות ובטבלה2 יש 3 שורות אז ישלף רק 7.
    לא ככה?

    תגובה של aaa — 22 באפריל 2012 @ 20:42 | הגב


RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

%d בלוגרים אהבו את זה: