SQL’de giriş ve orta seviye algoritmalar

Enes Eren
3 min readJul 14, 2023

Bu yazıda HackerRank üzerinden giriş seviye SQL algoritmalarını çözeceğiz. Algoritmaları istediğimiz şekilde (belirli kuralları takip ederek) çözebiliriz, yani herkes birbirinden farklı yollardan giderek ama eninde sonunda aynı sonuca çıkacak şekilde algoritmaları yazabilir. Ben kendi çözümlerimi burada açıklayarak anlatacağım.

SELECT NAME
FROM CITY
WHERE COUNTRYCODE = 'JPN';

Burada CITY tablosundan COUNTRYCODE alanı “JPN” ile eşleşen NAME alanlarını seçiyoruz. WHERE anahtar kelimesinde eşittir işaretini kullandık.

SELECT *
FROM CITY
WHERE POPULATION > 100000 AND COUNTRYCODE = 'USA';

Burada CITY isimli tablodan nüfusun 100.000'den fazla olduğu ve ülke kodunun “USA” olduğu bütün alanları seçtik. WHERE anahtar kelimesi bize tabloda filtreleme işlemi yapmamıza olanak sağlar. Burada iki adet filtreleme ifadesi söz konusudur: nüfusun 100.000'den büyük olduğu ve ülke kodunun “USA”e eşit olduğu. AND anahtar kelimesi ise bize bu iki filtreleme ifadesinin de sağlandığı satırları seçmemize olanak sağlar. SELECT anahtar kelimesinde kullanılan yıldız işareti ise aşağısında sağladığımız koşulları yerine getiren bütün satırların alanlarını yani sütunlarını getirmemizi sağlamaktadır.

SELECT DISTINCT(CITY)
FROM STATION
WHERE MOD(ID, 2) = 0;

Burada ise STATION tablosundan CITY alanının özel değerlerini (eğer diğer satırlarda da aynı değerden var ise sadece 1 kez görmek için), ID alanının çift sayı olduğu satırları seçtik. DISTINCT anahtar kelimesi özel değerleri seçmek için kullanılır, aynı değerden birden fazla kez var ise sadec bir kez gösterir. MOD ise ID alanımızın değerleri sayı olduğundan ve çift sayıları almak istediğimizden 2'ye tam bölümü sıfır olan; yani çift olan sayıları seçmek için kullandığımız bir fonksiyondur.

SELECT COUNT(CITY) - COUNT(DISTINCT(CITY))
FROM STATION;

Burada ise STATION tablosundaki CITY alanlarının farkını aldık. COUNT fonksiyonu bize CITY alanının satır sayısını verir. DISTINCT ise kopya değerler yerine özel değeri verir. Böylece kopya sayısını özel sayıdan çıkardık.

WITH shortest AS (
SELECT CITY, LENGTH(CITY) as city_length
FROM STATION
WHERE LENGTH(CITY) = (
SELECT MIN(LENGTH(CITY))
FROM STATION
)
ORDER BY CITY ASC
LIMIT 1
), longest AS (
SELECT CITY, LENGTH(CITY) as city_length
FROM STATION
WHERE LENGTH(CITY) = (
SELECT MAX(LENGTH(CITY))
FROM STATION
)
ORDER BY CITY ASC
LIMIT 1
)
SELECT CITY, city_length
FROM shortest
UNION ALL
SELECT CITY, city_length
FROM longest;

Burada amacımız STATION tablosundaki en kısa ve en uzun isme sahip CITY alanlarını CITY, LENGTH(CITY) şeklinde almaktır. Bunun için CTE kullandık. CTE ile birlikte geçici tablolar oluşturabiliyoruz. WITH anahtar kelimesiyle birlikte iki adet geçici tablo oluşturduk. İlk tabloda en kısa CITY değerini bulduk ve alfabetik olarak sıralayıp en üsttekini aldık. Diğer tabloda ise en uzun CITY değerini bulup yine alfabetik olarak sıralayıp en üsttekini aldık böylece son olarak her iki tabloyu da birleştirip en kısa ve en uzun CITY değerine sahip satırları bulmuş olduk.

SELECT DISTINCT CITY
FROM STATION
WHERE CITY LIKE 'A%' OR CITY LIKE 'E%' OR CITY LIKE 'I%' OR
CITY LIKE 'O%' OR CITY LIKE 'U%';

Burada ise STATION tablosunda özel CITY değerlerinin a,e,i,o ve u ile başlayanlarını seçtik.

--

--