Úvod do MS SQL Server a T-SQL. SQL: univerzálny jazyk pre prácu s databázami

  • 19.05.2019

Stručný popis SQL operátorov

Práca s príkazmi SQL

Výber údajov

Výber údajov je najbežnejšou operáciou vykonávanou pomocou SQL. Príkaz SELECT je jedným z najdôležitejších príkazov v tomto jazyku na výber údajov. Syntax tohto operátora je nasledovná:

SELECT zoznam stĺpcov FROM zoznam tabuliek

Príkazy SELECT musia obsahovať slová SELECT a FROM; ostatné kľúčové slová ako WHERE alebo ORDER BY sú voliteľné.

Po kľúčovom slove SELECT nasleduje informácia o tom, ktoré polia sa majú zahrnúť do výslednej množiny údajov. Hviezdička (*) označuje všetky polia v tabuľke, napríklad:

Na výber jedného stĺpca sa používa nasledujúca syntax:

SELECT CompanyName Príklad výberu viacerých stĺpcov vyzerá takto:

SELECT CompanyName, ContactName, ContactTitle

Ak sa údaje vyberú z niekoľkých tabuliek a súčasne sa z rôznych tabuliek vyberú polia s rovnakým názvom, mali by ste sa pozrieť na názvy tabuliek, aby ste úplne identifikovali polia zahrnuté vo výslednom súbore údajov, napríklad:

SELECT Customers.CompanyName, Shippers.CompanyName

VetaOD

Kľúčové slovo FROM sa používa na zadanie názvov tabuliek, z ktorých sa majú vyberať záznamy, napríklad:

VYBERTE * OD zákazníkov

Tento dotaz vráti všetky polia z tabuľky Zákazníci.

Ak sú v sade výsledkov potrebné iba polia CompanyName a ContactName, môžeme zadať nasledujúcu klauzulu SELECT:

SELECT CompanyName, ContactName FROM Customers

Nižšie je uvedený príklad dotazu na viac ako jednu tabuľku:

VYBERTE Customers.CompanyName, Shippers.CompanyName FROM Customers, Shippers

klauzula WHERE

Na filtrovanie výsledkov vrátených príkazom SELECT môžete použiť klauzulu WHERE, ktorej syntax je:

WHERE výraz1 [(A | ALEBO) výraz2 […]]

Napríklad namiesto získania úplného zoznamu produktov sa môžete obmedziť len na tie produkty, ktoré majú pole CategoryID 4:

SELECT * FROM Products WHERE CategoryID = 4

V klauzule WHERE môžete použiť rôzne výrazy, napríklad:

SELECT * FROM Products WHERE CategoryID = 2 AND SupplierID > 10

SELECT ProductName, UnitPrice FROM Products WHERE CategoryID = 3 ALEBO UnitPrice< 50

SELECT ProductName, UnitPrice FROM Products WHERE Ukončené NENÍ NULL

Výraz „NIE JE NULL“ znamená, že zodpovedajúci stĺpec výsledného súboru údajov nemôže obsahovať hodnoty null. Môžete použiť jeden zo šiestich relačných operátorov definovaných v SQL v klauzule WHERE. Tieto operátory sú uvedené v tabuľke. jeden.

Tabuľka 1 Popis operátora

< Меньше

<= Меньше или равно

<>Nerovná sa

> Viac

>= Väčšie alebo rovné

Okrem jednoduchých porovnávacích operátorov uvedených vyššie môžete použiť aj špeciálne porovnávacie operátory uvedené v tabuľke. 2.

Tabuľka 2 Popis operátora

ALL Používa sa v spojení s operátormi porovnávania pri porovnávaní so zoznamom hodnôt

ANY Používa sa v spojení s operátormi porovnávania pri porovnávaní so zoznamom hodnôt

BETWEEN Používa sa pri kontrole, či je hodnota v danom intervale (vrátane jeho hraníc)

IN Používa sa na kontrolu, či je hodnota v zozname.

LIKE Použije sa pri kontrole, či hodnota zodpovedá danej maske

Uvádzame niekoľko príkladov použitia týchto operátorov. Kľúčové slovo LIKE sa používa na priradenie údajov k maske:

SELECT CompanyName, ContactName FROM Customers WHERE CompanyName LIKE 'M%'

V tejto maske znak '%' (percento) nahrádza ľubovoľnú sekvenciu znakov a znak '_' (podčiarkovník) - ľubovoľný jeden znak. Rovnaký výsledok možno získať nasledujúcim spôsobom:

SELECT CompanyName, ContactName FROM Customers WHERE CompanyName BETWEEN 'M' AND 'N'

V poslednom príklade môžeme rozšíriť rozsah vyhľadávania. Najmä pri hľadaní spoločností, ktorých názvy začínajú písmenami A až C, môžete zadať nasledujúci príkaz SELECT:

SELECT CompanyName, ContactName FROM Customers WHERE CompanyName BETWEEN 'A' AND 'D'

Pomocou operátora LIKE môžeme zúžiť vyhľadávanie použitím zložitejšej porovnávacej masky. Ak chcete napríklad nájsť spoločnosti, ktoré vo svojom názve obsahujú podreťazec bl, môžete použiť nasledujúci dotaz:

SELECT CompanyName, ContactName FROM Customers WHERE CompanyName LIKE '%bl%'

Maska '%bl%' ukazuje, že pred a za hľadaným podreťazcom môže byť ľubovoľný počet ľubovoľných znakov.

Pomocou operátora IN môžete zadať zoznam hodnôt, ktoré by mali obsahovať hodnotu poľa:

SELECT CompanyName, ContactName FROM Customers WHERE CustomerID IN ('ALFKI', 'BERGS', 'VINET')

Operátory AND, OR a NOT

Už sme videli príklad použitia operátora AND pre logické operácie, ktoré vyžadujú, aby záznam spĺňal dve rôzne kritériá. Zvážte nasledujúci dotaz:

SELECT CompanyName, ContactName FROM Customers WHERE CompanyName AKO 'S%' AND Country = 'USA'

Výsledkom tohto dopytu bude zoznam zákazníkov so sídlom v Spojených štátoch, ktorých meno začína písmenom S.

Operátor OR umožňuje vybrať záznamy, ktoré spĺňajú aspoň jednu z uvedených podmienok, zatiaľ čo operátor NOT slúži na vylúčenie záznamov z množiny údajov, ktoré spĺňajú danú podmienku. Operátor OR môžete napríklad použiť na vyhľadanie všetkých zákazníkov, ktorí sa nachádzajú v Kalifornii alebo majú meno začínajúce písmenom S (a nachádzajú sa kdekoľvek):

SELECT CompanyName, ContactName FROM Customers WHERE CompanyName LIKE ‘S%’ OR Region=’CA’

V tomto prípade bude výsledná množina údajov obsahovať záznamy, kde hodnota poľa Názov spoločnosti spĺňa prvú podmienku, plus všetky záznamy, kde hodnota poľa Región spĺňa druhú podmienku.

Teraz sa pozrime na príklad použitia operátora NOT. Ak chcete z výslednej množiny údajov vylúčiť niektorých zákazníkov, môžete použiť dotaz ako:

SELECT CompanyName, ContactName FROM Customers WHERE Country NOT IN ('USA', 'UK')

Na základe tohto dopytu dostaneme zoznam zákazníkov zo všetkých krajín okrem USA a Spojeného kráľovstva.

OBJEDNAJ PODĽA ponuky

Klauzula ORDER BY (voliteľná) sa používa na zoradenie sady výsledkov podľa jedného alebo viacerých stĺpcov. Na definovanie poradia triedenia sa používajú kľúčové slová ASC (vzostupne) alebo DESC (zostupne). V predvolenom nastavení sú údaje zoradené vo vzostupnom poradí. Syntax klauzuly ORDER BY je:

ORDER BY stĺpec1 [(ASC | DESC)] [, stĺpec2 [(ASC | DESC)] [,…]

Ak chcete napríklad zoradiť zamestnancov podľa priezviska a potom podľa mena, použite nasledujúci dotaz SQL:

SELECT Priezvisko, Meno, Titul FROM Zamestnanci ORDER BY Priezvisko, Meno

Ak sa vyžaduje triedenie údajov v zostupnom poradí (napríklad sa vyžaduje zoznam produktov v zostupnom poradí podľa cien), použije sa kľúčové slovo DESC:

SELECT ProductName, UnitPrice FROM Products ORDER BY UnitPrice DESC

Prepojenie tabuliek

Ako sme videli, môžete vytvárať dotazy, ktoré získavajú údaje z viacerých tabuliek. Jedným zo spôsobov, ako to urobiť, je prepojiť tabuľky podľa jedného alebo viacerých polí. Všimnite si, že bez prepojenia tabuliek bude výsledkom dotazu množina údajov obsahujúca všetky možné kombinácie riadkov z každej z pôvodných tabuliek (známe aj ako karteziánsky súčin):

SELECT ProductName, CategoryName FROM Products, Categories

zatiaľ čo dopyt zobrazený nižšie vedie k zoznamu produktov s uvedením, do ktorej kategórie produkt patrí:

SELECT ProductName, CategoryName FROM Products, Categories WHERE Products.CategoryID = Categories.CategoryID

Môžete porovnať výsledky týchto dvoch dopytov. Vo všeobecnosti je syntax prepájacích tabuliek nasledovná:

SELECT zoznam stĺpcov FROM tabuľka1, tabuľka2 WHERE tabuľka1.stĺpec1=tabuľka2.stĺpec2

Nasledujúcich niekoľko príkladov prepojenia tabuliek je špecifických pre Microsoft Access a Microsoft SQL Server a nemusia fungovať s inými DBMS, ale veríme, že funkčnosť, ktorú ilustrujú, je dôležitá.

Existuje niekoľko typov prepojenia tabuliek. Napríklad nasledujúci príkaz SQL vykoná takzvané vnútorné spojenie tabuliek (vnútorné spojenie) - v tomto prípade výsledný súbor údajov obsahuje záznamy, v ktorých sa hodnoty v súvisiacich poliach zhodujú:

SELECT ProductName, CategoryName FROM Products INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID

Takzvané vonkajšie spojenia (vonkajšie spojenia) nám umožňujú zahrnúť do výsledku dotazu všetky riadky z jednej tabuľky a im zodpovedajúce riadky z inej tabuľky. Napríklad:

SELECT ProductName, CategoryName FROM Products LEFT OUTER JOIN Categories ON Products.CategoryID = Categories.CategoryID

Toto bolo takzvané ľavé vonkajšie spojenie. Existujú aj pravé vonkajšie spojenia, ktoré vracajú všetky riadky z druhej (tj pravej) tabuľky a im zodpovedajúce riadky z inej tabuľky:

SELECT ProductName, CategoryName FROM Products RIGHT OUTER JOIN Categories ON Products.CategoryID = Categories.CategoryID

Kombináciou ľavého a pravého vonkajšieho spojenia môžete získať úplné vonkajšie spojenie, ktoré vráti všetky údaje z oboch tabuliek:

SELECT ProductName, CategoryName FROM Products FULL OUTER JOIN Categories ON Products.CategoryID = Categories.CategoryID

Ak chcete získať všetky kombinácie riadkov z oboch tabuliek (karteziánsky súčin), môžete použiť kľúčové slovo CROSS JOIN bez zadania prepojených polí:

SELECT ProductName, CategoryName FROM Products CROSS JOIN Categories

Ak sa v dotaze použijú viac ako tri tabuľky, možno použiť vnorené spojenia.

Ponuka GROUP BY

Ak chcete vypočítať súčty na základe údajov z jednej alebo viacerých tabuliek, môžete použiť klauzulu GROUP BY, ktorá má nasledujúcu syntax:

GROUP BY (stĺpec1) [, …]

Napríklad nasledujúci dotaz prepojí dve tabuľky, zoradí ich podľa poľa CustomerID, vytvorí jeden riadok v množine výsledkov pre každú hodnotu CustomerID a vypočíta počet hodnôt poľa OrderID pre každú hodnotu CustomerID:

SELECT Customers.CustomerID, COUNT(Orders.OrderID) FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID GROUP BY Customers.CustomerID

Vo vyššie uvedenom príklade dotazu sme na výpočet počtu hodnôt použili agregovanú funkciu COUNT v klauzule SELECT.

MAJTE ponuku

Klauzula HAVING má podobný účel ako klauzula WHERE, ale používa sa so súhrnnými údajmi. Napríklad:

SELECT Customers.CustomerID, COUNT (Orders.OrderID) FROM Customers VNÚTORNÉ PRIPOJENIE k objednávkam ON Customers.CustomerID = Orders.CustomerID GROUP BY Customers.CustomerID HAVING COUNT(Orders.OrderID) >= 10

Tento dopyt je podobný predchádzajúcemu, ale do sady výsledkov sú zahrnutí iba zákazníci s desiatimi alebo viacerými objednávkami.

Kľúčové slová ALL a DISTINCT

Až do tohto bodu sme sa zaoberali tým, ako extrahovať všetky alebo dané stĺpce z jednej alebo viacerých tabuliek. Na ovládanie zobrazenia duplicitných riadkov v sade výsledkov môžete použiť kľúčové slová ALL alebo DISTINCT v klauzule SELECT. Kľúčové slovo DISTINCT určuje, že riadky v sade výsledkov musia byť jedinečné, zatiaľ čo kľúčové slovo ALL určuje, že by sa mali vrátiť všetky riadky. Ak chcete napríklad získať názvy krajín, v ktorých sú zákazníci, môžete použiť nasledujúci dotaz:

VYBERTE ODLIŠNÚ krajinu OD zákazníkov

Všimnite si, že kľúčové slovo ALL sa používa podľa definície. Ak dotaz vyžaduje zobrazenie viac ako jedného stĺpca a použije sa slovo DISTINCT, výsledná množina údajov bude obsahovať rôzne riadky, ale niektoré hodnoty toho istého poľa v rôznych riadkoch môžu byť rovnaké.

TOP kľúčové slovo

Kľúčové slovo TOP možno použiť na vrátenie prvých n riadkov alebo prvých n percent tabuľky. Napríklad žiadosť:

VYBERTE NAJLEPŠÍCH 10 * Z PRODUKTOV OBJEDNAJTE PODĽA názvu produktu

vráti prvých 10 produktov z tabuľky, zatiaľ čo dotaz:

VYBERTE NAJLEPŠÍCH 25 PERCENT * Z PRODUKTOV ZOBRAZIŤ PODĽA názvu produktu

vráti prvú štvrtinu záznamov tabuľky.

Úprava údajov

Doteraz sme študovali príkazy SQL na získavanie údajov. Okrem toho možno SQL použiť na aktualizáciu a odstraňovanie údajov, kopírovanie záznamov do iných tabuliek a vykonávanie mnohých ďalších operácií. Nižšie sa pozrieme na príkazy UPDATE, DELETE a INSERT používané na vykonanie niektorých z týchto úloh.

AKTUALIZOVAŤ vyhlásenie

Príkaz UPDATE sa používa na zmenu hodnôt v jednom alebo viacerých stĺpcoch tabuľky. Syntax tohto operátora je:

AKTUALIZOVAŤ SADA tabuliek stĺpec1 = výraz1[, stĺpec2 = výraz2][,…]

Výraz v klauzule SET môže byť konštanta alebo môže byť výsledkom výpočtu. Ak chcete napríklad zvýšiť cenu všetkých produktov, ktoré stoja menej ako 10 USD, môžete spustiť nasledujúci dotaz:

AKTUALIZOVAŤ SADA produktov Jednotková cena = Jednotková cena * 1.1 KDE Jednotková cena< 10

výpis DELETE

Ak chcete odstrániť riadky z tabuliek, použite príkaz DELETE, ktorého syntax je:

VYMAZAŤ Z tabuľky

Pozor! Klauzula WHERE je voliteľná, ale ak ju zabudnete zahrnúť, všetky záznamy sa z tabuľky odstránia.

Ak chcete napríklad zo zoznamu odstrániť všetky produkty, ktoré už nie sú dostupné, môžete spustiť nasledujúci dotaz:

VYMAZAŤ Z produktov, KDE boli ukončené = 1

Všimnite si, že je užitočné použiť príkaz SELECT s rovnakou syntaxou ako príkaz DELETE, aby ste skontrolovali, ktoré záznamy budú vymazané pred ich skutočným odstránením. Nasledujúci text zobrazuje príkaz SELECT pre vyššie uvedený dotaz na odstránenie údajov:

SELECT ProductName FROM Products WHERE Ukončené = 1

V klauzule WHERE môžete použiť zložitejšie kritériá na určenie, ktoré záznamy sa majú vymazať. Predpokladajme, že potrebujeme odstrániť zo zoznamu zákazníkov tých z nich, ktorí pred určitým dátumom nemali objednávky. Ak to chcete urobiť, najskôr vykonajte nasledujúci SELECT, aby ste určili, čo presne odstraňujeme:

SELECT CompanyName FROM Customers WHERE Customers.CustomerID NOT IN (SELECT CustomerID FROM Orders WHERE OrderDate > 01/01/96)

a potom nahraďte príkaz SELECT príkazom DELETE:

DELETE FROM Customers WHERE Customers.CustomerID NOT IN (SELECT CustomerID FROM Orders WHERE OrderDate > 01/01/96)

Komentujte. Pri používaní dátumu alebo času v príkazoch SQL, ako aj v poliach obsahujúcich takéto údaje, by ste mali objasniť syntax takýchto viet v dokumentácii dodanej s použitým DBMS.

príkaz INSERT

Ak chcete pridať záznamy do tabuliek, použite príkaz INSERT, ktorého syntax je:

INSERT tabuľka ( ( VALUES (( DEFAULT | NULL | výraz ) ) [, …])

Ak chcete napríklad pridať nového zákazníka do tabuľky Zákazníci, môžete použiť nasledujúci dotaz:

INSERT INTO Customers (CustomerID, CompanyName) VALUES ('XYZFO', 'XYZ Deli')

Úprava metadát

Existuje niekoľko príkazov SQL správy metadát, ktoré sa používajú na vytváranie, úpravu alebo odstraňovanie databáz a objektov, ktoré obsahujú (tabuľky, pohľady atď.). Pozrieme sa na niektoré z nich: CREATE TABLE, ALTER TABLE a DROP.

Príkaz CREATE TABLE

Ak chcete vytvoriť novú tabuľku, musíte použiť príkaz CREATE TABLE, ktorého syntax je:

CREATE TABLE tabuľka (stĺpec1 typ1 [(veľkosť1)] [, stĺpec2 typ2 [(veľkosť2)] [, ...]] ]]);

V tomto príkaze musíte zadať názov poľa, typ údajov preň (tento typ údajov musí byť podporovaný týmto DBMS), dĺžku (pre niektoré typy polí) a v prípade potreby obmedzenia servera (pomocou OBMEDZENIA kľúčové slovo). Napríklad nasledujúci dotaz vytvorí tabuľku s názvom Jednoduchá so štyrmi stĺpcami – Priezvisko, Meno, E-mail a Domovská stránka:

VYTVORIŤ TABUĽKU jednoducho (Meno varchar(50) NOT NULL, LastName varchar(50) NOT NULL, E-mail varchar(50), HomePage varchar(255))

Túto tabuľku môžeme rozšíriť pridaním poľa PersonID, ktoré sa použije ako primárny kľúč:

CREATE TABLE Simple (PersonID Integer NIE JE NULL PRIMÁRNY KĽÚČ, Meno varchar(50) NOT NULL, LastName varchar(50) NOT NULL, E-mail varchar(50), HomePage varchar(255))

a uveďte, že kombinácia polí Priezvisko a Meno musí byť jedinečná:

CREATE TABLE Simple (PersonID Integer NOT NULL PRIMÁR KEY, FirstName varchar(50) NOT NULL, LastName varchar(50) NOT NULL, E-Mail varchar(50), HomePage varchar(255), CONSTRAINT SimpleConstraint UNIQUE (Meno, Priezvisko))

Pomocou klauzuly SELECT a kľúčového slova INTO môžeme vytvárať nové tabuľky na základe podmienky špecifikovanej v klauzule WHERE. Napríklad:

SELECT * INTO NewOrders FROM Orders WHERE OrderDate > 1/1/97 Tento dotaz vytvorí novú tabuľku NewOrders a naplní ju údajmi o objednávkach od 1. januára 1997.

príkaz ALTER TABLE

Na zmenu štruktúry existujúcej tabuľky môžete použiť príkaz ALTER TABLE. Pomocou neho môžete pridať alebo odstrániť pole alebo obmedzenie servera. Existujú štyri varianty príkazu ALTER TABLE.

Prvá variácia tohto operátora sa používa na pridanie stĺpca do tabuľky a jeho syntax je:

Tabuľka ALTER TABLE ADD stĺpec údajový typ [(veľkosť)]

V dotazoch tohto druhu sa zisťuje názov tabuľky, názov nového poľa, jeho dátový typ a v prípade potreby aj veľkosť. Okrem toho môžete zadať obmedzenie servera spojené s týmto poľom. Ak chcete napríklad pridať pole Telefón do jednoduchej tabuľky vytvorenej skôr, môžete spustiť nasledujúci dotaz:

ALTER TABLE Jednoduché PRIDANIE telefónu varchar(30)

Druhá variácia príkazu ALTER TABLE sa používa na pridanie obmedzení na strane servera do tabuľky a jej syntax je:

Tabuľka ALTER TABLE ADD CONSTRAINT obmedzenie

Takéto dotazy vám umožňujú pridávať iba indexy, ktoré vám umožňujú použiť zodpovedajúce polia ako primárne alebo cudzie kľúče.

Tretia variácia klauzuly ALTER TABLE sa používa na odstránenie poľa z tabuľky:

Stĺpec DROP tabuľky ALTER TABLE

Kľúčové slovo COLUMN je voliteľné. Napríklad:

ALTER TABLE Jednoduchý telefón DROP

Upozorňujeme, že ak chcete odstrániť indexované polia, musíte najskôr odstrániť index. Dá sa to urobiť štvrtou variáciou klauzuly ALTER TABLE:

Tabuľka ALTER TABLE Index DROP CONSTRAINT

Nižšie je uvedený príklad takejto žiadosti:

ALTER TABLE Jednoduchý primárny kľúč DROP CONSTRAINT

príkaz DROP

Na zrušenie tabuliek alebo indexov môžete použiť príkaz DROP, ktorý sa dodáva v dvoch variantoch. Prvý sa používa na odstránenie tabuľky z databázy:

Tabuľka DROP TABLE

Druhá variácia sa používa na vypustenie indexu.

Programovací jazyk

SQL (Structured Query Language - Structured Query Language) je jazyk správy databáz pre relačné databázy. SQL sám o sebe nie je Turingov kompletný programovací jazyk, no jeho štandard umožňuje vytvárať preň procedurálne rozšírenia, ktoré rozširujú jeho funkcionalitu do plnohodnotného programovacieho jazyka.

Jazyk bol vytvorený v 70. rokoch pod názvom „SEQUEL“ pre systém správy databáz System R (DBMS). Neskôr bol premenovaný na „SQL“, aby sa predišlo konfliktom medzi obchodnými značkami. V roku 1979 bol SQL prvýkrát publikovaný ako komerčný produkt Oracle V2.

Prvú oficiálnu jazykovú normu prijala ANSI v roku 1986 a ISO v roku 1987. Odvtedy vzniklo niekoľko ďalších verzií normy, z ktorých niektoré s menšími obmenami opakujú predchádzajúce, iné nadobudli nové významné črty.

Napriek existencii štandardov sa väčšina bežných implementácií SQL líši natoľko, že kód možno len zriedka preniesť z jedného DBMS do druhého bez väčších zmien. Je to spôsobené dĺžkou a zložitosťou normy, ako aj nedostatkom špecifikácií v niektorých dôležitých oblastiach implementácie.

SQL bol vytvorený ako jednoduchý, štandardizovaný spôsob získavania a manipulácie s údajmi obsiahnutými v relačnej databáze. Neskôr sa to stalo zložitejším, ako bolo zamýšľané, a zmenilo sa na nástroj pre vývojárov, nie pre koncového používateľa. V súčasnosti zostáva SQL (väčšinou implementovaný spoločnosťou Oracle) najpopulárnejším z databázových jazykov, aj keď existuje množstvo alternatív.

SQL sa skladá zo štyroch samostatných častí:

  1. Data Definition Language (DDL) sa používa na definovanie dátových štruktúr uložených v databáze. Príkazy DDL vám umožňujú vytvárať, upravovať a odstraňovať jednotlivé objekty v databáze. Platné typy objektov závisia od použitého DBMS a zvyčajne zahŕňajú databázy, používateľov, tabuľky a množstvo menších podporných objektov, ako sú roly a indexy.
  2. Data Manipulation Language (DML) sa používa na získavanie a úpravu údajov v databáze. Príkazy DML vám umožňujú získavať, vkladať, upravovať a mazať údaje v tabuľkách. Niekedy sa príkazy výberu načítania údajov nepovažujú za súčasť DML, pretože nemenia stav údajov. Všetky vyhlásenia DML sú deklaratívne.
  3. Data Access Definition Language (DCL) sa používa na riadenie prístupu k údajom v databáze. Príkazy DCL sa vzťahujú na privilégiá a umožňujú vám udeľovať a odvolávať práva na používanie určitých príkazov DDL a DML na určité databázové objekty.
  4. Transaction Control Language (TCL) sa používa na riadenie spracovania transakcií v databáze. Príkazy TCL zvyčajne zahŕňajú príkaz na potvrdenie zmien vykonaných počas transakcie, návrat späť na ich zrušenie a bod uloženia na rozdelenie transakcie na niekoľko menších častí.

Treba si uvedomiť, že SQL implementuje deklaratívnu programovaciu paradigmu: každý príkaz popisuje len potrebnú akciu a DBMS rozhoduje o jej vykonaní, t.j. naplánuje základné operácie potrebné na vykonanie akcie a vykoná ich. Na efektívne využitie výkonu SQL však vývojár potrebuje pochopiť, ako DBMS analyzuje každý príkaz a vytvára jeho plán vykonávania.

Príklady:

Ahoj svet!:

Príklad pre Oracle 10g SQL, Oracle 11g SQL

Reťazec 'Hello, World!' je vybraný zo vstavanej tabuľky dual , ktorá sa používa pre dopyty, ktoré nevyžadujú prístup k skutočným tabuľkám.

vyberte "Ahoj svet!" z duálneho ;

Faktor:

Príklad pre Oracle 10g SQL, Oracle 11g SQL

SQL nepodporuje slučky, rekurzie ani užívateľom definované funkcie. Tento príklad ukazuje možné riešenie pomocou:

  • úroveň pseudostĺpca na vytvorenie pseudotabuľiek t1 a t2 obsahujúcich čísla od 1 do 16,
  • agregačná funkcia sum , ktorá vám umožňuje sčítať prvky množiny bez explicitného použitia cyklu,
  • a matematické funkcie ln a exp , ktoré umožňujú nahradiť súčin (potrebný na výpočet faktoriálu) súčtom (poskytnutým pomocou SQL).

Reťazec „0! = 1” nebude zahrnutý do výslednej sady riadkov, pretože pokus o vyhodnotenie ln(0) má za následok výnimku.

Fibonacciho čísla:

Príklad pre Oracle 10g SQL, Oracle 11g SQL

SQL nepodporuje slučky ani rekurziu a zreťazenie polí z rôznych riadkov v tabuľke alebo dotaze nie je štandardná agregačná funkcia. Tento príklad používa:

  • Binetov vzorec a matematické funkcie ROUND , POWER a SQRT na výpočet n-tého Fibonacciho čísla;
  • úroveň pseudostĺpca na vytvorenie pseudotabuľky t1 obsahujúcej čísla od 1 do 16;
  • vstavaná funkcia SYS_CONNECT_BY_PATH pre usporiadané zreťazenie prijatých čísel.

SELECT REPLACE (MAX (SYS_CONNECT_BY_PATH (fib || ", " , "/" )), "/" , "" ) || "..." fiblist FROM ( SELECT n , fib , ROW_NUMBER () NAD (ORDER BY n ) r FROM (select n , round ((power ((1 + sqrt (5 )) * 0 . 5 , n ) - power ((1 - sqrt (5 )) * 0 , 5 , n )) / sqrt (5 )) fib from (vyberte úroveň n z duálneho pripojenia podľa úrovne<= 16 ) t1 ) t2 ) START WITH r = 1 CONNECT BY PRIOR r = r - 1 ;

Ahoj svet!:

Príklad pre verzie Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012, MySQL 5, PostgreSQL 8.4, PostgreSQL 9.1, sqlite 3.7.3

vyberte "Ahoj svet!" ;

Faktor:

Príklad pre Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012

Používa sa rekurzívna definícia faktoriálu implementovaná prostredníctvom rekurzívneho dotazu. Každý riadok dotazu obsahuje dve číselné polia, n a n!, a každý nasledujúci riadok sa vypočíta pomocou údajov z predchádzajúceho.

Celočíselné faktoriály môžete vypočítať len do 20!. Keď sa pokúšate vypočítať 21! dôjde k „chybe aritmetického pretečenia“, t.j. dochádza k pretečeniu.

Pre reálne čísla sa počíta faktoriál 100! (Ak to chcete urobiť, v príklade musíte nahradiť bigint s float v 3. riadku)

Fibonacciho čísla:

Príklad pre Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012

Používa sa iteratívna definícia Fibonacciho čísel, implementovaná prostredníctvom rekurzívneho dotazu. Každý riadok dotazu obsahuje dve susediace čísla v poradí a nasledujúci riadok sa vypočíta ako (posledné číslo, súčet čísel) predchádzajúceho riadku. Všetky čísla okrem prvého a posledného sa teda vyskytujú dvakrát, takže do výsledku sú zahrnuté iba prvé čísla každého riadku.

Faktor:

Príklad pre Oracle 10g SQL, Oracle 11g SQL

Tento príklad demonštruje použitie príkazu modelu dostupného od Oracle 10g, ktorý umožňuje, aby sa reťazce dotazov považovali za prvky poľa. Každý riadok obsahuje dve polia - číslo riadku n a jeho faktoriál f.

vyberte n || "!=" || f faktoriál z duálneho modelu vráti dimenziu všetkých riadkov podľa ( 0 d ) opatrení ( 0 f , 1 n ) pravidiel iteruje (17 ) ( f [ číslo_ iterácie ] = dekóduje ( číslo_ iterácie , 0 , 1 , f [ číslo_ iterácie - 1 ] * číslo_ iterácie ) , n [ číslo_ iterácie ] = číslo_ iterácie );

Fibonacciho čísla:

Príklad pre Oracle 10g SQL, Oracle 11g SQL

Tento príklad demonštruje použitie príkazu modelu dostupného od Oracle 10g, ktorý umožňuje, aby sa reťazce dotazov považovali za prvky poľa. Každý riadok obsahuje dve polia – samotné Fibonacciho číslo a zreťazenie všetkých čísel, ktoré sú mu menšie alebo rovné. Iteratívne zreťazenie čísel v rovnakom dotaze, v ktorom sú generované, je jednoduchšie a rýchlejšie ako agregácia ako samostatná operácia.

vyberte max(y) || ", ..." z (vyberte s z duálneho modelu vráti všetky riadky rozmer o ( 0 d ) miery ( cast (" " ako varchar2 (200 )) s , 0 f ) pravidlá iterujú (16) ( f [ číslo_ iterácie ] = dekódovať (číslo_ iterácie , 0 , 1 , 1 , 1 , f [ číslo_ iterácie - 1 ] + f [ číslo_ iterácie - 2 ]), s [ číslo_ iterácie ] = dekódovať (číslo_ iterácie , 0 , to_char (f [ číslo_ iterácie ]), s [ číslo_ iterácie - 1 ] || ", " || to_char (f [ iteračné_číslo ])) ) );

Faktor:

Príklad pre MySQL verzie 5

select concat (cast (t2 . n as char ), "!= " , cast (exp (exp (sum (sum (log (t1 . n ))) as char )) from ( select @ i := @ i + 1 AS n from TABLE , (vyberte @ i := 0 ) ako limit sel1 16 ) t1 , ( vyberte @ j : = @ j + 1 AS n z TABUĽKY , ( vyberte @ j := 0 ) ako limit sel1 16 ) t2 kde t1 . n<= t2 . n group by t2 . n

Fibonacciho čísla:

Príklad pre MySQL verzie 5

Nahraďte TABLE ľubovoľnou tabuľkou, ku ktorej máte prístup, ako napríklad mysql.help_topic .

vyberte concat (group_concat (oddeľovač f ", " ), ", ..." ) z (vyberte @ f := @ i + @ j ako f , @ i := @ j , @ j := @ f z TABUĽKY , (vyberte @ i := 1 , @ j := 0 ) sel1 limit 16 ) t

Ahoj svet!:

Príklad pre Oracle 10g SQL, Oracle 11g SQL

Tento príklad používa anonymný blok PL/SQL, ktorý vytlačí správu na štandardný výstup pomocou balíka dbms_output.

začať dbms_output . put_line("Ahoj, Svet!"); koniec ;

Faktor:

Príklad pre Oracle 10g SQL, Oracle 11g SQL

Tento príklad demonštruje iteračný faktoriálny výpočet pomocou PL/SQL.

deklaruj n cislo := 0 ; fcislo := 1; začať chvíľu (n<= 16 ) loop dbms_output . put_line (n || "! = " || f ); n : = n + 1 ; f : = f * n ; end loop ; end ;

Fibonacciho čísla:

Príklad pre Oracle 10g SQL, Oracle 11g SQL

Tento príklad používa iteračnú definíciu Fibonacciho čísel. Už vypočítané čísla sú uložené v dátovej štruktúre varray, podobne ako pole.

deklarovať typ vektor je varray (16) z čísla; fib vektor := vektor(); i číslo; svarchar2(100); beginfib . extend(16); fib(1):= 1; fib(2):= 1; s:=fib(1) || ", " || fib(2) || ","; pre i v 3 .. 16 slučka fib (i): = fib (i - 1) + fib (i - 2); s := s || fib(i) || ","; koncová slučka; dbms_output . put_line(s || "..." ); koniec ;

Kvadratická rovnica:

Príklad pre Oracle 10g SQL, Oracle 11g SQL

Tento príklad bol testovaný s SQL*Plus, TOAD a PL/SQL Developer.

Čistý SQL vám umožňuje zadávať premenné počas vykonávania dotazu ako substituované premenné. Na definovanie takejto premennej je potrebné použiť jej názov (v tomto prípade A, B a C) s ampersandom & pred ním vždy, keď sa má na premennú odkazovať. Po vykonaní dotazu sa používateľovi zobrazí výzva na zadanie hodnôt všetkých substituovaných premenných použitých v dotaze. Po zadaní hodnôt sa každý odkaz na takúto premennú nahradí jej hodnotou a vykoná sa výsledný dotaz.

Existuje niekoľko spôsobov, ako zadať hodnoty pre substituované premenné. V tomto príklade pred prvým odkazom na každú premennú je namiesto jedného znaku znak &&. Hodnota pre každú premennú sa teda zadáva iba raz a všetky nasledujúce odkazy na ňu budú nahradené rovnakou hodnotou (pri použití jedného znaku ampersand v SQL*Plus sa musí hodnota pre každý odkaz na rovnakú premennú zadať samostatne) . V PL/SQL Developer musia odkazy na všetky premenné predchádzať znakom &, inak sa vyskytne chyba ORA-01008 „Nie sú viazané všetky premenné“.

Prvý riadok príkladu špecifikuje znak pre desatinný oddeľovač, ktorý sa používa pri prevode koreňových čísel na reťazce.

Samotná žiadosť pozostáva zo štyroch rôznych žiadostí. Každý dotaz vráti reťazec obsahujúci výsledok výpočtov v jednom z prípadov (A=0, D=0, D>0 a D<0) и ничего — в трех остальных случаях. Результаты всех четырех запросов объединяются, чтобы получить окончательный результат.

alter session set NLS_NUMERIC_CHARACTERS = "." ; vyberte "Nie je to kvadratická rovnica." ans z dual kde && A = 0 spojenie vyberte "x = " || to_char (-&& B / 2 /& A ) z duálneho kde & A != 0 a & B *& B - 4 *& A *&& C = 0 spojenie vyberte "x1 = " || to_char ((-& B + sqrt (& B *& B - 4 *& A *& C )) / 2 /& A ) || ", x2 = " || to_char (-& B - sqrt (& B *& B - 4 *& A *& C )) / 2 /& A z dual kde & A != 0 a & B *& B - 4 *& A *& C > 0 union vyberte "x1 = (" || to_char (-& B / 2 /& A ) || "," || to_char (sqrt (-& B *& B + 4 *& A *& C ) / 2 /& A ) || "), " || "x2 = (" || to_char (-& B / 2 /& A ) || "," || to_char (- sqrt (-& B *& B + 4 *& A *& C ) / 2 /& A ) || ")" z duálneho kde & A != 0 a & B *& B - 4 *& A *& C< 0 ;

Funkcie okien nie sú podporované vo všetkých prvkoch dotazu, ale iba v klauzulách SELECT a ORDER BY. Aby ste pochopili dôvod tohto obmedzenia, najskôr vysvetlím princíp tzv logické spracovanie požiadavky. Potom sa vrátim k pokynom, ktoré podporujú funkcie okien a na záver vysvetlím, ako toto obmedzenie obísť v ďalších návrhoch.

Logické spracovanie dotazov

Spracovanie logického dotazu popisuje, ako sa SELECT dotaz vyhodnocuje podľa logického systému jazyka. Opisuje proces, ktorý pozostáva z niekoľkých fáz alebo fáz, ktoré začínajú vstupnými tabuľkami dotazu a končia sadou výsledkov dotazu.

Všimnite si, že pod logickým spracovaním dotazov mám na mysli koncept vyhodnocovania dotazov, ktorý nie je nevyhnutne rovnaký ako fyzické spracovanie dotazov na SQL Server. V rámci optimalizácie môže SQL Server skrátiť cestu, zmeniť poradie niektorých fáz a robiť, čo chce. Ale to všetko len za podmienky, že vráti rovnaký výsledok, aký by mal byť získaný pri logickom spracovaní požiadavky s jej deklaratívnou definíciou.

Každá fáza spracovania logických dotazov pracuje s jednou alebo viacerými tabuľkami (sadami riadkov), ktoré sú vstupnými údajmi, a ako výsledok vráti tabuľku. Výsledná tabuľka jednej etapy sa stane vstupom pre ďalšiu etapu.

Nasledujúci obrázok ukazuje tok spracovania logických dotazov v SQL Server 2012:

Všimnite si, že pri písaní dotazu sa vždy ako prvá zapisuje klauzula SELECT, no pri logickom spracovaní je takmer až na samom konci – tesne pred spracovaním klauzuly ORDER BY.

Logickému spracovaniu dotazov by sa dala venovať celá kniha, no pre náš zámer postačuje stručnejšia prezentácia. Pre účely našej diskusie je dôležité všímať si poradie, v akom sú jednotlivé vety spracované. Nasledujúci zoznam predstavuje toto poradie (fázy, v ktorých sú povolené funkcie okna, sú zvýraznené farebne):

    1. Hodnotenie výrazov

      Odstraňovanie duplikátov

  1. OFFSET-FETCH/TOP

Pochopenie postupu a poradia spracovania logických dotazov vám umožní pochopiť, prečo bolo použitie funkcií okna povolené len v určitých vetách.

Ponúka podporné funkcie okien

Ako môžete vidieť na predchádzajúcom obrázku, iba klauzuly SELECT a ORDER BY priamo podporujú funkcie okna. Dôvodom obmedzenia je vyhnúť sa nejednoznačnosti pri práci s (takmer) konečným súborom výsledkov dotazu na začiatku okna. Ak sú funkcie okien povolené vo fázach pred fázou SELECT, počiatočné okná týchto fáz sa môžu líšiť od okna fázy SELECT, a preto bude veľmi ťažké určiť správny výsledok v niektorých formách dotazu.

Pokúsim sa túto nejednoznačnosť demonštrovať na príklade. Najprv spustite nasledujúci kód na vytvorenie tabuľky T1 a naplňte ju údajmi:

SET NOCOUNT ON; POUŽÍVAŤ TSQL2012; IF OBJECT_ID("dbo.T1", "U") NIE JE NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 (col1 VARCHAR(10) NOT NULL CONSTRAINT PK_T1 PRIMARY KEY); INSERT INTO dbo.T1(col1) VALUES("A"),("B"),("C"),("D"),("E"),("F"); Ísť

Predpokladajme, že funkcie okna sú povolené vo fázach pred SELECT, ako napríklad vo fáze WHERE. Pozrite sa na nasledujúci dotaz a skúste určiť, ktoré hodnoty col1 by mali byť obsiahnuté vo výsledku:

Predtým, ako poviete, že je zrejmé, že by to mali byť C, D a E, nezabudnite na princíp „všetko naraz“ v SQL. Z tohto princípu vyplýva, že z hľadiska konceptu sa všetky výrazy jednej logickej fázy vykonávajú súčasne. To znamená, že poradie výrazov by nemalo ovplyvniť výsledok. Ak áno, nasledujúci dotaz by mal byť sémanticky ekvivalentný:

Dokážete zistiť, ktorý výraz je tentokrát správny? Je to C, D a E alebo len C?

Toto je príklad nejednoznačnosti, o ktorej som hovoril. Povolenie používania funkcií okna iba v klauzulách SELECT a ORDER BY odstraňuje túto nejednoznačnosť.

Pri analýze vývojového diagramu na obrázku vyššie ste si mohli všimnúť, že v kroku SELECT funkcie okna podporujú krok 5-1 (Vyhodnotenie výrazu) a vykoná sa pred krokom 5-2 (Odstrániť duplikáty). Ak sa pýtate, prečo je také dôležité poznať takéto detaily, ukážem, prečo je to potrebné.

Tu je otázka, ktorá vracia atribúty empid a country všetkých zamestnancov z tabuľky Zamestnanci:

SELECT empid, country FROM HR.Employees;

Teraz sa pozrite na nasledujúci dotaz a pred vykonaním dotazu sa pokúste určiť, aký bude výsledok:

SELECT DISTINCT country, ROW_NUMBER() OVER (ORDER BY country) AS rownum FROM HR.Employees;

Niektorí očakávajú tento výsledok:

Ale v skutočnosti dostanete toto:

Teraz si pamätajte, že v tomto dotaze sa funkcia ROW_NUMBER vyhodnotí v kroku 5-1, čo je miesto, kde sa vyhodnocujú výrazy zoznamu SELECT, predtým ako sa odstránia duplikáty v kroku 5-2. Funkcia ROW_NUMBER priraďuje deväť jedinečných čísel riadkov obsahujúcich informácie o zamestnancoch, takže klauzula DISTINCT nemá čo vymazať.

Keď si uvedomíte, že dôvod je v poradí logického spracovania vyžiadania rôznych prvkov, môžete myslieť na riešenie. Môžete napríklad vytvoriť tabuľkový výraz založený na dotaze, ktorý jednoducho vráti jedinečné krajiny, a po odstránení duplikátov priradiť čísla riadkov vonkajšiemu dotazu:

WITH EmpCountries AS (SELECT DISTINCT country FROM HR.Employees) SELECT country, ROW_NUMBER() OVER (ORDER BY country) AS rownum FROM EmpCountries;

Viete si predstaviť iné spôsoby riešenia problému, aspoň jednoduchšie ako toto?

Skutočnosť, že funkcie okna sa vyhodnocujú vo fáze SELECT alebo ORDER BY znamená, že okno definované na vyhodnotenie - pred použitím nasledujúcich obmedzení - je prechodnou formou riadkov získaných po všetkých predchádzajúcich fázach, tj po použití FROM so všetkými operátormi tabuľky ( pripojenia), ako aj filtrovanie pomocou WHERE, zoskupovanie a filtrovanie skupín. Takúto žiadosť možno považovať za príklad:

Najprv sa vyhodnotí klauzula FROM a potom sa vykoná spojenie. Filter potom ponechá iba riadky súvisiace s rokom 2007. Potom sú zostávajúce riadky zoskupené podľa ID zamestnanca. Až potom sa vyhodnotia výrazy v zozname SELECT vrátane funkcie RANK, ktorá sa vyhodnotí pomocou zostupného celkového poradia. Ak by v zozname SELECT boli ďalšie funkcie okna, použili by rovnakú sadu výsledkov ako svoj počiatočný bod.

Pripomeňme si, že predtým, keď sme diskutovali o alternatívach k funkciám okna (ako sú vnorené dopyty), povedali sme, že začínajú skenovať údaje od začiatku, to znamená, že musíte v každom vnorenom dotaze zopakovať všetku logiku vonkajšieho dotazu, čo výrazne zvyšuje množstvo kódu.

Obchádzanie obmedzení

Vysvetlil som, prečo bolo používanie funkcií okna zakázané vo fázach spracovania logických dotazov pred klauzulou SELECT. Čo ak však chcete filtrovať alebo zoskupovať na základe výpočtov vykonaných vo funkciách okna? Riešením je použiť tabuľkový výraz, ako je CTE alebo odvodená tabuľka. Umožnite dotazu volať funkciu okna v jeho zozname SELECT vytvorením aliasu výrazu. Definujte tabuľkový výraz založený na tomto dotaze a potom naň odkazujte v dotaze podľa aliasu.

Tu je príklad, ktorý ukazuje, ako môžete filtrovať na základe výsledkov funkcie okna pomocou CTE:

Funkcie okien sú v príkazoch na úpravu údajov úplne zakázané, pretože klauzuly SELECT a ORDER BY nie sú v týchto príkazoch podporované. Existujú však prípady, keď sú v pokynoch na úpravu údajov potrebné funkcie okna. Tabuľkové výrazy riešia aj tento problém, pretože T-SQL vám umožňuje meniť údaje prostredníctvom tabuľkových výrazov. Toto správanie predvediem na príklade UPDATE. Najprv spustite nasledujúci kód na vytvorenie tabuľky T1 so stĺpcami col1 a col2 a naplňte ju údajmi:

SET NOCOUNT ON; POUŽÍVAŤ TSQL2012; IF OBJECT_ID("dbo.T1", "U") NIE JE NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 (col1 INT NULL, col2 VARCHAR(10) NOT NULL); INSERT INTO dbo.T1(col2) VALUES("C"),("A"),("B"),("A"),("C"),("B"); Ísť

Hodnoty stĺpca col2 sú explicitne definované a stĺpec1 bol vyplnený hodnotami NULL.

Predstavte si, že táto tabuľka ilustruje situáciu s problémami s kvalitou údajov. V tejto tabuľke nebol vytvorený žiadny kľúč, takže riadky nemožno jednoznačne identifikovať. Všetkým riadkom chcete priradiť jedinečné hodnoty v stĺpci col1. Mysleli ste si, že by bolo vhodné použiť funkciu ROW_NUMBER v príkaze UPDATE, ako je tento:

UPDATE dbo.T1 SET col1 = ROW_NUMBER() OVER(ORDER BY col2);

Ale ako si pamätáte, v takýchto pokynoch je to zakázané. Riešením je vytvorenie dotazu na T1, ktorý vráti col1 a výraz založený na funkcii ROW_NUMBER (nazvime to rownum); definujte tabuľkový výraz na základe tohto dotazu a nakoniec použite príkaz UPDATE na CTE na priradenie hodnoty rownum stĺpcu col1:

WITH C AS (SELECT col1, col2, ROW_NUMBER() OVER(ORDER BY col2) AS rownum FROM dbo.T1) UPDATE C SET col1 = rownum; SELECT col1, col2 FROM dbo.T1;

Získajte údaje z T1 - uvidíte, že všetky riadky majú jedinečnú hodnotu v stĺpci col1:

Schopnosť vytvárať ďalšie filtre

Ukázal som vám, ako môžete obísť T-SQL a nepriamo použiť funkcie okien na prvkoch, ktoré ich priamo nepodporujú. Toto riešenie sa spolieha na použitie tabuľkového výrazu vo forme CTE alebo odvodenej tabuľky. Je pekné mať ďalšiu možnosť, ale tabuľkový výraz používa ďalšiu úroveň dotazu a robí veci trochu komplikovanejšími. Príklady, ktoré som uviedol, sú jednoduché, ale čo sa týka dlhých a zložitých dopytov. Je možné jednoduchšie riešenie bez tejto ďalšej vrstvy?

Pokiaľ ide o funkcie okien, v SQL Server momentálne neexistuje žiadne iné riešenie. Je však zaujímavé sledovať, ako sa s týmto problémom vyrovnávajú iní. Napríklad spoločnosť Teradata vytvorila klauzulu filtra s názvom KVALIFIKOVAŤ a zásadne sa hodnotí po klauzule SELECT. To znamená, že má priamy prístup k funkciám okna, ako v nasledujúcom príklade:

Nefunguje v SQL Server 2012 VYBERTE ID objednávky, dátum objednávky, hodnotu FROM Sales.OrderValues ​​​​QUALIFY RANK() OVER (ORDER BY val DESC)

Okrem toho môžete odkazovať na aliasy stĺpcov definovaných v zozname SELECT takto:

Nefunguje v SQL Server 2012 SELECT orderid, orderdate, val, RANK() OVER(ORDER BY val DESC) AS rnk FROM Sales.OrderValues ​​​​QUALIFY rnk

Klauzula QUALIFY nie je v štandardnom SQL – je podporovaná iba v produktoch Teradata. Zdá sa to však ako veľmi zaujímavé riešenie a bolo by pekné, keby túto potrebu riešil štandard aj SQL Server.

Opätovné použitie definícií okien

Predstavte si, že potrebujete volať viacero funkcií okna v jednej požiadavke, pričom časť definície okna (alebo celá definícia) viacerých funkcií je rovnaká. Ak zadáte definíciu okna vo všetkých funkciách, kód môže byť veľmi veľký, ako v tomto príklade:

VYBERTE empid, mesiac objednávky, množstvo, SUM(množstvo) NAD (ODDELENIE PODĽA empid OBJEDNÁVKA PODĽA mesiaca objednávky RIADKY MEDZI NEOKÁZANÝMI PREDCHÁDZAJÚCIMI A AKTUÁLNYMI RIADKAMI) AKO run_sum_qty, AVG (množstvo) NAD (ODDIELENIE PODĽA empid OBJEDNÁVKA ZA PREDCHÁDZAJÚCI ROČNÍK ZA MESIAC objednávky) AKO run_avg_qty, MIN(Qty) NAD (ODDELENIE PODĽA EMPID OBJEDNÁVKA PODĽA mesiaca objednávky RIADKOV MEDZI NEOKÁZANÝMI PREDCHÁDZAJÚCIMI A AKTUÁLNYMI RIADKAMI) AKO run_min_qty, MAX (množstvo) NAD (ODDIELENIE PODĽA empid OBJEDNÁVKA PODĽA OBJEDNÁVKY PODĽA RIADKOV PREDAJ OD_MAX .EmpOrders;

Štandardné SQL má riešenie tohto problému vo forme klauzuly s názvom WINDOW, ktorá vám umožňuje priradiť názov definícii okna alebo jeho časti. Tento názov možno potom použiť v iných definíciách okien používaných vo funkciách okien alebo dokonca v iných definíciách názvov okien. Koncepčne sa táto klauzula vyhodnocuje za klauzulou HAVING a pred klauzulou SELECT.

SQL Server zatiaľ nepodporuje doložka WINDOW. V štandardnom SQL môžete predchádzajúci dotaz skrátiť pomocou klauzuly WINDOW takto:

Nefunguje v SQL Server 2012 SELECT empid, ordermonth, qty, SUM(qty) NAD W1 AS run_sum_qty, AVG(qty) OVER W1 AS run_avg_qty, MIN(qty) NAD W1 AS run_min_qty, MAX(qty) NAD W1 AS run_max_qty. .EmpOrders WINDOW W1 AS (PRIEČENIE PODĽA EMPID OBJEDNÁVKY PODĽA mesiaca objednávky RIADKOV MEDZI BEZPLATNÝMI PREDCHÁDZAJÚCIMI A AKTUÁLNYMI RADMI);

Ako vidíte, rozdiel je viditeľný. V tomto prípade klauzula WINDOW priradí názov W1 celej definícii okna s možnosťami rozdelenia, usporiadania a rámovania. W1 sa potom používa ako definícia okna vo všetkých štyroch funkciách. Klauzula WINDOW je pomerne zložitá. Ako už bolo spomenuté, nie je potrebné pomenovať celú definíciu okna – môžete pomenovať iba časť definície. V takom prípade obsahuje definícia okna zmes pomenovaných častí a explicitných parametrov. Mimochodom, popis klauzuly WINDOW v štandarde SQL trvá desať strán! A nie je ľahké ich zistiť.

Bolo by skvelé, keby SQL Server pridal podporu pre tento návrh, najmä teraz, keď sa rozšírila podpora funkcií okien a používatelia budú musieť písať zdĺhavé definície okien.

Jazykový štandard SQL bol prijatý v roku 1992 a používa sa dodnes. Bol to on, kto sa stal pre mnohých štandardom.Samozrejme, niektorí výrobcovia používajú svoje vlastné interpretácie štandardu. Ale v každom systéme stále existujú hlavné komponenty - príkazy SQL.

Úvod

Pomocou príkazov SQL sa manipulujú s hodnotami, tabuľkami a prijímajú sa na ďalšiu analýzu a zobrazenie. Sú to kľúčové slová, pomocou ktorých systém rozumie, čo má s údajmi robiť.

Je definovaných niekoľko kategórií príkazov SQL:

  • definícia databázových objektov;
  • manipulácia s hodnotami;
  • ochrana a riadenie;
  • parametre relácie;
  • základné informácie;
  • statický SQL;
  • dynamický SQL.

SQL príkazy na manipuláciu s údajmi

VLOŽIŤ. Vloží riadky do existujúcej tabuľky. Môže sa použiť ako pre jednu hodnotu, tak aj pre niekoľko, určených nejakou podmienkou. Napríklad:

názov tabuľky (názov stĺpca 1, názov stĺpca 2)

HODNOTY (hodnota 1, hodnota 2).

Ak chcete použiť príkaz INSERT na viacerých hodnotách, syntax je:

názov tabuľky 1 (názov stĺpca 1, názov stĺpca 2)

SELECT názov stĺpca 1, názov stĺpca 2

Z názvu tabuľky 2

WHERE názov tabuľky 2.názov stĺpca 1>2

Tento dotaz vyberie všetky údaje z tabuľky 2, ktoré sú väčšie ako 2 v stĺpci 1 a vloží ich do prvého.

AKTUALIZOVAŤ. Ako už názov napovedá, tento príkaz dotazu SQL aktualizuje údaje v existujúcej tabuľke podľa určitého atribútu.

AKTUALIZÁCIA názvu tabuľky 1

SET názov stĺpca 2 = "Basil"

WHERE názov tabuľky 1. názov stĺpca 1 = 1

Táto konštrukcia vyplní hodnotou Vasily všetky riadky, v ktorých sa stretne s číslom 1 v prvom stĺpci.

Údaje z tabuľky. Môžete zadať akúkoľvek podmienku alebo odstrániť všetky riadky.

DELETE FROM názov tabuľky

WHERE názov tabuľky.názov stĺpca 1 = 1

Vyššie uvedený dotaz odstráni z databázy všetky údaje s hodnotou jedna v prvom stĺpci. A takto môžete vyčistiť celú tabuľku:

príkaz SELECT

Hlavným účelom SELECT je výber údajov podľa určitých podmienok. Výsledkom jeho práce je vždy nová tabuľka s vybranými údajmi. Operátor MS môže byť použitý v množstve rôznych dopytov. Preto spolu s ním môžete zvážiť ďalšie súvisiace kľúčové slová.

Ak chcete vybrať všetky údaje z konkrétnej tabuľky, použite znak „*“.

Z názvu tabuľky 1

Výsledkom tohto dotazu bude presná kópia tabuľky 1.

A tu je výber podľa podmienky WHERE, ktorá dostane z tabuľky 1 všetky hodnoty väčšie ako 2 v stĺpci 1.

Z názvu tabuľky 1

WHERE názov tabuľky 1.názov stĺpca 1 > 2

Vo výbere môžete tiež určiť, že sú potrebné len určité stĺpce.

SELECT názov tabuľky 1. názov stĺpca 1

Z názvu tabuľky 1

Výsledkom tohto dotazu budú všetky riadky s hodnotami zo stĺpca 1. Pomocou príkazov MS SQL si môžete vytvoriť vlastnú tabuľku nahradením, výpočtom a nahradením určitých hodnôt na cestách.

názov tabuľky 1.názov stĺpca 1

názov tabuľky 1.názov stĺpca 2

názov tabuľky 1.názov stĺpca 3

názov tabuľky 1.názov stĺpca 2 * názov tabuľky 1.názov stĺpca 3 AS SUMMA

Z názvu tabuľky 1

Tento zdanlivo zložitý dotaz načíta všetky hodnoty z tabuľky 1 a potom vytvorí nové stĺpce EQ a SUMMA. Do prvého zadáva znamienko „+“ a do druhého súčin údajov zo stĺpcov 2 a 3. Výsledok možno prezentovať vo forme tabuľky, aby ste pochopili, ako to funguje:

Pri použití príkazu SELECT môžete údaje okamžite triediť podľa nejakého atribútu. Na to sa používa slovo ORDER BY.

názov tabuľky 1.názov stĺpca 1

názov tabuľky 1.názov stĺpca 2

názov tabuľky 1.názov stĺpca 3

Z názvu tabuľky 1

ORDER PODĽA názvu stĺpca 2

Výsledná tabuľka bude vyzerať takto:

To znamená, že všetky riadky boli nastavené v takom poradí, aby hodnoty v stĺpci 2 boli vo vzostupnom poradí.

Údaje je možné získať aj z viacerých tabuliek. Kvôli prehľadnosti si najprv musíte predstaviť, že v databáze sú dve, asi takto:

Tabuľka "Zamestnanci"

Tabuľka "Plat"

Teraz musíte tieto dve tabuľky nejako prepojiť, aby ste získali spoločné hodnoty. Pomocou základných príkazov SQL to môžete urobiť takto:

Počet zamestnancov

Zamestnanci.Meno

Plat. Sadzba

Plat, časovo rozlíšený

OD Zamestnancov, Plat

KDE Zamestnanci.Číslo = Mzda.Číslo

Tu je výber z dvoch rôznych tabuliek hodnôt spojených číslom. Výsledkom bude nasledujúci súbor údajov:

Trochu viac o SELECT. Použitie agregačných funkcií

Jeden z hlavných operátorov môže vykonať určité výpočty pri načítaní. Na to používa určité funkcie a vzorce.

Ak chcete napríklad získať počet záznamov z tabuľky „Zamestnanci“, musíte použiť dotaz:

VYBERTE POČET (*) AKO N

OD zamestnancov

Výsledkom je tabuľka s jednou hodnotou a jedným stĺpcom.

Môžete použiť tento dotaz a zistiť, čo sa stane:

SUM(Plat. Naakumulovaný) AKO SUMMA

MAX.(Plat.Akumulovaný) AKO MAX

MIN (Plat. Časovo rozlíšené) AKO MIN

AVG(Plat.Accrued) AS SRED

OD platu

Výsledná tabuľka bude vyzerať takto:

Týmto spôsobom môžete vybrať požadované hodnoty z databázy vykonávaním výpočtu rôznych funkcií za behu.

Union, Intersect, and Differences

Kombinujte viacero dotazov v SQL

VYBERTE zamestnancov.Meno

OD zamestnancov

KDE Zamestnanci Počet = 1

VYBERTE zamestnancov.Meno

OD Zamestnancov, Plat

KDE Mzda.Číslo = 1

Treba mať na pamäti, že pri takomto spojení musia byť tabuľky kompatibilné. To znamená mať rovnaký počet stĺpcov.

Syntax príkazu SELECT a poradie spracovania

V prvom rade SELECT definuje oblasť, z ktorej bude brať dáta. Používa sa na to kľúčové slovo FROM. Ak nie je uvedené, čo presne vybrať.

Potom môže existovať klauzula SQL WHERE. S jeho pomocou SELECT prebehne všetky riadky tabuľky a skontroluje, či sú údaje v súlade s podmienkou.

Ak je v dotaze GROUP BY, hodnoty sú zoskupené podľa zadaných parametrov.

Operátori porovnávania údajov

Je ich viacero druhov. V SQL môžu porovnávacie operátory testovať rôzne typy hodnôt.

    "=". Označuje, ako môžete hádať, rovnosť dvoch výrazov. Napríklad to už bolo použité v príkladoch vyššie - WHERE Plat.Číslo = 1.

    ">". Ďalšie znamenie. Ak je hodnota ľavej strany výrazu väčšia, vráti sa logická hodnota TRUE a podmienka sa považuje za splnenú.

    «<». Знак меньше. Обратный предыдущему оператор.

    znamenia"<=» и «>= = Od jednoduchých operátorov viac a menej sa líši tým, že ak sú operandy rovnaké, podmienka bude tiež pravdivá.

PÁČI SA MI TO

Toto kľúčové slovo možno preložiť ako „podobné“. Operátor LIKE v SQL sa používa približne rovnako – vykoná dotaz podľa šablóny. To znamená, že umožňuje rozšíriť výber údajov z databázy pomocou regulárnych výrazov.

Bola stanovená napríklad nasledujúca úloha: z už známej základne „Zamestnanci“ dostať všetkých ľudí, ktorých meno končí na „I“. Potom môže byť dotaz napísaný takto:

OD zamestnancov

KDE Názov AKO `%i`

Znak percenta v tomto prípade znamená masku, teda ľubovoľný znak a ich počet. A podľa písmena "i" SQL určí, že posledný znak by mal byť presne taký.

CASE

Tento príkaz SQL Server je implementáciou viacnásobného výberu. Podobá sa konštrukcii prepínača v mnohých programovacích jazykoch. Príkaz CASE v SQL vykoná akciu pri viacerých podmienkach.

Napríklad musíte vybrať maximálne a minimálne hodnoty z tabuľky Plat.

Potom môže byť dotaz napísaný takto:

OD platu

V PRÍPADE, KEĎ VYBERTE MAX(Akumulované) TAK MAXIMUM

KEĎ VYBERTE MIN (Akumulované), POTOM Minimálne

V tomto kontexte systém hľadá maximálnu a minimálnu hodnotu v stĺpci Accrued. Potom sa pomocou KONIEC vytvorí pole „celkom“, do ktorého sa v závislosti od výsledku podmienky zapíše „Maximálne“ alebo „Minimum“.

Mimochodom, SQL má aj kompaktnejšiu formu CASE - COALESCE.

Operátori definície údajov

Toto zobrazenie vám umožňuje vykonávať rôzne zmeny v tabuľkách – vytváranie, odstraňovanie, upravovanie a prácu s indexmi.

Prvým, ktorý stojí za zváženie, je CREATE TABLE. Nerobí nič iné, len vytvára tabuľku. Ak len zadáte dotaz CREATE TABLE, nič sa nestane, pretože ešte musíte zadať niekoľko parametrov.

Napríklad, ak chcete vytvoriť už známu tabuľku Zamestnanci, musíte použiť príkazy:

VYTVORIŤ TABUĽKU Zamestnanci

(Číslo (10) NIE JE NULL

Názov varchar(50) NOT NULL

Priezvisko varchar(50) NOT NULL)

V tomto dotaze sú názvy polí a ich typy okamžite určené v zátvorkách, ako aj to, či sa môže rovnať NULL.

DOP TABLE

Vykoná jednu jednoduchú úlohu, zhodí zadanú tabuľku. Má ďalší parameter IF EXISTS. Ak vyhľadávaná tabuľka neexistuje, absorbuje chybu pri vymazaní. Príklad použitia:

DROP TABLE Zamestnanci, AK EXISTUJE.

VYTVORIŤ INDEX

SQL má indexový systém, ktorý vám umožňuje urýchliť prístup k údajom. Vo všeobecnosti ide o odkaz, ktorý ukazuje na konkrétny stĺpec. Index môžete vytvoriť jednoduchým dotazom:

CREATE INDEX index_name

ON názov_tabulky(názov_stĺpca)

Tento operátor sa používa v T-SQL, Oracle, PL SQL a mnohých ďalších interpretačných technológiách.

ALTER TABLE

Veľmi funkčný operátor s množstvom možností. Vo všeobecnosti mení štruktúru, definíciu a umiestnenie tabuliek. Operátor sa používa v Oracle SQL, Postgres a mnohých ďalších.

    PRIDAŤ. Pridá stĺpec do tabuľky. Jeho syntax je: ALTER TABLE názov_tabuľky ADD názov_stĺpca uložený_typ_údajov. Môže mať možnosť IF NOT EXISTS na potlačenie chyby, ak vytváraný stĺpec už existuje;

    POKLES. Odstráni stĺpec. Má tiež kľúč IF EXISTS, bez ktorého sa vygeneruje chyba, že chýba požadovaný stĺpec;

    ZMENIŤ. Slúži na premenovanie názvu poľa na zadaný. Príklad použitia: ALTER TABLE názov_tabuľky CHANGE starý_názov nový_názov;

    UPRAVIŤ. Tento príkaz vám pomôže zmeniť typ a ďalšie atribúty určitého stĺpca. A používa sa takto: ALTER TABLE názov_tabuľky MODIFY názov_stĺpca atribúty typu údajov;

VYTVORIŤ ZOBRAZENIE

V SQL existuje niečo ako pohľad. V skratke ide o akúsi virtuálnu tabuľku s údajmi. Vytvára sa ako výsledok výberu pomocou príkazu SQL SELECT. Zobrazenia môžu obmedziť prístup k databáze, skryť ich, nahradiť skutočné názvy stĺpcov.

Proces vytvárania prebieha s jednoduchou požiadavkou:

CREATE VIEW view name AS SELECT FROM * table name

Vzorkovanie môže prebiehať ako celá databáza ako celok a podľa určitých podmienok.

Trochu o funkciách

SQL dotazy veľmi často využívajú rôzne vstavané funkcie, ktoré umožňujú interakciu s údajmi a ich transformáciu za behu. Oplatí sa ich zvážiť, keďže sú neoddeliteľnou súčasťou štruktúrovaného jazyka.

    COUNT. Počíta záznamy alebo riadky v konkrétnej tabuľke. Ako parameter môžete zadať názov stĺpca, potom sa z neho prevezmú údaje. VYBERTE POČET * OD zamestnancov;

    A.V.G. platí len pre stĺpce s číselnými údajmi. Jeho výsledkom je určenie aritmetického priemeru všetkých hodnôt;

    MIN a MAX. Tieto funkcie už boli použité v tomto článku. Určujú maximálne a minimálne hodnoty zo zadaného stĺpca;

    SUM. Je to jednoduché – funkcia vypočíta súčet hodnôt stĺpca. Používa sa výlučne pre číselný dátový typ. Pridaním parametra DISTINCT do dotazu sa spočítajú iba jedinečné hodnoty;

    OKRÚHLY. Funkcia zaokrúhľovania desatinných zlomkových čísel. Syntax používa názov stĺpca a počet desatinných miest;

    len. Jednoduchá funkcia, ktorá vypočíta dĺžku hodnôt stĺpca. Výsledkom bude nová tabuľka s uvedením počtu znakov;

    TERAZ Toto kľúčové slovo sa používa na výpočet aktuálneho dátumu a času.

Ďalší operátori

Mnohé z príkladov príkazov SQL majú kľúčové slová, ktoré vykonávajú malé úlohy, ale stále výrazne zjednodušujú výbery alebo databázové operácie.

    AS. Používa sa, keď potrebujete vizualizovať výsledok priradením zadaného názvu k výslednej tabuľke.

    MEDZI. Veľmi praktický nástroj na výber. Určuje rozsah hodnôt, z ktorých sa majú získať údaje. Vstup akceptuje parameter od a do akého čísla sa rozsah používa;.

    NIE. Operátor dáva opak výrazu.

    TRUNCATE (skrátiť). Odstráni údaje zo zadanej oblasti databázy. Od podobných operátorov sa líši tým, že po jeho použití nie je možné obnoviť dáta. Stojí za zváženie, že implementácia tohto kľúčového slova v rôznych interpretáciách SQL sa môže líšiť. Preto pred pokusom o použitie TRUNCATE je lepšie prečítať si informácie pomocníka.

    LIMIT. Nastavuje počet riadkov, ktoré sa majú zobraziť. Zvláštnosťou operátora je, že je vždy umiestnený na konci. Vyžaduje jeden požadovaný parameter a jeden voliteľný. Prvý určuje, koľko riadkov s vybratými údajmi sa má zobraziť. A ak sa použije druhý, potom operátor pracuje ako pre rozsah hodnôt.

    UNION. Veľmi praktický operátor na kombinovanie viacerých dopytov. Už sa stretol medzi príkladmi tohto v tomto článku. Požadované riadky z niekoľkých tabuliek môžete zobraziť tak, že ich spojíte pomocou UNION pre pohodlnejšie použitie. Syntax je: SELECT názov_stĺpca FROM názov_tabuľky UNION SELECT názov iného_stĺpca FROM iný názov_tabuľky. Výsledkom je kontingenčná tabuľka s kombinovanými dopytmi.

    PRIMÁRNY KĽÚČ. Preložené ako „primárny kľúč“. V skutočnosti sa v referenčných materiáloch používa práve táto terminológia. Znamená jedinečný identifikátor riadku. Používa sa spravidla pri vytváraní tabuľky na určenie poľa, ktoré ju bude obsahovať.

    DEFAULT. Rovnako ako predchádzajúci operátor sa používa v procese vykonávania vytváracieho dotazu. Definuje predvolenú hodnotu, ktorá sa vyplní do poľa pri jeho vytvorení.

    NULOVÝ. Začiatočníci a nielen programátori pri zostavovaní dotazov veľmi často zabúdajú na možnosť získania hodnoty NULL. V dôsledku toho sa do kódu vkradne chyba, ktorú je pri ladení ťažké vystopovať. Preto sa pri vytváraní tabuliek, výbere či prepočítavaní hodnôt treba zastaviť a porozmýšľať, či sa berie do úvahy výskyt NULL v tejto časti dotazu.

    Pamäť. Tento článok ukázal niekoľko funkcií, ktoré môžu vykonávať určité úlohy. Pri vývoji shellu na prácu s databázou môžete „prevážiť“ výpočet jednoduchých výrazov v systéme správy databázy. V niektorých prípadoch to výrazne zvyšuje výkon.

    Obmedzenia. Ak potrebujete získať iba dva z databázy s tisíckami riadkov, mali by ste použiť operátory ako LIMIT alebo TOP. Nie je potrebné extrahovať údaje pomocou vývojového jazyka shellu.

    Zlúčenina. Po prijatí údajov z niekoľkých tabuliek ich veľa programátorov začne spájať pomocou pamäte shellu. Ale prečo? Koniec koncov, môžete podať jednu žiadosť, v ktorej bude toto všetko prítomné. Nemusíte písať extra kód a rezervovať dodatočnú pamäť v systéme.

    Triedenie. Ak je možné použiť objednávanie v dopyte, teda pomocou DBMS, musíte ho použiť. To výrazne ušetrí prostriedky pri spustení programu alebo služby.

    Veľa žiadostí. Ak musíte vložiť veľa záznamov postupne, potom by ste kvôli optimalizácii mali premýšľať o dávkovom vkladaní údajov do jedného dotazu. Zvýši sa tým aj výkon celého systému ako celku.

    Premyslené umiestnenie údajov. Pred zostavením štruktúry databázy si treba premyslieť, či je takýto počet tabuliek a polí nutný. Možno existuje spôsob, ako ich zlúčiť alebo niektoré zahodiť. Programátori veľmi často používajú nadmerné množstvo dát, ktoré sa nikdy nikde nepoužijú.

    Typy. Ak chcete ušetriť miesto a zdroje, musíte byť citliví na typy údajov, ktoré používate. Ak je možné použiť typ, ktorý je menej „ťažký“ na pamäť, tak je potrebné ho použiť. Napríklad, ak je známe, že v danom poli číselná hodnota nepresiahne 255, tak prečo používať 4-bajtový INT, ak existuje TINYINT s veľkosťou 1 bajt.

Záver

Na záver treba poznamenať, že štruktúrovaný dopytovací jazyk SQL sa dnes používa takmer všade – stránky, webové služby, PC programy, aplikácie pre mobilné zariadenia. Znalosť SQL preto pomôže všetkým odvetviam vývoja.

Zároveň sa úpravy pôvodnej jazykovej normy niekedy navzájom líšia. Napríklad príkazy PL SQL môžu mať inú syntax ako v SQL Serveri. Preto skôr, ako začnete s vývojom pomocou tejto technológie, mali by ste si prečítať manuály k nej.

V budúcnosti je nepravdepodobné, že by sa objavili analógy, ktoré by mohli prekonať SQL z hľadiska funkčnosti a výkonu, takže táto oblasť je pre každého programátora celkom sľubná.

vyhradené slová sú trvalou súčasťou jazyka SQL a majú pevnú hodnotu. Mali by byť napísané presne tak, ako je predpísané, nemali by sa rozdeľovať na kúsky, aby ste ich preniesli z jedného riadku do druhého. Slová definované používateľom sú definované používateľom (podľa syntaktických pravidiel) a sú to identifikátory alebo názvy rôznych databázových objektov. Slová v operátore sú tiež umiestnené v súlade so stanovenými syntaktickými pravidlami.

Identifikátory Jazyky SQL majú odkazovať na objekty v databáze a sú to názvy tabuliek, zobrazení, stĺpcov a iných databázových objektov. Symboly, ktoré je možné použiť pri vytváraní používateľom identifikátory Jazyk SQL musí byť definovaný ako množina znakov. Štandard SQL definuje predvolenú znakovú sadu, ktorá obsahuje veľké a malé písmená latinky (A-Z , a-z ), čísla (0-9 ) a znak podčiarknutia (_ ). Pre formát identifikátora platia nasledujúce obmedzenia:

  • identifikátor môže mať dĺžku až 128 znakov;
  • identifikátor musí začínať písmenom;
  • identifikátor nemôže obsahovať medzery.

<идентификатор>::=<буква> {<буква>|<цифра>)[,...n]

Väčšina jazykových komponentov nerozlišuje veľké a malé písmená. Keďže jazyk SQL má voľný formát, jednotlivé príkazy SQL a ich sekvencie budú pri použití odsadzovania a zarovnávania čitateľnejšie.

Jazyk, v ktorom je jazyk SQL popísaný, sa nazýva tzv metajazyk. Syntaktické definície sa zvyčajne špecifikujú pomocou špeciálnej metajazykovej symboliky tzv Backus-Nauerove formy(BNF). Na písanie sa používajú veľké písmená vyhradené slová a musia byť špecifikované vo vyhláseniach presne tak, ako budú zobrazené. Malé písmená sa používajú na písanie slov definovaných používateľom. Symboly používané v zápise BNF a ich označenia sú uvedené v tabuľke.

Tabuľka 1.1.
Symbol Označenie
::= Rovná podľa definície
| Potreba vybrať si jednu z niekoľkých daných hodnôt
<…> Štruktúra jazyka opísaná pomocou metajazyka
{…} Povinný výber nejakého dizajnu zo zoznamu
[…] Voliteľný výber nejakého konštruktu zo zoznamu
[,…n] Voliteľná možnosť opakovania stavby od nuly až po viackrát

Popis tréningovej databázy

V nasledujúcej prezentácii bude ako príklad použitá malá databáza, ktorá odráža proces dodávania alebo predaja určitého produktu bežným zákazníkom.

Na základe analýzy predmetná oblasť, môžeme rozlíšiť dva typy subjektov – PRODUKT a ZÁKAZNÍK, ktoré sú vzájomne prepojené vzťahom „veľa-mnoho“, pretože každý kupujúci si môže kúpiť veľa položiek tovaru a každý výrobok si môže kúpiť veľa kupujúcich. Relačný dátový model však vyžaduje, aby bol vzťah mnoho k mnohým nahradený viacerými vzťahmi jeden k mnohým. Pridajme ďalší typ subjektov, ktorý zobrazuje proces predaja tovaru – DEAL.

Vytvorte spojenia medzi objektmi. Jeden zákazník môže nakupovať položky viackrát, takže medzi objektmi ZÁKAZNÍKA a DEAL existuje vzťah jedna k mnohým. Každý názov produktu sa môže opakovane zúčastňovať transakcií, v dôsledku čoho existuje medzi objektmi PRODUCT a DEAL vzťah jedna k mnohým.

Definujme atribúty a priraďme ich k entitám a vzťahom. Objekt TOVARU obsahuje také charakteristiky ako názov, typ, cena, trieda. K objektu KLIENT - meno, priezvisko, firma, mesto, tel. Typ entity DEAL možno charakterizovať takými charakteristikami, ako je dátum a množstvo predaného tovaru.

Dôležitým krokom pri vytváraní databázy je definovanie atribútov, ktoré každý jedinečne identifikujú inštancia entity, t.j. detekcia primárne kľúče.

Pre tabuľku PRODUKT nie je možné použiť názov primárny kľúč, pretože tovar rôzneho druhu môže mať rovnaké názvy, zadávajme teda primárny kľúč ProductCode, ktorý možno chápať napríklad ako SKU produktu. Tak isto nemôže slúžiť ani Meno, ani Firma, ani Mesto primárny kľúč v tabuľke KLIENT. Poďme si predstaviť primárny kľúč ClientCode, ktorý možno chápať ako číslo pasu, daňové identifikačné číslo alebo akýkoľvek iný atribút, ktorý jednoznačne identifikuje každého klienta. Za stôl AKCIA primárny kľúč je pole DealCode, pretože jedinečne identifikuje dátum, zákazníka a ďalšie dátové prvky. Ako primárny kľúč dalo by sa vybrať nie jedno pole, ale nejaký súbor polí, ale pre ilustráciu jazykové konštrukty obmedzujeme sa na jednoduché primárne kľúče.