همانطور که در بخش اول آموزش زبان SQL گفته شد مفهوم sql اختصار یا مخفف عبارت (Structured Query Language ) یا زبانی برای جستجويي ساخت يافته می باشد . در قسمت قبل به معرفی و آموزش مفاهیم ابتدایی sql و دستورات select پرداخته شد.در ادامه با دستورات بیشتری آشنا خواهید شد.
این داکیومنت بر اساس نسخه زیر می باشد :
(ORACLE (10g, 11g
در ادامه معرفی دستورات sql به موارد زیر می پردازیم :
5.6- دستور SQL Between
از دستور فوق برای نمایش رکورها در یک محدوده مشخص استفاده می شود.به مثال زیر توجه بفرمایید.
در پرس و جوی زیر ما می خواهید در جدول هایی مه بین 5 و 10 می باشند را نمایش دهیم.
Select Emp.Emp_Id
,Emp.First_Name
,Emp.Last_Name
,Emp.Start_Date
From Employee Emp
Where (Emp.Emp_Id Between 5 And 10);
مثال فوق در حقیقت معادل ساختار پرس و جوی زیر است زیر است.
Select Emp.Emp_Id
,Emp.First_Name
,Emp.Last_Name
,Emp.Start_Date
From Employee Emp
Where Emp.Emp_Id >= 5
And Emp.Emp_Id <= 10;
نتیجه را می بینید:
از BETWEEN در محدودیت زمانی نیز استفاده می شود. برای مثال، نمایش دهید کارکنانی را که شروع به کار آنها در مدت زمان مشخصی باشد.
برای نمایش تاریخ به صورت زیر عمل می کنیم.
03-05-2002 ==> 09-08-2002 (dd-MM-yyyy)
Select Emp.Emp_Id
,Emp.First_Name
,Emp.Last_Name
,Emp.Start_Date
, -- To_Char is function of Oracle.
-- It may not exist in other DB.
-- To_Char convert Date to text
-- In form of some format. Here is dd-MM-yyyy.
To_Char(Emp.Start_Date
,'dd-MM-yyyy') Start_Date_Vn
From Employee Emp
Where
-- To_Date is a function of Oracle (It may not exist on other DB)
-- To_Date is a function that convert Text into Date
-- In form of some format. Here is dd-MM-yyyy.
( --
Emp.Start_Date Between To_Date('03-05-2002'
,'dd-MM-yyyy') And
To_Date('09-08-2002'
,'dd-MM-yyyy') --
);
نتیجه پرس و جو را می بینیم.
5.7- آموزش دستور SQL Wildcard
دو کاراکترهای خاص در SQL وجود دارد:
کاراکتر %
کاراکتر _
معنی هر کدام به ترتیب :
(%)توصیف صفر یا یک یا چند کاراکتر می باشد.
(_) توصیف دقیقا یکی از کاراکترمی باشد.
این دو کارکتر معمولا در حالت LIKE استفاده می شود.
در مثال زیر می خواهیم لیستی را مشاهد نماییم که FED_ID آنها به فرمت زیر باشد.
بخش آغازین آن به صورت تصادفی باشد بعد از بخش اول یک کارکتر (-) اجباری باشد. در بخش بعد دو کارکتر اجباری نیاز است در ادامه به یک کارکتر (-) نیاز است. بخش پایانی آن نیز به صورت تصادفی باشد.Select Cus.Cust_Id
,Cus.Fed_Id
,Cus.Address
From Customer Cus
where cus.fed_id like '%-__-%';
نتیجه اجرای پرس و جو :
5.8- آموزش دستور SQL Likeدر خصوص دستور LIKE در مثال های بالا به آن اشاره شد است.
5.9- آموزش دستور SQL Order Byعبارت ORDER BY: مرتب کردن نتیجه یک پرس و جو بر اساس یک یا چند فیلد است
به عبارت زیر توجه نمایید.
SELECT "column_name"
FROM "table_name"
[WHERE "condition"]
ORDER BY "column_name1" [ASC, DESC], "column_name2" [ASC, DESC];
توجه داشته باشید :
ASC : یعنی صعودی (که پیش فرض دستورات می باشد)
DESC : یعنی نزولی
در مورد عبارت Sql زیر نکات زیر را توجه کنید:
ترتیب Product_Type_Cd به ترتیب صعودی
در ادامه ، ترتیب بر اساس Name به صورت صعودی
Select Pro.Product_Cd
,Pro.Product_Type_Cd
,Pro.Name
From Product Pro
Order By Pro.Product_Type_Cd Asc
,Pro.Name Asc;
در عبارت زیر نیز توجه نمایید که در دستور Order BY به صورت پیش فرض ASC استفداه می شود. بنابراین نیازی به درج ASC نیست.
Select Pro.Product_Cd
,Pro.Product_Type_Cd
,Pro.Name
From Product Pro
Order By Pro.Product_Type_Cd
,Pro.Name;
در عبارت sql زیر در ابتدا بر اساس فیلد Product_Type_Cd به صورت نزولی مرتب می شود و بعد بر اساس فیلد Name به صورت صعودی مرتب می شود.
Select Pro.Product_Cd
,Pro.Product_Type_Cd
,Pro.Name
From Product Pro
Order By Pro.Product_Type_Cd Desc
,Pro.Name Asc;
در زیر نتیجه اجرای پرس و جو ها را می بینید.
Order By همیشه بعد از دستور where قرار می گیرد.
کوئری زیر برای پیدا کردن کارکنان که نام آنها با (s) شروع می شود و بعد مرتب می شوند بر اساس تاریخ شروع به کار به صورت نزولی.
Select Emp.Emp_Id
,Emp.First_Name
,Emp.Last_Name
,Emp.Start_Date
From Employee Emp
Where Emp.First_Name Like 'S%'
Order By Emp.Start_Date Desc;
در زیر نتیجه اجرای کوئری را می بینید.
نکته در خصوص مثال زیر :
Syntaxاوراکل : (این نیست استاندارد SQL، پس ممکن است در دیگر پایگاه داده ها پشتیبانی نمی شود)
Select Emp.Emp_Id
,Emp.First_Name
,Emp.Last_Name
,Emp.Start_Date
From Employee Emp
Order By 2 Desc;
5.10- آموزش دستور SQL Group Byدر ابتدا نیاز است دا در موردبعضی از توابع توضیحاتی داده شود:
Sum : تابعی که مجموع تمام مقادیر را برمی گرداند .
Avg : تابعی برای بازگشت میانگین تمام مقادیر .
Count : تابعی برای شمارش تعداد از اقلام .
Min : تابعی برای بدست آوردن ارزش یا مقدار حداقل
Max : تابعی برای بدست آوردن ارزش یا مقدار حداکثر
توابع که در بالا به آنها اشاره شده از رایج ترین توابع می باشد، همچنین شما می توانید از آنها در کنا یکدیگر استفاده کنید.
در زیر پرس و جویی نوشته شده است برای نمایش لیست حسابها :
Select Acc.Account_Id
,Acc.Product_Cd
,Acc.Avail_Balance
,Acc.Pending_Balance
From Account Acc;
حال نیاز است تا بر اساس خدمات بانکی مقدار کل مبلغ به همراه میانگین و تعداد آن را بدست آوریم.برای این کار باید بر اساس Product_Cd دستور را گروه بندی نماییم.
Select Acc.Product_Cd
,Count(Acc.Product_Cd) As Count_Acc
,Sum(Acc.Avail_Balance) As Sum_Avail_Balance
,Avg(Acc.Avail_Balance) As Avg_Avail_Balance
From Account Acc
Group By Acc.Product_Cd;
نتیجه اجرای پرس و جو :
بنابراین در مثال بالا می بینید که 4 حساب وجود دارد که نوع سرویس آن (SAV) یا صرفی جویی در سپرده می باشد و همچنین مبلغ 1855.76 درکل آن وجود دارد و نیز مقدار میانگین آن 463.94 می باشد . این توضیحات در رکوردهای دیگر نیز وجود دارد.
5.11- آموزش دستور SQL Having
دستور HAVING شما را قادر به تعیین شرایطی می کند که فیلتر انجام دهید در نتایج خروجی یک تایع در کوئری، به عبارت دیگر دستور Having برای اعمال شرط بر روی خروجی تابع می باشد.
شاید این سئوال پیش بیاید که تفاوت Having با دستور Where چیست؟
دستور Where مکان فیلتر کردن یا ایجاد شرط بر روی در ستون انتخاب شده می باشد ، در حالی فیلتر کردن یا ایجاد شرط با دستور HAVING در گروه های ایجاد شده توسط عبارت GROUP BY می باشد.
فرض کنید که شما می خواهید بر روی جدول Account گروه بندی انجام دهید بر اساس دستور group By روی فیلد Product_cd و نمایش دهیم آنهایی راکه تعداد حسابهای آن نوع بیشتر از 3 باشد.
Select Acc.Product_Cd
,Count(Acc.Product_Cd) As Count_Acc
,Sum(Acc.Avail_Balance) As Sum_Avail_Balance -- Sum available balance
,Avg(Acc.Avail_Balance) As Avg_Avail_Balance -- The average available balance
From Account Acc
Group By Acc.Product_Cd
Having Count(Acc.Product_Cd) > 3;
نتیجه اجرای این پرس و جو :
تشخیص Where & Having
شما نیاز دارید تا بدانید که چگونه از Where و Having در کوئری های خود استفاده نمایید.
دستور Where : استفاده می شود برای فیلتر کردن قبل از دستور Group By
دستور Having : استفاده می شود برای فیلتر کردن بعد از دستور Group By
اگر شما می خواهید اطلاعات عمومی شعبه بانک ) جدول واحد( را داشته باشید، شما می توانید با استفاده از where فیلتر کنید داده را قبل از استفاده از group
Select Acc.Product_Cd
,Count(Acc.Product_Cd) As Count_Acc
,Sum(Acc.Avail_Balance) As Sum_Avail_Balance
,Avg(Acc.Avail_Balance) As Avg_Avail_Balance
From Account Acc
-- Using WHERE to filter data before group
Where Acc.Open_Branch_Id = 1
Group By Acc.Product_Cd
-- Using HAVING to filter data after group
Having Count(Acc.Product_Cd) > 1;
نتیجه اجرای پرس و جو :
در داکیومنت بعد موارد و دستورات زیر را شرح خواهیم داد.
2- یادگیری وصل شدن به پایگاه داده
10.1- دستور ( INNER JOIN (or JOIN
10.2- دستور ( LEFT OUTER JOIN (or LEFT JOIN
10.3- دستور (RIGHT OUTER JOIN (or RIGHT JOIN
10.4- دستور (FULL OUTER JOIN (Or OUTER JOIN
11.1- معرفی Subquery in the Where Clause
11.2- معرفی Subquery in the From Clause
11.3- معرفی Subquery in the Select clause