با استفاده از دستور SELECT می توان داده ها را از sql server بازیابی کنید.
زبان T-SQL برای دریافت و بازیابی داده ها، تنها به واژه ی SELECT نیاز دارد به طوری که پس از آن حداقل یک آیتم قرار گرفته باشد. به این آیتم ها، select-list گفته می شود.
در صورتی که SQL Server Management Studio در حال اجرا نیست، آن را start کنید. هنگامی که ورود اطلاعات اتصال از شما درخواست شد، برای اینکه بتوانید این مثال ها و تمرین ها را یاد بگیرید، باید از قبل دیتابیس نمونه ی AdventureWorks را نصب کرده باشید.
select کردن یک مقدار لیترال
احتمالا ساده ترین شکل از دستور SELECT این است که از آن برای برگرداندن یک مقدار لیترال استفاده کنیم.
یک مقدار لیترال، مقداری است که دقیقا مشخص و معلوم باشد. به داده هایی که از دیتابیس بیرون می آیند، لیترال گفته نمی شود.
برای شروع، بر روی New Query کلیک کنید تا یک پنجره جدید برای وارد کردن کوئری باز شود. مثال زیر، دستور SELECT را نشان می دهد که یک مقدار لیترال را برمی گرداند. همان طور که مشاهده می کنید، این یک رشته است که در داخل علامت های کوتیشن قرار گرفته است. (کلا یک رشته را تعیین می کند).
توصیه می شود که در پایان تمام عبارات T-SQL یک سمی کالن قرار دهید.
در مثال زیر، استفاده از سمی کالن ها ضروری نیست اما بهتر است که از آنها استفاده کنیم تا به آن عادت کنیم.
بنابراین هر یک از خط کدهای زیر را در پنجره ی کوئری خود تایپ کنید:
پس از اینکه این کدها را در داخل پنجره ی کوئری تایپ کردید، کلید F5 را فشار دهید و یا بر روی دکمه ی Execute کلیک کنید تا کدها اجرا شوند. خواهید دید که نتایج در داخل دو پنجره در زیر صفحه ی نمایش نشان داده می شود. به عکس 3.1 توجه کنید. به دلیل اینکه شما تنها دو عبارت را مورد اجرا قرار داده اید، دو نتیجه به شما نشان داده می شود.
نکته: اگر با استفاده از ماوس، یک یا چند عبارت دستوری را در پنجره ی کوئری انتخاب کنید، می توانید تنها، آنها را اجرا کنید. بعنوان مثال ممکن است بخواهید تنها یک عبارت را مورد اجرا قرار دهید، برای انجام این کار، با استفاده از ماوس دستور دلخواه خود را که می خواهید اجرا شود را انتخاب کنید و سپس کلید F5 را فشار دهید. شما همچنین می توانید بر روی آیکن Execute کلیک کنید و یا کلید های CTRL+E را فشار دهید.
به تب Messages که در کنار تب Results قرار دارد توجه کنید. حالا بر روی تب Messages کلیک کنید. در اینجا تعداد ردیف هایی که تحت تاثیر قرار گرفته اند و خطاها و یا پیغام های اطلاعاتی را مشاهده می کنید.
در صورتی که یک خطا ایجاد شود، خواهید دید که پس از اجرا، تب Messages به طور پیش فرض به جای تب Results نشان داده می شود. برای مشاهده ی نتایج (در صورت وجود) می توانید بر روی تب Results کلیک کنید.
بازیابی اطلاعات از یک جدول
معمولا ممکن است بخواهید که به جای مقادیر لیترال، داده هایی را از یک جدول بازیابی کنید.
به منظور بازیابی داده ها از یک جدول، می توانید این کدها را پاک کنید و یا یک پنجره ی کوئری جدید را باز کنید.
برای اینکه به دیتابیس نمونه ی خود برویم، عبارت Use AdventureWorks را تایپ کنید و آن را execute کنید. و یا اینکه می توانید از لیست کشویی نشان داده شده در عکس 3.2 دیتابیس AdventureWorks را انتخاب کنید.
در دستور SELECT برای اینکه بتوانید یک جدول را مشخص کنید، باید از دستور FROM استفاده کنید. دستور FROM اولین دستوری است که انجین دیتابیس آن را اجرا و پردازش می کند. در زیر سینتکس دستور SELECT به همراه دستور FROM نشان داده شده است:
مثال
SELECT <column1>, <column2> FROM <schema>.<table>;
نکته: ورژن های دیتابیس AdventureWorks با توجه به نسخه ی SQL SERVER مورد استفاده، به نام این دیتابیس اضافه می شوند. در سراسر این کتاب، از نام “AdventureWorks” به جای دیگر نام های خاص استفاده خواهد شد. یعنی ممکن است نام دیتابیس شما دقیقا برابر با AdventureWorks نباشد و عددهایی به آن اضافه شده باشند. که خودتان باید به هنگام نوشتن کوئری ها از نام صحیح متناسب استفاده کنید.
کدهای مثال زیر (لیست 3.2) را تایپ و اجرا کنید تا بیاموزید که چطور می توان داده ها را از یک جدول بازیابی نمود:
مثال(لیست 3.2): نوشتن یک کوئری با استفاده از دستور FROM
USE AdventureWorks;
GO
SELECT BusinessEntityID, JobTitle
FROM HumanResources.Employee;
عبارت اول در لیست 3.2 باعث می شود که به دیتابیس AdventureWorks متصل شویم(در صورتی که قبلا به آن متصل نبوده باشیم).
کلمه ی GO کاری خاصی انجام نمی دهد و تنها وظیفه ی آن این است که کدهای خط اول را از دسته کدهای بعدی جدا می کند. در فصل 12 در مورد علت های استفاده از دسته ها توضیحات کاملی رامشاهده خواهید نمود.
هنگامی که می خواهیم داده های یک جدول را بازیابی کنیم، باز هم باید از یک select-list استفاده کنیم، به مثال لیست 3.1 توجه کنید. اما در select-list معمولا نام ستون ها قرار می گیرد.
select-list درون لیست 3.2 داده ها را از ستون های BusinessEntityID و JobTitle درخواست می کند به طوری که هردوی این ستون ها در داخل جدول Employee قرار دارند.
جدول Employee نیز خود در داخل اسکیمای HumanResources قرار دارد.
عکس 3.3 خروجی کدهای درون لیست 3.2 را پس از اجرا، نشان می دهد. همان طور که مشاهده می کنید، تنها یک مجموعه از نتایج(results) در خروجی وجود دارند، زیرا ما تنها از یک دستور SELECT استفاده کرده ایم.
همان طور که در لیست 3.2 مشاهده می کنید، در دستور FROM نام جدول مورد نظر دارای دو بخش می باشد. یعنی به صورت زیر است:
اولین بخش از این عبارت، یعنی عبارت HumanResources نام یک اسکیما را مشخص می کند.
در sql server یک گروه از جدول های مرتبط به یکدیگر را می توان در داخل یک اسکیما قرار داد.
شما همواره مجبور نیستید که نام این اسکیما ها را ذکر کنید. اما بهتر است که این کار را انجام دهید.
اگر دو اسکیما را در نظر بگیریم، به طور بالقوه، هریک از آنها می تواند حاوی یک جدول به نام Employee باشد. اما این دو جدول با یکدیگر متفاوت هستند و ممکن است دارای ساختار و داده های متفاوتی باشند.
ذکر کردن نام اسکیما در هنگام اشاره به جدول ها، از گیج شدن ما و ایجاد خطاها جلوگیری می کند.
برای بازیابی تمام ستون های یک جدول، می توانید از نماد * استفاده کنید.
برای امتحان کردن این موضوع، و استفاده از این روش کوتاه، دستور زیر را اجرا کنید:
دستور
SELECT * FROM HumanResources.Employee
با اجرای دستور بالا، خواهید دید که تمامی ستون های جدول مورد نظر برگردانده خواهند شد.
استفاده از علامت * در هنگام اجرای یک کوئری کوتاه به کار می آید و شما باید در نرم افزارهای تولیدی یا گزارش ها یا پردازش ها از آن اجتناب کنید.
بازیابی داده هایی که مورد نیاز نیست، بر روی کارایی(performance) تاثیر منفی می گذارد.
چرا وقتی که تنها به چند ستون از جدول ها نیاز داریم، باید تمام ستون های یک جدول را بازیابی کنیم و از شبکه، داده های اضافی را دریافت کنیم ؟
اگر یک ستون اضافه به جدول مورد نظر اضافه یا کم شود، علاوه بر تاثیر بر کارایی، امکان دارد تا کد برنامه شکسته شود.
علاوه بر موارد بالا، اینکه می گوییم تنها باید تعدادی از ستون ها را بازیابی کنیم، ممکن است دارای دلیل امنیتی باشد.
بنابراین بهترین تمرین این است که در select-list ها دقیقا ستون هایی که نیاز داریم را مشخص کنیم و تنها ردیف هایی که نیاز داریم را برگردانیم.
تولید یک Select-List در sql server
ممکن است با خود فکر کنید که تایپ کردن تمام ستون های ضروری برای یک select-list کاری خسته کننده است. خوشبختانه SQL Server Management Studio یک راه میانبر را برای نوشتن دستورات SELECT به ما ارائه داده است.
برای یادگیری این روش میانبر، دستورالعمل های زیر را دنبال کنید:
1. در بخش Object Explorer بخش Databases را باز کنید.
2. حالا بخش AdventureWorks را باز کنید.
3. حالا بخش Tables را باز کنید.
4. بر روی جدول HumanResources.Employee راست-کلیک کنید.
5. گزینه های Script Table as…. ➤ SELECT To ➤ New Query Editor Window را به ترتیب انتخاب کنید.
6. حالا کدها را Run کنید(اجرا کنید).
حالا شما یک دستور SELECT دارید که به درستی وارد شده است و تمامی ستون های جدول HumanResources.Employee را بازیابی کرده است. به لیست 3.3 توجه کنید. شما همچنین می توانید به آسانی ستون هایی که در این کوئری به آنها نیاز ندارید را حذف کنید.
لیست 3.3
USE [AdventureWorks]
GO
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[LoginID]
,[OrganizationNode]
,[OrganizationLevel]
,[JobTitle]
,[BirthDate]
,[MaritalStatus]
,[Gender]
,[HireDate]
,[SalariedFlag]
,[VacationHours]
,[SickLeaveHours]
,[CurrentFlag]
,[rowguid]
,[ModifiedDate]
FROM [HumanResources].[Employee]
GO
همان طور که در لیست 3.3 مشاهده می کنید، نام ها در داخل براکت قرار دارند.
همان طور که می دانید، انتخاب نام یک ستون یا نام یک جدول در sql server دارای یک سری قواعد می باشد. و باید طوری نوشته شود که تجزیه کننده ی sql server بتواند آنها را تشخیص دهد.
اما اگر نام یک جدول یا ستون یا دیتابیس، از این قواعد نام گذاری پیروی نکند، باید هنگام اشاره به آنها، از یک جفت براکت([]) استفاده نمود.
ابزارهای خودکار(مثل این ابزاری که در بالا از آن استفاده کردیم) اغلب نام ها را به طور اتوماتیک در داخل براکت ها قرار می دهند.
نکته: یک راه میانبر دیگر در تایپ کردن نام ستون ها این است که از بخش سمت چپ Management Studio بر روی ستون های دلخواه کلیک کنید و آنها را به پنجره ی کوئری درگ کنید. بعنوان مثال، اگر شما بر روی پوشه ی Columns کلیک کنید و آن را در پنجره ی کوئری درگ کنید، sql server تمامی ستون ها را برای شما لیست می کند.
ترکیب لیترال ها و نام ستون ها در کوئری
شما می توانید مقادیر لیترال و نام ستون ها را در یک عبارت دستوری، با یکدیگر ترکیب (مخلوط) کنید.
لیست 3.4 یک مثال را به ما نشان می دهد.
sql server به ما امکان می دهد تا در داخل یک کوئری، با استفاده از یک نام مستعار(alias) یک ستون را ایجاد کنیم و یا نام آن را عوض کنیم. برای مشخص کردن یک نام مستعار() می توانیم از کلمه ی کلیدی AS استفاده کنیم.
این روش، هنگام استفاده از مقادیر لیترال بسیار کاربردی است. با استفاده از این روش می توانید یک ستون جدید در جدول خود ایجاد کنید که قبلا وجود نداشته است و می توانید یک عنوان برای این ستون تعیین کنید.
لیست 3.4
SELECT 'A Literal Value' AS "Literal Value",
BusinessEntityID AS EmployeeID,
LoginID JobTitle
FROM HumanResources.Employee;
حالا کوئری لیست 3.4 را اجرا کنید.
حالا باید نتیجه ی به دست آمده همچون عکس 3.4 باشد. در نتیجه ی به دست آمده، به نام ستون ها توجه کنید. همان طور که در عکس 3.4 مشاهده می کنید، از نام های مستعاری که در کوئری استفاده کردیم بعنوان نام ستون ها استفاده شده است. این امکان وجود دارد که برای هر ستون، یک نام مستعار(alias ) تعریف شود. این نام مستعار به شما کمک می کند که بر نتایج به دست آمده، کنترل کاملی داشته باشید.
استفاده از کلمه ی کلیدی AS اختیاری است.
شما می توانید بلافاصله پس از نام یک ستون، نام مستعار(alias ) را مشخص کنید.
در صورتی که یک نام مستعار(alias )، حاوی فاصله ی سفید باشد و یا یک کلمه ی کلیدی رزرو شده باشد، آنگاه می توانید این نام مستعار را در داخل براکت یا در داخل تک کوتیشن ها و یا در داخل دبل-کوتیشن ها قرار دهید.
در صورتی که در انتخاب نام مستعار از قواعد نام گذاری به درستی استفاده شود، نیازی به استفاده از براکت ها و کوتیشن ها نیست.
به یاد داشته باشید که در select-list هر کلمه ای که بلافاصله پس از نام یک ستون قرار گرفته باشد، یک نام مستعار تلقی خواهد شد.
بنابراین اگر شما فراموش کنید که بین دو نام ستون، کاما قرار دهید، نام ستون دومی بعنوان نام مستعار اولی در نظر گرفته خواهد شد.
از قلم انداختن کاما ها، یک خطای متداول است که کاربران معمولا دچار آن می شوند.
بعنوان مثال، به کوئری نشان داده شده در لیست 3.4 توجه کنید. در اصل در این کوئری، هدف ما این است که ستون های LoginID و JobTitle را نشان دهیم.
اما به دلیل اینکه از یک علامت کاما در بین این دو نام ستون استفاده نکرده ایم، کلمه ی JobTitle بعنوان نامِ مستعار ستونِ LoginID در نظر گرفته شده است. ( در حالی که JobTitle خودش یک نام ستون است).
بنابراین خوب به این خطای متداول نگاه کنید و سعی کنید که در کوئری نوشتن از آن اجتناب کنید.
برای یادگیری کوئری نویسی، باید در مورد زبان T-SQL بیشتر مطالعه کنید و سعی کنید تا خودتان کدهای درون مثال ها را تایپ و اجرا کنید.
بهترین راه آموزش کوئری نویسی این است که سعی کنید خودتان معنی کدها را درک کنید و بفهمید.
اکنون که مطالبی را در مورد کوئری نویسی و sql server فرا گرفته اید، بهتر است که چند تمرین را حل کنید.
بنابراین دستورالعمل های نشان داده شده در تمرین 3.1 را دنبال کنید و با نوشتن کوئری ها، خودتان را محک بزنید.
تمرین 3.1
برای انجام تمرین های زیر، به دیتابیس AdventureWorks بروید. در پایان این فصل، راه حل مسائل آورده شده اند. همان طور که قبلا هم گفته شد، شما می توانید در بخش Object Explorer پوشه ی tables را باز کنید تا لیست نام جدول ها را مشاهده کنید. سپس پوشه ی column از جدول مورد نظر را باز کنید تا لیست ستون ها را مشاهده کنید. حالا کارهای زیر را انجام دهید:
1. یک دستور SELECT بنویسید که لیست مشتریان(customers ) را به همراه ID آنها به ما بدهد. یعنی ستون های StoreID و AccountNumber را از جدول Sales.Customers به ما بدهد.
2. یک دستور SELECT بنویسید که لیست نام(name) و شماره محصول(product number) و رنگ(color) هریک از محصولات در جدول Production.Product را به ما بدهد.
3. یک دستور SELECT بنویسید که لیست ID مشتریان (customer ID) و ID محصول(sales order ID) را از جدول Sales.SalesOrderHeader به ما بدهد.
4. به سول زیر پاسخ بدهید:
سوال: چرا هنگامی که می خواهیم یک select-list را بنویسیم، باید به جای استفاده از علامت * ، نام ستون ها را یکی یکی مشخص کنیم؟ حداقل دو دلیل بیاورید.
READ MORE