Leetcode'daki (neredeyse) tüm SQL problemlerini çözerek öğrendiklerim
Bu benim ortamdaki ilk gönderim ve Leetcode'daki SQL problemlerini çözme yolculuğum boyunca öğrendiğim bazı şeyleri paylaşacağım .
Bu yazının ilerleyen kısımlarında bazı kaynaklar ekledim, işinize yarayabilir.
SQL problemleri daha gerçek dünya odaklıdır
Gerçek hayatta işinize yaramayan kodlama problemlerini çözmek için kullandığınız birçok veri yapısı ve algoritma (DSA) olduğu iddiasını sık sık duyarsınız. SQL problemleri böyle değil. Bunlar daha gerçek dünya odaklıdır ve günlük çalışmalarınızda benzer problemlerle oldukça sık karşılaşırsınız. Bu yüzden bu problemleri uygulamak çok faydalıdır.
Günlük işinizde asla bir ikili ağacı tersine çevirmeniz gerekmese de, DSA problemlerini çözmek rasyonel düşünmenizi ve problem çözme yeteneğinizi geliştirebilir.
İster OLAP sistemleri için sorgular yazan bir Veri Mühendisi/Analist/Bilim İnsanı olun, ister OLTP sistemleri için sorgular yazan bir Arka Uç Mühendisi olun, SQL problemlerini uygulamak yalnızca mülakatlarda başarılı olmanıza yardımcı olmayacak, aynı zamanda günlük görevlerinizde de size yardımcı olacaktır.
SQL'de daha az sürpriz var
DSA problemlerini çözerken, aynı problemi farklı veri yapıları ve/veya algoritmalarla çözerken kod, zaman ve mekan karmaşıklığı açısından ciddi farklar görebilirsiniz, ancak bu SQL için her zaman geçerli değildir. Kesinlikle, sorgu performansınızı artırmak için optimizasyon tekniklerini kullanabilirsiniz, ancak SQL'de DSA sorunları için yaşayabileceğiniz kadar çok sürpriz yoktur.
Bunun başlıca nedeni, SQL'in bir dil olması ve sınırlı özelliklere sahip olmasıdır. Çok sayıda DSA vardır ve bunları farklı programlama dillerinde farklı şekillerde uygulayabilirsiniz. SQL söz konusu olduğunda, kendisi bir dil olduğu için, belirli seçeneklere ve sonunda daha az sürprize sahipsiniz.
JOIN'lerinizde ustalaşın
JOIN'leri ve nasıl çalıştıklarını hepimiz biliyoruz ama ne kadar çok problem çözerseniz, JOIN'ler hakkında hala bilmediğiniz birçok şey olduğunu o kadar çok anlayacaksınız. JOIN'ler, karıştırırsanız sizi çok kötü performans gösteren bir sorguya yönlendirebilir, ayrıca ne yaptığınızı biliyorsanız, sorguyu önemli ölçüde performans gösterebilir.
Ne kadar çok öğrenirsen, hiçbir şey bilmediğini o kadar çok anlayacaksın.
Pratik yaparken JOIN'leri kafanızda görselleştirmeye çalışın. Aynı tablolarla farklı birleştirme türlerini deneyin ve çıktıdaki farkı görün. JOIN'lerde uzmanlaşmak, yalnızca zor sorunları kolayca çözmenize izin vermekle kalmayacak, aynı zamanda veri ile ilgili sorunları verimli ve etkili bir şekilde çözme yeteneğinizi de artıracaktır.
CTE'ler senin arkadaşın
Birçok mühendis arasında, Ortak Tablo İfadesinin (CTE) "yüksek seviyeli" bir SQL şeyi olduğu ve onu kolay problemler için kullanmadığınız ve bu nedenle insanların CTE yazmak yerine alt sorgular yazma eğiliminde olduğu konusunda yaygın bir yanılgı gördüm.
CTE, uzun ve karmaşık sorgunuzu yalnızca güzel görünmekle kalmayıp aynı zamanda sorgunuzu modüler, okunması, anlaşılması ve hata ayıklaması daha kolay hale getiren parçalara ayırmanın harika bir yoludur.
Sorgunuz yüzlerce kod satırı içeren birden fazla alt sorgu içeriyorsa ve beklendiği gibi çalışmıyorsa, hata ayıklamanın ne kadar sancılı olabileceğini anlayacaksınız. Sorguyu kolayca ayıklamanıza yardımcı olacak CTE'lerle sorguyu yeniden yazmayı deneyin.
Varsa, sorunları bulmak ve düzeltmek için sınırlı zamanınız olacağından, görüşmeler sırasında CTE'leri kullanmak da yararlıdır.
PENCERELEME işleri kolaylaştırır
WINDOW işlevleri, SQL'in sahip olduğu birkaç sihirden biridir.
Başlangıçta, kullanım durumlarını ve uygulamasını anlamak biraz zor olabilir, ancak PENCERE işlevlerini ne kadar çok uygular ve uygularsanız, karmaşık sorunları o kadar verimli bir şekilde çözebileceksiniz.
RANK, DENSE_RANK, FIRST_VALUE vb. pencere fonksiyonları, birçok durumda karmaşık problemleri çözmek, bunlara alışmak için yaygın olarak kullanılır. Başlangıçta kavramak biraz zaman alıyorsa yılmayın, orada kalın! Zamanla iyileşmeyi göreceksiniz.
DESENLER var
Problemleri çözmeye başladığınızda, ister SQL ister DSA problemi olsun, başlangıçta her problem farklı görünebilir ve farklı problemleri çözmenin farklı yollarının miktarı karşısında şaşkına döneceksiniz.
Bununla birlikte, birkaç gün pratik yaptıktan ve düzinelerce problem çözdükten sonra, aslında farklı problemleri çözmenin "pek çok yolu" olmadığını, bunun yerine kullanmakta olduğunuz "birkaç ortak modele" sahip olduğunuzu anlayacaksınız. Farklı sorunları çözmek için tekrar tekrar.
"Melekler, kalıpların tekrarlandığı yerde birleşir."
―Michael Bassey Johnson, Oneironaut'un Günlüğü
Bu kalıpları bulduğunuzda, problem çözme yolculuğunuz çok daha kolay ve eğlenceli olacaktır. Problemleri çözerken fark ettiğim ortak kalıplar hakkında başka bir yazı yazmaya çalışacağım.
Pratik yapmak ve problem çözmek başlangıçta yorucu olabilir. Bu normal ve bunu hisseden tek kişi sen değilsin. Hayatınızı kolaylaştıracak bazı ipuçları vereceğim.
Boşver
SQL, öğrenmeye başlamak için oldukça kolay bir dildir. Başlıyorsanız, WHERE, toplama işlevleri, GROUP BY, ORDER BY, JOINS gibi temel bilgilerle başlayın. Onlara hakim olmak için zaman ayırın. Anladığınızı ve sorunları oldukça hızlı bir şekilde çözebildiğinizi hissettiğinizde, PENCERE işlevleri gibi ileri düzey konuları uygulamak için daha karmaşık problemlerle başlayın.
Herkes bir zamanlar acemiydi.
Herkes temel bilgilerle başladı ve sonunda karmaşık işlevleri kullandı ve anladı. Zaman alır, sakin ol.
zaman kaybetme
Her sorunu çözmek için bir zaman belirleyin. Diyelim ki kolay problemler için 5–8 dakika, orta problemler için 8–15 dakika ve zor problemler için 15–25 dakika ayıracaksınız.
Belirli bir süre içinde sorunu çözemezseniz, çözüme bakın. Çözüme bakmak kötü bir şey değil, çözümü anlamadan direk kopyala yapıştır yapmak kötü. Bu yardımcı olmuyor.
"Deneyim, bize ait olmasa bile usta bir öğretmendir."
― Gina Greenlee, Kartpostallar ve İnciler: Yolda Yalnız Anlardan Hayat Dersleri
Birinin yazdığı çözümü okumak için zaman ayırın, düşünce süreçlerinin ne olduğunu ve çözüme nasıl yaklaştıklarını anlamaya çalışın. Daha sonra, onu çözmenin daha iyi bir yolunu bulup bulamayacağınızı düşünmeye çalışın. Cevabınız evet ise, fikrinizi kodlayın ve işe yarayıp yaramadığını görün, aksi takdirde kodu kopyalayıp yapıştırmak yerine kendiniz yazın.
Bazen başkalarının çözümlerine bakmak daha iyi düşünmenize yardımcı olabilir. Sıkışmışsanız, bir sorunu çözmek için çok fazla zaman kaybetmeyin. Kendine biraz güç ver.
Kodlamadan önce düşünün, düşünmeden kodlamayın.
Sorun bildirimini okuduktan sonra doğrudan kodlamaya atlamayın. Nihai sonuca ulaşmak için ihtiyacınız olan adımların neler olduğunu düşünün.
1164 problemiyle ilgili bir örnek vereceğim. Belirli Bir Tarihte Ürün Fiyatı .
Bu problem size product_id, new_price & change_date içeren bir ürün tablosu verir ve herhangi bir değişiklikten önceki tüm ürünlerin fiyatının 10 olduğunu varsayarak 2019-08-16'daki tüm ürünlerin fiyatlarını bulmanızı ister.
Şimdi, çözümü bulmak için ne yapmam gerektiğini düşünürsem, aşağıdaki adımları buluyorum:
- 2019–08–16'dan sonra ilk değişiklik_tarihi olan product_id'leri bulun. Bu kimliklerin 2019-08-16'dan önce değişiklik_tarihi yoktur ve fiyat için varsayılan değer 10 olacaktır.
- 2019–08–16'dan önce değişiklik_tarihi olan ürün_id'leri için maksimum değişiklik_tarisini bulun. 2019-08-16'dan önce ve sonra değişiklik tarihi olan product_id'leri karşılık gelen change_date ve new_price ile bana verecek.
- 2. adımdaki change_date değerine sahip product_id'leri bulun ve new_price değerini alın. Bu yeni_fiyat, söz konusu ürün_kimliği için aradığımız fiyat olmalıdır.
- Adım 1 ve adım 3'teki product_id'leri sırasıyla varsayılan fiyat ve yeni_fiyat ile birleştirin.
Görüşmeler sırasında problem ifadesini okuduktan hemen sonra tek kelime etmeden kod yazmaya başlayan insanlar gördüm. Bir zaman kısıtlaması olduğunu ve görüşülen kişi üzerinde baskı olduğunu anlıyorum ama ne yazık ki bir çözümü uygulamaya geçmeden önce düşünmek ve sesli düşünmek de kodlama görüşmesinin çok önemli bir parçası. Bu, görüşmecinin sizin nasıl düşündüğünüzü anlamasına yardımcı olur, tartışmalara/ipuçlarına yer açar, adayın çözümü yazmasını ve görüşmecinin değerlendirmesini kolaylaştırır.
Problemi nasıl çözeceğini net bir şekilde açıklayabilen ancak zaman kısıtlaması nedeniyle kodu tamamlayamayan birçok adaya EVET verdim.
Mülakat gibi zamana bağlı bir senaryoda tüm bunları düşünemeyecekmişsiniz gibi görünse de, inanın bana yeterince pratik yaparsanız düşüneceksiniz. Bu şekilde pratik yapabilirsen, buna alışacaksın! Bu, kod yazmaya geçmeden önce net bir şekilde düşünmenize, son durumları göz önünde bulundurmanıza, kodu yazarken zaman kazanmanıza ve ayrıca mülakatları oldukça rahat bir şekilde geçmenize yardımcı olacaktır.
Senin babanın da babası var
Bir sorunu çözebilseniz bile, leetcode'daki tartışma bölümünden geçmek iyi bir fikirdir. Çözümünüzün iyi olduğunu öğrenebilirsiniz, ancak daha iyi bir çözüm bulan biri var.
Her zaman senden daha fazlasını bilen biri olmalı
Yolculuk boyunca hepimiz bunu defalarca yaşadık, bunun için aşağılık kompleksine kapılmayın. Her şeyi bilemezsiniz ve kimse her şeyi bilemez. Gerçeği kabul edin ve bir şeyler öğrenmek için bu fırsatı kullanın. Çözümümle gurur duyduğum pek çok durum oldu ve diğer birkaç çözümü okuduktan sonra, benimkinin en optimize çözüme yakın olduğunu gördüm. Sadece tartışmalara ve yorumlara bakarak birçok şey öğrendim.
Bu tartışma ve yorum bölümleri altın madenidir, bundan sonuna kadar yararlanın!
Mükemmellik zaman alır
Başlangıçta mükemmel çözümü yazmakla uğraşmayın. İlk göreviniz sorunu çözmek. Bunu yaptıktan sonra, daha sonra daha iyi performans için her zaman optimize edebilirsiniz.
Çalışsın, verimli olsun, güzel olsun.
Mükemmelliğe ulaşmak zaman alır. Başlangıçta en iyi çözümü bulamazsanız üzülmeyin. Zamanla, sonunda orada olacaksın.
hüsrana uğrama
Başladığınızda, asla başaramayacakmışsınız gibi hissedebilirsiniz. Yine tek değilsin, hepimiz oradaydık! Sıkı durun, sadece umudunuzu kaybetmeyin ve devam etmeyin.
Denemeyi bırakma. Yapması en kolay şey ve hiçbir şey getirmiyor.
Bir şeyde iyi olmak için ona zaman ayırmanız gerekir. Zamana bırak, üzülme. Bu bir roket bilimi değil, pek çok insan bunu yapıyor ve hepsi doğuştan dahi değil. Bir şeyi kavramak için diğerlerine kıyasla daha fazla zamana ihtiyacınız olabilir, ancak denemeye devam ederseniz sonunda orada olacaksınız.
Güven bana, oraya ulaşacaksın! Bu sadece bir zaman meselesi ve buna bağlı kalmalısın.
Pratik, Pratik ve Pratik
Evet, bunu daha önce 100 kez duydunuz, 101. kez duyun. Bir şeyde iyi olmak istiyorsan, onu yapmaya devam et. Doğuştan dahi olan insanlar bile, iyi oldukları şeyleri yapmaya devam ederler.
Bir şeyde ustalaşmak 10000 saat sürer
Ne yazık ki, başarının kısayolu yoktur. Alıştırma yapmak yalnızca zamanla daha iyi olmanıza yardımcı olmakla kalmaz, aynı zamanda yaklaşan zorluklar için kendinize güvenmenizi sağlar. Ne yapıyorsan yapmaya devam et.
Kaynaklar ve son düşünceler
Tüm leetcode çözümlerimi bir github deposunda topladım , bu depoyu github'da takip edebilir ve yıldızlayabilirsiniz.
Verilerle ilgili herhangi bir sorun ve/veya herhangi bir şey hakkında görüşmek isterseniz, ADPlist aracılığıyla benimle iletişime geçebilirsiniz . Bunu yapmak için asla para istemeyeceğim ama muhtemelen tüm mesajları yanıtlayamayacağımı ve/veya herkesle oturum düzenleyemeyeceğimi unutmayın.
Son olarak bana destek olmak isterseniz bana bir kahve ısmarlayabilir veya paypal üzerinden bağışta bulunabilirsiniz .
Mutlu öğrenme!!

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































