(!LANG: Što je SQL. Svrha i osnova

Osnovne SQL naredbe koje bi svaki programer trebao znati

SQL ili Structured Query Language (strukturirani jezik upita) dizajniran je za upravljanje podacima u sustavu relacijske baze podataka (RDBMS). Ovaj članak će pokriti najčešće korištene SQL naredbe s kojima bi svaki programer trebao biti upoznat. Ovaj materijal je idealan za one koji žele nadopuniti svoje znanje o SQL-u prije razgovora za posao. Da biste to učinili, analizirajte primjere navedene u članku i zapamtite da ste prošli kroz baze podataka u parovima.

Imajte na umu da neki sustavi baza podataka zahtijevaju točku i zarez na kraju svake izjave. Točka-zarez je standardni pokazivač na kraj svake izjave u SQL-u. Primjeri koriste MySQL, tako da je točka-zarez obavezna.

Primjer postavljanja baze podataka

Stvorite bazu podataka kako biste pokazali kako naredbe rade. Da biste radili, morat ćete preuzeti dvije datoteke: DLL.sql i InsertStatements.sql . Nakon toga otvorite terminal i prijavite se na MySQL konzolu sljedećom naredbom (članak pretpostavlja da je MySQL već instaliran na sustavu):

MySQL -u korijen -p

Zatim unesite lozinku.

Pokrenite sljedeću naredbu. Nazovimo bazu podataka "sveučilište":

KREIRATI BAZU PODATAKA sveučilište; američko sveučilište; IZVOR ; IZVOR

Naredbe baze podataka

1. Pregledajte dostupne baze podataka

PRIKAŽI BAZE PODATAKA;

2. Napravite novu bazu podataka

KREIRATI BAZU PODATAKA;

3. Odabir baze podataka za korištenje

KORISTITI ;

4. Uvezite SQL naredbe iz .sql datoteke

IZVOR ;

5. Brisanje baze podataka

ISPUSTI BAZU PODATAKA ;

Rad sa tablicama

6. Pregledajte tablice dostupne u bazi podataka

PRIKAŽI TABLE;

7. Napravite novu tablicu

STVORI TABLU ( , , GLAVNI KLJUČ ( ), STRANI KLJUC ( ) REFERENCE ());

Ograničenja integriteta pri korištenju CREATE TABLE

Možda ćete morati stvoriti ograničenja za određene stupce u tablici. Prilikom izrade tablice možete postaviti sljedeća ograničenja:

  • ćelija tablice ne može biti NULL;
  • primarni ključ - PRIMARY KEY (naziv_stupca1, naziv_stupca2, ...) ;
  • strani ključ - STRANI KLJUČ (naziv_stupca1, …, naziv_stupcaxn) REFERENCE ime_tablice(naziv_stupca1, …, ime_stupcaxn) .

Možete navesti više od jednog primarnog ključa. U ovom slučaju dobivate složeni primarni ključ.

Primjer

Napravite tablicu "instruktora":

CREATE TABLE instruktor (ID CHAR(5), ime VARCHAR(20) NOT NULL, dept_name VARCHAR(20), plaća NUMERIC(8,2), PRIMARNI KLJUČ (ID), STRANI KLJUČ (dept_name) REFERENCE odjel(dept_name));

8. Podaci o tablici

Možete vidjeti različite informacije (vrstu vrijednosti, ključ ili ne) o stupcima tablice sljedećom naredbom:

OPISATI ;

9. Dodavanje podataka u tablicu

UMETNUTI U (, , , …) VRIJEDNOSTI ( , , , …);

Kada dodajete podatke u svaki stupac tablice, ne morate navoditi nazive stupaca.

UMETNUTI U VRIJEDNOSTI ( , , , …);

10. Ažurirajte podatke tablice

AŽURIRAJ SET = , = , ... GDJE ;

11. Brisanje svih podataka iz tablice

IZBRIŠI IZ ;

12. Brisanje tablice

ISPUSTI STOL ;

Naredbe za kreiranje upita

13. ODABIR

SELECT se koristi za dobivanje podataka iz određene tablice:

ODABERI , , … OD ;

Sljedeća naredba može prikazati sve podatke iz tablice:

ODABIR * IZ ;

14. ODABIR DISTINCT

Stupci tablice mogu sadržavati duplicirane podatke. Upotrijebite SELECT DISTINCT da biste dobili samo neduplicirane podatke.

ODABIR DISTINCT , , … OD ;

15. GDJE

Možete koristiti ključnu riječ WHERE u SELECT za određivanje uvjeta u upitu:

ODABERI , , … OD GDJE ;

U zahtjevu možete navesti sljedeće uvjete:

  • usporedba teksta;
  • usporedba brojčanih vrijednosti;
  • logičke operacije I (i), ILI (ili) i NOT (negacija).

Primjer

Isprobajte sljedeće naredbe. Obratite pažnju na uvjete navedene u GDJE:

SELECT * FROM course WHERE dept_name='Comp. Sci.'; ODABIR * IZ kolegija WHERE bodova>3; SELECT * FROM course WHERE dept_name="Comp. Sci." I bodova>3;

16. GRUPA PO

Operator GROUP BY često se koristi sa agregatnim funkcijama kao što su COUNT , MAX , MIN , SUM i AVG za grupiranje izlaznih vrijednosti.

ODABERI , , … OD GRUPA PO ;

Primjer

Prikažimo broj kolegija za svaki fakultet:

SELECT COUNT(course_id), dept_name FROM kolegija GROUP BY dept_name;

17. IMATI

Ključna riječ HAVING dodana je u SQL jer se WHERE ne može koristiti sa agregatnim funkcijama.

ODABERI , , ... OD GRUPA PO IMATI

Primjer

Prikažimo popis fakulteta koji imaju više od jednog kolegija:

SELECT COUNT(course_id), dept_name FROM course GROUP BY dept_name HAVING COUNT(course_id)>1;

18. NARUČITE PO

ORDER BY se koristi za sortiranje rezultata upita uzlaznim ili silaznim redoslijedom. ORDER BY sortira uzlaznim redoslijedom osim ako nisu navedeni ASC ili DESC.

ODABERI , , … OD NARUDŽITE PO , , …ASC|DESC;

Primjer

Prikažimo popis kolegija uzlaznim i silaznim redoslijedom prema broju bodova:

ODABIR * IZ tečaja REDUS PO bodovima; ODABIR * IZ tečaja RED BY bodovima DESC;

19. IZMEĐU

BETWEEN se koristi za odabir vrijednosti podataka iz određenog raspona. Mogu se koristiti numeričke i tekstualne vrijednosti, kao i datumi.

ODABERI , , … OD GDJE IZMEĐU I ;

Primjer

Prikažimo popis instruktora čija je plaća veća od 50.000, ali manja od 100.000:

ODABIR * OD instruktora GDJE plaća IZMEĐU 50000 I 100000;

20.LIKE

Operator LIKE koristi se u WHERE za određivanje uzorka za traženje slične vrijednosti.

Postoje dva besplatna operatora koja se koriste u LIKE:

  • % (ni jedan, jedan ili više znakova);
  • _ (jedan znak).
ODABERI , , … OD GDJE KAO ;

Primjer

Prikažimo popis kolegija čiji nazivi sadrže "do" i popis kolegija čiji nazivi počinju s "CS-":

SELECT * FROM kolegija WHERE naslov LIKE '%to%'; SELECT * FROM course WHERE course_id LIKE "CS-___";

21. IN

Pomoću IN možete odrediti više vrijednosti za klauzulu WHERE:

ODABERI , , … OD GDJE IN ( , , …);

Primjer

Prikažimo popis učenika iz smjera Comp. prirodoslovlja, fizike i elek. Engleski:

SELECT * FROM student WHERE dept_name IN('Comp. Sci.', 'Physics', 'Elec. Eng.');

22. PRIDRUŽITE SE

JOIN se koristi za povezivanje dvije ili više tablica koristeći zajedničke atribute unutar njih. Slika ispod prikazuje različite načine pridruživanja u SQL-u. Obratite pažnju na razliku između lijevog vanjskog spoja i desnog vanjskog spoja:

ODABERI , , … OD PRIDRUŽITI NA = ;

Primjer 1

Ovdje je popis svih tečajeva i odgovarajućih informacija o odjelima:

SELECT * IZ tečaja PRIDRUŽITE se odjelu NA course.dept_name=department.dept_name;

Primjer 2

Ovdje je popis svih potrebnih tečajeva i pojedinosti o njima:

SELECT prereq.course_id, title, dept_name, credits, prereq_id FROM prereq LEFT OUTER JOIN course ON prereq.course_id=course.course_id;

Primjer 3

Prikažimo popis svih tečajeva, bez obzira na to jesu li obavezni ili ne:

SELECT course.course_id, title, dept_name, credits, prereq_id FROM prereq DESNO VANJSKO PRIDRUŽENJE kolegiju NA prereq.course_id=course.course_id;

23 Pogled

Pogled je virtualna SQL tablica stvorena kao rezultat izvršavanja izraza. Sadrži retke i stupce i vrlo je sličan normalnoj SQL tablici. Prikaz uvijek prikazuje najnovije informacije iz baze podataka.

Stvaranje

STVORI POGLED KAO SELECT , , … OD GDJE ;

Uklanjanje

ISPUSTI POGLED ;

Primjer

Kreirajmo pogled koji se sastoji od tečajeva s 3 boda:

24. Funkcije agregata

Ove funkcije se koriste za dobivanje zbirnog rezultata koji se odnosi na dotične podatke. Sljedeće su najčešće korištene agregatne funkcije:

  • COUNT (naziv_stupca) - vraća broj redaka;
  • SUM (naziv_stupca) - vraća zbroj vrijednosti u danom stupcu;
  • AVG (col_name) - vraća prosječnu vrijednost zadanog stupca;
  • MIN (naziv_stupca) - vraća najmanju vrijednost zadanog stupca;
  • MAX(naziv_stupca) - Vraća najveću vrijednost zadanog stupca.

25. Ugniježđeni podupiti

Ugniježđeni potupiti su SQL upiti koji uključuju izraze SELECT , FROM i WHERE ugniježđene unutar drugog upita.

Primjer

Pronađimo predmete koji su se predavali u jesen 2009. i u proljeće 2010.:

ODABIR DISTINCT course_id FROM section WHERE semester = 'Jesen' I year= 2009 AND course_id IN (ODABIR course_id FROM section WHERE semester = 'Proljeće' I year= 2010);

Ovaj tutorial je nešto poput "pečata moje memorije" u SQL jeziku (DDL, DML), t.j. to su informacije koje su se nakupile tijekom mojih profesionalnih aktivnosti i koje se stalno pohranjuju u mojoj glavi. To mi je dovoljan minimum koji se najčešće koristi pri radu s bazama podataka. Ako se pojavi potreba za korištenjem potpunijih SQL konstrukcija, obično se za pomoć obraćam biblioteci MSDN koja se nalazi na Internetu. Po meni je jako teško držati sve u glavi i nema posebne potrebe za tim. Ali poznavanje osnovnih konstrukcija je vrlo korisno, jer. primjenjivi su gotovo u istom obliku u mnogim relacijskim bazama podataka kao što su Oracle, MySQL, Firebird. Razlike su uglavnom u tipovima podataka, koji se mogu razlikovati u pojedinostima. Osnovnih SQL jezičnih konstrukcija nema toliko, a uz stalno vježbanje brzo se pamte. Na primjer, za kreiranje objekata (tablica, ograničenja, indeksa itd.) dovoljno je imati pri ruci uređivač teksta okruženja (IDE) za rad s bazom podataka, a nema potrebe učiti vizualni alat izoštren za rad s određenom vrstom baze podataka (MS SQL, Oracle, MySQL, Firebird,…). To je također zgodno jer vam je cijeli tekst pred očima, a ne morate trčati kroz brojne kartice da biste napravili, primjerice, indeks ili ograničenje. Kada se stalno radi s bazom podataka, stvaranje, modificiranje, a posebno ponovno kreiranje objekta pomoću skripti je mnogo puta brže nego ako se radi u vizualnom načinu. Također u načinu rada skripte (odnosno, s dužnom pažnjom), lakše je postaviti i kontrolirati pravila za imenovanje objekata (moje subjektivno mišljenje). Osim toga, skripte su prikladne za korištenje kada promjene napravljene u jednoj bazi podataka (na primjer, testnoj) treba prenijeti u istom obliku u drugu bazu podataka (produktivnu).

SQL jezik je podijeljen na nekoliko dijelova, ovdje ću razmotriti 2 njegova najvažnija dijela:
  • DML - Jezik za upravljanje podacima (jezik za manipulaciju podacima), koji sadrži sljedeće konstrukcije:
    • SELECT - odabir podataka
    • INSERT - umetanje novih podataka
    • UPDATE - ažuriranje podataka
    • DELETE - brisanje podataka
    • MERGE - spajanje podataka
Jer Ja sam praktičar, kao takav će u ovom udžbeniku biti malo teorije, a sve konstrukcije će biti objašnjene na praktičnim primjerima. Osim toga, vjerujem da se programski jezik, a posebno SQL, može svladati samo u praksi, ako ga sami dodirnete i shvatite što se događa kada izvršite ovu ili onu konstrukciju.

Ovaj tutorial nastao je po principu Korak po korak, tj. potrebno ga je čitati uzastopno i po mogućnosti odmah nakon primjera. Ali ako usput trebate detaljnije naučiti o naredbi, upotrijebite određenu pretragu na Internetu, na primjer, u MSDN biblioteci.

Prilikom pisanja ovog vodiča koristio sam bazu podataka MS SQL Server verzije 2014, a za pokretanje skripti koristio sam MS SQL Server Management Studio (SSMS).

Ukratko o MS SQL Server Management Studiju (SSMS)

SQL Server Management Studio (SSMS) je uslužni program za Microsoft SQL Server za konfiguriranje, upravljanje i administriranje komponenti baze podataka. Ovaj uslužni program sadrži uređivač skripti (koji ćemo uglavnom koristiti) i grafički program koji radi s objektima i postavkama poslužitelja. Glavni alat SQL Server Management Studio-a je Object Explorer, koji korisniku omogućuje pregled, dohvaćanje i upravljanje objektima poslužitelja. Ovaj tekst je dijelom posuđen s Wikipedije.

Za izradu novog uređivača skripte upotrijebite gumb Novi upit:

Za promjenu trenutne baze podataka, možete koristiti padajući popis:

Za izvršenje određene naredbe (ili grupe naredbi), odaberite je i pritisnite gumb "Izvrši" ili pritisnite tipku "F5". Ako u uređivaču trenutno postoji samo jedna naredba ili ako trebate izvršiti sve naredbe, onda ne morate ništa odabrati.

Nakon izvršavanja skripti, posebno onih koje stvaraju objekte (tablice, stupce, indekse), da biste vidjeli promjene, koristite Osvježi iz kontekstnog izbornika, naglašavajući odgovarajuću grupu (na primjer, Tablice), samu tablicu ili grupu Stupci u njoj .

Zapravo, ovo je sve što trebamo znati da bismo dovršili ovdje navedene primjere. Ostatak SSMS uslužnog programa lako je naučiti sami.

Malo teorije

Relacijska baza podataka (RDB, ili dalje u kontekstu samo baze podataka) je zbirka međusobno povezanih tablica. Grubo govoreći, baza podataka je datoteka u kojoj su podaci pohranjeni u strukturiranom obliku.

DBMS - Sustav za upravljanje tim bazama podataka, tj. ovo je skup alata za rad s određenom vrstom baze podataka (MS SQL, Oracle, MySQL, Firebird, ...).

Bilješka
Jer u životu, u kolokvijalnom govoru, uglavnom govorimo: “Oracle DB”, ili čak samo “Oracle”, što zapravo znači “Oracle DBMS”, tada će se u kontekstu ovog tutoriala ponekad koristiti termin DB. Iz konteksta, mislim da će biti jasno o čemu se točno radi.

Tablica je zbirka stupaca. Stupci se također mogu zvati polja ili stupci, sve ove riječi će se koristiti kao sinonimi, izražavajući istu stvar.

Tablica je glavni objekt RDB-a, svi RDB podaci se pohranjuju red po red u stupcima tablice. Linije, zapisi su također sinonimi.

Za svaku tablicu, kao i njezine stupce, dati su nazivi prema kojima se naknadno pozivaju.
Naziv objekta (ime tablice, naziv stupca, naziv indeksa itd.) u MS SQL-u može imati maksimalnu duljinu od 128 znakova.

Za referencu– u bazi podataka ORACLE nazivi objekata mogu imati maksimalnu duljinu od 30 znakova. Stoga, za određenu bazu podataka, morate razviti vlastita pravila za imenovanje objekata kako biste zadovoljili ograničenje broja znakova.

SQL je jezik koji vam omogućuje ispitivanje baze podataka kroz DBMS. U određenom DBMS-u, SQL jezik može imati specifičnu implementaciju (vlastiti dijalekt).

DDL i DML su podskup jezika SQL:

  • DDL jezik se koristi za kreiranje i modificiranje strukture baze podataka, t.j. za stvaranje/izmjenu/brisanje tablica i odnosa.
  • DML jezik vam omogućuje manipuliranje tabličnim podacima, t.j. sa svojim linijama. Omogućuje vam odabir podataka iz tablica, dodavanje novih podataka u tablice te ažuriranje i brisanje postojećih podataka.

U SQL jeziku možete koristiti 2 vrste komentara (jednoredni i višeredni):

Komentar u jednom retku
i

/* višeredni komentar */

Zapravo, sve za teoriju ovoga bit će dovoljno.

DDL - Jezik definicije podataka (jezik opisa podataka)

Na primjer, razmotrite tablicu s podacima o zaposlenicima, u obliku poznatom osobi koja nije programer:

U ovom slučaju, stupci tablice imaju sljedeće nazive: Broj osoblja, Puno ime, Datum rođenja, E-mail, Funkcija, Odjel.

Svaki od ovih stupaca može se okarakterizirati vrstom podataka koje sadrži:

  • Broj osoblja - cijeli broj
  • puni naziv - niz
  • Datum rođenja - datum
  • Email - niz
  • Položaj - niz
  • odjel – niz
Vrsta stupca je karakteristika koja pokazuje kakve podatke ovaj stupac može pohraniti.

Za početak će biti dovoljno zapamtiti samo sljedeće osnovne tipove podataka koji se koriste u MS SQL-u:

Značenje Zapis u MS SQL-u Opis
Žica promjenjive dužine varchar(N)
i
nvarchar(N)
S brojem N možemo odrediti maksimalnu moguću duljinu niza za odgovarajući stupac. Na primjer, ako želimo reći da vrijednost stupca "Name" može sadržavati najviše 30 znakova, tada trebamo postaviti njegov tip na nvarchar (30).
Razlika između varchar i nvarchar je u tome što varchar omogućuje pohranjivanje nizova u ASCII formatu, gdje jedan znak zauzima 1 bajt, dok nvarchar pohranjuje nizove u Unicode formatu, gdje svaki znak zauzima 2 bajta.
Vrsta varchar treba se koristiti samo ako ste 100% sigurni da polje neće trebati pohranjivati ​​Unicode znakove. Na primjer, varchar se može koristiti za pohranu adresa e-pošte jer obično sadrže samo ASCII znakove.
Žica fiksne dužine znak (N)
i
nchar(N)
Ovaj se tip razlikuje od niza promjenjive duljine po tome što ako je duljina niza manja od N znakova, tada se uvijek dodaje udesno na duljinu od N razmaka i pohranjuje u bazu podataka u ovom obliku, t.j. u bazi podataka zauzima točno N znakova (gdje jedan znak zauzima 1 bajt za char i 2 bajta za nchar). U mojoj praksi se ova vrsta vrlo rijetko koristi, a ako se koristi, onda se koristi uglavnom u formatu char (1), t.j. kada je polje definirano jednim znakom.
Cijeli broj int Ovaj tip nam omogućuje korištenje samo cijelih brojeva, pozitivnih i negativnih, u stupcu. Za referencu (ovo za nas sada nije toliko relevantno) - raspon brojeva koji tip int dopušta od -2 147 483 648 do 2 147 483 647. Ovo je obično glavni tip koji se koristi za postavljanje identifikatora.
Realni ili realni broj plutati Jednostavno rečeno, to su brojevi u kojima može biti decimalna točka (zarez).
Datum datum Ako stupac treba pohraniti samo datum, koji se sastoji od tri komponente: Broj, Mjesec i Godina. Na primjer, 15.02.2014. (15. veljače 2014.). Ova vrsta se može koristiti za stupac "Datum prijema", "Datum rođenja" itd., t.j. u slučajevima kada nam je važno popraviti samo datum, ili kada nam vremenska komponenta nije važna i može se odbaciti ili ako nije poznata.
Vrijeme vrijeme Ovaj tip se može koristiti ako stupac treba pohraniti samo podatke o vremenu, t.j. Sati, minute, sekunde i milisekunde. Na primjer, 17:38:31.3231603
Na primjer, dnevni "Flight Departure Time".
Datum i vrijeme Datum vrijeme Ova vrsta omogućuje pohranjivanje i datuma i vremena u isto vrijeme. Na primjer, 15.02.2014. 17:38:31.323
Na primjer, to može biti datum i vrijeme događaja.
Zastava malo Ovaj tip je koristan za pohranjivanje vrijednosti Da/Ne, gdje će Da biti pohranjeno kao 1, a Ne kao 0.

Također, vrijednost polja, u slučaju da nije zabranjeno, ne smije biti navedena, u tu svrhu se koristi ključna riječ NULL.

Da bismo pokrenuli primjere, napravimo testnu bazu podataka pod nazivom Test.

Jednostavna baza podataka (bez navođenja dodatnih parametara) može se stvoriti pokretanjem sljedeće naredbe:

STVORI BAZU PODATAKA Test
Možete izbrisati bazu podataka naredbom (trebate biti vrlo oprezni s ovom naredbom):

Test DROP DATABASE
Da biste se prebacili na našu bazu podataka, možete pokrenuti naredbu:

američki test
Alternativno, odaberite Test bazu podataka s padajućeg popisa u području izbornika SSMS. Na poslu često koristim ovu metodu prebacivanja između baza podataka.

Sada u našoj bazi podataka možemo kreirati tablicu koristeći opise onakvima kakvi jesu, koristeći razmake i ćirilične znakove:

CREATE TABLE [Zaposlenici]([Broj osoblja] int, [Ime] nvarchar(30), [Datum rođenja] datum, nvarchar(30), [Pozicija] nvarchar(30), [Odjel] nvarchar(30))
U ovom slučaju, nazive ćemo morati staviti u uglaste zagrade […].

Ali u bazi podataka, radi veće praktičnosti, bolje je navesti sve nazive objekata na latinskom i ne koristiti razmake u imenima. U MS SQL-u, obično u ovom slučaju, svaka riječ počinje velikim slovom, na primjer, za polje "Personnel number" mogli bismo postaviti naziv PersonnelNumber. U nazivu možete koristiti i brojeve, na primjer Broj telefona1.

Na napomenu
U nekim DBMS-ima, sljedeći format imena "PHONE_NUMBER" može biti poželjniji, na primjer, ovaj format se često koristi u bazi podataka ORACLE. Naravno, pri postavljanju naziva polja poželjno je da ono ne odgovara ključnim riječima koje se koriste u DBMS-u.

Iz tog razloga možete zaboraviti na sintaksu uglatih zagrada i izbrisati tablicu [Zaposlenici]:

STOL ISPUŠTANJA [Zaposlenici]
Na primjer, tablica sa zaposlenicima može se zvati "Zaposlenici", a njezina polja mogu dobiti sljedeća imena:

  • ID - broj osoblja (ID zaposlenika)
  • Ime - puno ime
  • Rođendan - Datum rođenja
  • E-mail
  • Položaj
  • Odjel – Odjel
Vrlo često se riječ ID koristi za imenovanje polja identifikatora.

Sada napravimo našu tablicu:

CREATE TABLE Zaposlenici(ID int, Ime nvarchar(30), Datum rođenja, E-pošta nvarchar(30), Pozicija nvarchar(30), Odjel nvarchar(30))
Možete koristiti opciju NOT NULL za određivanje potrebnih stupaca.

Za već postojeću tablicu, polja se mogu redefinirati pomoću sljedećih naredbi:

Ažuriraj ID polje ALTER TABLE Zaposlenici ALTER COLUMN ID int NOT NULL -- ažuriraj polje imena ALTER TABLE Zaposlenici ALTER COLUMN Naziv nvarchar(30) NOT NULL

Na napomenu
Opći koncept SQL jezika za većinu DBMS-a ostaje isti (barem to mogu suditi iz DBMS-a s kojim sam imao priliku raditi). Razlika između DDL-a u različitim DBMS-ovima uglavnom je u tipovima podataka (ovdje se mogu razlikovati ne samo njihovi nazivi, već i detalji njihove implementacije), same specifičnosti implementacije SQL jezika također se mogu neznatno razlikovati (tj. naredbe su iste, ali mogu postojati male razlike u dijalektu, nažalost, ali ne postoji jedan standard). Poznavajući osnove SQL-a, lako se možete prebaciti s jednog DBMS-a na drugi. u ovom slučaju trebat ćete razumjeti samo detalje implementacije naredbi u novom DBMS-u, t.j. u većini slučajeva bit će dovoljno samo povući analogiju.

Kreiranje tablice CREATE TABLE Employees(ID int, -- u ORACLE tipu int je ekvivalent (omot) za broj(38) Naziv nvarchar2(30), -- nvarchar2 u ORACLE je ekvivalentan nvarchar u MS SQL Datum rođenja, E-pošta nvarchar2( 30) , Položaj nvarchar2(30), Odjel nvarchar2(30)); -- ažuriranje polja ID i naziv (ovdje se koristi MODIFY(…) umjesto ALTER COLUMN ALTER TABLE Zaposlenici MODIFY(ID int NOT NULL,Naziv nvarchar2(30) NOT NULL); -- dodavanje PK-a (u ovom slučaju konstrukcija izgleda kao u MS SQL-u, bit će prikazano u nastavku) ALTER TABLE Employees ADD CONSTRAINT PK_Employees PRIMARY KEY(ID);
Za ORACLE postoje razlike u smislu implementacije tipa varchar2, njegovo kodiranje ovisi o postavkama baze podataka i tekst se može spremiti, na primjer, u UTF-8 kodiranju. Osim toga, duljina polja u ORACLE-u može se postaviti i u bajtovima i u znakovima, za to se koriste dodatne opcije BYTE i CHAR, koje su navedene nakon duljine polja, na primjer:

NAZIV varchar2(30 BYTE) -- kapacitet polja bit će 30 bajtova NAZIV varchar2 (30 CHAR) -- kapacitet polja bit će 30 znakova
Koja opcija će se koristiti prema zadanim postavkama BYTE ili CHAR, u slučaju jednostavne specifikacije tipa varchar2(30) u ORACLE-u, ovisi o postavkama baze podataka, također se ponekad može postaviti u IDE postavkama. Općenito, ponekad se lako možete zbuniti, pa u slučaju ORACLE, ako se koristi tip varchar2 (a to je ovdje ponekad opravdano, na primjer, kada se koristi UTF-8 kodiranje), radije izričito napišem CHAR (jer obično je prikladnije čitati duljinu niza u znakovima).

Ali u ovom slučaju, ako već postoje neki podaci u tablici, tada je za uspješno izvršenje naredbi potrebno popuniti polja ID i Naziv u svim recima tablice. Pokažimo to na primjeru, umetnite podatke u tablicu u polja ID, Položaj i Odjel, to se može učiniti sljedećom skriptom:

UMETNI VRIJEDNOSTI zaposlenika (ID, pozicija, odjel) (1000,N"Direktor",N"Administracija"), (1001,N"Programer",N"IT"), (1002,N"Računovođa",N"Računovodstvo" ), (1003,N"Viši programer",N"IT")
U ovom slučaju, naredba INSERT također će izbaciti pogrešku, jer prilikom umetanja nismo naveli vrijednost traženog polja Ime.
Da smo ove podatke već imali u izvornoj tablici, tada bi naredba "ALTER TABLE Employees ALTER COLUMN ID int NOT NULL" bila uspješno izvršena, a naredba "ALTER TABLE Employees ALTER COLUMN Name int NOT NULL" bi izdala pogrešku poruku, da postoje NULL (nije specificirane) vrijednosti u polju Ime.

Dodajmo vrijednosti za polje Ime i ponovo popunimo podatke:


Također, opcija NOT NULL može se koristiti izravno prilikom kreiranja nove tablice, t.j. u kontekstu naredbe CREATE TABLE.

Prvo izbrišite tablicu naredbom:

DROP STOL Zaposlenici
Sada napravimo tablicu s obveznim stupcima ID i Name:

CREATE TABLE Zaposlenici(ID int NOT NULL, Ime nvarchar(30) NOT NULL, Datum rođenja, Email nvarchar(30), Pozicija nvarchar(30), Odjel nvarchar(30))
Također možete napisati NULL iza naziva stupca, što će značiti da će NULL vrijednosti (nije navedene) biti dopuštene u njemu, ali to nije potrebno, jer se ova karakteristika podrazumijeva prema zadanim postavkama.

Ako, naprotiv, želite postojeći stupac učiniti neobaveznim, upotrijebite sljedeću sintaksu naredbe:

ALTER TABLE Zaposlenici ALTER COLUMN Naziv nvarchar(30) NULL
Ili jednostavno:

ALTER TABLE Zaposlenici ALTER COLUMN Naziv nvarchar(30)
Ovom naredbom također možemo promijeniti vrstu polja u drugu kompatibilnu vrstu ili promijeniti njegovu duljinu. Na primjer, proširimo polje Ime na 50 znakova:

ALTER TABLE Zaposlenici ALTER COLUMN Naziv nvarchar(50)

glavni ključ

Prilikom izrade tablice poželjno je da ima jedinstveni stupac ili skup stupaca koji je jedinstven za svaki njezin red – zapis se može jedinstveno identificirati po toj jedinstvenoj vrijednosti. Ova vrijednost se naziva primarni ključ tablice. Za našu tablicu Employees, ova jedinstvena vrijednost može biti stupac ID (koji sadrži "Broj osoblja zaposlenika" - čak i ako je u našem slučaju ova vrijednost jedinstvena za svakog zaposlenika i ne može se ponoviti).

Možete stvoriti primarni ključ postojeće tablice pomoću naredbe:

ALTER TABLE Zaposlenici DODAJ OGRANIČENJE PK_Zaposlenici PRIMARNI KLJUČ (ID)
Gdje je "PK_Employees" naziv ograničenja odgovornog za primarni ključ. Obično se primarni ključ imenuje s prefiksom "PK_" nakon čega slijedi naziv tablice.

Ako se primarni ključ sastoji od nekoliko polja, ta polja moraju biti navedena u zagradama odvojena zarezima:

ALTER TABLE naziv_tablice DODAJ OGRANIČENJE naziv_ograničenja PRIMARNI KLJUČ(polje1,polje2,…)
Vrijedi napomenuti da u MS SQL-u sva polja koja su uključena u primarni ključ moraju imati karakteristiku NOT NULL.

Također, primarni ključ se može definirati izravno prilikom izrade tablice, t.j. u kontekstu naredbe CREATE TABLE. Izbrišemo tablicu:

DROP STOL Zaposlenici
A zatim ga kreirajte koristeći sljedeću sintaksu:

CREATE TABLE Zaposlenici(ID int NOT NULL, Ime nvarchar(30) NOT NULL, Datum rođenja, Email nvarchar(30), Položaj nvarchar(30), Odjel nvarchar(30), OGRANIČENJA PK_Employees PRIMARNI KLJUČ(ID) -- opišite PK nakon sva polja kao ograničenje)
Nakon izrade popunite podatke tablice:

INSERT Employees(ID,Position,Odjel,Naziv) VRIJEDNOSTI (1000,N"Direktor",N"Uprava",N"Ivanov II.), (1001,N"Programer",N"IT",N" Petrov P.P." ), (1002,N"Računovođa",N"Računovodstvo",N"Sidorov S.S."), (1003,N"Viši programer",N"IT",N"Andrejev A. ALI.")
Ako se primarni ključ u tablici sastoji od samo vrijednosti jednog stupca, tada se može koristiti sljedeća sintaksa:

CREATE TABLE Employees(ID int NOT NULL OGRANIČENJE PK_Employees PRIMARY KEY, -- specificirajte Ime nvarchar(30) NOT NULL, Datum rođenja, Email nvarchar(30), Pozicija nvarchar(30), Odjel nvarchar(30))
Zapravo, naziv ograničenja može se izostaviti, u kojem slučaju će mu se dati naziv sustava (kao što je "PK__Employee__3214EC278DA42077"):

CREATE TABLE Zaposlenici(ID int NOT NULL, Ime nvarchar(30) NOT NULL, Datum rođenja, E-pošta nvarchar(30), Pozicija nvarchar(30), Odjel nvarchar(30), PRIMARNI KLJUČ(ID))
Ili:

CREATE TABLE Zaposlenici(ID int NOT NULL PRIMARNI KLJUČ, Ime nvarchar(30) NOT NULL, Datum rođenja, E-pošta nvarchar(30), Pozicija nvarchar(30), Odjel nvarchar(30))
Ali ja bih preporučio da uvijek eksplicitno postavite naziv ograničenja za trajne tablice, jer eksplicitno datim i razumljivim imenom, kasnije će biti lakše njime manipulirati, na primjer, možete ga izbrisati:

ALTER TABLE Employees DROP CONSTRAINT PK_Employees
Ali takva kratka sintaksa, bez navođenja imena ograničenja, prikladna je za korištenje pri kreiranju privremenih tablica baze podataka (ime privremene tablice počinje s # ili ##), koje će se nakon upotrebe izbrisati.

Hajde da rezimiramo

Do sada smo pokrili sljedeće naredbe:
  • STVORI TABLU table_name (nabrajanje polja i njihovih vrsta, ograničenja) - koristi se za stvaranje nove tablice u trenutnoj bazi podataka;
  • ISPUSTI STOL table_name - koristi se za brisanje tablice iz trenutne baze podataka;
  • ALTER TABLE naziv_tablice ALTER KOLONA column_name … – koristi se za ažuriranje vrste stupca ili za promjenu njegovih postavki (na primjer, za postavljanje karakteristike NULL ili NOT NULL);
  • ALTER TABLE naziv_tablice DODAJ OGRANIČENJE naziv_ograničenja GLAVNI KLJUČ(polje1, polje2,…) – dodavanje primarnog ključa postojećoj tablici;
  • ALTER TABLE naziv_tablice ISPUSTI OGRANIČENJE constraint_name - ukloniti ograničenje iz tablice.

Malo o privremenim stolovima

Isječak iz MSDN-a. Postoje dvije vrste privremenih tablica u MS SQL Serveru: lokalne (#) i globalne (##). Lokalne privremene tablice vidljive su samo njihovim kreatorima dok se sesija povezivanja s instancom SQL Servera ne prekine nakon što se prvi put kreiraju. Lokalne privremene tablice automatski se ispuštaju nakon što se korisnik isključi s instance SQL Servera. Globalne privremene tablice vidljive su svim korisnicima tijekom bilo koje sesije povezivanja nakon što se te tablice kreiraju, a brišu se kada se svi korisnici koji se pozivaju na te tablice odvoje od instance SQL Servera.

Privremene tablice se kreiraju u bazi podataka sustava tempdb, t.j. stvarajući ih, ne začepljujemo glavnu bazu podataka, inače su privremene tablice potpuno identične uobičajenim tablicama, također se mogu izbrisati pomoću naredbe DROP TABLE. Lokalne (#) privremene tablice se češće koriste.

Za izradu privremene tablice možete koristiti naredbu CREATE TABLE:

CREATE TABLE #Temp(ID int, Naziv nvarchar(30))
Budući da je privremena tablica u MS SQL-u slična običnoj tablici, možete je također izbrisati naredbom DROP TABLE:

DOP TABLE #Temp

Također možete stvoriti privremenu tablicu (kao i običnu tablicu) i odmah je ispuniti podacima koje je vratio upit pomoću sintakse SELECT ... INTO:

SELECT ID,Name INTO #Temp FROM Employees

Na napomenu
U različitim DBMS-ima implementacija privremenih tablica može se razlikovati. Na primjer, u ORACLE i Firebird DBMS, struktura privremenih tablica mora se unaprijed definirati naredbom CREATE GLOBAL TEMPORARY TABLE, naznačujući specifičnosti pohranjivanja podataka u njoj, zatim ih korisnik vidi među glavnim tablicama i radi s njima kao kod običnog stola.

Normalizacija baze podataka - dijeljenje u podtablice (direktorije) i određivanje odnosa

Naša trenutna tablica Zaposlenici ima nedostatak što korisnik može unijeti bilo koji tekst u polja Položaj i Odjel, što je prvenstveno prepuno grešaka, jer za jednog zaposlenika jednostavno može naznačiti “IT” kao odjel, a za drugog zaposlenika, za na primjer , unesite "IT odjel", postavite treći "IT". Kao rezultat toga, neće biti jasno na što je korisnik mislio, t.j. Jesu li ti djelatnici zaposlenici istog odjela ili je korisnik sam sebe opisao i to su 3 različita odjela? Štoviše, u ovom slučaju nećemo moći ispravno grupirati podatke za neko izvješće, gdje će možda biti potrebno prikazati broj zaposlenika u kontekstu svakog odjela.

Drugi nedostatak je količina pohrane ovih informacija i njihovo dupliciranje, t.j. za svakog zaposlenika je naznačeno puno ime odjela, što zahtijeva mjesto u bazi podataka za pohranjivanje svakog znaka iz naziva odjela.

Treći nedostatak je teškoća ažuriranja ovih polja ako se naziv pozicije promijeni, na primjer, ako trebate preimenovati poziciju “Programer” u “Junior programer”. U ovom slučaju, morat ćemo napraviti promjene u svakom retku tablice, u kojoj je pozicija jednaka "Programer".

Kako bi se izbjegli ovi nedostaci, koristi se tzv. normalizacija baze podataka – cijepanje u podtablice, referentne tablice. Nije potrebno penjati se u džunglu teorije i proučavati što su normalni oblici, dovoljno je razumjeti bit normalizacije.

Napravimo 2 referentne tablice "Pozicije" i "Odjeli", prva će se zvati Pozicije, a druga, Odsjeci:

CREATE TABLE Positions(ID int IDENTITY(1,1) NOT NULL OGRANIČENJE PK_Positions PRIMARY KEY, Name nvarchar(30) NOT NULL) CREATE TABLE Departments(ID int IDENTITY(1,1) NOT NULL OGRANIČENJE PK_Departments Name PRIMARY KcharEY(Naziv PRIMARY KcharEY3) ) NIJE NULL)
Imajte na umu da smo ovdje koristili novu opciju IDENTITY, što znači da će podaci u stupcu ID biti automatski numerirani, počevši od 1, s korakom od 1, t.j. kada se dodaju novi zapisi, bit će im uzastopno dodijeljene vrijednosti 1, 2, 3 i tako dalje. Takva se polja obično nazivaju automatskim povećanjem. Samo jedno polje sa svojstvom IDENTITY može se definirati u tablici, a obično, ali ne nužno, takvo polje je primarni ključ za tu tablicu.

Na napomenu
U različitim DBMS-ima implementacija polja s brojačem može se izvesti različito. U MySQL-u, na primjer, takvo se polje definira pomoću opcije AUTO_INCREMENT. U ORACLE-u i Firebirdu, ova se funkcionalnost prethodno mogla emulirati pomoću SEQUENCE-ova. Ali koliko ja znam, ORACLE je sada dodao opciju GENERIRANO KAO IDENTITET.

Popunimo ove tablice automatski, na temelju trenutnih podataka zabilježenih u poljima Položaj i Odjel u tablici Zaposlenici:

Ispunite polje Naziv tablice Positions jedinstvenim vrijednostima iz polja Position u tablici Employees INSERT Positions(Name) SELECT DISTINCT Position FROM Employees GDJE Pozicija NIJE NULL -- odbacite zapise bez specificirane pozicije
Isto ćemo učiniti i za tablicu odjela:

INSERT Departments(Name) SELECT DISTINCT Department from Employees GDJE Odjel NIJE NULL
Ako sada otvorimo tablice Positions i Departments, vidjet ćemo numerirani skup vrijednosti ​​po ID polju:

ODABIR * IZ pozicija

ODABIR * IZ Odjela

Ove će tablice sada igrati ulogu imenika za postavljanje pozicija i odjela. Sada ćemo se osvrnuti na ID-ove poslova i odjela. Prije svega, napravimo nova polja u tablici Zaposlenici za pohranu ID podataka:

Dodaj polje za ID pozicije ALTER TABLE Zaposlenici DODAJ PositionID int -- dodaj polje za ID odjela ALTER TABLE Zaposlenici DODAJ DepartmentID int
Vrsta referentnih polja mora biti ista kao u imenicima, u ovom slučaju je int.

Također možete dodati nekoliko polja u tablicu odjednom jednom naredbom, navodeći polja odvojena zarezima:

ALTER TABLE Zaposlenici DODAJ PositionID int, DepartmentID int
Sada napišimo veze (referentna ograničenja - STRANI KLJUČ) za ova polja, tako da korisnik nema priliku upisivati ​​u ova polja, vrijednosti koje nisu među vrijednostima ID-a u imenicima.

ALTER TABLE Zaposlenici DODAJ OGRANIČENJE FK_Employees_PositionID STRANI KLJUČ (ID pozicije) REFERENCE Pozicije (ID)
I mi ćemo učiniti isto za drugo polje:

ALTER TABLE Zaposlenici DODAJ OGRANIČENJE FK_Employees_DepartmentID STRANI KLJUČ(ID odjela) REFERENCE Odjeli(ID)
Sada će korisnik u ova polja moći unijeti samo vrijednosti ID-a iz odgovarajuće referentne knjige. Sukladno tome, da bi mogao koristiti novi odjel ili radno mjesto, prvo će morati dodati novi unos u odgovarajući imenik. Jer pozicije i odjeli se sada pohranjuju u imenike u jednom primjerku, tada je za promjenu naziva dovoljno promijeniti samo u imeniku.

Naziv referentnog ograničenja obično je složen, sastoji se od prefiksa "FK_", nakon čega slijedi naziv tablice, a nakon donje crte dolazi naziv polja koje se odnosi na identifikator tablice pretraživanja.

Identifikator (ID) je obično interna vrijednost koja se koristi samo za veze i koja je vrijednost tamo pohranjena, u većini slučajeva je apsolutno svejedno, pa nema potrebe pokušavati se riješiti rupa u nizu brojeva koji nastaju tijekom rada s tablicom, na primjer, nakon brisanja zapisa iz priručnika.

ALTER TABLE tablica DODAJ OGRANIČENJE ime_ograničenja STRANI KLJUČ(polje1,polje2,…) REFERENCE tablica pretraživanja(polje1,polje2,…)
U ovom slučaju, u tablici "table_reference" primarni ključ je predstavljen kombinacijom nekoliko polja (field1, field2, ...).

Zapravo, sada ažurirajmo polja PositionID i DepartmentID s ID vrijednostima iz direktorija. U tu svrhu upotrijebimo naredbu UPDATE DML:

UPDATE e SET PositionID=(SELECT ID FROM Positions WHERE Name=e.Position), DepartmentID=(ODABIR ID FROM Departments WHERE Name=e.Department) FROM Employees e
Pogledajmo što se događa pokretanjem upita:

ODABERITE * IZ Zaposlenika

To je to, polja PositionID i DepartmentID popunjavaju se odgovarajućim pozicijama i odjelima s ID-ovima potreba u poljima Position i Department u tablici Zaposlenici sada možete izbrisati ova polja:

ALTER TABLE Zaposlenici DROP COLUMN Pozicija, odjel
Tablica sada izgleda ovako:

ODABERITE * IZ Zaposlenika

iskaznica Ime rođendan E-mail PositionID ID odjela
1000 Ivanov I.I. NULL NULL 2 1
1001 Petrov P.P. NULL NULL 3 3
1002 Sidorov S.S. NULL NULL 1 2
1003 Andreev A.A. NULL NULL 4 3

Oni. na kraju smo se riješili pohranjivanja suvišnih informacija. Sada, prema brojevima pozicija i odjela, možemo jedinstveno odrediti njihova imena koristeći vrijednosti u tablicama pretraživanja:

SELECT e.ID,e.Name,p.Name PositionName,d.Name DepartmentName FROM Employees e LEFT JOIN Departments d ON d.ID=e.DepartmentID LEFT JOIN Positions p ON p.ID=e.PositionID

U Inspektoru objekata možemo vidjeti sve objekte kreirane za danu tablicu. Odavde također možete izvoditi razne manipulacije s tim objektima - na primjer, preimenovati ili izbrisati objekte.

Također je vrijedno napomenuti da se tablica može odnositi na sebe, t.j. možete stvoriti rekurzivnu vezu. Na primjer, dodajmo još jedno polje ManagerID u našu tablicu sa zaposlenicima, koje će označavati zaposlenika kojem je taj zaposlenik podređen. Kreirajmo polje:

ALTER TABLE Zaposlenici DODAJ ID upravitelja int
U ovom polju je dopuštena vrijednost NULL, polje će biti prazno ako, na primjer, nema nadređenih nad zaposlenikom.

Sada napravimo STRANI KLJUČ na tablici Zaposlenici:

ALTER TABLE Zaposlenici DODAJ OGRANIČENJE FK_Employees_ManagerID STRANI KLJUČ (ID upravitelja) REFERENCE Zaposlenici (ID)
Kreirajmo sada dijagram i vidimo kako na njemu izgledaju odnosi između naših tablica:

Kao rezultat, trebali bismo vidjeti sljedeću sliku (tablica Zaposlenici povezana je s tablicama Positions i Depertments, a odnosi se i na sebe):

Na kraju, vrijedno je spomenuti da referentni ključevi mogu uključivati ​​dodatne opcije ON DELETE CASCADE i ON UPDATE CASCADE, koje govore kako se ponašati kada brišete ili ažurirate zapis naveden u tablici pretraživanja. Ako ove opcije nisu navedene, tada ne možemo promijeniti ID u tablici imenika unosa koji ima veze iz druge tablice, niti možemo izbrisati takav unos iz imenika dok ne izbrišemo sve retke koji se odnose na ovaj unos ili, recimo ažurirati ove linije referenci na drugu vrijednost.

Na primjer, napravimo tablicu s opcijom ON DELETE CASCADE za FK_Employees_DepartmentID:

DROP TABLE Zaposlenici CREATE TABLE Zaposlenici(ID int NOT NULL, Ime nvarchar(30), Datum rođendana, E-pošta nvarchar(30), PositionID int, DepartmentID int, ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (30), CONSTRAID KEYFORD_Depart_departement ) REFERENCE Odjeli(ID) ON DELETE CASCADE, CONSTRAINT FK_Employees_PositionID STRANI KLJUČ(PositionID) REFERENCE Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES_POSITIONID,EmployeesId,EmployeIDes,EmployeIDes,EmployeIDes,EmployeDepartment )VRIJEDNOSTI (1000,N"Ivanov I.I.","19550219",2,1,NULL), (1001,N"Petrov P.P.","19831203",3,3,1003), (1002 ,N"Sidorov S.S." ,"19760607",1,2,1000), (1003,N"Andreev A.A.","19820417",4,3,1000)
Uklonimo odjel s ID 3 iz tablice odjela:

IZBRIŠI Odjele GDJE ID=3
Pogledajmo podatke u tablici Zaposlenici:

ODABERITE * IZ Zaposlenika

iskaznica Ime rođendan E-mail PositionID ID odjela ID upravitelja
1000 Ivanov I.I. 1955-02-19 NULL 2 1 NULL
1002 Sidorov S.S. 1976-06-07 NULL 1 2 1000

Kao što vidite, podaci za odjel 3 također su izbrisani iz tablice Zaposlenici.

Opcija ON UPDATE CASCADE ponaša se slično, ali stupa na snagu prilikom ažuriranja vrijednosti ID-a u direktoriju. Na primjer, ako promijenimo ID pozicije u imeniku pozicija, tada će u ovom slučaju ID odjela u tablici Zaposlenici biti ažuriran na novu vrijednost ID-a koju smo postavili u imeniku. Ali u ovom slučaju to jednostavno neće biti moguće demonstrirati, jer. stupac ID u tablici odjela ima opciju IDENTITY, što će nas spriječiti da izvršimo sljedeći upit (promijenite ID odjela 3 u 30):

UPDATE odjeli SET ID=30 GDJE ID=3
Glavna stvar je razumjeti bit ove 2 opcije ON DELETE CASCADE i ON UPDATE CASCADE. Koristim ove opcije u vrlo rijetkim prilikama i preporučujem da dobro razmislite prije nego što ih navedete u referentnom ograničenju. ako slučajno izbrišete zapis iz referentne tablice, to može dovesti do velikih problema i izazvati lančanu reakciju.

Vratimo odjel 3:

Dajte dopuštenje za dodavanje/promjenu vrijednosti IDENTITY POSTAVI IDENTITY_INSERT odjele ON INSERT Departments(ID,Name) VALUES(3,N"IT") -- zabrani dodavanje/promjenu vrijednosti IDENTITY SET IDENTITY_INSERT Departments OFF
Potpuno obrišite tablicu Employees pomoću naredbe TRUNCATE TABLE:

TRUNCATE TABLICA Zaposlenici
I opet, ponovno učitajte podatke u njega pomoću prethodne naredbe INSERT:

INSERT Employees (ID, Name, Birthday, PositionID, DepartmentID, ManagerID)VRIJEDNOSTI (1000,N"Ivanov II","19550219",2,1,NULL), (1001,N"Petrov P.P." ,"19831203",3 ,3,1003), (1002,N"Sidorov S.S.","19760607",1,2,1000), (1003,N"Andreev A.A.","19820417" ,4,3,1000)

Hajde da rezimiramo

Trenutno nam je dodano još nekoliko DDL naredbi:
  • Dodavanje svojstva IDENTITY u polje - omogućuje vam da se ovo polje automatski popuni (polje brojača) za tablicu;
  • ALTER TABLE naziv_tablice DODATI list_of_fields_with_characteristics – omogućuje vam dodavanje novih polja u tablicu;
  • ALTER TABLE naziv_tablice STUPAC ISPUŠTANJA list_of_fields - omogućuje vam uklanjanje polja iz tablice;
  • ALTER TABLE naziv_tablice DODAJ OGRANIČENJE naziv_ograničenja STRANI KLJUC(polja) REFERENCE lookup_table(polja) – omogućuje vam definiranje odnosa između tablice i tablice pretraživanja.

Ostala ograničenja - UNIQUE, DEFAULT, CHECK

Uz ograničenje UNIQUE, možete reći da vrijednost za svaki redak u danom polju ili skupu polja mora biti jedinstvena. U slučaju tablice Zaposlenici, takvo ograničenje možemo nametnuti polju Email. Samo unaprijed popunite e-poštu vrijednostima ako već nisu definirane:

UPDATE Employees SET Email=" [e-mail zaštićen]"GDJE ID=1000 UPDATE Employees SET Email=" [e-mail zaštićen]" WHERE ID=1001 UPDATE Employees SET Email=" [e-mail zaštićen]"GDJE ID=1002 UPDATE Employees SET Email=" [e-mail zaštićen]" GDJE ID=1003
A sada možete nametnuti jedinstveno ograničenje ovom polju:

ALTER TABLE Zaposlenici DODAJ OGRANIČENJE UQ_Employees_Email UNIQUE(E-pošta)
Sada korisnik neće moći unijeti isti e-mail za nekoliko zaposlenika.

Ograničenje jedinstvenosti obično se naziva na sljedeći način - prvo dolazi prefiks "UQ_", zatim naziv tablice, a nakon podvlake je naziv polja na koje je ovo ograničenje nametnuto.

Sukladno tome, ako kombinacija polja treba biti jedinstvena u kontekstu redaka tablice, navodimo ih odvojene zarezima:

ALTER TABLE naziv_tablice DODAJ OGRANIČENJE naziv_ograničenja UNIQUE(polje1,polje2,…)
Dodavanjem DEFAULT ograničenja u polje, možemo postaviti zadanu vrijednost koja će biti zamijenjena ako polje nije navedeno u popisu polja naredbe INSERT kada se umetne novi zapis. Ovo ograničenje može se postaviti izravno prilikom izrade tablice.

Dodajmo novo polje "Datum zapošljavanja" u tablicu Zaposlenici i nazovimo ga Datum zapošljavanja i kažemo da će zadana vrijednost za ovo polje biti trenutni datum:

ALTER TABLE Zaposlenici DODAJ Datum zapošljavanja NOT NULL DEFAULT SYSDATETIME()
Ili ako stupac HireDate već postoji, tada se može koristiti sljedeća sintaksa:

ALTER TABLE Zaposlenici DODAJTE ZADANO SYSDATETIME() ZA Datum najma
Ovdje nisam naveo naziv ograničenja, jer u slučaju DEFAULT-a bio sam mišljenja da to i nije toliko kritično. Ali ako to radite na dobar način, onda, mislim, ne trebate biti lijeni i trebali biste postaviti normalno ime. To se radi na sljedeći način:

ALTER TABLE Zaposlenici DODAJ OGRANIČENJE DF_Employees_HireDate ZADANO SYSDATETIME() ZA Datum zapošljavanja
Budući da ovaj stupac prije nije postojao, kada se doda svakom zapisu, trenutna vrijednost datuma bit će umetnuta u polje HireDate.

Prilikom dodavanja novog unosa automatski će se umetnuti i trenutni datum, naravno, ako ga izričito ne zadamo, t.j. nije navedeno u popisu stupaca. Pokažimo to na primjeru bez navođenja polja HireDate na popisu dodanih vrijednosti:

INSERT Employees(ID,Name,Email)VALUES(1004,N"Sergeev S.S."," [e-mail zaštićen]")
Pogledajmo što se dogodilo:

ODABERITE * IZ Zaposlenika

iskaznica Ime rođendan E-mail PositionID ID odjela ID upravitelja Datum zaposlenja
1000 Ivanov I.I. 1955-02-19 [e-mail zaštićen] 2 1 NULL 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-mail zaštićen] 3 4 1003 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-mail zaštićen] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [e-mail zaštićen] 4 3 1000 2015-04-08
1004 Sergejev S.S. NULL [e-mail zaštićen] NULL NULL NULL 2015-04-08

Ograničenje provjere CHECK koristi se kada je potrebno provjeriti vrijednosti umetnute u polje. Na primjer, nametnimo ovo ograničenje polju broja osoblja, koje je naš identifikator (ID) zaposlenika. Koristeći ovo ograničenje, recimo da broj osoblja mora imati vrijednost od 1000 do 1999:

ALTER TABLE Zaposlenici DODAJ OGRANIČENJE CK_Employees_ID PROVJERA (ID IZMEĐU 1000 I 1999)
Ograničenje se obično naziva isto, prvo s prefiksom "CK_", zatim imenom tablice i imenom polja na koje se ograničenje primjenjuje.

Pokušajmo umetnuti nevažeći unos kako bismo provjerili funkcionira li ograničenje (trebali bismo dobiti odgovarajuću pogrešku):

INSERT Employees(ID,E-mail) VALUES(2000," [e-mail zaštićen]")
Sada promijenimo vrijednost koju treba umetnuti na 1500 i provjeriti je li zapis umetnut:

INSERT Employees(ID,E-mail) VALUES(1500," [e-mail zaštićen]")
Također možete stvoriti UNIQUE i CHECK ograničenja bez navođenja imena:

ALTER TABLE Zaposlenici DODAJTE UNIQUE(E-pošta) ALTER TABLE Zaposlenici DODAJTE PROVJERU (ID IZMEĐU 1000 I 1999)
Ali to nije dobra praksa i bolje je eksplicitno navesti naziv ograničenja, jer da kasnije shvatite što će biti teže, morat ćete otvoriti objekt i vidjeti za što je odgovoran.

Uz dobro ime, puno informacija o ograničenju može se naučiti izravno iz njegovog naziva.

I, sukladno tome, sva se ta ograničenja mogu kreirati odmah prilikom izrade tablice, ako već ne postoji. Izbrišemo tablicu:

DROP STOL Zaposlenici
I ponovno ga kreirajte sa svim stvorenim ograničenjima jednom naredbom CREATE TABLE:

CREATE TABLE Employees(ID int NOT NULL, Ime nvarchar(30), Datum rođenja, E-pošta nvarchar(30), PositionID int, DepartmentID int, Datum zapošljavanja NOT NULL DEFAULT SYSDATETIME(), -- za DEFAULT ću baciti CONSTRAYes PK_EMARYplo KEY iznimka (ID), CONSTRAINT FK_Employees_DepartmentID STRANI KLJUČ(ID odjela) REFERENCE Odjeli(ID), CONSTRAINT FK_Employees_PositionID STRANI KLJUČ(PositionID) REFERENCES Positions(ID), CONSTRAINT UQEployees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT UQEployees_DepartmentID (ID Odjela) REFERENCES Odjeli(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT UQEployees_DepartmentID (ID) CONSTRAINT UQEploINTES UNIQUEES_0 m.

INSERT Employees (ID, Name, Birthday, Email, PositionID, DepartmentID)VRIJEDNOSTI (1000,N"Ivanov I.I.","19550219"," [e-mail zaštićen]",2,1), (1001,N"Petrov P.P.","19831203"," [e-mail zaštićen]",3,3), (1002,N"Sidorov S.S.","19760607"," [e-mail zaštićen]",1,2), (1003,N"Andrejev A.A.","19820417"," [e-mail zaštićen]",4,3)

Malo o indeksima stvorenim pri izradi PRIMARY KEY i UNIQUE ograničenja

Kao što možete vidjeti na gornjoj snimci zaslona, ​​prilikom izrade ograničenja PRIMARY KEY i UNIQUE automatski su stvoreni indeksi s istim nazivima (PK_Employees i UQ_Employees_Email). Prema zadanim postavkama, indeks za primarni ključ je kreiran kao CLUSTERED, a za sve ostale indekse kao NENCLUSTERED. Vrijedi reći da koncept klasteriranog indeksa nije dostupan u svim DBMS-ima. Tablica može imati samo jedan CLUSTERED indeks. CLUSTERED - znači da će zapisi tablice biti razvrstani po ovom indeksu, također se može reći da ovaj indeks ima izravan pristup svim podacima tablice. To je tako reći glavni indeks tablice. Da se još grublje izrazimo, to je indeks privijen na stol. Grupirani indeks je vrlo moćan alat koji može pomoći u optimizaciji upita, samo imajte to na umu. Ako želimo reći da se klasterirani indeks ne koristi u primarnom ključu, već za drugi indeks, tada pri izradi primarnog ključa moramo navesti opciju NONCLUSTERED:

ALTER TABLE naziv_tablice DODAJ OGRANIČENJE naziv_ograničenja PRIMARNI KLJUČ NONCLUSTERED(polje1,polje2,…)
Na primjer, učinimo da indeks ograničenja PK_Employees nije grupiran, a indeks ograničenja UQ_Employees_Email klasteriran. Prije svega, uklonimo ova ograničenja:

ALTER TABLE Zaposlenici DROP OGRANIČENJE PK_Employees ALTER TABLE Zaposlenici DROP OGRANIČENJE UQ_Employees_Email
A sada ih stvorimo s opcijama CLUSTERED i NONCLUSTERED:

ALTER TABLE Zaposlenici DODAJ OGRANIČENJE PK_Employees PRIMARNI KLJUČ NONCLUSTERED (ID) ALTER TABLE Zaposlenici DODAJ OGRANIČENJE UQ_Employees_Email UNIQUE CLUSTERED (E-pošta)
Sada, kada odaberemo iz tablice Employees, možemo vidjeti da su zapisi razvrstani prema grupiranom indeksu UQ_Employees_Email:

ODABERITE * IZ Zaposlenika

iskaznica Ime rođendan E-mail PositionID ID odjela Datum zaposlenja
1003 Andreev A.A. 1982-04-17 [e-mail zaštićen] 4 3 2015-04-08
1000 Ivanov I.I. 1955-02-19 [e-mail zaštićen] 2 1 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-mail zaštićen] 3 3 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-mail zaštićen] 1 2 2015-04-08

Prije toga, kada je klasterirani indeks bio indeks PK_Employees, zapisi su prema zadanim postavkama bili razvrstani prema ID polju.

Ali u ovom slučaju ovo je samo primjer koji pokazuje bit grupiranog indeksa, jer. najvjerojatnije će se upiti tablici Zaposlenici postavljati po ID polju, au nekim slučajevima ono može i samo djelovati kao referenca.

Za imenike je obično preporučljivo da se klasterirani indeks gradi na primarnom ključu, jer u zahtjevima se često pozivamo na identifikator imenika kako bismo dobili, na primjer, naziv (Pozicija, Odjel). Ovdje se prisjećamo onoga o čemu sam gore napisao, da klasterirani indeks ima izravan pristup recima tablice, a iz toga slijedi da možemo dobiti vrijednost bilo kojeg stupca bez dodatnih troškova.

Grupirani indeks je koristan za primjenu na polja koja se najčešće odabiru.

Ponekad tablice kreiraju ključ pomoću zamjenskog polja, u kojem slučaju je korisno zadržati opciju CLUSTERED indeksa za prikladniji indeks i navesti opciju NONCLUSTERED kada kreirate zamjenski primarni ključ.

Hajde da rezimiramo

U ovoj fazi smo se upoznali sa svim vrstama ograničenja, u njihovom najjednostavnijem obliku, koja se kreiraju naredbom poput "ALTER TABLE table_name ADD CONSTRAINT constraint_name ...":
  • GLAVNI KLJUČ- glavni ključ;
  • STRANI KLJUC- postavljanje poveznica i praćenje referentnog integriteta podataka;
  • JEDINSTVENO- omogućuje vam stvaranje jedinstvenosti;
  • ČEK- omogućuje provođenje ispravnosti unesenih podataka;
  • ZADANO– omogućuje postavljanje zadane vrijednosti;
  • Također je vrijedno napomenuti da se sva ograničenja mogu ukloniti pomoću naredbe " ALTER TABLE naziv_tablice ISPUSTI OGRANIČENJE naziv_ograničenja".
Djelomično smo se dotakli i teme indeksa te analizirali pojam klastera ( SKUPLJENI) i negrupa ( NEKLASTERIRANE) indeks.

Izrada samostalnih indeksa

Samodostatnost se ovdje odnosi na indekse koji nisu kreirani za PRIMARY KEY ili UNIQUE ograničenje.

Indeksi na polju ili poljima mogu se kreirati sljedećom naredbom:

CREATE INDEX IDX_Employees_Name ON Zaposlenici (ime)
Ovdje također možete odrediti CLUSTERED, NONCLUSTERED, UNIQUE opcije, a možete odrediti i smjer sortiranja za svako pojedinačno polje ASC (zadano) ili DESC:

STVORI JEDINSTVENI NEKLASTERIRAN INDEX UQ_Employees_EmailDesc NA Zaposlenicima (Email DESC)
Prilikom izrade indeksa koji nije grupiran, opcija NONCLUSTERED može se izostaviti, kao podrazumijeva se prema zadanim postavkama, ovdje je prikazan samo kako bi se označio položaj opcije CLUSTERED ili NONCLUSTERED u naredbi.

Indeks možete ukloniti sljedećom naredbom:

DROP INDEX IDX_Employees_Name ON Zaposlenici
Jednostavni indeksi, baš kao i ograničenja, mogu se kreirati u kontekstu naredbe CREATE TABLE.

Na primjer, izbrišite tablicu ponovo:

DROP STOL Zaposlenici
I ponovno ga kreirajte sa svim stvorenim ograničenjima i indeksima jednom naredbom CREATE TABLE:

CREATE TABLE Employees(ID int NOT NULL, Ime nvarchar(30), Datum rođenja, E-pošta nvarchar(30), PositionID int, DepartmentID int, Datum zapošljavanja NOT NULL OGRANIČENJE DF_Employees_HireDate DEFAULT SYSDATEtTIME(),Employees_HireDate DEFAULT SYSDATEtTIME(),m PRIM.Upravitelj ), CONSTRAINT FK_Employees_DepartmentID STRANI KLJUČ(ID odjela) REFERENCE Odjeli(ID), CONSTRAINT FK_Employees_PositionID STRANI KLJUČ(ID pozicije) REFERENCE Positions(ID) CHECK(ID IZMEĐU INDEXIME 10990)m_),
Na kraju u tablicu naših zaposlenika unesite:

INSERT Employees (ID, Name, Birthday, Email, PositionID, DepartmentID, ManagerID)VRIJEDNOSTI (1000,N"Ivanov II","19550219"," [e-mail zaštićen]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [e-mail zaštićen]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [e-mail zaštićen]",1,2,1000), (1003,N"Andrejev A.A.","19820417"," [e-mail zaštićen]",4,3,1000)
Osim toga, vrijedno je napomenuti da se vrijednosti mogu uključiti u neklasterirani indeks tako da ih navedete u INCLUDE. Oni. u ovom slučaju, indeks INCLUDE će donekle nalikovati klasteriranom indeksu, samo što sada indeks nije vezan uz tablicu, ali su potrebne vrijednosti priložene indeksu. Sukladno tome, takvi indeksi mogu uvelike poboljšati izvedbu upita za odabir (SELECT), ako su sva navedena polja u indeksu, onda je moguće da uopće neće biti potrebe za pristupom tablici. Ali to prirodno povećava veličinu indeksa, jer vrijednosti navedenih polja su duplicirane u indeksu.

Isječak iz MSDN-a. Opća sintaksa naredbi za stvaranje indeksa

STVORI [JEDINSTVENI] [SKUPLJENI | NONCLUSTERED ] INDEX index_name UKLJUČENO (stupac [ ASC | DESC ] [ ,...n ]) [ INCLUDE (naziv_stupca [ ,...n ]) ]

Hajde da rezimiramo

Indeksi mogu povećati brzinu dohvaćanja podataka (SELECT), ali indeksi smanjuju brzinu ažuriranja podataka tablice, jer nakon svake izmjene, sustav će morati ponovno izgraditi sve indekse za određenu tablicu.

Poželjno je u svakom slučaju pronaći optimalno rješenje, zlatnu sredinu, kako bi i izvedba uzorkovanja i modifikacija podataka bili na odgovarajućoj razini. Strategija za stvaranje indeksa i njihov broj mogu ovisiti o mnogim čimbenicima, kao što je koliko se često mijenjaju podaci u tablici.

Zaključak o DDL-u

Kao što vidite, DDL jezik nije tako kompliciran kao što se može činiti na prvi pogled. Ovdje sam uspio prikazati gotovo sve njegove glavne nacrte, koristeći samo tri tablice.

Glavna stvar je razumjeti suštinu, a ostalo je stvar prakse.

Sretno u svladavanju ovog prekrasnog jezika zvanog SQL.

sql se često naziva esperantskim jezikom za sustave upravljanja bazama podataka (DBMS). Doista, ne postoji drugi jezik na svijetu za rad s bazama podataka (DB) koji bi se tako široko koristio u programima. Prvi sol standard pojavio se 1986. godine i do sada je stekao univerzalno prihvaćanje. Može se koristiti čak i kada se radi s nerelacijskim DBMS-om. Za razliku od drugih softverskih alata, kao što su C i Cobol, koji su prerogativ profesionalnih programera, sql koriste stručnjaci iz raznih područja. Programeri, DBMS administratori, poslovni analitičari – svi oni uspješno obrađuju podatke koristeći sql. Poznavanje ovog jezika korisno je svima koji se moraju baviti bazom podataka.

U ovom članku ćemo pokriti osnovne koncepte sql-a. Ispričat ćemo njegovu pozadinu (i usput razbiti nekoliko mitova). Upoznat ćete se s relacijskim modelom i moći ćete steći prve vještine u radu sa sql-om, što će pomoći u daljnjem ovladavanju jezikom.

Je li teško naučiti sql? Ovisi o tome koliko ćete duboko ući u bit. Da biste postali profesionalac, morate puno naučiti. Jezik sql započeo je 1974. godine kao predmet malog istraživačkog rada od 23 stranice i od tada je prešao dug put. Tekst trenutnog standarda - službenog dokumenta "međunarodnog standardnog jezika baze podataka sql" (obično nazvan sql-92) - sadrži preko šest stotina stranica, ali ne govori ništa o specifičnostima sol verzija implementiranih u DBMS od microsofta, oraclea, sybasea itd. Jezik je toliko razvijen i raznolik da bi samo nabrajanje njegovih značajki zahtijevalo nekoliko članaka u časopisima, a ako prikupite sve što je napisano na temu sol, dobit ćete knjižnicu s više knjiga.

Međutim, za običnog korisnika uopće nije potrebno poznavati sql u cijelosti. Baš poput turista koji se nađe u zemlji u kojoj govore nerazumljivim jezikom, dovoljno je naučiti samo nekoliko uobičajenih izraza i gramatičkih pravila, pa u sql-u - znajući malo možete dobiti puno korisnih rezultata. U ovom članku ćemo pogledati osnovne sql naredbe, pravila za postavljanje kriterija za odabir podataka i pokazati kako doći do rezultata. Kao rezultat toga, moći ćete samostalno kreirati tablice i unositi informacije u njih, sastavljati upite i raditi s izvješćima. Ovo znanje može postati temelj za daljnji samostalni razvoj sql-a.

Što je sql?

sql je specijalizirani neproceduralni jezik koji vam omogućuje opisivanje podataka, odabir i obradu informacija iz relacijskog DBMS-a. Specijalizacija znači da je sol namijenjen samo za rad s bazom podataka; nemoguće je stvoriti punopravni aplikacijski sustav koristeći samo sredstva ovog jezika - za to ćete morati koristiti druge jezike u koje možete ugraditi sql naredbe. Stoga se sql naziva i pomoćnim jezičnim alatom za obradu podataka. Pomoćni jezik koristi se samo u kombinaciji s drugim jezicima.

U aplikacijskom jeziku opće namjene obično postoje sredstva za kreiranje procedura, ali u sql-u nisu. Ne može se koristiti za navođenje kako bi se određeni zadatak trebao izvesti, već samo za određivanje o čemu se točno radi. Drugim riječima, kada radimo sa sql-om, zanimaju nas rezultati, a ne procedure za njihovo dobivanje.

Najvažnije svojstvo sql-a je mogućnost pristupa relacijskim bazama podataka. Mnogi ljudi čak misle da su izrazi "sql-processed database" i "relational database" sinonimi. Međutim, uskoro ćete vidjeti da postoji razlika između njih. Standard sql-92 čak i nema termin relacija.

Što je relacijski DBMS?

Ne ulazeći u detalje, relacijski DBMS je sustav temeljen na modelu upravljanja relacijskim podacima.

Koncept relacijskog modela prvi je put predložen u radu dr. E. F. Codda, objavljenom 1970. godine. U njemu je opisan matematički aparat za strukturiranje i upravljanje podacima, a također je predložen apstraktni model za predstavljanje bilo koje stvarne informacije. Prije toga, prilikom korištenja baze podataka, bilo je potrebno uzeti u obzir specifičnosti pohranjivanja informacija u nju. Ako je unutarnja struktura baze podataka promijenjena (na primjer, radi povećanja performansi), aplikacijski programi su morali biti prerađeni, čak i ako nije bilo promjena na logičkoj razini. Relacijski model omogućio je odvajanje posebnih značajki pohrane podataka od razine aplikacijskog programa. Doista, model ne opisuje kako se informacije spremaju i kako im se pristupa. U obzir se uzima samo način na koji korisnik percipira te podatke. Zahvaljujući pojavi relacijskog modela, pristup upravljanju podacima kvalitativno se promijenio: iz umjetnosti se pretvorio u znanost, što je dovelo do revolucionarnog razvoja industrije.

Osnovni pojmovi relacijskog modela

Prema relacijskom modelu, relacija je neka vrsta tablice s podacima. Relacija može imati jedan ili više atributa (obilježja) koji odgovaraju stupcima ove tablice i neki skup (možda prazan) podataka koji predstavlja skupove tih atributa (oni se nazivaju n-arnim torkama ili zapisima) i koji odgovaraju recima stola.

Za svaki tuple, vrijednosti atributa moraju pripadati takozvanim domenama. Zapravo, domena je neki skup podataka koji definira skup svih valjanih vrijednosti.

Pogledajmo primjer. Neka postoji domena Dani u tjednu koja sadrži vrijednosti od ponedjeljka do nedjelje. Ako relacija ima atribut DayWeek koji odgovara ovoj domeni, tada svaki tuple u odnosu mora imati jednu od navedenih vrijednosti u stupcu DayWeek. Pojavljivanje vrijednosti siječanj ili mačka nije dopušteno.

Napomena: atribut mora imati jednu od valjanih vrijednosti. Zabranjeno je navođenje više vrijednosti odjednom. Dakle, osim zahtjeva da vrijednosti atributa pripadaju određenoj domeni, mora se poštivati ​​i uvjet njezine atomičnosti. To znači da za te vrijednosti nije dopuštena dekompozicija, odnosno da se ne mogu razbiti na manje dijelove bez gubitka glavnog značenja. Na primjer, ako je vrijednost atributa istovremeno sadržavala ponedjeljak i utorak, tada bi se mogla razlikovati dva dijela, zadržavajući izvorno značenje - Dan u tjednu; stoga ova vrijednost atributa nije atomska. Međutim, ako pokušate razbiti značenje "ponedjeljka" na dijelove, dobit ćete skup pojedinačnih slova - od "P" do "K"; izgubljeno je izvorno značenje, pa je vrijednost "ponedjeljak" atomska.

Odnosi imaju i druga svojstva. Najznačajnije od njih je matematičko svojstvo zatvorenih operacija. To znači da se kao rezultat izvođenja bilo koje operacije na relaciji mora pojaviti nova relacija. Ovo svojstvo omogućuje dobivanje predvidljivih rezultata pri izvođenju matematičkih operacija nad odnosima. Osim toga, postaje moguće predstaviti operacije kao apstraktne izraze s različitim razinama ugniježđenja.

U svom izvornom djelu, dr. Codd definirao je skup od osam operatora koji se naziva relacijska algebra. Četiri operatora – unija, logičko množenje, razlika i kartezijanski proizvod – prenijeta su iz tradicionalne teorije skupova; ostali operatori stvoreni su posebno za rukovanje odnosima. Naknadni rad dr. Codda, Chrisa Datea i drugih predložio je dodatne operatere. Kasnije u ovom članku razmatrat će se tri relacijske operatora - proizvodnja (projekt), ograničenja (odaberite ili ograničite) i stapanje (pridruživanje).

sql i relacijski model

Sada kada ste upoznati s relacijskim modelom, zaboravimo na njega. Naravno, ne zauvijek, nego samo da objasnim sljedeće: iako je u razvoju sql-a korišten relacijski model koji je predložio dr. Codd, među njima ne postoji potpuna ili doslovna korespondencija (ovo je jedan od razloga zašto sql-92 standard ne sadrži pojam relacija). Na primjer, pojmovi sql tablica i relacija nisu ekvivalentni, jer tablice mogu imati nekoliko identičnih redaka odjednom, dok identični tuple nisu dopušteni u odnosima. Osim toga, sql ne omogućuje korištenje relacijskih domena, iako tipovi podataka u određenoj mjeri igraju ulogu (neki utjecajni zagovornici relacijskog modela sada pokušavaju uključiti relacijske domene u budući sql standard).

Nažalost, neusklađenost između sql-a i relacijskog modela stvorila je mnogo nesporazuma i kontroverzi tijekom godina. No, budući da je glavna tema članka proučavanje sql-a, a ne relacijskog modela, ovi problemi se ovdje ne razmatraju. Samo budite svjesni da postoje razlike između pojmova koji se koriste u sql-u i u relacijskom modelu. Dalje u članku će se koristiti samo termini prihvaćeni u sql-u. Umjesto relacija, atributa i tuple-a, koristit ćemo njihove sql parnjake: tablice, stupce i retke.

statički i dinamički sql

Možda ste već upoznati s pojmovima kao što su statički i dinamički sql. Sql upit je statičan ako je preveden i optimiziran u fazi prije izvođenja programa. Već smo spomenuli jedan oblik statičkog sql-a kada smo govorili o ugrađivanju sql naredbi u C ili Cobol programe (postoji i drugi naziv za takve izraze - embedded sql). Kao što vjerojatno možete pretpostaviti, dinamički sql upit se sastavlja i optimizira tijekom izvršavanja programa. U pravilu, obični korisnici koriste dinamički sql, koji im omogućuje kreiranje upita u skladu s trenutnim potrebama. Jedna od opcija korištenja dinamičkih sql upita je njihov interaktivni ili izravan poziv (postoji čak i poseban izraz - directsql), kada se upiti poslani na obradu interaktivno unose s terminala. Između statičkog i dinamičkog sql-a postoje određene razlike u sintaksi korištenih struktura i značajkama izvršenja, međutim, ta pitanja su izvan dosega članka. Napominjemo samo da su radi jasnoće razumijevanja primjeri dati u obliku izravnih sql upita, jer to omogućuje ne samo programerima, već i većini krajnjih korisnika da nauče kako koristiti sql.

kako naučiti sql

Sada ste spremni za pisanje svojih prvih sql upita. Ako imate pristup bazi podataka putem sql-a i želite koristiti naše primjere u praksi, uzmite u obzir sljedeće: morate se prijaviti kao korisnik s neograničenim privilegijama i trebat će vam softverski alati za interaktivnu obradu sql upita (ako govorimo o mrežnoj bazi podataka, trebali biste razgovarati s administratorom baze podataka o dodjeli odgovarajućih prava). Ako nemate pristup bazi podataka putem sql-a, nemojte se uzrujati: svi su primjeri vrlo jednostavni i možete ih shvatiti "na suho", bez pristupa stroju.

Da biste izvršili bilo koju radnju u sql-u, morate izvršiti izraz u sql jeziku. Postoji nekoliko tipova izraza, ali se među njima mogu razlikovati tri glavne skupine: ddl-naredbe (jezik definicije podataka - jezik opisa podataka), dml-naredbe (jezik za manipulaciju podacima - jezik manipulacije podacima) i alati za kontrolu podataka. Dakle, na neki način, tri različita jezika su kombinirana u sql.

Opis podataka Jezične naredbe

Počnimo s jednom od glavnih ddl naredbi – kreiraj tablicu (Create a table). U sql-u postoji nekoliko tipova tablica, glavne su dvije vrste: baza (baza) i selektivna (pregledi). Osnovne tablice su tablice koje se odnose na podatke iz stvarnog života; selektivno - to su "virtualne" tablice koje se stvaraju na temelju informacija dobivenih iz osnovnih tablica; ali korisnicima obrasci izgledaju kao normalne tablice. Naredba kreiranje tablice služi za kreiranje osnovnih tablica.

U naredbi za kreiranje tablice morate odrediti naziv tablice, navesti popis stupaca i vrste podataka koje sadrže. Drugi izborni elementi također mogu biti prisutni kao parametri, ali prvo pogledajmo samo glavne parametre. Pokažimo najjednostavniji sintaktički oblik za ovu naredbu:

stvoriti tablicu Naziv tablice (Tip podataka stupca) ;

create i table su sql ključne riječi; TableName, Column i DataType su formalni parametri, umjesto kojih korisnik svaki put unosi stvarne vrijednosti. Parametri Column i DataType zatvoreni su u zagradama. U sql-u se zagrade obično koriste za grupiranje pojedinačnih elemenata. U ovom slučaju vam omogućuju kombiniranje definicija za stupac. Točka-zarez na kraju je razdjelnik naredbi. Mora dovršiti svaki izraz u sql jeziku.

Razmotrimo primjer. Pretpostavimo da želite stvoriti tablicu za pohranjivanje podataka o svim terminima (sastancima). Da biste to učinili, unesite naredbu u sql:

kreirajte termine u tablici (datum_appointmenta) ;

Nakon izvršenja ove naredbe, kreirat će se tablica nazvana termini u kojoj postoji jedan stupac datum_nastava u koji se mogu pohraniti podaci tipa datum. Budući da podaci još nisu uneseni, broj redaka u tablici je nula (pomoću naredbe kreiranje tablice samo se definira tablica; stvarne vrijednosti unose se naredbom umetanje, o čemu će biti riječi kasnije).

Parametri imenovanja i appointment_date nazivaju se identifikatori jer određuju imena za određene objekte baze podataka, u ovom slučaju nazive za tablicu i stupac, respektivno. Postoje dvije vrste identifikatora u sql-u: regularni (obični) i namjenski (razgraničeni). Identifikatori s razdvojenim oznakama zatvoreni su u dvostrukim navodnicima i razlikuju velika i mala slova. Uobičajeni identifikatori se ne razlikuju nikakvim ograničenim znakovima i ne razlikuju velika i mala slova. Ovaj članak koristi samo uobičajene identifikatore.

Simboli koji se koriste za izradu identifikatora moraju slijediti određena pravila. Uobičajeni identifikatori mogu koristiti samo slova (ne nužno latinicu, već i druge abecede), brojeve i znak podvlake. Identifikator ne smije sadržavati interpunkcijske znakove, razmake ili posebne znakove (#, @, % ili!); također, ne može započeti znamenkom ili donjom crticom. Možete koristiti zasebne sql ključne riječi za identifikatore, ali to se ne preporučuje. Identifikator je namijenjen označavanju nekog objekta, stoga mora imati jedinstveno (unutar određenog konteksta) ime: ne možete kreirati tablicu s imenom koje se već nalazi u bazi podataka; Ne možete imati stupce s istim imenom u istoj tablici. Usput, imajte na umu da su termini i termini isti nazivi za sql. Nije moguće stvoriti novi identifikator samo promjenom velikih i malih slova.

Iako tablica može imati samo jedan stupac, u praksi su obično potrebne tablice s više stupaca. Naredba za stvaranje takve tablice općenito izgleda ovako:

izraditi tablicu Naziv tablice (Stupac vrste podataka [ ( , stupac vrste podataka ) ]) ;

Uglate zagrade se koriste za označavanje neobaveznih elemenata, vitičaste zagrade sadrže elemente koji mogu biti popis jednosmjernih konstrukcija (prilikom unosa prave sql naredbe, nijedna od ovih zagrada se ne stavlja). Ova sintaksa vam omogućuje da navedete bilo koji broj stupaca. Imajte na umu da drugom elementu prethodi zarez. Ako na popisu postoji nekoliko parametara, oni su međusobno odvojeni zarezima.

kreirajte tablicu termini2 (datum_sastanka datum, vrijeme_sastanka vrijeme, opis varchar (256)) ;

Ova naredba stvara tablicu termina2 (nova tablica mora imati drugačiji naziv, budući da je tablica termina već prisutna u bazi podataka). Kao i prva tablica, ima stupac appointment_date za bilježenje datuma termina; osim toga, postoji stupac appointment_time za bilježenje vremena ovih termina. Parametar opisa je tekstualni niz koji može sadržavati do 256 znakova. Tip specificiran za ovaj parametar je varchar (skraćeno od karaktera varira), budući da nije unaprijed poznato koliko će prostora biti potrebno za zapis, ali je jasno da opis neće trajati više od 256 znakova. Prilikom opisivanja parametra u tipu niza znakova (i nekim drugim vrstama) specificira se duljina parametra. Njegova je vrijednost navedena u zagradama desno od naziva tipa.

Možda ste primijetili da je u dva razmatrana primjera unos naredbe drugačije formatiran. Ako je u prvom slučaju naredba potpuno postavljena u jedan redak, onda se u drugom, nakon prve otvorene zagrade, unos nastavlja iz novog retka, a definicija svakog sljedećeg stupca počinje iz novog retka. U sql-u nema posebnih zahtjeva za formatiranje zapisa. Razbijanje zapisa u retke olakšava čitanje. Jezik sql omogućuje, prilikom pisanja naredbi, ne samo razbijanje naredbe u retke, već i umetanje uvlaka na početku redaka i razmaka između elemenata zapisa.

Sada kada znate osnovna pravila, pogledajmo složeniji primjer izrade tablice s više stupaca. Na početku članka prikazana je tablica zaposlenika. Sadrži sljedeće stupce: prezime, ime, datum zaposlenja, odjel, kategoriju i plaću za godinu. Sljedeća sql naredba koristi se za definiranje ove tablice:

kreirajte tablice zaposlenika (znak prezimena (13) nije null, znak imena (10) nije ništavan, datum_najmanja, znak podružnice (15) , razina_razine smallint , decimala za plaću (9 , 2)) ;

U timu je nekoliko novih elemenata. Prvi je izraz koji nije null na kraju definicija stupaca prezime_name i ime_ime. Uz pomoć takvih struktura postavljaju se zahtjevi koji se moraju poštivati. U tom slučaju je naznačeno da se polja prezime i ime moraju popuniti prilikom unosa; ne možete ostaviti ove stupce prazne (ovo je sasvim logično: kako možete identificirati zaposlenika a da mu ne znate ime?).

Osim toga, u primjeru postoje tri nova tipa podataka: znak, smallint i decimalni. Do sada nismo puno pričali o vrstama. Iako u sql-u nema relacijskih domena, postoji skup osnovnih tipova podataka. Ova informacija se koristi prilikom dodjele memorije i uspoređivanja vrijednosti; do neke mjere sužava popis mogućih ulaznih vrijednosti, ali sql-ova kontrola tipa je manje stroga nego u drugim jezicima.

Svi tipovi podataka dostupni u sql-u mogu se podijeliti u šest grupa: znakovni nizovi, točne numeričke vrijednosti, približne numeričke vrijednosti, bitni nizovi, datum i vrijeme i intervali. Naveli smo sve varijacije, ali ovaj će članak detaljno pokriti samo neke od njih (na primjer, bitni nizovi nisu od posebnog interesa za obične korisnike).

Usput, ako ste mislili da je datum i vrijeme pogreška u kucanju, onda ste se prevarili. Ova grupa (datum i vrijeme) uključuje većinu vremenskih tipova podataka koji se koriste u sql-u (parametri kao što su vremenski intervali su u zasebnoj grupi). U prethodnom primjeru već su se susrele dvije vrste podataka iz grupe datuma i vremena - datum i vrijeme.

Sljedeća vrsta podataka s kojom ste već upoznati je promjena znakova (ili samo varchar); pripada skupini znakovnih nizova. Ako se varchar koristi za pohranjivanje nizova promjenjive duljine, tada je tip char koji se susreće u trećem primjeru namijenjen za pisanje nizova s ​​fiksnim brojem znakova. Na primjer, stupac prezime_name sadržavat će nizove od 13 znakova, bez obzira na stvarno unesena prezimena, bilo poe ili penworth-chickering (u slučaju poe, preostalih 10 znakova bit će popunjeno razmacima).

Sa stajališta korisnika, varchar i char imaju isto značenje. Zašto je bilo potrebno uvesti dvije vrste? Činjenica je da u praksi obično morate pronaći kompromis između brzine i uštede prostora na disku. U pravilu, korištenje nizova fiksne duljine daje određeni dobitak u brzini pristupa, međutim, ako je duljina niza preduga, prostor na disku se gubi. Ako u terminima2 za svaki redak komentara rezervirate 256 znakova, onda se to može pokazati iracionalnim; najčešće će redovi biti puno kraći. S druge strane, prezimena također imaju različite duljine, ali obično zahtijevaju oko 13 znakova; u ovom slučaju gubici će biti minimalni. Postoji dobro pravilo: ako se zna da se duljina niza malo mijenja ili je relativno mala, onda upotrijebite char; inače, varchar.

Sljedeća dva nova tipa podataka, smallint i decimal, pripadaju skupini točnih numeričkih vrijednosti. smallint je skraćenica za mali cijeli broj. SQL također pruža cjelobrojni tip podataka. Prisutnost dvije slične vrste u ovom slučaju također se objašnjava razmatranjem uštede prostora. U našem primjeru vrijednosti grade_level mogu se predstaviti kao dvoznamenkasti broj, pa se koristi tip smallint; međutim, u praksi nije uvijek poznato koje maksimalne vrijednosti parametri mogu imati. Ako nema takvih informacija, upotrijebite cijeli broj. Stvarni prostor za pohranu parametara smallint i integer i odgovarajući raspon vrijednosti za ove parametre su specifični za platformu.

Decimalni tip podataka, koji se obično koristi za financijsko računovodstvo, omogućuje vam da odredite uzorak sa željenim brojem decimalnih mjesta. Budući da se ovaj tip koristi za točnu numeričku notaciju, jamči preciznost pri izvođenju matematičkih operacija nad decimalnim podacima. Ako koristite tipove podataka iz grupe približnih numeričkih zapisa za decimalne vrijednosti, kao što je float (broj s pomičnim zarezom), to će dovesti do pogrešaka zaokruživanja, pa ova opcija nije prikladna za financijske izračune. Za definiranje parametara decimalnog tipa koristi se sljedeći zapis:

gdje je p broj decimalnih mjesta, d broj decimalnih mjesta. Umjesto p u korištene vrijednosti upišite ukupan broj značajnih znamenki, a umjesto d - broj znamenki nakon decimalne točke.

Bočna traka "Stvaranje tablice" prikazuje potpuni sažetak naredbe za kreiranje tablice. Sadrži nove elemente i prikazuje format za sve razmatrane tipove podataka (U principu postoje i drugi tipovi podataka, ali ih još ne razmatramo).

U početku se može činiti da je sintaksa sql naredbi previše komplicirana. Ali to možete lako shvatiti ako pažljivo proučite gornje primjere. Na dijagramu se pojavio dodatni element - okomita crta; služi za razlikovanje alternativnih dizajna. Drugim riječima, kada definirate svaki stupac, trebate odabrati odgovarajuću vrstu podataka (kao što se sjećate, neobavezni parametri su zatvoreni u uglaste zagrade, a konstrukcije koje se mogu ponoviti mnogo puta u vitičastim zagradama; ti posebni znakovi nisu zapisani u stvarnom sql naredbe). Prvi dio sheme prikazuje pune nazive za tipove podataka, drugi dio prikazuje njihove skraćene nazive; u praksi se može koristiti bilo koji od njih.

Prvi dio članka je završen. Drugi će biti posvećen proučavanju naredbi za umetanje, odabir, ažuriranje i brisanje dml. Također, razmotrit će se uvjeti uzorkovanja podataka, usporedba i logički operatori, korištenje nul vrijednosti i ternarne logike.

Izrada tablice. Sintaksa naredbe za kreiranje tablice: izborni parametri su naznačeni u uglastim zagradama, a ponavljajuće konstrukcije označene su vitičastim zagradama.

stvoriti tablicu tablice (znak stupca (dužina) [ograničenje] | varijabilan znak (dužina) [ograničenje] | datum [ograničenje] | vrijeme [ograničenje] | cijeli broj [ograničenje] | smallint [ograničenje] | decimalni (preciznost, decimalna mjesta) [ ograničenje ] | float (preciznost) [ ograničenje ] [( , stupac char (dužina) [ ograničenje ] | varchar (dužina) [ ograničenje ] | datum [ ograničenje ] | vrijeme [ ograničenje ] | int [ ograničenje ] | smallint [ ograničenje ] | dec (preciznost, decimalna mjesta) [ograničenje] | float (preciznost) [ograničenje])]) ;

sql naziv tajna

Početkom 1970-ih ibm je počeo provoditi u praksi model relacijske baze podataka koji je predložio dr. Codd. Donald Chamberlin i grupa drugih u Jedinici za napredna istraživanja stvorili su prototip jezika nazvan strukturirani engleski jezik upita ili jednostavno nastavak. Kasnije je proširen i poboljšan. Nova varijanta koju je predložio IBM zove se sequel/2. Korišten je kao programsko sučelje (api) za projektiranje prvog IBM-ovog sustava relacijske baze podataka, system/r. Iz pravnih razloga, ibm je odlučio promijeniti ime iz sequel/2 u sql (strukturirani jezik upita). Ova se kratica često izgovara kao "si-ku-el".

Programiranje uključeno T- SQL

T-SQL sintaksa i konvencije

Pravila za generiranje identifikatora

Svi objekti u SQL Serveru imaju imena (identifikatore). Primjeri objekata su tablice, pogledi, pohranjene procedure i tako dalje. Identifikatori mogu imati do 128 znakova, uključujući slova, _ @ $ # i brojeve.

Prvi znak uvijek mora biti abecedni. Varijable i privremene tablice koriste posebne sheme imenovanja. Naziv objekta ne može sadržavati razmake i ne može odgovarati rezerviranoj ključnoj riječi SQL Servera, bez obzira na upotrijebljena velika i mala slova. Stavljanjem identifikatora u uglaste zagrade, zabranjeni znakovi mogu se koristiti u nazivima objekata.

Ispunjavanje uputa

ANSI SQL standard zahtijeva točku i zarez na kraju svake izjave. U isto vrijeme, kod programiranja u T-SQL-u, točka-zarez nije potrebna.

Komentari

Jezik T-SQL dopušta korištenje dvaju stilova komentara: ANCI i C. Prvi od njih počinje s dvije crtice i završava na kraju retka:

Ovo je komentar u stilu ANSI u jednom retku

Također, komentari u stilu ANSI mogu se umetnuti na kraj retka izjave:

ODABIR Naziv grada - stupovi koji se mogu izvući

IZ Grada - izvorna tablica

GDJE IdCity = 1; -- granica linije

SQL editor može primijeniti i ukloniti komentare na sve odabrane retke. Da biste to učinili, odaberite odgovarajuće naredbe u izborniku. Uredi ili na alatnoj traci.

Komentari u stilu C počinju kosom crtom i zvjezdicom (/*) i završavaju istim znakovima obrnutim redoslijedom. Ova vrsta komentara najbolje se koristi za komentiranje blokova redaka, kao što su zaglavlja ili veliki testni upiti.

višelinijski

komentar

Jedna od glavnih prednosti komentara u C stilu je da u njima možete izvršavati upite s više redaka čak i bez dekomentiranja.

T-SQL paketi

Upit je jedan T-SQL izraz, a skup je njihov skup. Cijeli slijed paketnih uputa šalje se poslužitelju iz klijentskih aplikacija kao jedna jedinica.

SQL Server cijeli paket tretira kao jedinicu rada. Prisutnost pogreške u barem jednoj instrukciji dovest će do nemogućnosti izvršavanja cijelog paketa. Istodobno, raščlanjivanje ne provjerava imena objekata i shema, budući da se sama shema može promijeniti tijekom izvršavanja naredbe.

Datoteka SQL skripte i prozor Query Analyzer mogu sadržavati više paketa. U ovom slučaju, svi paketi dijele terminator ključne riječi. Prema zadanim postavkama, ova ključna riječ je GO i mora biti jedina na liniji. Svi ostali znakovi (čak i komentari) će nadjačati graničnik paketa.

Otklanjanje pogrešaka T-SQL

Kada SQL uređivač naiđe na pogrešku, prikazuje njezinu prirodu i broj retka u grupi. Dvostrukim klikom na grešku možete odmah skočiti na odgovarajući redak.

Verzija Management Studio za SQL Server 2005 ne uključuje T-SQL debugger, uključen je u paket Visual Studio.

SQL Server nudi nekoliko naredbi koje će vam pomoći u otklanjanju pogrešaka u paketima. Konkretno, naredba PRINT šalje poruku bez generiranja skupa rezultata. Naredba PRINT može se koristiti za praćenje napretka paketa. S raščlanjivanjem upita u načinu rada mreže, pokrenite sljedeću grupu:

ODABIR Naziv grada

IZ Grada

GDJE IdCity = 1;

ISPIS "Kontrolna točka";

Dobiveni skup podataka bit će prikazan u mreži i sastojat će se od jednog retka. Istovremeno će se na kartici Poruke prikazati sljedeći rezultat:

(obrađeno: 1)

Check Point

Varijable

T-SQL varijable kreiraju se pomoću naredbe DECLARE, koja ima sljedeću sintaksu:

DECLARE @VariableName DataType [,

@VariableName DataType, ...]

Svi nazivi lokalnih varijabli moraju početi simbolom @. Na primjer, da biste deklarirali lokalnu varijablu UStr koja pohranjuje do 16 Unicode znakova, možete koristiti sljedeću izjavu:

DECLARE @UStr varchar(16)

Tipovi podataka koji se koriste za varijable potpuno su isti kao oni u tablicama. Jedna naredba DECLARE može navesti više varijabli odvojenih zarezima. Konkretno, sljedeći primjer stvara dvije cjelobrojne varijable a i b:

PROGLASITI

@a int ,

@bint

Opseg varijabli (tj. njihov životni vijek) primjenjuje se samo na trenutni paket. Novostvorene varijable prema zadanim postavkama sadrže nulte vrijednosti i moraju se inicijalizirati prije nego što budu uključene u izraze.

Postavljanje vrijednosti varijabli

Trenutno SQL nudi dva načina za postavljanje vrijednosti varijable - u tu svrhu možete koristiti izraz SELECT ili SET. Što se tiče funkcionalnosti, ovi operatori rade na gotovo isti način, osim što izraz SELECT dohvaća izvornu vrijednost koju treba dodijeliti iz tablice navedene u izrazu SELECT.

Naredba SET se obično koristi za postavljanje vrijednosti varijabli u obliku koji je češći u proceduralnim jezicima. Slijede tipični primjeri upotrebe ovog operatora:

SET @a = 1;

SET @b = @a * 1.5

Imajte na umu da su svi ovi izrazi izravne operacije dodjele koje koriste eksplicitne vrijednosti ili druge varijable. Ne možete koristiti izraz SET za dodjelu vrijednosti varijabli koja je dohvaćena iz upita; upit se mora izvršiti zasebno, a tek tada se dobiveni rezultat može dodijeliti pomoću naredbe SET. Na primjer, pokušaj izvršenja takve izjave rezultira pogreškom:

DEKLIRATI @c int

POSTAVI @c = COUNT(*) OD Grada

ODABIR @c

i sljedeća izjava se uspješno završava:

DEKLIRATI @c int

POSTAVI @c = (ODABIR BROJ (*) IZ Grada)

ODABIR @c

Naredba SELECT se obično koristi za dodjelu vrijednosti varijablama kada je izvor informacija koje treba pohraniti u varijablu upit. Na primjer, radnje izvedene u gornjem kodu mnogo se češće provode pomoću SELECT izraza:

DEKLIRATI @c int

SELECT @c = COUNT (*) IZ Grada

ODABIR @c

Imajte na umu da je ovaj kod malo jasniji (posebno je sažetiji, iako radi iste stvari).

Stoga je moguće formulirati sljedeću općeprihvaćenu konvenciju za korištenje oba operatora.

Naredba SET se koristi kada se treba izvesti jednostavna operacija dodjele varijabli, tj. ako je vrijednost koju treba dodijeliti već postavljena eksplicitno u obliku određene vrijednosti ili u obliku neke druge varijable.

  • Naredba SELECT koristi se kada se dodjela varijabli treba temeljiti na upitu.

Korištenje varijabli u SQL upitima

Jedna od korisnih značajki T-SQL jezika je da se varijable mogu koristiti u upitima bez potrebe za stvaranjem složenih dinamičkih nizova koji ugrađuju varijable u programski kod. Dinamički SQL i dalje postoji, ali se jedna vrijednost može lakše promijeniti pomoću varijable.

Gdje god se izraz može koristiti u upitu, može se koristiti i varijabla. Sljedeći primjer pokazuje upotrebu varijable u klauzuli WHERE:

DECLARE @IdProd int ;

POSTAVI @IdProd = 1;

ODABERI

IZ proizvoda

GDJE IdProd = @IdProd;

Globalne varijable sustava

SQL Server ima preko trideset globalnih varijabli koje nemaju parametre koje definira i održava sustav. Sve globalne varijable imaju prefiks s dva znaka @. Možete dohvatiti vrijednost bilo kojeg od njih jednostavnim upitom SELECT, kao u sljedećem primjeru:

ODABIR @@VEZE

Ovo koristi globalnu varijablu @@CONNECTIONS za dohvaćanje broja veza na SQL Server od pokretanja programa.

Neke od najčešće korištenih varijabli sustava uključuju:

  • @@ERROR - Sadrži broj pogreške koja se dogodila tijekom izvršavanja posljednjeg T-SQL izraza na trenutnoj vezi. Ako nije pronađena pogreška, sadrži 0. Vrijednost ove sistemske varijable se resetira nakon izvršenja svakog sljedećeg izraza. Ako želite pohraniti vrijednost koju sadrži, tada tu vrijednost treba premjestiti u lokalnu varijablu odmah nakon izvršenja naredbe za koju treba pohraniti kod pogreške.
  • @@IDENTITY - Sadrži posljednju vrijednost identiteta umetnutu u bazu podataka kao rezultat posljednje INSERT izraza. Ako zadnji izraz INSERT nije generirao vrijednost identiteta, varijabla sustava @@IDENTITY je NULL. Ova izjava ostaje istinita čak i ako je odsutnost vrijednosti identiteta uzrokovana padom tijekom izvršavanja izjave. A ako se više umetanja izvodi s jednom naredbom, toj se varijabli sustava dodjeljuje samo posljednja identifikacijska vrijednost.
  • @@ROWCOUNT - Jedna od najčešće korištenih varijabli sustava. Vraća informacije o broju redaka na koje utječe posljednja izjava. Obično se koristi za provjeru grešaka koje nisu pogreške tijekom izvođenja. Na primjer, ako program otkrije da je nakon pozivanja naredbe DELETE s klauzulom WHERE broj zahvaćenih redaka nula, tada možemo zaključiti da se dogodilo nešto neočekivano. Nakon toga, poruka o pogrešci se može aktivirati ručno.

! Imajte na umu da se od SQL Servera 2000 globalne varijable nazivaju funkcijama. Naziv "globalni" bio je zbunjujući korisnike, dopuštajući im da misle da je opseg takvih varijabli širi od opsega lokalnih. Globalnim varijablama često se pogrešno pripisivala sposobnost pohranjivanja informacija, bez obzira na to jesu li one uključene u paket ili ne, što, naravno, nije bilo točno.

Kontrole tijeka naredbi. Softverske konstrukcije

T-SQL jezik pruža većinu klasičnih proceduralnih kontrola za izvršavanje programa, uklj. uvjetna konstrukcija i petlje.

OperaterAKO. . . DRUGO

IF izjave. . .ELSE funkcionira u T-SQL-u na isti način kao u bilo kojem drugom programskom jeziku. Opća sintaksa za ovaj operator je sljedeća:

IF Booleov izraz

SQL izraz I BEGIN Blok SQL izraza END

SQL izjava | BEGIN Blok SQL izraza END]

Kao logički izraz, može se specificirati gotovo svaki izraz čiji rezultat, kada se evaluira, dovodi do povrata Booleove vrijednosti.

Imajte na umu da se samo naredba koja odmah slijedi nakon IF naredbe (onaj koja mu je najbliža) smatra uvjetno izvršenom. Umjesto jednog izraza, možete uvjetno izvršiti nekoliko izraza kombinirajući ih u blok koda pomoću konstrukcije BEGIN ... END.

U donjem primjeru, uvjet IF ne uspijeva, što sprječava izvršavanje sljedećeg izraza.

AKO 1 = 0

PRINT "Prvi red"

PRINT "Drugi red"

Opcijska naredba ELSE omogućuje vam da navedete izraz koji će se izvršiti ako IF uvjet nije ispunjen. Poput IF, izraz ELSE kontrolira samo naredbu koja neposredno slijedi nakon nje, ili blok koda zatvoren između BEGIN...END.

Iako naredba IF izgleda ograničeno, njezina uvjetna klauzula može uključivati ​​moćne značajke, slične klauzuli WHERE. Konkretno, to su IF EXISTS() izrazi.

Izraz IF EXISTS() kao uvjet koristi postojanje bilo kojeg retka vraćenog naredbom SELECT. Budući da se pretražuju svi redci, popis stupaca u SELECT izrazu može se zamijeniti zvjezdicom. Ova metoda je brža od @@ROWCOUNT>0 jer ne treba brojati ukupan broj redaka. Čim barem jedan red zadovolji uvjet IF EXISTS(), upit se može nastaviti s izvršavanjem.

Sljedeći primjer koristi izraz IF EXISTS za provjeru ima li ID kupca 1 narudžbe prije brisanja iz baze podataka. Ako postoji informacija o ovom klijentu za barem jednu narudžbu, brisanje se ne vrši.

AKO POSTOJI (ODABIR * OD GDJE IdCust = 1)

ISPIS "Klijenta nije moguće izbrisati jer su s njim povezani zapisi u bazi podataka"

DRUGO

GDJE IdCust = 1

ISPIS "Uklanjanje je uspješno dovršeno"

OperateriDOK, BREAK iNASTAVITI

Klauzula WHILE u SQL-u funkcionira na isti način kao i na drugim jezicima s kojima programer obično mora raditi. Zapravo, u ovoj izjavi, prije početka svakog prolaska kroz petlju, provjerava se neki uvjet. Ako prije sljedeće iteracije petlje test uvjeta rezultira vrijednošću TRUE, petlja se propušta, inače se izraz prekida.

Naredba WHILE ima sljedeću sintaksu:

WHILE Booleov izraz

SQL izjava I

Blok SQL naredbi

Naravno, korištenje naredbe WHILE može osigurati da se samo jedan izraz izvršava u petlji (slično kako se obično koristi izraz IF), ali u praksi WHILE konstrukcije koje ne prati BEGIN blok. . .END koji odgovara punom formatu izjave su rijetki.

Naredba BREAK vam omogućuje da odmah izađete iz petlje bez čekanja dok se kraj petlje ne prođe i uvjetni izraz se ponovno procijeni.

Naredba CONTINUE vam omogućuje da prekinete jednu iteraciju petlje. Ukratko, možete opisati radnju naredbe CONTINUE tako da pruža prijelaz na početak WHILE petlje. Čim se naredba CONTINUE pronađe u petlji, bez obzira gdje se nalazi, ona skače na početak petlje i ponovno procjenjuje uvjetni izraz (i izlazi iz petlje ako taj izraz više nije TRUE).

Sljedeća kratka skripta pokazuje korištenje naredbe WHILE za stvaranje petlje:

DECLARE @Temp int ;

POSTAVI @Temp = 0;

DOK @Temp< 3

POČETI

PRINT @Temp;

POSTAVI @Temp = @Temp + 1;

Ovdje, u petlji, cjelobrojna varijabla @Temp se povećava s 0 na 3, a na svakoj iteraciji prikazuje se njezina vrijednost.

OperaterPOVRATAK

Naredba RETURN koristi se za zaustavljanje izvršavanja paketa, a time i pohranjene procedure i okidača (o kojima će se raspravljati u kasnijim laboratorijima).

Jezik upita SQL baze podataka pojavio se 70-ih godina. Njegov prototip razvio je IBM i poznat je kao SEQUEL (Structured English QUEry Language). SQL je ugradio prednosti relacijskog modela, posebice činjenicu da se temelji na matematičkom aparatu relacijske algebre i relacijskog računa, uz korištenje relativno malog broja operatora i jednostavne sintakse.

Zbog svojih kvaliteta, jezik SQL je najprije postao "de facto", a potom i službeno odobren kao standardni jezik za rad s relacijskim bazama podataka, podržan od svih vodećih svjetskih tvrtki koje posluju u području tehnologije baza podataka. Korištenje izražajnog i učinkovitog standardnog jezika sada je omogućilo da se osigura visok stupanj neovisnosti razvijenih aplikacijskih softverskih sustava od specifične vrste korištenog DBMS-a, da se značajno podigne razina i objedine alati za razvoj aplikacija koje rade s relacijskim baze podataka.

Govoreći o standardu jezika SQL, treba napomenuti da većina njegovih komercijalnih implementacija ima manje ili više odstupanja od standarda. To, naravno, pogoršava kompatibilnost sustava koji koriste različite "dijalekte" SQL-a. S druge strane, korisna proširenja jezičnih implementacija u odnosu na standard sredstvo su razvoja jezika i s vremenom su uključena u nova izdanja standarda.

Velik broj knjiga, uključujući i obrazovne, posvećen je SQL jeziku, neke od njih su navedene u bibliografiji ovog priručnika, a posebno je tutorial posebno posvećen praktičnom proučavanju jezika SQL. S tim u vezi, u ovom priručniku razmotrit ćemo samo bitne opće značajke ovog jezika koje su važne za kasniji prikaz gradiva.

8.1. Razlika između SQL i proceduralnih programskih jezika

SQL jezik pripada klasi neproceduralnih programskih jezika. Za razliku od univerzalnih proceduralnih jezika, koji se također mogu koristiti za rad s bazama podataka, SQL jezik nije orijentiran na zapise, već na skupove. To znači sljedeće. Kao ulazne informacije za upit baze podataka formuliran u SQL-u, skup torke zapisa jedna ili više relacijskih tablica. Upit također rezultira skup torki rezultirajuća tablica relacija. Drugim riječima, u SQL-u, rezultat bilo koje operacije na relaciji je također relacija. SQL upit ne navodi proceduru, tj. slijed radnji potrebnih za dobivanje rezultata i uvjete koje moraju zadovoljiti torke rezultirajuće relacije, formulirane u terminima ulaznih (ili ulaznih) odnosa.

8.2. Oblici i dijelovi SQL-a

Postoje i koriste se dva oblika jezika SQL: interaktivni SQL

i ugrađeni SQL.

Interaktivni SQL koristi se za izravan unos i primanje rezultata SQL upita od strane korisnika u interaktivnom načinu.

Ugrađeni SQL sastoji se od SQL naredbi ugrađenih unutar programa koji su obično napisani na nekom drugom jeziku (Pascal, C, C++, itd.). To čini programe napisane na takvim jezicima moćnijim i učinkovitijim, omogućujući im rad s podacima pohranjenim u relacijskim bazama podataka, međutim, zahtijeva uvođenje dodatnih alata koji pružaju sučelje za SQL s jezikom u koji je ugrađen.

I interaktivni i ugrađeni SQL obično se dijele na sljedeće dijelove.

Jezik definicije podataka– DDL (Jezik definicije podataka), omogućuje stvaranje, modificiranje i brisanje različitih objekata baze podataka (tablice, indeksi, korisnici, privilegije, itd.).

Među dodatnim funkcijama DDL jezika definicije podataka mogu se uključiti i alati za određivanje ograničenja integriteta podataka,

određivanje reda u strukturama pohrane podataka, opisivanje elemenata fizičke razine pohrane podataka.

Jezik za obradu podataka– DML (jezik za upravljanje podacima),

pruža mogućnost odabira informacija iz baze podataka i transformacije podataka pohranjenih u njoj.

Međutim, to nisu dva različita jezika, već komponente jednog SQL-a.

8.3. Pojmovi i terminologija

Ključne riječi su riječi koje se koriste u SQL izrazima koje imaju posebnu svrhu. Na primjer, mogu se odnositi na određene SQL naredbe. Ključne riječi se ne mogu koristiti u druge svrhe, kao što su nazivi objekata baze podataka.

SQL izrazi su izrazi pomoću kojih SQL pristupa bazi podataka. Izjave se sastoje od jednog ili više različitih logičkih dijelova koji se nazivaju klauzule. Rečenice počinju odgovarajućom ključnom riječi i sastoje se od ključnih riječi i argumenata.

Treba napomenuti da se termini koji se koriste u SQL jeziku donekle razlikuju od pojmova koji se koriste za opisivanje relacijskog modela. Konkretno, umjesto pojma relacija, koristi se izraz tablica, umjesto pojmova tuple i atribut, redak i stupac.

8.4. Uzorkovanje podataka. Operater ODABERI

Najjednostavniji SELECT upiti

SQL SELECT izraz je najvažniji i najčešće korišten izraz u SQL-u. Dizajniran je za dohvaćanje informacija iz tablica baze podataka. Pojednostavljena sintaksa izraza SELECT je sljedeća.

ODABERI< popis atributa>

IZ< список таблиц>

Stavke u uglastim zagradama označavaju stavke koje možda nedostaju u upitu.

Ključna riječ SELECT govori DBMS-u da je data klauzula zahtjev za dohvaćanje informacija. Nakon riječi SELECT navode se nazivi polja (popis atributa) čiji se sadržaj traži, odvojeni zarezima.

Potrebna ključna riječ u klauzuli SELECT je FROM. Nakon ključne riječi FROM slijedi popis imena tablica odvojenih zarezima iz kojih se dohvaćaju informacije.

Na primjer,

ODABERITE IME, PREZIME OD STUDENTA;

SQL upit mora završiti točkom i zarezom. Gornji upit dohvaća sve vrijednosti polja NAME i

PREZIME iz STUDENTSKOG stola.

Njegov rezultat je tablica sljedećeg oblika

Redoslijed stupaca u ovoj tablici odgovara redoslijedu polja IME i PREZIME u upitu, a ne njihov redoslijed u ulaznoj tablici

STUDENT.

Obratimo pažnju na činjenicu da tablice dobivene kao rezultat SQL upita ne zadovoljavaju u potpunosti definiciju relacijskog odnosa. NA

posebice, mogu sadržavati duplicirane tuple s istim vrijednostima atributa.

Na primjer, upit: "Dobijte popis imena gradova u kojima studenti žive, podaci o kojima se nalaze u tablici STUDENT", može se napisati u sljedećem obliku

ODABERITE GRAD OD STUDENTA ;

Rezultat će biti tablica

Belgorod

Može se vidjeti da se u ovoj tablici mogu pojaviti isti redovi. Podebljane su.

Da biste izuzeli duple zapise iz rezultata SELECT upita, koristite ključnu riječ DISTINCT (različiti). Ako upit SELECT dohvaća više polja, tada DISTINCT eliminira duplicirane retke u kojima su vrijednosti svih odabranih polja identične.

Uvođenje naredbe SELECT, klauzule definirane ključnom riječi WHERE (where), u izraz omogućuje vam da unesete uvjetni izraz (predikat) koji se procjenjuje na istinito ili netočno za vrijednosti polja reda tablice kojima se pristupa naredbom SELECT. Klauzula WHERE određuje koje retke navedenih tablica treba odabrati. Tablica koja je rezultat upita uključuje samo one retke za koje uvjet (predikat) naveden u klauzuli WHERE daje vrijednost istinitom.

Napišite upit koji odabire imena ( IME ) svih učenika s prezimenom ( PREZIME ) Petrov, podaci o kojima se nalaze u tablici

ODABIR PREZIME, IME

OD STUDENTA

GDJE PREZIME = ‘ Petrov ’;

Uvjeti navedeni u klauzuli WHERE mogu koristiti operatore usporedbe specificirane sljedećim operatorima: = (jednako), > (veće od),< (меньше), >= (veće ili jednako),<= (меньше или равно), <>(nije jednako), kao i logičke operatore AND , OR i NOT .

Primjerice, upit za dobivanje imena i prezimena studenata koji studiraju na trećoj godini i primaju stipendiju (veličina stipendije je veća od nule) izgledat će ovako

ODABERITE IME, PREZIME OD STUDENTA

GDJE KURS = 3 I STIPENDA > 0 ;

8.5. Implementacija operacija relacijske algebre pomoću SQL jezika. Relacijska potpunost SQL-a

NA U prethodnim poglavljima posvećenim razmatranju relacijske algebre rečeno je da je jedan od važnih aspekata prisutnosti takvog matematičkog aparata u relacijskom modelu mogućnost procjene i dokazivanjapotpunost odnosa praktički korišteni jezici upita baze podataka, posebice jezik SQL. Kako bi se pokazalo da je SQL jezik relacijsko potpun, mora se pokazati da se bilo koji operator relacijske algebre može izraziti pomoću SQL-a. Zapravo, dovoljno je pokazati da se bilo koji od primitivnih relacijskih operatora može izraziti pomoću SQL-a. Slijede primjeri implementacije relacijskih operatora koristeći SQL jezik.

Sindikalni operater

Relacijska algebra: UNION B SQL izraz:

ODABERITE * IZ A

ODABIR * IZ B ;

Operator raskrižja

Relacijska algebra: A PRESJEK B

SQL izjava:

ODABIR A. POLJE1, A. POLJE2, ...,

IZ A, B

GDJE A. POLJE 1=B. POLJE1 I A. POLJE2=B. POLJE2 I …;

ODABERITE A.* IZ A, B

GDJE A.pk =B.pk;

operator oduzimanja

Relacijska algebra: A MINUS B SQL izraz:

ODABERITE * IZ A

GDJE A.pk NIJE IN (ODABERITE pk IZ B);

gdje su A.pk i B.pk primarni ključevi tablica A i B

Kartezijanski operater proizvoda

Relacijska algebra: A TIMES B SQL izjava:

IZ A, B;

ODABIR A. POLJE1, A. POLJE2, …, B. POLJE1, B. POLJE2, …

OD KRIŽA SPOJ B ;

operater projekcije

Relacijska algebra: SQL izjava:

ODABERITE RAZLIČITI X , Y , …, Z IZ A ;

Operator dohvaćanja

Relacijska algebra: A WHERE θ SQL izjava:

ODABERITE * IZ A

GDJE θ ;

θ-operator spajanja

Relacijska algebra: (A PUTA B) WHERE θ SQL izraz:

ODABIR A. POLJE1, A. POLJE2, …, B. POLJE1, B. POLJE2, …

IZ A, B

GDJE θ ;

ODABIR A. POLJE1, A. POLJE2, …, B. POLJE1, B. POLJE2, …

OD KRIŽA SPOJITE B GDJE θ;

operater podjele

Relacijska algebra: A(X,Y) DEVIDE BY B(Y) SQL naredba:

ODABIR DISTINCT A . X OD A

(ODABERI *

(ODABIR * IZ A A1

A1. X=A. X I A1. Y=B. Y));

Dakle, gornji izrazi dokazuju da je SQL jezik, poput relacijske algebre, relacijsko potpun.

Treba obratiti pažnju na činjenicu da ako u gornjim upitima u tablicama postoje NULL -vrijednosti (pogledajte odjeljak 9.1 u nastavku), onda svi gore navedeni upiti mogu raditi pogrešno, jer. NULL< >NULL i NULL = NULL su netočni.

To, međutim, ne opovrgava zaključak o relacijskoj potpunosti SQL-a, budući da NULL -vrijednosti nisu podržane relacijskim modelom.