• 11 August 2020 00:19

Sait ORHAN

Öğretmek için Öğrenin- Öğrenmek için Öğretin

SQL 'IN' ve 'NOT IN' Operatörleri

Dec 14, 2019

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.

Örnek Senaryo Tabloları

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'

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.