SQL'de gruplama: GROUP BY yan tümceleri, HAVING yan tümceleri ve toplama işlevleri. SQL Toplama İşlevleri

  • 29.07.2019

ISO standardı aşağıdaki beşi tanımlar: toplama işlevleri:

SAYMAK- belirtilen sütundaki değerlerin sayısını döndürür;

TOPLA- belirtilen sütundaki değerlerin toplamını döndürür;

ortalama- belirtilen sütundaki ortalama değeri döndürür;

MIN- belirtilen sütundaki minimum değeri döndürür;

MAKS- belirtilen sütundaki maksimum değeri döndürür.

Bu fonksiyonların tümü tablonun tek bir sütunundaki değerler üzerinde çalışır ve tek bir değer döndürür. COUNT, MIN ve MAX işlevleri hem sayısal hem de sayısal olmayan alanlar için geçerliyken, SUM ve AVG işlevleri yalnızca sayısal alanlarda kullanılabilir. COUNT (*) dışında, herhangi bir işlevin sonuçları değerlendirilirken, önce tüm boş değerler hariç tutulur, ardından gerekli işlem yalnızca kalan boş olmayan sütun değerlerine uygulanır. COUNT (*) seçeneği, COUNT işlevinin özel bir kullanımıdır - amacı, boş, yinelenen veya başka değerler içeren bir tablodaki tüm satırları saymaktır. Toplama işlevini kullanmadan önce yinelenen değerleri ortadan kaldırmak istiyorsanız, işlev tanımında DISTINCT anahtar sözcüğünü sütun adının önüne yerleştirin. ISO standardı, başka bir niteleyici belirtilmemişse bu anahtar kelimenin varsayılan olarak varsayılmasına rağmen, yinelenen değerlerin ortadan kaldırılmasının gerekli olmadığını açıkça belirtmek için ALL anahtar sözcüğünün kullanılmasına izin verir. DISTINCT anahtar sözcüğü, MIN ve MAX işlevleri için anlamsızdır. Bununla birlikte, kullanımı SUM ve AVG işlevlerinin yürütülmesinin sonuçlarını etkileyebilir, bu nedenle her bir özel durumda mevcut olup olmayacağını önceden düşünmelisiniz. Ayrıca DISTINCT anahtar sözcüğü her istekte en fazla bir kez belirtilebilir.

Toplama işlevlerinin yalnızca bir SELECT listesinde ve HAVING yan tümcesinde kullanılabileceğine dikkat edilmelidir (bkz. Bölüm 5.3.4). Diğer tüm durumlarda, bu işlevlerin kullanımı geçersizdir. Bir SELECT listesi bir toplama işlevi içeriyorsa ve sorgu metni, gruplar halinde veri toplama sağlayan bir GROUP BY yan tümcesi içermiyorsa, bu sütun parametresi olarak kullanılmadıkça SELECT listesinin öğelerinin hiçbiri herhangi bir sütun referansı içeremez. toplama işlevi. Örneğin, aşağıdaki istek geçersiz:

SEÇMEpersonelHayır,SAYMAK (aylık maaş)

İTİBARENKadro;

Hata, bu isteğin yapıyı içermemesidir. GRUP TARAFINDAN ve SEÇ listesindeki staffNo sütununa erişim, toplama işlevi kullanılmadan gerçekleştirilir.

Örnek 13. SAYI (*) işlevini kullanma.Kaç tane kiralık mülkün aylık 350 £ üzerinde bir kira oranına sahip olduğunu belirleyin,

SAYI SEÇ(*) AS sayısı

İTİBARENEmlakKiralık

NEREDEkira> 350;

WHERE maddesi, yalnızca aylık 350 £ 'dan fazla olan kiralık öğeleri saymakla sınırlıdır. Belirtilen koşulu karşılayan toplam kiralık mülk sayısı, COUNT toplama işlevi kullanılarak belirlenebilir. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 23.

Tablo 23

saymak

Örnek 14. COUNT (DISTINCT) işlevini kullanma.Mayıs 2001'de müşteriler tarafından kaç farklı kiralık mülkün görüntülendiğini belirleyin.

SAYI SEÇ (FARKLIözellikNo) AS sayısı

İTİBARENgörüntüleme

Yine, sorgu sonuçlarının yalnızca Mayıs 2001'de görüntülenen kiralamaları analiz edecek şekilde sınırlandırılması, WHERE yan tümcesi kullanılarak sağlanır. Belirtilen koşulu karşılayan incelenen nesnelerin toplam sayısı, COUNT toplama işlevi kullanılarak belirlenebilir. Ancak aynı nesne farklı istemciler tarafından birkaç kez görüntülenebildiğinden, yinelenen değerleri hesaplamadan çıkarmak için işlev tanımında DISTINCT anahtar sözcüğünü belirtmeniz gerekir. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 24.

Tablo 24

Örnek 16. MIN, MAXnAVG işlevlerini kullanma.Asgari, azami ve ortalama ücretlerin değerini hesaplayın.

MIN SEÇ(aylık maaş) OLARAK dakika, MAKS(aylık maaş) OLARAK maksimum, ortalama(aylık maaş) OLARAK ortalama

İTİBARENKadro;

Bu örnekte, tüm şirket personeli hakkındaki bilgileri işlemeniz gerekiyor, bu nedenle WHERE yan tümcesi kullanmanıza gerek yok. Personel tablosunun maaş sütununa uygulanan MIN, MAX ve AVG fonksiyonları kullanılarak gerekli değerler hesaplanabilir. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 26.

Tablo 26.

Sorgu yürütme sonucu

dk maksimum ortalama
9000.00 30000.00 17000.00

Gruplandırma sonuçları (GROUP BY yan tümcesi). Yukarıdaki özet veri örnekleri, genellikle raporların sonunda bulunan özet satırlarına benzer. Toplamlarda, tüm ayrıntılı rapor verileri tek bir özet satırında sıkıştırılır. Ancak, çoğu zaman raporlarda ara toplamların oluşturulması gerekir. Bu amaçla, SELECT deyiminde bir GROUP BY yan tümcesi belirtilebilir. GROUP BY yan tümcesi içeren bir sorgu çağrılır. gruplama sorgusuçünkü SEÇ işleminden elde edilen verileri gruplandırır ve ardından her bir grup için tek bir özet satırı oluşturur. GROUP BY yan tümcesinde listelenen sütunlara denir. gruplandırılmış sütunlar ISO standardı, SELECT ve GROUP BY yan tümcelerinin yakından ilişkili olmasını gerektirir. Bir SELECT deyiminde GROUP BY yan tümcesini kullanırken, SELECT listesindeki her liste öğesinin tüm grup için tek anlam. Ayrıca, bir SELECT yan tümcesi yalnızca aşağıdaki öğe türlerini içerebilir:

Sütun adları;

toplama işlevleri;

sabitler;

Yukarıdakilerin kombinasyonlarını içeren ifadeler.

SELECT listesinde listelenen tüm sütun adları, sütun adı yalnızca toplama işlevinde kullanılmadıkça GROUP BY yan tümcesinde de görünmelidir. Zıt ifade her zaman doğru değildir - GROUP BY yan tümcesi SELECT listesinde olmayan sütun adları içerebilir. WHERE yan tümcesi GROUP BY yan tümcesi ile birlikte kullanılıyorsa, önce işlenir ve yalnızca arama koşulunu karşılayan satırlar gruplanır. ISO standardı, gruplama yapıldığında tüm eksik değerlerin eşit olarak ele alındığını belirtir. Aynı gruplandırma sütunundaki iki tablo satırı, boş olmayan gruplandırılmış diğer tüm sütunlarda boş değerler ve aynı değerler içeriyorsa, aynı gruba yerleştirilir.

Örnek 17. GROUP BY yan tümcesini kullanma.Şirketin departmanlarının her birinde çalışan personel sayısını ve toplam maaşlarını belirleyin.

SEÇMEşubeHayır, SAYMAK(personelHayır) OLARAK saymak, TOPLA(aylık maaş) OLARAK toplam

İTİBARENKadro

GRUP TARAFINDANşubehayır

TARAFINDAN SİPARİŞşubeNo;

PersonelNo ve maaş sütun adlarını GROUP BY öğeleri listesine dahil etmek gerekli değildir, çünkü bunlar yalnızca toplu işlevlerle SEÇİM listesinde görünür. Aynı zamanda, SELECT yan tümcesi listesindeki branchNo sütunu herhangi bir toplama işleviyle ilişkili değildir ve bu nedenle GROUP BY yan tümcesinde belirtilmelidir. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 27.

Tablo 27

Sorgu yürütme sonucu

şubehayır Saymak toplam
B003 54000.00
B005 39000.00
B007 9000.00

Kavramsal olarak, bu istek işlenirken aşağıdaki adımlar atılır.

1. Personel tablosunun satırları şirket departman numarası sütunundaki değerlere göre gruplara ayrılmıştır. Grupların her biri içinde, şirketin departmanlarından birinin tüm personeline ilişkin veriler bulunmaktadır. Örneğimizde, Şekil 2'de gösterildiği gibi üç grup oluşturulacaktır. 1.

2. Grupların her biri için, departmandaki çalışan sayısına eşit olan toplam satır sayısı ve tüm maaşların toplamı olan maaş sütunundaki değerlerin toplamı hesaplanır. ilgilendiğimiz departman çalışanları. Ardından tüm kaynak satır grubu için tek bir özet satırı oluşturulur.

3. Sonuç tablosunun sonuç satırları, branchNo sütununda belirtilen şube numarasının artan düzeninde sıralanır.

şubehayır personelHayır Aylık maaş
V00Z SG37 12000.00
V00Z SG14 18000.00
V00Z SG5 24000.00
B005 SL21 30000.00
B005 SL41 9000.00
B007 SA9 9000.00
COUNT (personelHayır) TOPLAM (maaş)
54000.00
39000.00
9000.00

Pirinç. 1. Bir sorgu yürütülürken oluşturulan üç kayıt grubu

SQL standardı, alt sorguların SELECT listesine yerleştirilmesine izin verir. Bu nedenle, yukarıdaki sorgu aşağıdaki gibi de temsil edilebilir:

SEÇMEşubeNo, (SAYI SEÇ (personelNo)OLARAK saymak

İTİBARENPersonel

NEREDEs.branchNo = b.branchNo),

(SUM (maaş) SEÇİN toplam OLARAK

İTİBARENPersonel

NEREDEs.branchNo = b.branchNo)

İTİBARENŞube b

TARAFINDAN SİPARİŞşubeNo;

Ancak sorgunun bu versiyonunda, Şube tablosunda açıklanan şirket departmanlarının her biri için, toplama işlevlerinin hesaplanmasının iki sonucu oluşturulur, bu nedenle bazı durumlarda sıfır değerleri içeren satırlar görünebilir.

Gruplandırmayla ilgili kısıtlamalar (HAVING yapısı). HAVING yan tümcesi, bunları seçmek için belirtilen kısıtlamaları belirtmek için GROUP BY yan tümcesi ile birlikte kullanılmak üzere tasarlanmıştır. gruplar, hangi sonuç sorgu tablosuna yerleştirilecektir. HAVING ve WHERE yan tümceleri benzer sözdizimine sahip olsa da amaçları farklıdır. WHERE yan tümcesi, sonuçtaki sorgu tablosunu doldurmak için tek tek satırları seçmek için kullanılırken, HAVING yan tümcesi seçmek için kullanılır. gruplar, sonuç sorgu tablosuna yerleştirilir. ISO standardı, HAVING yan tümcesinde kullanılan sütun adlarının GROUP BY yan tümcesinde bulunmasını veya toplu işlevlerde kullanılmasını gerektirir. Pratikte, HAVING yan tümcesindeki arama terimleri her zaman en az bir toplama işlevi içerir; aksi takdirde, bu arama koşulları bir WHERE yan tümcesine yerleştirilmeli ve tek tek satırları seçmek için uygulanmalıdır. (Bir WHERE yan tümcesinde toplama işlevlerinin kullanılamayacağını unutmayın.) HAVING yan tümcesi SQL dilinin gerekli bir parçası değildir - HAVING yan tümcesi kullanılarak yazılan herhangi bir sorgu, kullanılmadan farklı şekilde temsil edilebilir.

Örnek 18. HAVING yapısını kullanma.Birden fazla çalışanı olan şirketin her departmanı için çalışan sayısını ve maaş tutarını belirleyiniz.

SEÇMEşubeHayır, KONSEY T (personelHayır) OLARAK saymak, TOPLA(aylık maaş) OLARAK toplam

İTİBARENKadro

GRUP TARAFINDANşubehayır

SAYISI OLAN(personelHayır)> 1

TARAFINDAN SİPARİŞşubeNo;

Bu örnek bir öncekine benzer, ancak burada yalnızca şirketin birden fazla kişinin çalıştığı departmanlarla ilgili bilgilerle ilgilendiğimizi gösteren ek kısıtlamalar kullanılmıştır. Gruplara da benzer bir gereksinim uygulanır, bu nedenle sorguda HAVING yan tümcesi kullanılmalıdır. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 28.

Tablo 28

şubeSayım toplamı yok
V00Z 3 54000.00
В005 2 39000,00

Alt sorgular. Bu bölümde, başka bir SELECT ifadesinin gövdesine gömülü tam SELECT ifadelerinin kullanımını tartışacağız. Harici(ikinci) SELECT ifadesi yürütme sonucunu kullanır dahili(ilk) operatör, tüm işlemin nihai sonucunun içeriğini belirler. İç sorgular, dış SELECT ifadesinin WHERE ve HAVING yan tümcelerinde bulunabilir - bu durumda bunlar adlandırılır alt sorgular, veya iç içe sorgular. Ayrıca iç SELECT deyimleri INSERT, UPDATE ve DELETE deyimlerinde kullanılabilir. . Üç tür alt sorgu vardır.

skaler alt sorgu bir sütunun bir satırla kesişiminden seçilen değeri döndürür, yani. tek anlamı. Prensip olarak, tek bir değerin gerekli olduğu her yerde bir skaler alt sorgu kullanılabilir. Skaler alt sorguların örnekleri Örnek 13 ve 14'te gösterilmektedir.

dize alt sorgusu bir tablonun birkaç sütununun değerlerini ancak tek bir satır olarak döndürür. Bir dize değeri oluşturucusunun kullanıldığı her yerde bir dize alt sorgusu kullanılabilir - genellikle tahminler. Dize alt sorgusunun bir varyantı örnek 15'te gösterilmiştir.

tablolu alt sorgu birden fazla satıra yayılmış bir tablonun bir veya daha fazla sütununun değerlerini döndürür. Tablo alt sorgusu, örneğin bir IN yükleminin işleneni olarak, bir tablonun belirtilebildiği her yerde kullanılabilir.

Örnek 19. Eşitlik denetimiyle bir alt sorgu kullanma. Makyaj yapmak 463 Main St1 adresinde bulunan şirketin şubesinde çalışan personel listesi.

SEÇME

İTİBARENKadro

NEREDEşubeNo = (dal No'yu SEÇ

İTİBARENDal

NEREDEsokak = "163 Ana S t");

163 Ana Cad. (Bir şirkette böyle bir departman vardır, bu nedenle bu örnek bir skaler alt sorgu örneğidir.) İstenen departman numarası elde edildikten sonra, o departmandaki çalışanların ayrıntılarını almak için harici bir alt sorgu yürütülür. Diğer bir deyişle, iç SELECT deyimi, tek bir "BOOV" değerinden oluşan bir tablo döndürür. Bu, 163 Ana Cad.1'de bulunan şirket şubesinin numarasıdır. Sonuç olarak, dış SELECT ifadesi aşağıdaki gibi olur:

SEÇMEpersonelNo, fName, IName, pozisyon

İTİBARENKadro

NEREDEşubeNo = "B0031;

Bu sorgunun sonuçları tabloda sunulmaktadır. 29.

Tablo 29

Sorgu yürütme sonucu

personelHayır fAd Iname konum
SG37 Anne Kayın asistan
SG14 David Ford süpervizör
SG5 suzan Marka Yönetici

Alt sorgu, içeriği harici bir operatör tarafından alınan ve işlenen geçici bir tablo oluşturmak için kullanılan bir araçtır. Karşılaştırma operatörlerinden hemen sonra bir alt sorgu belirtilebilir (yani operatörler =,<, >, <=, >=, <>) bir WHERE veya HAVING yan tümcesinde. Alt sorgu metni parantez içine alınmalıdır.

Örnek 20. Toplama işlevleriyle alt sorguları kullanma. Maaşlarının işletme için ortalama maaştan ne kadar yüksek olduğunu gösteren, ortalama ücretin üzerinde olan tüm çalışanları listeleyin.

SEÇMEpersonelNo, fName, IName, pozisyon, maaş - ( AVG'yi SEÇ(aylık maaş) İTİBAREN Kadro) OLARAK salDiff

İTİBARENKadro

NEREDEmaaş> ( AVG'yi SEÇ(aylık maaş) İTİBAREN Kadro);

Unutulmamalıdır ki, doğrudan dahil etmek sorgu ifadesi"NEREDE maaş> AVG (maaş)", toplama kullandığımız için WHERE yan tümcesindeki işlevler yasaktır. İstenen sonucu elde etmek için, ortalama yıllık maaşı hesaplayan bir alt sorgu oluşturun ve ardından, şirkette maaşları bu ortalamanın üzerinde olan çalışanlar hakkında bilgi almak için harici bir SELECT ifadesinde kullanın. Başka bir deyişle, alt sorgu, şirket için yıllık ortalama maaşı 17.000 £ 'a eşit olarak döndürür.

Bu skaler alt sorgunun sonucu, hem ücretlerin ortalamadan varyansını hesaplamak hem de çalışan bilgilerini seçmek için bir dış SELECT ifadesinde kullanılır. Bu nedenle, dış SELECT ifadesi şöyle olur:

SEÇMEpersonelNo, fName, IName, pozisyon, maaş - 17000 Olarak salDiff

İTİBARENKadro

NEREDEmaaş> 17000;

Sorgu yürütmenin sonuçları tabloda sunulmaktadır. otuz.

Tablo 30.

Sorgu yürütme sonucu

personelHayır fAd Iname konum salDiff
SL21 John Beyaz Yönetici 13000.00
SG14 David Ford süpervizör 1000.00
SG5 suzan Marka Yönetici 7000.00

Alt sorgulara uygula kurallara uymak ve kısıtlamalar.

1. ORDER BY deyimi, dış SELECT deyiminde görünse de alt sorgularda kullanılmamalıdır.

2. Bir alt sorgunun SELECT listesi, alt sorguda EXISTS anahtar sözcüğü kullanılmadıkça, tek tek sütunların adlarından veya bunlardan oluşan ifadelerden oluşmalıdır.

3. Varsayılan olarak, bir alt sorgudaki sütun adları, alt sorgunun FROM yan tümcesinde belirtilen tabloya başvurur. Ancak, dış sorgunun FROM yan tümcesinde belirtilen tablonun sütunlarına nitelikli sütun adlarını kullanarak da başvurabilirsiniz (aşağıda açıklandığı gibi).

4. Alt sorgu, karşılaştırma işleminde yer alan iki işlenenden biriyse, bu işlemin sağ tarafında alt sorgu belirtilmelidir. Örneğin, önceki örnekten bir sorgu yazma örneği, alt sorgu maaş sütununun değeri ile karşılaştırma işleminin sol tarafına yerleştirildiği için yanlıştır.

SEÇME

İTİBARENKadro

NEREDE(Personelden AVG (maaş) SEÇİN)< salary;

Örnek 21... İç içe alt sorgular ve IN yükleminin kullanımı. Şirketin 163 Ana st1 adresinde bulunan şubesi çalışanlarının kiraladığı mülklerin bir listesini yapın.

SEÇMEemlakNo, sokak, şehir, posta kodu, tip, odalar, kira

İTİBARENEmlakKiralık

BÖLÜM 5... SQL Dili: Verileri Manipüle Etme 189

NEREDEpersonelNo IN (personelNo SEÇ

İTİBARENKadro

NEREDEbrancliNo = (dal No'yu SEÇ

İTİBARENDal

NEREDEsokak = "163 Ana S t"));

İlk, en dahili sorgu, şirketin 463 Ana Cadde'de bulunan şube numarasını belirlemeye yöneliktir. İkinci, ara sorgu, bu departmanda çalışan personel hakkında bilgi getirir. Bu durumda, birden fazla veri satırı vardır. seçildi ve bu nedenle harici sorguda karşılaştırma operatörünü kullanamazsınız = Bunun yerine IN anahtar sözcüğünü kullanmalısınız.Dış sorgu, şirket çalışanlarının sorumlu olduğu kiralanan kalemler hakkında bilgi alır, verileri bir olarak elde edilir. ara sorgunun sonucu 31.

Tablo 31

Sorgu yürütme sonucu

mülkHayır sokak Kent posta kodu tip Odalar kiraya vermek
PG16 5 Novar Dr. Glasgow G129AX Düz
PG36 2 Malikane Yolu Glasgow G324QX Düz
PG21 18 Vadi Yolu Glasgow G12 ev

HERHANGİ BİR ve TÜMÜ anahtar kelimeler. ANY ve ALL anahtar sözcükleri, tek bir sayı sütunu döndüren alt sorgularla kullanılabilir. Alt sorgudan önce ALL anahtar kelimesi geliyorsa, karşılaştırma koşulu ancak sonuçta ortaya çıkan alt sorgu sütunundaki tüm değerler için karşılanırsa karşılanır. Alt sorgu metninden önce ANY anahtar kelimesi geliyorsa, alt sorgunun sonuç sütunundaki en az bir (bir veya birkaç) değer için karşılanırsa karşılaştırma koşulu yerine getirilmiş sayılır. Alt sorgu boş bir değerle sonuçlanırsa, ALL anahtar sözcüğü için karşılaştırma koşulunun yerine getirildiği ve ANY anahtar sözcüğü için karşılanmadığı kabul edilecektir. ISO standardına göre, ANY anahtar sözcüğünün eş anlamlısı olan SOME anahtar sözcüğünü de kullanabilirsiniz.

Örnek 22. HERHANGİ ve BAZI anahtar kelimelerini kullanarak. Maaşı en az maaşı aşan tüm çalışanları bulun bir "booz" numarası altında şirketin bir şubesinin çalışanı.

SEÇMEpersonelNo, fName, IName, pozisyon, maaş

İTİBARENKadro

NEREDEmaaş> BAZI (maaş SEÇ

İTİBARENKadro

NEREDEşubeNo = "B003");

Bu sorgu, "BOOZ" numarası altında departman personelinin asgari ücretini belirleyen bir alt sorgu kullanılarak yazılabilmesine rağmen, bunun ardından harici alt sorgu, şirkette maaşları bu değeri aşan tüm personel hakkında bilgi seçebilecektir (örnek bakınız). 20), SOME / ANY anahtar kelimelerini kullanmaktan oluşan başka bir yaklaşım mümkündür. Bu durumda, iç alt sorgu bir dizi değer oluşturur (12000, 18000, 24000) ve dış sorgu, maaşı bu değerlerden herhangi birinden daha yüksek olan çalışanlar hakkında bilgi seçer.

ayarla (aslında minimum değerden fazla - 12000). Bu alternatif yöntem, alt sorguda asgari ücretin tanımlanmasından daha doğal kabul edilebilir. Ancak her iki durumda da, tabloda sunulan aynı sorgu sonuçları oluşturulur. 32 .

Tablo 32

Sorgu yürütme sonucu

personelHayır fAd Iname konum aylık maaş
SL21 John Beyaz Yönetici 30000.00
SG14 David Ford süpervizör 18000.00
SG5 suzan Marka Yönetici 24000.00

Örnek 23. ALL anahtar sözcüğünü kullanma. Şirketin içki şubesinde, maaşı herhangi bir çalışanın maaşından daha fazla olan tüm çalışanları bulun.

SEÇMEpersonelNo, fName, INarae, pozisyon, maaş

İTİBARENKadro

NEREDEmaaş> HERŞEY(maaş SEÇ

İTİBARENKadro

NEREDEşubeNo = "BOG3");

Genel olarak, bu istek bir öncekine benzer. Ve bu durumda, "WOOZ" numarası altında departman personeli için maksimum maaş değerini belirleyen bir alt sorgu kullanılabilir ve ardından harici bir sorgu kullanılarak, maaşları bu değeri aşan şirketin tüm çalışanları hakkında bilgi seçilebilir. . Ancak bu örnekte ALL anahtar sözcüğü yaklaşımı seçilmiştir. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 33 .

Tablo 33

Sorgu yürütme sonucu

personelHayır Iname fAd konum aylık maaş
SL21 Beyaz John Yönetici 30000,00

Çoklu tablo sorguları. Yukarıda tartışılan tüm örnekler aynı önemli sınırlamaya sahiptir: sonuç tablosuna yerleştirilen sütunlar her zaman tek bir tablodan seçilir. Ancak, birçok durumda bu yeterli değildir. Sonuç tablosunda birkaç kaynak tablodan sütunları birleştirmek için işlemi gerçekleştirmeniz gerekir. bağlantılar. SQL'de, her tablodan seçilen bağlantılı satır çiftleri oluşturarak iki tablodaki bilgileri birleştirmek için bir birleştirme işlemi kullanılır. Birleştirilmiş tabloya yerleştirilen satır çiftleri, içinde yer alan belirtilen sütunların değerlerinin eşitliğine göre derlenir.

Birkaç tablodan bilgi almanız gerekiyorsa, bir alt sorgu uygulayabilir veya tablolar arasında birleştirme gerçekleştirebilirsiniz. Ortaya çıkan sorgu tablosunun farklı kaynak tablolardan sütunlar içermesi gerekiyorsa, tablo birleştirme mekanizmasının kullanılması önerilir. Birleştirme gerçekleştirmek için, FROM yan tümcesinde iki veya daha fazla tablonun adlarını virgülle ayırarak belirtmek ve ardından belirtilen tabloları birleştirmek için kullanılan sütunları tanımlayan WHERE yan tümcesini sorguya eklemek yeterlidir. Ayrıca tablo adları yerine kullanabilirsiniz. takma adlar, FROM yan tümcesinde kendilerine atanır. Bu durumda tablo adları ve bunlara atanan takma adlar boşluklarla ayrılmalıdır. Takma adlar, belirli bir sütunun hangi tabloya ait olduğu konusunda bir belirsizlik olduğunda sütun adlarını nitelemek için kullanılabilir. Ek olarak, tablo adlarını kısaltmak için takma adlar kullanılabilir. Bir tablo için bir takma ad tanımlanmışsa, o tablonun adını gerektiren herhangi bir yerde kullanılabilir.

Örnek 24. Basit bağlantı. Halihazırda en az bir kiralık mülk görüntüleyen ve konuyla ilgili geri bildirimde bulunan tüm müşterilerin adlarını listeleyin.

SEÇMEc.clientNo, fName, IName, propertyNo, yorum

İTİBARENMüşteri c, Görüntüleme v

NEREDEc.clientNo = v.clientNo;

Bu rapor, hem İstemci tablosundan hem de Görüntüleme tablosundan bilgi gerektirir, bu nedenle sorguyu oluştururken tablo birleştirme mekanizmasını kullanacağız. SELECT yan tümcesi, sonuç sorgu tablosuna yerleştirilmesi gereken tüm sütunları listeler. İstemci numarasına (clientNo) sahip sütunun iyileştirilmesi gerektiğini unutmayın, çünkü böyle bir sütun birleştirmeye katılan başka bir tabloda da bulunabilir. Bu nedenle hangi tablo değerleriyle ilgilendiğimizi açıkça belirtmek gerekir. (Bu örnekte, Görüntüleme tablosundan clientNo sütununun değerlerini de seçmiş olabilirsiniz). Ad, sütun adının önüne karşılık gelen tablonun (veya diğer adının) adı eklenerek iyileştirilir. Örneğimizde, Müşteri tablosu için bir takma ad olarak belirtilen "c" değeri kullanılmıştır. Ortaya çıkan satırları oluşturmak için, kaynak tabloların clientNo sütununda aynı değere sahip olan satırları kullanılır. Bu koşul, arama koşulunun.clientNo = v.clientNo ile ayarlanmasıyla belirlenir. Orijinal tablolardaki bu sütunlara denir. uyumlu sütunlar Açıklanan işlem, işleme eşdeğerdir eşitlik birleşimleri ilişkisel cebir. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 34.

Tablo 34

Sorgu yürütme sonucu

müşteriHayır fAd Iname mülkHayır Yorum
CR56 Aline Stewart PG36
CR56 Aline Stewart PA14 çok küçük
CR56 Aline Stewart PG4
CR62 Mary Tregear PA14 yemek odası yok
CR76 John Kay PG4 çok uzak

Çoğu zaman, çoklu tablo sorguları bire çok (1: *) veya üst-alt ilişkisiyle birbirine bağlanan iki tabloda gerçekleştirilir. İstemci ve Görüntüleme tablolarına erişimi içeren yukarıdaki örnekte, ikincisi tam da böyle bir ilişkiyle birbirine bağlıdır. Görüntüleme tablosundaki (alt öğe) her satır, Müşteri tablosundaki (üst öğe) yalnızca bir satıra bağlanırken, Müşteri tablosundaki (üst öğe) aynı satır bağlanabilir.

Görüntüleme tablosunun birçok satırıyla (alt). Sorgu yürütüldüğünde oluşturulan satır çiftleri, alt ve üst tablolardaki tüm geçerli satır kombinasyonlarının sonucudur. Bölüm 3.2.5, ilişkisel bir veritabanında tabloların birincil ve yabancı anahtarlarının nasıl bir "ebeveyn-alt" ilişkisi oluşturduğunu ayrıntılı olarak açıklamaktadır. Yabancı anahtarı içeren tablo genellikle bir çocuktur, birincil anahtarı içeren tablo ise her zaman ebeveyn olacaktır. Bir SQL sorgusunda üst-alt ilişkisi kullanmak için, yabancı ve birincil anahtarların karşılaştırılacağı bir arama koşulu belirtmelisiniz. Örnek 24, Client tablosunun (ClientNo ile) birincil anahtarını, Viewing tablosunun (v. ClientNo ile) yabancı anahtarıyla karşılaştırır.

SQL standardı ayrıca belirli bir bağlantıyı tanımlamak için aşağıdaki yolları sağlar:

İTİBARENile müşteri KATILMAK v'yi görüntüleme ÜZERİNDE c.clientNo = v.clientNo

İTİBARENMüşteri J OIN görüntüleme KULLANMAK müşteriHayır

İTİBARENMüşteri DOĞAL BİRLEŞTİRME görüntüleme

Her durumda, FROM yan tümcesi, orijinal FROM ve WHERE yan tümcelerinin yerini alır. Bununla birlikte, ilk seçenek iki özdeş clientNo sütununa sahip bir tablo oluştururken, diğer iki durumda ortaya çıkan tablo yalnızca bir clientNo sütunu içerecektir.

Örnek 25. Birleştirme tablolarının sonuçlarını sıralama. Şirketin her şubesi için, kiralanan tesislerden sorumlu olan personel numaralarını ve çalışanların adlarını listeleyin ve ayrıca tesisleri belirtin.

hangi cevap verirler.

SEÇMEs.branchNo, s.personelNo, fName, IName, propertyNo

İTİBARENPersonel s, PropertyForRent p

NEREDEs.personelNo = p.personelNo

TARAFINDAN SİPARİŞs.branchNo, s.personelNo, propertyNo;

Sonuçların daha kolay okunmasını sağlamak için çıktı, ana sıralama anahtarı olarak departman numarası ve ikincil anahtarlar olarak personel numarası ve özellik numarası kullanılarak sıralanır. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 35.

Tablo 35

Sorgu yürütme sonucu

şubehayır PersonelHayır fAd Iname mülkHayır
KİM SG14 David Ford PG16
KİM SG37 Anne Kayın PG21
KİM SG37 Anne Kayın PG36
BOO5 SL41 Mary Lee PL94
SBI7 SA9 Julie nasıl PA14

Örnek 26.Üç tablonun birleşimi. Şirketin her şubesi için, şubenin bulunduğu şehri ve her bir çalışanın sorumlu olduğu tesislerin numaralarını belirterek, herhangi bir kiralık tesisten sorumlu çalışanların isimlerini ve personel numaralarını listeleyin.

SEÇME b.branchNo, b.city, s.personelNo, fName, IName, propertyNo

İTİBARENŞube b, Personel s, PropertyForRent p

NEREDE b.branchNo = s.branchNo VE s.personelNo = p.personelNo

TARAFINDAN SİPARİŞ b.branchNo, s.personelNo, propertyNo;

Üç kaynak tablodaki sütunların - Branch, Staff ve PropertyForRent - sonuç tablosuna yerleştirilmesi gerekir, bu nedenle bu tabloları sorgunuzda birleştirmeniz gerekir. Şube ve Personel tabloları, şirketin şubelerini bu şubelerde çalışan personele bağlayacak olan b.branchNo = * s .branchNo maddesi kullanılarak ilişkilendirilebilir. Staff ve PropertyForRent tabloları, s.staffNo = p.staffNo koşulu kullanılarak bağlanabilir. Sonuç olarak, her çalışan sorumlu olduğu kiralık mülklerle ilişkilendirilecektir. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 36.

Tablo 36

Sorgu sonuçları

şubehayır Kent personelMo fAd Iname mülkHayır
B003 Glasgow SG14 David Ford PG16
B003 Glasgow SG37 Anne Kayın PG21
B003 Glasgow SG37 Anne Kayın PG36
B005 Londra SL41 Julie Lee PL94
B007 Aberdeen SA9 Mary nasıl PA14

SQL standardının FROM ve WHERE yan tümcelerinin alternatif bir formülasyonunu kullanmanıza izin verdiğini unutmayın:

İTİBAREN(Şube b JOIN Personel s şubeNo KULLANARAK) OLARAK bs

KATILMAKMülkForKiralık p KULLANMAK personelHayır

Örnek 27. Birden çok sütuna göre gruplama. Her çalışanın sorumlu olduğu kiralık mülk sayısını belirleyin.

SEÇMEs.şubeNo, S.personelHayır, SAYMAK(*) OLARAK saymak

KİŞİLERDEN, PropertyForRent p

NEREDE S.personelNo = p.personelNo

GRUP TARAFINDANs.şubeHayır, s.personelHayır

TARAFINDAN SİPARİŞs.şubeNo, s.personelNo;

Gerekli raporu hazırlamak için, her şeyden önce, şirket çalışanlarından hangisinin kiralanan nesnelerden sorumlu olduğunu bulmak gerekir. Bu görev, FROM / WHERE yan tümcelerinde staffNo sütunu ile Staff ve PropertyForRent tablolarının birleştirilmesiyle çözülebilir. Daha sonra GROUP BY deyiminin uygulanması gereken, çalışanlarının departman numarası ve personel sayılarından oluşan gruplar oluşturulmalıdır. Son olarak, ortaya çıkan tablo bir ORDER BY yan tümcesi belirtilerek sıralanmalıdır. Sorgu yürütmenin sonuçları tabloda sunulmaktadır. 37.

Tablo 37

Sorgu yürütme sonucu

şubehayır personelHayır saymak
V00Z SG14
V00Z SG37
B005 SL41
B007 SA9

Bağlantılar kurmak. Birleşim, adı verilen iki tablodan daha genel bir veri kombinasyonunun bir alt kümesidir. Kartezyen... İki tablonun Kartezyen ürünü, her iki tablonun parçası olan tüm olası satır çiftlerinden oluşan başka bir tablodur. Sonuç tablosundaki sütun kümesi, ilk tablodaki tüm sütunları ve ardından ikinci tablodaki tüm sütunları içerir. WHERE deyimi belirtmeden iki tabloya karşı sorgu girerseniz, sorguyu SQL ortamında yürütmenin sonucu bu tabloların Kartezyen ürünü olacaktır. Ek olarak, ISO standardı, SELECT ifadesi için iki tablonun Kartezyen çarpımını hesaplamanıza izin veren özel bir format sağlar:

SEÇ (* j sütunListesi]

TablodanNamel CROSS JOINCaeulte2

İstemci ve Görüntüleme tablolarının ortak sütun clientNo kullanılarak birleştirildiği bir örneği tekrar düşünün. Tablolarla çalışırken, içerikleri Tablo'da verilmiştir. 3.6 ve 3.8'e göre, bu tabloların Kartezyen çarpımı 20 satır olacaktır (Müşteri tablosunda 4 satır x görüntüleme tablosunda 5 satır = 20 satır). Bu, Örnek 5.24'te kullanılan sorguyu WHERE yan tümcesini uygulamadan yayınlamaya eşdeğerdir. SELECT deyimini kullanarak iki tabloyu birleştirmenin sonuçlarını içeren bir tablo oluşturma prosedürü aşağıdaki gibidir.

1. FROM yan tümcesinde belirtilen tabloların Kartezyen çarpımı oluşturulur.

2. Sorgu bir WHERE yan tümcesi içeriyorsa, arama koşullarını Kartezyen ürün tablosunun her satırına uygulayın ve tabloda yalnızca belirtilen koşulları karşılayan satırları saklayın. İlişkisel cebir açısından bu işleme denir sınırlama Kartezyen ürün.

3. Kalan her satır için, SELECT listesinde belirtilen her öğenin değeri belirlenir ve bunun sonucunda ortaya çıkan tablonun ayrı bir satırı oluşturulur.

4. Orijinal sorguda SELECT DISTINCT yan tümcesi varsa, tüm yinelenen satırlar sonuçtaki tablodan kaldırılır.

5. Yürütülmekte olan sorgu bir ORDER BY yan tümcesi içeriyorsa,


© 2015-2019 sitesi
Tüm hakları yazarlarına aittir. Bu site yazarlık iddiasında bulunmaz, ancak ücretsiz kullanım sağlar.
Sayfanın oluşturulduğu tarih: 2016-08-07

Veritabanında bulunan bilgileri özetlemek için SQL, toplu işlevler sağlar. Toplama işlevi, bağımsız değişken olarak bir veri sütununun tamamını alır ve bu sütunu belirli bir şekilde özetleyen tek bir değer döndürür.

Örneğin, AVG () toplama işlevi, argüman olarak bir sayı sütununu alır ve ortalamalarını hesaplar.

Bir Zelenograd sakininin ortalama kişi başına düşen gelirini hesaplamak için aşağıdaki sorguya ihtiyacınız var:

'ORTALAMA GELİR =', ORTA (TOPLAM) SEÇİN

SQL'in farklı türde özetler sağlayan altı toplama işlevi vardır (Şekil 1):

- SUM (), sütunda yer alan tüm değerlerin toplamını hesaplar;

- AVG (), sütunda yer alan değerler arasındaki ortalamayı hesaplar;

- MIN (), sütunda yer alan tüm değerler arasında en küçüğünü bulur;

- MAX (), sütunda yer alan tüm değerler arasında en büyüğünü bulur;

- COUNT (), sütunda bulunan değerlerin sayısını sayar;

- COUNT (*), sorgu sonuç tablosundaki satır sayısını sayar.

Bir toplama işlevinin argümanı, önceki örnekte olduğu gibi basit bir sütun adı veya aşağıdaki sorguda olduğu gibi kişi başına vergiyi hesaplayan bir ifade olabilir:

AVG SEÇ (TOPLA * 0.13)

Bu sorgu, PERSON tablosundaki her satır için (TOPLA * 0.13) değerleri içeren geçici bir sütun oluşturur ve ardından geçici sütunun ortalamasını hesaplar.

Tüm Zelenograd sakinlerinin gelir toplamı, SUM toplama işlevi kullanılarak hesaplanabilir:

KİŞİDEN SUM (TOPLA) SEÇ

Toplama işlevi, birkaç kaynak tablonun birleştirilmesiyle elde edilen bir sonuç tablosunun toplamlarını hesaplamak için de kullanılabilir. Örneğin, sakinlerin "Burs" adlı bir kaynaktan elde ettikleri toplam gelir miktarını hesaplayabilirsiniz:

TOPLAM SEÇ (PARA)

KÂRDAN, HAVE_D

NERDE PROFIT.ID = HAVE_D.ID

AND PROFIT.SOURCE = 'Burs'

MIN () ve MAX () toplama işlevleri, sırasıyla tablodaki en küçük ve en büyük değerleri bulmanızı sağlar. Ancak sütun, sayısal veya dize değerleri veya tarih veya saat değerleri içerebilir.

Örneğin, şunları tanımlayabilirsiniz:

(a) mukimler tarafından kazanılan en düşük toplam gelir ve ödenecek en yüksek vergi:

MIN (TOPLA), MAX (TOPLA * 0.13) SEÇ

(b) en yaşlı ve en genç mukim kişinin doğum tarihleri:

MIN (RDATE), MAX (RDATE) SEÇİN

(c) listedeki ilk ve en yeni sakinlerin soyadları, adları ve soyadları alfabetik olarak sıralanmıştır:

MIN (FIO), MAX (FIO) SEÇ

Bu toplama işlevlerini uygularken, sayısal verilerin aritmetik kurallara göre karşılaştırıldığını, tarihlerin sıralı olarak karşılaştırıldığını (önceki tarih değerleri sonrakilerden daha az kabul edilir), zaman aralıklarının sürelerine göre karşılaştırıldığını hatırlamanız gerekir.

Dize verileriyle MIN () ve MAX () işlevini kullanırken, iki diziyi karşılaştırmanın sonucu, kullanılan karakter kodlama tablosuna bağlıdır.

COUNT () toplama işlevi, herhangi bir türdeki bir sütundaki değerlerin sayısını sayar:

(a) 1. mikro bölgede kaç daire var?

ADR'NİN "%, 1_ _-%" GİBİ DÜZENDEN SAYI (ADR) SEÇİN

(b) kaç kişinin gelir kaynağı var?

HAVE_D'DEN SAYI SEÇİN (FARKLI NOM)

(c) Sakinler tarafından kaç gelir kaynağı kullanılıyor?

HAVE_D'DEN COUNT (DISTINCT ID) SEÇİN (DISTINCT anahtar sözcüğü, sütundaki yinelenmeyen değerlerin sayıldığını gösterir).

Özel toplama işlevi COUNT (*), veri değerlerini değil, sonuç tablosundaki satırları sayar:

(a) 2. mikro bölgede kaç daire var?

ADR GİBİ "%, 2 __-%" YERİNDEKİ SAYI SEÇİN (*)

(b) İvan İvanoviç'in kaç gelir kaynağı var?

SAYI SEÇİN (*) FROM PERSON, HAVE_D WHERE FIO = "İvanov İvan İvanoviç" VE PERSON.NOM = HAVE_D.NOM

(c) belirli bir adreste bir apartman dairesinde kaç kişi yaşıyor?

ADR = "Zelenograd, 1001-45" NEREDE KİŞİDEN SAYI SEÇİN (*)

Toplu sorguların nasıl yürütüldüğünü anlamanın bir yolu, sorgu yürütmeyi iki kısımda düşünmektir. İlk olarak, sorgunun toplu işlevler olmadan nasıl çalışacağı belirlenir ve birden çok sonuç satırı döndürülür. Toplama işlevleri daha sonra sorgu sonuçlarına uygulanır ve tek bir özet satırı döndürülür.

Örneğin, aşağıdaki karmaşık sorguyu düşünün: kişi başına ortalama toplam geliri, ikamet edenlerin toplam gelirinin toplamını ve sakinin toplam gelirinin yüzdesi olarak kaynağın ortalama gelirini bulun. Cevap operatör tarafından verilir

AVG (TOPLA), SUM (TOPLA), (100 * AVG (PARA / TOPLA)) PERSON, PROFIT, HAVE_D'DEN SEÇİN NERDE PERSON.NOM = HAVE_D.NOM VE HAVE_D.ID = PROFIT.ID

Toplama işlevleri olmadan sorgu şöyle görünür:

TOPLA, TOPLA, PARA / KİŞİDEN TOPLA SEÇİN, KÂR, HAVE_D NEREDE PERSON.NOM = HAVE_D.NOM VE HAVE_D.ID = KÂR.ID

ve her bir mukim ve belirli gelir kaynağı için bir satır sonuç döndürür. Toplama işlevleri, tek satırlı bir özet sonuçları tablosu oluşturmak için bu sorgunun sonuç tablosundaki sütunları kullanır.

Döndürülen sütunların satırında, herhangi bir sütunun adı yerine bir toplama işlevi belirtebilirsiniz. Örneğin, iki toplama işlevinin değerlerini toplayan veya çıkaran bir ifadeye dahil edilebilir:

KİŞİDEN MAKS (TOPLA) -MIN (TOPLA) SEÇ

Ancak, bir toplama işlevi, başka bir toplama işlevi için bir argüman olamaz, yani. iç içe toplama işlevlerine izin verilmez.

Ayrıca, toplama işlevleri ve normal sütun adları, döndürülen sütunlar listesinde aynı anda kullanılamaz, çünkü bunu yapmanın bir anlamı yoktur, örneğin:

KİŞİDEN FIO, SUM (TOPLA) SEÇİN

Burada, listenin ilk öğesi VTYS'ye birkaç satırdan oluşacak ve her yerleşik için bir satır içeren bir tablo oluşturma talimatı verir. Listedeki ikinci öğe, VTYS'den SUMD sütunundaki değerlerin toplamı olan bir sonuç değeri almasını ister. Bu iki yönerge birbiriyle çelişerek bir hataya neden olur.

Yukarıdakiler, alt sorguları ve sorguları gruplama ile işleme durumları için geçerli değildir.



  • Toplama işlevleri SELECT deyimindeki alan adları gibi kullanılır, bir istisna dışında: alan adını argüman olarak alırlar. Fonksiyonlar ile TOPLA ve ortalama sadece sayısal alanlar kullanılabilir. Fonksiyonlar ile COUNT, MAX ve MIN hem sayısal hem de karakter alanları kullanılabilir. Karakter alanları ile kullanıldığında MAKS ve MIN bunları ASCII eşdeğerine çevirecek ve alfabetik sıraya göre işleyecektir. Bazı DBMS'ler iç içe kümelerin kullanımına izin verir, ancak bu, tüm sonuçlarıyla birlikte ANSI standardından bir sapmadır.


Örneğin, her disiplinde sınavları geçen öğrenci sayısını hesaplayabilirsiniz. Bunu yapmak için, "Disiplin" alanına göre gruplanmış bir sorgu yürütmeniz ve sonuç olarak disiplinin adını ve bu disiplin için gruptaki satır sayısını görüntülemeniz gerekir. * karakterini COUNT işlevine argüman olarak kullanmak, gruptaki tüm satırların sayıldığı anlamına gelir.

R1 SEÇ. Disiplin, COUNT (*)

GRUP BY R1 Disiplin;

Sonuç:


SELECT R1 Disiplini, COUNT (*)

NEREDE R1. NULL puan DEĞİLDİR

GRUP BY R1 Disiplin;

Sonuç:


gruplamadan önce demetler kümesine dahil edilmeyecektir, bu nedenle "Bilgi Teorisi" disiplini için gruptaki demet sayısı 1 daha az olacaktır.

İsteği aşağıdaki şekilde yazarsanız benzer bir sonuç elde edilebilir:

R1 SEÇ. Disiplin, COUNT (R1. Değerlendirme)

R1'E GÖRE GRUPLA. Disiplin;

İşlev COUNT (ÖZELLİK ADI) bir fonksiyon yerine bir gruptaki tanımlanmış değerlerin sayısını sayar SAYMAK (*), bu, gruptaki satır sayısını sayar. Gerçekten de, "Bilgi Teorisi" disiplinine sahip grupta 4 satır olacak, ancak "Değerlendirme" özelliğinin sadece 3 belirli değeri olacaktır.


Toplama işlevlerinde boş değerleri işleme kuralları

Sütundaki herhangi bir değer eşitse BOŞ fonksiyon sonucu hesaplanırken hariç tutulurlar.

Bir sütundaki tüm değerler eşitse BOŞ, sonra Maks. Min. Toplam Ort. = BOŞ, sayı = 0 (sıfır).

Tablo boşsa, say (*) = 0 .

Toplama fonksiyonları, ön gruplama işlemi yapılmadan da kullanılabilir, bu durumda tüm ilişki bir grup olarak kabul edilir ve bu grup için grup başına bir değer hesaplanabilir.

Toplama işlevlerini yorumlama kuralları

Toplama işlevleri çıktı listesine dahil edilebilir ve ardından tüm tabloya uygulanabilir.

R1'den MAX (Puan) SEÇ seansta maksimum puanı verecek;

R1'den SUM SEÇ oturum başına tüm değerlendirmelerin toplamını verecektir;

AVG'yi (Puan) R1'den SEÇİN tüm oturum için ortalama bir puan verecektir.


2; Sonuç: "genişlik =" 640"

Oturum veritabanına (tablo R1) tekrar başvurarak, başarıyla geçen sınavların sayısını bulacağız:

COUNT (*) Olarak SEÇ kiralık _ sınavlar

NEREDE 2. Sınıf;

Sonuç:


Toplama işlevlerinin argümanı, tabloların ayrı sütunları olabilir. Örneğin bir gruptaki belirli bir sütunun farklı değerlerinin sayısını hesaplamak için sütun adı ile birlikte DISTINCT anahtar sözcüğünü kullanmak gerekir. Her disiplin için alınan farklı notların sayısını hesaplayalım:

SELECT R1 Disiplin, COUNT (DISTINCT R1 Değerlendirmesi)

NEREDE R1. NULL puan DEĞİLDİR

GRUP BY R1 Disiplin;

Sonuç:


WHERE bölümündeki açık koşulu hariç tutarsanız, aynı sonuç elde edilir, bu durumda sorgu şöyle görünecektir:

R1 SEÇ. Disiplin, COUNT (DISTINCT R1. Değerlendirme)

R1'E GÖRE GRUPLA. Disiplin;

İşlev COUNT (FARKLI R1.Değerlendirme) sadece kesin olarak kabul eder çeşitli değerler.

Bu durumda istenilen sonucun elde edilebilmesi için "Puan" sütununun veri tipinin bir ön dönüşümünün gerçek bir türe getirilmesi gerekir, o zaman ortalamanın hesaplanması sonucu bir sonuç olmayacaktır. tamsayı. Bu durumda, istek şöyle görünecektir:


2 Grup R2'ye göre. Grup, R1. Disiplin; Burada CAST () işlevi "Puan" sütununu geçerli bir veri türüne dönüştürür. "genişlik = 640"

Toplam olarak R2.Group, R1.Discipline, Count (*), Ortalama_point olarak AVG (cast (Ondalık olarak puan (3,1))) seçin

R1, R2'den

nerede R1. Tam ad = R2. İsim ve R1. puan boş değil

ve R1. 2. sınıf

R2'ye göre gruplandırın. Grup, R1. Disiplin;

Buradaki fonksiyon DÖKÜM () Puan sütununu geçerli bir veri türüne dönüştürür.


WHERE yan tümcesinde toplama işlevlerini kullanamazsınız, çünkü bu bölümdeki koşullar tek bir satır açısından değerlendirilir ve toplama işlevleri satır grupları açısından değerlendirilir.

GROUP BY yan tümcesi, belirli bir alandaki değerlerin bir alt kümesini başka bir alan açısından tanımlamanıza ve alt kümeye bir toplama işlevi uygulamanıza olanak tanır. Bu, alanları ve işlevleri tek bir SELECT yan tümcesinde birleştirmeyi mümkün kılar. Toplama işlevleri, hem SELECT satırının sonuçlarının çıktısını almak için ifadede hem de oluşturulan HAVING gruplarını işlemek için ifadede kullanılabilir. Bu durumda, seçilen her grup için her bir toplama işlevi hesaplanır. Toplama fonksiyonları hesaplanırken elde edilen değerler, karşılık gelen sonuçları görüntülemek veya grupların seçim koşulu için kullanılabilir.

Sınavlarda bir disiplinde birden fazla ikili alınan grupları görüntüleyen bir sorgu oluşturalım:


1; Sonuç: "genişlik =" 640"

R2 SEÇ. Grup

R1, R2'DEN

NEREDE R1. Tam ad = R2. Isim ve

R1 Puanı = 2

GROUP BY R2.Grup,R1.Disiplin

HAVING sayısı (*) 1;

Sonuç:


Belirli bir bankanın şubelerindeki hesaplar hakkında bilgi içeren, F ilişkisini depolayan bir F tablosundan oluşan bir "Banka" veritabanımız var:

Şubelerdeki toplam hesap bakiyesini bulun. Her dal için tablodan SUM'u seçerek her biri için ayrı bir sorgu yapabilirsiniz, ancak GROUP BY işlemi hepsini tek bir komutta koyacaktır:

SEÇME Dal , TOPLA ( kalan )

Şubeye Göre GRUP;

GRUP TARAFINDANŞube alanının değeriyle tanımlanan her grup için toplama işlevlerini bağımsız olarak uygular. Grup, aynı alan değerine sahip satırlardan oluşur Branch ve işlevi TOPLA her bir grup için ayrı ayrı uygulanır, yani toplam hesap bakiyesi her şube için ayrı ayrı hesaplanır. Uygulandığı alanın değeri GRUP TARAFINDAN, tanım gereği, bir toplama işlevinin sonucu gibi çıktı grubu başına yalnızca bir değere sahiptir.


5.000; HAVING yan tümcesindeki bağımsız değişkenler, GROUP BY kullanan SELECT yan tümcesindekiyle aynı kuralları izler. Çıkış grubu başına bir değere sahip olmaları gerekir. "genişlik = 640"

Diyelim ki sadece hesap bakiyelerinin toplam değeri 5.000 doları aşan şubeleri ve seçilen şubeler için toplam bakiyeleri seçtiğinizi varsayalım. Toplam bakiyesi 5.000 $ üzerinde olan şubeleri görüntülemek için HAVING ibaresini kullanmanız gerekir. HAVING yan tümcesi, tek tek satırlar için WHERE yan tümcesinin yaptığı gibi, belirli grupları çıktıdan çıkarmak için kullanılan ölçütleri tanımlar.

Doğru komut aşağıdaki olacaktır:

Şube SEÇ, SUM (Bakiye)

GRUP TARAFINDAN Dal

TOPLAMI OLAN ( kalan ) 5 000;

Bir cümledeki argümanlar SAHİP cümlede olduğu gibi aynı kurallara uyun SEÇME nerede kullanılır GRUP TARAFINDAN... Çıkış grubu başına bir değere sahip olmalıdırlar.


Aşağıdaki komut yasaklanacaktır:

Şube SEÇ, SUM (Bakiye)

Şubeye Göre GRUP

Açılış Tarihi = 27.12.2004 ;

Alan Açılış tarihi cümle içinde kullanılamaz SAHİPçünkü çıktı grubu başına birden fazla değere sahip olabilir. Böyle bir durumla karşılaşmamak için teklif SAHİP yalnızca seçilen kümelere ve alanlara atıfta bulunmalıdır GRUP TARAFINDAN... Yukarıdaki sorguyu yapmanın doğru bir yolu var:

Şube SEÇ, SUM (Bakiye)

NEREDE Açılış Tarihi = '27 / 12/2004'

Şubeye Göre GRUP;


Bu sorgunun anlamı şudur: 27 Aralık 2004 tarihinde açılan her bir hesap şubesi için bakiye tutarını bulun.

Daha önce belirtildiği gibi, HAVING yalnızca çıktı grubu başına aynı değere sahip argümanları kullanabilir. Uygulamada, toplama işlevlerine yapılan başvurular en yaygın olanıdır, ancak GROUP BY ile seçilen alanlar da geçerlidir. Örneğin, St. Petersburg, Pskov ve Uryupinsk şubelerinin toplam hesap bakiyelerini görmek istiyoruz:

Şube SEÇ, SUM (Bakiye)

F, Q'DAN

NEREDE F. Şube = Q. Şube

Şubeye Göre GRUP

BURADA OLMAK ('St. Petersburg', 'Pskov', 'Uryupinsk');

100.000; Toplam bakiye 100.000 dolardan fazla ise, bunu ortaya çıkan oranda göreceğiz, aksi takdirde boş bir oran elde edeceğiz. "genişlik = 640"

Dolayısıyla, HAVING deyiminin seçim koşulunda yer alan yüklemlerin aritmetik ifadelerinde, GROUP BY deyiminde yalnızca gruplama sütunları olarak belirtilen sütunların özelliklerini doğrudan kullanabilirsiniz. Sütunların geri kalanı yalnızca COUNT, SUM, AVG, MIN ve MAX toplama işlevlerinin belirtimleri içinde belirtilebilir ve bu durumda tüm satır grubu için bir toplam değer hesaplar. HAVING yan tümcesinin yürütülmesinin sonucu, yalnızca HAVING bölümündeki seçim koşulunun değerlendirilmesinin sonucunun DOĞRU olduğu satır gruplarını içeren gruplandırılmış bir tablodur. Özellikle, GROUP BY içermeyen bir sorguda HAVING yan tümcesi varsa, yürütmenin sonucu ya boş bir tablo olur ya da gruplandırma olmadan tek bir grup olarak kabul edilen tablo ifadesinin önceki bölümlerinin sonucu olur. sütunlar. Bir örneğe bakalım. Diyelim ki tüm şubeler için toplam bakiye tutarını görüntülemek istiyoruz, ancak 100.000 $ 'dan fazla ise bu durumda sorgumuz gruplama işlemlerini içermeyecek, HAVING bölümünü içerecek ve şöyle görünecektir:

TOPLAM SEÇ ( kalan )

TOPLAMI OLAN ( kalan ) 100 000;

Toplam bakiye 100.000 dolardan fazla ise, bunu ortaya çıkan oranda göreceğiz, aksi takdirde boş bir oran elde edeceğiz.


Belirli bir satıcı tarafından üretilen bilgisayar modellerinin sayısını nasıl öğrenebilirim? Aynı özelliklere sahip bilgisayarlar için ortalama fiyat nasıl belirlenir? Bazı istatistiksel bilgilerle ilgili bu ve diğer birçok soru, kullanılarak cevaplanabilir. özet (toplama) işlevleri... Standart, aşağıdaki toplu işlevleri sağlar:

Bu işlevlerin tümü tek bir değer döndürür. Bu durumda, fonksiyonlar SAYI, MIN ve MAKS herhangi bir veri türü için geçerlidir, ancak TOPLA ve ortalama yalnızca sayısal alanlar için kullanılır. İşlev arasındaki fark SAYMAK (*) ve SAYMAK (<имя поля>) ikincisinin hesaplama yaparken NULL değerleri dikkate almamasıdır.

Örnek. Kişisel bilgisayarlar için minimum ve maksimum fiyatı bulun:

Örnek. A üreticisinden temin edilebilen bilgisayarların sayısını bulun:

Örnek. A üreticisi tarafından üretilen farklı modellerin sayısıyla ilgileniyorsak, sorgu aşağıdaki gibi formüle edilebilir (Ürün tablosunda her modelin bir kez kaydedildiği gerçeğini kullanarak):

Örnek. A üreticisinden temin edilebilen farklı modellerin sayısını bulun. Sorgu, A üreticisi tarafından üretilen toplam model sayısını belirlemenin gerekli olduğu öncekine benzer. PC masası (yani satışa hazır).

İstatistiksel göstergeler elde edilirken yalnızca benzersiz değerlerin kullanılmasını sağlamak için, toplu işlevlerin argümanı kullanılabilir DISTINCT parametresi... Bir diğeri parametre TÜMÜ varsayılandır ve sütundaki tüm dönüş değerlerinin sayıldığını varsayar. Şebeke,

Üretilen PC modellerinin sayısını almamız gerekirse herüretici, kullanmanız gerekecek GROUP BY yan tümcesi sözdizimsel olarak takip WHERE cümleleri.

GROUP BY yan tümcesi

GROUP BY yan tümcesi uygulanabilecek çıktı satırı gruplarını tanımlamak için kullanılır toplama işlevleri (COUNT, MIN, MAX, AVG ve SUM)... Bu fıkra eksikse ve toplama işlevleri kullanılıyorsa, bu durumda adları belirtilen tüm sütunlar SEÇME dahil edilmelidir toplu fonksiyonlar ve bu işlevler, sorgu yüklemini karşılayan tüm satır kümesine uygulanacaktır. Aksi takdirde, SELECT listesinin tüm sütunları, içermez toplu işlevlerde, belirtilmelidir GROUP BY yan tümcesinde... Sonuç olarak, sorgunun tüm çıktı satırları, bu sütunlarda aynı değer kombinasyonlarıyla karakterize edilen gruplara ayrılır. Bundan sonra, her gruba toplama işlevleri uygulanacaktır. GROUP BY için tüm NULL değerlerinin eşit olarak kabul edildiğini, yani. NULL değerler içeren bir alan tarafından gruplandırıldığında, bu tür tüm satırlar bir gruba düşecektir.
Eğer GROUP BY yan tümcesi varsa, SELECT yan tümcesinde toplu işlev yok, sorgu her gruptan bir satır döndürür. Bu özellik, DISTINCT anahtar sözcüğüyle birlikte, sonuç kümesindeki yinelenen satırları ortadan kaldırmak için kullanılabilir.
Basit bir örneğe bakalım:
Model SEÇ, COUNT (model) Qty_model, AVG (fiyat) Avg_price olarak
PC'DEN
modele GÖRE GRUP;

Bu istekte her bir PC modeli için adeti ve ortalama maliyeti belirlenir. Aynı model değerlerine sahip tüm satırlar bir grup oluşturur ve SELECT çıktısı her grup için değer sayısını ve ortalama fiyat değerlerini hesaplar. Sorgu aşağıdaki tabloyla sonuçlanacaktır:
model Adet_model Ort_fiyat
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

SELECT'in tarih içeren bir sütunu olsaydı, bu göstergeleri her belirli tarih için hesaplamak mümkün olurdu. Bunu yapmak için, bir gruplama sütunu olarak bir tarih eklemeniz gerekir ve ardından her bir değer kombinasyonu (model-tarih) için toplama işlevleri hesaplanır.

Birkaç özel var toplu işlevleri gerçekleştirmek için kurallar:

  • Sorgu sonucunda ise hiçbir hat alınmadı(veya belirli bir grup için birden fazla satır), o zaman toplama işlevlerinden herhangi birinin hesaplanması için ilk veriler yoktur. Bu durumda, COUNT işlevlerinin yürütülmesinin sonucu sıfır olacak ve diğer tüm işlevlerin sonucu NULL olacaktır.
  • Argüman toplama işlevi kendi başına toplu işlevler içeremez(fonksiyondan fonksiyon). Onlar. tek bir sorguda maksimum ortalama değerleri elde edemezsiniz.
  • COUNT işlevini yürütmenin sonucu tam sayı(TAM SAYI). Diğer toplama işlevleri, işlenmekte olan değerlerin veri türlerini devralır.
  • SUM işlevi yürütülürken, kullanılan veri türünün maksimum değerini aşan bir sonuç elde edilirse, hata.

Yani, istek içermiyorsa GROUP BY cümleleri, sonra toplu fonksiyonlar dahil SELECT yan tümcesi, ortaya çıkan tüm sorgu satırlarında yürütülür. istek içeriyorsa GROUP BY yan tümcesi, içinde belirtilen sütun veya sütun grubu değerleriyle aynı olan her satır kümesi GROUP BY yan tümcesi, bir grup oluşturur ve toplu fonksiyonlar her grup için ayrı ayrı yapılır.

HAVING yan tümcesi

Eğer WHERE yan tümcesi satırları filtrelemek için bir yüklem tanımlar, ardından teklif SAHİBİ uygulamalı gruplamadan sonra değerlere göre benzer bir yüklem filtreleme grupları tanımlamak için toplu fonksiyonlar... Bu madde kullanılarak elde edilen değerleri test etmek için gereklidir. toplama işlevi içinde tanımlanan kayıt kaynağının ayrı satırlarından değil FROM yan tümcesi, ve bu tür hatların grupları... Bu nedenle, böyle bir çek içerilemez. WHERE yan tümcesi.

Alan değerlerinin genelleştirilmiş toplu işlemesini gerçekleştirebilir. Bu, toplama işlevleri kullanılarak yapılır. Toplama işlevleri, tablonun tüm grubu için tek bir değer üretir. SQL aşağıdaki toplama işlevlerini sağlar:

  • SAYMAK- argüman olarak belirtilen alanın NULL olmayan değerlerine sahip tablo satırlarının sayısını sayar.
  • TOPLA- verilen alanın seçilen tüm değerlerinin aritmetik toplamını hesaplar.
  • ortalama- bu alanın seçilen tüm değerlerinin ortalamasını alır.
  • MAKS- bu alan için seçilen tüm değerlerin en büyük değerini görüntüler.
  • MIN- Bu alan için seçilen tüm değerlerin en küçük değerini verir.

    Toplama işlevlerini kullanma

    Toplama işlevleri, bir sorgunun SELECT yan tümcesindeki alan adlarına benzer şekilde kullanılır, bir istisna dışında: alan adlarını argüman olarak alırlar. Yalnızca sayısal alanlar ile kullanılabilir TOPLA ve ortalama... İLE BİRLİKTE SAYMAK, MAKS, ve MIN hem sayısal hem de karakter alanları kullanılabilir. Karakter alanları ile kullanıldığında MAKS ve MIN onları ASCII eşdeğerine çevirecektir. Demek oluyor MIN ilkini seçecek ve MAKS alfabetik sıraya göre son değer.

    Satış tablosundaki toplam satışları bulmak için aşağıdaki sorguyu yazmamız gerekiyor:

    Satışlardan SUM (SSum) SEÇİN

    Sonuç olarak şunları elde ederiz:

    Bu sorgu, Sells tablosunun SNum alanındaki boş olmayan değerlerin sayısını saymıştır. İsteği aşağıdaki gibi yeniden yazarsak:

    SATIŞLARDAN SAYI SEÇ (SDate)

    Ardından, sonuç olarak şunu elde ederiz:

    COUNT OF SDTarih
    4

    SDate alanının değerlerinden biri boş bir değere sahip olduğu için görünüşte aynı hesaplandığında farklı sorgu sonuçları elde edilir ( BOŞ). Bu tür istekleri kullanırken dikkatli olun.