Odlišné příklady sql. KDE – podmínka pro výběr řádků. Nastavení aliasů pro sloupce dotazu

Často když pomocí SQL pro získávání informací z tabulek dostává uživatel redundantní data skládající se z absolutně identických opakujících se řádků. Chcete-li se této situaci vyhnout, použijte odlišný argument SQL v klauzuli Select. Tento článek se bude zabývat příklady použití tohoto argumentu a také situacemi, ve kterých je lepší odmítnout použití argumentu.

Než se pustíme do konkrétních příkladů, vytvořte si v databázi pár potřebných tabulek.

Příprava stolů

Představme si, že máme informace o tapetě uložené v naší databázi, prezentované ve dvou tabulkách. Jedná se o tabulku Oboi s poli id ​​(jedinečný identifikátor), typem (typ tapety - papír, vinyl atd.), barvou (barva), strukturou (strukturou) a cenou (cenou). A tabulka Ostatki (zůstává) s poli id_oboi (odkaz na jedinečný identifikátor v tabulce Oboi) a count (počet rolí na skladě).

Naplňme tabulky daty. Přidejme 9 položek do tabulky tapet:

Papír

Vícebarevné

Reliéfní

Papír dvouvrstvý

Vinyl

Reliéfní

Netkané

Reliéfní

Papír dvouvrstvý

Papír

Vícebarevné

Vinyl

Hnědý

Netkané

Reliéfní

Tkanina

V tabulce je také devět položek se zůstatky:

Začněme popisem toho, jak používat odlišné v SQL.

Místo zřetele v klauzuli Select

Odlišný argument by měl být v dotazech umístěn bezprostředně za klíčové slovo Select. Platí pro všechny sloupce uvedené v klauzuli Select najednou, protože z konečného výsledku dotazu vyloučí absolutně identické řádky. Při psaní tedy stačí uvést jednou SQL dotaz"vybrat odlišné". Výjimkou je použití odlišných v rámci agregačních funkcí, na které se podíváme o něco později.

Je třeba si uvědomit, že většina DBMS nerozpozná váš dotaz, jako je:

SELECT odlišné Ostatki.Count, odlišné Oboi.*

VNITŘNÍ PŘIPOJENÍ Ostatki NA Wallpaper.id = Ostatki.id_oboi

Zde je příslušný argument specifikován několikrát nebo uveden jednou, ale před druhým, třetím nebo jiným vybraným sloupcem. Zobrazí se chyba uvádějící nepřesnosti v syntaxi.

Použití odlišné ve standardních dotazech

Je zřejmé, že při správné konstrukci struktury tabulek a jejich naplnění jsou vyloučeny situace, kdy se v rámci jedné tabulky vyskytují naprosto shodné řádky. Proto je spouštění dotazu „Vybrat odlišné *“, který vybírá z jedné tabulky, nepraktické.

Představme si situaci, kdy potřebujeme zjistit, jaký typ tapety máme pro pohodlí, okamžitě seřaďme podle typu:

Jak vidíte, v tabulce jsou duplicitní řádky. Pokud do klauzule přidáme Select different:

Pokud tedy byly údaje do tabulek správně zaneseny, pak ihned na zavolání či žádost zákazníků budeme schopni odpovědět, že tekuté tapety, skleněné tapety a akrylové tapety nejsou na prodejně dostupné. Vzhledem k tomu, že sortiment v obchodech není obvykle omezen na sto tapet, bylo by procházení seznamu neojedinělých typů značně pracné.

Použití odlišných vnitřních agregačních funkcí

Argument lze použít s libovolnou agregační funkcí. U Min a Max se ale jeho použití nijak neprojeví a při výpočtu součtu či průměrné hodnoty si lze jen málokdy představit situaci, kdy by nebylo potřeba brát ohled na opakování.

Řekněme, že chceme vědět, jak je náš sklad plný, a za tímto účelem odešleme požadavek, který vypočítá celkový počet rolí ve skladu:

pak dostaneme jen 119, protože tapety pod čísly artiklu 3 a 7 jsou na skladě ve stejném množství. Je však zřejmé, že tato odpověď je nesprávná.

Nejběžnější použití výrazu v SQL je s funkcí Count. Můžeme tedy snadno zjistit, kolik jedinečných typů tapet máme:

VYBERTE počet (různý typ tapety)

A získáte výsledek 5 - běžný a dvouvrstvý papír, vinyl, tkanina a netkaná textilie. Každý jistě viděl reklamu typu: „Jen my máme více než 20 druhů různých tapet!“, což znamená, že v tomto obchodě není pár desítek rolí všeho možného, ​​ale tapety široké škály moderních typů.

Zajímavé je, že v jednom požadavku můžete zadat více funkcí Count, buď s nebo bez odlišného atributu. To znamená, že toto je jediná situace, kdy může být rozdíl v Select přítomen několikrát.

Kdy opustit argument

Měli byste se vyhnout použití odlišného argumentu SQL v jednom ze dvou případů:

  • Vybíráte z tabulek a jste si jisti, že hodnoty v každé jsou jedinečné. V tomto případě je použití argumentu nevhodné, protože se jedná o dodatečné zatížení serveru nebo klienta (v závislosti na typu DBMS).
  • Bojíte se ztráty potřebných dat. Nech mě to vysvětlit.
  • Řekněme, že váš šéf vás požádá, abyste uvedli tapetu, kterou máte, pouze ve dvou sloupcích – typ a barva. Ze zvyku zadáte odlišný argument:

    Může se zdát, že máme pouze jeden typ papírové tapety (běžnou a dvouvrstvou), i když ve skutečnosti i v naší malé tabulce jsou každý dva články (výsledek bez rozdílu):

    Proto, stejně jako při psaní jakéhokoli dotazu, musíte být opatrní s odlišným argumentem a kompetentně vyřešit problém jeho použití v závislosti na úkolu.

    Alternativa k odlišnému

    Opakem odlišného argumentu je argument Vše. Při jeho použití se uloží duplicitní řádky. Ale protože ve výchozím nastavení si DBMS myslí, že by měly být vytištěny všechny hodnoty, argument All je spíše kvalifikátorem než skutečným funkčním argumentem.

    Doufáme, že nyní chápete, kdy se používá odlišný (SQL). Popis vám dal úplné informace o vhodnost použití tohoto argumentu při rozhodování různé úkoly. Ostatně, jak se ukázalo, i takto jednoduchý argument v jeho aplikaci skrývá velmi hmatatelnou pravděpodobnost ztráty některých dat a zobrazení nepřesných informací.

    VYBRAT

    Základy SELECT dotazů v Oracle SQL, základní syntaxe dotazů, seznam sloupců, aliasy a literály, operátor q", klíčové slovo ODLIŠNÝ

    Hlavním prostředkem pro získávání informací z databáze jsou dotazy, tedy příkaz SELECT. Základní možnosti tohoto příkazu budou probrány v této části, o dalších, složitějších možnostech bude řeč v následujících částech. Každá část zdůrazní, jak se srovnává s podobnými funkcemi v Microsoft SQL Server.

    Protože všechny hlavní databáze podporují standard ANSI SQL, základní schopnosti jak v Oracle, tak v jiných databázích (Microsoft SQL Server, IBM DB 2, Informix, Sybase, Microsoft Access) budou podobné. Rozdíly jsou v detailech, které standard SQL nedefinuje, ale které jsou poměrně značné a mohou způsobit potíže uživatelům, kteří jsou zvyklí dotazovat se v jiných databázích.

    Základní syntaxe SELECT příkazy v Oracle to vypadá takto:

    SELECT [ DISTINCT ] column_list FROM source WHERE filter ORDER BY sort_expression

    Zde je příklad takového požadavku:

    SELECT zaměstnanec_id, jméno, příjmení, datum_náboru FROM hr.employees WHERE datum_náboru< "01.01.2000" ORDER BY last_name

    Jak vidíme, v žádosti zatím nejsou použity speciální funkce, vypadá naprosto standardně a je zcela identický s podobnými dotazy například v SQL Serveru. Pokud potřebujeme vybrat všechny sloupce z databáze nebo pohledu, můžeme místo seznamu sloupců zadat hvězdičku:

    VYBERTE * FROM hr.employees WHERE datum_náboru< "01.01.2000" ORDER BY last_name

    Zobrazovaný název sloupce lze změnit pomocí aliasu. Chcete-li to provést, jednoduše napište název aliasu bezprostředně za název sloupce nebo použijte klíčové slovo AS (obě syntaxe jsou zcela ekvivalentní):

    SELECT last_name Příjmení FROM hr.employees

    SELECT last_name AS Příjmení FROM hr.employees

    Obzvláště vhodné je použít aliasy pro počítané sloupce, které zpočátku nemají název:

    SELECT last_name AS Příjmení, plat*12 AS "Plat za rok" OD hr.zaměstnanců

    Pokud alias používá mezery nebo nějaký druh servisních znaků, musí být takový alias umístěn v uvozovkách.

    Všimněme si také některých funkcí spojených se seznamem sloupců v Oracle. Zatímco v SQL Serveru mohou být názvy sloupců (s mezerami a vyhrazenými slovy) umístěny v hranatých závorkách (a obvykle ve dvojitých uvozovkách - v závislosti na nastavení relace), v Oracle obě možnosti způsobí chybu.

    Literály můžete zahrnout do seznamu sloupců v Oracle. Literál je jakákoli řetězcová hodnota, datum nebo číslo, které se vejde do seznamu sloupců a není ani názvem sloupce, ani aliasem. Literály se budou opakovat pro každý vrácený sloupec. Obvykle se používají k vytváření anotací ve vrácené sadě výsledků:

    SELECT last_name AS Příjmení, "Plat za rok: " , plat*12 OD hr.zaměstnanců

    V tomto příkladu "Plat za rok: " je literál, který bude vydán pro každý záznam.

    Řetězcové literály a literály data musí být uzavřeny v jednoduchých uvozovkách. Literály ve formě číselných hodnot nejsou umístěny v uvozovkách.

    Všimněte si, že literály jsou ve výstupu často kombinovány s hodnotami vrácenými z databáze pomocí operátoru zřetězení (||). Operátoři Oracle budou diskutováni v částech 2.2, 2.3,.

    Problém, který někdy nastává při práci s literály, je ten, že samotný literál může obsahovat vyhrazený znak, například jednoduché uvozovky. Oracle, na rozdíl například od SQL Serveru, umožňuje uživateli nezávisle definovat znak, který bude použit jako uvozovky. Tato redefinice může vypadat takto. například takto:

    vyberte jméno _ oddělení , q " [ Je přiřazeno ID manažera : ] " , ID _ manažera z oddělení

    Pokus o použití běžných jednoduchých uvozovek na literál bude mít za následek chybu, protože uvozovka se vyskytuje uvnitř hodnoty znaku samotného literálu. Proto v tomto příkladu fungují hranaté závorky jako uvozovky.

    Všimněme si některých vlastností použití operátoru q ":

    • lze použít jako malé písmeno q a kapitál (Q);
    • po q by měl být pravidelný jediný citát. Další jednoduchá uvozovka ukončuje rozsah operátoru q;
    • Bezprostředně za jednoduchými uvozovkami musí být znak zvolený uživatelem, který má být použit jako uvozovky. Tímto znakem může být cokoliv kromě mezery, nového řádku nebo tabulátoru (včetně jednoduchých uvozovek). Pokud uživatel zvolil znak (, (, [ nebo . V ostatních případech se uzavírání uvozovek provádí pomocí stejného znaku, který byl použit k jejich otevření.

    Poslední bod týkající se základní syntaxe dotazu. Ve výchozím nastavení dotaz vrátí všechny hodnoty z databáze, které odpovídají parametrům dotazu, i když některé z vrácených hodnot jsou úplně stejné. Například žádost

    VÝBĚR mzdy OD hod. zaměstnanci

    vrátí 107 řádků, přestože se značná část hodnot bude opakovat.

    Chcete-li vrátit pouze jedinečné hodnoty (nebo sady hodnot, pokud je vráceno více sloupců), můžete v dotazu použít klíčové slovo DISTINCT:

    VYBERTE ODLIŠITOU mzdu OD hr.zaměstnanců

    Takový dotaz vrátí 57 hodnot a všechny hodnoty budou jedinečné.

    Jedinečnou vlastností Oracle je, že můžete použít klíčové slovo UNIQUE namísto DISTINCT. SQL Server to neumožňuje.

    V prvním díle jsme se již trochu dotkli jazyka DML, a to pomocí téměř celé sady jeho příkazů, s výjimkou příkazu MERGE.

    Budu mluvit o DML podle své sekvence vyvinuté na osobní zkušenost. Po cestě se také pokusím mluvit o „kluzkých“ místech, na která stojí za to se zaměřit;

    Protože učebnice je věnována širokému okruhu čtenářů (nejen programátorům), pak bude výklad někdy vhodný, tzn. dlouhé a nudné. To je moje vize materiálu, který jsem získal především v praxi jako výsledek odborné činnosti.

    Hlavním cílem tohoto tutoriálu, krok za krokem, je rozvinout úplné pochopení podstaty jazyka SQL a naučit vás, jak správně aplikovat jeho konstrukce. Prolistování tohoto materiálu by mohlo zajímat i profesionály v této oblasti, možná se budou moci dozvědět něco nového pro sebe, nebo možná bude jen užitečné si jej přečíst, aby si osvěžili paměť. Doufám, že to bude pro každého zajímavé.

    Protože DML v dialektu databáze MS SQL velmi úzce souvisí se syntaxí konstruktu SELECT, takže o DML začnu mluvit s ním. Podle mého názoru je konstrukt SELECT nejdůležitějším konstruktem v jazyce DML, protože díky němu nebo jeho částem jsou potřebná data načtena z databáze.

    Jazyk DML obsahuje následující konstrukce:

    • SELECT – výběr dat
    • INSERT – vložení nových údajů
    • UPDATE – aktualizace dat
    • DELETE – smazání dat
    • MERGE – slučování dat

    V tomto díle se podíváme pouze na základní syntaxi příkazu SELECT, která vypadá takto:

    SELECT seznam_sloupců nebo * FROM zdroj WHERE filtr ORDER BY řazení_výrazu
    Téma příkazu SELECT je velmi široké, proto se v této části zaměřím pouze na jeho základní struktury. Věřím, že bez znalosti základů nemůžete začít studovat složitější struktury, protože pak se vše bude točit kolem tohoto základního designu (poddotazy, spojení atd.).

    Také v rámci tohoto dílu budu mluvit i o TOP nabídce. Záměrně jsem tuto větu neuvedl v základní syntaxi, protože... je implementován odlišně v různých dialektech SQL.

    Pokud je jazyk DDL více statický, tzn. s jeho pomocí se vytvářejí rigidní struktury (tabulky, vztahy atd.), pak je jazyk DML dynamický, zde můžete různými způsoby získat správné výsledky.

    Trénink bude pokračovat i v režimu Krok za krokem, tzn. Při čtení byste se měli okamžitě pokusit dokončit příklad vlastníma rukama. Poté analyzujete získaný výsledek a snažíte se jej intuitivně pochopit. Zůstane-li něco nejasné, například význam funkce, obraťte se o pomoc na internet.

    Příklady budou ukázány v databázi Test, která byla vytvořena pomocí DDL+DML v první části.

    Pro ty, kteří nevytvářeli databázi v první části (protože ne každého může zajímat jazyk DDL), mohou použít následující skript:

    Testovací skript pro vytvoření databáze

    Vytvoření databáze CREATE DATABASE Test GO -- udělejte testovací databázi aktuální USE Test GO -- vytvořte referenční tabulky CREATE TABLE Positions(ID int IDENTITY(1,1) NENÍ NULL OMEZENÍ PK_Positions PRIMÁRNÍ KLÍČ, název nvarchar(30) NOT NULL) CREATE TABLE Departments(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMÁRNÍ KLÍČ, název nvarchar(30) NOT NULL) GO -- vyplňte referenční tabulky sadou dat IDENTITY_INSERT Pozice ON INSERT Pozice(ID,Název)VALUES (1,N"Účetní"), (2,N"Ředitel"), (3,N"Programátor"), (4,N"Senior programátor") SET IDENTITY_INSERT Pozice OFF GO SET IDENTITY_INSERT Departments ON INSERT Departments(ID,Name)VALUES (1,N"Administration"), (2,N"Accounting"), (3,N"IT") NASTAVIT IDENTITY_INSERT Oddělení OFF GO -- vytvořit tabulku se zaměstnanci CREATE TABLE Zaměstnanci(ID int NOT NULL, jméno nvarchar(30), datum narození, e-mail nvarchar(30), PositionID int, DepartmentID int, datum náboru NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSploDATETIME(), ManagerID INT. (ID) , CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_Manager (ID_klíče FOREI.CONSTRAINT)Manager ID_klíče UCON mp loyees_Email UNIQUE (E-mail) , CONSTRAINT CK_Employees_ID CHECK (ID BETWEEN 1000 AND 1999), INDEX IDX_Employees_Name(Jméno)) GO -- vyplňte jej údaji INSERT Zaměstnanci (ID,Jméno,Narozeniny,E-mail,ID pozice,ID)00 VALUEIDENS.1.IManager ", "19550219"," [e-mail chráněný]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [e-mail chráněný]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [e-mail chráněný]",1,2,1000), (1003,N"Andreev A.A.","19820417"," [e-mail chráněný]",4,3,1000)

    To je vše, nyní jsme připraveni začít se učit jazyk DML.

    SELECT – operátor vzorkování dat Nejprve u aktivního editoru dotazů otestujme aktuální databázi výběrem v rozevíracím seznamu nebo pomocí příkazu „USE Test“.

    Začněme nejzákladnější formou SELECT:

    VYBERTE * OD zaměstnanců
    V tomto dotazu požadujeme vrátit všechny sloupce (označené "*") z tabulky Zaměstnanci - můžete to číst jako "VYBRAT všechna_pole Z tabulky zaměstnanců." Pokud existuje seskupený index, vrácená data budou s největší pravděpodobností setříděna podle něj, v v tomto případě podle sloupce ID (ale to není důležité, protože ve většině případů uvedeme řazení v výslovně sami pomocí ORDER BY ...):

    ID Jméno Narozeniny E-mail ID pozice ID oddělení ID náboru ID manažera
    1000 Ivanov I.I. 1955-02-19 [e-mail chráněný] 2 1 2015-04-08 NULL
    1001 Petrov P.P. 1983-12-03 [e-mail chráněný] 3 3 2015-04-08 1003
    1002 Sidorov S.S. 1976-06-07 [e-mail chráněný] 1 2 2015-04-08 1000
    1003 Andreev A.A. 1982-04-17 [e-mail chráněný] 4 3 2015-04-08 1000

    Obecně stojí za to říci, že v dialektu MS SQL nejjednodušší forma SELECT dotazu nemusí obsahovat blok FROM, v takovém případě jej můžete použít k získání některých hodnot:

    SELECT 5550/100*15, SYSDATETIME(), -- získání databázového systému data SIN(0)+COS(0)

    (Žádný název sloupce) (Žádný název sloupce) (Žádný název sloupce)
    825 2015-04-11 12:12:36.0406743 1

    Vezměte prosím na vědomí, že výraz (5550/100*15) dal výsledek 825, i když pokud počítáme na kalkulačce, bude hodnota (832,5). Výsledek 825 byl získán z toho důvodu, že v našem výrazu jsou všechna čísla celá čísla, proto je výsledkem celé číslo, tzn. (5550/100) nám dává 55, nikoli (55,5).

    Pamatujte, že v MS SQL funguje následující logika:

    • Celek / Celek = Celek (tj. v tomto případě existuje celočíselné dělení)
    • Skutečné / Celé číslo = Skutečné
    • Celé číslo / Skutečné = Skutečné
    Tito. výsledek se převede na větší typ, takže v posledních 2 případech dostaneme reálné číslo (myšleno jako v matematice - rozsah reálná čísla je větší než rozsah celých čísel, takže výsledek se převede na něj):

    SELECT 123/10, -- 12 123./10, -- 12,3 123/10. -- 12.3
    Zde (123.) = (123.0) jde jen o to, že v tomto případě lze zahodit 0 a ponechat pouze bod.

    S ostatními aritmetické operace Platí stejná logika, jen v případě rozdělení je tato nuance relevantnější.

    Pozor tedy na datový typ číselné sloupce. Pokud je to celé číslo a potřebujete získat skutečný výsledek, použijte transformaci nebo jednoduše vložte tečku za číslo označené jako konstanta (123.).

    K převodu polí můžete použít funkci CAST nebo CONVERT. Použijme například pole ID, je typu int:

    SELECT ID, ID/100, -- zde dojde k dělení celým číslem CAST(ID AS float)/100, -- pomocí funkce CAST převedete na typ float CONVERT(float,ID)/100, -- použijete funkci CONVERT převést na typ float ID/100. -- použijte transformaci zadáním, že jmenovatelem je skutečné číslo OD Zaměstnanců

    ID (žádný název sloupce) (žádný název sloupce) (žádný název sloupce) (žádný název sloupce)
    1000 10 10 10 10.000000
    1001 10 10.01 10.01 10.010000
    1002 10 10.02 10.02 10.020000
    1003 10 10.03 10.03 10.030000

    Jen poznámka.

    V databázi ORACLE je syntaxe bez bloku FROM nepřijatelná, k tomuto účelu se používá systémová tabulka DUAL, která obsahuje jeden řádek:


    SELECT 5550/100*15, -- a v ORACLE bude výsledek roven 832,5 sysdate, sin(0)+cos(0) FROM DUAL

    Poznámka. Před názvem tabulky v mnoha RDB může předcházet název schématu:

    Schéma je logická jednotka databáze, která má své jméno a umožňuje v sobě seskupovat databázové objekty, jako jsou tabulky, pohledy atd.

    Definice schématu v různých databázích se může v některých případech lišit, schéma přímo souvisí s uživatelem databáze, tzn. v tomto případě můžeme říci, že schéma a uživatel jsou synonyma a všechny objekty vytvořené ve schématu jsou v podstatě objekty daný uživatel. V M.S. SQL schéma je nezávislá logická jednotka, kterou lze vytvořit samostatně (viz VYTVOŘENÍ SCHÉMATU).

    Standardně se v databázi MS SQL vytvoří jedno schéma s názvem dbo (Database Owner) a je to. vytvořené objekty ve výchozím nastavení jsou vytvořeny v tomto schématu. Pokud tedy jednoduše zadáme název tabulky v dotazu, bude prohledávána ve schématu dbo aktuální databáze. Pokud chceme vytvořit objekt v konkrétním schématu, budeme muset před název objektu přidat název schématu, například „CREATE TABLE název_schématu.název_tabulky(...)“.

    V případě čs Název SQL schématu může také předcházet název databáze, ve které se schéma nachází:

    SELECT * FROM Test.dbo.Employees -- název_databáze.název_schematu.tabulka
    Toto objasnění může být užitečné, například pokud:

    • v jednom požadavku přistupujeme k objektům umístěným v různých schématech nebo databázích
    • potřebujete přenést data z jednoho schématu nebo databáze do jiného
    • pokud jste v jedné databázi, musíte si vyžádat data z jiné databáze
    • atd.
    Schéma je velmi pohodlný nástroj, který je užitečné použít při vývoji databázové architektury, zejména velkých databází.

    Nezapomeňte také, že v textu požadavku můžeme použít jak jednořádkové komentáře „-- ...“, tak víceřádkové „/* ... */“. Pokud je požadavek velký a složitý, pak komentáře mohou vám nebo někomu jinému po chvíli velmi pomoci zapamatovat si nebo pochopit jeho strukturu.

    Pokud je v tabulce mnoho sloupců a zejména pokud je v tabulce stále mnoho řádků, plus pokud provádíme dotazy do databáze přes síť, pak by bylo vhodnější vybrat s přímým výpisem pole, která potřebujete, oddělená čárkami:

    SELECT ID,Jméno FROM Zaměstnanci

    Tito. zde říkáme, že potřebujeme vrátit pouze pole ID a Name z tabulky. Výsledek bude následující (mimochodem, optimalizátor se zde rozhodl použít index vytvořený polem Name):

    ID Jméno
    1003 Andreev A.A.
    1000 Ivanov I.I.
    1001 Petrov P.P.
    1002 Sidorov S.S.

    Jen poznámka.

    Někdy je užitečné podívat se, jak se data načítají, například zjistit, které indexy se používají. To lze provést kliknutím na tlačítko „Zobrazit odhadovaný plán provedení“ nebo nastavením „Zahrnout skutečný plán provedení – do výsledku zahrnout skutečný plán provedení dotazu“ (v tomto případě budeme moci vidět skutečný plán, resp. po provedení požadavku):

    Analýza prováděcího plánu je velmi užitečná při optimalizaci dotazu, umožňuje zjistit, které indexy chybí nebo které indexy nejsou vůbec použity a lze je odstranit.

    Pokud jste se právě začali učit DML, pak už to pro vás není tak důležité, vezměte to na vědomí a můžete na to klidně zapomenout (možná to nikdy nebudete potřebovat) – naším prvotním cílem je naučit se základy jazyka DML a naučit se je správně používat a optimalizace je již samostatným uměním. Někdy je důležitější, abyste měli jednoduše správně napsaný dotaz, který vrací správný výsledek z hlediska předmětu, a jednotliví lidé jej již optimalizují. Nejprve se musíte naučit, jak jednoduše správně psát dotazy, pomocí jakýchkoli prostředků k dosažení cíle. Hlavním cílem, kterého nyní musíte dosáhnout, je, aby váš dotaz vrátil správné výsledky.

    Nastavení aliasů pro tabulky Při výpisu sloupců jim může předcházet název tabulky umístěné v bloku FROM:

    SELECT Employees.ID,Employees.Name FROM Employees

    Ale použití této syntaxe je obvykle nepohodlné, protože název tabulky může být dlouhý. Pro tyto účely se obvykle uvádějí a používají kratší názvy - aliasy:
    VYBERTE ID zam.,jméno zam. FROM Zaměstnanci JAKO zam

    nebo

    SELECT emp.ID,emp.Name FROM Zaměstnanci emp -- klíčové slovo AS lze vynechat (preferuji tuto možnost)

    Zde emp je alias pro tabulku Zaměstnanci, který lze použít v kontextu tohoto příkazu SELECT. Tito. můžeme říci, že v kontextu tohoto příkazu SELECT dáváme tabulce nový název.

    Jen poznámka.
    V ORACLE je povolena pouze možnost zadat alias tabulky bez klíčového slova AS.

    DISTINCT – vyřazení duplicitních řádků Klíčové slovo DISTINCT se používá k vyřazení duplicitních řádků z výsledku dotazu. Zhruba řečeno, představte si, že nejprve provedete dotaz bez možnosti DISTINCT a poté z výsledku zahodíte všechny duplikáty. Ukažme si to pro větší názornost na příkladu:

    Vytvořme dočasnou tabulku pro ukázku CREATE TABLE #Trash(ID int NOT NULL PRIMARY KEY, Col1 varchar(10), Col2 varchar(10), Col3 varchar(10)) -- vyplňte tuto tabulku nejrůznějšími odpadky INSERT #Trash (ID,Sloupec1, Sloupec2,Sloupec3)HODNOTY (1,"A","A","A"), (2,"A","B","C"), (3,"C"," A","B"), (4,"A","A","B"), (5,"B","B","B"), (6,"A","A" "B"), (7,"A","A","A"), (8,"C","A","B"), (9,"C","A"," B"), ( 10,"A","A","B"), (11,"A",NULL,"B"), (12,"A",NULL,"B") - podívejme se co požadavek vrátí bez možnosti DISTINCT SELECT Col1,Col2,Col3 FROM #Trash -- podívejme se, co dotaz vrátí s volbou DISTINCT SELECT DISTINCT Col1,Col2,Col3 FROM #Trash -- smažte dočasnou tabulku DROP TABLE #Trash

    Vizuálně to bude vypadat takto (všechny duplikáty jsou označeny stejnou barvou): Nyní se podívejme, kde to lze použít, na praktičtějším příkladu - vrátíme se pouze jedinečné identifikátory

    oddělení (tzn. zjistíme ID oddělení, ve kterých jsou zaměstnanci registrováni):

    VYBERTE DISTINCT ID oddělení OD zaměstnanců

    Tady máme 4 řádky, protože... V naší tabulce nejsou žádné opakující se kombinace (DepartmentID, PositionID).

    Vytváříme nové sloupce ALTER TABLE Zaměstnanci PŘIDAT Příjmení nvarchar(30), -- příjmení Jméno nvarchar(30), -- jméno Prostřední jméno nvarchar(30), -- prostřední jméno Plovoucí plat, -- a samozřejmě plat v některých jednotkách BonusPercent float -- procento pro výpočet bonusu ze mzdy GO -- vyplňte je údaji (některé údaje jsou záměrně vynechány) AKTUALIZACE Zaměstnanci SET Příjmení=N"Ivanov", Jméno=N"Ivan", Prostřední jméno=N"Ivanovich", Plat=5000,BonusPercent= 50 KDE ID=1000 -- Ivanov I.I. AKTUALIZACE Zaměstnanci SET Příjmení=N"Petrov",Jméno=N"Petr",MiddleName=N"Petrovich", Plat=1500,BonusPercent= 15 WHERE ID=1001 -- Petrov P.P. AKTUALIZACE Zaměstnanci SET Příjmení=N"Sidor",Jméno=N"Sidor",MiddleName=NULL, Plat=2500,BonusPercent=NULL WHERE ID=1002 -- Sidorov S.S. AKTUALIZACE Zaměstnanci SET Příjmení=N"Andreev",Jméno=N"Andrey",MiddleName=NULL, Plat=2000,BonusPercent= 30 WHERE ID=1003 -- Andreev A.A.

    Ujistíme se, že data byla úspěšně aktualizována:

    VYBERTE * OD zaměstnanců

    ID Jméno … Příjmení Jméno Prostřední jméno Plat BonusPercent
    1000 Ivanov I.I. Ivanov Ivane Ivanovič 5000 50
    1001 Petrov P.P. Petrov Petr Petrovič 1500 15
    1002 Sidorov S.S. Sidorov Sidor NULL 2500 NULL
    1003 Andreev A.A. Andrejev Andrey NULL 2000 30
    Nastavení aliasů pro sloupce dotazu Myslím, že by bylo jednodušší zobrazit zde, než psát:

    SELECT -- pojmenujte vypočítaný sloupec Příjmení+" "+Jméno+" "+MiddleName AS Celé jméno, -- použití dvojité uvozovky, protože místo se používá HireDate AS "Datum přijetí", -- použití hranaté závorky, protože místo je využito Narozeniny AS [ Datum narození], -- slovo AS není nutné Mzda ZP OD Zaměstn

    Celé jméno Datum přijetí Datum narození ZP
    Ivanov Ivan Ivanovič 2015-04-08 1955-02-19 5000
    Petrov Petr Petrovič 2015-04-08 1983-12-03 1500
    NULL 2015-04-08 1976-06-07 2500
    NULL 2015-04-08 1982-04-17 2000

    Jak vidíme, námi zadané aliasy sloupců se projeví v záhlaví výsledné tabulky. Ve skutečnosti je to hlavní účel aliasů sloupců.

    Vezměte prosím na vědomí, protože poslední 2 zaměstnanci neměli zadané prostřední jméno (hodnota NULL), pak nám výsledek výrazu „Příjmení+“ „+Jméno+“ „+MiddleName“ také vrátil NULL.

    Pro spojení (přidání, zřetězení) řetězců v MS SQL se používá symbol „+“.

    Pamatujte, že všechny výrazy, které obsahují hodnotu NULL (například dělení hodnotou NULL, sčítání s hodnotou NULL), vrátí hodnotu NULL.

    Jen poznámka.
    V případě ORACLE se ke zřetězení řetězců používá operátor „||“. a zřetězení by vypadalo jako "Příjmení||" "||Jméno||" "||MiddleName". Pro ORACLE stojí za zmínku, že má výjimku pro typy řetězců, pro ně jsou NULL a prázdný řetězec "" totéž, takže v ORACLE se takový výraz vrátí pro poslední 2 zaměstnance "Sidorov Sidor" a "Andrey Andrejev“. V době ORACLE 12c, pokud vím, neexistuje žádná možnost, která by toto chování změnila (pokud se mýlím, opravte mě). Tady je pro mě těžké posoudit, jestli je to dobře nebo špatně, protože... V některých případech je chování NULL řetězce pohodlnější, jako v MS SQL, a v jiných, jako v ORACLE.

    V ORACLE jsou také platné všechny aliasy sloupců uvedené výše, kromě [...].


    Abychom neoplotili stavbu pomocí funkce ISNULL, v MS SQL můžeme použít funkci CONCAT. Zvažme a porovnejme 3 možnosti:

    SELECT LastName+" "+FirstName+" "+MiddleName FullName1, -- 2 možnosti pro nahrazení NULL prázdnéřádky "" (dostaneme chování jako v ORACLE) ISNULL(Příjmení,"")+" "+ISNULL(Jméno,"")+" "+ISNULL(MiddleName,"") CeléJméno2, CONCAT(Příjmení," ", Jméno ," ",MiddleName) CeléJméno3 OD Zaměstnanců

    FullName1 FullName2 FullName3
    Ivanov Ivan Ivanovič Ivanov Ivan Ivanovič Ivanov Ivan Ivanovič
    Petrov Petr Petrovič Petrov Petr Petrovič Petrov Petr Petrovič
    NULL Sidorov Sidor Sidorov Sidor
    NULL Andrejev Andrej Andrejev Andrej

    V MS SQL lze aliasy zadat také pomocí rovnítka:

    SELECT "Datum přijetí"=Datum přijetí, -- kromě "..." a […] můžete použít "..." [Datum narození]=Narozeniny, ZP=Plat OD zaměstnanců

    Použití klíčového slova AS nebo rovnítka k určení aliasu je pravděpodobně spíše věcí vkusu. Ale při analýze požadavků jiných lidí mohou být tyto znalosti užitečné.

    Nakonec řeknu, že je lepší nastavit jména pro aliasy pouze pomocí latinských znaků a čísel, vyhnout se použití „…“, „…“ a […], tedy použít stejná pravidla, která jsme použili při pojmenovávání tabulek. . Dále v příkladech budu používat pouze taková jména a žádné „…“, „…“ a […].

    Základní SQL aritmetické operátory
    Priorita provedení aritmetické operátory stejně jako v matematice. V případě potřeby lze změnit pořadí aplikace operátorů pomocí závorek - (a+b)*(x/(y-z)).

    A ještě jednou zopakuji, že jakákoli operace s NULL vygeneruje NULL, například: 10+NULL, NULL*15/3, 100/NULL - z toho všeho bude NULL. Tito. jednoduše řečeno, nedefinovaná hodnota nemůže přinést jednoznačný výsledek. Vezměte to v úvahu při sestavování dotazu a v případě potřeby zpracujte hodnoty NULL pomocí funkcí ISNULL a COALESCE:

    SELECT ID,Jméno, Plat/100*BonusPercent AS Výsledek1, -- bez zpracování hodnot NULL ​​Mzda/100*ISNULL(BonusPercent,0) AS Výsledek2, -- použijte funkci ISNULL Plat/100*COALESCE(BonusPercent,0) AS Výsledek3 - - použijte funkci COALESCE FROM Zaměstnanců

    Řeknu vám něco o funkci COALESCE:

    COALESCE (expr1, expr2, ..., exprn) - Vrátí první neNULL hodnotu ze seznamu hodnot.

    SELECT COALESCE(f1, f1*f2, f2*f3) val -- v tomto případě bude vrácena třetí hodnota FROM (SELECT null f1, 2 f2, 3 f3) q

    Většinou se zaměřím na povídání o konstrukcích DML a z větší části nebudu mluvit o funkcích, které se objeví v příkladech. Pokud nerozumíte, co konkrétní funkce dělá, vyhledejte si její popis na internetu, můžete dokonce vyhledávat informace podle skupiny funkcí najednou, například dotazem v vyhledávání Google"PANÍ. SQL řetězce funkce", "matematické funkce MS SQL" nebo "funkce zpracování NULL MS SQL". Existuje mnoho informací o funkcích a můžete je snadno najít. Například v knihovně MSDN se můžete dozvědět více o funkci COALESCE:

    Výňatek z MSDN srovnání COALESCE a CASE

    Výraz COALESCE je syntaktická zkratka pro výraz CASE. To znamená, že kód COALESCE(výraz1,...n) je přepsán optimalizátorem dotazů jako další výraz VĚC:

    CASE WHEN (výraz1 NENÍ NULL) THEN výraz1 WHEN (výraz2 NENÍ NULL) THEN výraz2 ... ELSE výrazN END

    Podívejme se například, jak můžete použít zbytek dělení (%). Tento operátor velmi užitečné, když potřebujete rozdělit záznamy do skupin. Vytáhněte například všechny zaměstnance, kteří mají sudá osobní čísla (ID), tzn. ta ID, která jsou dělitelná 2:

    VYBERTE ID,Jméno FROM Zaměstnanci WHERE ID%2=0 -- zbytek po vydělení 2 je 0

    ORDER BY – řazení výsledku dotazu Klauzule ORDER BY se používá k řazení výsledku dotazu.

    VYBERTE Příjmení, Jméno, Plat OD zaměstnanců ORDER BY LastName,FirstName -- výsledek seřaďte podle 2 sloupců - podle příjmení a poté podle jména

    Pro poznámku.

    Existuje klíčové slovo ASC pro řazení ve vzestupném pořadí, ale protože vzestupné řazení je výchozí, můžete na tuto možnost zapomenout (nepamatuji si, kdy jsem tuto možnost použil). Stojí za zmínku, že v BY lze použít i pro pole, která nejsou uvedena v klauzuli SELECT (kromě případu, kdy je použit DISTINCT, kterému se budu věnovat níže). Jako příklad trochu předběhnu pomocí možnosti TOP a ukážu, jak si například můžete vybrat 3 zaměstnance, kteří mají nejvyšší plat, s ohledem na to, že z důvodu zachování důvěrnosti bych neměl ukazovat samotný plat:

    SELECT TOP 3 -- vrátit pouze první 3 záznamy z celého výsledku ID,Příjmení,Jméno FROM Zaměstnanci ORDER BY Plat DESC -- seřadit výsledek v sestupném pořadí Plat

    ID Příjmení Jméno
    1000 Ivanov Ivane
    1002 Sidorov Sidor

    Samozřejmě zde nastává případ, že více zaměstnanců může mít stejný plat a je těžké říci, kterým třem zaměstnancům se tento požadavek vrátí, to je nutné řešit s vedoucím úkolu. Řekněme, že po projednání tohoto úkolu s vedoucím jste souhlasili a rozhodli jste se využít následující možnost - provést dodatečné třídění podle pole data narození (tj. vážíme si mladých lidí), a pokud se datum narození více zaměstnanců může shodovat (ostatně to také není vyloučeno), pak můžete provést třetí řazení v sestupném pořadí hodnot ID (poslední ve vzorku budou ti s nejvyšším ID - například ti, kteří byli přijati jako poslední, řekněme personální čísla jsou vydávána postupně):

    SELECT TOP 3 -- vrátit pouze první 3 záznamy z celého výsledku ID,Příjmení,Jméno FROM Zaměstnanci ORDER BY Plat DESC, -- 1. Seřadit výsledek v sestupném pořadí podle Narozeniny platu, -- 2. poté podle Datum narození ID DESC -- 3 a pro úplnou přehlednost výsledku přidáváme řazení podle ID.

    Tito. měli byste se snažit, aby byl výsledek žádosti předvídatelný, abyste v případě debriefingu mohli vysvětlit, proč byli tito konkrétní lidé zařazeni na „černou listinu“, tzn. vše bylo vybráno poctivě, podle stanovených pravidel.

    Můžete také třídit pomocí různých výrazů v klauzuli ORDER BY:

    SELECT LastName,FirstName FROM Zaměstnanci ORDER BY CONCAT(LastName," ",FirstName) -- použijte výraz

    Můžete také použít aliasy určené pro sloupce v ORDER BY:

    SELECT CONCAT(LastName," ",FirstName) fi FROM Zaměstnanci ORDER BY fi -- použijte alias

    Stojí za zmínku, že při použití klauzule DISTINCT lze v klauzuli ORDER BY použít pouze sloupce uvedené v bloku SELECT. Tito. po aplikaci operace DISTINCT dostaneme nová sada data s novou sadou sloupců. Z tohoto důvodu nebude následující příklad fungovat:

    SELECT DISTINCT Příjmení,Jméno,Plat OD Zaměstnanci ORDER BY ID -- ID není ve výsledné sadě, kterou jsme získali pomocí DISTINCT

    Tito. klauzule ORDER BY je aplikována na výslednou sadu předtím, než je výsledek vrácen uživateli.

    Poznámka 1. Můžete také použít čísla sloupců uvedených v SELECT v klauzuli ORDER BY:

    VYBERTE Příjmení,Jméno,Plat FROM Zaměstnanci ORDER BY -- řazení v pořadí 3 DESC, -- 1. sestupně Plat 1, -- 2. podle příjmení 2 -- 3. podle jména

    Pro začátečníky to vypadá pohodlně a lákavě, ale je lepší zapomenout a nikdy tuto možnost třídění nepoužívat.

    Pokud je v tomto případě (když jsou pole explicitně uvedena), tato možnost stále přijatelná, pak v případě použití „*“ je lepší tuto možnost nikdy nepoužívat. Proč - protože pokud někdo například změní pořadí sloupců v tabulce, nebo sloupce smaže (a to je normální situace), váš dotaz může stále fungovat, ale špatně, protože třídění již lze provádět podle jiných sloupců, a to je záludné, protože tato chyba nemusí být odhaleno velmi brzy.

    Pokud by byly pilíře výslovně uvedeny, pak by ve výše uvedené situaci dotaz buď nadále fungoval, ale také správně (protože je vše explicitně definováno), nebo by jednoduše vyhodilo chybu, že tohoto sloupce neexistuje.

    Na řazení podle čísel sloupců tak můžete klidně zapomenout.

    Poznámka 2
    V MS SQL se při vzestupném řazení nejprve zobrazí hodnoty NULL.

    VYBERTE procento bonusu OD zaměstnanců OBJEDNEJTE PODLE procenta bonusu

    Při použití DESC tedy budou na konci

    VYBERTE procento bonusu OD zaměstnanců OBJEDNEJTE PODLE BonusPercent DESC

    Pokud potřebujete změnit logiku pro řazení hodnot NULL, použijte výrazy, například:

    VYBERTE procento bonusu od zaměstnanců ORDER BY ISNULL(procento bonusu,100)

    ORACLE poskytuje pro tento účel dvě možnosti: NULLS FIRST a NULLS LAST (používá se ve výchozím nastavení). Například:

    VYBERTE procento bonusu OD zaměstnanců OBJEDNEJTE PODLE BonusPercent DESC NULLS LAST

    Věnujte tomu pozornost při přechodu na konkrétní databázi.

    TOP – vrátí zadaný počet záznamů z MSDN.

    TOP – Omezuje počet řádků vrácených v sadě výsledků dotazu na zadaný počet nebo procento. Když je klauzule TOP použita ve spojení s klauzulí ORDER BY, je výsledná sada omezena na prvních N řádků seřazeného výsledku. V opačném případě bude prvních N řádků vráceno v nespecifikovaném pořadí. Obvykle se používá s klauzulí ORDER BY a již jsme se podívali na příklady, kdy bylo nutné vrátit prvních N řádků z výsledné sady.

    Obvykle bez ORDER BY tento návrh používá se, když se potřebujeme jen podívat na nám neznámou tabulku, která může mít hodně záznamů, v tomto případě můžeme například požádat o vrácení pouze prvních 10 řádků, ale pro přehlednost řekneme jen 2:

    VYBERTE NEJLEPŠÍ 2 * ZE ZAMĚSTNANCŮ

    Můžete také zadat slovo PERCENT, abyste vrátili odpovídající procento řádků ze sady výsledků:

    VYBERTE NEJLEPŠÍCH 25 PROCENT * ZE ZAMĚSTNANCŮ

    V mé praxi se nejčastěji používá vzorkování podle počtu řádků.

    Můžete také použít možnost S TIES s TOP, která pomůže vrátit všechny řádky v případě nejednoznačného řazení, tzn. tato věta vrátí všechny řádky, které se svým složením shodují s řádky, které spadají do výběru TOP N, v důsledku toho lze vybrat více než N řádků pro ukázku:

    INSERT Zaměstnanci(ID,Jméno,E-mail,ID pozice,ID oddělení,ID manažera,Plat) VALUES(1004,N"Nikolaev N.N."," [e-mail chráněný]",3,3,1003,1500)

    A přidáme dalšího zaměstnance bez uvedení pozice a oddělení s platem 2000:

    INSERT Zaměstnanci(ID,Jméno,E-mail,ID pozice,ID oddělení,ID manažera,Plat) VALUES(1005,N"Alexandrov A.A."," [e-mail chráněný]",NULL,NULL,1000,2000)

    Nyní vybereme pomocí možnosti S VAZBAMI všechny zaměstnance, jejichž mzda se shoduje s platy 3 zaměstnanců, s nejnižší mzdou (doufám, že bude dále jasné, o co mi jde):

    VYBERTE NEJLEPŠÍ 3 S VAZBAMI ID,Jméno,Mzda OD Zaměstnanců OBJEDNÁVKA PODLE Mzd

    Zde, ačkoli je uvedeno TOP 3, požadavek vrátil 4 záznamy, protože hodnota platu, která vrátila TOP 3 (1500 a 2000) byla zjištěna u 4 zaměstnanců. Vizuálně to funguje asi takto:

    Jen poznámka.
    TOP je implementován v různých databázích různými způsoby, v MySQL je na to klauzule LIMIT, ve které lze dodatečně nastavit počáteční offset.

    V ORACLE 12c také představili svůj vlastní analog, kombinující funkcionalitu TOP a LIMIT - hledejte slova „ORACLE OFFSET FETCH“. Před verzí 12c se pro tento účel obvykle používal pseudosloupec ROWNUM.


    Co se stane, když použijete klauzule DISTINCT a TOP současně? Takové otázky lze snadno zodpovědět prováděním experimentů. Obecně se nebojte a nebuďte líní experimentovat, protože... většina se učí praxí. Slovosled v příkazu SELECT je následující: DISTINCT je na prvním místě, následuje TOP, tzn. Pokud uvažujete logicky a čtete zleva doprava, použije se první, kdo zahodí duplikáty, a poté se na základě této sady vytvoří TOP. No, podívejme se a ujistěte se, že je to tento případ:

    VYBERTE ODLIŠIT TOP 2 Mzda OD Zaměstnanců ŘADÍTE PODLE Mzd

    Plat
    1500
    2000

    Tito. v důsledku toho jsme dostali 2 nejmenší platy ze všech. Samozřejmě může nastat případ, že mzda u některých zaměstnanců nemusí být uvedena (NULL), protože Schéma nám to umožňuje. Proto se v závislosti na úloze rozhodneme buď zpracovat hodnoty NULL v klauzuli ORDER BY, nebo jednoduše vyřadit všechny záznamy, pro které je Plat NULL, a k tomu přistoupíme ke studiu klauzule WHERE.WHERE - podmínka pro výběr řádků Tato klauzule se používá k filtrování záznamů podle dané podmínky. Vyberme například všechny zaměstnance pracující v oddělení „IT“ (jeho ID=3):

    VYBERTE ID,Příjmení,Jméno,Plat od zaměstnanců WHERE DepartmentID=3 -- IT ORDER BY LastName,FirstName

    ID Příjmení Jméno Plat
    1004 NULL NULL 1500
    1003 Andrejev Andrey 2000
    1001 Petrov Petr 1500

    Klauzule WHERE se zapisuje před příkaz ORDER BY.

    Pořadí použití příkazů na počáteční sadu Zaměstnanci je následující:

  • KDE – je-li zadáno, pak prvním krokem z celé sady Zaměstnanci je vybrat pouze záznamy, které splňují podmínku
  • DISTINCT – pokud je zadáno, všechny duplikáty jsou zahozeny
  • ORDER BY – pokud je zadáno, je výsledek seřazen
  • TOP – pokud je zadáno, z setříděného výsledku se vrátí pouze zadaný počet záznamů
  • Pro názornost se podívejme na příklad:

    VYBERTE DISTINCT TOP 1 Mzda OD Zaměstnanců KDE ID oddělení=3 OBJEDNAT PODLE Mzdy

    Vizuálně to bude vypadat takto:

    Za zmínku stojí, že kontrola NULL se neprovádí se znaménkem rovná se, ale pomocí operátorů IS NULL a IS NOT NULL. Pamatujte, že nemůžete porovnávat hodnotu NULL pomocí operátoru „=“ (rovná se), protože výsledek výrazu bude také roven NULL.

    Vyberme například všechny zaměstnance, kteří nemají zadané oddělení (tj. DepartmentID IS NULL):

    VYBERTE ID,Jméno FROM Zaměstnanci WHERE DepartmentID JE NULL

    Nyní jako příklad vypočítejme bonus pro všechny zaměstnance, kteří mají zadanou hodnotu BonusPercent (tj. BonusPercent NENÍ NULL):

    VYBERTE ID,Jméno,Plat/100*Procento bonusu JAKO Bonus OD ZAMĚSTNANCŮ, KDE BonusPercent NENÍ NULL

    Ano, mimochodem, pokud se nad tím zamyslíte, hodnota BonusPercent se může rovnat nule (0) a hodnotu lze zadat i se znaménkem mínus, protože jsme tomuto poli neuložili žádná omezení.

    Když jsme o problému řekli, bylo nám prozatím řečeno, abychom zvážili, že pokud (BonusPercent0

    Booleovské operátory a jednoduché porovnávací operátory Ano, bez matematiky se zde neobejdete, pojďme si tedy udělat krátkou exkurzi do booleovských a jednoduchých porovnávacích operátorů.

    V SQL jsou pouze 3 booleovské operátory - AND, OR a NOT:

    Pro každý booleovský operátor můžete poskytnout pravdivostní tabulky, které navíc ukazují, jaký bude výsledek, když podmínky mohou být NULL:

    K vytvoření podmínek se používají následující jednoduché porovnávací operátory:

    Navíc existují 2 operátory pro kontrolu hodnoty/výrazu pro NULL:

    JE NULL NENÍ NULL
    Testování rovnosti NULL
    Testování NULL nerovnosti

    Priorita: 1) Všechny operátory porovnání; 2) NE; 3) AND; 4) NEBO.

    Při konstrukci složitých logických výrazů se používají závorky:

    ((podmínka1 AND podmínka2) NEBO NE(podmínka3 AND podmínka4 AND podmínka5)) NEBO (…)

    Můžete také změnit pomocí závorek standardní sekvence výpočty.

    Zde jsem se pokusil poskytnout představu o Booleově algebře v objemu dostatečném pro práci. Jak vidíte, pro psaní složitějších podmínek se bez logiky neobejdete, ale moc jí tu není (AND, OR a NE) a vymysleli ji lidé, takže je vše celkem logické.

    Přejděme na konec druhé části Jak vidíte, i o základní syntaxi příkazu SELECT se dá mluvit velmi dlouho, ale abychom zůstali v rozsahu článku, nakonec ukážu. další logické operátory– BETWEEN, IN a LIKE.BETWEEN – kontrola zařazení do rozsahu

    Test_value BETWEEN počáteční_hodnota A koncová_hodnota

    Výrazy mohou fungovat jako hodnoty.

    Podívejme se na příklad:

    VYBERTE ID,Jméno,Plat od zaměstnanců, KDE Mzda MEZI 2000 A 3000 -- kdo má plat v rozmezí 2000-3000

    BETWEEN je ve skutečnosti zjednodušený zápis formuláře:

    VYBERTE ID,Jméno,Mzda FROM Zaměstnanci WHERE Plat>=2000 AND Plat=2000 A Mzda SET ( | ) .,.< COLUMN name> = < VALUE expresslon>.< predlcate>[KDE< cursor name>|

    Využití WordPressu, nastavení: v tabulce wp_posts smažte všechny výskyty řádku

    UPDATE wp_posts SET post_content = REPLACE (post_content, "" , "" );

    ODSTRANIT Z

    [ KDE | WHERE CURRENT OF (*pouze příloha*) ];

    ODSTRANIT ZO PARTNERŮ; // smaže veškerý obsah tabulky Peers. DELETE FROM FinR where day Like "20120415%"; // DELETE FROM prices WHERE ratesheet_id NOT IN (SELECT id FROM ratesheets);

    ZMĚNIT

      Změna výchozí hodnoty pro sloupec. Chcete-li nastavit novou výchozí hodnotu pro sloupec, použijte příkaz jako: ALTER TABLE produkty ALTER COLUMN cena SET DEFAULT 7.77 ; OR ALTER TABLE nases ALTER COLUMN zone SET DEFAULT "voip" ;

      Všimněte si, že provedení tohoto příkazu neovlivní již existující řetězce v tabulce příkaz změní výchozí hodnotu pouze pro budoucí příkazy INSERT. Chcete-li odstranit jakoukoli výchozí hodnotu, použijte

      Produkty ALTER TABLE ALTER COLUMN cena DROP DEFAULT ;

      Příkaz provede stejnou věc jako nastavení výchozí hodnoty na null. Vzhledem k tomu, že odstranění výchozí hodnoty implicitně nastaví hodnotu null, nebudou hlášeny žádné chyby, pokud bude odstraněna existující výchozí hodnota.

      Funguje jako výchozí hodnota pro sloupec. V tomto případě je sloupec timetracking typu datové časové razítko a to znamená, že výchozí hodnotu pro něj lze nastavit na vestavěnou funkci now(), tzn. při přidávání nový řádek sloupec bude zapsán aktuální datum a čas ALTER TABLE sledování času ALTER COLUMN datum_wd SET DEFAULT now();

      Přidání omezení. Chcete-li přidat omezení, použije se syntaxe tabulky pro definování tohoto omezení. Například: ALTER TABLE produkty ADD CHECK (název ""); ALTER TABLE produkty ADD CONSTRAINT some_name UNIQUE (product_no); ALTER TABLE produkty PŘIDAT CIZÍ KLÍČ (id_skupiny_produktů) REFERENCE skupiny_produktů;

      Chcete-li přidat nenulovou podmínku, kterou nelze zapsat jako omezení tabulky, použijte syntaxi:

      ALTER TABLE produkty ALTER COLUMN product_no SET NOT NULL;

      Zadané omezení bude vynuceno okamžitě, takže data v tabulce je musí před přidáním omezení splňovat.

    Agregační funkce

    Ve standardním SQL je 5 agregačních funkcí:

      POČET - funkce vrací počet řádků, které splňují určitá kritéria.,

      SUM - vrací součet (celkem) hodnot v konkrétním sloupci. Řádky sloupce s hodnoty NULL jsou funkcí SUM ignorovány.

      AVG - průměrná hodnota ve sloupci,

    Agregační funkce se používají jako názvy polí v klauzuli dotazu SELECT s jednou výjimkou: názvy polí se používají jako argumenty. Funkce SUM a AVG mohou pracovat pouze s číselnými poli. COUNT funkcí, MAX, MIN pracují s numerickými i znakovými poli. Při použití na pole znaků MAX funkcí a MIN mohou pracovat s ekvivalentními znaky ASCII.

    SELECT Count(Books.ID) AS [Počet knih] FROM Books;

    Použití CROUP BY umožňuje aplikovat agregační funkce na skupiny záznamů.

    SELECT Count(Books.ID) AS [Počet knih] FROM Books GROUP BY [Spisovatel];

    Zhlédnutí (ZOBRAZIT)

    VIEW je datový objekt, který neobsahuje žádná data o svém vlastníkovi. Je to typ tabulky, jejíž obsah je načten z jiných tabulek spuštěním dotazu.

    Základní tabulky jsou tabulky, které obsahují data. Existuje však i jiný typ tabulky: - pohledy (VIEW). Pohledy jsou tabulky, jejichž obsah je vybrán nebo získán z jiných tabulek. Fungují v dotazech a příkazech DML stejně jako hlavní tabulky, ale neobsahují žádná vlastní data. Pohledy jsou jako okna, přes která prohlížíte informace, které jsou skutečně uloženy v podkladové tabulce.

      Příkaz CREATE VIEW. Pohled se vytvoří pomocí příkazu CREATE VIEW. Skládá se ze slov CREATE VIEW, názvu pohledu, který je potřeba vytvořit, slova JAKO (JAK) a poté dotazu. Vytvořme zobrazení Londonstaff: CREATE VIEW Londonstaff AS SELECT * FROM Salespeople WHERE city = "London";

      Toto zobrazení se používá stejně jako jakákoli jiná tabulka. Lze jej dotazovat, upravovat, vkládat, odstraňovat a připojovat k jiným tabulkám a pohledům. Žádost o předložení.



       Nahoru