Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows 7, XP
  • Ilustrovani SQL vodič za početnike. SQL "za lutke": ono što početnici trebaju znati

Ilustrovani SQL vodič za početnike. SQL "za lutke": ono što početnici trebaju znati

Leran2002 9. aprila 2015. u 12:31

Vodič za SQL jezik (DDL, DML) koristeći dijalekt MS SQL Servera kao primjer. Prvi dio

  • Microsoft SQL Server
  • SQL
  • tutorial

O čemu je ovaj tutorijal?

Ovaj tutorijal je nešto poput "pečata moje memorije" u SQL jeziku (DDL, DML), tj. to su informacije koje su se nakupile tokom mojih profesionalnih aktivnosti i koje se stalno pohranjuju u mojoj glavi. Ovo mi je dovoljan minimum koji se najčešće koristi pri radu sa bazama podataka. Ako se pojavi potreba za korištenjem potpunijih SQL konstrukcija, obično se za pomoć obraćam MSDN biblioteci koja se nalazi na Internetu. Po mom mišljenju, veoma je teško držati sve u glavi i nema posebne potrebe za tim. Ali poznavanje osnovnih konstrukcija je vrlo korisno, jer. oni su primenljivi skoro u istom obliku u mnogim relacionim bazama podataka kao što su Oracle, MySQL, Firebird. Razlike su uglavnom u tipovima podataka, koji se mogu razlikovati u detaljima. Ne postoji toliko mnogo osnovnih konstrukcija SQL jezika, a uz stalnu praksu brzo se pamte. Na primjer, za kreiranje objekata (tabele, ograničenja, indeksi itd.) dovoljno je imati pri ruci tekstualni uređivač okruženja (IDE) za rad sa bazom podataka, a nema potrebe za učenjem vizuelnog alata koji je izoštren za rad sa određenim tipom baze podataka (MS SQL, Oracle, MySQL, Firebird,…). Ovo je također zgodno jer vam je cijeli tekst pred očima i ne morate trčati kroz brojne kartice da biste kreirali, na primjer, indeks ili ograničenje. Kada se stalno radi s bazom podataka, kreiranje, modificiranje, a posebno ponovno kreiranje objekta pomoću skripti je mnogo puta brže nego ako se radi u vizualnom modu. Takođe u režimu skripte (odnosno, uz dužnu pažnju), lakše je postaviti i kontrolisati pravila za imenovanje objekata (moje subjektivno mišljenje). Osim toga, skripte su zgodne za korištenje kada promjene napravljene u jednoj bazi podataka (na primjer, testnoj) treba u istom obliku prenijeti 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 - ubacivanje novih podataka
    • AŽURIRANJE - 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 savladati samo u praksi, ako ga sami dodirnete i shvatite šta se dešava kada izvršite ovu ili onu konstrukciju.

Ovaj tutorijal je kreiran po principu Step by Step, tj. potrebno ga je čitati uzastopno i po mogućnosti odmah nakon primjera. Ali ako usput trebate detaljnije da naučite o komandi, onda koristite određenu pretragu na Internetu, na primjer, u MSDN biblioteci.

Kada sam pisao ovaj vodič, koristio sam bazu podataka MS SQL Server verzije 2014 i koristio sam MS SQL Server Management Studio (SSMS) za pokretanje skripti.

Ukratko o MS SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) je uslužni program za Microsoft SQL Server za konfigurisanje, 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 sa objektima i postavkama servera. Glavni alat SQL Server Management Studio-a je Object Explorer, koji omogućava korisniku da pregleda, preuzme i upravlja objektima servera. Ovaj tekst je djelimično pozajmljen sa Wikipedije.

Da kreirate novi uređivač skripte, koristite dugme Novi upit:

Za promjenu trenutne baze podataka, možete koristiti padajuću listu:

Da biste izvršili određenu naredbu (ili grupu naredbi), odaberite je i pritisnite tipku "Izvrši" ili tipku "F5". Ako u uređivaču trenutno postoji samo jedna naredba, ili ako trebate izvršiti sve naredbe, onda ne morate ništa birati.

Nakon izvršavanja skripti, posebno onih koje kreiraju objekte (tabele, kolone, indekse), da biste vidjeli promjene, koristite Refresh iz kontekstnog menija, naglašavajući odgovarajuću grupu (na primjer, Tabele), samu tablicu ili grupu Columns 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

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

DBMS - Sistem za upravljanje ovim bazama podataka, tj. ovo je skup alata za rad sa određenim tipom baze podataka (MS SQL, Oracle, MySQL, Firebird,...).

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

Tabela je kolekcija kolona. Kolone se takođe mogu zvati polja ili kolone, sve ove reči će se koristiti kao sinonimi, izražavajući istu stvar.

Tabela je glavni objekt RDB-a, svi RDB podaci se pohranjuju red po red u kolonama tabele. Linije, zapisi su također sinonimi.

Za svaku tabelu, kao i njene kolone, dati su nazivi po kojima se naknadno pozivaju.
Ime objekta (ime tablice, ime stupca, ime indeksa, itd.) u MS SQL-u može imati maksimalnu dužinu od 128 znakova.

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

SQL je jezik koji vam omogućava da postavljate upite bazi podataka kroz DBMS. U određenom DBMS-u, SQL jezik može imati specifičnu implementaciju (svoj vlastiti dijalekt).

DDL i DML su podskup SQL jezika:

  • DDL jezik se koristi za kreiranje i modifikovanje strukture baze podataka, tj. da kreirate/modifikujete/brišete tabele i relacije.
  • DML jezik vam omogućava da manipulišete podacima tabele, tj. sa njenim linijama. Omogućava vam da odaberete podatke iz tabela, dodate nove podatke u tabele i ažurirate i izbrišete postojeće podatke.

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

Komentar u jednom redu
i

/* višeredni komentar */

Zapravo, sve za teoriju ovoga će biti dovoljno.

DDL - Jezik definicije podataka (jezik opisa podataka)

Na primjer, razmotrite tabelu sa podacima o zaposlenima, u obliku poznatom osobi koja nije programer:

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

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

  • Broj osoblja - cijeli broj
  • puno ime - string
  • Datum rođenja - datum
  • Email - string
  • Pozicija - niz
  • odjeljenje - string
Tip kolone je karakteristika koja pokazuje kakvu vrstu podataka ova kolona 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 Notacija u MS SQL-u Opis
Žica promjenjive dužine varchar(N)
i
nvarchar(N)
Sa brojem N možemo odrediti maksimalnu moguću dužinu niza za odgovarajući stupac. Na primjer, ako želimo reći da vrijednost stupca "Name" može sadržavati najviše 30 znakova, onda trebamo postaviti njegov tip na nvarchar (30).
Razlika između varchar i nvarchar je u tome što varchar omogućava pohranjivanje nizova u ASCII formatu, gdje jedan znak zauzima 1 bajt, dok nvarchar pohranjuje nizove u Unicode formatu, gdje svaki znak zauzima 2 bajta.
Varchar tip bi se trebao koristiti samo ako ste 100% sigurni da polje neće morati pohraniti Unicode znakove. Na primjer, varchar se može koristiti za pohranjivanje adresa e-pošte jer obično sadrže samo ASCII znakove.
Žica fiksne dužine char(N)
i
nchar(N)
Ovaj tip se razlikuje od stringa varijabilne dužine po tome što ako je dužina stringa manja od N karaktera, onda se on uvek dodaje sa desne strane do dužine od N razmaka i pohranjuje u bazi podataka u ovom obliku, tj. u bazi podataka zauzima tačno N karaktera (gde jedan znak zauzima 1 bajt za char i 2 bajta za nchar). U mojoj praksi se ovaj tip vrlo rijetko koristi, a ako se koristi, onda se koristi uglavnom u char (1) formatu, tj. kada je polje definisano jednim znakom.
Integer int Ovaj tip nam omogućava da u koloni koristimo samo cijele brojeve, i pozitivne i negativne. Za referencu (sada nije toliko relevantno za nas) - opseg brojeva koji tip int dozvoljava 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 float Jednostavno rečeno, to su brojevi u kojima može biti prisutna decimalna točka (zarez).
datum datum Ukoliko je potrebno pohraniti samo Datum u kolonu, koja se sastoji od tri komponente: Broj, Mjesec i Godina. Na primjer, 15.02.2014. (15. februar 2014.). Ovaj tip se može koristiti za kolonu "Datum prijema", "Datum rođenja" itd., tj. u slučajevima kada nam je važno da popravimo 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 kolona treba da pohrani samo podatke o vremenu, tj. Sati, minute, sekunde i milisekunde. Na primjer, 17:38:31.3231603
Na primjer, dnevni “Flight Departure Time”.
datum i vrijeme datetime Ovaj tip vam omogućava da pohranite i datum i vrijeme u isto vrijeme. Na primjer, 15.02.2014. 5:38:31.323 PM
Na primjer, ovo može biti datum i vrijeme događaja.
Zastava bit 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 može biti navedena, za ovu svrhu se koristi ključna riječ NULL.

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

Jednostavnu bazu podataka (bez navođenja dodatnih parametara) možete kreirati pokretanjem sljedeće naredbe:

CREATE DATABASE Test
Možete obrisati bazu podataka naredbom (trebalo bi da budete veoma oprezni sa ovom komandom):

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

US Test
Alternativno, izaberite Test bazu podataka sa padajuće liste u oblasti SSMS menija. Na poslu često koristim ovu metodu prebacivanja između baza podataka.

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

CREATE TABLE [Zaposleni]([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 pogodnosti, bolje je navesti sva imena objekata na latinici 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 imenu možete koristiti i brojeve, na primjer, Broj telefona1.

Napomenu
U nekim DBMS, sljedeći format imena "PHONE_NUMBER" može biti poželjniji, na primjer, ovaj format se često koristi u ORACLE bazi podataka. Naravno, prilikom postavljanja 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 uglastih zagrada i izbrisati tabelu [Employees]:

DROP TABLE [Zaposleni]
Na primjer, tabela sa zaposlenicima se može nazvati "Zaposleni", a njena polja mogu dobiti sljedeća imena:

  • ID - Broj osoblja (ID zaposlenika)
  • Ime - puno ime
  • Rođendan - Datum rođenja
  • Email
  • Pozicija
  • Odjel - Odsjek
Vrlo često se riječ ID koristi za imenovanje polja identifikatora.

Sada kreirajmo našu tabelu:

CREATE TABLE Zaposleni(ID int, Ime nvarchar(30), Datum rođenja, Email nvarchar(30), Pozicija nvarchar(30), Odjel nvarchar(30))
Možete koristiti opciju NOT NULL da navedete potrebne stupce.

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

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

Napomenu
Generalni 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 (tu se mogu razlikovati ne samo njihova imena, već i detalji njihove implementacije), same specifičnosti implementacije SQL jezika također se mogu neznatno razlikovati (tj. komande 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 ćete morati razumjeti samo detalje implementacije naredbi u novom DBMS-u, tj. u većini slučajeva biće dovoljno samo povući analogiju.

Kreiranje tabele CREATE TABLE Employees(ID int, -- u ORACLE tipu int je ekvivalent (omotač) za broj(38) Ime nvarchar2(30), -- nvarchar2 u ORACLE je ekvivalentno nvarchar u MS SQL Datum rođenja, E-pošta nvarchar2 (30) , pozicija nvarchar2(30), odjel nvarchar2(30)); -- ažuriranje polja ID i Ime (ovdje se koristi MODIFY(…) umjesto ALTER COLUMN ALTER TABLE Zaposleni MODIFY(ID int NOT NULL,Naziv nvarchar2(30) NOT NULL); -- dodavanje PK-a (u ovom slučaju konstrukcija izgleda kao u MS SQL-u, biće prikazano ispod) ALTER TABLE Zaposleni DODAJ OGRANIČENJE PK_Employees PRIMARNI KLJUČ(ID);
Za ORACLE postoje razlike u pogledu implementacije tipa varchar2, njegovo kodiranje zavisi od podešavanja baze podataka i tekst se može sačuvati, na primer, u UTF-8 kodiranju. Osim toga, dužina 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 dužine polja, na primjer:

IME varchar2(30 BYTE) -- kapacitet polja će biti 30 bajtova NAME varchar2(30 CHAR) -- kapacitet polja će biti 30 karaktera
Koja opcija će se podrazumevano koristiti BYTE ili CHAR, u slučaju jednostavne specifikacije tipa varchar2(30) u ORACLE-u, zavisi od podešavanja baze podataka, takođe se ponekad može podesiti u IDE postavkama. Općenito, ponekad se lako možete zbuniti, pa u slučaju ORACLE-a, ako se koristi tip varchar2 (a to je ovdje ponekad opravdano, na primjer, kada se koristi UTF-8 kodiranje), radije pišem eksplicitno CHAR (jer obično je zgodnije čitati dužinu niza u znakovima).

Ali u ovom slučaju, ako već postoje neki podaci u tabeli, tada je za uspješno izvršenje naredbi potrebno da se popune polja ID i Name u svim redovima tabele. Hajde da to demonstriramo na primeru, ubacimo podatke u tabelu u polja ID, Pozicija i Odeljenje, to se može uraditi sa sledećom skriptom:

UMETNI VRIJEDNOSTI Zaposlenih(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 će također izbaciti grešku, jer prilikom umetanja nismo naveli vrijednost traženog polja Ime.
Da smo već imali ove podatke u originalnoj tabeli, 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 grešku poruku, da postoje NULL (nije specificirane) vrijednosti u polju Ime.

Dodajmo vrijednosti za polje Ime i ponovo popunimo podatke:


Takođe, opcija NOT NULL se može koristiti direktno prilikom kreiranja nove tabele, tj. u kontekstu naredbe CREATE TABLE.

Prvo izbrišite tabelu naredbom:

DROP TABLE Zaposleni
Sada kreirajmo tabelu sa obaveznim stupcima ID i Name:

CREATE TABLE Zaposleni(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 kolone, što će značiti da će NULL vrijednosti (nije navedene) biti dozvoljene u njemu, ali to nije neophodno, jer je ova karakteristika podrazumevano podrazumevana.

Ako, naprotiv, želite da postojeći stupac učinite opcijskim, tada koristite sljedeću sintaksu naredbe:

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

ALTER TABLE Zaposleni ALTER COLUMN Naziv nvarchar(30)
Pomoću ove naredbe također možemo promijeniti tip polja u drugi kompatibilan tip ili promijeniti njegovu dužinu. Na primjer, proširimo polje Ime na 50 znakova:

ALTER TABLE Zaposleni ALTER COLUMN Naziv nvarchar(50)

primarni ključ

Prilikom kreiranja tabele poželjno je da ima jedinstvenu kolonu ili skup kolona koji je jedinstven za svaki njen red – zapis se može jedinstveno identifikovati po ovoj jedinstvenoj vrednosti. Ova vrijednost se naziva primarni ključ tabele. Za našu tabelu Employees, ova jedinstvena vrijednost može biti kolona ID (koja 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 kreirati primarni ključ postojeće tabele koristeći naredbu:

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

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

ALTER TABLE ime_tablice DODAJ OGRANIČENJE ime_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đe, primarni ključ se može definisati direktno prilikom kreiranja tabele, tj. u kontekstu naredbe CREATE TABLE. Izbrišemo tabelu:

DROP TABLE Zaposleni
A zatim ga kreirajte koristeći sljedeću sintaksu:

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

INSERT Employees (ID,Pozicija,Odjel,Naziv) VRIJEDNOSTI (1000,N"Direktor",N"Administracija",N"Ivanov II.), (1001,N"Programer",N"IT",N" Petrov PP" ), (1002,N"Računovođa",N"Računovodstvo",N"Sidorov SS"), (1003,N"Viši programer",N"IT",N"Andrejev A.A.")
Ako se primarni ključ u tabeli sastoji od samo vrijednosti jedne kolone, tada se može koristiti sljedeća sintaksa:

CREATE TABLE Employees(ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, -- navedite kao karakteristiku polja Ime nvarchar(30) NOT NULL, Datum rođenja, Email nvarchar(30), Pozicija nvarchar(30), Odjel nvarchar(30)
U stvari, naziv ograničenja se može izostaviti, u kom slučaju će mu biti dodijeljen sistemski naziv (poput "PK__Employee__3214EC278DA42077"):

CREATE TABLE Zaposleni(ID int NOT NULL, Ime nvarchar(30) NOT NULL, Datum rođenja, Email nvarchar(30), Pozicija nvarchar(30), Odjel nvarchar(30), PRIMARNI KLJUČ(ID))
Ili:

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

ALTER TABLE Zaposleni DROP OGRANIČENJE PK_Employees
Ali takva kratka sintaksa, bez specificiranja imena ograničenja, zgodna je za korištenje prilikom kreiranja privremenih tablica baze podataka (ime privremene tablice počinje s # ili ##), koje će se nakon upotrebe izbrisati.

Hajde da sumiramo

Do sada smo pokrili sljedeće naredbe:
  • CREATE TABLE table_name (nabrajanje polja i njihovih tipova, ograničenja) - koristi se za kreiranje nove tabele u trenutnoj bazi podataka;
  • DROP TABLE table_name - koristi se za brisanje tabele iz trenutne baze podataka;
  • ALTER TABLE table_name ALTER COLUMN column_name … – koristi se za ažuriranje tipa kolone ili za promjenu njegovih postavki (na primjer, za postavljanje karakteristike NULL ili NOT NULL);
  • ALTER TABLE table_name DODAJ OGRANIČENJE constraint_name PRIMARNI KLJUČ(polje1, polje2,…) – dodavanje primarnog ključa postojećoj tabeli;
  • ALTER TABLE table_name DROP CONSTRAINT constraint_name - uklonite ograničenje iz tabele.

Malo o privremenim stolovima

Isječak iz MSDN-a. Postoje dvije vrste privremenih tabela u MS SQL Serveru: lokalne (#) i globalne (##). Lokalne privremene tabele vidljive su samo njihovim kreatorima sve dok se sesija veze sa instancom SQL Servera ne prekine kada se prvi put kreiraju. Lokalne privremene tabele se automatski brišu nakon što korisnik prekine vezu sa instancom SQL Servera. Globalne privremene tabele su vidljive svim korisnicima tokom bilo koje sesije povezivanja nakon što se ove tabele kreiraju i brišu se kada se svi korisnici koji pozivaju na ove tabele odvoje od instance SQL Servera.

Privremene tabele se kreiraju u bazi podataka sistema tempdb, tj. kreirajući ih, ne začepljujemo glavnu bazu podataka, inače su privremene tabele potpuno identične regularnim tabelama, takođe se mogu izbrisati pomoću naredbe DROP TABLE. Lokalne (#) privremene tabele se češće koriste.

Da kreirate privremenu tabelu, možete koristiti naredbu CREATE TABLE:

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

DROP TABLE #Temp

Također možete kreirati privremenu tablicu (kao i običnu tablicu) i odmah je popuniti podacima koje je vratio upit koristeći SELECT ... INTO sintaksu:

SELECT ID,Name INTO #Temp FROM Employees

Napomenu
U različitim DBMS, implementacija privremenih tabela može se razlikovati. Na primjer, u ORACLE i Firebird DBMS, struktura privremenih tabela mora biti unaprijed definirana naredbom CREATE GLOBAL TEMPORARY TABLE, ukazujući na 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 - razdvajanje u podtabele (direktorije) i određivanje odnosa

Naša trenutna tabela Employees ima nedostatak što korisnik može da unese bilo koji tekst u polja Pozicija i Odeljenje, što je pre svega bremenito greškama, jer za jednog zaposlenog može jednostavno označiti „IT“ kao odeljenje, a za drugog zaposlenog, za na primjer, unesite "IT odjel", imate treći "IT". Kao rezultat toga, neće biti jasno na šta je korisnik mislio, tj. Da li su ovi zaposleni radnici istog odjela ili je korisnik sam sebe opisao i to su 3 različita odjela? Štaviše, u ovom slučaju nećemo moći ispravno grupirati podatke za neki izvještaj, gdje će možda biti potrebno prikazati broj zaposlenih u kontekstu svakog odjela.

Drugi nedostatak je količina pohranjivanja ovih informacija i njihovo dupliciranje, tj. za svakog zaposlenog je naznačeno puno ime odeljenja, što zahteva mesto u bazi podataka za skladištenje svakog znaka iz naziva odeljenja.

Treći nedostatak je teškoća ažuriranja ovih polja ako se promijeni naziv pozicije, na primjer, ako trebate preimenovati poziciju “Programer” u “Junior programer”. U ovom slučaju, moraćemo da izvršimo promene u svakoj liniji tabele, u kojoj je pozicija jednaka "Programer".

Da bi se izbjegli ovi nedostaci, koristi se tzv. normalizacija baze podataka - cijepanje u podtabele, referentne tabele. Nije potrebno penjati se u džunglu teorije i proučavati šta su normalni oblici, dovoljno je razumjeti suštinu normalizacije.

Kreiramo 2 referentne tabele "Pozicije" i "Odseci", prva će se zvati Pozicije, a druga, respektivno, Odeljenja:

CREATE TABLE Positions(ID int IDENTITY(1,1) NOT NULL OGRANIČENJE PK_Pozicije PRIMARY KEY, Ime nvarchar(30) NOT NULL) CREATE TABLE Departments(ID int IDENTITY(1,1) NOT NULL OGRANIČENJE PK_Departments Name PRIMARY KcharEY(Departments Name PRIMARY KcharEY() ) NIJE NULL)
Imajte na umu da smo ovdje koristili novu opciju IDENTITY, što znači da će podaci u koloni ID biti automatski numerisani, počevši od 1, sa korakom od 1, tj. kada se dodaju novi zapisi, biće im uzastopno dodijeljene vrijednosti 1, 2, 3 itd. Takva polja se obično nazivaju automatskim povećanjem. Samo jedno polje sa svojstvom IDENTITY može biti definirano u tabeli i obično, ali ne nužno, takvo polje je primarni ključ za tu tablicu.

Napomenu
U različitim DBMS-ima implementacija polja sa brojačem može biti različita. U MySQL-u, na primjer, takvo polje je definirano pomoću opcije AUTO_INCREMENT. U ORACLE-u i Firebird-u, ova funkcionalnost je ranije mogla biti emulirana korištenjem SEQUENCE. Ali koliko ja znam, ORACLE je sada dodao opciju GENERIRANO KAO IDENTITET.

Popunimo ove tabele automatski, na osnovu trenutnih podataka zabeleženih u poljima Položaj i Odeljenje tabele Zaposleni:

Popunite polje Ime u tabeli Positions sa jedinstvenim vrijednostima iz polja Position u tabeli Employees INSERT Positions(Name) SELECT DISTINCT Position FROM Employees GDJE Pozicija NIJE NULL -- odbacite zapise bez specificirane pozicije
Isto ćemo uraditi i za tabelu Odjeljenja:

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

SELECT * FROM Positions

SELECT * FROM Departments

Ove tabele će sada igrati ulogu imenika za postavljanje pozicija i odeljenja. Sada ćemo se osvrnuti na ID poslova i odjela. Prije svega, napravimo nova polja u tabeli Employees za pohranjivanje ID podataka:

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

Također možete dodati nekoliko polja u tablicu odjednom pomoću jedne naredbe, navodeći polja odvojena zarezima:

ALTER TABLE Zaposleni DODAJ PositionID int, DepartmentID int
Sada napišemo linkove (referentna ograničenja - STRANI KLJUČ) za ova polja, tako da korisnik nema priliku da upisuje u ova polja, vrijednosti koje nisu među vrijednostima ID-a u direktorijima.

ALTER TABLE Zaposleni DODAJ OGRANIČENJE FK_Employees_PositionID STRANI KLJUČ(ID pozicije) REFERENCE Position(ID)
I isto ćemo uraditi za drugo polje:

ALTER TABLE Zaposleni DODAJ OGRANIČENJE FK_Employees_DepartmentID STRANI KLJUČ(ID odjela) REFERENCE Odjeljenja(ID)
Sada će korisnik u ova polja moći unijeti samo vrijednosti ID-a iz odgovarajuće referentne knjige. Shodno tome, da bi koristio novo odjeljenje ili poziciju, 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.

Ime referentnog ograničenja je obično složeno, sastoji se od prefiksa "FK_", praćenog imenom tabele, a iza donje crte dolazi ime polja koje se odnosi na identifikator tabele za pretraživanje.

Identifikator (ID) je obično interna vrijednost koja se koristi samo za relacije i koja je vrijednost tu pohranjena je u većini slučajeva apsolutno indiferentna, tako da nema potrebe pokušavati da se riješite rupa u nizu brojeva koji nastaju u tok rada sa tabelom, na primjer, nakon brisanja zapisa iz priručnika.

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

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

UPDATE e SET PositionID=(ODABIR ID IZ pozicija GDJE Ime=e.Pozicija), DepartmentID=(IZABIR ID IZ Odjela GDJE Naziv=e.Odjel) OD Zaposlenih e
Pogledajmo šta se dešava pokretanjem upita:

SELECT * FROM Employees

To je to, polja PositionID i DepartmentID su popunjena odgovarajućim pozicijama i odjelima sa ID-ovima potreba u poljima Position i Department u tabeli Employees, sada možete izbrisati ova polja:

ALTER TABLE Zaposleni DROP COLUMN Pozicija, odjel
Tabela sada izgleda ovako:

SELECT * FROM Employees

ID Ime rođendan Email PositionID DepartmentID
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

One. 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 tabelama 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 datu tablicu. Odavde također možete vršiti razne manipulacije s ovim objektima - na primjer, preimenovati ili izbrisati objekte.

Također je vrijedno napomenuti da se tabela može odnositi na sebe, tj. možete kreirati rekurzivnu vezu. Na primjer, dodajmo još jedno polje ManagerID u našu tabelu sa zaposlenima, koje će ukazivati ​​na zaposlenika kome ovaj zaposlenik odgovara. Kreirajmo polje:

ALTER TABLE Zaposleni DODAJ ID menadžera int
U ovom polju je dozvoljena vrijednost NULL, polje će biti prazno ako, na primjer, nema nadređenog nad zaposlenikom.

Sada kreirajmo STRANI KLJUČ u tabeli Zaposleni:

ALTER TABLE Zaposleni DODAJ OGRANIČENJE FK_Employees_ManagerID STRANI KLJUČ (ID menadžera) REFERENCE Zaposleni(ID)
Kreirajmo sada dijagram i vidimo kako na njemu izgledaju odnosi između naših tabela:

Kao rezultat, trebali bismo vidjeti sljedeću sliku (tabela Zaposleni je povezana sa tabelama 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 tabeli za pretraživanje. Ako ove opcije nisu specificirane, onda ne možemo promijeniti ID u tabeli direktorija unosa koji ima veze iz druge tablice, niti možemo izbrisati takav unos iz direktorija dok ne izbrišemo sve redove koji se odnose na ovaj unos ili, hajde da ažurirati ove linije referenci na drugu vrijednost.

Na primjer, hajde da ponovo kreiramo tabelu sa opcijom ON DELETE CASCADE za FK_Employees_DepartmentID:

DROP TABLE Employees CREATE TABLE Employees(ID int NOT NULL, Ime nvarchar(30), Datum rođenja, Email nvarchar(30), PositionID int, DepartmentID int, ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID_part_department), CONSTRAID KEYFOR_DE_part ) REFERENCE Odjeljenja(ID) ON DELETE CASCADE, OGRANIČENJA FK_Employees_PositionID STRANJI KLJUČ(PositionID) REFERENCE Positions(ID), OGRANIČENJA FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES_POSITIONID STRANI KLJUČ(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES_POSITIONID,EmployeIDes,EmployeID,EmployeID,EmployeID,EmployeID,Name )VRIJEDNOSTI (1000,N"Ivanov II","19550219",2,1,NULL), (1001,N"Petrov PP","19831203",3,3,1003), (1002 ,N"Sidorov SS" ,"19760607",1,2,1000), (1003,N"Andrejev AA","19820417",4,3,1000)
Uklonimo odjel sa ID 3 iz tabele odjela:

IZBRIŠI Odjele GDJE ID=3
Pogledajmo podatke u tabeli Zaposleni:

SELECT * FROM Employees

ID Ime rođendan Email PositionID DepartmentID ID menadžera
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 odjeljenje 3 su također izbrisani iz tabele Zaposleni.

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

AŽURIRANJE Odjela SET ID=30 GDJE ID=3
Glavna stvar je razumjeti suštinu 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 tabele, to može dovesti do velikih problema i stvoriti lančanu reakciju.

Vratimo odjeljenje 3:

Dajte dozvolu 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 koristeći naredbu TRUNCATE TABLE:

TRUNCATE TABLE Zaposleni
I opet, ponovo učitajte podatke u njega koristeći prethodnu INSERT naredbu:

INSERT Employees (ID,Ime, 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 SS","19760607",1,2,1000), (1003,N"Andrejev AA","19820417" ,4,3,1000)

Hajde da sumiramo

Trenutno nam je dodano još nekoliko DDL komandi:
  • Dodavanje svojstva IDENTITY u polje - omogućava vam da ovo polje automatski popunite (polje brojača) za tabelu;
  • ALTER TABLE table_name DODATI list_of_fields_with_characteristics – omogućava vam da dodate nova polja u tabelu;
  • ALTER TABLE table_name DROP COLUMN list_of_fields - omogućava vam da uklonite polja iz tabele;
  • ALTER TABLE table_name DODAJ OGRANIČENJE constraint_name STRANI KLJUČ(polja) REFERENCE lookup_table(fields) – omogućava vam da definirate odnos između tabele i tabele za pretraživanje.

Ostala ograničenja - UNIQUE, DEFAULT, CHECK

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

UPDATE Employees SET Email=" [email protected]"GDJE ID=1000 AŽURIRAJ Postavi zaposlenih Email=" [email protected]" GDJE ID=1001 AŽURIRANJE Zaposleni SET Email="s.sidor [email protected]"GDJE ID=1002 AŽURIRAJ Postavi zaposlenih Email=" [email protected]" GDJE ID=1003
A sada možete nametnuti jedinstveno ograničenje na ovo polje:

ALTER TABLE Zaposleni DODAJ OGRANIČENJE UQ_Employees_Email UNIQUE(Email)
Sada korisnik neće moći da unese isti e-mail za više zaposlenih.

Ograničenje jedinstvenosti obično se naziva na sljedeći način - prvo dolazi prefiks "UQ_", zatim naziv tabele, a iza donje crte je naziv polja na koje se ovo ograničenje primjenjuje.

Prema tome, ako kombinacija polja treba da bude jedinstvena u kontekstu redova tabele, onda ih navodimo odvojene zarezima:

ALTER TABLE ime_tablice DODAJ OGRANIČENJE ime_ograničenja UNIQUE(polje1,polje2,…)
Dodavanjem DEFAULT ograničenja u polje, možemo postaviti zadanu vrijednost koja će biti zamijenjena ako polje nije navedeno na listi naredbi INSERT kada se umetne novi zapis. Ovo ograničenje se može postaviti direktno prilikom kreiranja tabele.

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

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

ALTER TABLE Zaposleni DODAJTE ZADANO SYSDATETIME() ZA Datum zapošljavanja
Ovdje nisam naveo naziv ograničenja, jer u slučaju DEFAULT smatrao sam da to nije toliko kritično. Ali ako to radiš na dobar način, onda, mislim, ne trebaš biti lijen i trebao bi postaviti normalno ime. To se radi na sljedeći način:

ALTER TABLE Zaposleni DODAJ OGRANIČENJE DF_Employees_HireDate DEFAULT SYSDATETIME() ZA Datum zapošljavanja
Pošto ova kolona ranije nije postojala, kada se doda svakom zapisu, trenutna vrijednost datuma će biti umetnuta u polje HireDate.

Prilikom dodavanja novog unosa automatski će se ubaciti i trenutni datum, naravno, ako ga izričito ne podesimo, tj. nije navedeno u listi kolona. Pokažimo to na primjeru bez navođenja polja HireDate na listi dodanih vrijednosti:

INSERT Employees(ID,Ime,Email)VALUES(1004,N"Sergeev S.S."," [email protected]")
Da vidimo šta se desilo:

SELECT * FROM Employees

ID Ime rođendan Email PositionID DepartmentID ID menadžera HireDate
1000 Ivanov I.I. 1955-02-19 [email protected] 2 1 NULL 2015-04-08
1001 Petrov P.P. 1983-12-03 [email protected] 3 4 1003 2015-04-08
1002 Sidorov S.S. 1976-06-07 [email protected] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [email protected] 4 3 1000 2015-04-08
1004 Sergejev S.S. NULL [email protected] NULL NULL NULL 2015-04-08

Ograničenje provjere CHECK se koristi kada je potrebno provjeriti vrijednosti unesene 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 Zaposleni DODAJ OGRANIČENJE CK_Employees_ID PROVJERA (ID IZMEĐU 1000 I 1999)
Ograničenje se obično zove isto, prvo sa prefiksom "CK_", zatim imenom tabele i imenom polja na koje se ograničenje primenjuje.

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

INSERT Employees(ID,Email) VALUES(2000," [email protected]")
Sada promijenimo vrijednost koju treba umetnuti na 1500 i provjeriti je li zapis umetnut:

INSERT Employees(ID,Email) VALUES(1500," [email protected]")
Također možete kreirati UNIQUE i CHECK ograničenja bez navođenja imena:

ALTER TABLE Zaposleni DODAJTE UNIQUE(Email) ALTER TABLE Zaposleni DODAJTE PROVERU (ID IZMEĐU 1000 I 1999)
Ali to nije dobra praksa i bolje je eksplicitno navesti naziv ograničenja, jer da kasnije shvatite šta će biti teže, moraćete da otvorite objekat i vidite za šta je odgovoran.

Uz dobro ime, mnogo informacija o ograničenju može se naučiti direktno iz njegovog imena.

I, shodno tome, sva ova ograničenja mogu se kreirati odmah prilikom kreiranja tabele, ako ona već ne postoji. Izbrišemo tabelu:

DROP TABLE Zaposleni
I ponovo ga kreirajte sa svim stvorenim ograničenjima jednom naredbom CREATE TABLE:

CREATE TABLE Employees(ID int NOT NULL, Ime nvarchar(30), Datum rođendana, Email nvarchar(30), PositionID int, DepartmentID int, Datum HireDate NOT NULL DEFAULT SYSDATETIME(), -- za DEFAULT ću baciti Ograničenje PK_Em KEY izuzetak (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Odjeli(ID), CONSTRAINT FK_Employees_PositionID STRANI KLJUČ(PositionID) REFERENCES Positions(ID), CONSTRAINT UQE_Employees_DepartmentID (ID odjela) REFERENCES Odjeljenja(ID), CONSTRAINT FK_Employees_PositionID STRANI KLJUČ(PositionID) REFERENCES Positions(ID), CONSTRAINT UQE_Employees_DepartmentID (ID_Odjela) REFERENCES Odjeljenja(ID), CONSTRAINT FK_Employees_PositionID STRANI KLJUČ(PositionID) REFERENCES Positions(ID), CONSTRAINT UQE_Employees_DepartmentID (ID_ODJELA) (CONSTRAINT UQE_Employees_UNIQUEES_0m)

INSERT Employees (ID, Name, Birthday, Email, PositionID, DepartmentID)VRIJEDNOSTI (1000,N"Ivanov I.I.","19550219"," [email protected]",2,1), (1001,N"Petrov P.P.","19831203"," [email protected]",3,3), (1002,N"Sidorov S.S.","19760607"," [email protected]",1,2), (1003,N"Andrejev A.A.","19820417"," [email protected]",4,3)

Malo o indeksima kreiranim prilikom kreiranja PRIMARY KEY i UNIQUE ograničenja

Kao što možete vidjeti na slici iznad, prilikom kreiranja PRIMARY KEY i UNIQUE ograničenja automatski su kreirani indeksi sa istim imenima (PK_Employees i UQ_Employees_Email). Po defaultu, indeks za primarni ključ je kreiran kao CLUSTERED, a za sve ostale indekse kao NENCLUSTERED. Vrijedi reći da koncept klasteriziranog indeksa nije dostupan u svim DBMS-ima. Tablica može imati samo jedan CLUSTERED indeks. CLUSTERED - znači da će zapisi tabele biti sortirani po ovom indeksu, takođe se može reći da ovaj indeks ima direktan pristup svim podacima tabele. To je tako reći glavni indeks tabele. Da još grublje kažemo, to je indeks pričvršćen za sto. 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 prilikom kreiranja primarnog ključa moramo navesti opciju NONCLUSTERED:

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

ALTER TABLE Zaposleni DROP OGRANIČENJE PK_Employees ALTER TABLE Zaposleni DROP OGRANIČENJE UQ_Employees_Email
A sada ih kreirajmo sa opcijama CLUSTERED i NONCLUSTERED:

ALTER TABLE Zaposleni DODAJ OGRANIČENJE PK_Employees PRIMARNI KLJUČ NEKLASTERIRAN (ID) ALTER TABLE Zaposleni DODAJ OGRANIČENJE UQ_Employees_E-pošta UNIQUE CLUSTERED (Email)
Sada, kada odaberemo iz tabele Employees, možemo vidjeti da su zapisi sortirani prema grupisanom indeksu UQ_Employees_Email:

SELECT * FROM Employees

ID Ime rođendan Email PositionID DepartmentID HireDate
1003 Andreev A.A. 1982-04-17 [email protected] 4 3 2015-04-08
1000 Ivanov I.I. 1955-02-19 [email protected] 2 1 2015-04-08
1001 Petrov P.P. 1983-12-03 [email protected] 3 3 2015-04-08
1002 Sidorov S.S. 1976-06-07 [email protected] 1 2 2015-04-08

Prije toga, kada je klasterizirani indeks bio indeks PK_Employees, zapisi su po defaultu bili sortirani prema ID polju.

Ali u ovom slučaju ovo je samo primjer koji pokazuje suštinu klasteriranog indeksa, jer. najvjerovatnije će se upiti u tablicu Employees vršiti po ID polju, au nekim slučajevima ono može i samo djelovati kao referenca.

Za direktorije je obično preporučljivo da se klasterirani indeks gradi na primarnom ključu, jer u zahtjevima se često pozivamo na identifikator imenika da bismo dobili, na primjer, ime (Pozicija, Odjeljenje). Ovdje se prisjećamo onoga o čemu sam pisao gore, da klasterirani indeks ima direktan pristup redovima tabele, a iz toga slijedi da možemo dobiti vrijednost bilo koje kolone bez dodatnih troškova.

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

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

Hajde da sumiramo

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...":
  • PRIMARNI KLJUČ- primarni ključ;
  • STRANI KLJUČ- postavljanje veza i praćenje referentnog integriteta podataka;
  • UNIQUE- omogućava stvaranje jedinstvenosti;
  • CHECK- omogućava vam da izvršite ispravnost unesenih podataka;
  • DEFAULT– omogućava vam da postavite zadanu vrijednost;
  • Također je vrijedno napomenuti da se sva ograničenja mogu ukloniti pomoću naredbe " ALTER TABLE table_name DROP CONSTRAINT ime_ograničenja".
Djelomično smo se dotakli i teme indeksa i analizirali koncept klastera ( CLUSTERED) i negrupisani ( NONCLUSTERED) indeks.

Kreiranje samostalnih indeksa

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

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

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

KREIRAJTE JEDINSTVEN NEKLASTERIRAN INDEKS UQ_Employees_EmailDesc NA Employees(Email DESC)
Prilikom kreiranja neklasteriranog indeksa, opcija NONCLUSTERED se može izostaviti, kao podrazumevano je podrazumevano, prikazan je ovde samo da bi se označila pozicija opcije CLUSTERED ili NONCLUSTERED u naredbi.

Indeks možete ukloniti sljedećom naredbom:

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

Na primjer, hajde da ponovo izbrišemo tabelu:

DROP TABLE Zaposleni
I ponovo ga kreirajte sa svim kreiranim ograničenjima i indeksima jednom naredbom CREATE TABLE:

CREATE TABLE Employees(ID int NOT NULL, Ime nvarchar(30), Datum rođendana, Email nvarchar(30), PositionID int, DepartmentID int, Datum zapošljavanja NOT NULL OGRANIČENJE DF_Employees_HireDate DEFAULT SYSDATEtTIME(),m.Employees_HireDate DEFAULT SYSDATEtTIME(),m. ), Ograničenje FK_EMPLUSEESEEES_DEPARTMENTNI OGLASI (ID), ograničenje FK_EMPLATNOSTI (pozicioni kliker (pozicioni kliker, ograničenje FK_EMPLATNOSTI (ID), reference (ID), ograničenje uq_employeee_email uniq provjera (ID između 1000 i 1999), INDEX IDX_Ime zaposlenih_(ime))
Na kraju u tabelu naših zaposlenih unesite:

INSERT Employees (ID,Ime, Birthday,Email,PositionID,DepartmentID,ManagerID)VRIJEDNOSTI (1000,N"Ivanov II","19550219"," [email protected]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [email protected]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [email protected]",1,2,1000), (1003,N"Andrejev A.A.","19820417"," [email protected]",4,3,1000)
Osim toga, vrijedno je napomenuti da se vrijednosti mogu uključiti u neklasterirani indeks tako što ćete ih navesti u INCLUDE. One. u ovom slučaju, indeks INCLUDE će donekle podsjećati na klasterirani indeks, samo što sada indeks nije vezan za tablicu, ali su potrebne vrijednosti pridružene indeksu. U skladu s tim, takvi indeksi mogu uvelike poboljšati performanse 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 ovo prirodno povećava veličinu indeksa, jer vrijednosti navedenih polja se dupliraju u indeksu.

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

CREATE [JEDINSTVENI] [KLASTERIRAN | NONCLUSTERED ] INDEX index_name UKLJUČENO (kolona [ ASC | DESC ] [ ,...n ]) [ UKLJUČITI (naziv_kolone [ ,...n ]) ]

Hajde da sumiramo

Indeksi mogu povećati brzinu preuzimanja podataka (SELECT), ali indeksi smanjuju brzinu ažuriranja podataka tablice, jer nakon svake modifikacije, sistem će morati ponovo izgraditi sve indekse za određenu tabelu.

Poželjno je u svakom slučaju pronaći optimalno rješenje, zlatnu sredinu, kako bi i učinak uzorkovanja i modifikacija podataka bili na odgovarajućem nivou. Strategija za kreiranje indeksa i njihov broj mogu zavisiti od mnogih faktora, kao što je koliko se često menjaju podaci u tabeli.

Zaključak o DDL-u

Kao što vidite, DDL jezik nije tako komplikovan kao što se čini na prvi pogled. Ovdje sam mogao pokazati gotovo sve njegove glavne dizajne, koristeći samo tri tabele.

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

Sretno u savladavanju ovog divnog jezika koji se zove SQL.

Klijentski programi

TFTP protokol

TFTP- također FTP protokol, ali preko UDP protokola (tj. protokol bez garantirane isporuke). Može se koristiti u lokalnoj mreži gdje je brzina prijenosa važnija. Rijetko se koristi u praksi.

FTP- Program se pokreće iz komandne linije.

Windows Commander- može raditi kao FTP klijent. Omogućuje vam da radite s udaljenim direktorijima na isti način kao i s lokalnim direktorijima.

NetVampire- Specijalizirani FTP klijent koji vam omogućava preuzimanje velikih datoteka i preuzimanje preko loših kanala.

SQL (Structured Query Language) je strukturirani jezik upita za relacijske baze podataka. Ovaj jezik se može koristiti za formulisanje izraza (upita) koji izdvajaju potrebne podatke, modificiraju ih, kreiraju tabele i mijenjaju njihove strukture, određuju prava pristupa podacima i još mnogo toga.

Upite izvršava sistem za upravljanje bazom podataka (DBMS). Ako niste stručnjak za razvoj i administraciju baze podataka, onda ste možda njihov korisnik koji pregledava i/i mijenja podatke u postojećim tabelama. U mnogim slučajevima, ove i druge operacije baze podataka se izvode pomoću posebnih aplikacija koje pružaju korisničko sučelje. Obično su aplikacije napisane u posebnim programskim jezicima (C, Pascal, Visual Basic, itd.) i najčešće se kreiraju korištenjem integriranih razvojnih okruženja, kao što su Delphi, C++ Builder, itd. Međutim, možete pristupiti bazi podataka bez njih - koristeći samo SQL. Također treba napomenuti da specijalizirane aplikacije obično koriste fragmente SQL koda prilikom pristupa bazi podataka.

Dakle, SQL je široko prihvaćen standardni jezik za rad sa relacionim bazama podataka. Sintaksa ovog jezika je dovoljno jednostavna da je mogu koristiti obični korisnici, a ne samo programeri. U današnje vrijeme, tipičan korisnik računara trebao bi biti iskusan barem sa uređivačem teksta (npr. Microsoft Word) i tabelama (npr. Microsoft Excel). Nije loše ako i on zna da koristi baze podataka. Postoji mnogo različitih DBMS-a, ali postoji samo jedan univerzalni alat za rad sa bazama podataka - SQL. Poznavanje SQL-a, barem njegovih osnova, i sposobnost njegovog korištenja za pretraživanje i analizu podataka je fundamentalni dio kompjuterske pismenosti, čak i za obične korisnike.

Prvi razvoj sistema za upravljanje relacionim bazama podataka (relacioni DBMS) izveden je u IBM-u ranih 1970-ih. Istovremeno je kreiran i jezik podataka koji je dizajniran da radi u ovim sistemima. Eksperimentalna verzija ovog jezika nazvana je SEQUEL - sa engleskog. Structured English QUEry Language (strukturirani engleski jezik upita). Međutim, službena verzija se zvala kraće - SQL (Structured Query Language). Preciznije, SQL je podjezik podataka, budući da DBMS sadrži druge jezičke mogućnosti.

1981. IBM izdaje SQL/DS relacijski DBMS. Do tog vremena, Relation Software Inc. (danas je to Oracle Corporation) je već objavio svoj relacijski DBMS. Ovi proizvodi su odmah postali standard za sisteme upravljanja bazama podataka. Ovi proizvodi su također uključivali SQL, koji je postao de facto standard za podjezike podataka. Proizvođači drugih DBMS-ova objavili su vlastite verzije SQL-a. Oni nisu imali samo osnovne karakteristike IBM proizvoda. Da bi dobili neku prednost za "njihov" DBMS, dobavljači su uveli neke SQL ekstenzije. Istovremeno je započeo rad na stvaranju općepriznatog SQL standarda.

Godine 1986., Američki nacionalni institut za standarde (ANSI) izdao je službeni SQL-86 standard, koji je ažuriran 1989. i postao SQL-89. Godine 1992. ovaj standard je nazvan SQL-92 (ISO/IEC 9075:1992). Najnovija verzija SQL standarda je SQL:2003 (ISO/IEC 9075X:2003).

Svaka implementacija SQL-a u određenom DBMS-u donekle se razlikuje od standarda koji je deklarirao proizvođač. Dakle, mnogi DBMS (na primjer, Microsoft Access 2003, PostgreSQL 7.3) ne podržavaju u potpunosti SQL-92, već samo uz određeni nivo usklađenosti. Osim toga, oni također podržavaju elemente koji nisu uključeni u standard. Međutim, DBMS programeri nastoje osigurati da nove verzije svojih proizvoda budu u skladu sa SQL standardom što je više moguće.

Pažnja. Ovaj vodič opisuje elemente SQL2003, od kojih nisu svi podržani od strane postojećih DBMS-ova. Prije nego što ih primijenite u praksu, trebali biste se uvjeriti da će raditi u vašem DBMS-u. To se može naći u tehničkoj dokumentaciji. Većina opisanih elemenata odgovara ranijim verzijama SQL-a, posebno široko rasprostranjenom SQL-92.

SQL je zamišljen kao jednostavan jezik upita za relacionu bazu podataka, blizak prirodnom (tačnije engleskom) jeziku. Bliskost oblika prirodnom jeziku trebala je učiniti SQL alatom dostupnim za široku upotrebu običnih korisnika baza podataka, a ne samo programera. Izvorno, SQL nije sadržavao nijednu od kontrolnih struktura koje se nalaze u konvencionalnim programskim jezicima. Zahtjevi, čija je sintaksa prilično jednostavna, unosili su se direktno iz konzole jedan za drugim i izvršavali istim redoslijedom. Međutim, SQL nikada nije postao alat za bankare, prodavce avionskih i željezničkih karata, ekonomiste i druge zaposlenike raznih firmi koji koriste informacije pohranjene u bazama podataka. Za njih se jednostavan SQL pokazao previše komplikovanim i nezgodnim, uprkos njegovoj blizini prirodnom jeziku pitanja.

U praksi, baza podataka se obično radi kroz aplikacije koje su programeri napisali na proceduralnim jezicima, kao što su C, Visual Basic, Pascal, Java, itd. Aplikacije se često kreiraju u posebnim okruženjima za vizuelni razvoj kao što su Delphi, Microsoft Access, Visual dBase, itd. Istovremeno, programer aplikacije praktično ne mora pisati programske kodove, jer razvojni sistem to radi umjesto njega. U svakom slučaju, rad sa programskim kodom je minimalan. Ove aplikacije imaju grafičko sučelje prilagođeno korisniku koje ne prisiljava korisnika da direktno unese SQL upite. Umjesto toga, aplikacija to radi. Međutim, aplikacija može ili ne mora koristiti SQL za pristup bazi podataka. SQL nije jedini, iako vrlo efikasan, način dobijanja, dodavanja i mijenjanja podataka, a ako je moguće koristiti ga u aplikaciji, onda to treba učiniti.

Relacijske baze podataka mogu postojati i postoje neovisno o aplikacijama koje pružaju korisničko sučelje. Ako iz nekog razloga ne postoji takav interfejs, onda se bazi podataka može pristupiti pomoću SQL-a, pomoću konzole ili neke aplikacije sa kojom se možete povezati na bazu podataka, uneti i poslati SQL upit (na primer Borland SQL Explorer).

SQL jezik se smatra deklarativnim (deskriptivnim) jezikom, za razliku od jezika na kojima su programi napisani. To znači da SQL izrazi opisuju šta treba učiniti, a ne kako.

Na primjer, da biste iz tabele zaposlenih odabrali podatke o imenima i pozicijama zaposlenih u odjeljenju 102, dovoljno je izvršiti sljedeći upit:

SELECT Prezime, Pozicija FROM Zaposlenih GDJE Odjeljenje=102;

Na ruskom, ovaj izraz zvuči ovako:

SELECT Prezime, pozicija OD Zaposleni DA JE TO Odjel = 102;

Za promjenu vrijednosti " Ivanov " na " Petrov " kolona Prezime , samo pokrenite sljedeći upit:

AŽURIRAJ Zaposleni SET Prezime="Petrov" WHERE Prezime="Ivanov";

Na ruskom, ovaj izraz izgleda ovako:

UPDATE Zaposleni PODEŠAVANJEM Prezime JEDNAKO" Petrov „GDJE Prezime = "Ivanov" ;

Ne morate detaljno opisivati ​​radnje koje DBMS mora izvršiti da bi iz tabele izabrao podatke navedene u upitu. Jednostavno opišete šta želite da dobijete. Kao rezultat izvršenja upita, DBMS vraća tablicu koja sadrži podatke koje ste tražili. Ako u bazi podataka nema podataka koji odgovaraju upitu, tada će biti vraćena prazna tabela.

Međutim, nedavne verzije SQL-a podržavaju kontrolne izraze izračunavanja koji su izvorni proceduralnim kontrolnim jezicima (uvjetni skok i izrazi petlje). Stoga, SQL sada nije čisto deklarativni jezik.

Osim dohvaćanja, dodavanja, mijenjanja i brisanja podataka iz tabela, SQL vam omogućava da izvršite sve potrebne radnje za kreiranje, izmjenu i sigurnost baza podataka. Sve ove karakteristike su raspoređene između tri SQL komponente:

· DML (Jezik za manipulaciju podacima - jezik za manipulaciju podacima ) je dizajniran da podrži bazu podataka: odaberite ( SELECT ), dodaci ( INSERT ), promjene ( UPDATE ) i uklanjanje ( IZBRIŠI ) podaci iz tabela. Ovi operatori (naredbe) mogu sadržavati izraze, uključujući i one koji se izračunavaju, kao i potupite - upite sadržane u drugom upitu. Općenito, izraz upita može biti toliko složen da ne možete odmah reći šta radi. Međutim, složeni upit se može mentalno rastaviti na dijelove koje je lakše analizirati. Slično tome, složeni upiti se grade od relativno lako razumljivih izraza (potupita).

· DDL (Jezik definicije podataka - jezik definicije podataka ) je dizajniran za kreiranje, modificiranje i brisanje tablica i cijele baze podataka. Primjeri iskaza uključenih u DDL su CREATE TABLE (kreirajte tabelu)," CREATE VIEW (kreiraj pogled) CREATE SHEMA (kreirajte šemu) ALTER TABLE (stol za presvlačenje), DROP (ukloni) itd.

· DCL (Jezik kontrole podataka - jezik upravljanja podacima ) je dizajniran da zaštiti bazu podataka od raznih vrsta oštećenja. DBMS automatski pruža određenu zaštitu podataka. Međutim, u nekim slučajevima treba uzeti u obzir dodatne mjere koje pruža DCL.

U ovom poglavlju...

  • Šta je SQL
  • SQL Misconceptions
  • Pogled na različite SQL standarde
  • Uvod u standardne SQL naredbe i rezervirane riječi
  • Predstavljanje brojeva, simbola, datuma, vremena i drugih vrsta podataka
  • Null vrijednosti i ograničenja
  • Korištenje SQL-a u sistemu klijent/server
  • SQL na webu

SQL je fleksibilan jezik koji se može koristiti na razne načine. To je najčešći alat koji se koristi za komunikaciju s relacijskom bazom podataka. U ovom poglavlju objasniću šta SQL jeste, a šta nije, posebno po čemu se SQL razlikuje od drugih tipova računarskih jezika. Tada ćete upoznati naredbe i tipove podataka koje standardni SQL podržava. Osim toga, objasnit ću osnovne koncepte kao što su nedefinisane vrednosti i ograničenja. Na kraju će biti dat pregled kako se SQL uklapa u klijent/server okruženje, kao i na Internet i intranete organizacija.

Šta SQL jeste, a šta nije

Prva stvar koju treba razumjeti o SQL-u je da on nije a proceduralni kao što su FORTRAN, Basic, C, COBOL, Pascal i Java. Da biste riješili problem koristeći jedan od ovih proceduralnih jezika, morate napisati proceduru koja izvodi navedene operacije jednu za drugom dok se zadatak ne završi. Procedura može biti linearna sekvenca ili sadržavati grane, ali u svakom slučaju programer specificira redoslijed izvršavanja.

Drugim riječima, SQL je neproceduralno jezik. Da ga koristite za rješavanje problema, recite SQL-u, sta tacno trebaš kao da razgovaraš sa duhom iz Aladinove lampe. I ne moraš da kažeš kako dobiti ono što želiš za sebe. Sistem za upravljanje bazom podataka (DBMS) će sam odlučiti kako najbolje ispuniti vaš zahtjev.

U redu. Upravo sam rekao da SQL nije proceduralni jezik. U suštini, ovo je tačno. Međutim, milioni programera (a možda ste i vi jedan od njih) navikli su rješavati probleme proceduralno, tako da je posljednjih godina bio veliki pritisak da se dodaju neke proceduralne karakteristike u SQL. Stoga, nova verzija SQL specifikacije, SQL:2003, sada uključuje funkcije proceduralnog jezika kao što su BEGIN blokovi, uvjetni IF izrazi, funkcije i procedure. Sa ovim novim funkcijama, programi se mogu pohraniti na server tako da ih mnogi korisnici mogu ponovo koristiti.

Da ilustrujem šta sam mislio kada sam rekao "reci sistemu šta tačno želiš", recimo da imate tabelu ZAPOSLENI sa podacima o zaposlenima i iz nje želite da izaberete sve redove koji odgovaraju svim "starijim" zaposlenima. "Stariji" radnici mogu značiti svakoga ko je stariji od 40 godina ili koji zarađuje više od 60.000 dolara godišnje. Odabir koji vam je potreban možete napraviti pomoću sljedećeg upita:

BIRAJTE * OD ZAPOSLENIKA GDE JE GOD >40 ILI PLATA >60000;

Ovaj izraz bira iz tablice EMPLOYEE sve redove u kojima je ili vrijednost stupca AGE (dob) veća od 40 ili vrijednost u stupcu SALARY (plata) veća od 60000. SQL sam zna kako odabrati informacije. Mehanizam baze podataka provjerava bazu podataka i sam odlučuje kako bi se upit trebao izvršiti. Sve što se od vas traži je da navedete koji su vam podaci potrebni.

Zapamtite:
Upit je pitanje koje postavljate bazi podataka. Ako bilo koji od njegovih podataka zadovoljava uvjete vašeg upita, onda vam ga SQL prosljeđuje
.

Modernim implementacijama SQL-a nedostaju mnoge jednostavne programske konstrukcije koje su fundamentalne za većinu drugih jezika. Svakodnevne aplikacije obično zahtijevaju barem neke od ovih konstrukcija, tako da je SQL zaista podjezik podaci. Čak i sa dodacima koji su se pojavili u SQL-u zajedno sa standardom SQL: 1999 i dodatnim proširenjima dodatim u SQL: 2003, i dalje morate koristiti jedan od programskih jezika sa SQL-om, kao što je C, na primjer, za kreirajte kompletnu aplikaciju.

Možete odabrati informacije iz baze podataka na jedan od sljedećih načina.

  • Sa jednim neprogramabilnim zahtjevom sa kompjuterske konzole, unošenjem SQL komande i čitanjem rezultata njenog izvršenja na ekranu. Konzola je tradicionalni izraz za računarski hardver koji obavlja posao tastature i ekrana koji se koriste u današnjim računarima. Zahtjevi konzole su korisni kada vam je potreban brz odgovor na određeni zahtjev. Da biste zadovoljili neke trenutne potrebe, možda će vam trebati podaci iz baze podataka koji nikada prije nisu bili potrebni. Možda vam više nikada neće trebati, ali sada su vam potrebni. Unesite odgovarajući SQL upit sa tastature i nakon nekog vremena rezultat će se pojaviti na vašem ekranu.
  • Uz pomoć programa koji izdvaja informacije iz baze podataka, a zatim kreira izvještaj na osnovu tih podataka, prikazan na ekranu ili odštampan. SQL jezik se također može koristiti na ovaj način. Složeni SQL upit, koji bi mogao biti koristan u budućnosti, može se postaviti direktno u program. Ovo vam omogućava da ga ponovo koristite u budućnosti. Dakle, formulacija upita se izvršava jednom. Kako umetnuti SQL kod u programe napisane na drugom jeziku opisano je u poglavlju 15.

Structure Query Language (SQL) je stvoren kao rezultat razvoja relacionog modela podataka i trenutno je de facto jezički standard za relacioni DBMS. SQL jezik danas podržava veliki broj DBMS različitih tipova.

Ime SQL jezika obično se izgovara slovima "es-q-el". Ponekad se koristi mnemonički naziv "See-Quel".

SQL jezik pruža korisniku (uz minimalan napor s njegove strane) sljedeće karakteristike:

Kreirajte baze podataka i tabele sa potpunim opisom njihove strukture

Izvršite osnovne operacije manipulacije podacima: ubacite, modificirajte, obrišite podatke

Izvršite i jednostavne i složene upite.

SQL jezik je relaciono potpun.

Struktura i sintaksa njegovih naredbi su prilično jednostavne, a sam jezik je univerzalan, odnosno sintaksa i struktura njegovih naredbi se ne mijenja pri prelasku s jednog DBMS-a na drugi.

SQL jezik ima dvije glavne komponente:

DDL (Jezik definicije podataka) za definisanje struktura baze podataka i kontrolu pristupa podacima

DML (Jezik za upravljanje podacima) se koristi za preuzimanje i ažuriranje podataka.

SQL jezik je neproceduralan, tj. kada ga koristite, morate specificirati koje informacije se žele dobiti, a ne kako se one mogu dobiti. SQL naredbe su obične engleske riječi (SELECT, INSERT, itd.). Razmotrite prvo SQL DML izraze:

SELECT - dohvaćanje podataka iz baze podataka

INSERT - ubacivanje podataka u tabelu

UPDATE - ažuriranje podataka u tabeli

DELETE - brisanje podataka iz tabele

SELECT izraz

SELECT izraz izvodi akcije ekvivalentne sljedećim operacijama relacijske algebre: odabir, projektiranje i spajanje.

Najjednostavniji SQL upit koji ga koristi izgleda ovako:

SELECT col_name FROM tbl

Nakon ključne riječi select slijedi lista kolona razdvojenih zarezima čiji će podaci biti vraćeni kao rezultat upita. Ključna riječ from određuje iz koje tabele (ili pogleda) se podaci preuzimaju.

Rezultat upita za odabir uvijek je tabela, koja se naziva tabela rezultata. Štaviše, rezultati upita koji se izvršavaju naredbom select mogu se koristiti za kreiranje nove tabele. Ako rezultati dvaju upita prema različitim tabelama imaju isti format, mogu se kombinovati u jednu tabelu. Takođe, tabela dobijena kao rezultat upita može postati predmet daljih upita.

Da biste odabrali sve kolone i sve redove tabele, dovoljno je izdati SELECT * FROM tbl;

Razmotrite tabelu proizvoda koja sadrži informacije o cijenama za različite proizvode:

Zatražite rezultat

SELECT * FROM Product;

će biti cijela tabela Proizvod.

Možete odabrati određene stupce tabele pomoću upita

SELECT col1, col2, … , coln FROM tbl;

Dakle, rezultat upita

ODABERITE vrstu, cijenu od proizvoda;

biće sto

Lista kolona u naredbi za odabir se također koristi ako je potrebno promijeniti redoslijed kolona u rezultirajućoj tabeli:

Da bi se odabrali samo oni redovi tabele koji zadovoljavaju određena ograničenja, koristi se posebna ključna reč where, praćena logičkim uslovom. Ako unos zadovoljava ovaj uslov, on se uključuje u rezultat. U suprotnom, unos se odbacuje.

Na primjer, odabir onih proizvoda iz tabele proizvoda čija cijena zadovoljava uvjet Cijena<3200, можно осуществить, используя запрос

ODABERITE * IZ proizvoda gdje je cijena<3200;

Njegov rezultat:

Uslov se može složiti i kombinovati pomoću logičkih operatora NOT , AND, OR, XOR, na primjer: gdje je id_ Cijena>500 I Cijena<3500. Допускается также использование выражений в условии: where Price>(1+1) i niz konstante: gdje je ime= "autobalansi".

Korištenje konstrukcije IZMEĐU var1 I var2 vam omogućava da provjerite da li vrijednosti izraza spadaju u interval od var1 do var2 (uključujući ove vrijednosti):

ODABERITE * IZ proizvoda gdje je cijena IZMEĐU 3000 I 3500;

Po analogiji sa operatorom NOT BETWEEN, postoji operator NOT IN.

Imena kolona navedena u klauzuli SELECT mogu se preimenovati. Za to se koristi ključna riječ AS, koja se, međutim, može izostaviti, jer se implicitno podrazumijeva. Na primjer, zahtjev

SELECT Tip AS model, Type_id AS broj FROM proizvoda gdje je Type_id =3

će se vratiti (pseudonim treba pisati bez navodnika):

Operator LIKE služi za poređenje niza sa uzorkom:

SELECT * FROM tbl gdje col_name LIKE "abc"

Ovaj upit vraća samo zapise koji sadrže vrijednost stringa abc u stupcu Col_name.

Dva zamjenska znaka su dozvoljena u obrascu: "_" i "%". Prvi od njih zamjenjuje jedan proizvoljni znak u šablonu, a drugi niz proizvoljnih znakova. Dakle, "abc%" odgovara bilo kojem nizu koji počinje sa abc, "abc_" odgovara bilo kojem nizu od 4 znaka koji počinje sa abc, "%z" odgovara bilo kojem nizu koji završava sa z, i na kraju "%z%" - nizovima znakova koji sadrži z.

Sve zapise možete pronaći u tabeli proizvoda gdje vrijednost tipa počinje slovom "a" na sljedeći način:

SELECT * FROM Product gdje Upišite LIKE "a%";

kamionske vage

Ako niz za pretraživanje sadrži zamjenski znak, tada morate navesti kontrolni znak u klauzuli ESCAPE. Ovaj kontrolni znak se mora koristiti u obrascu prije zamjenskog znaka, što ukazuje da se potonji treba tretirati kao običan znak. Na primjer, ako želite pronaći sve vrijednosti koje sadrže znak "_" u određenom polju, tada će obrazac "%_%" vratiti sve zapise iz tabele. U ovom slučaju, obrazac treba napisati na sljedeći način:

"%|_%" ESCAPE "|"

Da biste provjerili da li vrijednost odgovara nizu "20%", možete koristiti sljedeći operator:

LIKE "20#%" BJEŽITE "#"

Operator IS NULL vam omogućava da provjerite odsustvo (prisustvo) NULL vrijednosti u poljima tabele. Korištenje normalnih operatora poređenja u ovim slučajevima može dovesti do netačnih rezultata, jer poređenje sa NULL rezultira u NEPOZNATO (nepoznato). Dakle, uvjet odabira bi trebao izgledati ovako:

gdje je col_name NULL umjesto gdje col_name=NULL.

Zadani rezultat dohvaćanja vraća zapise istim redoslijedom kako su pohranjeni u bazi podataka. Ako želite da sortirate zapise po jednoj od kolona, ​​morate koristiti klauzulu ORDER BY, nakon koje je naznačeno ime ove kolone:

SELECT * FROM tbl ORDER BY col_name;

Kao rezultat ovog upita, zapisi će biti vraćeni uzlaznim redoslijedom vrijednosti atributa col_name.

Zapisi se takođe mogu sortirati po više kolona. Da biste to učinili, njihova imena moraju biti navedena nakon ORDER BY, odvojena zarezima:

SELECT * FROM tbl ORDER BY col_name1, col_name2.

Zapisi će biti sortirani po polju col_name1; ako postoji nekoliko zapisa sa istom vrijednošću u stupcu col_name1, onda će oni biti sortirani po polju col_name2.

Ako želite sortirati zapise obrnutim redoslijedom (na primjer, po datumu opadajuće), morate navesti ORDER BY col_name DESC.

Za direktno sortiranje postoji ključna riječ ASC, koja je prihvaćena kao zadana vrijednost.

Ako rezultat selekcije sadrži stotine i hiljade zapisa, njihov izlaz i obrada oduzimaju značajno vrijeme.

Stoga se informacije često paginiraju i predstavljaju korisniku u komadima. Paginacija se koristi sa ključnom riječi limit nakon koje slijedi broj unosa za prikaz. Sljedeći upit dohvaća prvih 10 zapisa uz istovremeno sortiranje nazad u polju col_name1:

SELECT * FROM tbl ORDER BY col_name1 DESC LIMIT 10

Za izdvajanje sljedećih 10 zapisa koristi se ključna riječ limit sa dvije vrijednosti: prva specificira poziciju s koje se prikazuje rezultat, a druga specificira broj zapisa za dohvat:

SELECT * FROM tbl ORDER BY col_name1 DESC LIMIT 10,10

Da biste dohvatili sljedećih 10 zapisa, koristite konstrukciju LIMIT 20, 10.

SQL yavl. alat namenjen za za obradu i čitanje podataka sadržanih u komp. DB. SQL je, prije svega, inf-nno-logičan. jezik, namenjen za opisivanje, modificiranje i preuzimanje podataka pohranjenih u relacijskim bazama podataka. SQL je skraćenica od Strukturirani jezik upita) . SQL se koristi za organiziranje interakcije korisnika s bazom podataka. U stvari, SQL radi samo sa relacionim bazama podataka. tip . Računarski program koji upravlja bazom podataka se zove sistem upravljanja bazom podataka, ili DBMS . Ako korisnik treba čita podatke iz baze podataka, traži ih od DBMS-a sa pom. SQL. DBMS obrađuje zahtjev, pronalazi tražene podatke i šalje ih korisniku. Poziva se proces traženja podataka i primanja rezultata zahtjev u DB: otuda i naziv - strukturirani jezik upita. Unatoč činjenici da je očitavanje podataka i dalje jedno od najvažnijih bitan SQL funkcije, sada se ovaj jezik koristi za implementaciju svih funkcionalnost, mačka. DBMS pruža korisniku:

Organizacija podataka. SQL daje korisniku mogućnost promjene strukture prikaza podataka, kao i uspostavljanja odnosa između elemenata baze podataka.

Čitanje podataka. SQL daje korisniku ili aplikaciji mogućnost čitanja i korištenja podataka sadržanih u bazi podataka.

Obrada podataka. SQL daje mogućnost korisniku ili aplikaciji. promijeniti bazu podataka, tj. dodati mu nove podatke, kao i izbrisati ili ažurirati postojeće podatke u njemu.

Kontrole pristupa. Uz pomoć SQL može ograničiti mogućnost korisnika da čita i mijenja podatke i zaštiti ih od neovlaštenog pristupa.

Dijeljenje podaci. SQL koordinira dijeljenje podataka između korisnika i istovremenih korisnika tako da ne ometaju jedni druge.

Integritet podataka. SQL vam omogućava da osigurate integritet baze podataka, štiteći je od uništenja zbog nedosljednih promjena ili kvara sistema.

Dakle, SQL yavl. dovoljno moćan jezik za interakciju sa DBMS-om.

Prednosti SQL-a.

SQL je jezik koji je lako razumljiv, a istovremeno i svestran alat za upravljanje podacima.

Uspeh SQL jezika donele su sledeće karakteristike:

Nezavisnost od specifičnog DBMS-a;

Prenosivost sa jednog kompjuterskog sistema na drugi;

Dostupnost standarda;

relaciona osnova;

Struktura visokog nivoa;

Mogućnost izvođenja posebnih interaktivnih zahtjeva:

Pružanje programskog pristupa bazama podataka;

Mogućnost različitog prikaza podataka;

Kompletnost kao jezik dizajniran za rad sa bazom podataka;

Sposobnost dinamičkog definiranja podataka;

Podrška za klijent/server arhitekturu.

Svi gore navedeni faktori doveli su do toga da SQL postane standardni alat za upravljanje podacima na ličnim računarima.

37 Osnovne rečenične strukture jezika u upitima

Svaki SQL izraz je upit ili poziv baze podataka koji rezultira promjenom baze podataka. U skladu sa promjenama u bazi podataka razlikuju se sljedeće vrste upita:

Zahtjevi za kreiranje ili izmjenu novih ili postojećih objekata u bazi podataka (u ovom slučaju, tip i struktura kreiranog ili modificiranog objekta opisana je u zahtjevu);

Zahtjevi za podacima;

Zahtjevi za dodavanje novih podataka (evidencija)

Zahtjevi za brisanje podataka;

Pozivi u DBMS.

Bilo koji zahtjev yavl. program napisan u SQL strukturiranom jeziku upita. U stvari, SQL program je određena fraza-upit za odabir podataka na engleskom jeziku, napisana u određenoj strukturi, koju zatim DBMS konvertuje u traženi rezultat.

U većini DBMS, rečenica se završava sa ";" a DBMS ne obrađuje informacije sve dok ne naiđe na ";". Rečenica se sastoji od fraza i počinje registrovanom rečju. Svaka fraza ima naslov.

Imenovanja nekih osnovni SQL izrazi:

SELECT(odaberi) - (odaberi) podatke iz navedenih kolona i (ako je potrebno) izvrši njihovu transformaciju prije izlaza u skladu sa navedenim izrazima i (ili) funkcijama; OD– označava tabelu iz koje su polja izabrana; GDJE– stvara uslov za uzorkovanje podataka u evidenciji; POREDAK PO- sortira zapise po zadatom redosledu; GROUP BY– grupe koje se podudaraju sa zapisima prilikom izvršavanja zbirnih upita; DISTINCTROW– isključuje duple zapise iz skupa rezultata; TRANSFORMIRAJTE– izračunava izraze u unakrsnim upitima; PIVOT– definira naslove stupaca u tabeli unakrsnog upita.

O sugestiji. SELECT. Svi zahtjevi za primanje gotovo bilo kojeg broja podataka od jednog ili više. tabele se izvršavaju sa jednom SELECT klauzulom. Općenito, izlaz SELECT klauzule je druga tablica. Na ovoj novoj (radnoj) tabeli može se ponovo primijeniti operacija SELECT, itd., tj. takve operacije mogu biti ugniježđene jedna u drugu. Od istorijskog interesa je činjenica da se radi o mogućnosti uklj. jedna SELECT klauzula unutar druge bila je motivacija za korištenje. pridjev "strukturiran" u nazivu SQL jezika. U nacrtima isp. simboli: zvjezdica (*) za "sve" - ​​koristite. u uobičajenom programskom smislu, tj. "svi slučajevi koji zadovoljavaju definiciju"; (,) - Španski. odvojiti stavke liste; () - znači da su konstrukcije, zaključ. u zagradi, yavl. opciono ; prava linija (|) - gotovina. izbor dvije ili više mogućnosti.itd

36-37. esp. - jezik SQL . Osnovne strukture jezičkih rečenica u upitima (a/c)

SQL - strukturirani jezik upita. Inf-e pr-in - ujedinjeniji. To je dovelo do potrebe za stvaranjem standardnog jezika koji bi mogao

SELECT na SQL jeziku (za jednu tabelu): SELECT(odaberite) navedena polja

OD(iz) navedene tabele

GDJE(gdje) je neki specificirani uvjet istinit

SELECT list_selectable_elements (polja)

OD table_list (ili pregleda)

]

Korištenje AS kvalifikatora

Ovaj kvalifikator zamjenjuje postojeće ime stupca u rezultirajućoj tablici sa navedenim.

Agregatne funkcije

Funkcije agregiranja uključuju funkcije za izračunavanje zbroja (SUM), max-th (SUM) i min-th (MIN) vrijednosti stupaca, aritamskog prosjeka (AVG) i broja redaka koji zadovoljavaju dati uvjet (COUNT).

SELECT count(*), suma (budžet), avg (budžet),

min (budžet), max (budžet)

WHERE head_dept = 100

izračunajte: broj odjela koji su pododjeli odjela 100 (marketing i prodaja), njihov ukupni, prosječni, min i maksimalni budžeti COUNT SUM AVG MIN MAX

5 3800000.00 760000.00 500000.00 1500000.00

FROM klauzula SELECT izraza

FROM klauzula navodi sve objekte (jedan ili više) iz kojih se preuzimaju podaci. Svaka tabela ili pogled na koji se upućuje u upitu moraju biti navedeni u klauzuli FROM.

Vrste predikata koji se koriste u klauzuli WHERE :

poređenje koristeći relacijske operatore

Jednako<>nije jednako!= nije jednako > veće od< меньше

>= veće ili jednako<= меньше или равно

BETWEEN IN LIKE CONTAINING IS NULL

Operacije poređenja Ako su domeni definirani u bazi podataka, onda stavke koje se uspoređuju moraju pripadati istom domenu.

SELECT ime, prezime, br.

WHERE posao_zemlja<>SAD

IZMEĐU

Predikat BETWEEN specificira raspon vrijednosti za koji se izraz procjenjuje na istinito. Također je dozvoljeno koristiti konstrukciju NOT BETWEEN.

GDJE plata IZMEĐU 20000 I 30000

dobiti spisak zaposlenih čija je godišnja plata veća od 20000, a manja od 30000 FIRST_NAME PREZIME PLATA

Ann Bennet 22935,00

Kelly Brown 27000,00

Vrijednosti koje definiraju donji i gornji raspon možda nisu stvarne vrijednosti iz baze podataka. I ovo je vrlo zgodno - na kraju krajeva, ne možemo uvijek odrediti tačne vrijednosti raspona!

SELECT ime, prezime, plata

GDJE prezime IZMEĐU "Nel" I "Osb"

dobiti spisak uposlenika čija su prezimena između "Nel" i "Osb" PRVO_IME PREZINJENJE PLATA

Robert Nelson 105900,00

Carol Nordstrom 42742.50

Sue Anne O Brien 31275.00

SELECT ime_ime, prezime, datum_upošljavanja

IN Predikat IN provjerava da li je data vrijednost koja prethodi ključnoj riječi "IN" (na primjer, vrijednost stupca ili njegove funkcije) na listi zatvorenoj u zagradama. Ako je data vrijednost koju treba provjeriti jednaka bilo kojem elementu na listi, tada se predikat procjenjuje na istinito. Također je dozvoljeno koristiti konstrukciju NOT IN.

SELECT ime_ime, prezime, šifra_posla

WHERE job_code IN ("VP", "Admin", "Finan")

LIKE Predikat LIKE se koristi samo sa znakovnim podacima. Provjerava da li data vrijednost karaktera odgovara nizu sa navedenom maskom. Svi dozvoljeni znakovi se koriste kao maska ​​(uključujući velika i mala slova), kao i specijalni znakovi:

% - zamjenjuje bilo koji broj znakova (uključujući 0),

Zamjenjuje samo jedan znak.

Također je dozvoljeno koristiti konstrukciju NOT LIKE.

SELECT ime, prezime

GDJE prezime LIKE "F%"

dobiti spisak zaposlenih čija prezimena počinju na slovo "F" FIRST_NAME LAST_NAME

Logički operatori Logički operatori uključuju dobro poznate operatore AND, OR, NOT, koji vam omogućavaju izvođenje različitih logičkih operacija: logičko množenje (AND, "presjek uslova"), logičko sabiranje (OR, "kombiniranje uslova"), logička negacija (NE, " negacija uslova"). U našim primjerima već smo koristili operator AND. Upotreba ovih operatora omogućava vam da fleksibilno "prilagodite" uslove za odabir zapisa.

Veza ( PRIDRUŽITE SE ) Operacija spajanja se koristi u SQL-u za prikaz povezanih informacija pohranjenih u više tablica u jednom upitu. Povezivanje se po pravilu vrši primarnim ključem jedne tabele i stranim ključem druge tabele - za svaki par tabela. U ovom slučaju, vrlo je važno uzeti u obzir sva polja stranog ključa, inače će rezultat biti iskrivljen. Spojena polja se mogu (ali ne moraju!) pojaviti na listi elemenata za odabir. WHERE klauzula može sadržavati više uslova spajanja. Uvjet spajanja se također može kombinirati s drugim predikatima u klauzuli WHERE.

Top Related Articles