SQL - Alt Sorgular
Bir Alt Sorgu veya İç sorgu veya İç içe sorgu, başka bir SQL sorgusu içindeki ve WHERE yan tümcesine gömülü bir sorgudur.
Bir alt sorgu, alınacak verileri daha da kısıtlamak için bir koşul olarak ana sorguda kullanılacak verileri döndürmek için kullanılır.
Alt sorgular SELECT, INSERT, UPDATE ve DELETE ifadeleriyle birlikte =, <,>,> =, <=, IN, BETWEEN, vb. Gibi işleçlerle kullanılabilir.
Alt sorguların uyması gereken birkaç kural vardır -
Alt sorgular parantez içine alınmalıdır.
Alt sorgunun seçili sütunlarını karşılaştırmak için ana sorguda birden çok sütun olmadığı sürece, bir alt sorgunun SELECT yan tümcesinde yalnızca bir sütun olabilir.
ORDER BY komutu bir alt sorguda kullanılamaz, ancak ana sorgu ORDER BY kullanabilir. GROUP BY komutu, bir alt sorguda ORDER BY ile aynı işlevi gerçekleştirmek için kullanılabilir.
Birden fazla satır döndüren alt sorgular yalnızca IN operatörü gibi birden çok değer operatörüyle kullanılabilir.
SEÇİM listesi, BLOB, ARRAY, CLOB veya NCLOB olarak değerlendirilen değerlere herhangi bir referans içeremez.
Bir alt sorgu, bir küme işlevinin içine hemen eklenemez.
BETWEEN operatörü bir alt sorgu ile kullanılamaz. Ancak BETWEEN operatörü alt sorgu içinde kullanılabilir.
SELECT İfadesine sahip alt sorgular
Alt sorgular en çok SELECT deyimiyle kullanılır. Temel sözdizimi aşağıdaki gibidir -
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
Misal
Aşağıdaki kayıtlara sahip MÜŞTERİLER tablosunu düşünün -
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
Şimdi aşağıdaki alt sorguyu bir SELECT ifadesiyle kontrol edelim.
SQL> SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS
WHERE SALARY > 4500) ;
Bu, aşağıdaki sonucu verecektir.
+----+----------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+----------+
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+---------+----------+
INSERT İfadesine sahip alt sorgular
Alt sorgular ayrıca INSERT deyimleriyle de kullanılabilir. INSERT deyimi, başka bir tabloya eklemek için alt sorgudan döndürülen verileri kullanır. Alt sorgudaki seçilen veriler, karakter, tarih veya sayı işlevlerinden herhangi biri ile değiştirilebilir.
Temel sözdizimi aşağıdaki gibidir.
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
Misal
CUSTOMERS tablosu ile benzer yapıya sahip bir CUSTOMERS_BKP tablosu düşünün. Şimdi, MÜŞTERİLER tablosunun tamamını CUSTOMERS_BKP tablosuna kopyalamak için aşağıdaki sözdizimini kullanabilirsiniz.
SQL> INSERT INTO CUSTOMERS_BKP
SELECT * FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS) ;
UPDATE İfadesine sahip alt sorgular
Alt sorgu, UPDATE ifadesiyle birlikte kullanılabilir. UPDATE deyimiyle bir alt sorgu kullanıldığında, bir tablodaki tek veya birden çok sütun güncellenebilir.
Temel sözdizimi aşağıdaki gibidir.
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Misal
Varsayalım ki, CUSTOMERS tablosunun yedeği olan CUSTOMERS_BKP tablosumuz var. Aşağıdaki örnek, YAŞI 27 veya daha büyük olan tüm müşteriler için MÜŞTERİLER tablosundaki MAAŞ'ı 0,25 kez günceller.
SQL> UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
WHERE AGE >= 27 );
Bu, iki satırı etkiler ve son olarak CUSTOMERS tablosu aşağıdaki kayıtlara sahip olur.
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 125.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 2125.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
DELETE İfadesine sahip alt sorgular
Alt sorgu, yukarıda belirtilen diğer tüm ifadelerde olduğu gibi DELETE ifadesi ile birlikte kullanılabilir.
Temel sözdizimi aşağıdaki gibidir.
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Misal
Varsayalım ki, CUSTOMERS tablosunun yedeği olan bir CUSTOMERS_BKP tablosumuz var. Aşağıdaki örnek, YAŞI 27'den büyük veya 27'ye eşit olan tüm müşteriler için MÜŞTERİLER tablosundaki kayıtları siler.
SQL> DELETE FROM CUSTOMERS
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
WHERE AGE >= 27 );
Bu, iki satırı etkiler ve son olarak CUSTOMERS tablosu aşağıdaki kayıtlara sahip olur.
+----+----------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+----------+
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+---------+----------+