1Z0-071 sınavı soruları çoğunlukla “bu ifade ne döndürür?” ya da “hangisi hata verir?” biçimindedir. Bu yüzden konuyu okumak yetmez; ifadeleri çalıştırıp sonucu görmek gerekir. Bu laboratuvardaki tüm kutular ve alıştırmalar Oracle yazımıyla çalışır.
1. NULL fonksiyonları ve tip uyumu
NVL'nin iki bağımsız değişkeni aynı tipte olmalıdır. Sayı sütununa metin yedeği vermek için önce TO_CHAR ile çevir.
SELECT first_name,
NVL(TO_CHAR(dept_id), 'Atanmadı') AS departman,
NVL2(manager_id, 'Yöneticisi var', 'En üst') AS konum,
NULLIF(title, 'Genel Müdür') AS unvan
FROM employees
WHERE ROWNUM <= 5;
| Fonksiyon | Ne yapar? | Tuzak |
|---|---|---|
| NVL(a, b) | a NULL ise b | a ve b aynı tipte olmalı |
| NVL2(a, b, c) | a dolu ise b, NULL ise c | Sıra: dolu önce gelir |
| NULLIF(a, b) | a = b ise NULL, değilse a | İlk değişken NULL sabiti olamaz |
| COALESCE(a, b, …) | İlk NULL olmayan | Tüm değerler uyumlu tipte olmalı |
| DECODE(x, a, r1, …, varsayılan) | Eşitliğe göre seçim | DECODE, NULL = NULL eşleşmesini doğru sayar |
2. ROWNUM ve FETCH
ROWNUM, satıra ORDER BY'dan önce verilir. “En yüksek 3 maaş” için önce alt sorguda sırala, dışta ROWNUM uygula. 12c ve sonrasında FETCH FIRST daha açıktır.
-- Yanlış: rastgele 3 satırı alır, sonra sıralar SELECT first_name, salary FROM employees WHERE ROWNUM <= 3 ORDER BY salary DESC;
-- Doğru (klasik) SELECT * FROM (SELECT first_name, salary FROM employees ORDER BY salary DESC) WHERE ROWNUM <= 3;
-- Doğru (12c+): 4.–6. sıradakiler SELECT name, price FROM products ORDER BY price DESC, product_id OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY;
WHERE ROWNUM = 2 hiçbir satır döndürmez: ilk satır 1 numarayı alamadığı için elenir, sonraki satır yine 1 olur ve o da elenir.3. Dönüşüm ve tarih fonksiyonları
SELECT TO_CHAR(DATE '2024-03-05', 'YYYY-MM') AS ay,
ADD_MONTHS(DATE '2024-01-31', 1) AS bir_ay_sonra,
LAST_DAY(DATE '2024-02-10') AS ay_sonu,
MONTHS_BETWEEN(DATE '2024-03-31', DATE '2024-01-31') AS ay_farki,
TRUNC(DATE '2024-05-17', 'MM') AS ay_basi
FROM dual;
4. Küme işlemleri, ANY ve ALL
SELECT customer_id FROM customers MINUS SELECT customer_id FROM orders;
> ALL (alt sorgu) en büyükten büyük, > ANY en küçükten büyük demektir. Alt sorgu boşsa ALL her satır için doğru, ANY her satır için yanlıştır.
SELECT first_name, salary FROM employees WHERE salary > ALL (SELECT salary FROM employees WHERE dept_id = 2) AND (dept_id <> 2 OR dept_id IS NULL);
5. LISTAGG ve hiyerarşi
SELECT dept_id, LISTAGG(first_name, ', ') WITHIN GROUP (ORDER BY first_name) AS calisanlar FROM employees WHERE dept_id IS NOT NULL GROUP BY dept_id ORDER BY dept_id;