SQL

SQL (קיצור של Structured Query Language) היא שפת מחשב הצהרתית לטיפול ועיבוד מידע במסדי נתונים יחסיים, שפותחה על ידי IBM, והתבססה במקור על אלגברה רלציונית. השפה מאפשרת שליפת נתונים ועדכונם ויצירת טבלה ושינויה.

SQL הייתה אחת השפות הראשונות המיועדת למסד נתונים יחסי שתיאר אדגר קוד במאמרו החלוצי "A Relational Model of Data for Large Shared Data Banks" והיא השפה הנפוצה ביותר לתשאול מסדי נתונים יחסיים.

היסטוריה 
בתחילת שנות השבעים פותחה ב-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 מאחורי הקלעים, באופן שהמשתמש אינו צריך להיחשף למבנה הפנימי ולתחביר המדויק שלהן.

תחביר 

הוראות שפת SQL מתחלקות למספר תחומים עיקריים:
 DRL - שפת אחזור נתונים (Data Retrieval Language)
 משפט SELECT, מאחזר נתונים מתוך טבלה (או מספר טבלאות), אבל לא מבצע בהם שינויים קבועים.
 DML - שפת מניפולציה בנתונים (Data Manipulation Language) - שפה המשמשת לטיפול בנתונים עצמם
 משפט INSERT מוסיף שורות חדשות לטבלה.
 משפט UPDATE מעדכן נתונים בשורות הקיימות בטבלה.
 משפט DELETE מוחק שורות נתונים מטבלה.
 משפט MERGE משמש למזג נתונים של מספר טבלאות (תוקנן ב-SQL:2003).
 DDL - שפת הגדרת נתונים (Data Definition Language) - שפה המשמשת לטיפול במבנה הנתונים (הוספת ומחיקת טבלאות, עמודות ואינדקסים)
 משפט CREATE יוצר פריט מבנה חדש - טבלה, טבלה מדומה (View), עמודה וכדומה.
 משפט ALTER משנה את תכונותיו של פריט קיים.
 משפט DROP מוחק פריט קיים.
 משפט TRUNCATE TABLE מוחק נתוני טבלה תוך עקיפה של אימותי נתונים (תוקנן ב-SQL:2008)
 DCL - שפת בקרת נתונים (Data Control Language) - שפה המשמשת לקביעת הרשאות גישה לרכיבי מסד הנתונים
 משפט GRANT מעניק זכות גישה למשתמש או לקבוצת משתמשים.
 משפט REVOKE מונע זכות גישה ממשתמש או מקבוצה.

הערה: יש הרואים ב-DCL - שפת בקרת נתונים חלק משפת הגדרת נתונים Data Definition Language.

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

אופרטורים

שאילתה בחירה - שליפת נתונים

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

שאילתות מאפשרות למשתמש לתאר את הנתונים הרצויים, כאשר מערכת ניהול מסדי נתונים (DBMS) אחראית על תכנון, ביצוע מיטוב וביצוע הפעולות הפיזיות הדרושות כדי לייצר את התוצאה הרצויה.
 את המשפט פותחת הפסוקית SELECT שמגדירה את העמודות שהתוכנה תקרא ותציג. כוכבית ("*") משמשת לקבוע שהשאילתה תחזיר את כל העמודות בטבלה. בפקודה זו ניתן ליצור שדה מחושב מדומה, המכיל תוכן שדה או שדות שעברו מניפולציה מתמטית. או להפעיל פונקציה על שדה, או לכנות שם שדה בשם אחר. SELECT הוא ההצהרה המורכבת ביותר ב-SQL, עם מילות מפתח אופציונליות כמו DISTINCT (הסרת כפולים) ו-TOP (אחוז או מספר רשומות שיוצגו).
 פסוקית FROM מציין את הטבלה/הטבלאות שממנו/מהם יאוחזרו הנתונים. משפט FROM יכול לכלול סעיפי משנה לצירוף אופציונליים כדי לציין את הכללים לצירוף טבלאות (JOIN). אין הגבלה למספר הטבלאות. קיימים סוגי צירוף שונים בין טבלאות שיתנו תוצאות שונות, עד למכפלה קרטזית שתכפיל את כל השורות של הטבלאות המצורפות.
 פסוקית WHERE כולל נשוא השוואה ומאפשר הגדרת תנאי לוגי, המגביל את השורות המוחזרות על ידי השאילתה. משפט WHERE מבטל את כל השורות מהתוצאה להגדיר עבורו את נשוא ההשוואה ללא הערכה נכונה. ניתן להשתמש ברוב האופרטורים של השפה בתנאי של משפט זה החל מאופרטורים השוואתיים וכלה בבדיקות מחרוזתיות. ניתן לבצע בדיקת ערך מול קבוצת ערכים המוחזרת מתת שאילתה.
 פסוקית GROUP BY משמש לקבץ שורות של ערכים זהים לקבוצה קטנה יותר של שורות. GROUP BY משמש לעיתים קרובות בשילוב עם פונקציות הצבירה של SQL או לבטל שורות כפולות בתוצאות. משפט WHERE מיושם לפני משפט GROUP BY.
 פסוקית HAVING כולל נשוא המשמש לסינון שורות הנובעות ממשפט GROUP BY בלבד. משום שהיא פועלת על תוצאות משפט GROUP BY, לכן בפונקציות צבירה ניתן להשתמש בנשוא הסעיף הקיים.
 פסוקית ORDER BY מגדירה את העמודה או העמודות שלפיהן ימוינו הנתונים המתקבלים, וקובעת את סדר המיון (עולה או יורד). ללא משפט ORDER BY סדר השורות המוחזרות על ידי שאילתת ה-SQL איננו מוגדר.

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

דוגמאות

הדוגמה הבאה ממחישה את הפקודה החוקית הקצרה ביותר במשפט SELECT. פקודה זו תאחזר את כל טבלת Book. הכוכבית (*) ברשימה הנבחרת מצביעה על כך שכל העמודות של טבלת הספר צריכים להיות כלולות בנתוני התוצאות.
 SELECT * FROM Book;

להלן דוגמה של שאילתת בחירה שמחזירה רשימה של ספרים יקרים. השאילתה מאחזרת את כל השורות מטבלת הספר (Book) שעמודת המחיר שלהן (שדה price) מכיל ערך הגדול מ-250.00. התוצאה מסודרת בסדר עולה לפי כותרת (שדה title). 

 SELECT *
 FROM Book
 WHERE price > 250.00
 ORDER BY title;

המשפט הבא מדגים כיצד אפשר לבצע שאילתא על טבלאות מרובות וקיבוץ נתונים, באמצעות החזרת רשימת ספרים ומספר המחברים שלהם משתי טבלאות Book ו-Book_author כאשר שדה הקשר הוא 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;

מניפולציה על נתונים 
 INSERT מוסיף שורות לטבלה קיימת, לדוגמה:

INSERT INTO example
 (field1, field2, field3)
 VALUES
 ('test', 'N', NULL);
 UPDATE מעדכן סט של שורות קיימות בטבלה, למשל:

UPDATE example
 SET field1 = 'updated value'
 WHERE field2 = 'N';
 DELETE מוחק שורות קיימות מהטבלה, לדוגמה:

DELETE FROM example
 WHERE field2 = 'N';
 MERGE משמש למזג נתונים של מספר רב של טבלאות. הוא משלב INSERT ו-UPDATE. (מוגדר בתקן של SQL 2003 והורחב ב-SQL:2008; קודם לכן, כמה מסדי נתונים סיפקו פונקציונליות דומה באמצעות תחביר שונה, שכונה לעיתים "upsert")

 MERGE INTO table_name USING table_reference ON (condition)
 WHEN MATCHED THEN
 UPDATE SET column1 = value1 [, column2 = value2 ...]
 WHEN NOT MATCHED THEN
 INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...

הגדרת נתונים 
 משפט CREATE יוצר אובייקט (למשל טבלה) במסד הנתונים. לדוגמה:

CREATE TABLE example(
 field1 INTEGER,
 field2 VARCHAR(50),
 field3 DATE NOT NULL,
 PRIMARY KEY (field1, field2)
);
 משפט ALTER מבצע שינוי של אובייקט קיים במסד הנתונים, כמו הוספת שדה או שינוי הגדרתו. לדוגמה:

ALTER TABLE example ADD field4 NUMBER(3) NOT NULL;
 משפט Drop מוחק אובייקט במסד הנתונים. בדרך כלל פעולה בלתי הפיכה, כלומר, לא ניתן לשחזרה, לדוגמה:

DROP TABLE example;
 משפט CREATE VIEW יוצר טבלה מדומה (שניתן לתשאל אותה כמו טבלה רגילה) במסד הנתונים
 CREATE VIEW vTableY AS
 SELECT quantity, price, quantity*price AS amount
 FROM tableX;

בקרת נתונים 
 משפט GRANT מעניק למשתמש אחד או יותר הרשאה לביצוע פעולה או קבוצה של פעולות על אובייקט.

GRANT SELECT, UPDATE
 ON example
 TO some_user, another_user;
 משפט REVOKE מבטל הרשאה, אשר עשויה להיות הרשאת ברירת המחדל

REVOKE SELECT, UPDATE
 ON example
 FROM some_user, another_user;

תקינה 

היסטוריה של התפתחות התקינה בשפה:

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

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

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

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

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

ראו גם 
הזרקת SQL
Join
MySQL
Microsoft SQL Server
LINQ
שאילתות היררכיות ורקורסיביות ב-SQL

לקריאה נוספת 
 רז הייפרמן, מסד נתונים טבלאיים ושפת SQL, הוצאת הד עמי, 2000
 ריאן ק. סטפנס ודונלד פלו, SQL ב-21 שיעורים, הוצאת פוקוס, 2000

קישורים חיצוניים 
 

מדריך לשפת SQL באתר w3schools (באנגלית, מכיל אפשרות להתנסות במשפטי SQL באופן אינטראקטיבי)
מדריך לשפת SQL באתר WEBMASTER.ORG.IL
 מדריך לשפת SQL - רם קדם
מידע על התקן האחרון ISO/IEC 9075-2:2003 - המכונה SQL-2003
 
 

שפות שאילתות
תוכנות סטטיסטיות