Veritabanları ve SQL konusunu sıfırdan öğrenin
1İlişkisel veritabanı nedir
Bir ilişkisel veritabanı veriyi tablolarda saklar. Bir tablo elektronik tabloya benzer: her satır bir kayıt, her sütun bir özelliktir.
Bir mağazanın id, name ve city sütunlarıyla bir customers tablosu ve id, customer_id ve total sütunlarıyla bir orders tablosu olabilir.
Birincil anahtar, her satırı benzersiz biçimde tanımlayan bir sütun ya da sütun kümesidir. Hiçbir zaman tekrarlanamaz ve boş olamaz. Burada bu, her tablonun id’sidir.
Yabancı anahtar, başka bir tablonun birincil anahtarına başvuran bir sütundur. orders içinde customer_id, siparişi hangi müşterinin verdiğini söyler.
Tablolar böyle bağlanır: bir müşterinin çok siparişi olabilir ama her sipariş tek bir müşteriye aittir. Bu bir bire-çok ilişkidir.
SQL (Yapılandırılmış Sorgu Dili), tablo oluşturmak, veriyi değiştirmek ve hakkında sorular sormak için kullandığınız dildir.
Kendini sına Birincil anahtar nedir?
- Aramaları hızlandıran bir indeks
- Başka bir tablodaki bir satıra başvuran sütun
- Her satırı benzersiz biçimde tanımlayan bir sütun ya da sütun kümesi
- Her tablonun ilk sütunu
Cevap: Her satırı benzersiz biçimde tanımlayan bir sütun ya da sütun kümesi. Birincil anahtar benzersizdir ve hiçbir zaman NULL olmaz, bu yüzden tam olarak bir satırı seçer. Başka bir tabloya başvuran sütun yabancı anahtardır.
2SELECT ile veri okumak
Soruların çoğu SELECT deyimiyle ilgilidir. Her zaman bu sırayla yazılan yan tümcelerden oluşur:
SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
- SELECT istediğiniz sütunları listeler. DISTINCT yinelenen satırları kaldırır.
- FROM tabloyu ya da birleştirilen tabloları adlandırır.
- WHERE yalnızca bir koşulu sağlayan satırları tutar, örneğin WHERE total > 20.
- GROUP BY aynı değere sahip satırları bir gruba koyar, böylece grup başına sayabilir ya da toplayabilirsiniz.
- HAVING yalnızca bir koşulu sağlayan grupları tutar. WHERE’in kullanamadığı toplama işlevlerini kullanabilir.
- ORDER BY sonucu sıralar, varsayılan olarak artan; en yüksek önce için DESC ekleyin.
Toplama işlevleri birçok satırı tek bir değere özetler: COUNT, SUM, AVG, MIN ve MAX.
Veritabanı yan tümceleri yazdığınız sırayla çalıştırmaz. Önce FROM, sonra WHERE, GROUP BY, HAVING, SELECT ve en sonda ORDER BY çalıştırır.
Diğer deyimler veriyi değiştirir: INSERT satır ekler, UPDATE satırları değiştirir ve DELETE satırları siler. CREATE, ALTER ve DROP tabloların kendisini değiştirir.
Kendini sına Yalnızca 5’ten fazla siparişi olan müşterileri istiyorsunuz. COUNT(*) > 5 üzerinde hangi yan tümce filtreler?
- DISTINCT
- HAVING
- ORDER BY
- WHERE
Cevap: HAVING. Sayı ancak satırlar gruplandıktan sonra vardır ve HAVING grupları filtreler. WHERE gruplamadan önce çalışır, bu yüzden COUNT gibi bir toplama işlevini kullanamaz.
3Birleştirmeler, normalleştirme ve işlemler
Bir birleştirme (join), iki tablonun satırlarını bir koşulla, genellikle yabancı anahtar = birincil anahtar ile birleştirir:
FROM customers c JOIN orders o ON o.customer_id = c.id
- INNER JOIN (ya da JOIN) yalnızca iki tabloda da eşleşmesi olan satırları tutar.
- LEFT JOIN sol tablonun her satırını tutar. Eşleşme olmayan yerde sağ tablonun sütunları NULL olur.
- NULL, bir değerin eksik ya da bilinmediği anlamına gelir. IS NULL ile sınayın, asla = NULL ile değil.
Normalleştirme, her olgunun bir kez saklanması için tabloları böler. Bu, aynı olgunun birkaç yerde güncellenmesini önler.
- 1NF: her hücre tek bir atomik değer tutar, tekrarlayan grup yoktur.
- 2NF: 1NF’dir ve her anahtar olmayan sütun, bileşik anahtarın bir kısmına değil, anahtarın tamamına bağlıdır.
- 3NF: 2NF’dir ve hiçbir anahtar olmayan sütun başka bir anahtar olmayan sütuna bağlı değildir.
Bir işlem (transaction), deyimleri tek bir birim olarak gruplar. COMMIT onu kalıcı yapar, ROLLBACK geri alır. İşlemler ACID’i izler: atomiklik (ya hep ya hiç), tutarlılık, yalıtım ve dayanıklılık.
Kendini sına Bir müşteri hiç sipariş vermemiştir. customers LEFT JOIN orders içinde bu müşteriye ne olur?
- Müşteri bir kez görünür, sipariş sütunlarında NULL ile
- Müşteri sonuçtan çıkarılır
- Müşteri tablodaki her sipariş için bir kez görünür
- Sorgu bir hatayla başarısız olur
Cevap: Müşteri bir kez görünür, sipariş sütunlarında NULL ile. LEFT JOIN sol tablonun her satırını tutar ve eksik sağ tarafı NULL ile doldurur. Müşteriyi dışarıda bırakmak INNER JOIN’in yaptığı şeydir.
4Adım adım yöntem
Bir sorgu yazmak ya da verilen bir sorgunun ne döndürdüğünü bulmak için:
- Veriyi tutan tabloları ve anahtarlarla nasıl bağlandıklarını bulun.
- FROM’u birleştirmelerle yazın. Eşleşmesi olmayan satırların kalması gerektiğinde LEFT JOIN seçin.
- Tek satırlar üzerindeki koşullar için WHERE ekleyin.
- Soru “başına” ya da “her biri için” diyorsa GROUP BY ve toplama işlevini ekleyin.
- Toplama işlevi üzerindeki koşullar için HAVING, sıra önemliyse ORDER BY ekleyin.
- Sonucu küçük bir örnekle kontrol edin: her yan tümceden sonra, veritabanının çalıştırdığı sırayla satırları listeleyin.
Bir kuram sorusunda önce kavramı adlandırın (bir anahtar, bir birleştirme türü, bir normal form, bir ACID özelliği), sonra tanımına uyan seçeneği seçin.
5Çözümlü bir örnek
Her adımı izleyin. Açmadan önce bir sonrakini tahmin etmeye çalışın.
Çözümlü örnekcustomers tablosunda (1, Ana), (2, Ben) ve (3, Cas) satırları vardır. orders tablosunda (id, customer_id) = (10, 1), (11, 1), (12, 2) ve (13, 1) satırları vardır. Bu sorgu ne döndürür? SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name
1Her müşteri, kendi id’sini taşıyan siparişlerle eşleştirilir. Ana, 10, 11 ve 13 numaralı siparişlerle eşleşir. Ben, 12 numaralı siparişle eşleşir.
Cas’ın siparişi yoktur. Bir LEFT JOIN olduğu için Cas sonuçta kalır, o.id için NULL ile.
2- Ana, 10
- Ana, 11
- Ana, 13
- Ben, 12
- Cas, NULL
Bu 5 satırdır.
3GROUP BY c.name üç grup yapar: 3 satırlı Ana, 1 satırlı Ben ve 1 satırlı Cas.
4COUNT(o.id) yalnızca NULL olmayan değerleri sayar. Ana 3, Ben 1 alır.
Cas’ın bir satırı vardır ama o.id’si NULL’dur, bu yüzden Cas 0 alır.
5Ana, Ben ve Cas birlikte 3 + 1 + 0 = 4 siparişe sahiptir; bu, orders içindeki satır sayısıyla aynıdır. COUNT(*) ile Cas yanlışlıkla 1 alırdı, çünkü COUNT(*) satırın kendisini sayar.
Cevap Ana 3, Ben 1, Cas 0.
6Sık yapılan hatalar
- WHERE içinde toplama işlevi kullanmak. COUNT, SUM ya da AVG üzerindeki koşullar HAVING’e aittir.
- = NULL yazmak. NULL ile her karşılaştırma bilinmezdir; IS NULL ya da IS NOT NULL kullanın.
- Eşleşmesi olmayan satırların kalması gerekirken INNER JOIN kullanmak. LEFT JOIN kullanın.
- Birleştirme koşulunu unutmak. ON olmadan her satır her satırla eşleşir (çapraz birleştirme).
- Ne GROUP BY içinde ne de bir toplama işlevinin içinde olan bir sütunu seçmek.
- DELETE (satırları siler) ile DROP TABLE’ı (tablonun tamamını siler) karıştırmak.
- WHERE olmadan UPDATE ya da DELETE çalıştırmak. Tablodaki her satırı değiştirir.
Kendini sına Bir tablonun 10 satırı vardır ve col sütunu her satırda NULL’dur. SELECT COUNT(col) ne döndürür?
- 0
- 10
- 1
- NULL
Cevap: 0. COUNT(col) yalnızca NULL olmayan değerleri sayar, bu yüzden 0 döndürür. COUNT(*) satırları sayar ve 10 döndürürdü.
7Sınav soruları nasıl görünür
- Kolay: anahtar terimler ve olgular. SELECT, WHERE, ORDER BY ya da DELETE’in ne yaptığı, birincil ve yabancı anahtarlar, NULL’un ne demek olduğu.
- Orta: kavramları uygulama. Bir görev için doğru sorgu, WHERE ve HAVING farkı, iç ve dış birleştirmeler, normal formlar, ACID.
- Zor: olgular ve analiz. Alt sorgular, yalıtım düzeyleri ve anomalileri, BCNF, pencere işlevleri, indeksler ve sorgu performansı, SQL enjeksiyonu.
Bir sorgu verildiğinde onu birkaç satır üzerinde FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY sırasıyla izleyin. Tuzakların çoğu üç satır içinde ortaya çıkar.
Uygulamada adım adım öğreninUygulamada adım adım öğrenin