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 
EmployeeId = 2 OR
EmployeeId = 5 OR
EmployeeId = 8
;  

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