
اگر با Oracle Database کار میکنید، تسلط بر SQL یکی از مهمترین مهارتهایی است که باید داشته باشید. چه یک توسعهدهنده باشید، چه تحلیلگر داده یا DBA، دانستن دستورات اصلی SQL به شما کمک میکند سریعتر دادهها را بازیابی، تحلیل و مدیریت کنید.
در این مقاله کاربردی آموزش Cheat Sheet اوراکلی، یک Cheat Sheet کامل SQL در Oracle آماده کردهایم که از دستورات پایه مثل SELECT شروع میکند و تا مفاهیم مهمی مثل JOIN، Subquery، توابع، Group By و توابع تحلیلی پیش میرود.
همچنین برای هر بخش مثالهای واقعی آورده شده تا بتوانید راحتتر آنها را در پروژههای خود استفاده کنید.
در این مقاله شما می خوانید
آشنایی با ساختار کلی کوئری در Oracle
تقریباً تمام کوئریهای SQL در Oracle از یک ساختار مشخص پیروی میکنند. این ساختار کمک میکند دادهها را از جدولها استخراج و فیلتر کنیم.
نمونه ساختار استاندارد:
SELECT column_list
FROM table_name
WHERE condition
GROUP BY column_list
HAVING condition
ORDER BY column_list;
ترتیب اجرای منطقی در Oracle به شکل زیر است:
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
دانستن این ترتیب برای بهینهسازی کوئریهای Oracle SQL بسیار مهم است.
دستور SELECT اصلیترین دستور برای خواندن دادهها از جدولها در Oracle Database است.
انتخاب تمام ستونها:
SELECT *
FROM employees;
انتخاب چند ستون خاص:
SELECT employee_id, first_name, salary
FROM employees;
استفاده از نام مستعار برای ستونها (Alias):
SELECT first_name AS employee_name,
salary AS monthly_salary
FROM employees;
Alias باعث میشود خروجی کوئری خواناتر شود، مخصوصاً در گزارشها و داشبوردها.
برای محدود کردن نتایج از شرط WHERE استفاده میکنیم. این بخش یکی از پرکاربردترین قسمتهای SQL در Oracle است.
مثال ساده:
SELECT *
FROM employees
WHERE salary > ۵۰۰۰;
استفاده از AND و OR:
SELECT *
FROM employees
WHERE salary > ۵۰۰۰
AND department_id = 10;
استفاده از BETWEEN:
SELECT *
FROM employees
WHERE salary BETWEEN 3000 AND 6000;
استفاده از IN:
SELECT *
FROM employees
WHERE department_id IN (10,20,30);
جستجوی الگو با LIKE:
SELECT *
FROM employees
WHERE first_name LIKE 'A%';
در اینجا % یعنی هر تعداد کاراکتر بعد از حرف A.
کار با مقادیر NULL در Oracle
در Oracle مقدار NULL به معنی نبود مقدار است و با = مقایسه نمیشود.
روش صحیح بررسی NULL:
SELECT *
FROM employees
WHERE commission_pct IS NULL;
استفاده از تابع NVL:
SELECT first_name,
NVL(commission_pct,0) AS commission
FROM employees;
اگر مقدار commission خالی باشد، مقدار صفر نمایش داده میشود.
تابع COALESCE نیز کاربرد مشابهی دارد:
SELECT COALESCE(commission_pct, bonus, 0)
FROM employees;
برای مرتب کردن دادهها در Oracle SQL از ORDER BY استفاده میکنیم.
SELECT first_name, salary
FROM employees
ORDER BY salary DESC;
مرتبسازی چند ستونه:
SELECT COALESCE(commission_pct, bonus, 0)
FROM employees;
Oracle مجموعه بزرگی از توابع دارد که در تحلیل داده بسیار کاربردی هستند.
توابع رشتهای:
SELECT UPPER(first_name),
LOWER(last_name),
LENGTH(first_name),
SUBSTR(first_name,1,3)
FROM employees;
توابع عددی:
SELECT ROUND(salary,2),
TRUNC(salary,2),
MOD(salary,1000)
FROM employees;
توابع تاریخ:
SELECT SYSDATE FROM dual;
افزودن ماه به تاریخ:
SELECT ADD_MONTHS(SYSDATE,3)
FROM dual;
محاسبه فاصله زمانی:
SELECT MONTHS_BETWEEN(SYSDATE, hire_date)
FROM employees;
در بسیاری از سناریوها لازم است دادهها را خلاصه یا تجمیع کنیم. این کار با Aggregate Functions انجام میشود.
توابع مهم:
- COUNT
- SUM
- AVG
- MIN
- MAX
مثال:
SELECT department_id,
COUNT(*) AS total_employees,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
وقتی دادهها گروهبندی میشوند، برای فیلتر کردن نتایج از HAVING استفاده میکنیم.
SELECT department_id,
AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > ۵۰۰۰;
JOIN یکی از مهمترین مفاهیم در آموزش SQL در Oracle است زیرا معمولاً دادهها در چند جدول مختلف ذخیره میشوند.
فرض کنید دو جدول داریم:
employees
departments
INNER JOIN
SELECT e.first_name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id;
فقط رکوردهایی که در هر دو جدول وجود دارند نمایش داده میشوند.
LEFT JOIN
SELECT e.first_name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id;
تمام کارمندان نمایش داده میشوند حتی اگر دپارتمان نداشته باشند.
RIGHT JOIN
SELECT e.first_name, d.department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.department_id;
تمام دپارتمانها نمایش داده میشوند حتی اگر کارمندی نداشته باشند.
FULL OUTER JOIN
SELECT e.first_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON e.department_id = d.department_id;
کیبی از LEFT و RIGHT JOIN است.
Self Join
گاهی لازم است یک جدول را با خودش JOIN کنیم.
SELECT e.first_name AS employee,
m.first_name AS manager
FROM employees e
LEFT JOIN employees m
ON e.manager_id = m.employee_id;
در این مثال مدیر هر کارمند مشخص میشود.
سابکوئریها کوئریهایی هستند که داخل کوئری دیگر نوشته میشوند.
مثال:
SELECT *
FROM employees
WHERE salary >
(SELECT AVG(salary) FROM employees);
در اینجا کارمندانی که حقوقشان بیشتر از میانگین است نمایش داده میشوند.
SELECT *
FROM departments d
WHERE EXISTS (
SELECT 1
FROM employees e
WHERE e.department_id = d.department_id
);
در دیتاستهای بزرگ، EXISTS معمولاً سریعتر از IN عمل میکند.
برای پیادهسازی شرطهای منطقی در خروجی از CASE استفاده میشود.
SELECT first_name,
salary,
CASE
WHEN salary < 3000 THEN 'Low'
WHEN salary BETWEEN 3000 AND 7000 THEN 'Medium'
ELSE 'High'
END AS salary_level
FROM employees;
این توابع برای تحلیل پیشرفته دادهها بسیار کاربردی هستند.
ROW_NUMBER
SELECT first_name,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
FROM employees;
RANK
SELECT first_name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees;
Partition By
SELECT department_id,
first_name,
salary,
ROW_NUMBER() OVER (
PARTITION BY department_id
ORDER BY salary DESC
) AS dept_rank
FROM employees;
اگر با دیتابیسهای بزرگ کار میکنید، رعایت نکات Performance بسیار مهم است.
از ایندکس روی ستونهای زیر استفاده کنید:
- ستونهای WHERE
- ستونهای JOIN
- ستونهای ORDER BY
از تبدیل نوع داده در شرطها پرهیز کنید:
WHERE TO_CHAR(hire_date) = '2024'
روش بهتر:
WHERE hire_date BETWEEN
DATE '2024-01-01'
AND DATE '2024-12-31'
بررسی اجرای کوئری:
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE salary > ۵۰۰۰;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
سوالات متداول درباره راهنمای SQL در Oracle از SELECT تا JOIN
مهمترین تفاوتها در توابع تاریخ، نحوه محدود کردن تعداد سطرها و مدیریت مقادیر خالی است.
برای مثال، اوراکل از عبارت FETCH FIRST n ROWS ONLY برای محدود کردن نتایج استفاده میکند، در حالی که در MySQL از LIMIT استفاده میشود.
همچنین در اوراکل، ستونهای نوع DATE شامل زمان (ساعت و دقیقه) هستند، اما در بسیاری از دیتابیسهای دیگر، تاریخ و زمان جداگانه تعریف میشوند.
برای بهینهسازی کوئری در اوراکل، همیشه از ایندکسگذاری (Indexing) روی ستونهایی که در WHERE یا JOIN استفاده میشوند، اطمینان حاصل کنید.
همچنین از توابع روی ستونها در بخش WHERE پرهیز کنید (مثلاً WHERE UPPER(name) = 'ALI' ایندکس را غیرفعال میکند).
برای بررسی دقیقتر، از دستور EXPLAIN PLAN استفاده کنید تا بفهمید دیتابیس چگونه کوئری شما را اجرا میکند.
در پایگاه داده اوراکل، NULL به معنای “مقدار نامشخص” است، نه صفر یا فضای خالی.
به همین دلیل عملگرهای مقایسهای مثل = یا != روی NULL نتیجهای برنمیگردانند.
برای فیلتر کردن مقادیر خالی باید حتماً از عبارتهای IS NULL یا IS NOT NULL استفاده کنید.
توابع تحلیلی مانند RANK، ROW_NUMBER و PARTITION BY به شما اجازه میدهند بدون نیاز به پیچیده کردن کوئری با Subqueryهای تودرتو، محاسبات آماری و رتبهبندی انجام دهید.
این توابع در گزارشگیریهای مالی و تحلیل داده بسیار قدرتمند هستند؛ مثلاً میتوانید به راحتی “۳ کارمند اول هر دپارتمان بر اساس حقوق” را تنها با یک کوئری ساده استخراج کنید.
جمعبندی
اگر بخواهیم یک Cheat Sheet سریع برای Oracle SQL داشته باشیم، مهمترین مفاهیم عبارتند از:
- SELECT برای خواندن داده
- WHERE برای فیلتر
- GROUP BY و HAVING برای تحلیل داده
- JOIN برای اتصال جدولها
- Subquery برای کوئریهای پیچیده
- توابع تحلیلی برای تحلیل پیشرفته
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید