SQL

היסטוריה

בתחילת שנות השבעים פותחה ב-IBM בהובלתם של דונלד צ'מברלין וריימונד בויס שפת SEQUEL. שפה זו יועדה לתשאול ולמניפולציה על נתונים במסד הנתונים היחסי המקורי של IBM, ‏System R. מאוחר יותר הוחלף שמה של השפה ל-SQL מאחר ש-SEQUEL היה רשום כבר כשם מסחרי על ידי הוקר סידלי, חברת ייצור מטוסים בריטית.
מסד הנתונים היחסי הראשון פותח ב-MIT בתחילת שנות השבעים, וב-1974 פותח Ingres באוניברסיטת קליפורניה בברקלי. Ingres מימש שפת QUEL, אשר הוחלפה בהמשך על ידי SQL.
בסוף שנות השבעים חברת Relational Software (כיום אורקל) ראתה את הפוטנציאל הגלום ברעיונות שתיארו אדגר קוד, דונלד צ'מברלין וריימונד בויס ופיתחה מערכת בסיס נתונים יחסי מבוססת SQL, בשאיפה למכור אותה לסוכנויות ממשלתיות כדוגמת הצי האמריקאי וה-CIA. בקיץ 1979 השיקה Relational Software את המימוש המסחרי הראשון ל-SQL, אורקל V2 למחשבי VAX. זמן קצר אחרי כן הוציאה IBM לשוק את בסיס הנתונים היחסי שלה, במחשבי System/38.
ב-1986 אומץ SQL כסטנדרט על ידי מכון התקנים האמריקני (ANSI) וב-1987 על ידי ארגון התקינה הבינלאומי (ISO). ומאז גופי תקינה נוספים אימצו את ה-SQL ביניהם FIPS, OSF, X/Open ו-SQL Access Group.

השפה

שמה של שפת SQL מתפרש, מילולית, כ"שפת שאילתות מובנית" (Structured Query Language), משום שתפקידה הראשוני של השפה היה לאחזר נתונים בתשובה לשאילתות. עם הזמן הורחב תפקידה להרבה יותר מכך, ולכן מקובל כיום לכנות את הוראות השפה כ"משפטים" (SQL Statements) ולא "שאילתות" (SQL Queries) כבעבר.
SQL היא שפת מחשב הצהרתית, כלומר, היא מתארת רק מה לבצע ולא כיצד לבצע, ומתמקדת במהות ולא בטכניקה. מכיוון שכך, ניתן להשתמש באותו משפט SQL בבסיסי נתונים שונים, הפועלים בדרכים שונות לחלוטין. אי תלותה של SQL במבנה הנתונים, בנוסף על עוצמתה של השפה, המאפשרת לאחזר חתכים מורכבים בפשטות רבה, דבר המביא להגדלת הפריון של מתכנתי השפה, והתפשטותה למשתמשים שאינם מתכנתים, הפכו אותה לשפה המקובלת ביותר כיום בניהול בסיסי נתונים.
שפת SQL פותחה במקורה על ידי IBM, אך מאז הועתקה על ידי חברות רבות, ואף אומצה על ידי מכון התקנים האמריקאי (ANSI) ב-1986 ועל ידי ארגון התקינה הבינלאומי (ISO) ב-1987. מערכות עיקריות לניהול בסיסי נתונים בשפה הן DB2, Firebird, HSQL, Informix, Interbase, MariaDB, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, PervasiveSQL, SQLite, Sybase ASE.
השפה מתאימה לעבודה בעיקר עם בסיסי נתונים יחסיים, אף על פי שגם חלק מיצרני בסיסי נתונים מסוגים אחרים התאימו את השפה לשימוש עם בסיסי הנתונים שלהם.
ניתן להשתמש במשפטי SQL בתוך קוד הכתוב בשפות תכנות אחרות. אופן עבודה נפוץ זה נקרא Embedded SQL ונתמך במרבית שפות התכנות הנפוצות. באופן עבודה זה משפטי ה-SQL מבצעים פעולות מול בסיס הנתונים, והפקודות בשפה האחרת מבצעות פעולות של לוגיקה עסקית וממשק משתמש.
השפה היא פופולרית מאוד כיום בכל בסיסי הנתונים הקיימים, דבר המאפשר ניידות מבסיס נתונים אחד לשני, שימור השקעה של ידע בנושא, קישוריות בין בסיסי נתונים שונים והתמדה בשיפורה של השפה.
חברות שפיתחו בסיסי נתונים וכלי תוכנה אחרים המשתמשים בשפת SQL הוסיפו תוספות קנייניות לתקן העשויות לשנות את תחביר השפה, כך שהסבת משפטי SQL מבסיס נתונים אחד לאחר מצריכה בדרך כלל עריכת שינויים משמעותיים.

איפיוני השפה

השפה היא שפה הצהרתית מבוססת אלגברה טבלאית, שעיקרה עבודה עם נתונים במודל טבלאי רלציוני. אף על פי שמה השפה איננה רק שפת שאילתות, אלא למעשה שפת הנתונים המקיפה ביותר, המאפשרת קשת רחבה של עבודה מול בסיס נתונים. החל מיצירת טבלאות סטטיות, אינדקסים, ויצירת טבלאות דינמיות מדומות (View). הגדרת אילוצים עסקיים (Assertions), ויצירת טריגרים (הדקים). דרך קריאת נתונים בדרכים מגוונות, הכוללות פעולות בין טבלאות (כמו צירוף נתוני טבלאות ופעילות של איחוד וחיתוך בין נתוני טבלאות). וכלה במניפולציה על נתונים כמו הוספת רשומות, עדכונן ומחיקתן, ואף אבטחת נתונים וניהול תנועות.
השפה איננה שפת תכנות מלאה, כיוון שחסרים בה פקודות לוגיות ומשפטי בקרה, ולכן יש בה קשיחות שלרוב צריכה להיפתר על ידי אירוחה בשפת תכנות עילית. בשפה קיימות מילים שמורות (שאין להשתמש בהן בשמות טבלאות / שדות / אינדקסים), טיפוסי קבועים, משתנים, אופרטורים ופונקציות מובנות. צורת הכתיבה גמישה מאוד. השפה איננה רגישה לגודל אות (Case Insensitivity). אף שמקובל לרשום את הפקודות באותיות גדולות, ונהוג לפצל פסוקיות באותה פקודה לשורות נפרדות, הדבר איננו הכרחי ומדובר בנורמה שנעשית לשם הקריאות. ניתן לכתוב פקודה בכל גודל אות, וניתן לכתוב פקודה בשורה אחת, או במספר שורות לפי רצון המשתמש, כל עוד נשמר הסדר של פסוקיות הפקודה. צורתן של פסוקיות השפה הן אחידות, דבר המקל על השימוש בה (למשל גם פקודת הקריאה וגם פקודת המחיקה של רשומות דומה מאוד).
כל משפט SQL מתחלק למספר פסוקיות וצריך להסתיים בנקודה פסיק ";". כל פסוקית מתחילה במילת מפתח, ולכל סוג של פסוקית מבנה מוגדר. לייצוג של טבלה ושדה וקבועים אלפא-נומריים בפסוקיות המתאימות קיימים כללים בשפה. כך למשל קבוע אלפא-נומרי צריך להופיע בין גרש (') משני צדדיו.
בניגוד לשפות תכנות עיליות, סדר הביצוע של משפט SQL איננו מתבצע לפי סדר הכתיבה. בדרך כלל פסוקית SELECT תתבצע לקראת הסוף, כאשר הפסוקית הראשונה שתתבצע תהיה פסוקית FROM. כל שלב בעיבוד מייצר טבלה וירטואלית זמנית אשר מהווה את הקלט לשלב הבא. בשאילתת SELECT מורכבת במיוחד (שיש בה צירוף בין טבלאות, תנאי סינון, הקבצה, מניעת כפילויות וצמצום מספר הרשומות למספר מסוים) מספר הטבלאות הווירטואליות עשוי להגיע אף לעשר.

שימושים

מסדי נתונים יחסיים הם כיום הדרך המקובלת לאגירת מידע רב. שפת SQL היא הדרך המקובלת לגשת למסדי נתונים יחסיים. וגופים שונים כמו גופי ממשל, חברות מסחריות, וארגונים ללא כוונות רווח עושים בו שימוש רב, אם במסדי נתונים גדולים ואם במסדי נתונים מקומיים.
עם התפתחותה של רשת האינטרנט, אתרי אינטרנט דינמיים ומערכות ניהול תוכן, משתמשים במסדי נתונים בשביל לשמור את תוכן האתר עצמו, ומחוללים את הדפים באמצעות שליפה של תוכן מבסיס הנתונים. כך יוצא ששפות שעושות שימוש בטכנולוגיית צד שרת כמו PHP, ASP ו-JSP משתמשות שימוש רב בשאילתות, כדי ליצור דפי אינטרנט, כאשר התוכנה המפעילה אותן היא בעצם דפדפן אינטרנט כלשהו.
במקרים רבים השאילתות עצמן חבויות מאחורי ממשק משתמש ידידותי, אשר יוצר שאילתות כחלק מעבודתו. לדוגמה חלק ניכר מפעילותה של ויקיפדיה נעשה באמצעות שאילתות אלו. להוספת ערך, עדכונו או מחיקתו, לשליפת נתונים כמו "שינויים אחרונים" שנעשו או שליפת הערכים של "התרומות שלי". בכולן יש הפעלה ושימוש בשאילתות SQL מאחורי הקלעים, באופן שהמשתמש אינו צריך להיחשף למבנה הפנימי ולתחביר המדויק שלהן.

דוגמאות

הדוגמה הבאה ממחישה את הפקודה החוקית הקצרה ביותר במשפט SELECT. פקודה זו תאחזר את כל טבלת Book. הכוכבית (*) ברשימה הנבחרת מצביעה על כך שכל העמודות של טבלת הספר צריכים להיות כלולות בנתוני התוצאות.
 SELECT * FROM Book;
להלן דוגמה של שאילתת בחירה שמחזירה רשימה של ספרים יקרים. השאילתה מאחזרת את כל השורות מטבלת הספר (Book) שעמודת המחיר שלהן (שדה price) מכיל ערך הגדול מ-250.00. התוצאה מסודרת בסדר עולה לפי כותרת (שדה title). 
 SELECT *
 FROM Book
 WHERE price > 250.00
 ORDER BY title;
המשפט הבא מדגים כיצד אפשר לבצע שאילתא על טבלאות מרובות וקיבוץ נתונים, באמצעות החזרת רשימת ספרים ומספר המחברים שלהם משתי טבלאות Book ו-Authors כאשר שדה הקשר הוא isbn:
 SELECT Book.title, count(*) AS Authors
 FROM Book JOIN Book_author
    ON Book.isbn = Book_author.isbn
 GROUP BY Book.title;
התוצאה של השאילתא תהיה שדה של כותרים ושדה של מספר המחברים לכותר:
Title Authors
---------------------- -------
SQL Examples and Guide 4
The Joy of SQL 1
An Introduction to SQL 2
Pitfalls of SQL 1

תת-שאילתות

שאילתות יכולות להיות מקוננות, כך שניתן להשתמש בתוצאות של שאילתה אחת בשאילתה שנייה. ניתן להשתמש בשאילתה אחרת באמצעות מפעיל יחסי או פונקציית צבירת שאילתות. השאילתה מקוננת ידועה גם בשם "שאילתת משנה". השימוש בתת-שאילתה מציג היררכיה בביצוע שיכול להיות שימושי או הכרחי.
בדוגמה הבאה, פונקציית צבירת AVG מקבלת כקלט את התוצאה של שאילתת משנה, כלומר יוצגו רק רשומות של ספרים שמחירם (שדה price) נמוך מהממוצע בטבלה:
 SELECT isbn, title, price
 FROM Book
 WHERE price < (SELECT AVG(price) FROM Book)
 ORDER BY title;

כלי כתיבה חזותיים

לרוב התוכנות ובסיסי הנתונים המשתמשים ב-SQL, ישנם גם כלי עריכה חזותיים המאפשרים ליצור משפטי SQL שלמים שלא בכתיבה רגילה, אלא במה שקרוי תכנות חזותי באמצעות גרירת והשלכת סמלים גרפיים ומילוי תיבות טקסט ותיבות משולבות. קיימים כלים ליצירת טבלאות ואינדקסים, הענקת הרשאות, יצירת אימותי ייחוסים בין טבלאות, ויצירת שאילתות אחזור ופעולה.
כך למשל לשם יצירת שאילתות אחזור, קיים ברוב בסיס הנתונים כלי נפוץ מאוד הנקרא QBE - Query By Example (=שאילתות לפי דוגמה). כלי זה מכיל טופס שבו אפשר לבחור טבלאות ועמודות מתיבות רשימות קיימות, וכן מאפשר גרירת סמלי אובייקטים והשלכתם על סמלי אובייקטים אחרים, כדי ליצור קשרים בין טבלאות (JOIN) או לבחור עמודות. מילוי של קריטריוני שליפה (WHERE) וסדר מיון של שאילתא (ORDER BY) ברשת טבלאית באמצעות תיבות טקסט ותיבות משולבות, וקביעת מאפייני שאילתה כלליים באמצעות טופס שמכיל תיבות טקסט. בכלי זה יש משוכללים יותר ופחות. המשוכללים יותר מראים ייצוג גרפי של פעולות ליד שם העמודה ברשימה, ואף מאפשרים לראות במקביל את שלושת המבטים של המחולל: המבט הגרפי, הטקסט של הפסוקית והתוצאה של השורות המאוחזרות.
שיטה זו מקלה על עבודת הפיתוח ומאפשר ליצור פסוקית SQL מורכבת בקלות יחסית, ויעילה במיוחד כאשר מדובר בשאילתות שגרתיות שחוזרות על עצמן. יתרונה של שיטה זו, כמו בכל תכנות חזותי: כתיבה מהירה וידידותית של פסוקית ה-SQL, הנגשה של השפה לחתך נוסף של אוכלוסייה, חוסר צורך בידיעת השפה על בוריה, הימנעות משגיאות תחביר.
בכלי זה התכנות החזותי והטקסטואלי מקיימים קשר הדדי, וכל שינוי בכלי אחד משתקף מיד בכלי האחר.