Kurs
Bir tabloda belirli bir koşula veya koşul kümesine göre satırları filtrelemek, veri analizinde oldukça yaygın bir pratiktir. SQL'de bunu where koşulunu kullanarak yapabilirsiniz. Bu eğitimde, onu çeşitli senaryolarda kullanacaksınız.
RDBMS (İlişkisel Veritabanı Yönetim Sistemi) olarak PostgreSQL kullanacaksınız, ancak diğer veritabanı sistemlerinde de sözdizimleri çok farklılık göstermez. Önce bir PostgreSQL veritabanı kuracak ve ülke verilerini içeren bir tabloyu elle oluşturacaksınız. Bu kurulumun ardından, WHERE koşulunu içeren çeşitli filtre sorguları çalıştıracaksınız.
Not: Eğitimi takip edebilmek için SQL ve PostgreSQL'in temellerine aşina olmanız gerekir. Aşina değilseniz aşağıdaki kaynaklar yardımcı olabilir.
PostgreSQL'de Tablo Oluşturma
Bu eğitimi takip etmek için, dünya genelindeki ülkeler hakkında bilgi içeren bir PostgreSQL tablosu oluşturmanız gerekir. Bu tablo, WHERE koşulunun farklı senaryolarda nasıl çalıştığını göstermek için kullanılacaktır.
Adım 1: Yeni bir veritabanı oluşturun
pgAdmin'i (veya tercih ettiğiniz SQL arayüzünü) açın ve yeni bir PostgreSQL veritabanı oluşturun. Adını world_data veya tercih ettiğiniz başka bir şey koyabilirsiniz.
Adım 2: Tablomuzu oluşturun ve verilerle doldurun
Veritabanınız hazır olduğunda, yeni bir SQL sorgu düzenleyicisi penceresi açın ve aşağıdaki SQL kodunu çalıştırın. Bu kod, countries adlı bir tablo oluşturacak ve çok çeşitli kıtalar, bağımsızlık yılları ve bölgeleri kapsayan bir kayıt kümesi ekleyecektir:
-- Create the countries tableCREATE TABLE countries ( code VARCHAR(3) PRIMARY KEY, name VARCHAR(100), continent VARCHAR(50), region VARCHAR(100), surface_area NUMERIC, indep_year INTEGER, local_name VARCHAR(100), gov_form VARCHAR(100), capital VARCHAR(100), cap_long NUMERIC, cap_lat NUMERIC);-- Insert sample data into the countries tableINSERT INTO countries (code, name, continent, region, surface_area, indep_year, local_name, gov_form, capital, cap_long, cap_lat)VALUES('IND', 'India', 'Asia', 'Southern Asia', 3287263, 1947, 'Bharat', 'Federal Republic', 'New Delhi', 77.2090, 28.6139),('PAK', 'Pakistan', 'Asia', 'Southern Asia', 881912, 1947, 'Pakistan', 'Federal Republic', 'Islamabad', 73.0551, 33.6844),('CHN', 'China', 'Asia', 'Eastern Asia', 9596961, NULL, 'Zhongguo', 'People''s Republic', 'Beijing', 116.4074, 39.9042),('VNM', 'Vietnam', 'Asia', 'South-Eastern Asia', 331212, 1945, 'Việt Nam', 'Socialist Republic', 'Hanoi', 105.8544, 21.0285),('JPN', 'Japan', 'Asia', 'Eastern Asia', 377975, NULL, 'Nippon', 'Constitutional Monarchy', 'Tokyo', 139.6917, 35.6895),('DEU', 'Germany', 'Europe', 'Western Europe', 357386, 1955, 'Deutschland', 'Federal Republic', 'Berlin', 13.4050, 52.5200),('FRA', 'France', 'Europe', 'Western Europe', 551695, 843, 'France', 'Republic', 'Paris', 2.3522, 48.8566),('RUS', 'Russia', 'Europe', 'Eastern Europe', 17098242, 1991, 'Rossiya', 'Federation', 'Moscow', 37.6173, 55.7558),('UKR', 'Ukraine', 'Europe', 'Eastern Europe', 603500, 1991, 'Ukrayina', 'Republic', 'Kyiv', 30.5234, 50.4501),('EGY', 'Egypt', 'Africa', 'Northern Africa', 1002450, 1922, 'Misr', 'Republic', 'Cairo', 31.2357, 30.0444),('NGA', 'Nigeria', 'Africa', 'Western Africa', 923768, 1960, 'Nigeria', 'Federal Republic', 'Abuja', 7.4951, 9.0578),('AUS', 'Australia', 'Oceania', 'Australia and New Zealand', 7682300, 1901, 'Australia', 'Federal Parliamentary Democracy', 'Canberra', 149.1245, -35.3075),('USA', 'United States', 'North America', 'North America', 9833517, 1776, 'United States', 'Federal Republic', 'Washington, D.C.', -77.0369, 38.9072),('CAN', 'Canada', 'North America', 'North America', 9984670, 1867, 'Canada', 'Constitutional Monarchy', 'Ottawa', -75.6972, 45.4215),('BRA', 'Brazil', 'South America', 'South America', 8515767, 1822, 'Brasil', 'Federal Republic', 'Brasília', -47.9292, -15.7801),('ARG', 'Argentina', 'South America', 'South America', 2780400, 1816, 'Argentina', 'Federal Republic', 'Buenos Aires', -58.3816, -34.6037);Tabloda dünya genelinde toplamda yaklaşık 16 ülkeye ait farklı bilgiler bulunuyor. Tabloda şu sütunlar yer alıyor:
codetablonun birincil anahtarıdır ve belirli bir ülkenin evrensel ülke kodunu belirtirnameyani bir ülkenin adıcontinentülkenin ait olduğu kıtaregionbir ülkenin bulunduğu coğrafi konumsurface_areaülkenin yüzölçümüindep_yearyani bir ülkenin bağımsızlığını kazandığı yıllocal_namebir ülkenin yerel adıgov_formyani ülkede yürürlükte olan yönetim biçimicapitalülkenin başkenticap_longyani başkentin boylamıcap_latyani başkentin enlemi
Şimdi WHERE koşuluyla bazı kayıtları filtrelemeye başlayalım.
SQL WHERE Koşulunu Kullanma
SQL'de WHERE koşulu, kayıtları hem metinsel hem de sayısal değerlere göre filtrelemenizi sağlar. Bu değerleri karşılaştırabilirsiniz ve aşağıdaki karşılaştırma tabanlı işlemler desteklenir -
=eşit<>ve!=eşit değil<küçüktür>büyüktür<=küçük veya eşittir>=büyük veya eşittir
SQL standartlarına göre != yerine <> kullanılması tavsiye edilir.
Şimdi code değeri AUS olan ülkenin kaydını alalım. Burada karşılaştırmanız gereken sütun code sütunu ve karşılaştırılacak değer AUS. Sorgu şöyle olur:
SELECT * FROM countries WHERE code = 'AUS';Ve elde edeceğiniz sonuç:

Burada birkaç şeye dikkat edin -
WHEREkoşulu her zamanFROM'dan sonra gelir.SQL'de metinler tek tırnak içinde yazılır.
Şimdi sayısal bir karşılaştırma görelim. Bağımsızlığını (indep_year) 1901 yılından sonra kazanmış ülkelerin kayıtlarını alalım:
SELECT * FROM countries WHERE indep_year > 1901;1901 yılından sonra bağımsızlığını kazanmış toplam 3 ülkenin kayıtlarını elde edersiniz. Burada kullanılan karşılaştırıcıya dikkat edin. indep_year sütununun türü tam sayıdır. Bu nedenle karşılaştırmada tırnak kullanılmaz.
Bir WHERE koşulunda birden fazla koşulu AND ve OR bağlaçlarıyla birleştirebilirsiniz. Aşağıdaki sorgu, where continent = 'Asia' and indep_year > 1900 olan ülkelerin kayıtlarını getirir -
SELECT * FROM countries WHERE continent = 'Asia' AND indep_year > 1901;
Asia kıtasında bulunan ve 1901 yılından sonra bağımsızlığını kazanmış toplam üç ülkeye ait bilgileri alırsınız. Yukarıdaki sorguda hem metinsel hem de sayısal değerleri karşılaştırdığınıza dikkat edin. Alıştırma olarak, WHERE koşulunda AND ve OR'un farklı kombinasyonlarını deneyebilirsiniz.
Not: AND ve OR'u birleştirirken, her bir koşulu parantez içine almayı unutmayın. Aksi halde SQL, koşulların değerlendirilme önceliğini belirlerken kafa karışıklığı yaşayacaktır.
Aşağıdaki sorguyla toplam altı ülke elde edersiniz.
SELECT * FROM countries WHERE(continent = 'Europe' AND indep_year > 1900)or(continent = 'Asia' AND indep_year > 1900);
Bir WHERE koşulunda ikiden fazla koşulu da bağlayabilirsiniz:
SELECT * FROM countries WHERE continent = 'Asia' OR indep_year > 1900 OR surface_area > 652090;
Burada, ya Asia'da bulunan ya da 1901 yılından sonra bağımsızlığını kazanmış ya da 652090'dan büyük bir yüzölçümüne sahip toplam 15 ülke elde edersiniz.
Şimdi sorguyu daha kısıtlayıcı olan bir AND varyantına dönüştürelim:
SELECT * FROM countries WHERE continent = 'Asia' AND indep_year > 1901 AND surface_area > 652090;
Bu durumda toplam iki ülke elde edersiniz.
WHERE koşulunda alt sorguları da eşleştirebilirsiniz. Diyelim ki yüzölçümü en yüksek olan ülkenin kaydını getirmek istiyorsunuz, ancak bir ülke tarafından elde edilen maksimum yüzölçümünün ne olduğunu bilmiyorsunuz. Aşağıdaki sorgu bu gibi durumlarda imdada yetişebilir:
SELECT * FROM countries WHERE surface_area in (SELECT MAX(surface_area) FROM countries);Russia kaydını almalısınız.

Sonuç
Tebrikler, bu eğitimi tamamladınız. Koşullara göre sorgu sonuçlarını filtrelemek kesinlikle hayati bir beceridir ve bu eğitim buna bir giriş niteliği taşıdı. SQL becerilerinizi daha da geliştirmek isterseniz, kurslarımıza göz atabilirsiniz (aşağıdaki bağlantı).

Sayak, kod yazdığı, yazılar yazdığı ve konuşmalar yaptığı Hugging Face'de çalışıyor. Zamanının çoğunu Diffusers kütüphanesiyle ilgili her şeye ayırıyor. Ayrıca DataCamp'te proje eğitmeni ve birçok DataCamp eğitiminin yazarıdır. İş dışında, onu Netflix'te Suits'i n'inci kez art arda izlerken yakalayabilirsiniz.
SQL WHERE Koşulu Hakkında SSS
WHERE koşulunda hem metin hem de sayısal sütunları kullanabilir miyim?
Evet, hem metin (ör. 'Asia') hem de sayısal (ör. > 1901) değerlere göre filtreleme yapabilirsiniz. Sadece metin değerlerinin tek tırnak içine alınması gerektiğini unutmayın.
SQL'de <> ile != arasında fark var mı?
İkisi de "eşit değil" anlamına gelir, ancak <> standart SQL işlemcisidir. Bazı veritabanları != ifadesini de destekler, ancak uyumluluk için <> kullanmak en iyisidir.
NULL değerleri olan kayıtları nasıl filtrelerim?
IS NULL veya IS NOT NULL kullanın. Örneğin:
SELECT * FROM countries WHERE indep_year IS NULL;WHERE koşulunda alt sorgu kullanabilir miyim?
Evet, alt sorgular bir sütunu başka bir sorgunun sonucuyla karşılaştırmak için kullanılabilir. Örneğin:
SELECT * FROM countries WHERE surface_area = (SELECT MAX(surface_area) FROM countries);WHERE koşulu FROM ifadesinden önce mi sonra mı gelir?
WHERE koşulu her zaman FROM ifadesinden sonra ve GROUP BY veya ORDER BY gibi ifadelerden önce gelir.
WHERE koşulunu JOIN'lerle birlikte kullanabilir miyim?
Kesinlikle. Birleştirme (JOIN) yaptıktan sonra birleştirilmiş sonuç kümesini filtrelemek için WHERE koşulunu uygulayabilirsiniz.
