În ultimul meu articol, am descris în linii mari cum diferă SQL standard de T-SQL și cine ar trebui să învețe care dintre ele. Acum aș dori să mă concentrez asupra diferențelor de sintaxă și să ilustrez aceste diferențe cu exemple. Dacă credeți că T-SQL este o extensie care implementează toate caracteristicile din SQL standard, nu aveți dreptate. Cu toate acestea, în SQL Server, veți găsi aproape toate caracteristicile din standardul SQL. În acest articol, veți găsi exemple ale unora dintre diferențele de sintaxă dintre SQL standard și Transact-SQL.
#1 Numele obiectelor din baza de date
În sistemele de baze de date relaționale, denumim tabele, vizualizări și coloane, dar uneori trebuie să folosim același nume ca și cuvânt cheie sau să folosim caractere speciale. În SQL standard, puteți plasa acest tip de nume între ghilimele („”), dar în T-SQL, îl puteți plasa și între paranteze (). Priviți aceste exemple pentru numele unei tabele în T-SQL:
CREATE TABLE dbo.test."first name" ( Id INT, Name VARCHAR(100));CREATE TABLE dbo.test. ( Id INT, Name VARCHAR(100));
Doar primul delimitator (ghilimelele) pentru numele special face parte și el din standardul SQL.
Ce este diferit într-o instrucțiune SELECT?
Standardul SQL nu are o sintaxă pentru o interogare care returnează valori sau valori care provin din expresii fără a se referi la nicio coloană a unei tabele, dar MS SQL Server permite acest tip de expresie. Cum? Puteți utiliza o instrucțiune SELECT singură cu o expresie sau cu alte valori care nu provin din coloane ale tabelului. În T-SQL, arată ca în exemplul de mai jos:
SELECT 12/6 ;
În această expresie, nu avem nevoie de un tabel pentru a evalua 12 împărțit la 6, prin urmare, instrucțiunea FROM și numele tabelului pot fi omise.
#3 Limitarea înregistrărilor într-un set de rezultate
În standardul SQL, puteți limita numărul de înregistrări din rezultate utilizând sintaxa ilustrată mai jos:
SELECT * FROM tab FETCH FIRST 10 ROWS ONLY
T-SQL implementează această sintaxă într-un mod diferit. Exemplul de mai jos prezintă sintaxa MS SQL Server:
SELECT * FROM tab ORDER BY col1 DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY;
După cum observați, aceasta utilizează o clauză ORDER BY. Un alt mod de a selecta rânduri, dar fără ORDER BY, este prin utilizarea clauzei TOP în T-SQL:
SELECT TOP 10 * FROM tab;
#4 Generarea automată a valorilor
Standardul SQL vă permite să creați coloane cu valori generate automat. Sintaxa pentru a face acest lucru este prezentată mai jos:
CREATE TABLE tab (id DECIMAL GENERATED ALWAYS AS IDENTITY);
În T-SQL putem, de asemenea, genera automat valori, dar în acest mod:
CREATE TABLE tab (id INTEGER IDENTITY);
#5 Funcții matematice
Câteva funcții matematice uzuale fac parte din standardul SQL. Una dintre aceste funcții matematice este CEIL(x), pe care nu o găsim în T-SQL. În schimb, T-SQL oferă următoarele funcții non-standard: SIGN(x), ROUND(x,) pentru rotunjirea valorii zecimale x la numărul de poziții zecimale, TRUNC(x) pentru trunchierea la un anumit număr de poziții zecimale, LOG(x) pentru a returna logaritmul natural pentru o valoare x și RANDOM() pentru a genera numere aleatoare. Cel mai mare sau cel mai mic număr dintr-o listă în standardul SQL este returnat de funcțiile MAX(list) și MIN(list), dar în Transact-SQL, se folosesc funcțiile GREATEST(list) și LEAST(list).
T-SQL function ROUND:SELECT ROUND(col) FROM tab;
#6 Funcții de agregare
Căutăm o altă diferență de sintaxă cu funcțiile de agregare. Funcțiile COUNT, SUM și AVG primesc toate un argument legat de un număr. T-SQL permite utilizarea funcției DISTINCT înaintea acestor valori de argument, astfel încât rândurile să fie numărate numai dacă valorile sunt diferite de alte rânduri. Standardul SQL nu permite utilizarea lui DISTINCT în aceste funcții.
Standard SQL:SELECT COUNT(col) FROM tab;T-SQL:SELECT COUNT(col) FROM tab;SELECT COUNT(DISTINCT col) FROM tab;
Dar în T-SQL nu găsim o funcție de covarianță a populației: COVAR_POP(x,y), care este definită în standardul SQL.
#7 Recuperarea unor părți din date și ore
Majoritatea sistemelor de baze de date relaționale livrează multe funcții pentru a opera asupra datelor și orelor.
În SQL standard, funcția EXTRACT(YEAR FROM x) și funcțiile similare pentru a selecta părți de date sunt diferite de funcțiile T-SQL precum YEAR(x) sau DATEPART(year, x).
Există, de asemenea, o diferență în obținerea datei și orei curente. SQL standard vă permite să obțineți data curentă cu ajutorul funcției CURRENT_DATE, dar în MS SQL Server nu există o funcție similară, așa că trebuie să folosim funcția GETDATE ca argument în funcția CAST pentru a converti la un tip de date DATE.
#8 Operarea cu șiruri de caractere
Utilizarea funcțiilor pentru a opera cu șiruri de caractere este, de asemenea, diferită între SQL standard și T-SQL. Principala diferență se regăsește în eliminarea spațiilor finale și inițiale dintr-un șir de caractere. În SQL standard, există funcția TRIM, dar în T-SQL, există mai multe funcții conexe: TRIM (îndepărtarea spațiilor de la urmă și de la început), LTRIM (îndepărtarea spațiilor de la început) și RTRIM (îndepărtarea spațiilor de la sfârșit).
O altă funcție de șir foarte des utilizată este SUBSTRING.
Sintaxa SQL standard pentru funcția SUBSTRING arată astfel:
SUBSTRING(str FROM start )
dar în T-SQL, sintaxa acestei funcții arată astfel:
SUBSTRING(str, start, length)
Există uneori motive pentru a adăuga valori provenind din alte coloane și/sau șiruri suplimentare. Standard SQL permite următoarea sintaxă pentru a face acest lucru:
După cum puteți vedea, această sintaxă utilizează operatorul || pentru a adăuga un șir la altul.
Dar operatorul echivalent în T-SQL este caracterul semnul plus. Priviți acest exemplu:
SELECT col1 + col2 FROM tab;
În SQL Server, avem, de asemenea, posibilitatea de a folosi funcția CONCAT care concatenează o listă de șiruri de caractere:
SELECT CONCAT(col1, str1, col2, ...) FROM tab;
De asemenea, putem repeta un caracter de mai multe ori. Standard SQL definește funcția REPEAT(str, n) pentru a face acest lucru. Transact-SQL oferă funcția REPLICATE. De exemplu:
SELECT REPLICATE(str, x);
unde x indică de câte ori se repetă șirul sau caracterul.
#9 Operatorul de inegalitate
În timpul filtrării înregistrărilor într-o instrucțiune SELECT, uneori trebuie să folosim un operator de inegalitate. SQL standard definește <> ca fiind acest operator, în timp ce T-SQL permite atât operatorul standard, cât și operatorul !=:
SELECT col3 FROM tab WHERE col1 != col2;
#10 Funcția ISNULL
În T-SQL, avem posibilitatea de a înlocui valorile NULL provenite de la o coloană folosind funcția ISNULL. Aceasta este o funcție specifică pentru T-SQL și nu se regăsește în standardul SQL.
SELECT ISNULL(col1) FROM tab;
Ce părți ale sintaxei DML sunt diferite?
În T-SQL, sintaxa de bază a interogărilor DELETE, UPDATE și INSERT este aceeași cu cea din standardul SQL, dar apar diferențe în interogările mai avansate. Să le analizăm.
#11 Cuvântul cheie OUTPUT
Cuvântul cheie OUTPUT apare în instrucțiunile DELETE, UPDATE și INSERT. Nu este definit în SQL standard.
Utilizând T-SQL, putem vedea informații suplimentare returnate de o interogare. Se returnează atât valorile vechi cât și cele noi în UPDATE sau valorile adăugate folosind INSERT sau șterse folosind DELETE. Pentru a vedea aceste informații, trebuie să folosim prefixe în INSERT, UPDATE și DELETE.
UPDATE tab SET col='new value' OUTPUT Deleted.col, Inserted.col;
Vedem rezultatul modificării înregistrărilor cu valorile anterioare și noi într-o coloană actualizată. Standardul SQL nu acceptă această caracteristică.
#12 Sintaxa pentru INSERT INTO … SELECT
O altă structură a unei interogări INSERT este INSERT INTO … SELECT. T-SQL vă permite să introduceți date dintr-un alt tabel într-un tabel de destinație. Priviți această interogare:
INSERT INTO tab SELECT col1,col2,... FROM tab_source;
Nu este o funcție standard, ci o funcție caracteristică a SQL Server.
#13 Clauza FROM în DELETE și UPDATE
SQL Server oferă o sintaxă extinsă a clauzelor UPDATE și DELETE cu FROM. Puteți utiliza DELETE with FROM pentru a utiliza rândurile dintr-o tabelă pentru a elimina rândurile corespunzătoare dintr-o altă tabelă, făcând referire la o cheie primară și la o cheie externă. În mod similar, puteți utiliza UPDATE with FROM pentru a actualiza rândurile dintr-un tabel făcând trimitere la rândurile dintr-un alt tabel folosind valori comune (cheie primară într-un tabel și cheie externă în al doilea, de exemplu, același nume de oraș). Iată un exemplu:
DELETE FROM BookFROM AuthorWHERE Author.Id=Book.AuthorId AND Author.Name IS NULL;
UPDATE BookSET Book.Price=Book.Price*0.2FROM AuthorWHERE Book.AuthorId=Author.Id AND Author.Id=12;
Standardul SQL nu prevede această sintaxă.
#14 INSERT, UPDATE și DELETE cu JOIN
De asemenea, puteți folosi INSERT, UPDATE și DELETE folosind JOIN pentru a vă conecta la un alt tabel. Un exemplu în acest sens este:
DELETE ItemOrder FROM ItemOrderJOIN Item ON ItemOrder.ItemId=Item.IdWHERE YEAR(Item.DeliveredDate) <= 2017;
Această caracteristică nu se regăsește în standardul SQL.
Rezumat
Acest articol nu acoperă toate aspectele legate de diferențele de sintaxă dintre standardul SQL și T-SQL care utilizează sistemul MS SQL Server. Cu toate acestea, acest ghid ajută la evidențierea unor caracteristici de bază caracteristice doar pentru Transact-SQL și ce sintaxă a standardului SQL nu este implementată de MS SQL Server.
.