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 ASCNOT 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 ASC2022 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