internet pencereler Android

Varolan işlevini kullanan sorgular. EXISTS Operatörünü Kullanma

SQL, sorguları iç içe yerleştirmenize olanak tanır. Tipik olarak, bir alt sorgu, yüklemin doğru olup olmadığını görmek için test edilen tek bir değer döndürür.

Arama koşulları türleri:
. Alt sorgu sonucuyla karşılaştırma (=, >=)
. Bir alt sorgunun sonuçlarının ait olup olmadığını kontrol etme (IN)
. Varlık testi (MEVCUT)
. Çoklu (nicel) karşılaştırma (HERHANGİ BİR, TÜMÜ)

İç içe sorgularla ilgili notlar:
. Bir alt sorgu yalnızca bir sütun seçmelidir (EXISTS yüklemi olan bir alt sorgu hariç) ve sonuç veri türü, yüklemde belirtilen değerin veri türüyle eşleşmelidir.
. Bazı durumlarda, tek bir değer elde ettiğinizden emin olmak için DISTINCT anahtar sözcüğünü kullanabilirsiniz.
. Bir alt sorguya ORDER BY ve UNION yan tümcesi ekleyemezsiniz.
. Bir alt sorgu, arama teriminin solunda veya sağında görünebilir.
. Alt sorgular, herhangi bir sayıda satır, özel bir IN yüklemi ve sütunlara dayalı ifadeler için otomatik olarak özel bir değer döndüren bir GROUP BY yan tümcesi olmadan toplama işlevlerini kullanabilir.
. Mümkün olduğunda, alt sorgular yerine JOIN tablosu birleşimleri kullanılmalıdır.

İç içe sorgular için örnekler:

* SEÇİN WHERE SNum=(SName='Motika' WHERE'deki SalesPeople'dan SNum SEÇİN)
* SEÇİN * WHERE SNum IN Siparişlerden (SalesPeople WHERE City='Londra'dan SNum SEÇİN)
* SEÇİN NEREDE SNum=(CNum=2001) YERİNDEKİ Emirlerden FARKLI SNum SEÇİN
* SEÇİN NEREDE Amt>(Odate=10/04/1990) YERİNDEKİ Siparişlerden AVG(Amt) SEÇİN
* SEÇİN NEREDE Müşteriden CNum=(SName='Serres' NEREDE SalesPeople'dan SNum+1000 SEÇİN)

2) İlgili alt sorgular

SQL'de, bir dış sorgudan tablo referansıyla alt sorgular oluşturabilirsiniz. Bu durumda, alt sorgu, dış sorgudan her tablo satırı için bir kez olmak üzere birden çok kez yürütülür. Bu nedenle, alt sorgunun bir dizin kullanması önemlidir. Alt sorgu, dıştakiyle aynı tabloya başvurabilir. Dış sorgu nispeten az sayıda satır döndürürse, ilişkili alt sorgu alakasız olandan daha hızlı çalışır. Alt sorgu az sayıda satır döndürürse, ilişkili sorgu alakasız olandan daha yavaş çalışır.

İlgili alt sorgular için örnekler:

SELECT * FROM SalesPeople Main WHERE 1(SELECT AVG(Amt) FROM FROM Orders O2 WHERE O2.CNum=O1.CNum) //bu müşteri için ortalama sipariş değerinden büyük tüm siparişleri döndürür

3) MEVCUT yüklemi

Sözdizimi formu: VAR ()

Yüklem, alt sorguyu bir argüman olarak alır ve alt sorgunun bir çıktısı varsa doğru olarak değerlendirir, aksi takdirde yanlış olarak değerlendirir. Alt sorgu bir kez yürütülür ve değerleri kontrol edilmediğinden, ancak satırların varlığının sonucu basitçe sabitlendiğinden birden fazla sütun içerebilir.

EXISTS yüklemi hakkında notlar:
. EXISTS, DOĞRU veya YANLIŞ döndüren ve tek başına veya diğer boole ifadeleriyle birlikte kullanılabilen bir yüklemdir.
. EXISTS, alt sorgusunda toplama işlevlerini kullanamaz.
. İlişkili (ilgili, bağımlı - İlişkili) alt sorgularda, EXISTS yüklemi dış tablonun her satırı için yürütülür.
. EXISTS yüklemini tablo birleşimleriyle birleştirebilirsiniz.

EXISTS yüklemine örnekler:

MEVCUT MÜŞTERİDEN * SEÇİN(SEÇ * NEREDE Müşteriden Şehir='San Jose') - herhangi biri San Jose'de yaşıyorsa tüm müşterileri döndürür.
VAR OLMAYAN YERLERDE Önce Müşteriden Farklı SNum SEÇİN (Müşterinin Gönderdiği NEREDE Send.SNum=First.SNum VE Send.CNumFirst.CNum'dan * SEÇİN) - Yalnızca bir müşteriye hizmet veren satış görevlilerinin numaralarını döndürür.
Satış Çalışanlarından F.SNum, SName, F.City SEÇİN F. MÜŞTERİ S VAR OLDUĞU YERDE (S.SNum=T.SNum VE S.CNumT.CNum VE F.SNum=S.SNum NEREDE Müşteri T'den * SEÇİN) - iadeler birkaç alıcıya hizmet veren tüm satıcıların numaraları, adları ve ikamet ettikleri şehirler.
SEÇ * SEÇİMİN VAR OLDUĞU YERDE SatışPersonelinden (SEÇ * Müşteriden Gönderim NEREDE Frst.SNum=Send.SNum VE 1

4) Nicel Karşılaştırma Tahminleri

Sözdizimi formu: (=|>|=|) HERHANGİ BİR|TÜMÜ ()

Bu yüklemler argüman olarak bir alt sorgu kullanır, ancak EXISTS yüklemine kıyasla ilişkisel yüklemlerle (=,>=) birlikte kullanılırlar. Bu anlamda, IN yüklemine benzerler, ancak yalnızca alt sorgular için geçerlidir. Standart, HERHANGİ yerine SOME anahtar sözcüğünün kullanılmasına izin verir, ancak tüm VTYS'ler bunu desteklemez.

Karşılaştırma yüklemlerine ilişkin notlar:
. Alt sorgunun yürütülmesi sırasında seçilen her değer, dış sorgu yükleminde belirtilen koşulu karşılıyorsa, ALL yüklemi TRUE olarak değerlendirilir. Çoğu zaman eşitsizliklerle birlikte kullanılır.
. Alt sorgunun yürütülmesi sırasında seçilen en az bir değer, dış sorgu yükleminde belirtilen koşulu karşılıyorsa, HERHANGİ BİR yüklemi DOĞRU olarak değerlendirilir. Çoğu zaman eşitsizliklerle birlikte kullanılır.
. Alt sorgu satır döndürmezse, TÜMÜ otomatik olarak DOĞRU (karşılaştırma koşulunun karşılandığı kabul edilir) ve HERHANGİ - YANLIŞ değerini alır.
. Herhangi bir satır için karşılaştırma DOĞRU değilse ve bir veya daha fazla boş satır varsa, HERHANGİ BİRİ UNKNOWN değerini döndürür.
. Herhangi bir satır için karşılaştırma YANLIŞ değilse ve bir veya daha fazla boş satır varsa, TÜMÜ UNKNOWN değerini döndürür.

Nicel karşılaştırma yüklemi için örnekler:

* SEÇİN * FROM SalesPeople WHERE Şehir=HERHANGİ BİR(Müşteriden Şehir SEÇİN)
SEÇİM * NEREDE TÜM SİPARİŞLERDEN (Müşteri WHERE YERİNDEN DEĞERLENDİRME SEÇİMİ Şehir='Roma')

5) Teklik yüklemi

BENZERSİZ|FARKLI ()

Yüklem, alt sorgu çıktısındaki benzersizliği (yinelenenlerin yokluğunu) kontrol etmek için kullanılır. Ayrıca UNIQUT yükleminde NULL değerlere sahip satırlar benzersiz olarak kabul edilir ve DISTINCT yükleminde iki boş değer birbirine eşit kabul edilir.

6) Maç Tahmini

KİBRİT ()

MATCH yüklemi, bir sorgu dizesinin değerinin alt sorgudan döndürülen herhangi bir dizenin değeriyle eşleşip eşleşmeyeceğini test eder. Bu alt sorgu, NULL değerlerinin bir parçası olan satırlar arasında meydana gelebilecek "kısmi" (KISMİ) eşleşmeleri işlemenize izin vermesi bakımından IN ve ANY yüklemlerinden farklıdır.

7) KİMDEN bölümündeki istekler

Aslında, bir tablo referansına izin verilen her yerde bir alt sorgu kullanmak kabul edilebilir.

Müşteriden CName, Tot_Amt SEÇİN, (CNum'a Göre Siparişler GRUBUNA GÖRE Toplam_Amt OLARAK CNum, SUM(Amt) SEÇİN) NERDE Şehir='Londra' VE Müşteri.CNum=Siparişler.CNum
//alt sorgu, her alıcı tarafından Londra'dan verilen toplam sipariş miktarını döndürür.

8) Özyinelemeli Sorgular

özyinelemeli
Q1 OLARAK SEÇİN … NEREDEN … NEREDEN …
Q2 OLARAK SEÇİN … NEREDEN … NEREDEN …

Ek olarak başvurabilirsiniz MEVCUT operatörü. Bu operatör genellikle, dış sorgu tarafından alınan değerin, iç sorgu tarafından alınan sonuç kümesinde bulunup bulunmadığını test etmek için ilişkili alt sorgularla birlikte kullanılır. Alt sorgu en az bir satır döndürürse, operatör TRUE değerini döndürür. Değer yoksa, operatör FALSE döndürür. Buna göre NOT EXISTS operatörü kullanılarak, dış sorgu tarafından alınan değerin, iç sorgu tarafından alınan sonuç kümesinde bulunmadığı kontrol edilir.

    EXISTS operatörü, bir alt sorgunun sonuç kümesindeki satırların varlığını kontrol eder.

    Alt sorgu dizesi değeri bulunursa:

    • arama iç sorguda devam etmez;

      durum TRUE olarak işaretlenir.

    Alt sorgu dizesi değeri bulunamazsa:

    • koşul YANLIŞ olarak işaretlenir;

      arama iç sorguda devam eder.

MEVCUT operatörü

Tüm mantıksal işleçler, iç içe geçmiş SELECT ifadeleriyle çalışır. Alternatif olarak, EXISTS operatörünü kullanabilirsiniz. Bu operatör genellikle, dış sorgu tarafından alınan değerin, iç sorgu tarafından alınan sonuç kümesinde bulunup bulunmadığını test etmek için ilişkili alt sorgularla birlikte kullanılır. Alt sorgu en az bir satır döndürürse, operatör TRUE değerini döndürür. Değer yoksa, operatör FALSE döndürür. Buna göre NOT EXISTS operatörü kullanılarak, dış sorgu tarafından alınan değerin, iç sorgu tarafından alınan sonuç kümesinde bulunmadığı kontrol edilir.

Novosibirsk Devlet Ekonomi ve Yönetim Akademisi

DİSİPLİN LABORATUVARI ÇALIŞTAYI

"VERİ TABANI"

Laboratuvar çalışması N 7

"SQL veritabanı dili: veri işleme komutları»

NOVOSİBİRSK 2000

SQL, Yapılandırılmış Sorgu Dili'nin kısa adıdır. Dilin adından, asıl amacının veri tabanından bilgi talepleri oluşturmak olduğu açıktır. Veri seçimi için komutlar, SQL dilinin ayrılmaz bir parçası olan veri işleme dili DML'nin temelini oluşturur. Ancak DML, bir veritabanından veri almak için kullanılan komutlardan daha fazlasını içerir. Ayrıca veri değiştirme, veri yönetimi ve diğerleri için komutlar vardır.

Bu laboratuvar, DML dilinin temellerini kapsar. Laboratuvar boyunca SQL2 standardına bağlı kalacağız.

SQL hacimli bir dil olduğu için sadece ana komutları ele alacağız. Sonraki laboratuvarlarda çeşitli belirli SQL özellikleri ele alınmaktadır.

Laboratuvar çalışması yapmak için ilişkisel veri modelinin temellerini, ilişkisel cebir ve ilişkisel hesabın temellerini ve MS SQL Server DBMS ile çalışma ilkelerini bilmeniz gerekir.

Laboratuvar çalışması sonucunda, SQL komutlarını kullanarak verileri nasıl değiştireceğinizi öğrenecek, MS SQL Server DBMS'de uygulanan dilin lehçesini göz önünde bulunduracaksınız.

GİRİŞ

SQL, hem sorgu oluşturmak hem de veritabanını güncellemek için çok çeşitli veri işleme yetenekleri içerir. Bu yetenekler, ilişkisel modelin gereksinimleriyle tutarlı olan fiziksel yapısına değil, yalnızca veritabanının mantıksal yapısına dayanır.

Başlangıçta, SQL'in sözdizimi yapısı Codd'un ilişkisel analizine dayanıyordu (veya en azından temel aldığı görülüyordu). Union, desteklenen tek ilişkisel cebir işlemiydi.

SQL2'de, önceki standartta geliştirilen benzer ilişkisel analiz sözdizimine ek olarak, işlemler birleştirme, kesişme, fark ve birleştirme doğrudan uygulanır. Seçim, projeksiyon ve ürün operasyonları neredeyse doğrudan desteklenirken (ve edilmeye devam ediliyor), bölme ve atama operasyonları daha hantal bir biçimde destekleniyor.

Önce SQL sorgu dilini, ardından veri girişi ve değiştirme işlemlerini anlatacağız. Yapıları bir dereceye kadar sorgu dilinin yapısına bağlı olduğundan, veri değiştirme işlemleri en son anlatılacaktır.

Basit Sorgular

Bizim için basit istek yalnızca bir veritabanı tablosuna erişen bir sorgu olacaktır. Basit sorgular, SQL'in temel yapısını göstermemize yardımcı olacaktır.

Basit istek. Yalnızca bir veritabanı tablosuna erişen bir sorgu.

Sorgu: Kimler sıva ustası olarak çalışır?

WHERE SKILL_TYPE = "Sıvacı"

Sonuç:

G. Rickover

Bu sorgu, en yaygın üç cümleler SQL: SEÇ, FROM ve WHERE. Örneğimizde onları farklı satırlara koysak da hepsi aynı satırda olabilir. Ayrıca farklı şekilde girintili olabilir ve tümceler içindeki sözcükler isteğe bağlı sayıda boşlukla ayrılabilir. Her bir ifadenin özelliklerini düşünün.

Seçme. SELECT yan tümcesi, sonuç tablosuna dahil edilmesi gereken sütunları listeler. Bunlar her zaman bazı ilişkisel tabloların sütunlarıdır. Örneğimizde, sonuç tablosu bir sütundan (NAME) oluşur, ancak genel olarak birkaç sütun içerebilir; ayrıca hesaplanmış değerler veya sabitler içerebilir. Bu seçeneklerin her birine örnekler vereceğiz. Sonuç tablosunun birden fazla sütun içermesi gerekiyorsa, gerekli tüm sütunlar SELECT komutundan sonra virgülle ayrılmış olarak listelenir. Örneğin, İŞÇİ_KİMLİĞİ SEÇ, ADI ifadesi, ÇALIŞAN_KİMLİĞİ ve ADI sütunlarından oluşan bir tabloyla sonuçlanacaktır.

SELECT cümlesi. Sonuç tablosunun sütunlarını belirtir.

İtibaren. FROM yan tümcesi, sorgu tarafından erişilecek bir veya daha fazla tabloyu belirtir. SELECT ve WHERE yan tümcelerinde listelenen tüm sütunlar, FROM yan tümcesinde listelenen tablolardan birinde bulunmalıdır. SQL2'de, bu tablolar şemada doğrudan temel tablolar veya veri görünümleri olarak tanımlanabilir veya kendileri SQL sorgularından kaynaklanan adsız tablolar olabilir. İkinci durumda, sorgu FROM komutunda açıkça verilir.

FROM'dan ifade. Sorgunun başvurduğu mevcut tabloları belirtir.

Neresi. WHERE yan tümcesi bir koşul içerir. tablonun satırlarının (tabloların) seçildiği temelde. Örneğimizde, SQL'deki metin sabitlerinde her zaman yapıldığı gibi, SKILL_TYPE sütununun kesme işaretleri içine alınmış "Plasterer" sabitini içermesi gerektiğidir. WHERE yan tümcesi en uçucu SQL komutudur; birçok farklı koşulu içerebilir. Sunumumuzun çoğu, WHERE yan tümcesinde izin verilen çeşitli yapıları açıklamaya ayrılacaktır.

WHERE yan tümcesi. Belirtilen tablolardan hangi satırların seçildiğini temel alan koşulu belirtir.

Yukarıdaki SQL sorgusu sistem tarafından şu sırayla işlenir: FROM, WHERE, SELECT. Yani FROM komutunda belirtilen tablonun satırları işlenmek üzere çalışma alanına yerleştirilir. WHERE yan tümcesi daha sonra sırayla her satıra uygulanır. WHERE yan tümcesini karşılamayan tüm satırlar değerlendirme dışı bırakılır. Daha sonra WHERE yan tümcesini karşılayan satırlar SELECT komutu tarafından işlenir. Örneğimizde, bu tür her bir satırdan NAME seçilir ve seçilen tüm değerler sorgu sonuçları olarak görüntülenir.

Sorgu: Ofis binaları ile ilgili tüm verileri sağlayın.

WHERE TİPİ = "Ofis"

Sonuç:

BLDG IDADDRESSTYPEQLTY LEVELSTATUS

312 Vyazov Caddesi, 123 Ofis 2 2

210 Berezovaya caddesi. 1011 Ofis Z1

111 Osinovaya caddesi. 1213 Ofis 4 1

SELECT komutundaki yıldız işareti (*), "tüm satır" anlamına gelir. Bu, sık sık kullanacağımız kullanışlı bir kısayol.

Sorgu: Her bir elektrikçinin haftalık maaşı nedir?

İSİM SEÇİN, "Haftalık maaş = ", 40 * HRLY_RATE

WHERE SKILL_TYPE = "Elektrikçi"

Sonuç:

M. Faraday Haftalık maaş = 500,00

H. Columbus Haftalık maaş = 620,00

Bu sorgu, hem karakter sabitlerinin (örneğimizde, "Haftalık maaş = ") hem de bir SELECT komutundaki hesaplamaların kullanımını gösterir. Bir SELECT komutunda, standart aritmetik operatörlerin yanı sıra sayısal sütunları ve sayısal sabitleri kullanan hesaplamaları gerçekleştirebilirsiniz. (+, -, *, /), gerektiği gibi parantez içinde gruplandırılır. Ayrıca, sorgu sonucunu belirtilen sütuna göre artan alfasayısal düzende sıralayan yeni bir ORDER BY komutu ekledik. Sonuçları azalan düzende sıralamak istiyorsanız, komuta DESC eklemeniz gerekir. ORDER BY yan tümcesi, sonuçları birden çok sütuna göre sıralayabilir, bazıları artan düzende, diğerleri azalan düzende. Önce sıralama birincil anahtar sütunu belirtilir.

karakter sabiti. Harfler, sayılar ve "özel" karakterlerden oluşan bir sabit.

Sorgu: Kimin saatlik ücreti 10 ila 12 dolar arasında?

NEREDE HRLY_RATE >= 10 VE HRLY_RATE< - 12

Sonuç:

İŞÇİ kimliği NAME HRLY_RATE SKILL_TYPE SUPV_ID

Bu sorgu, WHERE komutunun bazı gelişmiş özelliklerini gösterir: karşılaştırma operatörleri ve Boolean AND işlemi. Altı karşılaştırma operatörü (=,<>(eşit değildir),<, >, <=, >=). AND (AND), OR (OR) ve NOT (HE) Boole operatörleri, bileşik koşullar oluşturmak veya bir koşulu reddetmek için kullanılabilir. Parantezler, programlama dillerinde yaygın olduğu gibi koşulları gruplamak için kullanılabilir.

Karşılaştırma operatörleri =,<>, <, >, <=, >=.

Boole işlemleri VE (VE), VEYA (VEYA) ve DEĞİL (HE) .

Bu sorguyu formüle etmek için BETWEEN (arasında) operatörünü de kullanabilirsiniz:

10 VE 12 ARASINDA HRLY_RATE NEREDE

BETWEEN, karşılaştırılan değer verilen değerlerin her birine veya aradaki herhangi bir değere eşit olabilirse, bir değeri birincisi ikinciden küçük olan diğer iki değerle karşılaştırmak için kullanılabilir.

Sorgu: Sıvacıları, çatı ustalarını ve elektrikçileri listeleyin.

WHERE SKILL_TYPE IN ("Sıvacı", "Çatıcı", "Elektrikçi")

Sonuç:

WORKER_ID NAME HRLY_RATE SKILL_TYPE SUPV_ID

1412 C. Nemo 13.75 Alçı 1520

2920 R. Garrett 10.00 Çatı Ustası 2920

1520 G. Rickover 11.75 Alçı 1520

Bu sorgu, IN (B) karşılaştırma operatörünün kullanımını açıklar. WHERE koşulu, satırın özel tipi köşeli parantez içindeyse, yani özel tip sıvacı, çatı ustası veya elektrikçi ise doğrudur. IN operatörünü alt sorgularda tekrar göreceğiz.

Uzmanlığın yazılışını tam olarak hatırlayamadığımızı varsayalım: "elektrikçi" veya "elektronik mühendisi" veya başka bir şey. Tanımsız karakter dizelerinin yerine geçen joker karakterler, bir sorguda hatalı yazımları bulmayı kolaylaştırır.

Şablon sembolleri. Tanımsız karakter dizilerinin yerini alan karakterler.

Sorgu:İş türü Elek ile başlayan çalışanları listeleyin.

NEREDE SKILL_TYPE GİBİ ("Elek%")

Sonuç:

İŞÇİ KİMLİK ADI HRLY_RATE SKILL_TYPE SUPV_ID

1235 M.Faraday 12.50 Elektrikçi 1311

1311 H. Columbus 15.50 Elektrikçi 1311

SQL'de iki joker karakter vardır: % (yüzde) ve _ (alt çizgi). Alt çizgi, tam olarak bir tanımsız karakterin yerini alır. Yüzde, sıfırdan başlayarak rastgele sayıda karakterin yerini alır. Joker karakterler kullanıldığında, karakter değişkenlerini sabitlerle karşılaştırmak için LIKE operatörü (like) gerekir. Diğer örnekler:

"__Columbus" GİBİ İSİM

"%__K" GİBİ İSİM

NAME, ardından "Columbus" gelen iki karakterden oluşuyorsa, ilk örnekteki koşul doğrudur. WORKER tablosunda, tüm isimler bir ilk harf ve bir nokta ile başlar. Böylece, bu koşulla, biz "Columbus" soyadına sahip tüm çalışanları bulun. İkinci örneğin koşulu, soyadı "K" harfiyle başlayan tüm çalışanları bulmanızı sağlar.

Sorgu:Önümüzdeki iki hafta içinde başlayacak tüm işleri bulun.

NEREDE _DATE CURRENT_DATE İLE BAŞLANGIÇ ARASINDA

Sonuç:(Geçerli tarihin GÜNCEL TARİH = 10.10 olduğunu varsayın)

WORKER_ID BLDG_ID START_DATE NUM_DAYS

1235 312 10.10 5

1235 515 17.10 22

3231 111 10.10 8

1412 435 15.10 15

3231 312 24.10 20

1311 460 23.10 24

Bu sorgu, BETWEEN (arasında) operatörünün tarih (tarih) ve aralık (aralık) türündeki değerlerle kullanımını gösterir. CURRENT_DATE, her zaman bugünün tarihini döndüren bir işlevdir. İfade

CURRENT_DATE + ARALIK "14" GÜN

geçerli tarihe iki haftalık bir süre ekler. Bu nedenle, START_DATE sütun değeri 10/10 ile 10/24 arasındaysa ASSIGNMENT seçilir (bugün 10/10 olduğu varsayılır). Bu da tarih alanlarına aralık değerleri ekleyebileceğimizi gösteriyor. Ayrıca boşluk değerlerini tamsayı değerlerle çarpabiliriz. Örneğin, belirli sayıda hafta içinde hafta sayısının ne olacağını bulmak istediğimizi varsayalım (NUM_WEEKS (NUMBER OF WEEKS) değişkeni ile gösterilir). Bunu şu şekilde yapabiliriz:

CURRENT_DATE + ARALIK "7" GÜN * NUM_WEEKS

2. Çoklu tablo sorguları

Aynı tablonun sınırları boyunca veri öğelerini bağlama yeteneği, herhangi bir veritabanı dilinde önemlidir. İlişkisel cebirde bu işlev birleştirme işlemiyle gerçekleştirilir. SQL'in çoğu doğrudan ilişkisel hesaplamaya dayanmasına rağmen, SQL farklı tablolardan gelen verileri ilişkisel cebir birleştirme işleminin yaptığı gibi bağlar. Şimdi bunun nasıl yapıldığını göstereceğiz. Sorguyu düşünün:

Sorgu:

Yanıt için gerekli veriler iki tablodadır: WORKER ve ASSIGNMENT. SQL çözümü, FROM yan tümcesinde her iki tablonun da listelenmesini ve özel bir WHERE yan tümcesi türünün belirtilmesini gerektirir:

SKILL_TYPE SEÇ

İŞÇİDEN, GÖREVLENDİRME

WHERE WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID

VE BLDG_ID = 435

Burada neler oluyor? Belirli bir talebin sistem tarafından işlenmesinde iki aşamayı dikkate almalıyız.

1. Her zamanki gibi, FROM yan tümcesi önce işlenir. Ancak bu durumda komutta iki tablo belirtildiği için sistem bu tabloların satırlarının Kartezyen çarpımını oluşturur. Bu, bir tablonun her satırının diğer tablonun her satırıyla eşleştirildiği, her iki tablonun sütunlarından oluşan (mantıksal olarak) büyük bir tablonun oluşturulduğu anlamına gelir. Örneğimizde, WORKER tablosunun beş sütunu ve ASSIGNMENT tablosunun dört sütunu olduğundan, FROM komutu tarafından oluşturulan Kartezyen ürünü dokuz sütuna sahip olacaktır. Kartezyen çarpımının toplam satır sayısı m * n'dir, burada m, WORKER tablosundaki satır sayısıdır; ve n, ATAMA tablosundaki satır sayısıdır. İŞÇİ tablosunda 7 satır ve ATAMA tablosunda 19 satır olduğundan Kartezyen çarpımı 7x19 veya 133 satır içerecektir. FROM komutunda ikiden fazla tablo listeleniyorsa, komutta belirtilen tüm tabloların Kartezyen çarpımı oluşturulur.

Kartezyen ürün. Bir tablonun her satırının birleştirilmesinin sonucu her biri başka bir tabloda satır.

2. Dev ilişkisel tabloyu oluşturduktan sonra, sistem daha önce olduğu gibi WHERE yan tümcesini uygulamaya devam eder. FROM komutu tarafından oluşturulan tablonun her satırı. WHERE koşuluna göre kontrol edilir. Koşulu karşılamayan satırlar değerlendirme dışı bırakılır. SELECT yan tümcesi daha sonra kalan satırlara uygulanır.

Sorgumuzdaki WHERE yan tümcesi iki koşul içerir:

1. İŞÇİ. WORKER_ID = ASSIGNMENT.WORKER_ID

2.BLDG_ID = 435

Bu koşullardan ilki birleştirme koşuludur. Hem WORKER hem de ASSIGNMENT tabloları WORKER_ID adlı bir sütun içerdiğinden, Kartezyen ürünlerinin bu ada sahip iki sütun içereceğini unutmayın. Aralarında ayrım yapmak için, kaynak tablonun adını bir nokta ile ayırarak sütun adının önüne koyarız.

İlk koşul, seçilen herhangi bir satırda, WORKER tablosundaki WORKER_ID sütununun değerinin ASSIGNMENT tablosundaki WORKER_ID sütununun değeriyle eşleşmesi gerektiği anlamına gelir. Aslında WORKER_ID ile iki tabloyu birleştiriyoruz. Bu iki sütunun değerlerinin eşit olmadığı tüm satırlar ürün tablosundan çıkarılır. Bir ilişkisel cebirin doğal birleştirme işlemini gerçekleştirirken tam olarak aynı şey olur. (Ancak, doğal birleştirmeden hala bazı farklılıklar vardır: SQL, fazladan WORKER_ID sütununu otomatik olarak kaldırmaz). BLDG_ID = 435 ek koşuluyla bu iki tablonun tam birleşimi, şekil 2'de gösterilmiştir. 1. SELECT komutunun uygulanması sonunda aşağıdaki sorgu sonucunu verecektir:

BECERİ TÜRÜ

Sıvacı

çatı ustası

Elektrikçi

Pirinç. 1. İŞÇİ ve ATAMA tablolarına katılma

Şimdi size SQL'de bir tabloya nasıl katılacağınızı göstereceğiz.

Sorgu:Çalışanları yöneticilerinin adlarıyla listeleyin.

A.İŞÇİ_NAME, B.İŞÇİ_NAME SEÇ

İŞÇİ A'DAN, İŞÇİ B'DEN

NEREDE B.WORKER_ID = A.SUPV_ID

Bu örnekteki FROM yan tümcesi, WORKER tablosunun iki "kopyasını" oluşturarak onlara A ve B takma adlarını verir. Takma ad, tabloya verilen alternatif bir addır. Daha sonra WORKER tablosunun A ve B kopyaları, B'deki WORKER_ID ve A'daki SUPV_ID'nin eşit olması koşuluna bağlı olarak WHERE komutuyla bağlanır.Böylece, A'dan gelen her satır, satır yöneticisi A hakkında bilgi içeren B satırına birleştirilir (Şek. 2).

Pirinç. 2. WORKER tablosunun iki kopyasının birleştirilmesi

Her satırdan iki çalışan adı seçerek gerekli listeyi alıyoruz:

A.NAMEB.NAME

M.Faraday H.Columbus

C.Nemo G.Rickover R.Garrett R.Garrett

P. Mason P. Mason G. Rickover G. Rickover H. Columbus H. Columbus J. Avukat P. Mason

Takma ad. Tabloya verilen alternatif isim.

A.WORKER_NAME bir çalışanı temsil eder ve B.WORKER_NAME bir yöneticiyi temsil eder. Lütfen bazı çalışanların kendi yöneticileri olduğunu unutmayın; bu, WORKER_ID - SUPV_ID satırlarında gerçekleştirilen eşitlikten kaynaklanmaktadır.

SQL'de aynı anda ikiden fazla tabloyu bağlayabilirsiniz:

Sorgu

İŞÇİ_NAME SEÇ

İŞÇİDEN, GÖREVDEN, BİNADAN

WHERE WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID VE ASSIGNMENT.BLDG_ID = BUILDING.BLDG_ID VE

TİP = "Ofis"

Sonuç:

M. Faraday

G. Rickover

J. Avukat

Bir sütun adı (örneğin, WORKER_ID veya BLDG_ID) birden fazla tabloda yer alıyorsa, belirsizliği önlemek için, kaynak tablonun adıyla sütun adının önüne geçmemiz gerektiğini unutmayın. Ancak, sütun adı örneğimizdeki TYPE gibi yalnızca bir tabloda yer alıyorsa, o zaman bir belirsizlik yoktur, bu nedenle tablo adının belirtilmesine gerek yoktur.

Bu sorgudaki SQL komutları, üç ilişkisel veritabanı tablosundan bir tablo oluşturur. İlk iki tablo WORKER_ID ile birleştirilir, ardından üçüncü tablo BLDG_ID ile sonuç tablosuna birleştirilir. Koşul

TİP = "Ofis"

WHERE komutu, ofis binalarıyla ilgili satırlar dışındaki tüm satırların hariç tutulmasına neden olur. Bu, isteğin gereksinimleriyle eşleşir.

3. Alt sorgular

alt sorgu.İstek içinde istek

Bir sorgunun WHERE yan tümcesine bir alt sorgu yerleştirilebilir, böylece WHERE yan tümcesinin yetenekleri genişletilebilir. Bir örnek düşünün.

Sorgu: 435 numaralı binada görevlendirilen işçilerin özellikleri nelerdir?

SKTLL_TYPE SEÇ

WORKER_ID IN NEREDEKİ İŞÇİDEN

(İŞÇİ_Kimliğini SEÇİN

NEREDE BLDG_ID = 435)

Bu örnekte alt sorgu

(İŞÇİ_Kimliğini SEÇİN

NEREDE BLDG_ID = 435)

Bir alt sorgu içeren sorguya denir. harici istek veya ana istek. Alt sorgu, aşağıdaki çalışan kimlik(ler)i kümesiyle sonuçlanır:

İŞÇİ kimliği

harici istek. Tüm alt sorguları içeren ana sorgu.

Bu kimlik kümesi daha sonra dış sorguda bir alt sorgunun yerini alır. Bu noktadan itibaren, dış sorgu, alt sorgu tarafından oluşturulan küme kullanılarak yürütülür. Dış sorgu, WORKER tablosunun her satırını WHERE yan tümcesine göre işler. Satırın WORKER_ID'si alt sorgu tarafından oluşturulan (IN) kümesindeyse, satırın SKILL_TYPE'ı seçilir ve sonuç tablosunda görüntülenir:

BECERİ TÜRÜ

Sıvacı

çatı ustası

Elektrikçi

Alt sorgunun SELECT yan tümcesinin WORKER_ID ve yalnızca WORKER_ID'yi içermesi çok önemlidir. Aksi takdirde, WORKER_ID'nin çalışan kimlikleri kümesinde olduğu anlamına gelen dış sorgunun WHERE yan tümcesi bir anlam ifade etmeyecektir.

Alt sorgunun, ana sorgu tarafından bir satır bile dikkate alınmadan önce mantıksal olarak yürütülebileceğini unutmayın. Bir anlamda, alt sorgu ana sorgudan bağımsızdır. Tam bir sorgu olarak yürütülebilir. Böyle bir alt sorgunun ana sorgu ile ilişkili olmadığını söylüyoruz. Birazdan göreceğimiz gibi, alt sorgular ilişkilendirilebilir.

İlişkisiz alt sorgu. Değeri herhangi bir dış sorguya bağlı olmayan bir alt sorgu.

İşte bir alt sorgu içindeki bir alt sorgu örneği.

Sorgu: Ofis binalarına atanan çalışanları listeleyin.

Yine bağlantıyı öğrendiğimiz sorguyu ele alıyoruz.

İŞÇİ_MAME SEÇ

WORKER_ID IN NEREDE

(İŞÇİ_Kimliğini SEÇİN

NEREDE BLDG_ID IN

NEREDE TİP = "Ofis"))

Sonuç:

M. Faraday

G. Rickover

J. Avukat

Her bir alt sorgu bir ve yalnızca bir tabloyu işlediğinden, herhangi bir belirsizlik olmayacağından, sütun adlarının herhangi bir yerinde tablo adlarının önüne geçmemize gerek olmadığını unutmayın.

Sorgu içten dışa sırayla yürütülür. Yani, önce en içteki sorgu (veya "en alttaki") yürütülür, ardından onu içeren alt sorgu ve ardından dış sorgu yürütülür.

İlişkili Alt Sorgular. Yukarıda tartışılan tüm alt sorgular, kullanıldıkları ana sorgulardan bağımsızdı. Bağımsızlıkla, alt sorguların kendi başlarına eksiksiz sorgular olarak yürütülebileceğini kastediyoruz. Şimdi sonuçları ana sorgu tarafından değerlendirilen satıra bağlı olabilecek bir alt sorgu sınıfına dönüyoruz. Bu tür alt sorgulara ilişkili alt sorgular denir.

ilişkili alt sorgu. Sonucu ana sorgu tarafından değerlendirilen satıra bağlı olan bir alt sorgu.

Sorgu: Saatlik ücretleri yöneticilerinden daha yüksek olan çalışanları listeleyin.

İŞÇİ_NAME SEÇ

NEREDE A.HRLY_RATE >

(B.HRLY_RATE SEÇİN

NEREDE B.WORKER_ID = A.SUPV_ID)

Sonuç:

Bu sorguyu yürütmek için mantıksal adımlar şunlardır:

1. Sistem, İŞÇİ tablosunun iki kopyasını oluşturur: A kopyası ve B kopyası. Tanımladığımız şekilde A, çalışana, B ise yöneticiye atıfta bulunur.

2. Sistem daha sonra her A satırına bakar. Bu satır, WHERE yan tümcesini karşılıyorsa seçilir. Bu koşul, HRLY_RATE değeri alt sorgu tarafından oluşturulan HRLY_RATE değerinden büyükse bir satırın seçileceği anlamına gelir.

3. Alt sorgu, WORKER_ID'si şu anda ana sorgu tarafından değerlendirilmekte olan A satırının SUPV_ID değerine eşit olan B satırından bir HRLY_RATE değeri seçer. Bu, yöneticinin HRLY_RATE değeridir.

A.HRLY_RATE yalnızca bir değerle karşılaştırılabileceğinden, alt sorgunun yalnızca bir değer döndürmesi gerektiğini unutmayın. Bu değer, hangi A satırının dikkate alındığına bağlı olarak değişir. Böylece, alt sorgu ana sorgu ile ilişkilidir. Daha sonra yerleşik işlevleri keşfettiğimizde daha fazla ilişkili alt sorgu örneği göreceğiz.

EXISTS ve NOT EXISTS operatörleri

Bir binada çalışmak üzere atanmamış işçileri belirlemek istediğimizi varsayalım. Görünüşte, böyle bir talep, talebin olumlu versiyonunun reddedilmesiyle kolayca yapılabilir. Örneğin, BLDG_ID 435'e sahip bir binayla ilgilendiğimizi varsayalım. Şu sorguyu düşünün:

İŞÇİ_Kimliğini SEÇ

NEREDE BLDG_ID 435 DEĞİL

Ne yazık ki, bu çözümün yanlış ifadesidir. Sorgu bize diğer binalarda çalışan işçilerin kimliklerini verecektir. Açıkçası, bazıları 435 numaralı binaya da atanabilir.

İyi formüle edilmiş çözüm, NOT EXISTS operatörünü kullanır (mevcut değildir):

İŞÇİ_Kimliğini SEÇ

OLMAYAN YERLER

WHERE ASSIGNMENT.WORKER_ID = WORKER.WORKER_ID VE

Sonuç:

İŞÇİ_Kimliği

EXISTS ve NOT EXISTS operatörleri her zaman alt sorgunun önüne yerleştirilir. EXISTS, alt sorgu tarafından oluşturulan küme boş değilse doğru olarak değerlendirilir. Alt sorgu tarafından oluşturulan küme boşsa, EXISTS false olur. NOT EXISTS operatörü elbette tam tersi şekilde çalışır. Alt sorgunun sonucu boşsa doğrudur, aksi takdirde yanlıştır.

MEVCUT operatörü. Sonuç kümesi boş değilse true değerini döndürür.

MEVCUT DEĞİL operatörü. Sonuç kümesi boşsa true döndürür.

Bu örnekte, NOT EXISTS operatörünü kullandık. Alt sorgu, WORKER_ID'nin ana sorgu tarafından dikkate alınan satırla aynı olduğu ve BLDG_ID'nin 435 olduğu ASSIGNMENT tablosunun tüm satırlarını seçer. Bu küme boşsa, ana sorgu tarafından ele alınan çalışanın satırı seçilir, çünkü bu bu işçinin 435 numaralı binada çalışmadığı anlamına gelir.

Çözümümüzde, ilişkili bir alt sorgu kullanarak. NOT EXISTS yerine IN operatörünü kullanırsak, ilişkisiz bir alt sorgu ile idare edebiliriz:

İŞÇİ_Kimliğini SEÇ

WHERE WORKER_ID IN DEĞİL

(İŞÇİ_Kimliğini SEÇİN

NEREDE BLDG_ID = 435)

Bu çözüm, NOT EXISTS operatörüyle olan çözümden daha basittir. Doğal bir soru, neden MEVCUT DEĞİL'e ihtiyacımız var ve hiç yok. Cevap şudur ki, koşulda "her" kelimesini içeren sorguları çözmenin tek yolu VAR DEĞİLDİR. Bu tür sorgular, bölme işlemi kullanılarak ilişkisel cebirde ve evrensel niceleyici kullanılarak ilişkisel analizde çözülür. Aşağıda, koşulda "her" kelimesini içeren bir sorgu örneği verilmiştir:

Sorgu: Her binaya atanan işçileri listeleyin.

Bu soru, çift olumsuzlama kullanılarak SQL'de uygulanabilir. Sorguyu çift olumsuzu içerecek şekilde yeniden formüle edeceğiz:

Sorgu: Kimler için çalışanları listeleyin olumsuzluk atanmadıkları bir bina var.

Çift olumsuzu vurguladık. Bu sorgunun mantıksal olarak bir öncekine eşdeğer olduğu açıktır.

Şimdi SQL'de bir çözüm formüle etmek istiyoruz. Nihai çözümü anlamayı kolaylaştırmak için, önce bir ön soruna bir çözüm vereceğiz: varsayımsal işçinin "1234" olduğu tüm binaları belirleme sorunu. olumsuzluk atandı.

(I) BLDG_ID SEÇ

OLMAYAN YERLER

ASSIGNMENT.WORKER_ID = 1234)

Bu sorguyu daha sonra değineceğimiz için (I) ile etiketledik. Bu talebi karşılayan bir bina yoksa, her binaya 1234 işçisi atanır ve bu nedenle orijinal talebin koşullarını karşılar. Orijinal sorguyu çözmek için, sorguyu (I) belirli bir işçi 1234'ten WORKER_ID değişkenine genelleştirmeli ve bu değiştirilmiş sorguyu daha büyük sorgunun bir alt sorgusuna çevirmeliyiz. İşte bir çözüm:

(II) İŞÇİ_KİMLİĞİ SEÇ

OLMAYAN YERLER

OLMAYAN YERLER

WHERE ASSIGNMENT.BLDG_ID = BUILDING.BLDG_ID VE

ASSIGNMENT.WORKER_ID = WORKER.WORKER_ID)

Sonuç:

İŞÇİ kimliği

Dördüncü sorgu satırından (II) başlayan alt sorgunun, "1234"ün WORKER.WORKER_ID ile değiştirildiği sorgu (I) ile aynı olduğuna dikkat edin. Sorgu (II) aşağıdaki gibi okunabilir:

WORKER_ID atanmamış bir bina yoksa WORKER'dan WORKER_ID'yi seçin.

Bu, orijinal isteğin koşullarıyla eşleşir.

NOT EXISTS operatörünün, ilişkisel cebirde bir bölme işlemi ve ilişkisel analizde evrensel bir niceleyici gerektiren sorguları formüle etmek için kullanılabileceğini görüyoruz. Kullanım kolaylığı açısından, NOT EXISTS operatörü herhangi bir özel avantaj sağlamaz, yani NOT EXISTS'i iki kez kullanan SQL sorgularını anlamak, bölme işlemine sahip ilişkisel cebir çözümlerinden veya evrensel bir niceleyiciye sahip ilişkisel analiz çözümlerinden daha kolay değildir. Bu tür sorguları çözmenin daha doğal bir yolunu sağlayan dil yapıları oluşturmak için daha fazla araştırmaya ihtiyaç vardır.

Yerleşik İşlevler

Bu tür soruları göz önünde bulundurun:

Maksimum ve minimum saatlik ücretler nelerdir? 435 numaralı binada çalışanların ortalama çalıştığı gün sayısı nedir? Bina 312'de sıva işi için toplam gün sayısı nedir? Kaç farklı uzmanlık var?

Bu soruları yanıtlamak, birden çok tablo satırına bakan ve tek bir değer üreten toplu işlevler gerektirir. SQL'in yerleşik işlevler veya küme işlevleri adı verilen bu tür beş işlevi vardır. Bunlar SUM (toplam), AVG (ortalama), COUNT (sayım), MAX (maksimum) ve MIN (minimum) işlevleridir.

Satır içi işlev (ayar işlevi). Birden çok satırda çalışan istatistiksel işlev: SUM (toplam), AVG (ortalama), COUNT (sayım), MAX (maksimum), MIN (minimum).

Sorgu: Maksimum ve minimum saatlik ücretler nelerdir?

MAX(HRLY_RATE), MIN(HRLY_RATE) SEÇ

Sonuç: 17.40, 8.20

MAX ve MIN işlevleri, tek bir tablo sütununda çalışır. Bu sütundan sırasıyla maksimum veya minimum değeri seçerler. Sorgu formülasyonumuz WHERE yan tümcesi içermiyor. Sonraki örneğimizde gösterildiği gibi, çoğu istek için durum böyle olmayabilir.

Sorgu: 435 numaralı binada çalışanların ortalama çalıştığı gün sayısı nedir?

AVG SEÇ(NUM_DAYS)

NEREDE BLDG_ID=435

Sonuç: 12.33

Sorgu: Bina 312'de sıva işi için toplam gün sayısı nedir?

TOPLAM SEÇ(NUM_DAYS)

GÖREVDEN, İŞÇİ

WHERE WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID VE

SKILL_TYPE = "Sıvacı" VE

Sonuç: 27

Çözüm, ASSIGNMENT ve WORKER tabloları arasında bir birleştirme kullanır. SKILL_TYPE WORKER tablosunda ve BLDG_ID ASSIGNMENT tablosunda olduğundan bu gereklidir.

Sorgu: Kaç farklı uzmanlık var?

SAYI SEÇ (DISTINCT SKILL_TYPE)

Sonuç: 4

Aynı uzmanlık birkaç farklı satırda tekrarlanabileceğinden, sistemin aynı uzmanlık türünü birden fazla saymasını önlemek için bu sorguda DISTINCT (farklı) anahtar kelimesi kullanılmalıdır. DISTINCT operatörü, elbette MAX ve MIN işlevleriyle yedekli olmasına rağmen, yerleşik işlevlerden herhangi biri ile kullanılabilir.

BELİRGİN. Yinelenen satırları hariç tutan bir operatör.

SUM ve AVG işlevleri yalnızca sayısal sütunlarla kullanılmalıdır. Diğer işlevler hem sayısal hem de karakter verileriyle kullanılabilir. COUNT dışındaki tüm işlevler, hesaplanmış ifadelerle kullanılabilir. Örneğin:

Sorgu: Ortalama haftalık maaş nedir?

AVG SEÇ(40*HRLY_RATE)

Sonuç: 509.14

COUNT, yalnızca tek bir sütuna değil, tüm satıra başvurabilir :

Sorgu: Kalite seviyesi 3 olan kaç bina var?

SAYI SEÇ (*)

BİNADAN NEREDE

Sonuç: 3

Tüm bu örneklerin gösterdiği gibi, SELECT komutunda yerleşik bir işlev varsa, bu SELECT komutunda başka hiçbir şey olamaz. Bu kuralın tek istisnası, birazdan inceleyeceğimiz GROUP BY yan tümcesidir.

GROUP BY ve HAVING ifadeleri

Yönetimde, çok sayıda gruptaki her bir grup hakkında genellikle istatistiksel bilgilere ihtiyaç duyulur. Örneğin, aşağıdaki sorguyu göz önünde bulundurun:

Sorgu: Her yönetici için, astları arasındaki maksimum saatlik ücreti öğrenin.

Bu sorunu çözmek için çalışanları yöneticilerine göre gruplara ayırmalıyız. Daha sonra her gruptaki maksimum bahsi belirleyeceğiz. SQL'de şöyle yapılır:

SUPV_ID'YE GÖRE GRUPLA

Sonuç:

SUPV_IDMAX(HRLY ORAN)

Bu sorguyu işlerken sistem önce WORKER tablosunun satırlarını aşağıdaki kurala göre gruplara ayırır. Satırlar ancak ve ancak aynı SUPV_ID'ye sahiplerse aynı gruba yerleştirilir. SELECT yan tümcesi daha sonra her gruba uygulanır. Bu grupta sadece bir SUPV_ID değeri olduğu için grupta SUPV_ID belirsizliği yoktur. Her grup için, SELECT ifadesi SUPV_ID'yi verir ve ayrıca MAX(HRLY_RATE) değerini hesaplar ve verir. Sonuç yukarıda sunulmuştur.

Yerleşik işlevlere sahip bir SELECT deyiminde, yalnızca GROUP BY yan tümcesinde bulunan sütunlar oluşabilir. GROUP BY yan tümcesine dahil edildiğinden SUPV_ID'nin SELECT deyiminde kullanılabileceğini unutmayın.

GRUP TARAFINDAN. Satırların, belirtilen sütun(lar)ın ortak değerlerine sahip gruplara ayrılması gerektiğini belirtir.

GROUP BY yan tümcesi, belirli karmaşık hesaplamaları gerçekleştirmenize izin verir. Örneğin, bu maksimum tekliflerin ortalamasını bulmak isteyebiliriz. Ancak, yerleşik işlevlere sahip hesaplamalar, yerleşik işlevlerin diğer yerleşik işlevler içinde kullanımına izin verilmemesi anlamında kısıtlanmıştır. Yani şöyle bir ifade

ORTA(MAKS(HRLY_RATE))

yasaklı. Böyle bir talebin uygulanması iki aşamadan oluşacaktır. İlk önce maksimum teklifleri yeni bir tabloya koymalıyız ve ikinci adımda ortalamalarını hesaplamalıyız.

GROUP BY komutu ile WHERE komutunu kullanabilirsiniz:

Sorgu: Her bina türü için, 1. statüdeki binalar arasındaki ortalama kalite seviyesini bulun.

TÜR SEÇ, AVG(QLTY_LEVEL)

NEREDE DURUM = 1

Sonuç:

TYPEAVG(QLTY_LEVEL)

1 mağaza

konut binası 3

WHERE yan tümcesi GROUP BY komutundan önce yürütülür. Bu nedenle, hiçbir grup 1 dışında bir durumu olan bir satır içeremez. Durum 1 satırları TYPE'a göre gruplanır ve ardından her gruba bir SELECT yan tümcesi uygulanır.

SAHİBİ OLMAK. Gruplara koşul koyar.

GROUP BY yan tümcesi tarafından oluşturulan gruplara da koşullar uygulayabiliriz. Bu, HAVING yan tümcesi ile yapılır. Örneğin, önceki sorgulardan birini detaylandırmaya karar verdiğimizi varsayalım:

Sorgu: Birden fazla astı olan her yönetici için, astları arasındaki maksimum saatlik ücreti öğrenin.

Bu durumu uygun HAVING komutu ile yansıtabiliriz:

SEÇ SUPV_ID, MAX(HRLY_RATE)

SUPV_ID TARAFINDAN İŞÇİ GRUBUNDAN

SAYISI (*) > 1 OLARAK

Sonuç:

SUPV_ID MAX(HRLY_RATE)

WHERE ve HAVING yan tümceleri arasındaki fark, HAVING gruplara uygulanırken, WHERE satırlara uygulanır.

Bir sorgu hem WHERE yan tümcesi hem de HAVING yan tümcesi içerebilir. Bu durumda, gruplamadan önce değerlendirildiği için ilk olarak WHERE yan tümcesi değerlendirilir. Örneğin, önceki sorgunun aşağıdaki değişikliğini göz önünde bulundurun:

Sorgu: Her bina tipi için 1. statüdeki binalar arasındaki ortalama kalite seviyesini bulunuz. Sadece maksimum kalite seviyesi 3'ü geçmeyen bina tiplerini dikkate alınız.

TÜR SEÇİN, AVG(QLTY_JLEVEL)

NEREDE DURUM = 1

MAX(QLTY_LEVEL)<= 3

Sonuç:

TYPEAVG(QLTY_LEVEL)

1 mağaza

konut binası 3

FROM yan tümcesinden başlayarak tümcelerin sırayla yürütüldüğünü ve ardından SELECT yan tümcesinin uygulandığını unutmayın. Örneğin, BUILDING tablosuna WHERE yan tümcesi uygulanır ve STATUS'un 1 olmadığı tüm satırlar silinir. Kalan satırlar TYPE'a göre gruplandırılmıştır; aynı TYPE değerine sahip tüm satırlar aynı grupta yer alır. Bu, her TYPE değeri için bir tane olmak üzere birden çok grup oluşturur. HAVING ibaresi daha sonra her gruba uygulanır ve maksimum kalite düzeyi değeri 3'ten büyük olan gruplar çıkarılır. Son olarak, SELECT yan tümcesi kalan gruplara uygulanır.

7. Yerleşik işlevler ve alt sorgular

Yerleşik işlevler yalnızca bir SELECT yan tümcesinde veya bir HAVING deyiminde kullanılabilir. Ancak, satır içi işlev içeren bir SELECT yan tümcesi, bir alt sorgunun parçası olabilir. Böyle bir alt sorgunun bir örneğini düşünün:

Sorgu: Hangi çalışanın saatlik ücreti ortalamanın üzerindedir?

İŞÇİ_NAME SEÇ

NEREDE HRLY_RATE >

(ORTALAMA SEÇ(HRLY_RATE)

Sonuç:

H. Kolomb

Alt sorgunun ana sorgu ile ilişkili olmadığını unutmayın. Alt sorgu tam olarak bir değer döndürür - ortalama saatlik ücret. Ana sorgu, yalnızca teklifi hesaplanan ortalamadan büyükse bir çalışanı seçer.

İlişkili sorgular ayrıca yerleşik işlevleri de kullanabilir:

Soru: Aynı yöneticinin astları arasında hangi çalışanın saatlik ücreti ortalama saatlik ücretten daha yüksek?

Bu durumda, tüm çalışanlar için ortalama bir saatlik ücret hesaplamak yerine, aynı yöneticiye rapor veren her bir çalışan grubu için ortalama saatlik ücreti hesaplamamız gerekir. Ayrıca, ana sorgu tarafından ele alınan her işçi için hesaplamamız tekrar yapılmalıdır:

SEÇ A. İŞÇİ_NAME

Bu eğitimde SQL kullanmayı öğreneceksiniz. MEVCUT koşulu sözdizimi ve örneklerle.

Tanım

SQL EXISTS yan tümcesi bir alt sorgu ile birlikte kullanılır ve alt sorgu en az bir satır döndürürse tatmin olduğu kabul edilir. SELECT, INSERT, UPDATE veya DELETE deyiminde kullanılabilir.

Sözdizimi

SQL'deki EXISTS koşulunun sözdizimi şöyledir:

Seçenekler veya Bağımsız Değişkenler

alt sorgu alt sorgusu bir SELECT ifadesidir. Alt sorgu, sonuç kümesinde en az bir kayıt döndürürse, EXISTS yan tümcesi true olarak değerlendirilir ve EXISTS koşulu karşılanır. Alt sorgu herhangi bir kayıt döndürmezse, EXISTS yan tümcesi false olarak değerlendirilir ve EXISTS koşulu başarısız olur.

Not

EXISTS yan tümcesini kullanan SQL ifadeleri çok verimsizdir çünkü alt sorgu, dış sorgu tablosundaki HER satır için yeniden çalıştırılır. EXISTS yan tümcesini kullanmayan çoğu sorguyu yazmanın daha etkili yolları vardır.

Örnek - EXISTS Koşulunu bir SELECT İfadesiyle Kullanma

EXISTS koşulunun bir SELECT deyimiyle nasıl kullanılacağını gösteren bir örnekle başlayalım.

Bu örnekte, aşağıdaki verileri içeren bir müşteri tablomuz var:

Şimdi aynı customer_id ile siparişler tablosunda en az bir kaydın olduğu müşteriler tablosundan tüm kayıtları bulalım. Aşağıdaki SELECT sorgusunu çalıştırın:

4 giriş seçilecektir. İşte almanız gereken sonuçlar:

Müşteri Kimliği ilk adı Soyadı Favori İnternet Sitesi
4000 Justin Bieber google.com
5000 selena Gomez bing.com
7000 Tom Dolaşmak oracle.com
8000 Johnny Depp BOŞ

Bu örnekte, müşteriler tablosunda, siparişler tablosunda müşteri_kimliği değerine sahip 4 kayıt bulunmaktadır.

Örnek - EXISTS Koşulunu UPDATE İfadesiyle Kullanma

UPDATE deyiminde EXISTS yan tümcesini kullanan bir örneğe bakalım.
Bu örnekte, aşağıdaki verileri içeren bir ürünler tablomuz var:

Şimdi özet_veri tablosunu ürünler tablosundan alınan değerlerle güncelleyelim. Aşağıdaki SQL ifadesini girin:

PgSQL

5 kayıt güncellenecektir. Özet_veri tablosundaki verileri tekrar seçin:

PgSQL

Özet_verilerinden * SEÇİN;

Bu örnek, özet_veri tablosundaki current_category alanını, ürün_kimliği değerlerinin eşleştiği ürünler tablosundaki kategori_kimliği ile güncelleyecektir. Özet_veri tablosundaki ilk 5 kayıt güncellendi.

Komut istemi: EXISTS yan tümcesini dahil etmeseydik, UPDATE sorgusu, current_category alanını özet_veri tablosunun 6. satırında NULL olarak günceller (çünkü ürünler tablosunda product_id = 8 olan bir giriş yoktur).

Örnek - EXISTS Koşulunu DELETE İfadesiyle Kullanma

DELETE deyiminde EXISTS koşulunu kullanan bir örneğe bakalım.

Bu örnekte, aşağıdaki verileri içeren bir müşteri tablomuz var:

Aşağıdaki DELETE ifadesini girin:

PgSQL

1 giriş silinecek. Siparişler tablosundaki verileri tekrar seçin:

PgSQL

SİPARİŞLERDEN * SEÇİNİZ;

*Siparişlerden SEÇİN;

İşte almanız gereken sonuçlar.