Karmaşık SQL sorgularının yazılmasını nasıl kolaylaştırırım? [kapalı]


42

Çok sayıda (en az 3-4) tablo arasında birleştirme içeren ve iç içe geçmiş birkaç koşul içeren karmaşık SQL sorguları yazmak çok zor. Yazmam istendiği sorgular birkaç cümle ile kolayca tanımlanır, ancak tamamlayıcı bir aldatıcı kod gerektirebilir. Kendimi sık sık bir koltuk değneği gibi görünen bu sorguları yazmak için geçici görüşler kullanarak buluyorum. Bu karmaşık sorguları kolaylaştırmak için hangi ipuçlarını kullanabilirim? Daha spesifik olarak, bu sorguları gerçekte SQL kodunu yazmak için kullanmam gereken adımlara nasıl ayırabilirim?

Yazmamın istendiği SQL olduğumu ve bir veritabanı kursu için ev ödevlerinin bir parçası olduğunu ve bu yüzden benim için çalışacak yazılımı istemiyorum. Yazdığım kodu gerçekten anlamak istiyorum.

Daha fazla teknik detay:

  • Veritabanı yerel makinede çalışan bir PostgreSQL sunucusunda barındırılıyor.
  • Veri tabanı çok küçük: yediden fazla tablo yok ve en büyük tablo yaklaşık 50 satırdan az.
  • SQL sorguları, LibreOffice Base aracılığıyla sunucuya değişmeden iletiliyor.

Geçici görünümler aslında oldukça yararlıdır, çünkü böyle bir tabloya (açık karmaşık dizinler gibi) SQL çözümleyicisine ipucu vermek çok zordur.

Şahsen, GUI ("LibreOffice Base" Tasarım Görünümünde Sorgu Oluştur "veya Office Access" Oluştur ">" Sorgu Tasarımı "gibi) kullanarak hile yapmayı daha kolay buluyorum ve bunun sonucunda ortaya çıkan SQL'i görüyorum. Bazen bir GUI tasarımcısı tarafından verilen SQL'i değiştirmek gerekir, ancak iyi bir başlangıç ​​noktası verir
kurdtpage 25:15

Yanıtlar:


49

Bunun çoğunu sadece "doğru" cevabı almaya çalışıyorum, bu yüzden bazı performans sorunları olduğunu keşfedebilirsiniz. Yanlış bir sorguyu hızlandırmanın anlamı yok.

Tablo ilişkilerini anlayın - Birçoğu bir olacak. "Çok" masasını bil. Katılmalarınız için gerekli alanları belirleyin.

LEFT katılım senaryolarına katılmayı düşünün - Tüm çalışanları ve maaşlarını geçen aydan itibaren seçin. Ya geçen ay maaş almadılarsa?

Sonuç kümesini bilin: 1) Bir e-tabloda, sorgunuz için en az bir doğru kayıt el ile girin. 2) Sorguyu, kaç kaydın döndürüleceğini belirlemek için yeterince basit bir biçimde yazın. Sorgunuzu sınamak için her ikisini de kullanın, yeni bir tabloya katılmanın sonucu değiştirmediğinden emin olun.

Sorgunuzu yönetilebilir bölümlere ayırın - Hepsini bir kerede yazmak zorunda değilsiniz. Karmaşık sorgular bazen basit sorgular topluluğu olabilir.

Karışık toplama seviyelerine dikkat edin : Aynı sonuç kümesinde aylık, üç aylık ve yıllık değerleri koymak zorunda kalırsanız, farklı değerler üzerinde gruplanmış sorgularda ayrı ayrı hesaplamanız gerekir.

BİRLİĞE ne zaman olacağını bilmek Bazen alt grupları kendi seçtikleri ifadelere bölmek daha kolaydır. Yöneticiler ve diğer çalışanlarla karışık bir masanız varsa ve her sütunda bu gruplardan birine üyeliğe dayalı Vaka ifadeleri yapmanız gerekiyorsa, bir Çalışan sorgusuna bir Yönetici sorgusu ve birliği yazmak daha kolay olabilir. Her biri kendi mantığını içerecektir. Farklı tablolardaki öğeleri farklı satırlara dahil etmek açık bir kullanımdır.

Karmaşık / Yuvalanmış formüller - Sürekli olarak girintili olmaya çalışın ve birden çok satır kullanmaktan korkmayın. "CASE NE OLDUĞUNDAN OLDUĞU CASE", sizi deliğe sokacaktır. Bunları düşünmek için zaman ayırın. Kompleks kalkayı sonuncusu için saklayın. Önce seçilen doğru kayıtları alın. Sonra doğru değerlerle çalıştığınızı bilerek karmaşık formüllere saldırırsınız. Formüllerde kullanılan değerleri görmek, NULL değerleri hesaba katmanız gereken alanları ve bölmeyi sıfır hatayla nasıl başa çıkacağınızı tespit etmenize yardımcı olacaktır.

İstenen sonuç kümesini hala aldığınızdan ve suçluya hangi katılmanın ya da cümlenin olduğunu bildiğinizden emin olmak için yeni tablolar eklerken sık sık test edin.


1
Gerçekten mükemmel şeyler. Jeff'in LEFT birleşimlerini aramak ve karmaşık sorguları daha küçük, daha yönetilebilir olanlara bölmek ve daha sonra bunları birleştirmek üzerine olan noktalarını vurgulamak istiyorum. Neredeyse her gün büyük veritabanlarına büyük sorgular yazıyorum ve bu iki şey her zaman ortaya çıkıyor. Her adımda görmeyi beklediğiniz verileri aldığınızdan emin olmak için her zaman sorgularınızı ve alt sorgularınızı olabildiğince hızlı çalıştırın.
CodexArcanum

@CodexArcanum - ve büyük verilerle ilgili sorguları çalıştırdığınızda,
TOP'u

Önerinizle ilgili her türlü ifadeye katılıyorum
Alessandro Rossi

28
  1. Zaten yapmadıysanız, girinti yapılacak ilk şey olacaktır. Sadece basit sorgularla bile faydalı olmakla kalmaz, bir araya gelip biraz daha karmaşık sorgular söz konusu olduğunda çok önemlidir select top 1 [ColumnName] from [TableName].

  2. Düzgün girildikten sonra , uygun olduğunda, sorgunun içine yorum eklenmesini hiçbir şey yasaklamaz . Bunları aşırı kullanmayın: Kod yeterince açıksa, yorum eklemek kodun netliğine zarar verecektir. Ancak, sorgunun daha az belirgin kısımları için hala memnuniyetle karşılanmaktadırlar.

    Uzun sorguların (yorumlu sorgular dahil) uygulama sunucunuz ve veritabanı sunucunuz arasında daha geniş bant genişliği kullanımı anlamına geleceğini unutmayın. Ayrıca, Google’ın bir ürünü üzerinde saniyede büyük miktarda istek gerektiren, istisnai bir performans ve kaynak kullanımı gerektiren bir çalışma yapmıyorsanız, yorumların eklediği boyutun performans açısından sizin için hiçbir şeyi değiştiremeyebileceğini unutmayın.

  3. Aynı stili masalar, sütunlar vb. Üzerine uygulamak , okunabilirliği de çok yardımcı olur. Eski bir veritabanı tabloları varsa PRODUCT, users, USERS_ObsoleteDONT_USE, PR_SHIPMENTSve HRhbYd_UU, birisi çok yanlış şey yapıyor.

  4. Sorgulara aynı stili uygulamak da önemlidir. Örneğin, Microsoft SQL Server için sorgu yazıyorsanız ve [TableName]bunun yerine kullanmaya karar verdiyseniz TableName, buna bağlı kalın. A'dan sonra yeni bir satıra giderseniz select, sorgularınızın sadece yarısında değil, hepsini yapın.

  5. Bunu* yapmak için güçlü nedenler olmadıkça kullanmayın ( if exists(select * from [TableName] where ...)Microsoft SQL Server'daki gibi). *Bazı (çoğu değilse) veritabanlarında yalnızca performansın olumsuz bir etkisi olmaz, aynı zamanda sorgunuzu kullanan geliştirici için de yararlı değildir. Aynı şekilde, bir geliştirici değerlere asla dizine değil, ada göre erişmelidir.

  6. Son olarak, seçimler için, görünüm sağlamada yanlış bir şey yoktur . Başka bir şey için, projeye ve birlikte çalıştığınız kişilere bağlı olarak saklı yordamlar da kullanılabilir.


¹ Bazı insanlar saklı işlemlerden nefret eder. Diğerleri, birkaç nedenden dolayı (kesinlikle geçerli, en azından onlar için geçerli) onlardan hoşlanmıyor.

² Meslektaşlarınız, diğer öğrenciler, öğretmeniniz vb.


9

Burada karanlıkta bir parça görüntü, ancak çok fazla geçici görüş yazıyorsanız, belki de çoğu yerde bir SQL ifadesine bir tablo koyabileceğinizi henüz anlamadınız, bu tablo bir sorgu ile değiştirilebilir.

Bu nedenle, tablo A'yı geçici B görünümüne eklemek yerine, tablo A'yı geçici görünüm B olarak kullanmakta olduğunuz sorguya birleştirebilirsiniz. Örneğin:

    SELECT A.Col1, A.Col2, B.Col1,B.Col2
      FROM (SELECT RealTableZ.Col1, RealTableY.Col2, RealTableY.ID as ID
              FROM RealTableZ 
   LEFT OUTER JOIN RealTableY
                ON RealTableZ.ForeignKeyY=RealTableY.ID
             WHERE RealTableY.Col11>14
            ) As B
        INNER JOIN A
                ON A.ForeignKeyY=B.ID

Bu örnek oldukça anlamsız, ancak sözdizimini açıklamalıdır.

"Özel" olmayan (dizine ayrılmış, bölümlenmiş) görünümler için bu, bir görünüm kullanıyormuş gibi aynı sorgu planıyla sonuçlanmalıdır.

Yazmayı kolaylaştırırken, tüm sorguyu yazmadan önce ne beklediğinizi aldığınızdan emin olmak için her bir parçayı doğrulayabilirsiniz.

Özür dilerim, eğer bu size zaten eski bir şapka ise.


3
SQL konusunda oldukça uzmanım ve bu girintiden gerçekten nefret ediyorum: güzel görünebilir ama tamamen "bence" yararsız görünebilir. Bunun iki nedeni: Sol dış birleştirmenin ana sorgunun bir parçası mı yoksa bir alt sorgunun parçası mı olduğunu açıkça anlayamıyorum, bir kod güzelleştiricisine ihtiyaç duyuyor ve istediğiniz zaman tüm metni yeniden güzelleştirmek için birkaç satır eklemek istediğinizde . Sadece TABS'a ihtiyaç duyan girintileri planlayın, çok daha esnektir. Cevabınızı aşağı oylamadım ama bu tarzı kullananları, özellikle benim yardımıma ihtiyaç duyduklarında ... caydırıyorum.
Alessandro Rossi,

7

Geçici görüşler yerine WITH yantümcesini kullanın . Bu, büyük sorguları daha okunaklı küçük parçalara ayırmayı çok daha kolaylaştırır.


1
Bir cte kullanıyorsanız, sorgunun yalnızca bir sonraki sorgu çalıştırılana kadar devam edeceğini unutmayın; bu nedenle, birden çok sorguda cte kullandığınız bazı durumlarda, performansın temp tablosu kullanması daha iyi olabilir.
Rachel

3
  1. Zaten değilseniz, teori hakkında daha fazla bilgi edinin SQL, küme teorisine dayanır ve kümeler hakkında daha fazla bilgi sahibi olmak, SQL'in nasıl çalıştığını daha iyi tanımanıza yardımcı olur.
  2. Daha fazla SQl alıştırın, sadece SQL'i öğreniyorsanız, her şeyin nasıl yapılacağını anlamak için zaman harcayacağınızı öğreniyorsanız, bazı şeyler onları gerçekten anlayabilmeniz için biraz zaman alır, Katılanlar, daha iyi kullandıkça daha iyi kullanacağınız bir örnek.
  3. Sorguladığınız tabloların doğru tasarlandığından emin olun
  4. Belirli sorgularda görünümler kullanmaktan korkmayın, özellikle de birden çok farklı şekilde rafine edilmesi gereken ortak bir kümeniz varsa

1

Her şey gibi, sorunu da yönetilebilir parçalara bölmek istersiniz.

Bu arada, karmaşık problemleri nasıl çözdüğünüz IS.

Yani: Dış sorgu çalıştırmadan önce gerçekten istediğinizi döndürdüğünü görmek için alt sorguyu incelemek istiyorsunuz. Katıldığınız her masanın en az bir birleşimini denemek istiyorsunuz, böylece gerçekten doğru bir şekilde düşündüğünüzü görebilirsiniz. Bunun gibi şeyler. Hepsini yazmayı ve bir vurumda tam olarak ne istediğinizi çıkarmayı umut etmek gerçek dışıdır.

Bir SQL ifadesi, belli bir karmaşıklık seviyesine ulaştığında, temelde kendi başına küçük bir programdır. Verilerin nasıl birleştirildiğini, seçildiğini, filtrelendiğini ve çıktılarını gerçekten anlamak için büyük bir fark yaratır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.