دستور SELECT و SELECT DISTINCT در SQL

30 بهمن 1397
درسنامه درس 3 از سری آموزش زبان SQL
SQL-Language-select-select-distinct

با سلام، در این قسمت قصد داریم در رابطه با دستور SELECT و جزئیات آن صحبت کنیم بنابراین بدون مقدمه وارد بحث می شویم!

دستور SELECT در زبان SQL

دستور SELECT (به معنی "انتخاب کردن") برای انتخاب داده ها از پایگاه داده مورد استفاده قرار می گیرد. داده هایی که با دستور SELECT بر میگردند در جدول نتایج ذخیره می شوند که به آن result-set (به معنی "دسته ی نتیجه ها") می گوییم.

ساختار کلی این دستور به شکل زیر است:

SELECT column1, column2, ...
FROM table_name;

اگر یادتان باشد column به معنی "ستون" و row به معنای ردیف است. همچنین به جای table_name باید نام جدول خود را قرار دهید.

در واقع این دستور می گوید ستون های فرضیِ column1 و column2 را از جدولِ فرضی table_name به ما بده. اگر تمام ستون ها را بخواهیم می توانیم از دستور زیر استفاده کنیم:

SELECT * FROM table_name;

علامت ستاره (*) به معنی "هر چیزی" است، بنابراین زمانی که می گوییم * SELECT یعنی هر چیزی را از جدول table_name بردار و به ما تحویل بده.

بیایید به پایگاه داده ی Northwind برویم.

دستور SELECT در عمل

اگر یادتان باشد پایگاه داده ی Northwind پایگاه داده ای است که از قبل توسط ماکروسافت آماده شده است و ما در طول این دوره با آن کار می کنیم. تصویر زیر قسمتی از این پایگاه داده است. برای آشنایی با ستون ها، ردیف ها و کلیت جدول به آن توجه کنید:

Northwind database
Northwind database

حال می خواهیم به عنوان تمرین، از دستور SELECT در پایگاه داده ی Northwind استفاده کنیم و ستون های City و CustomerName را دریافت کنیم. این کار بسیار ساده است، تنها کافی است از دستور زیر استفاده کنید:

SELECT CustomerName,City FROM Customers;

برای مشاهده ی نتیجه ی این دستور روی ایـــــن لیـــــنک کلیک کنید.

هشدار: از آن جایی که پایگاه داده ی ما به صورت خاصی برای استفاده ی شما قرار داده شده است، استفاده از مرورگر هایی غیر از کروم یا سافاری ممکن است باعث تولید خطا های مختلفی شود. ما سعی می کنیم برای دوستانی که از فایرفاکس استفاده می کنند لینک جداگانه ارائه دهیم اما اگر به مشکل برخورد کردید از مرورگر کروم استفاده کنید.

فکر می کنید چند ردیف به ما برگردانده می شود؟ درست حدس زدید 91 ردیف! چرا؟ تعداد تمام ردیف های ما 91 عدد بود (یعنی 91 مشتری داشته ایم). اگر به ساختار کلی دستور SELECT که بالاتر نوشته ام دقت کنید می بینید که با این دستور ستون ها را انتخاب می کنیم و تعداد ردیف ها دست نخورده باقی می ماند.

بنابراین خروجی ما می شود دو ستونِ CustomerName و City که از 91 ردیف گرفته شده اند. قسمتی از result set ما مانند تصویر زیر خواهد بود:

قسمتی از نتایج برگشتی پس از استفاده از دستور SELECT CustomerName,City FROM Customers
قسمتی از نتایج برگشتی پس از استفاده از دستور SELECT CustomerName ,City FROM Customers

اگر تمام ستون ها را بخواهیم از همان علامت ستاره استفاده می کنیم. مثال:

SELECT * FROM Customers;

برای مشاهده ی نتیجه ی این دستور روی این لینک کلیک کنید. این دستور در واقع تمام ستون ها را انتخاب می کند. از مثال قبل می دانیم تعداد ردیف ها نیز دست نخورده است بنابراین این دستور عملا کل جدول ما را یک جا به ما بر می گرداند.

دستور SELECT DISTINCT

کلمه ی distinct در فارسی به معنای "متفاوت" یا "متمایز" است. دستور SELECT DISTINCT در واقع تنها مقادیری را برمیگرداند که متمایز باشند (یعنی تکراری نباشند).

یک ستون در جدول شما معمولا مقادیر تکراری بسیاری دارد. به طور مثال ستونی فرضی به نام "نام" را در نظر بگیرید. فکر می کنید تمام مشتریان شما نام متفاوتی دارند؟ خیر. شاید ده ها نفر نام یکسانی داشته باشند؛ به طور مثال 10 نفر حسین، 20 نفر سارا، 5 نفر رضا و ... داشته باشیم. مشکل اینجاست که برخی اوقات شما تنها مقادیری را می خواهید که تکراری نباشند؛ در چنین حالتی از این دستور استفاده می کنیم. ساختار کلی این دستور به این شکل است:

SELECT DISTINCT column1, column2, ...
FROM table_name;

مشخص است که تفاوت آنچنانی با SELECT ندارد بلکه کلمه ی DISTINCT به آن اضافه می شود.

برویم به سراغ یک مثال!

دستور زیر ابتدا جدول Customers را پیدا کرده و سپس تمام مقادیر ستون Country را برمی گرداند، حتی مقادیر تکراری را:

SELECT Country FROM Customers;

برای مشاهده ی نتیجه ی این دستور روی این لینک کلیک کنید.

همانطور که انتظار می رود، تعداد ردیف های برگشتی ما 91 عدد است و تمام مقادیر تکراری نیز در result set ما موجود است؛ به طور مثال از آن جا که چندین مشتری از Mexico یا کشور مکزیک داشته ایم، این کشور چندین بار تکرار شده است.

حالا بیایید از کلمه ی DISTINCT استفاده کنیم:

SELECT DISTINCT Country FROM Customers;

برای مشاهده ی نتیجه ی این دستور روی این لینک کلیک کنید.

این بار تعداد ردیف های برگشتی ما 21 عدد است! چرا؟ به این دلیل که مشتریان ما از 21 کشور بوده اند و تکرار نام کشور ها از ردیف ها حذف شده است.

سوال: در لینکی که به ما داده شده است، تعداد ردیف های برگشتی کاملا مشخص است. آیا در هنگام برنامه نویسی نیز این طور است؟

پاسخ: خیر. در هنگام کار با پایگاه داده تقریبا هیچ چیز به صورت خودکار برای شما نمایش داده نمی شود. اگر می خواهید تعداد ردیف های برگشتی را بدانید باید از دستور count استفاده کنید. مثال:

SELECT COUNT(DISTINCT Country) FROM Customers;

برای مشاهده ی نتیجه ی این دستور برای مرورگر های کروم و سافاری روی این لینک کلیک کنید.

برای مشاهده ی نتیجه ی این دستور برای مرورگر های Edge و فایرفاکس روی این لینک کلیک کنید.

خروجی ما عدد 21 خواهد بود. در مورد COUNT در جلسات بعد مفصلا صحبت خواهیم کرد.

خلاصه ی مقاله

در این جلسه با ساختار کلی دستورات SELECT و SELECT DISTINCT آشنا شدیم و ار هر کدام مثالی ارائه کردیم. در قسمت بعد به سراغ دستور where می رویم و تمریناتی را نیز به شما خواهیم داد. امیدوارم از این قسمت لذت برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش زبان SQL توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (4 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی
29 مرداد 1402
آقا دمت گرررم، کمک بزرگی کردی بهمون :)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Reza
12 اردیبهشت 1401
سلام خیلی ممنون از زحماتی که می کشید، خیلی خوب و شفاف توضیح داده شده. من یک خواهشی داشتم که اگر میشه در آخر هر درس یک سری تمرین هم بدین که خودمون حل کنیم. متشکرم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
15 اردیبهشت 1401
تشکر از نظرتون. پیشنهاد شما حتما بررسی خواهد شد.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Hamed
22 اردیبهشت 1399
دمت گرممممم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

سید محمد
01 اسفند 1398
با سلام، این دستور؛ [SELECT * FROM [Product با این دستور؛ SELECT * FROM Product چه فرقی می‌کنه؟ با تشکر

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر زوارمی
04 اسفند 1398
سلام دوست عزیز به اون علامت های براکت اضافه شده می گن Delimited Identifiers: https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms176027(v=sql.105)?redirectedfrom=MSDN اگر از Microsoft SQL Server استفاده کنید، احتمالا نام جداول شما درون براکت قرار بگیره. این کار برای یکی از دو حالت زیر اتفاق می افته: 1- زمانی که نام جدول شما معادل یکی از نام های رزرو شده در زبان SQL یا دیتابیس Microsoft SQL Server باشه. با این کار به Microsoft SQL Server اعلام میشه که این یک کلمه ی کلیدی نیست بلکه نام جدول خاصی هست. 2- زمانی که نام جدول شما دارای کاراکتر های غیر مجاز باشه اطلاعات بیشتر توی لینکی که گذاشتم موجوده.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.