رفتن به محتوای اصلی

آموزش sql

دستور Select

اين دستور كه دستوري مستقل نيست و حتما بايد با اجزايي بكار رود جهت ساخت پرس و جو بر روي بانك اطلاعاتي بكار مي‌رود و ركوردهايي كه با شرايط اين دستور همخوان باشد به عنوان نتيجه پرس و جو برمي‌گرداند . چهار كلمه كليدي وجود دارند كه بخشهاي ارزشمند اين دستور را تشكيل مي‌دهند :

1- select

2- from

3- where

4- order by

شكل كلي دستور :

Select [*|distinct column1, column2,…]

From table[,table2,…]

Where شرط

Order by نام فيلد يا شماره فيلد

مثال :

Select * from customers

اين دستور تمام ركوردهاي جدول customers را برمي‌گرداند.

كه نتيجه 91 سطر از اطلاعات اين جدول خواهد بود

حال اگر شرط Country =uk اضافه كنيم ، فقط اطلاعات مشتريان انگليس جواب خواهند بود كه به 7 سطر تقليل مي‌يابد.

select * from customers

where Country =uk

حال

select City,Country from customers

order by city

فقط ستونهاي نام شهر (city) و نام كشور (Country) را بر گردانده و بر اساس نام شهر مرتب ميكند. دستور بالا با دستور پايين هردو يك جواب را ميدهند :

select City,Country from customers

order by 1

كه 91 سطر بازگردانده خواهد شد . در نتيجه پرس و جو تعدادي سطر تكراري وجود دارد مانند شهر London كه اگر از كلمه Distinct در Select استفاده كنيم اين سطرهاي تكراري حذف خواهد شد .

select distinct City,Country from customers

order by 1

و جواب 69 سطر خواهد بود.

استفاده از توابع در Select

1- Count : تعداد سطرهاي بازگردانده شده توسط select را ميشمارد.

Select Count(*) from Customers

where Country =uk

در اصل تعداد مشترياني را ميشمارد كه در كشور انگليس هستند. كه عدد 7 جواب است.

2- Sum : مجموع يك فيلد عددي را برمي‌گرداند.

Select sum(Quantity) from [Order Details]

where productid = 11

مجموع فيلد Quantity را براي فيلدهايي كه شماره محصول آنها ( Productid) برابر 11 است را محاسبه ميكند

نكته 1 : در دستور select مي‌توان از اسم مستعار استفاده كرد ، يعني نام جديدي را براي يك ستون در نظر گرفت به عنوان مثال select قبل را به شكل زير بكار برد :

Select sum(Quantity) as Sum_QTY

from [Order Details]

where productid = 11

كه Sum_QTY يك اسم مستعار براي مجموع است. استفاده از كلمه كليديas ‌اختياري است.

نكته 2 : در دستور select هرگاه اسم فيلدي اسم خاص باشد و يا فاصله بين اسم باشد مثل Order Details كه فاصله بين اسم جدول است حتماُ از علامت براكت [] ميبايست استفاده كرد.

نكته 3 : استفاده از group by :

هنگامي كه از توابع count ‌ و Sum به همراه يك فيلد ديگر در دستور select استفاده مي‌شود از group by استفاده مي‌كنيم .

به عنوان مثال دستور زير جمع مقادير فيلد Quantity را براي هر شماره محصول محاسبه ميكند .

Select productid, sum(Quantity) as sum_qty

from [Order Details]

group by productid

كه نتيجه مانند زير خواهد بود :

productid sum_qty

———– ———–

61 603

3 328

32 297

6 301

41 981

64 740

9 95

12 344

در صورتيكه دستور ordr by 1 بعد از group by استفاده كنيم نتيجه بر اساس كد محصول مرتب خواهد شد.

نكته 4 : دستور where مي تواند خود شامل يك دستور select باشد :

select * from Products

where ProductID in

( select distinct ProductID from [order details] where Quantity >70)

order by ProductID

تنها نكته اي كه مي بايست توجه كرد اين است كه نام فيلدي كه در شرط آورده مي شود حتما در دستور select آورده شود, به عبارت ديگر select درون شرط تنها يك ستون را مي بايست برگرداند .

تمرين : با فرض اينكه دو جدول Products و order details داراي ستون (فيلد) يكسان ProductID هستند , يك دستور Select بنويسيد كه تمام فيلدهايي از Products را نشان دهد كه فيلد ProductID آن با ProductID جدول order details يكي باشد.؟

حل :

Select pr.*

From Products as pr , [order details] as od

Where pr. ProductID = od. ProductID

قابل به ذكر است كه بيش از 90% از كارهايي كه ما برروي جداول انجام مي دهيم با select و تركيبات آن انجام مي شود. لذا بدست آوردن تبحر در نوشتن select ها مي تواند شما را در تهيه برنامه ها ياري كند.

3- Min,max : بيشترين و كمترين مقدار فيلد را در بانك اطلاعاتي بدست مي دهد.

Select min (Quantity)

from [Order Details]

4- Top n : تعداد n سطر اول بانك اطلاعاتي را برمي گرداند.

Select top 5 *

from [Order Details]

5 سطر اول بانك را برمي گرداند.

نكته 3 : در حالت بالا اگر مقدار سطر 5 و 6 يكي باشد فقط سطر 5 جواب خواهد بود براي گريز از اين حالت از شكل زير در اين دستور استفاده ميكنيم :

Select top n with ties *

From table

5- Into

Select * from table1 into table2

اطلاعات table1 را به table2 كپي ميكند. البته table2 بايد از قبل وجود نداشته باشد.

اين دستور خود table2 را ميسازد.

دستور select قويترين و كاربردي ترين دستور در sql است كه خود ماهها نيازمند تمرين و آموزش است . براي اطلاعات بيشتر به books online خود Sql Server مراجع كنيد.

دستور Delete

براي حذف اطلاعات از يك بانك اطلاعاتي استفاده ميشود.

شكل كلي دستور :

Delete table1

Where شرط

مثال :

فرض كنيد جدول authors موجود باشد و فيلد كليد آن au_id باشد. براي حذف 10 سطر اول اين جدول از دستور زير استفاده مي كنيم :

DELETE authors

FROM (SELECT TOP 10 * FROM authors) AS t1

WHERE authors.au_id = t1.au_id

دستور insert

براي اضافه كردن اطلاعات به يك جدول از اين دستور استفاده ميشود.

Insert into table1 (f1,f2,…)

Values (v1,v2,…)

كه f1,f2 نام فيلدها و v1,v2 مقادير آنها ميباشد.

البته ميتوانيد مقادير را نتيجه يك select قرار داد.

مثال :

Insert into table1

Select top 10

From table2

مقدار 10 سطر اول را از table2 را در table1 درج ميكند. البته بايد تعداد فيلدها يكي باشد. در غير اينصورت از values استفاده كنيد .
آموزش Enterprise Manager

ميتوان گفت قلب Sql Server است. در Enterprise Manager شما ميتوانيد يك اتصال به سرور Sql برقرار كنيد . table بسازيد. User تعريف كنيد و…..

علامت فلش سبز نمايانگر فعال بودن سرور است.
سرور ميتواند local باشد مانند بالا و يا يك Sqlserver باشد برروي يك سرور . براي ايجاد يك سرور جديد يا به عبارت ديگر وصل شدن client (ويندوز 98) به يك سرور ديگر بر روي يكي Microsoft Sql Server يا SQL Server Group و يا برروي سرور موجود كليك سمت راست كرده و گزينه New Sql Server Registratin را انتخاب كنيد. سپس كليد next را انتخاب كنيد. سپس در منوي بعدي در available Server نام سرور خود را تايپ كنيد . (نام سرور SQL خود را كه برروي ويندوز 2000 خود نصب كرده ايد) و بعد كليد add را فشار دهيد.و گزينه next را انتخاب كنيد.

در پتجره بعد از شما سوال ميكند كه آيا از username ويندوز استفاده كند و يا اينكه از يك username مخصوص خود Sql Server استفاده كنيد. گزينه دوم را انتخاب كرده و سپس Login Name و Password را وارد كنيد. (در حالت پيش فرض sa بعنوان login name و فضاي خالي بجاي Password وارد كنيد.) پس از چند بار فشار كليد next شروع به وصل شدن به Server ميكند. در صورت موفقيت آميز بودن با پيامي اين كار را اطلاع ميدهد.
از ديگر گزينه ها شما بيشترين استفاده را از Databases خواهيد كرد.
به عبارت ديگر هر كار و پروژه ما بعنوان يك Database در سرور sql قرار ميگرد. همه جداول و دستورات مربوط به آنها در اين محل نگهداري مي شود.
با كليك سمت راست برروي Databases و انتخاب New Database… ميتوانيد يك Database جديد براي خودتان بسازيد.

پس از انتخاب نام آن را تاييد كنيد.
هر Database شامل موارد زير است :
1- Diagram : ارتباط جداول را نشان ميدهد.
2- Tables : جداول پروژه را نشان ميدهد.
3- Views : ديدهاي پروژه را نشان ميدهد.
4- Stored Procedure : كدهاي sql مربوط به عملياتهاي روي جداول را نگهداري ميكند.
5- Users : كاربران تعريف شده بر روي اين database را نشان ميدهد.
6- Roles: قوانين دسترسي به جداول و پروسيجرها را نشان ميدهد.
7- Rules : قوانين مربوط به داده ها را در جداول نشان ميدهد.
گزينه هاي 7 به بعد كاربرد آنچناني براي كارهاي ابتدايي ندارند

ايجاد يك جدول جديد :
براي ايجاد يك جدول جديد بروي tables كليك سمت راست كرده و گزينه New Table را انتخاب كنيد. سپس در كادر بعدي نام جدول را انتخاب كنيد. حال فيلدها و نوع آنها را مشخص كنيد .
بعد از مشخص كردن نوع و احتمالاً طول فيلد , بايد مشخص كنيد كه آيا فيلد هميشه مي بايست مقدار داشته باشد و يا مي تواند null باشد. Allow Nulls اگر تيك داشته باشد يعني اينكه اين فيلد مي تواند هيچ مقداري به خود اختصاص ندهد.

تذكر : مقدار null را با فضاي خالي اشتباه نگيريد.

در قسمت Default Value مقدار اوليه براي فيلد وارد كنيد. تا در صورتيكه هيچ مقداري درج نشد آن مقدار درج شود. (در دستور insert )
اگر Identity را تيك بزنيد اين فيلد بشكل خود افزا خواهد شد كه اولا بايد نوع فيلد عددي و ثانيا مقدار گامها در Identity increment مشخص شود. مقدار اوليه آن را هم مي توانيد در Identity Seed قرار دهيد. بدين شكل با اين مقدار شروع و با گامهاي مشخص شده حركت خواهد كرد.

تذكر : هيچ مقداري در اين فيلد نمي توانيد درج كنيد , چراكه خود سيستم اين مقدار را توليد مي كند .

براي مشخص كردن فيلد كليد (يا فيلدهاي كليدي) فيلد(ها) را انتخاب و بر روي علامت كليد بر روي Toolbar كليك كنيد .

تذكر : فيلد كليدي نمي تواند Allow Nulls باشد.
تذكر : براي تعريف index كليك سمت راست كرده و index/keys را انتخاب كنيد .
( در مورد index بطور مفصل صحبت خواهد شد )

ايجاد Stored Procedure :
مانند هر زبان ديگر رويه ها در sqlServer نيز موجود مي باشند. و بكار ميروند. سه رويه insert , Updaet و Delete را مي توانيد براحتي با ويزاردهاي خود SqlServer بسازيد. از اينجا به بعد از واژه SP بجاي رويه استفاده خواهيم كرد.
ابتدا با ساختار كلي SP آشنا شده و سپس به ويزارد موجود خواهيم پرداخت.
براي ايجاد يك SP جديد ابتدا برروي گزينه Stored Procedure كليك سمت راست كرده و گزينه new Stored Procedure… را انتخاب كنيد. در پنچره بعدي شما مي توانيد متن SP را وارد كنيد.

1- نام sp : ابتدا بجاي [PROCEDURE NAME] يك نام براي SP خود در نظر بگيريد. من خود از ساختار زير بدين منظور استفاده ميكنيم : عمليات_نام جدول
عنوان مثال اگر نام جدول Sale و عمليات مورد نظر يك عمليات insert باشد نام SP را Sale_INSERT ميگذاريم. بهتر است نام عمليات با حروف بزرگ تايپ شود . البته بعضي از دوستان از سه حرف عمليات استفاده مي كنند. براي مثال بالا خواهيم داشت :Sale_INS .

2- تعريف پارامترها : براي تعريف پارامترهاي ورودي SP قبل از كلمه كليدي As آنها را داخل پرانتز مشخص كنيد. بدين شكل كه ابتدا علامت @ سپس نام پارامتر بعد فاصله و نوع پارامتر.
تذكر : تمامي متغييرها در SP از ساختار نام متغيير@ پيروي ميكنند.
بعنوان مثال فرض كنيد يك SP داراي دو پارامتر با نامهاي Id از نوع int و Name از نوع Varchar(20) باشد , داريم :( @id int,@name varchar(20))
حال بعد از As دستورات مورد نظر را تايپ ميكنيم :

مثال 1 : SP بنويسيد كه چهار حرف اول فيلد LastName و فيلد FirstName را از جدول Employees انتخاب كند به شرطي كه فيلد LastName با حرف A شروع شود ؟
ابتدا برروي Stored procedure كليك سمت راست كرده و گزينه New stored procedure را انتخاب كرده و خطوط زير را تايپ كنيد. بعضي از دستورات پايين در كادر باز شده موجود هستند كه نيازي به تايپ مجدد آنها نيست .
create Stored Procedure Employees_BROWSE
As
Select substring(Lastname,1,4) as LastNmae,FirstName
From Employees
Where LastName Like ‘%A’

حال بر روي دكمه ok كليك نماييد. حال SP با نام Employees_BROWSE در ليست SP اضافه شده است .
مثال 2 : تمام فيلدهاي Employees را انتخاب كنيد كه فيلد BirthDate در يك بازه تاريخي كه به شكل پارامتر وارد ميشود قرار گيرد ؟
create Stored Procedure Employees_BROWSE2
(@StartDate char(10) , @EndDate char(10))
As
Select *
From Employees
Where BirthDate between @StartDate and @EndDate

حال براي اجراي SP ها در Query Analyzer كافي است بنويسيم : نام Exec SP
بعنوان مثال :Exec Employees_browse
اگر پارامتر داشت مقدار پارامترها را هم مي آوريم :
Exec Employees_Browse2 ‘01/01/1940’ , ‘15/06/1955’

3- تعريف متغيرها : براي تعريف متغيرها مي بايست از كلمه كليدي Declare استفاده كنيم. بعنوان مثال : Declare @myname varchar(50)
متغيير @myname از نوع كاركتري پويا تعريف ميكند.

4- برگرداندن كد خطا : بدين منظور از دستور return @@Error
گرچه هرمقداري را كه بخواهيم مي توانيم با دستور return برگردانيم.

5- تعريف پارامترها كه مقداري را برمي گردانند : براي اين منظور هنگامي كه پارامتر را در ابتداي پروسيجر تعريف ميكنيم بعد از نوع آن از كلمه كليدي output مي كنيم بعنوان مثال :
create Stored Procedure Employees_BROWSE2
(@StartDate char(10) , @EndDate char(10) , @pp varchar(10) output)
As
6- مقدار دهي به متغييرها : به دو روش مي توانيد اين كار را بكنيد يكي با دستور Set و ديگري با دستور Select .
7- دستورات شرطي :مانند ديگر زبانها شما مي توانيد در Sql دستورات شرطي را بكار ببريد. ساختار آن به شكل زير است :
If شرط then دستور
If شرط then
Begin
دستور1
دستور2
…
end
مثال :

If @Sdate > @Edate set @newDate = @Sdate

8- دستور Set NOCOUNT on : اين دستور از نوشت تعداد سطرهاي برگردانده شده توسط دستورات جلوگيري ميكند. كاربرد مهم آن زماني است كه شما چند كار را پشت سرهم در SP انجام ميدهيد. مثلا يك جدوي موقت ميسازيد و سپس از آن يك تعدادي از فيلدها را با دستور Select انتخاب مي كنيد. اگر اين دستور را در ابتداي SP استفاده نكتيد , هنگامي كه ميخواهيد از آن SP در يك زبان برنامه نويسي استفاده كنيد با خطاي SP هيچ dataset ي برنمي گرداند مواجه خواهيد شد.

تذكر1 : شما مي توانيد يك SP را در يك SP ديگر فراخواني كنيد. براي اين منظور همانطور كه قبلا گفته شد از دستور exec استفاده نماييد.
تذكر 2 : با دستور exec شما مي توانيد يك دستور sql را نيز اجرا كنيد. اين كار زماني بكار مي آيد كه دستور مورد نظر پويا و متغير باشد.
مثال :
Exec (“ select * From Employees Where “+@Shart)
اين شرط ميتواند بر اساس فيلدهاي بانك توليد گردد.
مثال : يك SP بنويسيد كه اختلاف تعداد سفارشاتي كه فيلد ShipCountry آنها France يا German باشد. را برگرداند ؟
create Stored Procedure Order_France_German ( @Outp int output)
as
declare @Count_France int , @Count_German int

select @Count_France = Count(*)
from orders
where ShipCountry = France

select @Count_German = Count(*)
from orders
where ShipCountry = German

if @Count_France is null set @Count_France = 0
if @Count_German is null set @Count_German = 0

set @outp = @Count_France – @Count_German

   

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *