SQL'de UNION kullanımı. UNION kümeleriyle çalışmak için operatör Sorguları birleştirme birliği

Verileri tasarım araçlarıyla birleştirme hakkında konuşmanın zamanı geldi birlik Ve hepsi birlikçünkü bu bazen çok kullanışlı oluyor, bazen de böyle bir tasarımı kullanmadan yapmak imkansız. DBMS’e örnekler yazacağız MS SQL 2008 SQL dilini kullanarak.

Ve siz ve ben zaten birçok istek yazma örneğine bakmış olduğumuz gerçeğiyle başlamak istiyorum. SQL, örneğin, SQL dilinin select ifadesi veya SQL dize işlevlerinin kullanımı, hem plpgsql hem de transact-sql'de programlama olarak kabul edilir, örneğin, PL/pgSQL ve Transact-sql'de bir işlev nasıl yazılır - Tablo işlevleri ve sırasıyla geçici tablolar.

Yukarıdaki makaleleri bir nedenden dolayı belirttim, ancak bunları belirttim çünkü bugünün dersini daha iyi anlamak ve özümsemek için, yukarıda belirtilen materyalden alabileceğiniz temel bilgilere (bu, acemi programcılar için bir sitedir) ihtiyacınız var.

Öyleyse başlayalım. Ve öncelikle bu union ve union tüm operatörlerin ne olduğuna bakalım.

SQL'de UNION ve UNION ALL nedir?

  • BİRLİK birden fazla sorgunun sonuç kümesini birleştiren bir SQL ifadesidir ve bu operatör, sorgulardaki yalnızca benzersiz satırların çıktısını verir; örneğin, iki sorguyu birleştiriyorsunuz ve bunların her biri aynı verileri içeriyor, başka bir deyişle tamamen aynı ve birleşim operatörü, kopya olmaması için bunları tek bir satırda birleştirecek;
  • BİRLİK TÜMÜçeşitli sorgulardan oluşan veri kümesini birleştirmek için kullanılan bir SQL operatörüdür, ancak bu operatör kesinlikle tüm satırların, hatta kopyaların çıktısını verecektir.

Birleşim ve tüm operatörlerin birleşmesi için önkoşullar

  1. Alan seti şu şekilde olmalıdır: Aynı tüm isteklerde, yani. her talepte birlik veya birlik kullanılarak birleştirilecek alanların sayısı tüm inşaatlarda aynı olmalıdır;
  2. Veri tipleri alanların her istekte de eşleşmesi gerekir; örneğin veri türü int olan ve ikinci sorguda veri türü varchar olan bir sorgu yazmak istiyorsanız sorgunuz yürütülmeyecek ve sorgu penceresinde bir hata görüntülenecektir;
  3. Sıralama durumunda operatör tarafından sipariş yalnızca belirtebilirsiniz son istekten sonra.

Şimdi bu operatörleri ne zaman kullanmamız gerekebileceğinden bahsedelim. Örneğin, her biri örneğin bir şube için oluşturulmuş benzer yapıya sahip birkaç veri tabanınız var ve tüm şubeler için yönetime raporlama sağlamak için bu verileri birleştirmeniz gerekiyor ve bunu yapmanın en kolay yolu SQL'de her biri farklı veritabanlarına erişecek sorgular yazmak ve bunları birleştirmek için birlik veya birlik tüm yapısını kullanmaktır. Ayrıca bazen verileri sıradan birleşimlerle sağlanamayacak şekilde tek bir veritabanında birleştirmek gerekir ve bir birleşim kullanmak zorunda kalırsınız. "Zorunlu" dememin nedeni, bu yapının, örneğin çok fazla veri varsa ve onu kötüye kullanmaya gerek yoksa, sorgu yürütme süresini önemli ölçüde arttırmasıdır.

Bu kadar teori yeter, hadi pratiğe geçelim.

Not! Daha önce de belirttiğimiz gibi SQL Server 2008 için Management Studio'da sorgular yazacağız.

Birleşim ve birleşim tümünü kullanma örnekleri

Öncelikle iki basit tablo oluşturalım: test_table ve test_table_2

TABLO OLUŞTURUN ( KİMLİK(1,1) NULL DEĞİL, (18, 0) NULL, (50) NULL, CONSTRAINT BİRİNCİL ANAHTAR KÜMELENMİŞ ( ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ) ON GO SET ANSI_PADDING OFF GO --ve ikinci tablo CREATE TABLE ( IDENTITY(1,1) NOT NULL, (18, 0) NULL, (50) NULL, CONSTRAINT PRIMARY KEY CLUSTERED ( ASC)WITH ( ( PAD_INDEX = KAPALI, STATISTICS_NORECOMPUTE = KAPALI, IGNORE_DUP_KEY = KAPALI, ALLOW_ROW_LOCKS = AÇIK, ALLOW_PAGE_LOCKS = AÇIK) ON) ON GO SET ANSI_PADDING OFF GO GO

Mesela aynılar, sadece isimleri farklı. Bunları aşağıdaki verilerle doldurdum:

Şimdi ortaya çıkan verileri örneğin bir birleşim yoluyla tek bir veride birleştirecek bir sorgu yazalım. Sözdizimi çok basittir:

İstek 1 birleşim İstek 2 birleşim İstek 3, vb.

İşte talep:

Sayı seçin, test_table birleşiminden metin seçin, test_table_2'den metin seçin

Gördüğünüz gibi ilk istekteki ilk satır ile ikinci istekteki ilk satır aynı olduğundan sadece 5 satır görüntülendi, yani birleştirildi.

Şimdi hepimiz birlik yoluyla birleşelim

İşte talep:

Sayı seçin, test_table birleşiminden metin seçin, tüm sayıyı seçin, test_table_2'den metin seçin

Tüm satırların birleşimini belirttiğimizden beri tüm satırlar zaten burada görüntüleniyor.

Şimdi bu basit istekte bile hangi hataların oluşabileceğine bakalım. Örneğin alanların sırasını karıştırdık:

Ya da ilk istekte ek alan belirttik ama ikincisinde bunu yapmadık.

Ayrıca, örneğin order by kullanıldığında:

Burada her istekte sıralamayı belirledik, ancak bu yalnızca sonuncusunda gerekliydi, örneğin:

Numarayı seçin, test_table birleşiminden metin seçin tüm numarayı seçin, test_table_2'den metin numaraya göre sıralayın

Ve son olarak, örneğin, bir istekte hala bir alanı görüntülemeniz gerektiğinde, ancak diğerlerinde orada olmadığında veya sadece gerekli olmadığında kullanılabilecek bir numaradan bahsetmek istedim, bunun için yazabilirsiniz aşağıdaki istek:

test_table birleşiminden kimlik, sayı ve metni seçin, tümü test_table_2'den "", sayı ve metni seçin

onlar. Gördüğünüz gibi, alanı olması gereken yere boş bırakın; istek mükemmel şekilde çalışacaktır, örneğin:

Muhtemelen tasarım hakkında sana söylemek istediğim her şey tüm SQL dilinin birliği ve birliği Bu operatörlerin kullanımıyla ilgili sorularınız varsa yorumlarda sorun dedim. İyi şanlar!

Derste birleşim, kesişim ve fark sorgularının işlemlerinin kullanılması konusu ele alınacaktır. Nasıl kullanıldığına dair örnekler SQL sorgusu Union, Exists ve SOME, ANY ve All anahtar kelimelerinin kullanımı. Kapsanan dize işlevleri


Bir set üzerinde birleşim, fark ve kartezyen çarpım işlemlerini gerçekleştirebilirsiniz. Aynı işlemler sql sorgularında da kullanılabilir (sorgularla işlem yapma).

Birkaç sorguyu birleştirmek için özel bir kelime kullanılır BİRLİK.
Sözdizimi:

< запрос 1 >BİRLİK[TÜMÜ]< запрос 2 >

<запрос 1>BİRLİK<запрос 2>

Union SQL sorgusu, her sorgunun çıktı satırlarını tek bir sonuç kümesinde birleştirmek için kullanılır.

Kullanıldıysa parametre TÜMÜ, ardından tüm yinelenen çıktı satırları kaydedilir. Parametre eksikse sonuç kümesinde yalnızca benzersiz satırlar kalır.

İstediğiniz sayıda sorguyu bir araya getirebilirsiniz.

UNION operatörünün kullanılması çeşitli koşulların karşılanmasını gerektirir:

  1. her sorgunun çıktı sütunlarının sayısı aynı olmalıdır;
  2. her sorgunun çıktı sütunları veri türüne göre (öncelik sırasına göre) birbiriyle karşılaştırılabilir olmalıdır;
  3. sonuçta ortaya çıkan küme, ilk sorguda belirtilen sütun adlarını kullanır;
  4. ORDER BY birleştirmenin sonucu için geçerli olduğundan yalnızca bileşik sorgunun sonunda kullanılabilir.

Örnek: Bilgisayar ve dizüstü bilgisayarların fiyatlarını ve sayılarını görüntüleyin (ör. tek sorguda iki farklı tablodan yükleme yapın)


✍ Çözüm:
1 2 3 4 5 6 PC UNION'DAN `Numara`, `Fiyat` SEÇİN Notebook'TAN `Numara`, `Fiyat` SEÇİN `Fiyat`a GÖRE SİPARİŞ VERİN

PC UNION'DAN `Numara`, `Fiyat` SEÇİN Notebook'TAN `Numara`, `Fiyat` SEÇİN `Fiyat`a GÖRE SİPARİŞ VERİN

Sonuç:

İç birleştirmeyle daha karmaşık bir örneğe bakalım:

Örnek: Bilgisayar ve dizüstü bilgisayarların ürün tipini, sayısını ve fiyatını bulun


✍ Çözüm:
1 2 3 4 5 6 7 8 Ürünü seç. 'Tip', pc. `Numara`, `Fiyat` PC'DEN İÇ KATIL ürünü PC'DE. 'Sayı' = ürün. `Numara` UNION SELECT ürünü. 'Tip', not defteri. `Numara`, `Fiyat` Notebook'tan INNER JOIN ürünü notebook'a. 'Sayı' = ürün. `Numara` `Fiyat`a GÖRE SİPARİŞ

Ürün SEÇİN.`Tür`, pc.`Numara`, `Fiyat` PC'DEN INNER JOIN ürünü PC'DE.`Numara` = ürün.`Numara` UNION SEÇİM ürünü.`Tür`, dizüstü bilgisayar.`Numara`, `Fiyat` FROM notebook INNER JOIN ürün ON notebook.`Number` = ürün.`Numara` SİPARİŞ `Fiyat`a Göre

Sonuç:

SQL Birliği 1. Tüm dizüstü bilgisayarların ve yazıcıların üreticisini, parça numarasını ve fiyatını bulun

SQL Birliği 2.Üretici Rusya tarafından üretilen tüm ürünlerin adetlerini ve fiyatlarını bulun

SQL Varlığı Yüklemi MEVCUTTUR

SQL, sorgularda kesişim ve fark işlemlerini gerçekleştirmek için olanaklara sahiptir; INTERSECT yan tümcesi (kesişme) ve EXCEPT yan tümcesi (fark). Bu cümleler UNION'un çalışma şekline benzer şekilde çalışır: sonuç kümesi yalnızca her iki sorguda da bulunan satırları (INTERSECT) veya yalnızca ilk sorgunun ikinci sorguda eksik olan satırlarını (EXCEPT) içerir. Ancak sorun şu ki, birçok DBMS bu önerileri desteklemiyor. Ancak EXISTS yüklemini kullanarak bir çıkış yolu var.

Alt sorgu en azından bazı satırları döndürürse EXISTS yüklemi TRUE olarak değerlendirilir; aksi takdirde EXISTS, FALSE olarak değerlendirilir. Bunun tersini yapan NOT EXISTS yüklemi de vardır.

Genellikle EXISTS bağımlı alt sorgularda (örneğin IN) kullanılır.

EXISTS(tablo alt sorgusu)

Örnek: Dizüstü bilgisayarlar da üreten bilgisayar üreticilerini bulun


✍ Çözüm:

Üreticiyi üründen farklı olarak pc_product AS pc_product WHERE Tür = "Bilgisayar" VE MEVCUT OLARAK SEÇİN (Üründen Üreticiyi SEÇİN WHERE Tür = "Dizüstü Bilgisayar" VE Üretici = pc_product.Manufacturer)

Sonuç:

Yazıcı yapmayan bilgisayar üreticilerini bulun

SQL BAZI Anahtar Kelimeler | HERHANGİ BİRİ ve TÜMÜ

BAZI ve HERHANGİ anahtar kelimeler eşanlamlıdır, dolayısıyla sorgunuzda bunlardan herhangi birini kullanabilirsiniz. Böyle bir sorgunun sonucu bir sütun değer olacaktır.

Sözdizimi:

< выражение>< оператор сравнения>BAZI | HERHANGİ (< подзапрос> )

<выражение><оператор сравнения>BAZI | HERHANGİ (<подзапрос>)

Bir alt sorgudan döndürülen herhangi bir X değeri için " " işleminin sonucu TRUE değerini döndürürse, ANY yüklemi de TRUE olarak değerlendirilir.

Örnek: Numaraları satışta olmayan (yani bilgisayar tablosunda olmayan) bilgisayar tedarikçilerini bulun


✍ Çözüm:

Tablo kaynağı verileri:

Sonuç:

Örnekte, Number = ANY(PC'den Sayı SEÇ) yüklemi, ana sorgudaki Sayı, bilgisayar tablosunun Sayıları listesinde (alt sorgu tarafından döndürülen) bulunduğunda TRUE değerini döndürecektir. Ayrıca NOT kullanılmaz. Sonuç kümesi bir sütundan oluşacaktır - Üretici. Bir üreticinin birkaç kez görüntülenmesini önlemek için DISTINCT hizmet sözcüğü eklenmiştir.
Şimdi ALL anahtar sözcüğünü kullanmaya bakalım:

Örnek: Herhangi bir bilgisayardan daha pahalı olan dizüstü bilgisayarların sayısını ve fiyatlarını bulun


✍ Çözüm:

Önemli: Genel olarak ANY ile yapılan bir sorgunun bir dizi değer döndürdüğünü belirtmekte fayda var. Bu nedenle, WHERE yan tümcesinde bir Boolean değeri üreten EXISTS, IN, ALL ve ANY operatörleri olmadan bir alt sorgu kullanmak, sorgu çalışma zamanı hatasıyla sonuçlanabilir


Örnek: Maliyeti dizüstü bilgisayarların minimum maliyetini aşan bilgisayarların sayısını ve fiyatlarını bulun


✍ Çözüm:


Bu sorgu doğrudur çünkü Fiyat skaler ifadesi tek bir değer döndüren bir alt sorguyla karşılaştırılır.

SQL'de dizelerle çalışma işlevleri

LEFT işlevi, bir dizenin solundan ikinci bağımsız değişken tarafından belirtilen karakter sayısını keser:

SOL (<строка>,<число>)

RIGHT işlevi, bir dize ifadesinden sağa doğru belirtilen sayıda karakteri döndürür:

SAĞ(<строка>,<число>)

Örnek: Tüm üreticilerin adlarının ilk harflerini yazdırın


✍ Çözüm:

"Ürün"DEN DISTINCT SOL('Üretici', 1) SEÇİN

Sonuç:

Örnek: Aynı harfle başlayan ve biten üretici adlarını yazdırın


✍ Çözüm:

SQL Değiştirme İşlevi

Sözdizimi:

`öğretmenler'DEN `isim` SEÇİN, REPLACE(`isim`, "a", "aa")

SQL UNION ifadesi iki veya daha fazla SELECT ifadesinin sonucunu birleştirir.

SQL UNION Operatörü

UNION operatörü, iki veya daha fazla SELECT ifadesinin birden çok sonucunu birleştirmek için kullanılır.

Bir birleşim içindeki her ZELEST ifadesinin aynı sayıda sütuna sahip olması gerektiğini unutmayın. Sütunların da aynı veri türlerine sahip olması gerekir. Ayrıca her SELEST'teki sütunların aynı sırada olması gerekir.

SQL UNION Sözdizimi

SEÇME sütun_adı(ları)İTİBAREN tablo 1
BİRLİK
SEÇME sütun_adı(ları)İTİBAREN Tablo 2 ;

Not: UNION operatörü yalnızca farklı varsayılan değerleri seçer. Yinelenen değerlere izin vermek için ALL anahtar sözcüğünü UNION ile birlikte kullanın.

SQL UNION ALL Sözdizimi

SEÇME sütun_adı(ları)İTİBAREN tablo 1
BİRLİK TÜMÜ
SEÇME sütun_adı(ları)İTİBAREN Tablo 2 ;

Not: Bir birleşimdeki sorguların sonuçlarındaki sütun adları genellikle birleşimdeki ilk ZEBEST'teki sütun adlarına eşittir.

Veritabanının demo sürümü

Bu eğitimde iyi bilinen Northwind veritabanını kullanacağız.

Aşağıda "Müşteriler" tablosundan bir seçim yer almaktadır:

Kullanıcı kimliğiMüşterinin adıİrtibat kişisiAdresşehirPosta koduBir ülke
1 Alfred's Futterkiste Maria Anders Obere Cad. 57 Berlin 12209 Almanya
2 Ana Trujillo Emparedados ve helados Ana Trujillo Avda. 2222 Anayasası Meksika df. 05021 Meksika
3 Antonio Moreno Taqueria Antonio Moreno Mataderos 2312 Meksika df. 05023 Meksika

Ve "Tedarikçiler" tablosundan seçim:

SQL UNION Örneği

Aşağıdaki SQL - tüm ifadeyi seç çeşitli"Müşteriler" ve "Tedarikçiler" tablolarından şehirler (yalnızca bireysel değerler):

Not: UNION, iki tablodaki tüm şehirleri listelemek için kullanılamaz. Aynı şehirlerde birden fazla müşteri ve tedarikçi varsa her şehir yalnızca bir kez listelenecektir. UNION yalnızca belirli değerleri seçer. UNION ALL'ı kullanarak aynı zamanda yinelenen değerleri de seçin!

SQL UNION ALL Örneği

herkes(yinelenen değerler) ayrıca "Müşteriler" ve "Tedarikçiler" tablolarındaki şehirler:

SQL UNION HEPSİ NEREDE

Aşağıdaki SQL deyimi seçmek için UNION ALL'ı kullanır: herkes(yinelenen değerler) ayrıca Almanca"Müşteriler" ve "Tedarikçiler" tablolarından şehirler.

Çoğunlukta SQL sorguları bir veya daha fazla tablodan veri döndürmek için tek bir operatör kullanılır. SQL aynı anda birden çok ayrı sorguyu çalıştırmanıza ve sonucu tek bir veri kümesi olarak görüntülemenize de olanak tanır. Bu tür birleştirilmiş sorgulara genellikle denir kombinasyonlar veya karmaşık sorgular.

1. UNION operatörünü kullanma

Dildeki sorgular SQL operatörü kullanılarak birleştirilir BİRLİK. Bunu yapmak için her isteği belirtmeniz gerekir SEÇME ve anahtar kelimeyi aralarına yerleştirin BİRLİK. Kullanılan operatör sayısına ilişkin sınırlamalar BİRLİK bir genel talepte no. Önceki bölümde şunu belirtmiştik Erişim yaratma yeteneği yok tam dış birleştirmeşimdi bunu operatör aracılığıyla nasıl başarabileceğimizi göreceğiz BİRLİK.

SEÇME *
Sumproduct'TAN SOL Sumproduct.City'deki Satıcılara KATILIN = Sellers.City
BİRLİK
SEÇME *

Sumproduct'TAN SAĞDAN Sumproduct.City'deki Satıcılara KATILIN = Sellers.City

Sorgunun, diğer tablodaki tüm kayıtların eşleşmesi olup olmadığına bakılmaksızın hem birinci tablodaki hem de diğer tablodaki tüm sütunları görüntülediğini görüyoruz.

Ayrıca birçok durumda bunun yerine şunu belirtmekte fayda var: BİRLİKöneriyi kullanabiliriz NEREDE birçok koşulla benzer bir sonuç elde edin. Ancak nedeniyle BİRLİK Girişler daha kısa ve anlaşılır görünüyor. Birleştirilmiş sorgular yazarken belirli kurallara uymak da gereklidir:

  • rica etmek BİRLİK iki veya daha fazla ifade içermelidir SEÇME, bir anahtar kelimeyle ayrılmış BİRLİK(yani bir sorgu dört SELECT ifadesi kullanıyorsa, üç UNION anahtar kelimesi olmalıdır)
  • beyandaki her istek BİRLİK aynı sütunlara, ifadelere veya istatistiksel işlevlere sahip olmalı ve ayrıca aynı sırada listelenmelidir
  • Sütun veri türleri uyumlu olmalıdır. Aynı türde olmaları şart değildir ancak benzer türde olmaları gerekir. DBMS bunları benzersiz bir şekilde dönüştürebilir (örneğin, farklı sayısal veri türleri veya farklı tarih türleri olabilirler).

2. Yinelenen satırları açın veya kapatın

Talep eden: BİRLİK tüm yinelenen satırları sorgu sonuç kümesinden otomatik olarak kaldırır (yani cümleler gibi davranır) NEREDE tek bir ifadede birden fazla koşulun yer aldığı SEÇME). Bu operatör davranışı BİRLİK varsayılan olarak, ancak istersek bunu değiştirebiliriz. Bunu yapmak için operatörü kullanmalıyız BİRLİK TÜMÜ yerine BİRLİK.

3. Birleştirilmiş sorguların sonuçlarını sıralama

İfade yürütme sonuçları SEÇME bir cümle kullanılarak sıralanmış TARAFINDAN SİPARİŞ. Sorguları kullanarak birleştirirken BİRLİK sadece bir cümle TARAFINDAN SİPARİŞ kullanılabilir ve son ifadeye dahil edilmelidir SEÇME. Gerçekte, pratikte sonuçların bir kısmını bir sıraya, diğer kısmını da başka bir sıraya sıralamanın pek bir anlamı yoktur. Bu nedenle birkaç öneri TARAFINDAN SİPARİŞ kullanımına izin verilmez.



Fok
Konunun devamı:
Akıllı televizyon

Herkes yalnızca en popüler 2-3 sosyal ağı biliyor. Ancak internette her gün başka birçok tematik topluluk bulunduğunu da unutmayın...