• jazyk SQL. Tvorba dotazů do databáze. agregační funkce SQL. SQL dotazovací jazyk

    Lekce se bude zabývat tématem sql přejmenováním sloupce (polí) pomocí servisního slova AS; zvažuje se také téma agregačních funkcí v SQL. Budou analyzovány konkrétní příklady požadavků

    Názvy sloupců v dotazech lze přejmenovat. Díky tomu jsou výsledky čitelnější.

    V SQL je přejmenování polí spojeno s použitím AS klíčové slovo, který se používá k přejmenování názvů polí v sadách výsledků

    Syntax:

    VYBRAT<имя поля>TAK JAKO<псевдоним>Z …

    Zvažte příklad přejmenování v SQL:

    Příklad databáze "Institut": Zobrazte jména učitelů a jejich platy, pro učitele, jejichž plat je nižší než 15 000, přejmenujte pole zarplata na "nízká mzda"


    ✍ Řešení:

    Přejmenování sloupců v SQL je často nutné při výpočtu hodnot spojených s více poli tabulky. Zvažte příklad:

    Příklad databáze "Institut": Z tabulky učitelů zobrazte pole se jménem a vypočítejte součet platu a odměny, pole pojmenujte "plat_bonus"


    ✍ Řešení:
    1 2 SELECT jméno, (zarplata+ prémie) AS zarplata_premia FROM učitelů;

    SELECT jméno, (zarplata+premia) AS zarplata_premia FROM učitelů;

    Výsledek:

    Agregační funkce v SQL

    Agregační funkce v sql se používají k získání celkových hodnot a vyhodnocení výrazů:

    Všechny agregační funkce vracejí jedinou hodnotu.

    Funkce COUNT , MIN a MAX platí pro jakýkoli typ dat.

    Funkce SUM a AVG se používají pouze pro číselná pole.
    Mezi funkcemi COUNT(*) a COUNT() je rozdíl: tato funkce při výpočtu nebere v úvahu hodnoty NULL.

    Důležité: při práci s agregačními funkcemi v SQL se používá funkční slovo TAK JAKO


    Příklad databáze "Institut": Získejte hodnotu nejvyššího platu mezi učiteli, zobrazte součet jako "max_zp"


    ✍ Řešení:
    SELECT MAX (zarplata) AS max_zp FROM učitelů;

    SELECT MAX(zarplata) AS max_sal FROM učitelů;

    Výsledek:

    Zvažte více složitý příklad pomocí agregačních funkcí v sql.


    ✍ Řešení:

    Klauzule GROUP BY v SQL

    Příkaz group by v sql se obvykle používá ve spojení s agregačními funkcemi.

    Agregační funkce se provádějí na všech výsledných řetězcích dotazů. Pokud dotaz obsahuje klauzuli GROUP BY, každá sada řádků zadaná v klauzuli GROUP BY tvoří skupinu a jsou provedeny agregační funkce. pro každou skupinu zvlášť.

    Zvažte příklad s tabulkou lekcí:

    Příklad:

    Důležité: V důsledku použití GROUP BY jsou tedy všechny výstupní řádky dotazu rozděleny do skupin charakterizovaných stejnými kombinacemi hodnot v těchto sloupcích (tj. agregační funkce se provádějí pro každou skupinu samostatně).

    Zároveň je třeba vzít v úvahu, že při seskupování podle pole obsahujícího NULL -hodnoty budou všechny takové záznamy spadat do jedné skupiny.

    U různých typů tiskáren určete jejich průměrné náklady a množství (tedy zvlášť pro laserové, inkoustové a matricové). Používejte agregační funkce. Výsledek by měl vypadat takto:

    S příkazem SQL

    Klauzule HAVING v SQL je potřebná ke kontrole hodnot, které se získají pomocí agregační funkce po seskupení(po použití GROUP BY). Taková kontrola nemůže být obsaženo v klauzuli WHERE.

    Příklad: Počítačový obchod DB. Vypočítejte průměrnou cenu počítačů se stejnou rychlostí procesoru. Spusťte výpočet pouze pro ty skupiny, jejichž průměrná cena je nižší než 30 000.

    Nabídka GROUP BY(příkaz SELECT) umožňuje seskupit data (řádky) podle hodnoty sloupce nebo více sloupců nebo výrazů. Výsledkem bude sada souhrnných řádků.

    Každý sloupec ve výběrovém seznamu musí být přítomen v klauzuli GROUP BY, s výjimkou konstant a sloupců, které jsou operandy agregačních funkcí.

    Tabulku lze seskupit podle libovolné kombinace jejích sloupců.

    Agregační funkce se používají k získání jedné souhrnné hodnoty ze skupiny řádků. Všechny agregační funkce provádějí výpočty s jedním argumentem, kterým může být sloupec nebo výraz. Výsledkem jakékoli agregační funkce je konstantní hodnota zobrazená v samostatném sloupci výsledků.

    Agregační funkce jsou specifikovány v seznamu sloupců příkazu SELECT, který může také obsahovat klauzuli GROUP BY. Pokud v příkazu SELECT není klauzule GROUP BY a seznam sloupců select obsahuje alespoň jednu agregační funkci, pak nesmí obsahovat jednoduché sloupce. Na druhé straně může seznam pro výběr sloupců obsahovat názvy sloupců, které nejsou argumenty agregační funkce, pokud jsou tyto sloupce argumenty klauzule GROUP BY.

    Pokud dotaz obsahuje klauzuli WHERE, pak agregační funkce vypočítají hodnotu pro výsledky výběru.

    Agregační funkce MIN a MAX vypočítat nejmenší a největší hodnotu sloupce, resp. Argumenty mohou být čísla, řetězce a data. Všechny hodnoty NULL jsou před výpočtem odstraněny (tj. nejsou brány v úvahu).

    Agregační funkce SUM vypočítává Celková částka hodnoty sloupců. Argumenty mohou být pouze čísla. Použití možnosti DISTINCT eliminuje všechny duplicitní hodnoty ve sloupci před použitím funkce SUM. Podobně jsou před použitím této agregační funkce odstraněny všechny hodnoty NULL.

    Agregační funkce AVG vrátí průměr všech hodnot ve sloupci. Argumenty mohou být také pouze čísla a všechny hodnoty NULL jsou před vyhodnocením odstraněny.

    Agregační funkce COUNT má dvě různé podoby:

    • COUNT( col_name) - počítá počet hodnot ve sloupci col_name, hodnoty NULL jsou ignorovány
    • COUNT(*) - počítá počet řádků v tabulce, zohledňují se také hodnoty NULL

    Pokud dotaz používá klíčové slovo DISTINCT, před použitím COUNT funkcí všechny duplicitní hodnoty sloupců jsou odstraněny.

    Funkce COUNT_BIG podobně jako funkce COUNT. Jediný rozdíl mezi nimi je typ výsledku, který vracejí: funkce COUNT_BIG vždy vrací hodnoty BIGINT, zatímco funkce COUNT vrací hodnoty dat INTEGER.

    V MÁME nabídku definuje podmínku, která platí pro skupinu řádků. Pro skupiny řádků má stejný význam jako klauzule WHERE pro obsah odpovídající tabulky (WHERE platí před seskupením, HAVING po).

    Následující pododdíly popisují další klauzule příkazu SELECT, které lze použít v dotazech, a také agregační funkce a sady příkazů. Pro připomenutí, dosud jsme se zabývali použitím klauzule WHERE a v tomto článku se podíváme na klauzule GROUP BY, ORDER BY a HAVING a uvedeme některé příklady použití těchto klauzulí ve spojení s agregací funkce, které jsou podporovány v Transact-SQL.

    Nabídka GROUP BY

    Nabídka SKUPINA VYTVOŘENÁ seskupí vybranou sadu řádků a vytvoří sadu souhrnných řádků na základě hodnot jednoho nebo více sloupců nebo výrazů. Jednoduché použití klauzule GROUP BY je znázorněno v příkladu níže:

    POUŽÍVEJTE SampleDb; SELECT Job FROM Works_On GROUP BY Job;

    V tomto příkladu jsou vybrány a seskupeny pozice zaměstnanců.

    Ve výše uvedeném příkladu klauzule GROUP BY vytvoří samostatnou skupinu pro všechny možné hodnoty (včetně NULL) sloupce Job.

    Použití sloupců v klauzuli GROUP BY musí splňovat určité podmínky. Zejména se každý sloupec ve výběrovém seznamu dotazu musí objevit také v klauzuli GROUP BY. Tento požadavek se nevztahuje na konstanty a sloupce, které jsou součástí agregační funkce. (Agregační funkce jsou diskutovány v další podkapitole.) To dává smysl, protože pouze sloupcům v klauzuli GROUP BY je zaručena jedna hodnota na skupinu.

    Tabulku lze seskupit podle libovolné kombinace jejích sloupců. Níže uvedený příklad ukazuje seskupení řádků tabulky Works_on do dvou sloupců:

    POUŽÍVEJTE SampleDb; SELECT ProjectNumber, Job FROM Works_On GROUP BY ProjectNumber, Job;

    Výsledkem tohoto dotazu je:

    Na základě výsledků dotazu můžete vidět, že existuje devět skupin s různými kombinacemi čísla projektu a pozice. Pořadí názvů sloupců v klauzuli GROUP BY nemusí být stejné jako v seznamu sloupců SELECT.

    Agregační funkce

    Agregační funkce se používají k získání celkových hodnot. Všechny agregační funkce lze rozdělit do následujících kategorií:

      běžné agregační funkce;

      statistické agregační funkce;

      agregované funkce definované uživatelem;

      analytické agregační funkce.

    Zde se podíváme na první tři typy agregačních funkcí.

    Obyčejné agregační funkce

    Jazyk Transact-SQL podporuje následujících šest agregačních funkcí: MIN, MAX, SOUČET, AVG, POČET, COUNT_BIG.

    Všechny agregační funkce provádějí výpočty s jedním argumentem, kterým může být sloupec nebo výraz. (Jedinou výjimkou je druhý tvar dvou funkcí COUNT a COUNT_BIG, konkrétně COUNT(*) a COUNT_BIG(*) v tomto pořadí.) Výsledkem jakékoli agregační funkce je konstantní hodnota zobrazená v samostatném sloupci výsledků.

    Agregační funkce jsou specifikovány v seznamu sloupců příkazu SELECT, který může také obsahovat klauzuli GROUP BY. Pokud v příkazu SELECT není klauzule GROUP BY a seznam sloupců select obsahuje alespoň jednu agregační funkci, pak nesmí obsahovat jednoduché sloupce (jiné než sloupce, které slouží jako argumenty agregační funkce). Proto je kód v níže uvedeném příkladu nesprávný:

    POUŽÍVEJTE SampleDb; SELECT Příjmení, MIN(Id) FROM Zaměstnanec;

    Zde by sloupec Příjmení v tabulce Zaměstnanec neměl být ve výběrovém seznamu sloupců, protože to není argument agregační funkce. Na druhé straně může seznam pro výběr sloupců obsahovat názvy sloupců, které nejsou argumenty agregační funkce, pokud jsou tyto sloupce argumenty klauzule GROUP BY.

    Argumentu agregační funkce může předcházet jedno ze dvou možných klíčových slov:

    VŠECHNO

    Určuje, že výpočty se provádějí se všemi hodnotami ve sloupci. Toto je výchozí hodnota.

    ODLIŠNÝ

    Určuje, že pro výpočty se používají pouze jedinečné hodnoty sloupců.

    Agregační funkce MIN a MAX

    Agregační funkce MIN a MAX vypočítají nejmenší a největší hodnotu sloupce. Pokud dotaz obsahuje klauzuli WHERE, funkce MIN a MAX vrátí nejmenší a největší hodnotu řádků, které splňují zadaná kritéria. Níže uvedený příklad ukazuje použití agregační funkce MIN:

    POUŽÍVEJTE SampleDb; -- Vrátí 2581 SELECT MIN(Id) AS "Min Id" OD zaměstnance;

    Výsledek vrácený ve výše uvedeném příkladu není příliš informativní. Například není známo jméno zaměstnance, který toto číslo vlastní. Ale získejte to příjmení obvyklým způsobem není možné, protože, jak již bylo zmíněno dříve, není povoleno explicitně specifikovat sloupec Příjmení. Pro získání příjmení tohoto zaměstnance spolu s nejnižším osobním číslem zaměstnance se používá poddotaz. Následující příklad ukazuje použití takového poddotazu, kde poddotaz obsahuje příkaz SELECT z předchozího příkladu:

    Výsledek spuštění dotazu:

    Použití agregační funkce MAX je znázorněno v příkladu níže:

    Funkce MIN a MAX mohou také brát řetězce a data jako argumenty. V případě řetězcového argumentu se hodnoty porovnávají pomocí skutečného pořadí řazení. Pro všechny argumenty temp data typu "date" bude největší hodnota nejmenšího sloupce brzké datum, a největší - nejnovější.

    Klíčové slovo DISTINCT můžete použít s funkcemi MIN a MAX. Před použitím agregačních funkcí MIN a MAX jsou všechny hodnoty NULL vyloučeny ze sloupců argumentů.

    Agregační funkce SUM

    Agregát Funkce SUM vypočítá celkový součet hodnot sloupců. Argument této agregační funkce musí mít vždy číselný typ data. Použití agregační funkce SUM je znázorněno v příkladu níže:

    POUŽÍVEJTE SampleDb; SELECT SUM (Rozpočet) "Souhrnný rozpočet" FROM Project;

    Tento příklad vypočítá celkový součet rozpočtů všech projektů. Výsledek spuštění dotazu:

    V tomto příkladu agregační funkce seskupuje všechny hodnoty rozpočtu projektu a určuje jejich celkovou částku. Z tohoto důvodu dotaz obsahuje implicitní seskupovací funkci (jako všechny podobné dotazy). Implicitní seskupovací funkce z výše uvedeného příkladu může být specifikována explicitně, jak ukazuje příklad níže:

    POUŽÍVEJTE SampleDb; SELECT SUM (Rozpočet) "Celkový rozpočet" FROM Project GROUP BY();

    Použití možnosti DISTINCT eliminuje všechny duplicitní hodnoty ve sloupci před použitím funkce SUM. Podobně jsou před použitím této agregační funkce odstraněny všechny hodnoty NULL.

    Agregační funkce AVG

    Agregát Funkce AVG vrátí aritmetický průměr všech hodnot ve sloupci. Argument této agregační funkce musí být vždy číselného datového typu. Před použitím funkce AVG jsou z jejího argumentu odstraněny všechny hodnoty NULL.

    Použití agregační funkce AVG je znázorněno v příkladu níže:

    POUŽÍVEJTE SampleDb; -- Vrátí 133833 SELECT AVG (Rozpočet) "Průměrný rozpočet na projekt" FROM Project;

    Zde se vypočítá aritmetický průměr rozpočtu pro všechny rozpočty.

    Agregační funkce COUNT a COUNT_BIG

    Agregát Funkce COUNT má dvě různé podoby:

    COUNT( název_sloupce) COUNT(*)

    První forma funkce počítá počet hodnot ve sloupci col_name. Pokud je v dotazu použito klíčové slovo DISTINCT, budou před použitím funkce COUNT odstraněny všechny duplicitní hodnoty sloupců. Tato forma funkce COUNT nebere v úvahu hodnoty NULL při počítání počtu hodnot ve sloupci.

    Použití první formy agregační funkce COUNT je znázorněno v příkladu níže:

    POUŽÍVEJTE SampleDb; SELECT ProjectNumber, COUNT(DISTINCT Job) "Práce v projektu" FROM Works_on GROUP BY ProjectNumber;

    Zde se počítá počet různých pozic pro každý projekt. Výsledkem tohoto dotazu je:

    Jak můžete vidět z příkladu dotazu, funkce COUNT nezohlednila hodnoty NULL. (Součet všech hodnot ve sloupci práce se ukázal být 7, nikoli 11, jak by měl být.)

    Druhá forma funkce COUNT, tzn. funkce COUNT(*) počítá počet řádků v tabulce. A pokud příkaz SELECT dotazu s funkcí COUNT(*) obsahuje klauzuli WHERE s podmínkou, vrátí funkce počet řádků, které splňují zadanou podmínku. Na rozdíl od první formy funkce COUNT, druhá forma neignoruje hodnoty NULL, protože tato funkce pracuje s řádky, nikoli se sloupci. Níže uvedený příklad ukazuje použití funkce COUNT(*):

    POUŽÍVEJTE SampleDb; SELECT Job AS "Typ práce", COUNT(*) "Potřebuji pracovníky" FROM Works_on GROUP BY Job;

    Zde se počítá počet pozic ve všech projektech. Výsledek spuštění dotazu:

    Funkce COUNT_BIG podobně jako funkce COUNT. Jediný rozdíl mezi nimi je typ výsledku, který vracejí: funkce COUNT_BIG vždy vrací hodnoty BIGINT, zatímco funkce COUNT vrací hodnoty dat INTEGER.

    Statistické agregační funkce

    Následující funkce tvoří skupinu statistických agregačních funkcí:

    VAR

    Vypočítá statistický rozptyl všech hodnot reprezentovaných ve sloupci nebo výrazu.

    VARP

    Vypočítá statistický rozptyl populace všech hodnot reprezentovaných ve sloupci nebo výrazu.

    STDEV

    Vypočítá směrodatnou odchylku (která se vypočítá jako druhá odmocnina odpovídajícího rozptylu) všech hodnot ve sloupci nebo výrazu.

    SMODCH

    Vypočítá směrodatnou odchylku souhrnu všech hodnot ve sloupci nebo výrazu.

    Uživatelsky definované agregační funkce

    Database Engine také podporuje implementaci uživatelsky definovaných funkcí. Tato schopnost umožňuje uživatelům rozšířit systémové agregační funkce o funkce, které mohou implementovat a nainstalovat sami. Tyto funkce představují speciální třídu uživatelsky definovaných funkcí a budou podrobněji popsány později.

    MÁME nabídku

    Ve větě MÍT definuje podmínku, která platí pro skupinu řádků. Tato klauzule má tedy pro skupiny řádků stejný význam jako klauzule WHERE pro obsah odpovídající tabulky. Syntax MÁME nabídky další:

    MÍT podmínku

    Parametr podmínky zde představuje podmínku a obsahuje agregační funkce nebo konstanty.

    Použití klauzule HAVING s agregační funkcí COUNT(*) je znázorněno v příkladu níže:

    POUŽÍVEJTE SampleDb; -- Návrat "p3" SELECT ProjectNumber FROM Works_on GROUP BY ProjectNumber HAVING COUNT(*)

    V tomto příkladu pomocí klauzule GROUP BY systém seskupuje všechny řádky na základě hodnot ve sloupci ProjectNumber. Poté se spočítá počet řádků v každé skupině a vyberou se skupiny obsahující méně než čtyři řádky (tři nebo méně).

    Klauzuli HAVING lze také použít bez agregačních funkcí, jak ukazuje příklad níže:

    POUŽÍVEJTE SampleDb; -- Vrátí "Consultant" SELECT Job FROM Works_on GROUP BY Job HAVING Job LIKE "K%";

    Tento příklad seskupuje řádky v tabulce Works_on podle pozice a eliminuje ty pozice, které nezačínají písmenem "K".

    Klauzuli HAVING lze použít i bez klauzule GROUP BY, i když to není běžná praxe. V tomto případě jsou všechny řádky tabulky vráceny ve stejné skupině.

    OBJEDNEJTE PODLE nabídky

    Nabídka SEŘADIT PODLE definuje pořadí řazení řádků v sadě výsledků vrácených dotazem. Tato věta má následující syntaxi:

    Pořadí řazení je specifikováno v parametru col_name. Parametr col_number je alternativní specifikátor pořadí řazení, který identifikuje sloupce v pořadí, v jakém se objevují ve výběrovém seznamu příkazu SELECT (1 je první sloupec, 2 je druhý sloupec atd.). Parametr ASC definuje řazení ve vzestupném pořadí a Parametr DESC- sestupně. Výchozí hodnota je ASC.

    Názvy sloupců v klauzuli ORDER BY nemusí být v seznamu vybrat sloupec. To se ale netýká dotazů SELECT DISTINCT, protože v takových dotazech musí být názvy sloupců uvedené v klauzuli ORDER BY také uvedeny v seznamu select sloupců. Kromě toho tato klauzule nemůže obsahovat názvy sloupců z tabulek, které nejsou uvedeny v klauzuli FROM.

    Jak můžete vidět ze syntaxe klauzule ORDER BY, sadu výsledků lze třídit do více sloupců. Toto řazení je znázorněno na příkladu níže:

    Tento příklad vybere čísla oddělení a příjmení a křestní jména zaměstnanců pro zaměstnance, jejichž osobní číslo je menší než 20 000, a seřadí je podle příjmení a jména. Výsledkem tohoto dotazu je:

    Sloupce v klauzuli ORDER BY mohou být specifikovány nikoli svými názvy, ale pořadím ve výběrovém seznamu. Větu ve výše uvedeném příkladu lze tedy přepsat takto:

    Takový alternativní způsob určení sloupců jejich pozicí namísto názvů se používá, pokud kritérium řazení obsahuje agregační funkci. (Dalším způsobem je použití názvů sloupců, které se pak objeví v klauzuli ORDER BY.) V klauzuli ORDER BY se však doporučuje, aby byly sloupce specifikovány jejich názvy, nikoli čísly, aby se usnadnila aktualizace dotaz, zda je třeba přidat nebo odebrat sloupce ze seznamu výběru. Určení sloupců v klauzuli ORDER BY jejich čísly je znázorněno v příkladu níže:

    USE SampleDb; SELECT ProjectNumber, COUNT(*) "Počet zaměstnanců" FROM Works_on GROUP BY ProjectNumber ORDER BY 2 DESC;

    Zde se pro každý projekt vybere číslo projektu a počet zaměstnanců, kteří se na něm podílejí, přičemž výsledek seřadí sestupně podle počtu zaměstnanců.

    Transact-SQL vkládá hodnoty NULL na začátek seznamu při vzestupném řazení a na konec seznamu při sestupném řazení.

    Použití klauzule ORDER BY k stránkování výsledků

    Zobrazení výsledků dotazu na aktuální stránce lze implementovat buď v uživatelská aplikace nebo dát pokyn databázovému serveru, aby tak učinil. V prvním případě jsou všechny databázové řádky odeslány do aplikace, jejímž úkolem je vybrat požadované řádky a zobrazit je. Ve druhém případě jsou na straně serveru vybrány a zobrazeny pouze řádky požadované pro aktuální stránku. Jak můžete očekávat, generování stránky na straně serveru obvykle poskytuje lepší výkon, protože klientovi jsou odeslány pouze řádky potřebné pro zobrazení.

    Pro podporu vytváření stránek na straně serveru SQL Server 2012 zavádí dvě nové klauzule příkazu SELECT: OFFSET a FETCH. Použití těchto dvou vět je demonstrováno na příkladu níže. Zde se z databáze AdventureWorks2012 (kterou můžete najít ve zdrojích) získávají obchodní ID, pracovní pozice a narozeniny všech zaměstnankyň a výsledek seřadí vzestupně podle pracovní pozice. Výsledná sada řádků se rozdělí na 10řádkové stránky a zobrazí se třetí stránka:

    Ve větě OFFSET určuje počet řádků výsledků, které se mají v zobrazeném výsledku přeskočit. Toto číslo se vypočítá po seřazení řádků podle klauzule ORDER BY. Ve větě NAČÍST DALŠÍ určuje počet odpovídajících WHERE a seřazených řádků, které se mají vrátit. Parametrem této klauzule může být konstanta, výraz nebo výsledek jiného dotazu. Klauzule FETCH NEXT je podobná klauzuli NEJDŘÍVE PŘINÁŠEJTE.

    Hlavním cílem při vytváření stránek na straně serveru je umět implementovat běžné formuláře stránek pomocí proměnných. Tento úkol můžete provést prostřednictvím balíčku SQL Server.

    Příkaz SELECT a vlastnost IDENTITY

    Vlastnost IDENTITY umožňuje definovat hodnoty pro konkrétní sloupec tabulky jako automaticky se zvyšující čítač. Tuto vlastnost mohou mít číselné sloupce datového typu, jako jsou TINYINT, SMALLINT, INT a BIGINT. Pro takový sloupec tabulky Database Engine automaticky generuje sekvenční hodnoty počínaje zadanou počáteční hodnotou. Vlastnost IDENTITY lze tedy použít ke generování jednociferných číselných hodnot pro vybraný sloupec.

    Tabulka může obsahovat pouze jeden sloupec s vlastností IDENTITY. Vlastník tabulky má možnost zadat počáteční hodnotu a přírůstek, jak ukazuje příklad níže:

    USE SampleDb; CREATE TABLE Product (Id INT IDENTITY(10000, 1) NOT NULL, Name NVARCHAR(30) NOT NULL, Price MONEY) INSERT INTO Product(Name, Price) VALUES ("Item1", 10), ("Item2", 15) , ("Položka 3", 8), ("Položka 4", 15), ("Položka 5", 40); -- Vrátí 10004 SELECT IDENTITYCOL FROM Product WHERE Name = "Product5"; -- Podobně jako u předchozího příkazu SELECT $identity FROM Product WHERE Name = "Product5";

    Tento příklad nejprve vytvoří tabulku produktu, která obsahuje sloupec ID s vlastností IDENTITY. Hodnoty ve sloupci Id jsou generovány automaticky systémem, počínaje 10 000 a zvyšují se o jednu pro každou následující hodnotu: 10 000, 10 001, 10 002 atd.

    S vlastností IDENTITY je spojeno několik systémových funkcí a proměnných. Například používá ukázkový kód $systémová proměnná identity. Jak můžete vidět z výstupu tohoto kódu, tato proměnná automaticky odkazuje na vlastnost IDENTITY. Místo toho můžete také použít systémovou funkci IDENTITYCOL.

    Počáteční hodnotu a přírůstek sloupce s vlastností IDENTITY lze zjistit pomocí funkcí IDENT_SEED A IDENT_INCR respektive. Tyto funkce se používají následovně:

    USE SampleDb; SELECT IDENT_SEED("Produkt"), IDENT_INCR("Produkt")

    Jak již bylo zmíněno, hodnoty IDENTITY nastavuje systém automaticky. Uživatel však může explicitně zadat své vlastní hodnoty pro určité řádky nastavením parametru IDENTITY_INSERT ON před vložením explicitní hodnoty:

    SET IDENTITY INSERT název tabulky ON

    Protože možnost IDENTITY_INSERT lze použít k nastavení libovolné hodnoty pro sloupec vlastnosti IDENTITY, včetně duplicitní hodnoty, vlastnost IDENTITY obvykle nevynucuje jedinečnost hodnot sloupců. Proto by se k vynucení jedinečnosti hodnot sloupců měla používat omezení UNIQUE nebo PRIMARY KEY.

    Při vkládání hodnot do tabulky poté, co je IDENTITY_INSERT nastaveno na zapnuto, systém vytvoří další hodnotu sloupce IDENTITY zvýšením největší aktuální hodnoty tohoto sloupce.

    příkaz CREATE SEQUENCE

    Použití vlastnosti IDENTITY má několik významných nevýhod, z nichž nejvýznamnější jsou následující:

      aplikace vlastností je omezena na uvedenou tabulku;

      novou hodnotu sloupce nelze získat jiným způsobem než aplikací;

      vlastnost IDENTITY lze zadat pouze při vytváření sloupce.

    Z těchto důvodů SQL Server 2012 zavádí sekvence, které mají stejnou sémantiku jako vlastnost IDENTITY, ale bez výše uvedených nevýhod. V tomto kontextu je sekvence databázová funkce, která umožňuje zadat hodnoty čítačů pro různé databázové objekty, jako jsou sloupce a proměnné.

    Sekvence jsou vytvořeny pomocí instrukce VYTVOŘTE SEKVENCI. Příkaz CREATE SEQUENCE je definován ve standardu SQL a je podporován jinými systémy relačních databází, jako jsou IBM DB2 a Oracle.

    Níže uvedený příklad ukazuje, jak vytvořit sekvenci v SQL Server:

    POUŽÍVEJTE SampleDb; CREATE SEQUENCE dbo.Sequence1 AS INT ZAČÁTE O 1 PŘÍRŮST O 5 MINVALUE 1 MAXVALUE 256 CYCLE;

    Ve výše uvedeném příkladu jsou hodnoty Sequence1 generovány automaticky systémem, počínaje hodnotou 1 s přírůstky 5 pro každou následující hodnotu. Tedy v nabídka START je specifikována počáteční hodnota a NAVÍCOVÁ nabídka- krok. (Krok může být kladný nebo záporný.)

    V dalších dvou nepovinných větách MIN A MAX minimální a maximální hodnota sekvenční objekt. (Všimněte si, že hodnota MINVALUE musí být menší nebo rovna počáteční hodnotě a hodnota MAXVALUE nemůže být větší než horní limit datového typu určeného pro sekvenci.) V klauzuli CYKLUS označuje, že sekvence se opakuje od začátku, když je překročena maximální (nebo minimum u sekvence se záporným krokem) hodnota. Ve výchozím nastavení je tato klauzule NO CYCLE, což znamená, že překročení maximální nebo minimální hodnoty sekvence způsobí výjimku.

    Hlavním rysem sekvencí je jejich nezávislost na tabulkách, tzn. mohou být použity s jakýmkoli databázovým objektem, jako jsou sloupce tabulky nebo proměnné. (Tato vlastnost má pozitivní vliv na úložiště a tím i na výkon. Konkrétní sekvenci není třeba ukládat, ukládá se pouze její poslední hodnota.)

    Nové sekvenční hodnoty jsou vytvořeny pomocí DALŠÍ HODNOTA PRO výrazy, jehož použití je uvedeno v příkladu níže:

    POUŽÍVEJTE SampleDb; -- Vrátí 1 SELECT NEXT VALUE FOR dbo.sequence1; -- Vrátí 6 (další krok) SELECT NEXT VALUE FOR dbo.sequence1;

    Výraz NEXT VALUE FOR můžete použít k přiřazení výsledku sekvence k proměnné nebo buňce sloupce. Níže uvedený příklad ukazuje použití tohoto výrazu k přiřazení výsledků ke sloupci:

    POUŽÍVEJTE SampleDb; CREATE TABLE Product (Id INT NOT NULL, Name NVARCHAR(30) NOT NULL, Price MONEY) INSERT INTO Product VALUES (NEXT VALUE FOR dbo.sequence1, "Product1", 10); INSERT INTO Product VALUES (NEXT VALUE FOR dbo.sequence1, "Product2", 15); --...

    Výše uvedený příklad nejprve vytvoří tabulku produktu se čtyřmi sloupci. Dále dva příkazy INSERT vloží dva řádky do této tabulky. První dvě buňky v prvním sloupci budou mít hodnoty 11 a 16.

    Níže uvedený příklad ukazuje použití zobrazení katalogu sys.sekvence pro zobrazení aktuální hodnoty sekvence bez jejího použití:

    Typicky se výraz NEXT VALUE FOR používá v příkazu INSERT, aby systém přinutil vložit vygenerované hodnoty. Tento výraz lze také použít jako součást víceřádkového dotazu pomocí klauzule OVER.

    Chcete-li změnit vlastnost existující sekvence, použijte příkaz ALTER SEQUENCE. Jedno z nejdůležitějších použití tohoto příkazu je s volbou RESTART WITH, která resetuje zadanou sekvenci. Následující příklad ukazuje použití příkazu ALTER SEQUENCE k resetování téměř všech vlastností Sequence1:

    POUŽÍVEJTE SampleDb; ALTER SEQUENCE dbo.sequence1 RESTARTUJTE SE 100 PŘÍRŮSTKY O 50 MINVALUE 50 MAXVALUE 200 ŽÁDNÝ CYKLUS;

    Vymažte sekvenci pomocí instrukce DROP SEQUENCE.

    Nastavit operátory

    Kromě operátorů diskutovaných výše podporuje Transact-SQL další tři operátory sady: UNION, INTERSECT a EXCEPT.

    operátor UNION

    operátor UNION kombinuje výsledky dvou nebo více dotazů do jediné sady výsledků, která obsahuje všechny řádky, které patří všem dotazům ve spojení. Výsledkem spojení dvou tabulek je tedy nová tabulka obsahující všechny řádky obsažené v jedné z původních tabulek nebo v obou těchto tabulkách.

    Obecná forma operátoru UNION vypadá takto:

    select_1 UNION select_2(select_3])...

    Volby select_1, select_2, ... jsou příkazy SELECT, které vytvářejí spojení. Pokud je použita volba VŠECHNY, zobrazí se všechny řádky, včetně duplikátů. V operátoru UNION má parametr ALL stejný význam jako ve výběrovém seznamu SELECT, s jedním rozdílem: pro výběrový seznam SELECT je tento parametr použit ve výchozím nastavení, ale pro operátor UNION musí být specifikován explicitně.

    Databáze SampleDb ve své původní podobě není vhodná pro demonstraci použití operátoru UNION. Proto tato část vytvoří novou tabulku EmployeeEnh, která je identická s existující tabulkou Zaměstnanci, ale má další sloupec Město. Tento sloupec uvádí, kde zaměstnanci bydlí.

    Vytvoření tabulky EmployeeEnh nám poskytuje příležitost prokázat použití klauzule DO v příkazu SELECT. Příkaz SELECT INTO provádí dvě operace. Nejprve se vytvoří nová tabulka se sloupci uvedenými v seznamu SELECT. Poté se řádky původní tabulky vloží do nové tabulky. Název nové tabulky je uveden v klauzuli INTO a název zdrojové tabulky je uveden v klauzuli FROM.

    Níže uvedený příklad ukazuje vytvoření tabulky EmployeeEnh z tabulky Employee:

    POUŽÍVEJTE SampleDb; SELECT * INTO EmployeeEnh FROM Employee; ALTER TABLE EmployeeEnh ADD City NCHAR(40) NULL;

    V tomto příkladu příkaz SELECT INTO vytvoří tabulku EmployeeEnh, vloží do ní všechny řádky ze zdrojové tabulky Employee a poté příkaz ALTER TABLE přidá sloupec City do nové tabulky. Přidaný sloupec Město však žádné hodnoty neobsahuje. Hodnoty v tomto sloupci lze vložit pomocí Management Studio nebo pomocí následujícího kódu:

    POUŽÍVEJTE SampleDb; UPDATE EmployeeEnh SET City="Kazan" WHERE Id=2581; UPDATE EmployeeEnh SET City = "Moskva" WHERE Id = 9031; UPDATE EmployeeEnh SET Město = "Jekatěrinburg" WHERE Id = 10102; UPDATE EmployeeEnh SET City = "Saint Petersburg" WHERE Id = 18316; UPDATE EmployeeEnh SET City = "Krasnodar" WHERE Id = 25348; UPDATE EmployeeEnh SET City="Kazan" WHERE Id=28559; UPDATE EmployeeEnh SET City="Perm" WHERE Id=29346;

    Nyní jsme připraveni předvést použití příkazu UNION. Níže uvedený příklad ukazuje dotaz na vytvoření spojení mezi tabulkami EmployeeEnh a Department pomocí tohoto příkazu:

    POUŽÍVEJTE SampleDb; SELECT City AS "City" FROM EmployeeEnh UNION SELECT Location FROM Department;

    Výsledkem tohoto dotazu je:

    Pomocí příkazu UNION lze spojit pouze kompatibilní tabulky. Kompatibilními tabulkami rozumíme, že oba seznamy sloupců ve výběru musí obsahovat stejný počet sloupců a že odpovídající sloupce musí mít kompatibilní datové typy. (Pokud jde o kompatibilitu, datové typy INT a SMALLINT nejsou kompatibilní.)

    Výsledek spojení lze seřadit pouze pomocí klauzule ORDER BY v posledním příkazu SELECT, jak je znázorněno v příkladu níže. Klauzule GROUP BY a HAVING lze použít s jednotlivými příkazy SELECT, ale ne v rámci samotného spojení.

    Dotaz v tomto příkladu načte zaměstnance, kteří buď pracují v oddělení d1, nebo začali pracovat na projektu před 1. lednem 2008.

    Operátor UNION podporuje volbu VŠECHNY. Při použití této možnosti se duplikáty ze sady výsledků neodstraní. Operátor OR můžete použít místo operátoru UNION, pokud všechny příkazy SELECT spojené jedním nebo více operátory UNION odkazují na stejnou tabulku. V tomto případě je sada příkazů SELECT nahrazena jedním příkazem SELECT se sadou příkazů OR.

    Příkazy INTERSECT a EXCEPT

    Dva další operátoři pro práci se sadami, INTERSECT A AŽ NA, definujte průsečík a rozdíl, resp. Pod průsečíkem je v tomto kontextu sada řádků, které patří do obou tabulek. A rozdíl dvou tabulek je definován jako všechny hodnoty, které patří do první tabulky a nejsou přítomny ve druhé. Níže uvedený příklad ukazuje použití příkazu INTERSECT:

    Transact-SQL nepodporuje použití volby ALL s příkazem INTERSECT ani s příkazem EXCEPT. Použití příkazu EXCEPT je znázorněno v příkladu níže:

    Mějte na paměti, že tyto tři množinové operátory mají různou prioritu provádění: operátor INTERSECT má nejvyšší prioritu, následovaný operátorem EXCEPT a operátor UNION má nejnižší prioritu. Nepozornost na prioritu provádění při použití více různých operátorů sady může vést k neočekávaným výsledkům.

    CASE výrazy

    V oblasti programování databázových aplikací je někdy nutné upravit prezentaci dat. Lidé mohou být například rozděleni kódováním podle jejich sociální příslušnosti pomocí hodnot 1, 2 a 3, které označují muže, ženy a děti. Tato programovací technika může zkrátit čas potřebný k implementaci programu. výraz CASE Jazyk Transact-SQL usnadňuje implementaci tohoto typu kódování.

    Na rozdíl od většiny programovacích jazyků CASE není příkaz, ale výraz. Proto lze výraz CASE použít téměř kdekoli, kde jazyk Transact-SQL umožňuje použití výrazů. Výraz CASE má dvě podoby:

      jednoduchý výraz CASE;

      hledaný výraz CASE.

    Syntaxe jednoduchého výrazu CASE je následující:

    Příkaz s jednoduchým výrazem CASE nejprve prohledá seznam všech výrazů v klauzule WHEN první výraz, který odpovídá výrazu_1 a poté provede odpovídající PAK klauzule. Pokud v seznamu WHEN není žádný odpovídající výraz, pak klauzule ELSE.

    Syntaxe pro vyhledávací výraz CASE je:

    V tento případ vyhledá se první odpovídající podmínka a poté se provede odpovídající klauzule THEN. Pokud žádná z podmínek neodpovídá požadavkům, je provedena klauzule ELSE. Použití vyhledávacího výrazu CASE je znázorněno v příkladu níže:

    POUŽÍVEJTE SampleDb; SELECT ProjectName, CASE WHEN Budget > 0 AND Budget 100000 AND Budget 150000 AND Budget

    Výsledkem tohoto dotazu je:

    Tento příklad zváží rozpočty všech projektů a zobrazí jejich vypočítané váhy spolu s příslušnými názvy projektů.

    Níže uvedený příklad ukazuje další způsob použití výrazu CASE, kde klauzule WHEN obsahuje poddotazy, které jsou součástí výrazu:

    POUŽÍVEJTE SampleDb; SELECT ProjectName, CASE WHEN p1.Budget (SELECT AVG(p2.Budget) FROM Project p2) THEN "Nadprůměrné" END "Kategorie rozpočtu" FROM Project p1;

    Výsledek tohoto dotazu je následující:

    Pro shrnutí informací obsažených v databázi poskytuje SQL agregační funkce. Agregační funkce bere jako argument celý sloupec dat a vrací jedinou hodnotu, která nějakým způsobem shrnuje tento sloupec.

    Například agregační funkce AVG() vezme sloupec čísel jako argument a vypočítá jejich průměr.

    Pro výpočet průměrného příjmu na hlavu obyvatele Zelenogradu potřebujete následující dotaz:

    VYBERTE „PRŮMĚRNÝ PŘÍJEM=“, AVG (SUMD)

    SQL má šest agregačních funkcí, které vám umožňují získat různé druhy souhrnné informace (obr. 1):

    – SUM() vypočítá součet všech hodnot obsažených ve sloupci;

    – AVG() vypočítá průměr mezi hodnotami obsaženými ve sloupci;

    – MIN() najde nejmenší ze všech hodnot obsažených ve sloupci;

    – MAX() najde největší ze všech hodnot obsažených ve sloupci;

    – COUNT() počítá počet hodnot obsažených ve sloupci;

    – COUNT(*) počítá počet řádků v tabulce výsledků dotazu.

    Argumentem agregační funkce může být jednoduchý název sloupce, jako v předchozím příkladu, nebo výraz, jako v následujícím dotazu, který určuje výpočet daně na hlavu:

    VYBRAT AVG (SUMD*0,13)

    Tento dotaz vytvoří dočasný sloupec obsahující hodnoty (SUMD*0,13) pro každý řádek v tabulce PERSON a poté vypočítá průměr dočasného sloupce.

    Součet příjmů všech obyvatel Zelenogradu lze vypočítat pomocí agregační funkce SUM:

    VYBERTE SOUČET (SUMD) OD OSOBY

    Agregační funkci lze také použít k výpočtu součtů pro výsledkovou tabulku získanou spojením několika zdrojových tabulek. Můžete například vypočítat celkovou výši příjmu, který obyvatelé obdrželi ze zdroje zvaného „stipendium“:

    VYBERTE SOUČET (PENÍZE)

    ZE ZISKU, HAVE_D

    WHERE PROFIT.ID=HAVE_D.ID

    AND PROFIT.SOURCE='Stipendium'

    Agregační funkce MIN() a MAX() umožňují najít nejmenší resp největší hodnotu ve stole. Sloupec však může obsahovat číselné nebo řetězcové hodnoty nebo hodnoty data nebo času.

    Můžete například definovat:

    a) nejnižší celkový příjem rezidentů a nejvyšší splatná daň:

    VYBERTE MIN (SUMD), MAX (SUMD*0,13)

    b) data narození nejstaršího a nejmladšího obyvatele:

    SELECT MIN (RDATE), MAX (RDATE)

    c) příjmení, křestní jména a patronyma úplně prvních a nejnovějších obyvatel v seznamu, seřazená abecedně:

    VYBERTE MIN (FIO), MAX (FIO)

    Při použití těchto agregačních funkcí si musíte pamatovat, že číselná data se porovnávají podle aritmetických pravidel, data se porovnávají postupně (dřívější hodnoty data jsou považovány za menší než pozdější), časové intervaly se porovnávají na základě jejich trvání.

    Při použití funkcí MIN() a MAX() s řetězcovými daty závisí výsledek porovnání dvou řetězců na použité tabulce kódování znaků.

    Agregační funkce COUNT() počítá počet hodnot ve sloupci libovolného typu:

    a) Kolik bytů je v 1. mikrookresu?

    VYBERTE POČET (ADR) Z PLOCHÉ, KDE ADR LIKE "%, 1_ _-%"

    b) kolik obyvatel má zdroje příjmu?

    VYBERTE POČET (ODLIŠNÉ NOM) OD HAVE_D

    c) Kolik zdrojů příjmů využívají rezidenti?

    SELECT COUNT(DISTINCT ID) FROM HAVE_D (klíčové slovo DISTINCT určuje, že se počítají neopakující se hodnoty ve sloupci).

    Speciální agregační funkce COUNT(*) počítá řádky ve výsledkové tabulce, nikoli datové hodnoty:

    (a) Kolik bytů je ve 2. mikrookresu?

    VYBERTE POČET (*) Z PLOCHÉ, KDE ADR LIKE "%, 2__-%"

    b) kolik zdrojů příjmů má Ivanov Ivan Ivanovič?

    VYBERTE POČET (*) OD OSOBY, HAVE_D WHERE FIO="Ivanov Ivan Ivanovich" A PERSON.NOM=HAVE_D.NOM

    c) kolik lidí žije v bytě na konkrétní adrese?

    VYBERTE POČET (*) OD OSOBY WHERE ADR="Zelenograd, 1001-45"

    Jedním ze způsobů, jak porozumět tomu, jak se provádějí souhrnné dotazy s agregačními funkcemi, je představit si provádění dotazu jako rozdělené na dvě části. Nejprve se určí, jak by dotaz fungoval bez agregačních funkcí, které by vracely více řádků výsledků. Agregační funkce se pak použijí na výsledky dotazu a vrátí jeden souhrnný řádek.

    Zvažte například následující složitý dotaz: najděte průměrný celkový příjem na hlavu, součet celkových příjmů rezidentů a průměrný příjem zdroje jako procento z celkového příjmu rezidenta. Odpověď dává operátor

    SELECT AVG(SUMD), SUM(SUMD), (100*AVG(PENÍZE/SUMD)) OD OSOBY, PROFIT, HAVE_D WHERE PERSON.NOM=MAVE_D.NOM A HAVE_D.ID=PROFIT.ID

    Bez agregačních funkcí by dotaz vypadal takto:

    VYBERTE SOUČET, SOUČET, PENÍZE/SOUČET OD OSOBY, PROFIT, HAVE_D WHERE PERSON.NOM=HAVE_D.NOM AND HAVE_D.ID=PROFIT.ID

    a vrátí jeden řádek výsledků pro každého rezidenta a konkrétní zdroj příjmu. Agregační funkce používají sloupce tabulky výsledků dotazu k vytvoření jednořádkové tabulky se souhrnnými výsledky.

    V řetězci vrácených sloupců můžete zadat agregační funkci místo jakéhokoli názvu sloupce. Může být například součástí výrazu, který přidává nebo odečítá hodnoty dvou agregačních funkcí:

    VYBERTE MAX (SUMD)-MIN (SUMD) OD OSOBY

    Agregační funkce však nemůže být argumentem jiné agregační funkce, tzn. vnořené agregační funkce jsou zakázány.

    V seznamu vrácených sloupců také nemůžete používat agregační funkce a běžné názvy sloupců současně, protože to nedává smysl, například:

    VYBERTE FIO, SOUČET (SUMD) OD OSOBY

    Zde první prvek seznamu říká DBMS, aby vytvořil tabulku, která se bude skládat z několika řádků a bude obsahovat jeden řádek pro každého obyvatele. Druhý prvek seznamu žádá DBMS, aby vrátil jednu výslednou hodnotu, která je součtem hodnot ve sloupci SUMD. Tyto dva směry si odporují, což vede k chybě.

    Výše uvedené se nevztahuje na případy zpracování poddotazů a dotazů se seskupováním.

    Norma ISO definuje následujících pět agregační funkce:

    POČET– vrátí počet hodnot v zadaném sloupci;

    SOUČET– vrátí součet hodnot v zadaném sloupci;

    AVG– vrátí průměrnou hodnotu v zadaném sloupci;

    MIN– vrátí minimální hodnotu v zadaném sloupci;

    MAX- vrátí maximální hodnotu v zadaném sloupci.

    Všechny tyto funkce pracují s hodnotami v jednom sloupci tabulky a vracejí jedinou hodnotu. Funkce COUNT, MIN a MAX platí pro numerická i nenumerická pole, zatímco funkce SUM a AVG lze použít pouze pro numerická pole. S výjimkou COUNT(*) jsou při výpočtu výsledků jakýchkoli funkcí nejprve odstraněny všechny hodnoty null, poté se požadovaná operace použije pouze na zbývající nenulové hodnoty sloupce. Varianta COUNT (*) je speciální případ použití funkce COUNT – jejím účelem je spočítat všechny řádky v tabulce, ať už obsahují hodnoty null, duplikáty nebo jakoukoli jinou hodnotu. Pokud chcete před použitím agregační funkce odstranit duplicitní hodnoty, musíte před název sloupce v definici funkce zadat klíčové slovo DISTINCT. Norma ISO umožňuje použití klíčového slova ALL k explicitnímu označení, že odstranění duplicitních hodnot není vyžadováno, ačkoli toto klíčové slovo je implicitně implicitní, pokud nejsou specifikovány žádné další kvalifikátory. Klíčové slovo DISTINCT nemá pro funkce MIN a MAX žádný význam. Jeho použití však může ovlivnit výsledky funkcí SUM a AVG, proto byste měli předem zvážit, zda má být přítomen v každém konkrétní případ. Také klíčové slovo DISTINCT lze v každém dotazu zadat nejvýše jednou.

    Všimněte si, že agregační funkce lze použít pouze ve výběrovém seznamu SELECT a v klauzuli HAVING (viz část 5.3.4). Ve všech ostatních případech není použití těchto funkcí povoleno. Pokud seznam SELECT obsahuje agregační funkci a v těle dotazu není žádná klauzule GROUP BY, která poskytuje seskupování dat, pak žádný z prvků výběrového seznamu SELECT nemůže obsahovat žádné odkazy na sloupce, pokud tento sloupec není použit jako agregační funkce. parametr. Například následující dotaz je neplatný:

    VYBRATzaměstnanciNe,POČET (plat)

    Zpersonál;

    Chyba je v tom, že v daná žádost chybí design SKUPINA VYTVOŘENÁ a sloupec staffNo v seznamu SELECT je přístupný bez použití agregační funkce.

    Příklad 13: Použití funkce COUNT(*).Určete, kolik nemovitostí k pronájmu má nájemné vyšší než 350 GBP za měsíc,

    VYBERTE POČET(*) Počet AS

    Zpronajatý majetek

    KDEnájem > 350;

    Omezení počítat pouze ty pronajaté objekty, jejichž nájemné je vyšší než 350 GBP za měsíc, je implementováno pomocí klauzule WHERE. Celkový počet pronajatých objektů, které splňují zadanou podmínku, lze určit pomocí agregační funkce COUNT. Výsledky provádění dotazu jsou uvedeny v tabulce. 23.

    Tabulka 23

    počet

    Příklad 14. Pomocí funkce COUNT(DISTINCT).Určete, kolik různých nemovitostí k pronájmu bylo v květnu 2001 zkontrolováno klienty.

    VYBRAT POČET(ODDÍLpropertyNo) AS počet

    ZProhlížení

    Opět platí, že omezení výsledků dotazu na analýzu pouze těch pronájmů, které byly zkontrolovány v květnu 2001, je dosaženo použitím klauzule WHERE. Celkový počet kontrolovaných objektů, které splňují zadanou podmínku, lze určit pomocí agregační funkce COUNT. Protože však stejný objekt mohou různí klienti zobrazit vícekrát, musí být v definici funkce uvedeno klíčové slovo DISTINCT, aby se z výpočtu vyloučily duplicitní hodnoty. Výsledky provádění dotazu jsou uvedeny v tabulce. 24.

    Tabulka 24

    Příklad 16. Použití funkcí MIN, MAXnAVG.Vypočítejte hodnotu minimální, maximální a průměrné mzdy.

    ZVOLTE MIN(plat) TAK JAKO min, MAX(plat) TAK JAKO max, AVG(plat) TAK JAKO prům

    Zpersonál;

    V tomto příkladu potřebujete zpracovat informace o všech zaměstnancích ve společnosti, takže nemusíte používat klauzuli WHERE. Požadované hodnoty lze vypočítat pomocí funkcí MIN, MAX a AVG aplikovaných na sloupec platů v tabulce Zaměstnanci. Výsledky provádění dotazu jsou uvedeny v tabulce. 26.

    Tabulka 26

    Výsledek dotazu

    min max prům
    9000.00 30000.00 17000.00

    Výsledky seskupení (konstrukt GROUP BY). Výše uvedené příklady souhrnných dat jsou podobné řádkům souhrnu, které se obvykle nacházejí na konci přehledů. V důsledku toho jsou všechna podrobná data sestavy komprimována do jednoho souhrnného řádku. Ve výkazech je však velmi často vyžadováno tvořit i mezisoučty. Pro tento účel lze v příkazu SELECT zadat klauzuli GROUP BY. Je volán dotaz, který obsahuje klauzuli GROUP BY skupinový dotaz, protože seskupuje data vyplývající z operace SELECT, po které je vytvořen jeden souhrnný řádek pro každou jednotlivou skupinu. Volají se sloupce uvedené v klauzuli GROUP BY seskupené sloupce. Norma ISO vyžaduje, aby klauzule SELECT a GROUP BY úzce souvisely. Při použití klauzule GROUP BY v příkazu SELECT musí mít každá položka seznamu ve výběrovém seznamu SELECT jediná hodnota pro celou skupinu. Navíc konstrukt SELECT může obsahovat pouze následující typy prvků:

    Názvy sloupců;

    agregační funkce;

    konstanty;

    Výrazy, které obsahují kombinace výše uvedených prvků.

    Všechny názvy sloupců v seznamu SELECT se musí také objevit v klauzuli GROUP BY, pokud není název sloupce použit pouze v agregační funkci. Opačné tvrzení není vždy pravdivé – klauzule GROUP BY může obsahovat názvy sloupců, které nejsou v seznamu SELECT. Pokud je klauzule WHERE použita společně s klauzulí GROUP BY, je zpracována jako první a seskupeny jsou pouze ty řádky, které splňují podmínku vyhledávání. Norma ISO určuje, že při seskupování se všechny chybějící hodnoty považují za stejné. Pokud dva řádky tabulky ve stejném sloupci seskupení obsahují hodnoty NULL a stejné hodnoty ve všech ostatních neprázdných sloupcích seskupení, umístí se do stejné skupiny.

    Příklad 17: Použití klauzule GROUP BY.Určete počet zaměstnanců pracujících v jednotlivých odděleních společnosti a také jejich celkové mzdy.

    VYBRATpobočkyNe, POČET(personál č.) TAK JAKO počet, SOUČET(plat) TAK JAKO součet

    ZPersonál

    SKUPINA VYTVOŘENÁpobočka č

    SEŘADIT PODLEčíslo pobočky;

    Názvy sloupců staffNo a plat není nutné uvádět v seznamu prvků GROUP BY, protože se objevují pouze v seznamu SELECT s agregačními funkcemi. Sloupec branchNo v seznamu klauzule SELECT zároveň není přidružen k žádné agregační funkci a z tohoto důvodu musí být uveden v klauzuli GROUP BY. Výsledky provádění dotazu jsou uvedeny v tabulce. 27.

    Tabulka 27

    Výsledek dotazu

    pobočka č Počet součet
    B003 54000.00
    B005 39000.00
    B007 9000.00

    Koncepčně se při zpracování tohoto požadavku provádějí následující akce.

    1. Řádky tabulky Zaměstnanci jsou rozděleny do skupin podle hodnot ve sloupci čísla pobočky společnosti. V každé ze skupin jsou údaje o všech zaměstnancích jednoho z oddělení společnosti. V našem příkladu budou vytvořeny tři skupiny, jak je znázorněno na obr. 1.

    2. Pro každou ze skupin se vypočítá celkový počet řádků, který se rovná počtu zaměstnanců oddělení, a také součet hodnot ve sloupci plat, což je součet mezd všech oddělení zaměstnanci, kteří nás zajímají. Poté se vygeneruje jeden souhrnný řádek pro celou skupinu zdrojových řádků.

    3. Přijaté řádky výsledné tabulky jsou seřazeny vzestupně podle čísla pobočky uvedeného ve sloupci branchNo.

    pobočka č personál č Plat
    B003 SG37 12000.00
    B003 SG14 18000.00
    B003 SG5 24000.00
    B005 SL21 30000.00
    B005 SL41 9000.00
    B007 SA9 9000.00
    POČET(personál č.) SUM(plat)
    54000.00
    39000.00
    9000.00

    Rýže. 1. Tři skupiny záznamů vytvořené při provádění dotazu

    Standard SQL umožňuje umístění poddotazů do výběrového seznamu SELECT. Výše uvedený dotaz tedy může být reprezentován také takto:

    VYBRATčíslo pobočky, (VYBRAT POČET(číslo personálu)TAK JAKO počet

    Zzaměstnanci s

    KDEs.branchNo = b.branchNo),

    (SELECT SUM(plat) JAKO součet

    Zzaměstnanci s

    KDEs.branchNo = b.branchNo)

    Zvětev b

    SEŘADIT PODLEčíslo pobočky;

    Ale v této verzi dotazu se pro každou z poboček společnosti popsaných v tabulce Poboček vygenerují dva výsledky výpočtu agregačních funkcí, takže v některých případech se mohou objevit řádky obsahující nulové hodnoty.

    Omezení seskupování (konstrukt HAVING). Klauzule HAVING je určena k použití ve spojení s klauzulí GROUP BY ke specifikaci omezení pro výběr těch skupiny, který bude umístěn do výsledné tabulky dotazu. Přestože klauzule HAVING a WHERE mají podobnou syntaxi, jejich účel je odlišný. Klauzule WHERE je navržena k výběru jednotlivých řádků určených k vyplnění výsledné tabulky dotazů a konstrukce HAVING se používá k výběru skupiny, umístěn ve výsledné tabulce dotazů. Norma ISO vyžaduje, aby názvy sloupců použité v klauzuli HAVING byly přítomny v seznamu prvků GROUP BY nebo použity v agregačních funkcích. V praxi podmínky vyhledávání v klauzuli HAVING vždy obsahují alespoň jednu agregační funkci; jinak by tyto hledané výrazy měly být umístěny do klauzule WHERE a použity pro výběr jednotlivých řádků. (Nezapomeňte, že agregační funkce nelze použít v klauzuli WHERE.) Klauzule HAVING není nezbytnou součástí jazyka SQL – jakýkoli dotaz napsaný pomocí klauzule HAVING lze znázornit jinak, aniž byste ji použili.

    Příklad 18: Použití konstruktu HAVING.Pro každou pobočku společnosti s více zaměstnanci určete počet zaměstnanců a výši jejich mezd.

    VYBRATpobočkyNe, COUN T (č. personálu) TAK JAKO počet, SOUČET(plat) TAK JAKO součet

    ZPersonál

    SKUPINA VYTVOŘENÁpobočka č

    POČÍTAT(číslo personálu) > 1

    SEŘADIT PODLEčíslo pobočky;

    Tento příklad je podobný předchozímu, ale používá další omezení k označení toho, že nás zajímají pouze informace o těch odděleních společnosti, která zaměstnávají více než jednu osobu. Podobný požadavek platí pro skupiny, takže dotaz by měl používat konstrukci HAVING. Výsledky provádění dotazu jsou uvedeny v tabulce. 28.

    Tabulka 28

    pobočka č počítat součet
    В00 З 3 54000,00
    B005 2 39000,00

    Dílčí dotazy. V této části probereme použití úplných příkazů SELECT vložených do těla jiného příkazu SELECT. Externí(Druhý) příkaz SELECT používá výsledek provedení vnitřní(první) výrok k určení obsahu konečného výsledku celé operace. Vnitřní dotazy mohou být v klauzulích WHERE a HAVING vnějšího příkazu SELECT, v takovém případě se nazývají poddotazy nebo vnořené dotazy. Interní příkazy SELECT lze také použít v příkazech INSERT, UPDATE a DELETE . Existují tři typy poddotazů.

    Skalární poddotaz vrátí hodnotu vybranou z průsečíku jednoho sloupce s jedním řádkem, tzn. jediná hodnota. V zásadě lze skalární poddotaz použít všude tam, kde je vyžadována jediná hodnota. Varianty skalárních dílčích dotazů jsou uvedeny v příkladech 13 a 14.

    Řetězcový poddotaz vrátí hodnoty více sloupců tabulky, ale jako jeden řádek. Řetězcový poddotaz lze použít kdekoli, kde se používá konstruktor hodnot řetězce – obvykle predikáty. Varianta poddotazu řetězce je uvedena v příkladu 15.

    Poddotaz tabulky vrátí hodnoty jednoho nebo více sloupců tabulky zahrnující více než jeden řádek. Poddotaz tabulky lze použít všude tam, kde je povolena tabulka, například jako operand predikátu IN.

    Příklad 19: Použití poddotazu s testem rovnosti. Komponovat seznam zaměstnanců působících v pobočce společnosti, která se nachází na adrese 463 Main St1.

    VYBRAT

    ZPersonál

    KDEčíslo větve = (VYBRAT číslo větve

    Zvětev

    KDEulice = "163 Main S t ");

    Interní příkaz SELECT (SELECT branchNo FROM Branch ...) je určen k určení čísla pobočky společnosti se sídlem na "163 Main St". (Existuje pouze jedna taková pobočka společnosti, takže tento příklad je příkladem skalárního poddotazu.) Po získání požadovaného čísla pobočky se provede externí poddotaz pro získání podrobných informací o zaměstnancích v dané pobočce. Jinými slovy, vnitřní příkaz SELECT vrací tabulku skládající se z jediné hodnoty „BOOV". Jedná se o číslo pobočky společnosti umístěné na adrese „163 Main St1. Výsledkem je, že vnější příkaz SELECT bude:

    VYBRATstaffNo, fName, Iname, position

    ZPersonál

    KDEčíslo větve = "B0031;

    Výsledky tohoto dotazu jsou uvedeny v tabulce. 29.

    Tabulka 29

    Výsledek dotazu

    personál č fName Iname pozice
    SG37 Ann Buk Asistent
    SG14 Davide Brod Dozorce
    SG5 Susan značka manažer

    Poddotaz je nástroj pro vytvoření dočasné tabulky, jejíž obsah načte a zpracuje externí operátor. Poddotaz lze zadat přímo za operátory porovnání (tj. operátory =,<, >, <=, >=, <>) v klauzuli WHERE nebo HAVING. Text dílčího dotazu musí být uzavřen v závorkách.

    Příklad 20. Použití poddotazů s agregačními funkcemi. Vytvořte seznam všech zaměstnanců, kteří jsou placeni nadprůměrně, a uveďte, o kolik jejich mzda převyšuje průměrnou mzdu v podniku.

    VYBRATstaffNo, fName, INname, pozice, plat - ( VYBERTE AVG(plat) Z personál) TAK JAKO salDiff

    ZPersonál

    KDEplat > ( VYBERTE AVG(plat) Z Personál) ;

    Je třeba poznamenat, že nelze přímo zahrnout do dotazovací výraz"WHERE plat > AVG (plat)", od použití agregace funkce v klauzuli WHERE nejsou povoleny. Chcete-li dosáhnout požadovaného výsledku, měli byste vytvořit poddotaz, který vypočítá průměrnou roční mzdu a poté jej použít ve vnějším příkazu SELECT k výběru informací o těch zaměstnancích ve společnosti, jejichž mzda tento průměr přesahuje. Jinými slovy, dílčí dotaz vrátí průměrnou mzdu společnosti za rok, což je 17 000 GBP.

    Výsledek provedení tohoto skalárního poddotazu slouží ve vnějším příkazu SELECT jak k výpočtu odchylky mezd od průměrné úrovně, tak k výběru informací o zaměstnancích. Vnější příkaz SELECT se tedy stane:

    VYBRATstaffNo, fName, INname, pozice, plat - 17000 Tak jako salDiff

    ZPersonál

    KDEmzda > 17000;

    Výsledky provádění dotazu jsou uvedeny v tabulce. třicet.

    Tabulka 30

    Výsledek dotazu

    personál č fName Iname pozice salDiff
    SL21 John Bílý manažer 13000.00
    SG14 Davide Brod Dozorce 1000.00
    SG5 Susan značka manažer 7000.00

    Platí dílčí dotazy dodržování pravidel a omezení.

    1. Poddotazy by neměly používat klauzuli ORDER BY, i když může být přítomna ve vnějším příkazu SELECT.

    2. Seznam SELECT poddotazu musí obsahovat názvy jednotlivých sloupců nebo výrazy z nich vytvořené, pokud není v poddotazu použito klíčové slovo EXISTS.

    3. Názvy sloupců v poddotazu standardně odkazují na tabulku, jejíž název je uveden v klauzuli FROM poddotazu. Je však také povoleno odkazovat na sloupce tabulky uvedené v klauzuli FROM vnějšího dotazu pomocí kvalifikovaných názvů sloupců (jak je popsáno níže).

    4. Pokud je poddotaz jedním ze dvou operandů zahrnutých do operace porovnání, pak musí být poddotaz specifikován na pravé straně této operace. Například zápis dotazu z předchozího příkladu níže je nesprávný, protože poddotaz je umístěn na levé straně operace porovnání proti hodnotě sloupce platu.

    VYBRAT

    ZPersonál

    KDE(VYBRAT AVG (plat) ZE zaměstnanců)< salary;

    Příklad 21. Vnořené poddotazy a použití predikátu IN. Vytvořte seznam nemovitostí k pronájmu, pro které zaměstnanci pobočky společnosti sídlící na adrese „163 Main st1.

    VYBRATpropertyNo, ulice, město, PSČ, typ, pokoje, nájem

    Zpronajatý majetek

    Kapitola 5. Jazyk SQL: Manipulace s daty 189

    KDEstaffNo IN (SELECT staffNo

    ZPersonál

    KDEbrancliNo = (SELECT branchNo

    Zvětev

    KDEulice = "163 Main St"));

    První, nejinternější, dotaz je určen k určení čísla pobočky společnosti na adrese 463 Main St. dat a proto nelze použít operátor porovnání =.Namísto toho musíte použít klíčové slovo IN.Externí dotaz získá informace o pronajatých předmětech, za které odpovídají zaměstnanci společnosti, o kterých byla získána jako výsledek zprostředkujícího dotazu.Výsledky dotazu jsou uvedeny v tabulce 31.

    Tabulka 31

    Výsledek dotazu

    č. nemovitosti ulice město PSČ typ pokoje pronajmout si
    PG16 5 Novar Dr Glasgow G129AX Byt
    PG36 2 Manor Road Glasgow G324QX Byt
    PG21 18 Dale Road Glasgow G12 Dům

    Klíčová slova ANY a ALL. Klíčová slova ANY a ALL lze použít s poddotazy, které vracejí jeden sloupec čísel. Pokud poddotazu předchází klíčové slovo ALL, je podmínka porovnání považována za splněnou pouze v případě, že platí pro všechny hodnoty ve sloupci výsledků poddotazu. Pokud před textem poddotazu předchází klíčové slovo ANY, bude podmínka porovnání považována za splněnou, pokud bude splněna alespoň pro jednu (jednu nebo více) hodnot ve výsledném sloupci poddotazu. Pokud je výsledkem poddotazu prázdná hodnota, pak pro klíčové slovo ALL bude podmínka porovnání považována za splněnou a pro klíčové slovo ANY bude považována za neúspěšnou. Podle normy ISO můžete navíc použít klíčové slovo SOME, které je synonymem pro klíčové slovo ANY.

    Příklad 22. Pomocí klíčových slov ANY a SOME. Najděte všechny zaměstnance, jejichž plat převyšuje alespoň plat jeden zaměstnanec pobočky společnosti pod číslem „booz“.

    VYBRATstaffNo, fName, INname, pozice, plat

    ZPersonál

    KDEplat > NĚJAKÉ(VYBRAT plat

    ZPersonál

    KDEbranchNo="B003");

    I když lze tento dotaz napsat pomocí poddotazu, který specifikuje minimální mzdu pro zaměstnance oddělení s číslem „WHO“, po kterém může vnější poddotaz vybrat informace o všech zaměstnancích společnosti, jejichž mzda tuto hodnotu přesahuje (viz příklad 20), je možný i jiný přístup, spočívající v použití klíčových slov SOME/ANY. V tomto případě vnitřní poddotaz vygeneruje sadu hodnot (12 000, 18 000, 24 000) a vnější dotaz vybere podrobnosti o těch pracovnících, jejichž plat je větší než kterákoli z hodnot v tomto

    set (ve skutečnosti více než minimální hodnota - 12000). Tento alternativní způsob lze považovat za přirozenější než definování minimální mzdy v dílčím dotazu. Ale v obou případech jsou generovány stejné výsledky provádění dotazu, které jsou uvedeny v tabulce. 32 .

    Tabulka 32

    Výsledek dotazu

    personál č fName Iname pozice plat
    SL21 John Bílý manažer 30000.00
    SG14 Davide Brod Dozorce 18000.00
    SG5 Susan značka manažer 24000.00

    Příklad 23. Pomocí klíčového slova ALL. Najděte všechny zaměstnance, jejichž mzda je vyšší než mzda kteréhokoli zaměstnance v pobočce firmy s číslem „booz“.

    VYBRATstaffNo, fName, INarae, pozice, plat

    ZPersonál

    KDEplat > VŠECHNO(VYBRAT plat

    ZPersonál

    KDEčíslo větve = "BOG3");

    Obecně je tento dotaz podobný předchozímu. A v tomto případě by bylo možné použít poddotaz, který určí maximální hodnotu mzdy pracovníků oddělení pod číslem „BOOS“, a následně externím dotazem vybrat informace o všech zaměstnancích firmy, jejichž mzda tuto hodnotu převyšuje. V tomto příkladu je však zvolen přístup klíčových slov ALL. Výsledky provádění dotazu jsou uvedeny v tabulce. 33 .

    Tabulka 33

    Výsledek dotazu

    personál č Iname fName pozice plat
    SL21 Bílý John manažer 30000,00

    Vícetabulkové dotazy. Všechny výše uvedené příklady mají stejné důležité omezení: sloupce umístěné ve výsledné tabulce jsou vždy vybírány z jedné tabulky. To však v mnoha případech nestačí. Chcete-li ve výsledné tabulce sloučit sloupce z několika zdrojových tabulek, musíte provést operaci spojení. V SQL se operace spojení používá ke spojení informací ze dvou tabulek vytvořením dvojic souvisejících řádků vybraných z každé tabulky. Páry řádků umístěné v kombinované tabulce jsou složeny z rovnosti hodnot zadaných sloupců, které jsou v nich obsaženy.

    Pokud potřebujete načíst informace z více tabulek, můžete buď použít poddotaz, nebo tabulky spojit. Pokud výsledná tabulka dotazu musí obsahovat sloupce z různých zdrojových tabulek, pak je vhodné použít mechanismus spojení tabulek. K provedení spojení postačí zadat názvy dvou nebo více tabulek v klauzuli FROM, oddělit je čárkami a poté do dotazu zahrnout klauzuli WHERE s definicí sloupců použitých ke spojení zadaných tabulek. Kromě toho můžete místo názvů tabulek použít přezdívky, jim byly přiřazeny v konstrukci FROM. V tomto případě musí být názvy tabulek a k nim přiřazené aliasy odděleny mezerami. Aliasy lze použít ke kvalifikaci názvů sloupců, kdykoli existuje nejednoznačnost, do které tabulky konkrétní sloupec patří. Kromě toho lze aliasy použít ke zkrácení názvů tabulek. Pokud je pro tabulku definován alias, lze jej použít kdekoli, kde je vyžadován název této tabulky.

    Příklad 24. Jednoduché připojení. Udělejte si jmenný seznam všech klientů, kteří si již prohlédli alespoň jednu nemovitost k pronájmu a vyjádřili svůj názor na tuto záležitost.

    VYBRATc.clientNo, fName, Iname, propertyNo, comment

    ZKlient c, Prohlížení v

    KDEc.clientNo = v.clientNo;

    Tato sestava musí prezentovat informace z tabulky Klient i prohlížecí tabulky, takže při sestavování dotazu použijeme mechanismus spojení tabulek. Konstrukce SELECT uvádí seznam všech sloupců, které by měly být umístěny ve výsledkové tabulce dotazu. Všimněte si, že sloupec s číslem klienta (clientNo) musí být kvalifikovaný, protože takový sloupec může být také přítomen v jiné tabulce účastnící se spojení. Proto je nutné výslovně uvést, o které tabulkové hodnoty máme zájem. (V tomto příkladu jste také mohli vybrat hodnoty sloupce clientNo z tabulky Zobrazení). Kvalifikace názvu se provádí tak, že před název sloupce se přidá název příslušné tabulky (nebo její alias). V našem příkladu je hodnota "c" určena jako alias pro tabulku Klient. K vytvoření výsledných řádků se použijí ty řádky zdrojových tabulek, které mají identickou hodnotu ve sloupci clientNo. Tato podmínka je určena zadáním vyhledávací podmínky c.clientNo=v.clientNo. Obdobné sloupce zdrojových tabulek se nazývají odpovídající sloupce. Popsaná operace je ekvivalentní operaci spojuje rovnostírelační algebra. Výsledky provádění dotazu jsou uvedeny v tabulce. 34.

    Tabulka 34

    Výsledek dotazu

    klient č fName Iname č. nemovitosti komentář
    CR56 Aline Stewarte PG36
    CR56 Aline Stewarte PA14 příliš malá
    CR56 Aline Stewarte PG4
    CR62 Marie Tregear PA14 žádná jídelna
    CR76 John Kay PG4 příliš vzdálené

    Dotazy na více tabulek se nejčastěji provádějí na dvou tabulkách spojených vztahem jedna k mnoha (1:*) nebo vztahem rodič-dítě. Ve výše uvedeném příkladu, který zahrnuje přístup k tabulkám Klient a Prohlížení, jsou tyto tabulky spojeny právě takovým vztahem. Každý řádek prohlížecí tabulky (podřízený) je přidružen pouze k jednomu řádku klientské tabulky (nadřazený), zatímco stejný řádek klientské tabulky (nadřazený) může být přidružen.

    s mnoha řádky tabulky prohlížení (dítě). Páry řádků, které se generují při provádění dotazu, jsou výsledkem všech platných kombinací řádků v podřízených a nadřazených tabulkách. Část 3.2.5 podrobně popisuje, jak v relační databázi primární a cizí klíče tabulek vytvářejí vztah „rodič-potomek“. Tabulka obsahující cizí klíč je obvykle podřízená, zatímco tabulka obsahující primární klíč bude vždy nadřazená. Chcete-li použít vztah rodič-podřízený v dotazu SQL, musíte zadat podmínku hledání, která porovná cizí a primární klíč. Příklad 24 porovnává primární klíč tabulky Klient (v. clientNo) s cizím klíčem tabulky Viewing (v. clientNo).

    Standard SQL navíc poskytuje následující způsoby, jak definovat dané připojení:

    ZKlient s PŘIPOJIT Prohlížení v NA c.clientNo = v.clientNo

    ZKlient J OIN Prohlížení POUŽITÍM klient č

    Zklienta PŘIROZENÉ PŘIPOJENÍ Prohlížení

    V každém případě klauzule FROM nahrazuje původní klauzule FROM a WHERE. V prvním případě se však vytvoří tabulka se dvěma identickými sloupci clientNo, zatímco v dalších dvou případech bude výsledná tabulka obsahovat pouze jeden sloupec clientNo.

    Příklad 25. Seřadit výsledky spojení tabulky. U každé pobočky společnosti uveďte personální čísla a jména zaměstnanců, kteří zodpovídají za případná pronajatá zařízení, a uveďte zařízení pro

    na které odpovídají.

    VYBRATs.branchNo, s.staffNo, fName, Iname, propertyNo

    ZStaff s, PropertyForRent p

    KDEs.staffNo = p.staffNo

    SEŘADIT PODLEs.branchNo, s.personalNo, propertyNo;

    Aby se výsledky lépe četly, je výstup tříděn pomocí čísla oddělení jako hlavního klíče řazení a čísla personálu a čísla majetku jako vedlejších klíčů. Výsledky provádění dotazu jsou uvedeny v tabulce. 35.

    Tabulka 35

    Výsledek dotazu

    pobočka č StaffNo fName Iname č. nemovitosti
    SZO SG14 Davide Brod PG16
    SZO SG37 Ann Buk PG21
    SZO SG37 Ann Buk PG36
    BOO5 SL41 Marie Závětří PL94
    SBI7 SA9 Julie aha PA14

    Příklad 26. Spojení tří stolů. U každé pobočky společnosti uveďte personální čísla a jména zaměstnanců, kteří zodpovídají za případné pronajaté objekty, včetně města, ve kterém se pobočka nachází, a čísla objektů, za které každý zaměstnanec odpovídá.

    VYBRAT b.branchNo, b.city, s.staffNo, fName, INname, propertyNo

    Z Pobočka b, Staff s, PropertyForRent p

    KDE b. č. pobočky = č. č. pobočky A č. č. č. = č. č. p

    SEŘADIT PODLE b.pobočka, s.staffNo, propertyNo;

    Výsledná tabulka musí obsahovat sloupce ze tří zdrojových tabulek – Branch, Staff a PropertyForRent – ​​takže dotaz musí tyto tabulky spojit. Tabulky Pobočka a Zaměstnanci lze spojit pomocí podmínky b.pobočka=*s .Číslo pobočky, která propojí pobočky společnosti s pracovníky v nich pracujícími. Tabulky Staff a PropertyForRent lze spojit pomocí podmínky s.staffNo=p.staffNo. V důsledku toho bude každý pracovník spojen s těmi pronajatými předměty, za které odpovídá. Výsledky provádění dotazu jsou uvedeny v tabulce. 36.

    Tabulka 36

    Výsledky dotazu

    pobočka č město zaměstnanciMo fName Iname č. nemovitosti
    B003 Glasgow SG14 Davide Brod PG16
    B003 Glasgow SG37 Ann Buk PG21
    B003 Glasgow SG37 Ann Buk PG36
    B005 Londýn SL41 Julie Závětří PL94
    B007 Aberdeen SA9 Marie aha PA14

    Všimněte si, že standard SQL vám umožňuje používat Alternativní možnost prohlášení klauzulí FROM a WHERE:

    Z(Pobočka b PŘIPOJTE SE k zaměstnancům POUŽÍVAJÍCÍ pobočka č.) TAK JAKO bs

    PŘIPOJITPropertyForRent str POUŽITÍM personál č

    Příklad 27. Seskupení podle více sloupců. Určete počet pronajatých předmětů, za které zodpovídá každý zaměstnanec společnosti.

    VYBRATs.branchNo, S.personalNo, POČET(*) TAK JAKO počet

    FROM Staff s, PropertyForRent p

    KDE S.staffNo = p.staffNo

    SKUPINA VYTVOŘENÁs.branchNo, s.personalNo

    SEŘADIT PODLEs.branchNo, s.personalNo;

    Pro vypracování požadované zprávy je v první řadě nutné zjistit, kdo ze zaměstnanců společnosti odpovídá za pronajaté předměty. Tento problém lze vyřešit spojením tabulek Staff a PropertyForRent ve sloupci staffNo v klauzuli FROM/WHERE. Poté je nutné vytvořit skupiny skládající se z čísla pobočky a personálních čísel jejích zaměstnanců, pro které má sloužit konstrukce GROUP BY. Nakonec je třeba výslednou tabulku seřadit pomocí klauzule ORDER BY. Výsledky provádění dotazu jsou uvedeny v tabulce. 37.

    Tabulka 37

    Výsledek dotazu

    pobočka č personál č počet
    B003 SG14
    B003 SG37
    B005 SL41
    B007 SA9

    Navazování spojení. Spojení je podmnožinou obecnější kombinace dat ze dvou tzv. tabulek karteziánský. Kartézský součin dvou tabulek je další tabulka skládající se ze všech možných dvojic řádků, které jsou součástí obou tabulek. Výslednou sadou sloupců tabulky jsou všechny sloupce první tabulky následované všemi sloupci druhé tabulky. Pokud zadáte dotaz na dvě tabulky bez uvedení klauzule WHERE, bude výsledkem dotazu v prostředí SQL kartézský součin těchto tabulek. Norma ISO navíc poskytuje speciální formát pro příkaz SELECT, který umožňuje vypočítat kartézský součin dvou tabulek:

    SELECT(* j seznam sloupců]

    FROM tableNamel CROSS JOINCayeUlte2

    Uvažujme znovu příklad, ve kterém se spojení klienta a tabulky prohlížení provádí pomocí společného sloupce clientNo Při práci s tabulkami, jejichž obsah je uveden v tabulce. 3.6 a 3.8, kartézský součin těchto tabulek bude mít 20 řádků (4 řádky tabulky Klient x 5 řádků prohlížecí tabulky = 20 řádků). To je ekvivalentní zadání dotazu použitého v příkladu 5-24, ale bez klauzule WHERE. Postup pro generování tabulky obsahující výsledky spojení dvou tabulek pomocí příkazu SELECT je následující.

    1. Vytvoří se kartézský součin tabulek specifikovaných v konstrukci FROM.

    2. Pokud dotaz obsahuje klauzuli WHERE, aplikujte podmínky vyhledávání na každý řádek kartézské tabulky součinů a uložte do tabulky pouze ty řádky, které splňují dané podmínky. Z hlediska relační algebry se tato operace nazývá omezení kartézský součin.

    3. Pro každý zbývající řádek je určena hodnota každého prvku zadaného v seznamu SELECT, výsledkem čehož je samostatný řádek výsledné tabulky.

    4. Pokud je v původním dotazu přítomen konstrukt SELECT DISTINCT, budou z výsledné tabulky odstraněny všechny duplicitní řádky.

    5. Pokud prováděný dotaz obsahuje klauzuli ORDER BY,


    ©2015-2019 web
    Všechna práva náleží jejich autorům. Tato stránka si nečiní nárok na autorství, ale poskytuje bezplatné použití.
    Datum vytvoření stránky: 2016-08-07