42 SQL WHERE
Operatorler | Tanım |
---|---|
“= <> !=” | Eşitlik / Eşit Olmama |
IN | Verilen değer subquery veya listede varmı? |
BETWEEN | 2 değer arası, sınırlar dahil |
LIKE | Karekter betiği içinde belirtilen desen varmı (wildcard olabilir) |
AND | mantıksal VE |
OR | mantıksal VEYA |
NOT | mantıksal DEĞİL |
42.1 Örnekler
Chinook
select * from Employee where EmployeeId = 5;
select * from Employee where EmployeeId != 5;
select * from Employee where EmployeeId <> 5;
select * from Employee where EmployeeId < 5;
select * from Employee where EmployeeId <= 5;
select * from Employee where EmployeeId > 5;
select * from Employee where EmployeeId >= 5;
42.2 mantıksal operatörler
- AND
- OR
- NOT
p | q | p AND q |
---|---|---|
T | T | T |
T | F | F |
F | T | F |
F | F | F |
p | q | p OR q |
---|---|---|
T | T | T |
T | F | T |
F | T | T |
F | F | F |
42.3 IN operatörü
Verilen değerin bir liste içinde olup olmadığını kontrol ederiz. Örneğin aşağıdaki komut EmployeeId 2, 5 veya 8 olan çalışanları getirecektir.
SELECT * FROM Employee WHERE EmployeeId IN (2,5,8);
IN komutu aşağıdaki OR kullanımına eşittir ama daha kısa, okunur ve anlaşılır olduğu için tercih edilir.
SELECT * from Employee WHERE
= 2 OR
EmployeeId = 5 OR
EmployeeId = 8
EmployeeId ;
NOT kullanarak bu listede içinde olmayanlar getirilebilir.
SELECT * FROM Employee WHERE EmployeeId NOT IN (2,5,8);
SELECT * FROM Employee WHERE EmployeeId NOT IN (2,5,8);
Başka bir örnek
SELECT * FROM Track t
WHERE t.MediaTypeId IN (1,2)
IN operatörü birden fazla kolon kullanarakta çalışır. Bu kullanım her veri tabanında desteklenmez. Aşağıdaki sorgu SQLite ve Oracle veri tabanlarında çalışırken SQL Server’da çalışmamaktadır.
SELECT COUNT(*) FROM Track t
WHERE
(t.MediaTypeId , t.GenreId) IN (
1,1),
(1,2),
(2,2),
(2,2)
( )
Alt sorgu ve IN operatörü kullanarak bazen 2 tabloyu birleştirmek için inner join yerine kullanılabiliriz.
42.4 Between Arasında operatörü
select * from Employee
where EmployeeId Between 2 and 5;
Between operatörü aşağıdaki >= and <= kullanımına eşittir. Ama ingilizce daha anlaşılır bir kullanımı vardır.
select * from Employee
where EmployeeId >= 2 and EmployeeId <= 5;
Between operatörü sayı, tarih ve yazılar ile çalışır.
SELECT * FROM Invoice i
WHERE i.Total BETWEEN 14.91 and 18.86
ORDER BY i.Total ASC
NOT operatörü ile bu aralık dışındakileri getirebiliriz.
SELECT * FROM Invoice i
WHERE i.Total NOT BETWEEN 14.91 and 18.86
ORDER BY i.Total ASC
2022 yılındakileri getir.
SELECT *
FROM Invoice
WHERE InvoiceDate BETWEEN '2022-01-01' AND '2022-12-31'
ORDER BY InvoiceDate;
42.5 LIKE operatörü
Arama yaparken joker karakterleri kullanırız. yüzde % ve alt çizgi **_** karakterleri tüm veritabanları tarafından desteklenirken diğer joker karakterler daha az desteklenmektedir.
Symbol | Description | Oracle | Sql Server | sqlite |
---|---|---|---|---|
% | zero or more characters | ✓ | ✓ | ✓ |
_ | a single character | ✓ | ✓ | ✓ |
[] | any single character within the brackets | ❌ | ✓ | ❌ |
^ | any character not in the brackets | ❌ | ✓ | ❌ |
- | any single character within the specified range | ❌ | ✓ | ❌ |
Örnekler Chinook
İsmi L ile başlayan müşteriler
SELECT * from Customer c WHERE C.FirstName LIKE 'L%';
isminde a karakteri olan müşteriler
SELECT * from Customer c WHERE C.FirstName LIKE '%a%';
Aşağıdaki büyük A harfi ile çalıştırılan sorgu aynı sonucu getirir.
SELECT * from Customer c WHERE C.FirstName LIKE '%A%';
Dikkat edilmesi gereken şey, SQLite varsayılan olarak yalnızca ASCII karakterleri için büyük/küçük harfleri anlar. Ö harfi ASCII olmadığı için aşağıdaki sorguda 0, false dönülmektedir.
SELECT 'a' LIKE 'A','ö' LIKE 'Ö'
Aşağıdaki sorgu Lu ile başlayan arkasından herhangi bir harf olan ve s ile biten adları getirir.
SELECT * from Customer c WHERE C.FirstName LIKE 'Lu_s'
Aşağıdaki 2 sorgunun farkına bakınız.
SELECT * from Customer c
WHERE C.FirstName LIKE 'Fr'
SELECT * from Customer c
WHERE C.FirstName LIKE 'Fr%'
Aşağıdaki 2 sorgunun farkına bakınız.
SELECT * from Customer c
WHERE C.FirstName LIKE 'Fran_'
SELECT * from Customer c
WHERE C.FirstName LIKE 'Fran%'
%deger% kullanımı arama sayfalarında çok kullanılır. Ama bu kullanım indeks kullanamadığı için daha yavaştır. Çok fazla kayıdın olduğu tablolarda, %deger% yerine deger% tercih edilmelidir.
SQL Server’da çalışır
SELECT * from Customer c WHERE C.Address LIKE '%[12]%'
-- ikinci karakter bir a
SELECT * from Customer c WHERE C.FirstName LIKE '_[a]%'
-- ikinci karakter bir a DEĞİL
--SELECT * from Customer c WHERE C.FirstName LIKE '_[^a]%'
42.6 Koşulların zincirlenmesi
3’ten fazla koşulu zincirlemeniz gerektiğinde parantez kullanın.
Matematikte olduğu gibi, parantezler işlemlerin sırasını değiştirir.
(2+3)*5
2+3*5