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 ממסד נתונים אחד לאחר מצריכה בדרך כלל עריכת שינויים משמעותיים. בדרך כלל השימוש בתוספות קנייניות אמור לפשט או לשפר את היכולת לבצע פעולות ב-SQL, וזאת במחיר של מעבר מסובך יותר בין מסדי נתונים.
השפה היא שפה הצהרתית מבוססת אלגברה טבלאית, שעיקרה עבודה עם נתונים במודל טבלאי רלציוני. על אף שמה, השפה איננה רק שפת שאילתות, אלא למעשה שפת הנתונים המקיפה ביותר, המאפשרת קשת רחבה של עבודה מול מסד נתונים. החל מיצירת טבלאות סטטיות, אינדקסים ויצירת טבלאות דינמיות מדומות (View). הגדרת אילוצים עסקיים (Assertions) ויצירת טריגרים (הדקים). דרך קריאת נתונים בדרכים מגוונות, הכוללות פעולות בין טבלאות (כמו צירוף נתוני טבלאות ופעילות של איחוד וחיתוך בין נתוני טבלאות). וכלה במניפולציה על נתונים כמו הוספת רשומות, עדכונן ומחיקתן ואף אבטחת נתונים וניהול תנועות.
השפה איננה שפת תכנות מלאה, כיוון שחסרים בה פקודות לוגיות ומשפטי בקרה, ולכן יש בה קשיחות שלרוב צריכה להיפתר על ידי אירוחה בשפת תכנות עילית. בשפה קיימות מילים שמורות (שאין להשתמש בהן בשמות טבלאות / שדות / אינדקסים), טיפוסי קבועים, משתנים, אופרטורים ופונקציות מובנות. צורת הכתיבה גמישה מאוד. השפה איננה רגישה לגודל אות (Case Insensitivity). אף שמקובל לרשום את הפקודות באותיות גדולות, ונהוג לפצל פסוקיות באותה פקודה לשורות נפרדות, הדבר איננו הכרחי ומדובר בנורמה שנעשית לשם הקריאות. ניתן לכתוב פקודה בכל גודל אות, וניתן לכתוב פקודה בשורה אחת, או במספר שורות לפי רצון המשתמש, כל עוד נשמר הסדר של פסוקיות הפקודה. צורתן של פסוקיות השפה הן אחידות, דבר המקל על השימוש בה (למשל גם פקודת הקריאה וגם פקודת המחיקה של רשומות דומה מאוד).
כל משפט SQL מתחלק למספר פסוקיות וצריך להסתיים בנקודה פסיק ";". כל פסוקית מתחילה במילת מפתח, ולכל סוג של פסוקית מבנה מוגדר. לייצוג של טבלה ושדה וקבועים אלפא-נומריים בפסוקיות המתאימות קיימים כללים בשפה. כך למשל קבוע אלפא-נומרי צריך להופיע בין גרש (') משני צדדיו.
בניגוד לשפות תכנות עיליות, סדר הביצוע של משפט SQL איננו מתבצע לפי סדר הכתיבה. בדרך כלל פסוקית SELECT תתבצע לקראת הסוף, כאשר הפסוקית הראשונה שתתבצע תהיה פסוקית FROM. כל שלב בעיבוד מייצר טבלה וירטואלית זמנית אשר מהווה את הקלט לשלב הבא. בשאילתת SELECT מורכבת במיוחד (שיש בה צירוף בין טבלאות, תנאי סינון, הקבצה, מניעת כפילויות וצמצום מספר הרשומות למספר מסוים) מספר הטבלאות הווירטואליות עשוי להגיע אף לעשר.
מסדי נתונים יחסיים הם כיום הדרך המקובלת לאגירת מידע רב. שפת SQL היא הדרך המקובלת לגשת למסדי נתונים יחסיים. וגופים שונים כמו גופי ממשל, חברות מסחריות, וארגונים ללא כוונות רווח עושים בו שימוש רב, אם במסדי נתונים גדולים ואם במסדי נתונים מקומיים.
עם התפתחותה של רשת האינטרנט, אתרי אינטרנט דינמיים ומערכות ניהול תוכן, משתמשים במסדי נתונים בשביל לשמור את תוכן האתר עצמו, ומחוללים את הדפים באמצעות שליפה של תוכן ממסד הנתונים. כך יוצא ששפות שעושות שימוש בטכנולוגיית צד שרת כמו PHP, ASP ו-JSP משתמשות שימוש רב בשאילתות, כדי ליצור דפי אינטרנט, כאשר התוכנה המפעילה אותן היא בעצם דפדפן אינטרנט כלשהו.
במקרים רבים השאילתות עצמן חבויות מאחורי ממשק משתמש ידידותי, אשר יוצר שאילתות כחלק מעבודתו. לדוגמה חלק ניכר מפעילותה של ויקיפדיה נעשה באמצעות שאילתות אלו. להוספת ערך, עדכונו או מחיקתו, לשליפת נתונים כמו "שינויים אחרונים" שנעשו או שליפת הערכים של "התרומות שלי". בכולן יש הפעלה ושימוש בשאילתות SQL מאחורי הקלעים, באופן שהמשתמש אינו צריך להיחשף למבנה הפנימי ולתחביר המדויק שלהן.
הוראות שפת SQL מתחלקות למספר תחומים עיקריים:
טיפוסי נתונים אשר מגדירים את סוג העמודות של מסד הנתונים (אם כי לעיתים במסדי נתונים בסוגי טיפוסים מסוימים ישנן הגדרות קצת אחרות מהתקן)
הפעולה הנפוצה ביותר ב-SQL היא השאילתה, אשר מתבצעת עם משפט SELECT ההצהרתי. SELECT מאחזר נתונים מטבלה אחת או יותר, או ביטויים. למשפטי SELECT רגילים אין השפעות מתמשכות על מסד הנתונים. כמה יישומים לא תקניים של SELECT יכולים להיות השפעה מתמשכת, כגון SELECT INTO תחביר שקיים בחלק ממסדי הנתונים.
שאילתות מאפשרות למשתמש לתאר את הנתונים הרצויים, כאשר מערכת ניהול מסדי נתונים (DBMS) אחראית על תכנון, ביצוע מיטוב וביצוע הפעולות הפיזיות הדרושות כדי לייצר את התוצאה הרצויה.
מכל פסוקיות השאילתה הפקודות 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 INTO example (field1, field2, field3) VALUES ('test', 'N', NULL);
UPDATE example SET field1 = 'updated value' WHERE field2 = 'N';
DELETE FROM example WHERE field2 = 'N';
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 TABLE example( field1 INTEGER, field2 VARCHAR(50), field3 DATE NOT NULL, PRIMARY KEY (field1, field2) );
ALTER TABLE example ADD field4 NUMBER(3) NOT NULL;
DROP TABLE example;
CREATE VIEW vTableY AS SELECT quantity, price, quantity*price AS amount FROM tableX;
GRANT SELECT, UPDATE ON example TO some_user, another_user;
REVOKE SELECT, UPDATE ON example FROM some_user, another_user;
היסטוריה של התפתחות התקינה בשפה:
לרוב התוכנות ומסדי הנתונים המשתמשים ב-SQL, ישנם גם כלי עריכה חזותיים המאפשרים ליצור משפטי SQL שלמים שלא בכתיבה רגילה, אלא במה שקרוי תכנות חזותי באמצעות גרירת והשלכת סמלים גרפיים ומילוי תיבות טקסט ותיבות משולבות. קיימים כלים ליצירת טבלאות ואינדקסים, הענקת הרשאות, יצירת אימותי ייחוסים בין טבלאות, ויצירת שאילתות אחזור ופעולה.
כך למשל לשם יצירת שאילתות אחזור, קיים ברוב מסד הנתונים כלי נפוץ מאוד הנקרא QBE - Query By Example (=שאילתות לפי דוגמה). כלי זה מכיל טופס שבו אפשר לבחור טבלאות ועמודות מתיבות רשימות קיימות, וכן מאפשר גרירת סמלי אובייקטים והשלכתם על סמלי אובייקטים אחרים, כדי ליצור קשרים בין טבלאות (JOIN) או לבחור עמודות. מילוי של קריטריוני שליפה (WHERE) וסדר מיון של שאילתא (ORDER BY) ברשת טבלאית באמצעות תיבות טקסט ותיבות משולבות, וקביעת מאפייני שאילתה כלליים באמצעות טופס שמכיל תיבות טקסט. בכלי זה יש משוכללים יותר ופחות. המשוכללים יותר מראים ייצוג גרפי של פעולות ליד שם העמודה ברשימה, ואף מאפשרים לראות במקביל את שלושת המבטים של המחולל: המבט הגרפי, הטקסט של הפסוקית והתוצאה של השורות המאוחזרות.
שיטה זו מקלה על עבודת הפיתוח ומאפשר ליצור פסוקית SQL מורכבת בקלות יחסית, ויעילה במיוחד כאשר מדובר בשאילתות שגרתיות שחוזרות על עצמן. יתרונה של שיטה זו, כמו בכל תכנות חזותי: כתיבה מהירה וידידותית של פסוקית ה-SQL, הנגשה של השפה לחתך נוסף של אוכלוסייה, חוסר צורך בידיעת השפה על בוריה, הימנעות משגיאות תחביר.
בכלי זה התכנות החזותי והטקסטואלי מקיימים קשר הדדי, וכל שינוי בכלי אחד משתקף מיד בכלי האחר.