نوشتن دستورات ساده SELECT
دستور Select سه جزء اصلي SELECT، FROM و WHERE دارد. نگارش پايه آن عبارت است از:
SELECT column – list
FROM table- list
WHERE search – criteria
بخش SELECT ستونهاي مورد نظر براي بازيابي را مشخص مي كند. عبارت FROM نام جدولي استا كه ستونها از آن بازيابي مي شوند و عبارت WHERE تعداد سطرهاي بازگشتي از پرس وجو را مشخص مي كند.
SELECT [ All | DISTINGCT ] [ Top n [PENSEVT ] [ WITH TIEST ]]
Select – list
[ INTO new – table ]
[ FROME table – sources]
[ HERE search – condition ]
[ GROUP – BY [ ALL] group – by – expression [,…n]
[ WITH {CUBE | ROLLUP} ]]
[ HVING search – condition ]
[ ORDER BY {colum – name [ASC | DESC ] } [ ,…n ]
[VOMPUTE { { AVG | COUNT | MAX | MIN | SUM } (expression) }
[,…n] [BY expression [,…n] ]
[ FOR BROWSE ] [OPTION (query – hint [,…n]
دستور SELECT * FROM table – name ابتدايي ترين نوع پرس و جواست. بكارگيري علامت (*) به عنوان colum – list كليه ستونها جدول را بازيابي مي كند درداخل SQL Server اين علامت به فهرست ستونهاي جدول تبديل مي شود.
براي بازيابي ستونهاي مشخص لازم است ستونها با (, ) از يكديگر جدا شوند اما پس از آخرين ستون نيازي به كاما نيست.
هنگام اجراي پرس و جوي SELECT * ترتيب ستونها مشابه ترتيب آنها در دستور CREATE TABLE است اما وقتي ستونهاي خاصي از جدول را انتخاب مي كنيد اين ترتيب نبايد مشابه ترتيب ايجاد آن باشد. شما مي توانيد با تغيير ترتيب ستونها در column – list ترتيب آنها در خروجي پرس و جو را تغيير دهيد.
تغيير عنوان ستونها
هنگام نمايش نتايج پرس و جو، عنوان ستونها مشابه اسامي آنها در column – list است اما مي توانيد جاي آنها اسامي خواناتري بكار برد. از طريق بكارگيري اسامي مستعار در عنوان ستونها انتخاب مي شود. براي ايجاد اسامي مستعار در عناوني ستونها هر دو نگارش SQL Server , ANSI SQL مي روند. دو روش براي اين كار وجود دارد.
SELECT colum – name ‘column – heading ‘
FROM table – name
توجه:
اگر نام مستعار بكار رفته داراي فاصله است و يا يكي از كلمات كليدي SQL server است آ‌ن را مابين علائم “ يا [] قرار دهيد. به مثال زير توجه كنيد.:
Select Iname As ‘Last Name ‘ , fname As [First Name] FROM employee
مثال زير يك كلمه كليدي SQL را به كار مي برد:
SELECT ‘Count’ = Count (*)
FROM employee
با دستورات زير مي توانيد پرس و جوي خود را بازنويسي كنيد:
نگارش SQL Server 2000
SELECT Employee |D= emp – id, Last Name = Lnme, FirsName = Fnma
نگارش AMSI SQL
SELECT emp – id As Employeed , Lname As Last Name, fname As FistName
توجه:
كلمه كليدي As ضروري نيست. براي مثال دستور زير اطلاعات مشابه پرس و جو قبل را باز مي گرداند:
SELECT emp – id Employeed, Lmame LasName, fame firstName
بكار گيري حروف (Literals)
واژه جديد: براي خوانايي بيشتر خروجي پرس و جو مي توانيد از ليترها استفاده كنيد. يك ليترال رشته اي است مالين علائم ‘ ‘ يا “ “ محصور شده درcolumn- list قرار مي گيرد و در خروجي پرس و جو نمايش داده مي شود. در نتيجه يك ليبل در ستون مجاور ستون نتايج نمايش داده ميشود.
نگارش بكارگيري ليترال ها به شكل زير است:
SELECT ‘literal’ [, ‘literal’ ….]

پردازش داده ها (Manipulating Data)
شما مي توانيد با پردازش نتايج پرس و جوها، ستونهاي جديدي را براي نمايش مقادير محاسباتي، مقادير رشته اي جديد، تبديلات تاريخ و … توليد كنيد. اينكار با عملگرهاي (Operators)) حسابي، توابع رياضي. توابع رشته اي، توابع تاريخ و توابع سيستم انجام مي شود. همچنين مي توانيد تابع CONVERT را در تبديل يك نوع داده به نوع ديگري براي پردازش ساده تر بكار بريد.
عمگرهاي حسابي (Arithmetic Operators)
عملگرهاي حسابي بر روي انواع داده bingint, money , real , float, decimal , nameric , tintnt , smalint , int يا smallmoney بكار مي رود.
ترتيب تقديم عملگرها (Operator Precednce)
واژه جديد: در عمليات حسابي دو سطح تقديم در ارتباط با تقديم نوع داده و تقديم عملگر وجود دارد.
تقديم نوع داده زماني به كار مي رود كه عمليات حسابي بر روي انواع داده متفاوت انجام مي شود. در اين حالت نوع داده كوچكتر به نوع داده بزرگتر تبديل مي شود. براي مثال اگر يك Smalint را در يك int ضرب كنيد int خواهد بود. تنها استثناء موجود در مورد نوع money است كه نتيجه همواره از نوع money خواهد بود.
تقديم عملگر زماني در صورت وجود چندين عملگر به كار مي رود. اين ترتيب هنگام خواندن از چپ به راست به ترتيب مدول، ضرب و تقسيم و بالاخره جمع و تفريق مي باشد.
مشابه ساير عمليات حسابي مي توان ترتيب تقدم عملگر را با پرانتز تغيير داد. در اين صورت داخلي ترين عبارت ابتدا محاسبه مي شوند. همچنين بكارگرين پرانتز خوانايي عبارات محاسباتي را بيشتر مي كتد. براي مثال در:
۵+۵*۵=۳۰ ابتدا ضرب انجام مي شود، اما در ۵+۵)*۵=۳۰) عبارت داخل پرانتز ابتدا محاسبه مي شود عموماً با قرار دادن عمليات حسابي در پرانتز، خوانايي و وضوح كد Tradsact – SQL را بهبود مي بخشد.
توابع رياضي (Mathematical Functions)
توابع داده رياضي امكان عمليات رايج بر روي داده هاي رياضي را فراهم مي آورند. با نگارش زير مي توانيد داده هاي رياضي را بازگردانيد:
SELECT function – name (parameters)

جدول ۲-۱۰ توابع رياضي
تابع نتيجه
ABS (numeric – expr) مقدار مطلق
ACOS|ASIN| ATAN(float – expr) سينوس،كسينوس‌و‌ تانژانت زاويه به راديان با مقدار شناور
COS|SIN|COT| سينوس، كسينوس و تانژانت زاويه به راديان
‏TAN(float – expr)
FLOOR (numeric – expr) بزرگترين عدد صحيح كوچكتر يا مساوي مشخص شده
LOG(float – expr ) لگاريتم طبيعي
LOG10(float – expr) لگاريتم بر مبناي ۱۰
PI() عدد ثابت ۱۴۱۵۹۲۶۵۳۵۸۹۹۳/۳
POWER (mumeric – expr, y) مقدار پارامتر به توان y
RADIANS (mumeric – expr) تبديل درجه به راديان
ROUND(mumeric – expr) گردكردن عدد به طول مشخص شده len
تابع نتيجه
SQURE((float – expr) مربع مقدار مشخص شده
SQRT (float – expr) جذر مقدار مشخص شده
نكته:
هنگام استفاده از توابع رياضي با انواع داده پولي، همواره قبل از داده ها علامت دلار ($) قرار دهيد در غير اين صورت مقدرا مشخص شده نوع داده numeric مبناي ۴ در نظر گرفته مي شود.
هشدار:
هنگام كار با نوع داده float بعضاً نتايج غير قابل انتظاري از Query Analyzer يا ساير ابزار به دست مي آيد. براي مثال دستور (۱۲٫۳۴۵۶۷۸E+5,2) SELECT ROUND خواهد بود. اين نتيجه كار (ODBC) Open database connectivity است. Server SQL كماكان گردكردن را ادامه مي دهد. اما بنا به تعريف داده هاي نوع float مبهم هستند، در حالت كلي بهتر است از اين داده اجتناب كنيد.
توابع رشته اي (String Functions))
هنگام كار با اطلاعات كاراكتري، توابع رشته اي زيادي براي پردازش وجود دارد. اكثر توابع رشته اي بر داده هاي نوع vatchar , nchar , char و nvarchar كار مي كنند بنابراين لازم است ساير انواع داده اي را قبل از كار تبديل كرد. داده هاي كاراكتري با تابع زير بازگردانده مي شوند:
SELECT funcyion – name //9parametrs)
توابع تاريخ
پردازش مقادير datetime با توابع data انجام مي شود. اين توابع در Column – list عبارت WHERE يا هر عبارت ديگر قابل استفاده اند. براي اين منظور، نگارش زير را به كار بريد:
SELECT data – function (parameters)
مقادير پارامتر datatime را بين علائم ‘ ‘ يا “ “ قرار دهيد. برخي توابع پارامتري به عنوان derepart دريافت مي كنند.
توابع سيستم (System Functions)
براي دريافت در Colum – list عبارت WHERE يا ساير عبارت كاربرد دارند.
جدول ۹-۱۰ توابع سيستم
تابع نتيجه
COL – NAME (table – id , colum – id) نام ستون را بر ميگرداند
Column – name)COL – LENGTH (‘table – name’ c طول ستون را بر مي گرداند
DB – ID ([‘database – name’]) شناسه پايگاه داده را بر مي گرداند
DB – NAME ( [database – id)] نام پايگاه داده را بر مي گرداند

عملگر هاي مقايسه اي (comparison Operators)
عملگرهاي مقايسه اي در پياده سازي شرايط جستجو كاربرد دارند. سطرهاي خاص با مقايسه مقادير يك ستون يا عبارت يا مقدار خاص انجام مي شود. اين عبارات شامل مقادير ثابت نام ستونهاي ديگر، توابع يا زير پرس و جوهاي متداخل (nested subqueries) مي باشند. اگر دو نوع داده هاي متفاوت را با هم مقايسه كنيم (براي مثال varchar و char) و يا نوع داده تاريخ را مقايسه مي كنيد. (samlldatetime , datatime) ، حتماً آنها را مابين علائم ‘ ‘ قرار دهيد. علائم “ “ نيز قابل قبول است اما نوع اول با استاندارد ANSI تطابق دارد.
نگارش عبارت WHERE با عملگر هاي مقايسه اي به شرح زير است:
SELECT Column – list
FROM table – list
WHERE Column – name Comparison – operator expression
پرس و جوي زير شماره كارمندي، نام و نام خانوادگي كليه كارمندان استخدام شده توسط ناشر كد ۰۸۷۷ را بر مي گرداند.
SELECT emp – id, Iname , fame
FROM employee
WHERE pub – id = ‘۸۷۷’
نكته:
اگر عمگرهاي حسابي و منطقي را با هم به كار مي بريد توجه كنيد عملگرهاي حسابي نخست پردازش مي شوند اما با استفاده از پرانتز مي توانيد ترتيب تقدم را تغيير دهيد.
دامنه ها Ranges
با كاربرد كلمه كليدي BETWEEN مي توانيد سطرهايي را بر اساس مقداير يك دامنه بازيابي كنيد. مشابه عملگرهاي مقايسه اي لازم است تا داده هاي نوع كاراكتري يا تاريخ را مابين علائم ‘ ‘ قرار دهيد.
نگارش عبارت WHERE در اين حالت به شرح زير است:
SELECT Column – list
WHERE table – list
WHERE Column – name [Not] BETEEN expression And expression
پرس و جوي زير مقادير شماره كارمندي و نام خانوادگي كليه كارمندان استخدام شده بين ۱۰/۱/۹۲ تا ۱۲/۳۱/۹۲ را بازيابي مي كند:
SELECT Iname, emp – id
FROM employed
WHERE fire – date BETWEEN ‘۱۰/۱/۹۲ AND ‘۱۲/۳۱/۹۲’
در اين مثال دو مقدار مشخص شده نيز قابل پذيرش هستند.توجه كنيد مقدار كوچكتر بايد در ابتدا آورده شود.
ليست ها (List)
با كلمه كليدي IN مي توانيد سطرهاي مطابق با مقادير يك ليست را بازيابي كنيد. مطابق معمول داده هاي نوع كاراكتري و تاريخ را مابين علائم ‘ ‘ قرار دهيد. نگارش عبارت WHERE در اين حالت به شرح زير است:

SE:LECT Column – list
FROM table – list
WHERE Column – name [ Not ]IN (valu – list)
براي كارمنداني كه با ناشر كد ۰۸۷۷ يا ۹۹۹۹ كار مي كنند و پرس و جوي زير را اجرا كنيد:
ورودي خروجي
SELECT emp – id . Iname , fname
FROM employee
WHERE pub – id IN (‘۰۸۷۷’ , ‘۹۹۹۹’)
براي بازيابي سطرهايي كه در ليست نيستند مي توان عملگر نفي (NOT) بكار بريد. براي يافتن كليه كارمنداني كه با ناشر كد ۰۸۷۷ يا ۹۹۹۹ كار نمي كنند، پرس و جوي زير را اجرا كنيد:
SELECT emp – id, name, faname
FROM employee
WHERE pub – id NOT IN (‘۰۸۷۷ , ‘۹۹۹۹’)
نكته:
در صورتي كه امكان شرايط مثبت بكار بريد و از عملگر NOT اجتناب كنيد. زيرا بهينه ساز پرس و جو ها همواره شرايط جستجوي منفي را تشخيص نمي دهد. به عبارت ديگر SQL Server بايد كارزيادي براي بازگرداندن نتايج با عملگرهاي نفي را انجام دهد. پرس و جوي بالا را با DETWEEN و AND بازنويسي كنيد.

رشته هاي كاراكتري (Character String)
با كلمه كليدي LIKE مي توانيد سطرها را بر اساس بخشي از رشته هاي كاراكتري بازيابي كنيد. LIKE با انواع داده datatime , text , nevarchar , nchar , varchar , char و Smalldatetime به كار مي رود. همچنين مي توانيد با چهار نوع كاراكتر جانشين (WHERE) با كلمه كليدي LIKE به شرح زير است:
SELECT Column – list
FROM table – list
WHERE Column – name [NOT] LIKE ‘string’
عملگرهاي جانشين در دسترس عبارتند از:
% رشته اي از هيچ يا چند كاراكتر
– يك كاراكتر
[] يك كاراكر در محدوده خاص
[^] يك كاراكتر خارج از محدوده خاص
هنگام كار حتماً توجه كنيد عملگرهاي جانشين مابين علائم ‘ ‘ قرار داده شوند.
با اجراي پرس و جوي زير title و title – id كليه كتبي كه عنوان آنها شامل Computer است از جدول titles بازيابي مي شود.
ورودي
خروجي

SELECT title – id , title
FROME titles
WHERE title LIKE ‘%computer %’
مقادير نامشخص (Unknown Values)
مقدار تهي يا Null مشابه رشته حرفي خالي (Blank) و يا صفر در داده هاي عددي نيست. Null زماني واقع مي شود كه فيلد مقدار داده نشود. به عبارت ديگر Null معادل نامشخص مي باشد. در اين شرايط مقايسه Null با صفر، Blank و يا حتي ساير مقادير Null منفي باشد. بنابراين چگونه ميتوان سطرها را بر اساس مقادير Null بازيابي كرد؟ اينكار با تفكيك سطر هايي از جدول كه حاوي مقادير Null هستند و از طريق كلمات كليدي IS NULL و IS NOT NUL انجام مي شود.
نگارش عبرات WHERE با استفاده از عملگرهاي IS NULL و IS NOT NUL به شرح زير است:
SELECT Column – list
FROM table – list
WHERE column – name Is [NOT] NULL
براي مثال پرس و جوي زير را بازيابي كتبي كه فروي نداشته اند اجرا كنيد:
SELECT title – id
FROM title
WHERE ytd- sales IS NULL
برعكس پرس و جوي فوق، مي توانيد كليد كتبي كه فروش داشته اند با پرس و جوي زير بازيابي كنيد:

SELECT title – id
FROM title
WHERE ytd – sales ISNOI NULL
بكارگيري شرايط چند گانه در بازيابي سطرها
تا كنون بازيابي سطرها از طريق مقادير مشخص، ليستها، دامنه، مقايسه رشته اي و … را ديديد. حال بهتر است نگاهي به بازيابي سطرها از طريق شرايط چندگانه مي توانيد عملگرهاي منطقي (logical)، نفي (NOT) و (AND) و يا(OR) را به كار بريد. AND و OR امكان تلفيق دو يا چند عبارت را فراهم مي آورند. شرط AND در صورت كليه شرايط مقدار بر مي گرداند در حاليكه OR در صورت صحت هر يك از شرايط مقدار بر مي گرداند.
در استفاده از چندين عملگر منطقي ترتيب تقدم NOT و AND و OR است. نگارش عبارتHERE در شرايط چندگانه به شرح زير است:
SELECT column – list
FROM table – list
WHERE [NOT] expression {AND|OR} [NOT] expression
حذف اطلاعات تكراري (Duplicate)
هنگام انتخاب برخي از اطلاعات ممكن است با سطرهاي تكراري مواجه شويد. براي حذف آنها عبارت DISTINCT در دستور SELECT را به كار بريد. در غير اين صورت كليه شرايطي كه شرط عبارت HERE را برقرار مي كند در نتيجه نمايش داده م شوند.
نگارش عبارت DISTINCT به شرح زير است:
SELECT DISTING column – list
FROM table – name
WHERE Search – condition
DISTING بر روي تركيب ستون ها در column – list اعمال مي شود. از آنجاييكه مقدارير null تكراري در نظر گرفته مي شود بنابراين فقط يكي از آنها برگردانده مي شود.
مرتب سازي داده ها با عبارت ORDER BY
براي مرتب سازي داده ها در دستور SELECT عبارت ORDER BY بكار بريد. نگارش پايه اين عبارت به شرح زير است:
SELECT column –list
FROM table –list
[ORDER By Column – name | column – list – number [ASC | DESC]
تعداد ستونهاي ليست ORDER BY نامحدود است به شرط آنكه از ۹۰۰ بايت بيشتر نشود. همچنين مي توانيد نام ستونها يا عدد ترتيبي (ordinal) آنها را در column – list بكار بريد. دو پرس و جوي زير نتايج يكساني را باز مي گرداند.
بكارگيري توأم نام و شماره ترتيبي نيز مجاز است. همچنين نوع مرتب سازي صعودي يا نزولي داده ها نيز قابل تعيين است. مقدار ASC باشد و ستون مشخص شده حاوي مقدار NULL باشد، سطرهاي حاوي NULL ابتداي ليست قرار مي گيرند.