Alt sorgular, SQL sorgularına anlamlı güç katıyor mu?


29

SQL'in alt sorgulara ihtiyacı var mı?

İlişki veritabanları için yapılandırılmış sorgu dilinin yeterince genel bir uygulamasını hayal edin. Kanonik SQL SELECTdeyiminin yapısı aslında anlam ifade etmek için oldukça önemli olduğundan, doğrudan ilişkisel cebirlere hitap etmiyorum, ancak ifadeler biçiminde uygun kısıtlamalar yaparak bu terimlerle çerçevelendirebilirsiniz.

Bir SQL SELECTsorgusu, genel olarak bir çıkıntı (oluşur SELECTparçası) bir dizi JOINoperasyon ( JOINparçası), belirli bir sayıda SELECTION işlemleri (SQL, WHEREhükümler) ve sonra da set-bazlı (operasyonlar UNION, EXCEPT, INTERSECTve benzeri), bir diğeri ile ve ardından SQL SELECTsorgusu.

Birleştirilen tablolar ifadelerin hesaplanmış sonuçları olabilir; Başka bir deyişle, şöyle bir açıklamaya sahip olabiliriz:

SELECT t1.name, t2.address
  FROM table1 AS t1 
  JOIN (SELECT id, address 
          FROM table2 AS t3 
         WHERE t3.id = t1.id) AS t2
 WHERE t1.salary > 50,000;

Hesaplanan bir tablonun bir SQL sorgusunun bir parçası olarak alt sorgu olarak kullanılmasına değineceğiz. Yukarıdaki örnekte, ikincisi (girintili) SELECTbir alt sorundur.

Tüm SQL sorguları, alt sorguları kullanmayacak şekilde yazılabilir mi? Yukarıdaki örnek şunları yapabilir:

SELECT t1.name, t2.address
  FROM table1 AS t1 
  JOIN table2 AS t2
    ON t1.id = t2.id
 WHERE t1.salary > 50,000;

Bu örnek biraz taklit edici veya önemsizdir, ancak buna eşdeğer bir ifadeyi kurtarmak için çok daha fazla çaba sarf edilmesi gereken durumlar düşünülebilir. Başka bir deyişle, alt sorgulara sahip her SQL sorgusu için, aynı temel tablolarda aynı sonuçları üretecek şekilde ve nun alt sorguları olmayan qbir sorgusu var mı? SQL sorgularını aşağıdaki şekilde sınırlayalım:q'q qq'

SELECT <attribute>,
      ...,
      <attribute>
 FROM <a table, not a subquery>
 JOIN <a table, not a subquery>
  ...
 JOIN <a table, not a subquery>
WHERE <condition>
  AND <condition>
  ...
  AND <condition>

UNION
 -or-
EXCEPT
 -or-
<similar>

SELECT ...

Ve bunun gibi. Sanırım sol ve sağ dış birleşimler fazla bir şey katmıyor, ancak yanılıyorsam, lütfen şunu belirtmekten çekinmeyin ... her halükarda, onlar da adil bir oyundur. Belirlenen operasyonlar devam ederken, bunların herhangi biri iyi ... sanırım birlik, fark, simetrik fark, kesişme, vb ... yardımcı olabilecek herhangi bir şey var. Tüm SQL sorgularının azaltılabileceği bilinen herhangi bir form var mı? Bunlardan herhangi biri alt sorguları ortadan kaldırıyor mu? Veya eşdeğeri, alt sorgu içermeyen bir sorgunun bulunmadığı bazı durumlar var mı? Referanslar takdir edilir ... veya kanıtlandıkları veya istenmediklerine dair bir gösteri harika olur. Teşekkürler ve bu acı dolu bir şekilde cahil olduğum ünlü (ya da önemsiz) bir sonucuysa üzgünüm.


5
Bağırsaklarım bana her zaman bir araya gelebileceğinizi ve toplanmış değerlere ihtiyaç duymadığınız sürece oradan seçim yapabileceğinizi söylüyor. Sütun ortalamasından daha büyük bir değere sahip tüm girişleri seçmek, önce ortalama hesaplamayı gerektirir, bu nedenle bir alt sorguya ihtiyaç duyar.
Raphael

@Raphael Toplanmış değerleri bile yapabildiğinize eminim, sadece daha fazla kendi kendine birleşme ve gruplama yapmanız gerekiyor (üstel olarak daha büyük, ama yine de mümkün). Yine de, resmi olarak nasıl kanıtlayabileceğime emin değilim.
Kevin

@Kevin Gereken işlem sayısının satır sayısına bağlı olmadığından emin misiniz? Çünkü buna sahip olamayız, değil mi?
Raphael

1
Ben bir alt sorgu gerektiren sahip, normal örnek çiftleri sayma: select count(*) from (select id from sometable group by id having count(*)>1) d. Çünkü bunu group bybir cevap olarak koymadım.
Mark Hurd

Normal SQL'de BTW AFAIK, ONmadde için gerekli JOIN, ancak virgülle bir çapraz ürün elde edilmesine rağmen.
Mark Hurd

Yanıtlar:


9

Bazı terminoloji karışıklığı var; parantez içindeki sorgu bloğu

SELECT t1.name, t2.address
  FROM table1 
  JOIN (SELECT id, address 
          FROM table2 AS t3 
         WHERE t3.id = t1.id) 

iç görüş denir . Bir alt sorgu , WHERE veya SELECT yan tümcesinde, örneğin

select deptno from dept
where 3 < (select count(1) from emp 
           where dept.deptno=emp.deptno)

Her iki durumda da, iç görünüm veya alt sorgu, "düz" proje-kısıtla-birleşmesine katılmayabilir. Toplanmayla ilişkili alt sorgulama, gruplama ile iç görüşlere uyumsuzluğa yol açar, bu daha sonra düz sorguya dahil değildir.

select deptno from dept d
    where 3 < (select avg(sal) from emp e
               where d.deptno=e.deptno)

select d.deptno from dept d, ( 
    select deptno from emp e
    group by deptno
    having avg(sal) > 3
) where d.deptno=e.deptno

select d.deptno from dept d, emp e
where d.deptno=e.deptno 
group by d.deptno
having avg(sal) > 3

Sorgu optimizasyonu için cebirsel kurallara gelince, ilişkisel cebir içine axiomatized olduğu bilinmektedir İlişkisel Kafesin gösterdiği gibi sorgu dönüşümleri kolaylaştırır burada ve orada .


Meraklıyım. Ortalama alan kullanan bir sorgu örneği ekleyebilir misiniz, örneğin ortalamanın üzerinde bir değere sahip tüm girdileri seçme? Düzleştikten sonra nasıl görüneceği bana belli değil.
Raphael

16

İfadenizi ilişkisel cebire çevirmek için şunu sorar:

Biz yazabiliriz σbir(bir)σB(B)σbir(σB(birB))

σ

Cevap "Evet" ve standart bir sorgu optimizasyonu. Dürüst olmak gerekirse, bunu soru-yalvarıyor olmayan bir şekilde nasıl ispatlayacağımızdan emin değilim - bu sadece bir seçim ve katılma özelliğidir. İstediğiniz kadar iç içe geçmiş sorgu katmanları eklerken indüktif olarak iddia edebilirsiniz.

Ek olarak, şunları da sorabilirsiniz:

Her katılım sırası A olarak yazılabilir mi?birBC...(birB)(CD)

Yine cevabı evet, çünkü katılmak ilişkisel. Benzer ifadeler projeksiyon için de yapılabilir.

“Düzleştirilemediğini” düşündüğüm dikkat çekici bir tür “alt sorgu” with. Bunu görmenin bir yolu with, bir ifadeniz varsa, alt sorgu kullanmadan yazılamayan özyinelemeli bir işleve sahip olabileceğinizi not etmektir.

Özetlemek gerekirse: Bahsettiğiniz özel durumda, hayır, SQL'in alt sorgulara ihtiyacı yoktur ve bunu indüktif olarak ispatlayabilirsiniz. Genel olarak, ancak, alt sorgu gerektiren özellikler vardır.


Yinelemeli davranış üzerinden withSQL: 1999'da tanıtıldı ve elde edilen dili kesin olarak daha anlamlı kılıyor.
András Salamon

1

"Alt sorgular SQL sorgularına anlamlı güç katıyor mu?"

En azından SQL dilinde EXCEPT kullanılmadan önce yaptılar.

EXCEPT'in tanıtılmasından önce, SQL'de alt sorgulara başvurmadan ilişkisel bir fark ya da yarı-netliği ifade etmenin hiçbir yolu yoktu.

Bu günlerde, ilişkisel cebirin "tipik" ilkel operatörlerinin tümü, alt sorgular olmadan ifade edilebilir:

DOĞAL DOĞAL JOIN aracılığıyla yapılır veya ON JOIN edilebilir JOIN
BİRLİĞİ yoluyla yapılabilir UNION
HARİÇ yoluyla yapılabilir EKSİ
PROJESİ / RENAME / SELECT'in Throug yapılabilir uzatmak
NEREDE yoluyla yapılabilir RESTRICT
DEĞERLER yoluyla yapılabilir ilişkisel değişmezleri
kapanışları can geçişli özyinelemeli İLE yapılması

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.