دستورات SQL برای ارتباط زبانهای برنامه نویسی با پایگاه داده های رابطه ای مثل MySQL و SQLServer و… به کار میرود. از این دستورات برای درج، حذف، ویرایش و استخراج داده ها از پایگاه داده به کار می رود.
انواع دستورات SQL
انواع دستورات SQL به چهار بخش تقسیم می شود که به طور مختصر به آن CRUD گفته می شود. یعنی
- درج داده در پایگاه داده
- ویرایش داده در پایگاه داده
- حذف داده از پایگاه داده
- استخراج داده های پایگاه داده
در این قسمت مثالهای هر کدام را خواهیم گفت.
مثالهای دستورات و کوئری های SQL
ثبت داده در پایگاه داده
INSERT INTO table (column1, column2, column3, ...) VALUES ("value1","value2",value3,...)
یا
INSERT INTO table VALUES ("value1","value2",value3,...)
برای درج داده در پایگاه داده از کد بالا استفاده می کنیم که table نام جدولی که می خواهیم داده ها در آن ذخیره شود، columnها نام ستونهای جدول و valueها هم مقادیری که باید ذخیره شود.
نکته ای که اینجا باید به آن توجه داشت این است که اگر مقدار از نوع رشته ای باشد حتما باید داخل کوتیشن نوشته شود اما برای مقادیر عددی اجباری نیست.
نکته ی بعدی اینکه اگر ستون از نوع Auto Increment باشد، نام و مقدار آن وارد نمی شود.
حذف داده از پایگاه داده
DELETE FROM table WHERE id=1
برای حذف داده از پایگاه داده از کوئری بالا استفاده می کنیم. نکته ی مهمی که باید در نظر بگیرید این است که اگر شرط WHERE تعیین نشود، تمامی داده ها و اطلاعات از جدول حذف خواهند شد.
ویرایش داده در پایگاه داده
UPDATE table SET column1_name='value1', column2_name=value2 WHERE id=1
در نمونه کد بالا در حال ویرایش رکوردی هستیم که id آن یک(1) می باشد. داده ستون اول و ستون دوم رکورد مورد نظر در جدول table ویرایش خواهد شد.
نکته ای که اینجا باید به آن توجه داشت این است که اگر مقدار از نوع رشته ای باشد حتما باید داخل کوتیشن نوشته شود اما برای مقادیر عددی اجباری نیست.
استخراج تعداد رکوردهای مشخص با استفاده از LIMIT
SELECT * FROM table WHERE id=10 LIMIT 5
در کد بالا از جدول table نتیجه Select فقط 5 رکورد از اول را باز میگرداند.
SELECT * FROM user WHERE username='admin' AND password='*****' LIMIT 1
از این روش می توان برای ورود (Login) نیز استفاده کرد. بدین صورت که در هنگام استخراج کاربر بر اساس نام کاربری و رمز عبور، Limit آن را یک در نظر می گیریم. این روش بخاطر مسائل امنیتی استفاده می شود.
SELECT * FROM table WHERE id=10 LIMIT 5 OFFSET 10
یا
SELECT * FROM table WHERE id=10 LIMIT 10, 5
در این مثال رکوردها از سطر یازدهم و به تعداد 5 رکورد بازگردانده خواهد شد. از این روش می توان برای صفحه بندی نتایج استفاده کرد.
استخراج داده های 24 ساعت اخیر
SELECT * FROM table WHERE register_date >= now() - INTERVAL 1 DAY
در این بخش قصد داریم رکوردهای 24 ساعت اخیر را از پایگاه داده استخراج کنیم. برای این کار از کد استفاده می کنیم.
در اینجا table نام جدول و register_date نام فیلدی است که تاریخ ثبت رکورد در آن قرار دارد.
ثبت داده در پایگاه داده براساس شرط
فرض کنید نیاز هست که اگر شرطی برقرار باشد، رکوردی در دیتابیس insert شود در غیر این صورت عمل insert انجام نگیرد. برای مثال شما قصد دارید محصولی را برای فروشگاه ثبت کنید، شناسه (ID) فروشگاه مورد نظر را از سمت کد دریافت کرده اید اما باید چک کنید ببینید که آیا این فروشگاه در پایگاه داده وجود دارد یا نه.
INSERT INTO products (product_id, store_id, product_name) SELECT 1,store.store_id,'My Product' FROM store WHERE store.store_id=4
در مثال بالا ما شناسه محصول را وارد میکنیم (عدد 1) سپس شناسه فروشگاه (برای مثال عدد 4) را از سمت کد دریافت کرده ایم (اما مطمئن نیستیم که این شناسه وجود دارد یا نه) و نام محصول را از کاربر گرفته ایم.
در قسمت داده ها ما به جدول store برای اعتبار سنجی شناسه فروشگاه select میزنیم و داده ها را وارد می کنیم و سپس در قسمت WHERE چک میکنیم که آیا فروشگاهی با شناسه عدد 4 وجود دارد یا نه.
اگر فروشگاهی با شناسه عدد 4 وجود داشته باشد چون شناسه فروشگاه منحصر بفرد هست فقط یک رکورد بازگشت داده میشود که داده های بازگشتی داده هایی است که ما وارد کرده ایم. در اینجا عدد یک به عنوان شناسه محصول، شناسه فروشگاه و نام محصول.
اگر شرط ما درست باشد و رکورد بازگشت داده شود، در جدول products عمل insert انجام داده خواهد شد اما اگر قروشگاهی با این شناه وجود نداشته باشد پس رکوردی بازگشت داده نخواهد شد و عمل insert بر روی جدول products هم اجرا نخواهد شد.
JOIN جداول
گاهی نیاز هست که برای استخراج داده ها، داده های چند جدول را باهم ادغام کنیم.
نام کاربر | نام محصول |
کاربر اول | محصول اول |
کاربر دوم | محصول دوم |
کاربر سوم | محصول سوم |
برای مثال می خواهیم لیست بالا را نمایش دهیم. در این لیست نام کاربران در جدول user و نام محصولات در جدول product می باشد و این دو از طریق user_id با هم ارتباط دارند. برای این کار از JOIN جداول user و product استفاده می کنیم.
برای join جداول چند نوع وجود دارد که در زیر به آنها اشاره می کنیم.
برای مثال جداول زیر را داریم
شناسه مشتری (CustomerID) | نام مشتری (CustomerName) | شماره تماس (Contact) | محل سکونت (Address) |
1 | علی علیزاده | 09000000000 | تبریز |
2 | حامد قربانی | 09111111111 | تهران |
Customers
و
شناسه سفارش (OrderID) | شناسه مشتری (CustomerID) | تاریخ سفارش (OrderDate) |
10308 | 2 | 1996-09-18 |
10309 | 37 | 1996-09-19 |
Orders
SQL JOIN یا همان INNER JOIN:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
خروجی به شکل زیر خواهد بود
شناسه سفارش | نام مشتری | تاریخ سفارش |
10308 | حامد قربانی | 1996-09-18 |
همان طور که مشاهده می کنید شناسه سفارش و تاریخ سفارش از جدول سفارش ها و نام مشتری از جدول مشتری ها می باشد.
می توان چندین جدول را با هم join کرد که برای مثال برای سه جدول مانند زیر خواهد بود
SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
SQL LEFT JOIN:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;
نام مشتری | شناسه سفارش |
علی علیزاده | NULL |
حامد قربانی | 10308 |
کلمه کلیدی LEFT JOIN تمام رکوردها را از جدول سمت چپ (جدول اول) و رکوردهایی که با عبارت مساوی برابر باشد (اینجا Customers.CustomerID = Orders.CustomerID) را از جدول سمت راست (جدول 2) برمی گرداند. در صورت عدم تطابق ، هیچ رکوردی از سمت راست برگردانده نمی شود.
SQL RIGHT JOIN:
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID
شناسه سفارش | نام مشتری |
10308 | حامد قربانی |
NULL | علی علیزاده |
کلمه کلیدی RIGHT JOIN تمام رکوردها را از جدول سمت راست (جدول دوم) و رکوردهایی که با عبارت مساوی برابر باشد (اینجا Customers.CustomerID = Orders.CustomerID) را از جدول سمت چپ (جدول اول) برمی گرداند. در صورت عدم تطابق ، هیچ رکوردی از سمت چپ برگردانده نمی شود.
SQL FULL OUTER JOIN یا FULL JOIN:
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;
کلمه کلیدی FULL OUTER JOIN هنگامی که در رکوردهای جدول سمت چپ (جدول اول) یا راست (جدول دوم) مطابقت داشته باشد ، تمام رکوردها را برمی گرداند.
نکته: برخی پایگاه داده ها از جمله MySQL از این دستور SQL پشتیبانی نمی کند بنابراین برای انجام این دستور از کوئری زیر استفاده می شود.
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name
UNION ALL
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name
برای پایگاه داده MySQL از UNION ALL استفاده می کنیم
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
UNION ALL
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
نام مشتری | شناسه سفارش |
حامد قربانی | 10308 |
علی علیزاده | NULL |
حامد قربانی | 10308 |
NULL | 10309 |
SQL SELF JOIN:
این نوع ادغام یک ادغام معمولی است که جدول با خودش join می زند.
SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;