SQL dilinde sorgulama yapılırken bir değeri belli değerler arasından herhangi birine eşit olabileceği istendiği durumda değerler OR şartı ile birbirine bağlanır. “WHERE Id = 4 OR Id = 10 OR Id = 37” gibi… Değerlerin az olduğu durumlarda bu şekilde yazılabilir ancak değerlerin sayısının arttığı veya bu değerlerin aşağıdaki örnekte olduğu gibi kodun yazıldığı zamanda belli olmaması durumunda bu şekilde OR şartı ile bağlama hem zahmetli hem performans olarak sorgu optimizasyonunu olumsuz etkilemektedir.
Kolon değerinin bir liste içerisinden herhangi bir değere eşit olması istenen durumda IN operatörü kullanılabilir. Listede herhangi bir değere eşit olması istenilmeyen durumda da NOT IN operatörü kullanılır.
Konumuzu en iyi şekilde basit bir örnek ile açıklayabiliriz.
Yukarıdaki tablo şemasında;
- Users tablosu, kullanıcı listesini
- Groups tablosu, gruplar tablosunu
- UserGroups tablosu, kullanıcıların üye oldukları grupları n – n ilişkisi içerisinde tutar.
Sorumuz şu: Hiç bir gruba üye olmayan kullanıcıların listesini veren SQL scriptini yazınız.
select Id, UserName, FullName from Users where Id NOT IN (select UserId from UserGroups)
Bu sorgu çalışırken öncelikle UserGroups tablosundan her hangi bir gruba üye olan kullanıcıların UserId değerlerini alır, daha sonra Users tablosundan Id değeri UserGroups tablosundan alınan UserId değerlerinin içerisinde olmayan kullanıcıları getirir.
select * from UserGroups where UserId IN (1,3,6,87,45,332)
Bu sorguda da UserId değeri “1,3,6,87,45,332” değerlerinden herhangi birine eşit olan kayıtlar gelecektir.
Şimdi de sorguyu biraz daha karmaşıklaştırarak “YÖNETİCİLER” grubuna üye olan kullanıcılardan başka gruba da üye olanların listesini ve üye oldukları grupların listesini çekeceğiz.
select u.Id UserId, g1.Id GroupId, u.FullName, g1.Name from UserGroups ug1 join Groups g1 on ug1.GroupId = g1.Id join Users u on ug1.UserId = u.Id where UserId IN ( select UserId from UserGroups ug join Groups g on ug.GroupId = g.Id where g.Name = 'YÖNETİCİLER' ) and g1.Name != 'YÖNETİCİLER'