بخش اول: ورود به جهان قدرتمند PostgreSQL
بخش دوم: جادوی جستجو و کوئری‌نویسی
بخش سوم: بهینه‌سازی و ساختارهای پیشرفته
بخش چهارم: امنیت، پشتیبانی، عملکرد و نگه‌داری
کارگاه‌ها و مثال‌های کاربردی

آشنایی با DQL و ساختار کلی دستور Select

در SQL، دستورها به چند دسته اصلی تقسیم می‌شوند:

دستهتوضیح
DDLتعریف ساختار داده (مثل CREATE, ALTER, DROP)
DMLدستکاری داده (مثل INSERT, UPDATE, DELETE)
DQLپرس‌وجو از داده‌ها (مانند SELECT)
DCLکنترل دسترسی (مثل GRANT, REVOKE)
TCLکنترل تراکنش‌ها (مثل COMMIT, ROLLBACK)

DQL (Data Query Language) وظیفه‌ی واکشی و نمایش داده‌ها را بر عهده دارد.
در واقع، همه چیز در DQL حول محور دستور SELECT می‌چرخد .


🧩 دستور SELECT در PostgreSQL

ساختار کلی دستور SELECT به صورت زیر است:

SELECT [DISTINCT] column_list
FROM table_name
[WHERE condition]
[GROUP BY column_list]
[HAVING group_condition]
[ORDER BY column_list [ASC|DESC]]
[LIMIT n OFFSET m];

بیایید هر بخش را بررسی کنیم 👇


۱. SELECT – انتخاب ستون‌ها

با SELECT مشخص می‌کنیم کدام ستون‌ها را می‌خواهیم ببینیم:

SELECT first_name, last_name
FROM customers;

🔹 برای انتخاب همه‌ی ستون‌ها:

SELECT * FROM customers;

۲. DISTINCT – حذف رکوردهای تکراری

SELECT DISTINCT country
FROM customers;

🔹 نتیجه فقط کشورهای یکتا را نمایش می‌دهد.


۳. FROM – منبع داده

بخش FROM مشخص می‌کند داده از کدام جدول یا ویو باید خوانده شود.
مثلاً:

SELECT * 
FROM orders;

۴. WHERE – فیلتر کردن رکوردها

برای محدود کردن داده‌ها از شرط WHERE استفاده می‌کنیم:

SELECT * 
FROM customers
WHERE country = 'Germany';

🔹 می‌توان از عملگرها استفاده کرد:

  • مقایسه‌ای: =, <>, <, >, <=, >=
  • منطقی: AND, OR, NOT
  • الگوها: LIKE, ILIKE
  • مجموعه‌ای: IN, NOT IN
  • محدوده‌ای: BETWEEN ... AND ...

۵. GROUP BY – گروه‌بندی داده‌ها

برای محاسبات تجمیعی (مثل میانگین، جمع، تعداد) استفاده می‌شود:

SELECT country, COUNT(*) AS customer_count
FROM customers
GROUP BY country;

۶. HAVING – شرط برای گروه‌ها

برخلاف WHERE که روی ردیف‌ها اعمال می‌شود، HAVING روی گروه‌ها اعمال می‌شود:

SELECT country, COUNT(*) AS customer_count
FROM customers
GROUP BY country
HAVING COUNT(*) > 5;

۷. ORDER BY – مرتب‌سازی نتایج

SELECT first_name, country
FROM customers
ORDER BY country ASC, first_name DESC;

🔹 ASC = صعودی (پیش‌فرض)
🔹 DESC = نزولی


۸. LIMIT / OFFSET – محدود کردن نتایج

برای مثال، فقط ۵ ردیف اول را ببینیم:

SELECT * 
FROM customers
LIMIT 5;

و برای پرش از چند ردیف اول:

SELECT * 
FROM customers
LIMIT 5 OFFSET 10;

⚙️ ترتیب اجرای بخش‌های SELECT

یکی از مهم‌ترین مفاهیم در DQL ترتیب واقعی اجرای بخش‌های مختلف است.
SQL از بالا به پایین نوشته می‌شود، ولی از نظر اجرا به شکل زیر عمل می‌کند:

مرحله – ترتیب اجرابخشتوضیح
۱FROMانتخاب منبع داده
۲WHEREفیلتر کردن ردیف‌ها
۳GROUP BYگروه‌بندی ردیف‌ها
۴HAVINGفیلتر کردن گروه‌ها
۵SELECTانتخاب ستون‌ها و محاسبه توابع
۶DISTINCTحذف تکراری‌ها
۷ORDER BYمرتب‌سازی
۸LIMIT / OFFSETمحدودسازی نتایج

📘 یعنی اگر در SELECT به ستونی اشاره کنید که هنوز در GROUP BY وجود ندارد، خطا می‌گیرید.


🧠 نمونه تمرینی (روی دیتابیس Northwind)

SELECT 
    country,
    COUNT(*) AS customer_count,
    AVG(orders_total) AS avg_order
FROM customers
WHERE country IN ('USA', 'Germany', 'UK')
GROUP BY country
HAVING COUNT(*) > 5
ORDER BY avg_order DESC
LIMIT 3;

✅ نتیجه: بین سه کشور آلمان، آمریکا و انگلیس، تعداد مشتریان آن کشور با میانگین سفارشات هر مشتری را بر میگرداند به ترتیب میانگین سفارش (از بزرگ به کوچک)


🗃️ معرفی دیتابیس Northwind

Northwind یک دیتابیس نمونه است که شبیه‌سازی یک شرکت بازرگانی صادرات/واردات مواد غذایی را انجام می‌دهد و در آن اطلاعاتی درباره مشتریان، سفارش‌ها، محصولات، تأمین‌کنندگان و کارمندان ذخیره شده است.

در این جلسه، برای آشنایی با DQL از دیتابیس Northwind استفاده میکنیم و بهتر است ابتدا یک نگاه کلی به آن بیندازیم.


📋 جداول مهم Northwind

جدولتوضیح کلیفیلدهای مهمتوضیح فیلدها
customersاطلاعات مشتریان شرکتcustomer_id, company_name, contact_name, country, cityشامل اطلاعات تماس و موقعیت جغرافیایی مشتریان
ordersسفارش‌هایی که مشتریان ثبت کرده‌اندorder_id, customer_id, employee_id, order_date, ship_country, freightهر ردیف یک سفارش است؛ با شناسه مشتری و کارمند مرتبط می‌شود. منظور از freight در این جدول، هزینه ارسال است.
order_detailsجزئیات اقلام هر سفارشorder_id, product_id, unit_price, quantity, discountاقلامی که در هر سفارش وجود دارند؛ معمولاً برای محاسبه جمع سفارش استفاده می‌شود
productsاطلاعات کالاها و محصولات فروخته‌شدهproduct_id, product_name, supplier_id, category_id, unit_price, units_in_stockاطلاعات محصولات و قیمت‌ها
suppliersاطلاعات تأمین‌کنندگان کالاsupplier_id, company_name, contact_name, countryاز چه شرکت‌هایی محصولات خریداری می‌شود
categoriesدسته‌بندی محصولاتcategory_id, category_name, descriptionهر محصول به یک دسته مربوط است (مثل نوشیدنی، لبنیات و…)
employeesاطلاعات کارمندان شرکتemployee_id, first_name, last_name, title, reports_to, hire_dateکارمندانی که سفارش‌ها را مدیریت می‌کنند
shippersاطلاعات شرکت‌های حمل‌ونقلshipper_id, company_name, phoneشرکت‌هایی که وظیفه ارسال کالا را دارند
regionsمناطق جغرافیاییregion_id, region_descriptionبرای دسته‌بندی نواحی مکانی مورد استفاده است
territoriesنواحی فروشterritory_id, territory_description, region_idنواحی خاصی که به هر منطقه مرتبط هستند
employee_territoriesرابطه بین کارمندان و نواحی فروشemployee_id, territory_idهر کارمند ممکن است چند ناحیه فروش داشته باشد

🔍 روابط بین جداول

رابطهنوع ارتباطتوضیح
customersordersیک به چندهر مشتری چند سفارش دارد
ordersorder_detailsیک به چندهر سفارش شامل چند محصول است
productsorder_detailsیک به چندهر محصول ممکن است در چند سفارش باشد
suppliersproductsیک به چندهر تأمین‌کننده چند محصول ارائه می‌دهد
categoriesproductsیک به چندهر دسته شامل چند محصول است
employeesordersیک به چندهر سفارش توسط یک کارمند مدیریت می‌شود
shippersordersیک به چندهر سفارش با یک شرکت حمل‌ونقل ارسال می‌شود

📊 چند مثال کاربردی با این جداول

۱️⃣ نمایش لیست مشتریان آلمانی:

SELECT customer_id, company_name, city
FROM customers
WHERE country = 'Germany';

۲️⃣ نمایش تعداد سفارش‌های هر مشتری:

SELECT customer_id, COUNT(*) AS total_orders
FROM orders
GROUP BY customer_id
ORDER BY total_orders DESC;

۳️⃣ محاسبه مبلغ کل هر سفارش:

SELECT 
    o.order_id,
    SUM(od.unit_price * od.quantity * (1 - od.discount)) AS total_amount
FROM orders o
JOIN order_details od ON o.order_id = od.order_id
GROUP BY o.order_id;

۴️⃣ تعداد محصولات هر دسته:

SELECT c.category_name, COUNT(p.product_id) AS total_products
FROM categories c
JOIN products p ON c.category_id = p.category_id
GROUP BY c.category_name;

  • Northwind یک دیتابیس آموزشی کلاسیک است که تقریباً همه‌ی مفاهیم SQL (از ساده تا پیچیده) را پوشش می‌دهد.
  • در آموزش DQL، بیشترین کار ما با جداول customers, orders, order_details, products, و categories خواهد بود.

💡 نکته آموزشی

  • همیشه از AS برای نام‌گذاری ستون‌های خروجی که نتیجه اعمال یک تابع یا یک عبارت محاسباتی هستند، استفاده کنید.
  • اگر نیاز به استفاده از مقدار محاسبه‌شده در ORDER BY دارید، می‌توانید از نام مستعار (alias) که در قسمت ابتدایی دستور Select اختصاص داده‌اید، استفاده کنید.
فروشگاه
جستجو
دوره ها

لطفا کلمات کلیدی را وارد کنید