پیشگفتار
شرکت کارکیا در سال ۸۴ تاسیس گردید مدیریت این شرکت به عهده دکتر مهدی نیکوئی است که مدرک دانشگاهی خود را از دانشگاه NBA دریافت نموده است. زمینه کاری این شرکت برنامه‌سازی نرم‌افزاری، طراحی صفحات وب، گرافیک (CD CalQlog)، تابلوهای تبلیغلاتی Flax face و نگهداری پایگاه داده می‌باشد و جنبه‌های مدیریتی آن عبارتند از مدیریت پروژه ، مدیریت فروش و مطالعات بازار می‌باشد.

همچنین در زمینه برگزاری سمینارها نیز فعالیت دارد که از جمله می‌توان به سمینارهای برنامه بودجه مدیریت تحقیق، دانشگاه آزاد و سازمان تعاون اشاره نمود.
از پروژه‌های انجام شده توسط این شرکت می‌توان به پروژه‌های شرکت‌های پایدار و بتن، الماس شرق، نمایندگی سایپا توتونچیان و نمایندگی ایران خودرو توسلیان می‌باشد که هم‌اکنون پروژه در حال کار پروژه فروش چشم ساران می‌باشد.

مقدمه
معرفي پايگاه داده SQL Server 2000
SQL Server2000 يك Engine پايگاه داده ارائه شده توسط شركت مايكروسافت است و ادامه ويرايش ۷٫۰ است. بدون اقراق ميتوان گفت اين محصول پر كاربرد ترين Package پايگاه داده محسوب ميشود. البته مايكروسافت ادعا كرده است كه بيش از ۶۰ % بازار Database جهان را به خود اختصاص داده و اين روز به روز در حال افزايش است. شركت IBM در اواخر دهه ۷۰ زبان SEQUEL كه براي Query ها (پرس و جو ها ) استفاده مي شد را ابداع كرد. با تغيير زمان اين زبان نيز تغييراتي كرد و تا آنجا كه فقط براي Query ها استفاده نميشد و از آن ميتوانستيم براي Administrating مديريت و Sequrity امنيت در Database نيز استفاده كنيم و بعد از مدتها اين زبان به SQL تغيير نام داد.
امروزه ورژنهاي متعددي از اين نرم افزار استفاده ميشود كه نرم افزار Microsoft SQL Server 2000 از Transact SQL كه به آن TSQL هم ميگويند استفاده ميكند. SQL Server 2000 هم اكنون داراي ۲ نسخه است :

يكي SQL Server 2000 Personal Edition كه بر روي Client نصب ميشود (Windows 98 – Windows ME – Windows 2000 Proffessional – Windows XP Home Edition – Windows XP Proffessional Edition) البته اگر بر روي Windows 98 و Windows ME نصب كنيم ، بسياري از قابليتهاي اين Package از بين ميرود. بهترين حالت نصب اين نسخه بر روي سيستم عاملهاي Windows 2000 Proffessional و Windows XP Proffessional است.
يك نسخه ديگر اين نرم افزار : SQL Server 2000 Enterprise Edition است كه مختص Server ها است يعني فقط بر روي تمامي نگارش هاي Window 2K Server و Windows Server 2003 نصب ميشود

معرفی SQL و دستورات عمومی آن
توسط SQL ميتوان درون يك بانك اطلاعاتي پرس و جو كرده (Query) و نتيجه را برگرداند. بانك اطلاعاتي شامل آبجكتي به نام جدول (Table) ميباشد. ركوردها در بانكهاي اطلاعات در جداول ذخيره ميگردند.جدول شامل سطر و ستون ميباشند.
مثال:
Select Last name from persons
پر كاربرد ترين دستورات SQL شامل موارد زير است :
SELECT استخراج يك داده از بانك اطلاعاتي
DELETE پاك كردن يك داده از بانك اطلاعاتي
INSERT وارد كردن يك داده جديد به بانك اطلاعاتي
همچنين در SQL ميتوان داده هايي نيز تعريف كرد :
CREATE TABLE ايجاد يك جدول جديد

ALTER TABLE تغيير دادن يك جدول
DROP TABLE پاك كردن يك جدول
CREATE INDEX ايجاد يك انديس
(كليد جستجو) DROP INDEX پاك كردن يك انديس

دستکاری جدول های بانک اطلاعاتي SQL

CREATE TABLE: جداول ساختمان بندی پایه یک بانک اطلاعاتی اند که اطلاعات را در خود جای میدهند . برنامه های بسیاری هستند که بدون استفاده از کد های sql برای شما جدول میسازند . اما یادگیری این دستورات برای کسی که با جداول و دیتابیس کار میکند ضروری است.
قبل از یادگیری گرامر دستوری ساخت جدول ، باید منطق و اصول ساخت جدول را بیاموزید . جداول به سطرها (ROW) و ستون ها (COLUMN) تقسیم میشوند . هر سطر یک رکورد از اطلاعات را در خود جای داده است.هر سطر چند فیلد دارد .

مثال : مثلا کارنامه مدارس را در نظر بگیرید .مثلا ۳ ستون دروس ، نمره و تاریخ دارد و سطر های آن هر کدام شامل سه بخش هستند طبق دسته بندی ستون هایش .
سطر اول : ریاضی – ۱۲ – ۱۲/۳/۱۳۸۴
سطر دوم : فیزیک – ۱۴ – ۱۶/۳/۱۳۸۴
و بهمین ترتیب .پس هر سطر جدول را یک رکورد می نامیم . هر ستون جدول (فیلد) دارای یک نوع داده است . در مثال فوق ستون دروس از نوع string و ستون نمرات از نوع integer و ستون تاریخ از نوع date است . هنگام ساخت جدول که فیلد هایش را مشخص میکنید باید نوع داده ای فیلد ها نیز مشخص گردد. کد ساخت جدول بصورت زیر میباشد :
CREATE TABLE “table_name”
(“column 1” “data_type_for_column_1”,
“column 2” “data_type_for_column_2”,
… )
کد ساخت یک جدول نمونه :
CREATE TABLE customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date date)

DROP TABLE: گاهی ما دلمون میخواد که بهر دلیلی از دست یک جدول در پایگاه داده خود راحت شویم. SQL این امکان رو برای ما فراهم کرده و ما میتونیم برای پاک کردنش از کد زیر استفاده کنیم.
DROP TABLE “table_name”
مثال :
DROP TABLE customer.

TRUBCATE TABLE : گاهی ما میخواهیم که اطلاعات داخل یک جدول رو پاک کنیم . اما نمیخواهیم خود جدول پاک شود. برای اینکار ازین دستور کمک میگیریم
TRUNCATE TABLE “table_name”
مثال :
TRUNCATE TABLE customer.

INSERT INTO : برای ورود اطلاعات داخل یک جدول دو راه وجود دارد. یکی اینکه رکورد ها را تک تک وارد کنیم (سطر به سطر) و یکی اینکه یکدفعه چندین سطر را وارد جدول کنیم . برای وارد کردن اطلاعات بصورت سطر به سطر با کد زیر عمل میکنیم .
INSERT INTO “table_name” (“column1”, “column2”, …)
VALUES (“value1”, “value2”, …)
فرض کنید جدول با ساختار زیر داریم .
Table Store_Information
نام ستون ها نوع داده ستون
store_name char(50)
Sales float
Date datetime

و حالا ما میخواهیم یک رکورد(سطر) اطلاعات وارد جدول فروش کنیم . با مشخصات ذیل : لوس آنجلس – ۱۰ ژانویه ۱۹۹۹ و فروش ۹۰۰$ . بنابرین کد زیر را استفاده میکنیم.
INSERT INTO Store_Information (store_name, Sales, Date)
VALUES (‘Los Angeles’, 900, ‘Jan-10-1999’)
نوع دوم از ورود اطلاعات وارد کردن چندین سطر با هم میباشد . بر خلاف بخش قبلی ، ما از کلمه SELECT برای مشخص کردن داده هایی که میخواهیم وارد جدول کنیم استفاده میکنیم . اگر فکر کرده اید که این اطلاعات از جدول دیگری در حال کپی در این جدول است درست فکر کرده اید.
INSERT INTO “table_name” (“column1”, “column2”, …)
SELECT “column1”, “column2”, …

FROM “table1”
توجه کنید که کد بالا ساده ترین حالت ممکن بود .جمله select شما می تواند دارای کلمات where , Group by , Having باشد .
بطور مثال اگر ما جدولی داشته باشیم که بخواهیم اطلاعات فروش سال ۱۹۹۸ را بگیرد و هم اکنون جدول دیگری دارید که اطلاعات تمام سال های ۱۹۹۵ تا ۲۰۰۰ را شامل میشود و اگر ساختار دو جدول یکسان باشد باید تایپ کنید :

INSERT INTO Store_Information (store_name, Sales, Date)
SELECT store_name, Sales, Date
FROM Sales_Information
WHERE Year(Date) = 1998

در اینجا من اطلاعات را بر اساس یک تاریخ استخراج کردم و در جدول دیگری کپی کردم. اگر رابطه ها را در حالات دیگر بسازید کمی با این حالت فرق دارد . برای مثال در اوراکل تکه آخر کد بصورت زیر در میاید :
WHERE to_char(date,’yyyy’)=1998

UPDATE : گاهی ما در یک جدول اطلاعاتی داریم و میخواهیم مقداری را در جدول تغییر دهیم .برای اینکار از دستور UPDATE استفاده می کنیم .
UPDATE “table_name”
SET “column_1” = [new value]
WHERE {condition}
مثال : ما جدول زیر را داریم .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999

مثلا ما متوجه میشویم که مقدار فروش فروشگاه لوس آنجلس در تاریخ ۰۱/۰۸/۱۹۹۹ در اصل ۵۰۰$ بوده و باید این مقدار را در جدول تصحیح کنیم . برای اینکار از کد زیر استفاده میکنیم.
UPDATE Store_Information
SET Sales = 500
WHERE store_name = “Los Angeles”
AND Date = “Jan-08-1999”
بعد از اجرای کد بالا مقادیر جدول بصورت زیر در میاید .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $500 Jan-08-1999
Boston $700 Jan-08-1999

در جدول مذکور فقط یک رکورد بود که تاریخش Jan-08-1999 و نام فروشگاهش Los Angeles باشد . اگر لچند رکورد با این مشخصات وجود داشت نیز تمام آنها مقدارشان تغییر میکرد . در مثال فوق فوق یک رکورد وجود داشت با مشخصاتی که ما دادیم و فقط هم یک فیلدش را تغییر دادیم .
این امکان وجود دارد که مقدار چند فیلد را به یکباره تغییر دهیم . برای اینکار از گرامر کد زیر استفاده میشود .
UPDATE TABLE “table_name”
SET (“column_1”, “column_2”) = ([new value 1], [new value 2])
WHERE {condition}

UPDATE : برای پاک کردن یک رکورد از جدول ازین کد استفاده میکنیم .
DELETE FROM “table_name”
WHERE {condition}
مثال : جدول زیر را داریم .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
فرض کنید بخواهیم اطلاعات فروشگاه لوس آنجلس را پاک کنیم . برای اینکار از کد زیر استفاده میکنیم .
DELETE FROM Store_Information
WHERE store_name = “Los Angeles”
نتیجه:
Table Store_Information
store_name Sales Date
San Diego $250 Jan-07-1999
Boston $700 Jan-08-1999

دستورات عمومی sql
برای کار با اطلاعات در بانک های اطلاعاتی زبانی مخصوص همان بانک وجود دارد که از آن زبان برای دستکاری اطلاعات و مرتب کردن آنها در بانک استفاده میشود.بانک اطلاعاتی Sql server و همچنین Access و نیز Oracle (البته تا حدودی) از یک زبان واحد برای اینکار استفاده میکنند . در این سری مقالات دستورات ساده SQL را خواهید آموخت . تعدادی ازین دستورات به قرار زیر است که زیر هر کدام از آنها قالب دستوری شان نیز نوشته شده که بزودی بصورت کامل شرح داده خواهند شد . یادگیری هر یک از این دستورات پیش نیاز بعدی میباشد . پس با ما همراه باشید .
Select

SELECT “column_name” FROM “table_name”

Distinct
SELECT DISTINCT “column_name”
FROM “table_name”

Where
SELECT “column_name”
FROM “table_name”
WHERE “condition”

And/Or
SELECT “column_name”
FROM “table_name”
WHERE “simple condition”
{[AND|OR] “simple condition”}+

In
SELECT “column_name”
FROM “table_name”
WHERE “column_name” IN (‘value1’, ‘value2’, …)

Between
SELECT “column_name”
FROM “table_name”
WHERE “column_name” BETWEEN ‘value1’ AND ‘value2’

Like
SELECT “column_name”
FROM “table_name”
WHERE “column_name” LIKE {PATTERN}

Order By
SELECT “column_name”
FROM “table_name”
[WHERE “condition”]
ORDER BY “column_name” [ASC, DESC]

Count
SELECT COUNT(“column_name”)
FROM “table_name”

Group By
SELECT “column_name1”, SUM(“column_name2”)
FROM “table_name”
GROUP BY “column_name1”

Having
SELECT “column_name1”, SUM(“column_name2”)
FROM “table_name”
GROUP BY “column_name1”
HAVING (arithematic function condition)

Create Table
CREATE TABLE “table_name”
(“column 1” “data_type_for_column_1”,
“column 2” “data_type_for_column_2”,
… )

Drop Table
DROP TABLE “table_name”

Truncate Table
TRUNCATE TABLE “table_name”

Insert Into
INSERT INTO “table_name” (“column1”, “column2”, …)
VALUES (“value1”, “value2”, …)

Update
UPDATE “table_name”
SET “column_1” = [new value]
WHERE {condition}

Delete From
DELETE FROM “table_name”
WHERE {condition}
تعریف های اولیه :
Query : به معنای درخواست است و در sql به کد جستجویی می گویند که شما برای بدست آوردن نتیجه ای آن را مینویسید و اجرا می کنید .
Resault set : نتیجه بدست آمده از یک Query را میگویند.
Database : پایگاه داده را دیتابیس میگویند که میتواند شامل جداول و ماژول های ما باشد

دستور SELECT :
اولین نیاز ما انتخاب اطلاعات از یک جدول است . در دستور زیر یک ستون از یک جدول را انتخاب میکنیم .
قالب دستور : SELECT “column_name” FROM “table_name”
مثال :فرض کنید جدولی مانند زیر داریم :
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT store_name FROM Store_Information

نتیحه
Los Angeles
San Diego
Los Angeles
Boston

AND OR :
در فرمان where دیدید که چگونه اطلاعات را بر حسب یه شرط فیلتر کردیم . حال اگر چند شرط داشته باشیم میتوانیم بکمک AND یا OR آنها را بهم وصل کنیم تا در فرمان where از آن استفاده کنیم .
SELECT “column_name”
FROM “table_name”
WHERE “simple condition”
{[AND|OR] “simple condition”}+
علامات {}+ بدین معنی است که اطلاعات داخل براکت ممکن است یک یا چند بار تکرار شود . ما میتوانیم از پرانتز ها نیز برای جدا کردن اولویت عمل کردن AND و OR استفاده کنیم.
مثال :فرض کنید جدولی مانند زیر داریم . جاهایی که فروش بیش از هزار دلار است یا بین ۲۷۵ و ۵۰۰ است را می خواهیم:
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT store_name
FROM Store_Information
WHERE Sales > 1000
OR (Sales < 500 AND Sales > 275)

نتیجه
store_name
Los Angeles
San Francisco
IN :
در SQL دو استفاده از کلمه کلیدی IN میشود . این بخش قسمت اول آنرا که در ارتباط با کلمه کلیدی where است توضیح می دهد . ما ازین کلمه کلیدی وقتی استفاده می کنیم که مقدار یکی از فیلد ها را دقیقا تعیین کنیم . شما میتوانید بیش از یک مقدار را برای فیلد ها تعیین کنید و بین هر مقدار یک کاما بگذارید . مقادیر می توانند کاراکتر و عددی باشیند . اگر فقط یک مقدار میگذارید نیازی به پرانتز نیست .
SELECT “column_name”
FROM “table_name”
WHERE “column_name” IN (‘value1’, ‘value2’, …)
مثال :فرض کنید جدولی مانند زیر داریم .رکوردهایی که مربوط به لوس آنجلس و سان دیگو است را میخواهیم انتخاب کنیم .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT *
FROM Store_Information
WHERE store_name IN (‘Los Angeles’, ‘San Diego’)
نتیجه
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
BETWEEN :
همانطور که کلمه IN به ما کمک میکند تا محدوده انتخاب را به یک یا چند مقدار محدود کنیم ، کلمه BETWEEN کمک میکند تا محدوده را یک بازه تعریف کنیم . در این حال تمام مقادیری که بین value1 و value2 باشند انتخاب میشوند .
SELECT “column_name”
FROM “table_name”
WHERE “column_name” BETWEEN ‘value1’ AND ‘value2’
مثال :فرض کنید جدولی مانند زیر داریم .رکوردهایی که تاریخ آنها بین January 6, 1999 و January 10, 1999 است را میخواهیم .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT * FROM Store_Information WHERE Date BETWEEN ‘Jan-06-1999’ AND ‘Jan-10-1999’
نتیجه
store_name Sales Date
San Diego $250 Jan-07-1999
San Francisco $300 Jan-08-1999
Boston $700 Jan-08-1999
like
این کلمه نیز با کلمه where بکار میرود . اساسا like به شما اجازه میدهد که جستجویی را بر مبنای یک پیش زمینه ای که دارید انجام دهید . (مثلا انتخاب رکوردهایی که یکی از فیلدهایش با کلمه خاصی شروع میشود .)
SELECT “column_name”
FROM “table_name”
WHERE “column_name” LIKE {PATTERN}
روش ساخت پترن بکمک مثال:
‘ABC%’ : تمام کلماتی که با ABC شروع میشوند.
‘%XYZ’ : تمام کلماتی که به XYZ خاتمه می یابند.
‘%AN%’ : تمام کلماتی که شامل عبارت AN هستند .

مثال :فرض کنید جدولی مانند زیر داریم . نتیحه را طبق دستور داده شده مشاهده کنید .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT * FROM Store_Information WHERE store_name LIKE ‘%AN%’
نتیجه
• store_name Sales Date
LOS ANGELES $1500 Jan-05-1999
SAN FRANCISCO $300 Jan-08-1999
SAN DIEGO $250 Jan-07-1999

ASC, DESC
تا کنون دیدیم که چگونه اطلاعات را از جداول استخراج می کردیم . حال برای مرتب سازی اطلاعات بر حسب حروف یا اعداد بر روی یکی از فیلد ها ازین کلمه استفاده میکنیم .
SELECT “column_name”
FROM “table_name”
WHERE “condition”
ORDER BY “column_name” [ASC, DESC]
علامات [] در اطراف where بدین معناست که میتوانید where را بکار نبرید. اما اگر بکار بردید حتما باید قبل از order باشد . ASC به معنای صعودی بودن (a to z)و DESC به معنای نزولی بودن است (z to a).پیش فرضش ACS است.
همچنین این نیز امکان پذیرست که مرتب سازی را بر مبنای بیش از یک ستون انجام دهید .برای این منظور بخش مرتب سازی کد بالا بصورت زیر در میاید :
ORDER BY “column_name1” [ASC, DESC], “column_name2” [ASC, DESC
مثال :فرض کنید جدولی مانند زیر داریم . نتیحه را طبق دستور داده شده مشاهده کنید .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT * FROM Store_Information ORDER BY Sales DESC

نتیجه
store_name Sales Date
Los Angeles $1500 Jan-05-1999
Boston $700 Jan-08-1999
San Francisco $300 Jan-08-1999
San Diego $250 Jan-07-1999
SUM
از وقتی ما در حال کار با اعداد هستیم سوالی که در مرحله دوم برای ما پیش میاید اینه که آیا میشه اعمال حسابی روی این اعداد انجام داد ؟ مثلا میانگین اعداد رو بگیریم .جواب مثبته .SQL چندین عملگر ریاضی داره از جمله SUM و AVG .
SELECT function type(column_name”) FROM table_name
مثال: اگر ما بخواهیم جمع کل فروش های جدول را بدست آوریم بصورت زیر عمل می کنیم
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT SUM(Sales) FROM Store_Information
نتیجه
SUM : Sales

COUNT
یکی دیگر از فانکشن ها COUNT این دستور به ما اجازه میدهد تا تعداد سطرهای یک جدول را بشماریم . گرامر دستوری بصورت زیر است .
SELECT COUNT(“column_name”) FROM table_name
مثال: شمردن سطر های جدول فروش :
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT COUNT(store_name) FROM Store_Information
نتیجه
count(store_name)
4
COUNT و DISTINCT را میتوان برای بدست آوردن مقادیر خاص جدول، با هم در یک عبارت نوشت . مثلا اگر ما بخواهیم تعداد فروش های ویژه جدول را بشماریم باید تایپ کنیم :
SELECT COUNT(DISTINCT store_name) FROM Store_Information
نتیجه:
Count(DISTINCT store_name)
3
حالا ما بسوی فانکشن های جمع بندی میریم . یادتون هست که از فانکشن SUM برای محاسبه کل فروش استفاده کردیم ؟ حالا اگر بخواهیم کل فروش فروشگاه های هر شهر را بدست آوریم چه باید بکنیم ؟ اینجا ۲ چیز لازم است. اول باید نام فروشگاه ها را مانند کل فروش جمع ببندیم و سپس باید مطمئن شویم که تمام فروش ها طبق نام فروشگاه ها باید دسته بندی شود .
SELECT “column_name1”, SUM(“column_name2”) FROM “table_name” GROUP BY “column_name1”
مثال: جدول زیر را در نظر بگیرید .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name
نتیجه
store_name SUM(Sales)
Los Angeles $1800
San Diego $250
Boston $700
کلمه کلیدی Group By وقتی استفاده میشود که ما در حال انتخاب چند ستون هستیم و حداقل یک عملگر محاسباتی در عبارت select داریم . در این زمان ما باید تمام ستونهای دیگر را گروه کنیم.

HAVING
یکی دیگر از چیزهایی که ممکنه در استخراج اطلاعات نیاز داشته باشیم گزیدن اطلاعات بر اساس یک مقیاس است . بطور مثال ممکنه بخواهیم فروشگاه هایی که بیش از ۱۵۰۰ دلار فروش دارند را استخراج کنیم . بجای استفاده از where ما باید از HAVING استفاده کنیم که برای فانکشن های جمعی استفاده میشه . Having معمولا در انتهای جمله query شما استفاده میشود . جمله ای که having دارد میتواند group by هم داشته باشد .
SELECT “column_name1”, SUM(“column_name2”)
FROM “table_name”
GROUP BY “column_name1”
HAVING (arithematic function condition)
مثال: جدول زیر را در نظر بگیرید .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT store_name, SUM(sales) FROM Store_Information GROUP BY store_name HAVING SUM(sales) > 1500
نتیجه
store_name SUM(Sales)
Los Angeles $1800

دستور ALIAS
دو نوع نام مستعار وجود دارند که اکثرا استفاده میشود . یکی نام مستعار ستون و یکی نام مستعار جدول .
بطور خلاصه نام مستعار ستون برای سامان دادن به خروجی استفاده میشود . یعنی نام بالای ستون ها در خروجی قابل تغییر است .
نوع دوم نام مستعار جداول است : با نوشتن نام مستعار درست بعد از نام جدول بعد از From انجام میشود. راحتی استفاده از این کلمه کلیدی در هنگام استفاده از دو جدول در استخراج جداول است که اطلاعات توسط کلمه join متحد و سپس استخراج می گردد .قبل از اینکه به Join برسیم بیایید نگاهی به alias بیندازیم .
SELECT “table_alias”.”column_name1″ “column_alias” FROM “table_name” “table_alias”
بطور خلاصه هر دو نوع مستعار ها بعد از آیتمی میایند که نام مستعارش هستند . البته با یک فاصله .
مثال: جدول زیر را در نظر بگیرید .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
SELECT A1.store_name Store, SUM(A1.Sales) “Total Sales” FROM Store_Information A1 GROUP BY A1.store_name
نتیجه
Store Total Sales
Los Angeles $1800
San Diego $250
Boston $700

دستور JOIN
در این بخش برای یادگیری join نیاز به بسیاری از کلمات کلیدی ای داریم که در دروس قبل آموختیم. به دو جدول زیر توجه کنید .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999

Table Geography
region_name store_name
East Boston
East New York
West Los Angeles
West San Diego
چیزی که ما نیاز داریم اینه که میخواهیم فروش را در هر منطقه جغرافیایی بدست بیاریم . می بینیم که جدول Geography اطلاعات مناطق جغرافیایی را در بر دارد و جدول Store_Information اطلاعات فروش شهر ها را . برای بدست آوردن فروش در هر منطقه ، ما باید اطلاعات بدست آمده از هر منطقه را در هم ترکیب کنیم . با نگاهی به دو جدول می فهمیم که یک فیلد مشترک در هر دو موجود است و آن store_name میباشد که با یک کاما بهم وصل میشوند .
کد زیر را ببینید تا توضیحات را شرح دهیم .
SELECT A1.region_name REGION, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.store_name = A2.store_name
GROUP BY A1.region_name
نتیجه :
REGION SALES
East $700
West $2050
دو خط اول کد به sql میگوید که دو فیلد را انتخاب کند . اولین خط فیلد region_name است از جدول Geography که نام مستعار REGION گرفته است . و دومین خط حاصل فیلد sales از جدول Store_Information که نام مستعار sales گرفته است . دقت کنید که چگونه مستعار های جدول در اینجا بکار گرفته شده . Geography بعنوان A1 مستعار شده و Store_information بنام A2 . بدون استفاده از مستعار ها خط اول بصورت زیر در میاید .
SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES
اساسا کار مستعار ها قابل درک کردن کد های طولانی SQL است . بخصوص هنگامی که چند جدول در کار است .
حال بخط سوم کد اصلی توجه کنید ،یعنی کلمه where . اینجا جائیست که join کارش معلوم میشود . در این حالت ما میخواهیم مطمئن شویم که محتوای “store_name” در جدول Geography با مقادیر آن در جدول Store_Information نظیر میشود و راهش اینه که آنها را برابر هم قرار دهیم . کلمه where لازمه که مطمئن شویم که اطلاعات درست بدست میاید . بدون یک کلمه where درست ، یک نتیجه join دکارتی بدست میاید . نتیحه دکارتی در اصل ترکیبی از تمام حالات بوجود آمده از دو جدول را ارائه میکند . یعنی نتیجه برابر میشه با ۴ x 4 = 16
دستور OUTER JOIN
قبلا دیدیم که چطور اطلاعات را با ایجاد اتصال بین دو جدول استخراج کردیم . در این حالت می خواهیم اطلاعات را از جدولی انتخاب کنیم صرفنظر ازینکه آنها در جدول دیگر ارائه شده اند یا خیر . برای اینکار باید از outer join استفاده کنیم .
این دستور در دیتابیس ها ، وابسته به نوع دیتابیس است . بطور مثال در اوراکل ما باید یک علامت “(+)” در کلمه where قرار دهیم .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999

Table Geography
region_name store_name
East Boston
East New York
West Los Angeles
West San Diego
جداول بالا موجود است و ما میخواهیم فروش تمام فروشگاه ها را که در جدول Geography آمده بدست آوریم . اگر مااز حالت join معمولی استفاده کنیم اطلاعات درستی بدست نمی آوریم ، چون مقدار New York را در جدول دوم به ما نشان نخواهد داد . چرا ؟ چون این مقدار در جدول اولی موجود نیست .
SELECT A1.store_name, SUM(A2.Sales) SALES
FROM Georgraphy A1, Store_Information A2
WHERE A1.store_name = A2.store_name (+)
GROUP BY A1.store_name
توجه کنید که در کد بالا ما در حال استفاده از گرامر دستوری oracle هستیم .
نتیجه :
store_name SALES
Boston $700
New York
Los Angeles $1800
San Diego $250
نکته : وقتی که رکوردی در جدول دوم همتایش موجود نباشد NULL برگردانده میشود . در این حالت New York در جدول Store_Information موجود نمی باشد .

دستور UNION
هدف دستور Union ترکیب کردن نتایج حاصل از دو query با یکدیگر میباشد. در این رابطه میتوان گفت که union چیزی شبیه به join میباشد . چون هر دوی آنها برای ایجاد رابطه بین اطلاعات جداول مختلف استفاده میشوند . یکی از محدودیت های union این است که این ستون های متناظر با هم باید از یک نوع داده اطلاعات باشند. همچنین هنگام استفاده ار union فقط مقدار های متمایز انتخاب میشوند .(مانند select Distinct ) .
قالب دستوری :
[SQL Statement 1]
UNION
[SQL Statement 2]
مثال : جداول زیر را در نظر بگیرید . ما میخواهیم تمام تاریخ هایی را که در آن معامله ای انجام شده است استخراج کنیم . بنابرین از کد زیر استفاده میکنیم .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Table Internet Sales
Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales
نتیجه :
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
توجه کنید که اگر ما از SELECT DISTINCT Date استفاده کنیم ، برای یکی یا هر دو عبارت، ما نتایج یکسانی را بدست خواهیم آورد .

دستور UNION ALL
هدف دستور Union all نیز ترکیب کردن نتایج حاصل از دو query با یکدیگر میباشد . اما فرقی که با union دارد این است که هنگام استفاده از union فقط مقادیر متمایز نشان داده میشود ، اما با union all تمام مقادیر برگردانده میشود.
قالب دستوری :
[SQL Statement 1]
UNION ALL
[SQL Statement 2]
مثال : جداول زیر را در نظر بگیرید . ما میخواهیم تمام تاریخ هایی را که در آن معامله ای انجام شده است استخراج کنیم . بنابرین از کد زیر استفاده میکنیم . تفاوت را با union مقایشه کنید .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Table Internet Sales
Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
SELECT Date FROM Store_Information
UNION ALL
SELECT Date FROM Internet_Sales
نتیجه :
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-08-1999
Jan-07-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999

دستور INTERSECT
مانند دستور union این دستور نیز با دو جمله SQL کار میکند . اما تفاوت اینجاست که دستور union در اصل مانند یک OR کار میکند و تمام رکوردهای غیر تکراری را بر میدارد . اما این دستور مانند AND کار میکند و رکورد های مشترک را بر میدارد .
قالب دستوری :
[SQL Statement 1]
INTERSECT
[SQL Statement 2]
مثال : جداول زیر را در نظر بگیرید . ما میخواهیم تمام تاریخ هایی را که در آن معامله ای انجام شده است استخراج کنیم . بنابرین از کد زیر استفاده میکنیم . تفاوت را با union مقایشه کنید .
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Table Internet Sales
Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
SELECT Date FROM Store_Information
INTERSECT
SELECT Date FROM Internet_Sales
نتیجه :
Date
Jan-07-1999

دستور MINUS
این دستور نیز با دو جمله SQL کار میکند. در ابتدا تمام نتایج query اول را میگیرد و سپس از میان نتایج ، آنهایی را که در query دوم هستند حذف میکند .
قالب دستوری :
[SQL Statement 1]
MINUS
[SQL Statement 2]
در اینجا میخواهیم تاریخ هایی را که در آنها فقط فروش در فروشگاه داشته این بیابیم.(فروش روی اینترنتی اصلا نمیخواهیم)
Table Store_Information
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Table Internet Sales
Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
SELECT Date FROM Store_Information
MINUS
SELECT Date FROM Internet_Sales
نتیجه :
Date
Jan-05-1999
Jan-08-1999

آموزش Enterprise Manager
ميتوان گفت قلب Sql Server است. در Enterprise Manager شما ميتوانيد يك اتصال به سرور Sql برقرار كنيد . table بسازيد. User تعريف كنيد و….. علامت فلش سبز نمايانگر فعال بودن سرور است.
سرور ميتواند local باشد مانند بالا و يا يك Sqlserver باشد برروي يك سرور . براي ايجاد يك سرور جديد يا به عبارت ديگر وصل شدن client (ويندوز ۹۸) به يك سرور ديگر بر روي يكي Microsoft Sql Server يا SQL Server Group و يا برروي سرور موجود كليك سمت راست كرده و گزينه New Sql Server Registratin را انتخاب كنيد. سپس كليد next را انتخاب كنيد. سپس در منوي بعدي در available Server نام سرور خود را تايپ كنيد . (نام سرور SQL خود را كه برروي ويندوز ۲۰۰۰ خود نصب كرده ايد) و بعد كليد add را فشار دهيد.و گزينه next را انتخاب كنيد.

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

پس از انتخاب نام آن را تاييد كنيد.
هر Database شامل موارد زير است :
۱- Diagram : ارتباط جداول را نشان ميدهد.
۲- Tables : جداول پروژه را نشان ميدهد.
۳- Views : ديدهاي پروژه را نشان ميدهد.
۴- Stored Procedure : كدهاي sql مربوط به عملياتهاي روي جداول را نگهداري ميكند.
۵- Users : كاربران تعريف شده بر روي اين database را نشان ميدهد.
۶- Roles: قوانين دسترسي به جداول و پروسيجرها را نشان ميدهد.
۷- Rules : قوانين مربوط به داده ها را در جداول نشان ميدهد.
گزينه هاي ۷ به بعد كاربرد آنچناني براي كارهاي ابتدايي ندارند

ايجاد يك جدول جديد :
براي ايجاد يك جدول جديد بروي 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 را وارد كنيد.

۱- نام 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 دستورات مورد نظر را تايپ ميكنيم :

مثال ۱ : 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 اضافه شده است .
مثال ۲ : تمام فيلدهاي 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 ‘۰۱/۰۱/۱۹۴۰’ , ‘۱۵/۰۶/۱۹۵۵’
۳- تعريف متغيرها : براي تعريف متغيرها مي بايست از كلمه كليدي Declare استفاده كنيم. بعنوان مثال : Declare @myname varchar(50)
متغيير @myname از نوع كاركتري پويا تعريف ميكند.

۴- برگرداندن كد خطا : بدين منظور از دستور return @@Error
گرچه هرمقداري را كه بخواهيم مي توانيم با دستور return برگردانيم.
۵- تعريف پارامترها كه مقداري را برمي گردانند : براي اين منظور هنگامي كه پارامتر را در ابتداي پروسيجر تعريف ميكنيم بعد از نوع آن از كلمه كليدي output مي كنيم بعنوان مثال :
create Stored Procedure Employees_BROWSE2
(@StartDate char(10) , @EndDate char(10) , @pp varchar(10) output)