Këshilla për ndërtim dhe riparim

Ky libër është diçka si një "vulë e kujtesës sime" në SQL (DDL, DML), i.E. Ky është informacioni që ka akumuluar gjatë aktivitetit profesional dhe është ruajtur vazhdimisht në kokën time. Ky është një minimum i mjaftueshëm për mua, i cili përdoret kur punon me bazat e të dhënave më shpesh. Nëse është e nevojshme të aplikoni dizajne të plota SQL, atëherë unë zakonisht apeloj në Bibliotekën e MSDN të vendosur në internet. Sipas mendimit tim, është shumë e vështirë të mbash gjithçka në kokën time dhe nuk ka nevojë të veçantë për këtë. Por njohja e dizenjove themelore është shumë e dobishme, sepse Ata aplikojnë brenda në të njëjtën formë në shumë baza të dhënash relacionale, të tilla si Oracle, MySQL, Firebird. Dallimet kryesisht përbëhen nga llojet e të dhënave që mund të ndryshojnë në detaje. Hartat kryesore të gjuhës SQL nuk janë aq shumë, dhe me praktikë të vazhdueshme, ato kujtohen shpejt. Për shembull, për të krijuar objekte (tabela, kufizime, indekse, etj.), Mjafton të kesh një redaktor teksti tekstual (IDE) për të punuar me një bazë të dhënash, dhe nuk ka nevojë për të studiuar mjetet vizuale të mprehta për të punuar me një specifik Lloji i bazës së të dhënave (MS SQL, Oracle, MySQL, Firebird, ...). Është e përshtatshme dhe fakti që të gjithë tekstin është para syve, dhe ju nuk keni nevojë të kandidoni në skeda të shumta për të krijuar, për shembull, një indeks ose kufizim. Nëse vazhdimisht punoni me bazën e të dhënave, krijoni, ndryshoni, dhe sidomos rivendosni objektin me ndihmën e skenarëve është herë më shpejt se nëse bëni në modalitetin vizual. Gjithashtu në mënyrën e skriptimit (në përputhje me rrethanat, me saktësinë e duhur), është më e lehtë për të vendosur dhe kontrolluar rregullat për emrin e objekteve (opinioni im subjektiv). Përveç kësaj, skriptet janë përdorur në mënyrë të përshtatshme në rastin kur ndryshimet e bëra në një bazë të dhënash (për shembull, test) duhet të transferohen në të njëjtën formë në një bazë tjetër (produktive).

Gjuha SQL është e ndarë në disa pjesë, këtu unë do të shqyrtoj 2 pjesët më të rëndësishme:
  • DML - Gjuha e manipulimit të të dhënave (gjuha e manipulimit të të dhënave), e cila përmban ndërtimet e mëposhtme:
    • Zgjidh - marrjen e mostrave të të dhënave
    • Futni - futni të dhëna të reja
    • Update - përditësimi i të dhënave
    • Delete - fshini të dhënat
    • Merge - të dhënat bashkohen
Sepse Unë jam praktikues se si teoria e tillë në këtë libër do të jetë e vogël, dhe të gjitha planet do të shpjegohen në shembuj praktikë. Përveç kësaj, unë besoj se gjuha e programimit, dhe sidomos SQL, mund të zotërohet vetëm në praktikë, duke e spërkat veten dhe duke kuptuar se çfarë ndodh kur e kryeni këtë ose atë dizajn.

Ky libër është krijuar në parimin e hapit pas hapi, i.e. Është e nevojshme për ta lexuar atë vazhdimisht dhe të dëshirueshme menjëherë duke kryer shembuj. Por nëse keni nevojë të mësoni për një lloj ekipi në më shumë detaje, përdorni një kërkim specifik në internet, për shembull, në Bibliotekën e MSDN.

Kur shkruan këtë tekst, është përdorur baza e të dhënave MS SQL Server 2014, kam përdorur SQL SQL Server Management Studio (SSMS) për të ekzekutuar skriptet.

Shkurtimisht për MS SQL Server Menaxhimi Studio (SSMS)

SQL Server Menaxhimi Studio (SSMS) - një shërbim për Microsoft SQL Server për të konfiguruar, menaxhuar dhe administruar komponentët e bazës së të dhënave. Ky shërbim përmban redaktorin e skriptit (i cili do të përdoret më së shumti) dhe një program grafik që punon me objekte dhe cilësime të serverit. Mjeti kryesor i SQL Server Management Studio është objekt Explorer, i cili lejon përdoruesin të shohë, të nxjerrë objekte të serverëve, si dhe t'i menaxhojë ato. Ky tekst është i huazuar pjesërisht nga Wikipedia.

Për të krijuar një redaktor të ri të skriptit, përdorni butonin "Kërkesa e re / kërkesa e re":

Për të ndryshuar bazën e të dhënave aktuale, ju mund të përdorni listën e drop-down:

Për të kryer një komandë specifike (ose grup komandash), zgjidhni atë dhe shtypni butonin Execute / Run ose çelësin "F5". Nëse vetëm një komandë është e vendosur në redaktor, ose ju duhet të plotësoni të gjitha komandat, ju nuk keni nevojë të ndani asgjë.

Pas ekzekutimit të skripteve, sidomos krijimin e objekteve (tabelave, kolonave, indekseve) për të parë ndryshimet, përdorin përditësimin nga menyja e kontekstit duke zgjedhur grupin e duhur (për shembull, tabelën), vetë tabelën ose grupin e kolonës në të.

Në të vërtetë, kjo është e gjitha që do të duhet të dimë për zbatimin e shembujve të dhënë këtu. Pjesa tjetër përgjatë shërbimeve SSMS është e lehtë për t'u mësuar në mënyrë të pavarur.

Pak teori

Baza e të dhënave relacionale (RBD ose më tej në kontekstin e bazës së të dhënave thjesht) është një grup tabelash që lidhen me njëri-tjetrin. Nëse themi në mënyrë të vrazhdë, baza e të dhënave është një skedar në të cilin të dhënat ruhen në formë të strukturuar.

DBMS - Sistemi i kontrollit të këtyre bazave të të dhënave, i.E. Kjo është një sërë mjetesh për të punuar me një lloj të caktuar të bazës së të dhënave (MS SQL, Oracle, MySQL, Firebird, ...).

shënim
Sepse Në jetë, në fjalimin e bisedës, ne po themi më së shumti: "Baza e të dhënave Oracle, apo edhe vetëm" Oracle ", në të vërtetë nënkupton" Oracle DBMS ", pastaj në kontekstin e këtij teksti, nganjëherë do të përdoret baza e të dhënave term. Nga konteksti, unë mendoj se do të kuptojë se çfarë është pikërisht në pyetje.

Tabela është një grup kolonash. Kolonat, gjithashtu mund të telefonojnë fusha ose kolona, \u200b\u200btë gjitha këto fjalë do të përdoren si sinonime që shprehin të njëjtën gjë.

Tabela është objekti kryesor i RBD, të gjitha të dhënat e RBD ruhet në vijën e tabelave. Rreshtat, të dhënat - gjithashtu sinonime.

Për çdo tavolinë, si dhe kolonat e saj i janë dhënë emrat për të cilët ata më pas shkojnë tek ata.
Emri i objektit (emri i tabelës, emri i kolonës, emri i indeksit, etj.) Në MS SQL mund të ketë një gjatësi maksimale prej 128 karakteresh.

Per referim - Emrat e bazës së të dhënave të Oracle mund të kenë gjatësinë maksimale prej 30 karakteresh. Prandaj, për një bazë të dhënash specifike, ju duhet të zhvilloni rregullat tuaja për emrin e objekteve për të përmbushur kufirin nga numri i karaktereve.

SQL është një gjuhë që ju lejon të kryeni kërkesa në bazën e të dhënave përmes DBMS. Në një DBMS të veçantë, gjuha SQL mund të ketë një zbatim të veçantë (dialekti i tij).

DDL dhe DML - me subset e gjuhës SQL:

  • Gjuha DDL përdoret për të krijuar dhe modifikuar strukturën e bazës së të dhënave, i.e. Për të krijuar / ndryshuar / fshirë tabelat dhe lidhjet.
  • Gjuha DML lejon manipulimet me të dhënat e të dhënave, i.e. Me rreshtat e saj. Kjo ju lejon të bëni një mostër të dhënash nga tabelat, të shtoni të dhëna të reja në tabelë, si dhe të përditësoni dhe fshini të dhënat ekzistuese.

Në SQL, ju mund të përdorni 2 lloje të komenteve (një line dhe multi-line):

Koment me një rresht
dhe

/ * Koment multi-line * /

Në të vërtetë, të gjitha për teorinë e kësaj do të jenë të mjaftueshme.

DDL - Gjuha e definicionit të të dhënave (gjuha e përshkrimit të të dhënave)

Për shembull, e konsideroni tabelën me të dhënat mbi punonjësit, në personin e zakonshëm që nuk është një formë programuese:

Në këtë rast, kolonat e tabelës kanë emrat e mëposhtëm: numri i tabelëve, emri i plotë, data e lindjes, e-mail, pozicioni, departamenti.

Secila prej këtyre kolonave mund të karakterizohet nga lloji i të dhënave të përmbajtura në të:

  • Numri Tabel - Integer
  • Emri i plotë - String
  • Data e lindjes - data
  • E-mail - string
  • Pozicioni - varg
  • Departamenti
Lloji i kolonës është një karakteristikë që flet për çfarë lloj të dhënash mund të ruajë këtë kolonë.

Për të filluar, do të jetë e mjaftueshme për të kujtuar vetëm llojet kryesore të të dhënave të përdorura në MS SQL:

Vlerë Znj. SQL Përshkrim
Rresht me gjatësi të ndryshueshme varchar (n)
dhe
Nvarchar (n)
Duke përdorur n numrin n, ne mund të specifikojmë gjatësinë maksimale të mundshme të vargut për kolonën përkatëse. Për shembull, nëse duam të themi se vlera e kolonës së "emrit të plotë" mund të përmbajë një maksimum prej 30 karakteresh, atëherë është e nevojshme të specifikoni llojin nvarchar (30).
Dallimi midis Varchar nga Nvarchar qëndron në faktin se Varchar ju lejon të ruani rreshtat në formatin ASCII, ku një karakter merr 1 byte, dhe vargjet e dyqaneve nvarchar në formatin Unicode, ku secili karakter merr 2 bytes.
Lloji Varchar duhet të përdoret vetëm nëse jeni 100% i sigurt se kjo fushë nuk ka nevojë për të ruajtur personazhet Unicode. Për shembull, Varchar mund të përdoret për të ruajtur adresat e postës elektronike, sepse Ata zakonisht përmbajnë vetëm karaktere ASCII.
Gjatësia fikse e vargut char (n)
dhe
Nchar (n)
Nga vargu i gjatësisë së ndryshueshme, ky lloj karakterizohet në atë që nëse gjatësia e linjës është më e vogël se n karaktere, ajo gjithmonë plotësohet në të drejtën për hapësirat e gjatësisë dhe vazhdon në bazën e të dhënave në këtë formular, i.e. Në bazën e të dhënave, ajo zë saktësisht n karaktere (ku një karakter merr 1 byte për char dhe 2 bytes për llojin NCHAR). Në praktikën time, ky lloj është shumë i rrallë, dhe nëse përdoret, përdoret kryesisht në formatin char (1), i.e. Kur fusha përcaktohet me një karakter.
Numër i plotë int. Ky lloj na lejon të përdorim vetëm integers në kolonën, si pozitive dhe negative. Për referencë (tani nuk është aq e rëndësishme për ne) - gamën e numrave që lejon llojin int nga -2 147 483 648 në 2 147 483 647. Kjo zakonisht është tipi kryesor që përdoret për të specifikuar identifikuesit.
Reale ose e vlefshme notoj Nëse flasim gjuhë të thjeshtë, atëherë këto janë numrat në të cilët mund të jetë i pranishëm pikat dhjetore (presje).
datë datë. Nëse kolona duhet të ruhet vetëm data, e cila përbëhet nga tre komponentë: numra, muaj dhe vit. Për shembull, 02/15/2014 (15 shkurt 2014). Ky lloj mund të përdoret për "datën e pritjes" kolona, \u200b\u200b"Data e lindjes", etj., I.E. Në rastet kur është e rëndësishme për ne që të rregullojmë vetëm datën, ose kur koha përbërëse nuk është e rëndësishme për ne dhe mund të fshihet ose nëse nuk dihet.
Kohë kohë. Ky lloj mund të përdoret nëse kolona duhet të ruajë vetëm të dhënat e kohës, i.E. Shikoni, minuta, sekonda dhe milisekonda. Për shembull, 17: 38: 31.3231603
Për shembull, "koha e nisjes së fluturimit".
Data dhe ora datetime. Ky lloj ju lejon të ruani njëkohësisht datën dhe kohën. Për shembull, më 2010-02-0344 17: 38: 31.323
Për shembull, kjo mund të jetë data dhe koha e një ngjarjeje.
Flamur pak. Ky lloj është i përshtatshëm për të aplikuar për ruajtjen e vlerave të tipit "po" / "jo", ku "po" do të ruhen si 1, por jo "do të ruhen si 0.

E njëjta vlerë në terren, nëse nuk është e ndaluar, nuk mund të përcaktohet, fjalia e pavlefshme përdoret për këtë qëllim.

Për të kryer shembuj, krijoni një bazë të dhënash test të quajtur provë.

Ju mund të krijoni një bazë të dhënash të thjeshtë (pa specifikuar parametra shtesë) duke drejtuar komandën e mëposhtme:

Krijo test të bazës së të dhënave
Ju mund të hiqni bazën e të dhënave me komandën (vlen të jeni shumë të kujdesshëm me këtë komandë):

Test Drop Baza e të Dhënave.
Në mënyrë që të kaloni në bazën e të dhënave tona, ju mund të ekzekutoni komandën:

Përdorni testin.
Ose zgjidhni bazën e të dhënave të testimit në listën e drop-down në zonën e menysë SSMS. Kur punoj, shpesh përdoret që përdoret kjo metodë e kalimit midis bazave të të dhënave.

Tani në bazën e të dhënave tona mund të krijojmë një tabelë duke përdorur përshkrimet pasi ato janë, duke përdorur boshllëqet dhe simbolet e cirilik:

Krijo tabelën [punonjësit] ([numri] nvarchar (30), [data e lindjes], nvarchar (30), [pozita] nvarchar (30), [Departamenti] nvarchar (30))
Në këtë rast, ne do të duhet të përfundojmë emra në kllapa katrore [...].

Por në bazën e të dhënave për lehtësi më të madhe, të gjitha emrat e objekteve janë më të mira për të vendosur në latinisht dhe për të mos përdorur boshllëqet në emra. Në MS SQL, në këtë rast, çdo fjalë fillon me një letër të madhe, për shembull, për fushën "Numri Tabel", ne mund të vendosim personelin e emrit. Gjithashtu në emër që mund të përdorni numra, për shembull, fonenumber1.

Në një shënim
Në disa dbms, formati i mëposhtëm i emrit "Phone_number" mund të jetë më i preferuar, për shembull, një format i tillë përdoret shpesh në bazën e të dhënave të Oracle. Natyrisht, kur specifikon emrin e fushës, është e dëshirueshme që të mos përputhet me fjalë kyçe të përdorura në DBMS.

Për këtë arsye, ju mund të harroni për sintaksë me kllapa katrore dhe fshini tryezën [punonjësit]:

Tabela e drurit [punonjësit]
Për shembull, një tabelë me punonjës mund të quhet "punonjës", dhe fushat e saj mund të pyeten emrat e mëposhtëm:

  • ID - numri i tabelës (identifikuesi i punonjësve)
  • Emri - Emri i plotë
  • Ditëlindja - Data e lindjes
  • Email - e-mail
  • Pozicioni - pozicioni
  • Departamenti i Departamentit
Shumë shpesh, Word ID përdoret për të emëruar fushën e identifikuesit.

Tani le të krijojmë tryezën tonë:

Krijo punonjës të tabelës (id int, emri nvarchar (30), data e ditëlindjes, email nvarchar (30), pozicionin nvarchar (30), departamenti nvarchar (30))
Në mënyrë që të vendosni kolonat e kërkuara për të mbushur, ju mund të përdorni opsionin jo të pavlefshëm.

Për një tabelë tashmë ekzistuese në terren, ju mund të anashkaloni duke përdorur komandat e mëposhtme:

UPDATE ID ID ALTER PUNËTARËT E TABELIT ALTER NUK NULL - UPDATE Emri Alter Tabela Punonjësit Emri i kolonës Nvarchar (30) nuk është i pavlefshëm

Në një shënim
Koncepti i përgjithshëm i gjuhës SQL për shumicën e DBMS mbetet i njëjtë (të paktën për këtë, unë mund të gjykoj DBMS që kam ndodhur me të). Diferenca DDL në DBMS të ndryshme kryesisht janë përfunduar në llojet e të dhënave (nuk mund të ketë vetëm emrat e tyre, por edhe pjesët e zbatimit të tyre), specifika e gjuhës SQL (domethënë, thelbi i ekipeve vetëm mund të ndryshojë pak. Por Mund të ketë dallime të vogla në dialekt, mjerisht, por nuk ka asnjë standard). Mbajnë bazat e SQL ju lehtë mund të lëvizni nga një dbms në një tjetër, sepse Në këtë rast, ju do të duhet të kuptoni detajet e zbatimit të komandave në DBMS të reja, I.E. Në shumicën e rasteve, do të jetë e mjaftueshme për të kryer thjesht një analogji.

Krijimi i një tabele të Krijo Punonjësit e Tabelës (ID Int - në llojin e Oracle Int - Kjo është ekuivalente (Wrapper) për numrin (38) nvarchar2 (30), - nvarchar2 në Oracle ekuivalente me nvarchar në datën e ditëlindjes MS SQL, email nvarchar2 (30 ), Pozicioni nvarchar2 (30), departamenti nvarchar2 (30)); - përditësimin e fushave të ID dhe emrit (këtu në vend të përdorimit të kolonës së ndryshimit të modifikimit (...)) ndryshojnë punonjësit e tabelave modifikojnë (id int not , emri nvarchar2 (30) nuk është null); - duke shtuar pk (në këtë rast, dizajni duket si në MS SQL, do të shfaqet më poshtë) ALTER Tabela Punonjësit Shtoni Kufizimin PK_Motemployees kryesore (ID);
Për orakull ka dallime në zbatimin e llojit Varchar2, kodimi i saj varet cilësimet e bazës së të dhënave dhe teksti mund të ruhen, për shembull, në kodimin UTF-8. Përveç kësaj, gjatësia e fushës në Oracle mund të vendoset si në bytes dhe karaktere, për këtë, përdoren opsionet shtesë të opsioneve dhe char, të cilat tregohen pas gjatësisë së fushës, për shembull:

Emri Varchar2 (30 byte) - kapaciteti në terren do të jetë i barabartë me 30 bytes të emrit Varchar2 (30 char) - kapaciteti në terren do të jetë i barabartë me 30 karaktere
Çfarë opsioni do të përdoret nga byte default ose char, në rast të një specifikimi të thjeshtë në llojin e orakullit Varchar2 (30) varet nga cilësimet e bazës së të dhënave, gjithashtu mund të vendoset në cilësimet e IDE. Në përgjithësi, ju lehtë mund të hutoheni, kështu që në rastin e Oracle, nëse përdoret lloji Varchar2 (dhe kjo ndonjëherë justifikohet, për shembull, kur përdorni kodin UTF-8), unë preferoj të përshkruaj në mënyrë eksplicite char (për shkak se vargu është zakonisht më i përshtatshëm për të lexuar në simbolet).

Por në këtë rast, nëse ka ndonjë të dhënë në tabelë, atëherë për ekzekutimin e suksesshëm të komandave është e nevojshme që në të gjitha rreshtat e ID dhe tabelat e fushës së emrit të jenë përfunduar. Ne do të demonstrojmë këtë në shembull, të futni të dhënat në tabelën në fushën e identitetit, pozicionin dhe departamentin, kjo mund të bëhet nga shkrimi i mëposhtëm:

Vendosni punonjësit (ID, Pozicioni, Departamenti) Vlerat (1000, N "Drejtor", N "Administrim"), (1001, N "Programues", n "IT"), (1002, n "Kontabilist", n " Kontabiliteti "), (1003, n" Programues i lartë ", n" ajo ")
Në këtë rast, komanda e shënimit do të japë gjithashtu një gabim, sepse Kur futni, nuk kemi specifikuar vlerat e fushës së emrit të kërkuar.
Në rast se kemi pasur këto të dhëna në tryezën origjinale, komandantët e alternave të kolonës së ndryshimit të kolonës nuk do të ishin të suksesshme dhe komandantët e tabelës së ndryshimit të kolonës NULL lëshoi \u200b\u200bnjë mesazh gabimi, "ndryshojnë punonjësit e tabelës Emri i kolonës INTO NOT NULL "Komanda që në fushën e emrit ka vlera null (jo të specifikuara).

Shto vlera për fushën e emrit dhe kthehuni përsëri të dhënat:


Opsioni jo i null mund të përdoret gjithashtu direkt kur krijohet një tabelë e re, i.e. Në kontekstin e komandës së tabelës së krijimit.

Së pari fshini tabelën duke përdorur komandën:

Punonjësit e tavolinës së rënies.
Tani krijoni një tabelë me kolona të detyrueshme ID dhe Emri:

Krijo punonjës të tabelës (id int not , emër nvarchar (30) nuk , ditëlindjen Data, email nvarchar (30), pozicion nvarchar (30), departamenti nvarchar (30))
Ju gjithashtu mund të bëni emrin e emrit të kolonës për të shkruar , i cili do të thotë se vlerat e pavlefshme do të lejohen (jo të specifikuara), por kjo nuk është e nevojshme, pasi që kjo karakteristikë nënkuptohet me default.

Nëse kërkohet në të kundërtën për të bërë një kolonë ekzistuese opsionale për të plotësuar, ne përdorim sintaksën e mëposhtëm të komandës:

ALTER Tabela Punonjësit Nvarchar (30) null
Ose thjesht:

ALTER Tabela Punonjësit e ndryshojnë emrin e kolonës nvarchar (30)
Gjithashtu ky komandë ne mund të ndryshojmë llojin e fushës në një lloj tjetër të pajtueshëm, ose të ndryshojmë gjatësinë e saj. Për shembull, le të zgjerojmë fushën e emrit deri në 50 karaktere:

ALTER Tabela Punonjësit e ndryshojnë emrin e kolonës nvarchar (50)

Çelesi primar

Kur krijohet një tabelë, është e dëshirueshme që ajo të ketë një kolonë unike ose një sërë kolonash, e cila është unike për secilën prej linjave të saj - në këtë vlerë unike mund të identifikohet qartë. Kjo vlerë quhet çelësi kryesor i tabelës. Për tryezën e punonjësve tanë, një vlerë e tillë unike mund të jetë kolona e identitetit (e cila përmban "numrin e tabelës së punonjësve" - \u200b\u200ble të jetë në rastin tonë, vlera është unike për çdo punonjës dhe nuk mund të përsëritet).

Krijo një çelës primar për një tabelë ekzistuese mund të përdorë komandën:

ALTER POBLEY POBLEY shtoni kufizim PK_EMPLYESEES KEY (ID)
Ku "pk_emplyees" është emri i kufizimit përgjegjës për çelësin primar. Zakonisht, prefix "pk_" përdoret për të emëruar çelësin primar pas së cilës vjen emri i tabelës.

Nëse kyç primar përbëhet nga disa fusha, atëherë këto fusha duhet të renditen në kllapa përmes një presje:

ALTER TABELA EMRI_TABLE Shto Constraint Emri kryesor kryesor (Field1, Fusha 2, ...)
Vlen të përmendet se në MS SQL të gjitha fushat që janë të përfshira në çelësin primar duhet të kenë një karakteristikë jo të pavlefshme.

Gjithashtu, kyç primar mund të përcaktohet direkt kur krijohet një tabelë, dmth. Në kontekstin e komandës së tabelës së krijimit. Fshini tabelën:

Punonjësit e tavolinës së rënies.
Dhe pastaj krijoni atë duke përdorur sintaksën e mëposhtme:

Krijo punonjës të tabelës (id int not , emër nvarchar (30) nuk , data e ditëlindjes, email nvarchar (30), pozita nvarchar (30), departamenti nvarchar (30), kufizime pk_employees kryesore (ID) - përshkruaj PK pas të gjitha fusha si kufizim)
Pas krijimit të një gropë në tryezë:

Vendosni punonjësit (ID, Pozicioni, Departamenti, Emri) Vlerat (1000, N "Drejtor", N "Administratë", n "Ivanov I.I."), (1001, N "Programues", n "", n "Petrov Pp "), (1002, n" kontabilist ", n" kontabilitet ", n" sidorov ss "), (1003, n" programues i lartë ", n", n "andreev A. Por.")
Nëse çelësi kryesor në tabelë përbëhet vetëm nga vlerat e një kolone, ju mund të përdorni sintaksën e mëposhtme:

Krijo punonjës të tabelës (id int nuk null kufizojnë pk_employees çelësi primar, - tregoni si karakteristikë e fushës nvarchar (30) jo , ditëlindjen Data, email nvarchar (30), pozicion nvarchar (30), departamenti nvarchar (30))
Në fakt, emri i kufizimit nuk mund të kërkohet, në këtë rast do të caktohet një emër i sistemit (si "pk__employe__3214ec278da42077"):

Krijo punonjës të tabelës (id int not , emër nvarchar (30) nuk , data e ditëlindjes, email nvarchar (30), pozita nvarchar (30), departamenti nvarchar (30), kyç kryesor (ID))
Ose:

Krijo Punonjësit e Tabelave (ID INT Not Null kryesore, Emri Nvarchar (30) NUK NULL, Dita e Ditëlindjes, Email Nvarchar (30), Pozita Nvarchar (30), Departamenti Nvarchar (30))
Por unë do të rekomandoj për tabelat e përhershme që gjithmonë të vendosin qartë emrin e kufizimit, sepse Sipas emrit të përcaktuar në mënyrë eksplicite dhe të kuptueshme, do të jetë më e lehtë për të kryer manipulime, për shembull, ju mund ta fshini atë:

Alter Tabela e punonjësve rënia e kufizimeve pk_emplyees
Por një sintaksë e tillë e shkurtër, pa specifikuar emrat e kufizimeve, është e përshtatshme të aplikoni kur krijoni tabela të bazës së të dhënave të përkohshme (emri i tabelës së kohës fillon me # ose ##), i cili do të fshihet pas përdorimit.

I përshtatshëm

Për momentin kemi shqyrtuar komandat e mëposhtme:
  • Krijoj tabelën Emri_Table (transferimi i fushave dhe llojet e tyre, kufizimet) - shërben për të krijuar një tabelë të re në bazën e të dhënave aktuale;
  • Tryezë Emri_Table - përdoret për të fshirë një tabelë nga baza e të dhënave aktuale;
  • Alter tryezë Name_table Alter kolona. Emri i ndëshkimit ... - përdoret për të përmirësuar një lloj kolone ose për të ndryshuar cilësimet e saj (për shembull, për të specifikuar karakteristikën null ose jo null);
  • Alter tryezë Name_table Shtoni kufizime. Emri i programit ÇELESI PRIMAR.(fushë1, fushë2, ...) - shtoni çelësin primar në një tabelë ekzistuese;
  • Alter tryezë Name_table Kufizimi i rënies. Emri Primer - Fshirja e një kufizimi nga tabela.

Pak për tabelat e përkohshme

Prerë nga msdn. Në MS SQL Server, ka dy lloje të tabelave të përkohshme: lokale (#) dhe globale (##). Tabelat e përkohshme lokale janë të dukshme vetëm për krijuesit e tyre derisa sesioni i lidhjes të përfundojë me shembullin e serverit SQL, sapo të krijohen së pari. Tabelat e kohës lokale fshihen automatikisht pas shkëputjes së përdoruesit nga instanca e serverit SQL. Tabelat e përkohshme globale janë të dukshme për të gjithë përdoruesit gjatë çdo seance lidhjesh pas krijimit të këtyre tabelave dhe fshihen kur të gjithë përdoruesit i referohen këtyre tabelave janë të shkëputura nga instanca e serverit SQL.

Tabelat e përkohshme krijohen në bazën e sistemit Tempdb, i.E. Duke krijuar ato, ne nuk e grumbullojmë bazën kryesore, pjesa tjetër e tabelave kohore janë krejtësisht identike me tabelat e zakonshme, ato gjithashtu mund të fshihen duke përdorur komandën e tabelës së rënies. Tabelat e përkohshme lokale (#) janë më shpesh të përdorura.

Për të krijuar një tryezë të përkohshme, ju mund të përdorni komandën e tabelës Krijo:

Krijo Tabela #temp (id int, emri nvarchar (30))
Meqë një tabelë e përkohshme në MS SQL është e ngjashme me një tryezë të rregullt, mund të, në përputhje me rrethanat, gjithashtu mund të hiqni komandën e tabelës së rënies:

Drop Tabela #temp

Gjithashtu një tabelë e përkohshme (si një tabelë e rregullt), ju mund të krijoni dhe menjëherë plotësoni të dhënat e kthyera me kërkesën duke përdorur sintaksën e zgjedhur ... në:

Zgjidhni ID, Emri në #temp nga punonjësit

Në një shënim
Në DBMs të ndryshme, zbatimi i tabelave të përkohshme mund të ndryshojë. Për shembull, në Oracle dhe Firebird DBMS, struktura e përkohshme e tabelës duhet të përcaktohet paraprakisht me komandën e tabelës së përkohshme globale, duke treguar specifikat e ruajtjes së të dhënave në të, atëherë përdoruesi tashmë e sheh atë në mesin e tabelave kryesore dhe punon me të si një tryezë e rregullt.

Normalizimi i bazës së të dhënave - dërrmuese në nënpikt (drejtoritë) dhe përkufizimet e lidhjeve

Tabela jonë e tanishme e punonjësve ka një disavantazh që në fushat e pozicionit dhe departamentit, përdoruesi mund të hyjë në çdo tekst që së pari është i mbushur me gabime, pasi një punonjës mund të tregojë departamentin thjesht "atë" dhe punonjësin e dytë, për shembull, Prezantoni "Departamentin e TI", në të tretin "IT". Si rezultat, ajo do të jetë e pakuptueshme për të kuptuar përdoruesin, i.e. A janë të dhënat e të punësuarve nga punonjësit e një departamenti, ose përdoruesi i përshkruar dhe janë 3 departamente të ndryshme? Dhe edhe më shumë, në këtë rast, ne nuk do të jemi në gjendje të grupojmë siç duhet të dhënat për një raport, ku mund të kërkohet të tregojmë numrin e të punësuarve në kontekstin e çdo departamenti.

Pengesë e dytë qëndron në sasinë e ruajtjes së këtij informacioni dhe dyfishimin e saj, i.e. Për çdo punonjës tregohet emri i plotë i departamentit, i cili kërkon në bazën e të dhënave të hapësirës për ruajtjen e secilit simbol nga emri i departamentit.

Disavantazhi i tretë është kompleksiteti i përditësimit të këtyre fushave, nëse emri i një pozicioni ndryshohet, për shembull, nëse keni nevojë të riemërtoni pozicionin "Programues", në "Programuesit e Junior". Në këtë rast, ne do të duhet të bëjmë ndryshime në çdo rresht të tabelës, të cilën pozicioni është i barabartë me "Programuesit".

Për të shmangur disavantazhet e të dhënave dhe është përdorur, të ashtuquajturat, normalizimi i bazës së të dhënave po e shkatërron atë në nënpagesat, tabelat e librave referues. Nuk është e nevojshme të ngjitemi në teorinë në Debrist dhe të studiojmë se format normale përfaqësojnë veten, mjafton për të kuptuar thelbin e normalizimit.

Le të krijojmë 2 tabela të librave të referencës "Pozicionet" dhe "Departamentet", i thërras pozicionet e para dhe të dyta, respektivisht, departamentet:

Krijo pozitat e tavolinës (id int contentity (1,1) nuk null kufizim pk_positions çelësi primar, emri nvarchar (30) nuk null) Krijo departamentet e tabelave (int inty int (1,1) nuk null kufizim PK_Departments kryesore, emri nvarchar (30 ) Nuk është null)
Vini re se këtu kemi përdorur opsionin e ri të identitetit, i cili sugjeron që të dhënat në kolonën e identitetit do të numërohen automatikisht, duke filluar me 1, në hapin 1, i.e. Kur shtoni të dhëna të reja, ato vazhdimisht do të caktohen vlerat 1, 2, 3 etj. Fusha të tilla zakonisht quhen autoincomy. Tabela mund të përcaktojë vetëm një fushë me pronën e identitetit dhe zakonisht, por opsionale, një fushë e tillë është çelësi kryesor për këtë tabelë.

Në një shënim
Në DBMs të ndryshme, zbatimi i fushave me njehsorin mund të bëhet në mënyrën e vet. Në MySQL, për shembull, kjo fushë përcaktohet duke përdorur opsionin auto_increment. Në Oracle dhe Firebird, kjo funksionalitet u përdor për t'u ngritur duke përdorur përdorimet e sekuencës (sekuenca). Por për aq sa unë e njoh Oracle, ka shtuar tashmë opsioni i gjeneruar si identiteti.

Le t'i plotësojmë këto tabela automatikisht, bazuar në të dhënat aktuale të regjistruara në pozicionin dhe departamentin e tabelave të punonjësve:

Plotësoni fushën e emrit të tabelës së pozicioneve, vlerat unike nga fusha e pozicionit të punonjësve Vendosni tabelën e pozicioneve Zgjidhni pozicionin e dallueshëm nga punonjësit ku pozicioni nuk është i pavlefshëm - hidhni të dhënat që pozita nuk është e specifikuar
Unë bëj të njëjtën gjë për tabelën e departamentit:

Futni departamentet (emri) zgjidhni Departamentin e Distinct nga punonjësit ku departamenti nuk është i pavlefshëm
Nëse ne tani hapim pozicionet dhe tabelat e departamenteve, ne do të shohim një grup të numëruar të vlerave në terren:

Zgjidh * nga pozicionet

Zgjidh * nga departamentet

Të dhënat e tabelave tani do të luajnë rolin e librave të referencës në postet dhe departamentet e detyrës. Tani do t'i referohemi posteve dhe departamenteve. Para së gjithash, krijoni fusha të reja në tabelën e punonjësve për ruajtjen e të dhënave të identifikimit:

Shto një fushë për të ndryshuar punonjësit e tabelës Add pozicionid int - shtoni një fushë për të ndryshuar punonjësit e tabelës Add Departamenti Int
Lloji i fushave referuese duhet të jetë si, si në librat e referencës, në këtë rast është int.

Gjithashtu shtoni në tryezë menjëherë në disa fusha mund të jenë me një komandë, të listuara fushat përmes presjes:

ALTER Tabela punonjës shtojnë pozicionin e pozicionuar int, të departamentit int
Tani ne shkruajmë referenca (kufizimet e referencës - çelësi i huaj) për këto fusha në mënyrë që përdoruesi të mos ketë aftësinë për të shkruar në të dhënat në terren, vlerat që mungojnë në mesin e vlerave të vlerave të identitetit në librat e referencës .

ALTER Tabela punonjës shtojnë kufizime fk_employees_positionidet e tasteve të huaja (pozicionid) të referencave (ID)
Dhe të bëjë të njëjtën gjë për fushën e dytë:

ALTER Tabela Punonjës shtoni kufizime fk_employees_department i referencave të referencës (ID)
Tani përdoruesi në këto fusha do të jetë në gjendje të aplikojë vetëm vlerat e ID nga dosja përkatëse. Prandaj, për të përdorur një departament ose pozitë të re, do të jetë e para që të shtoni një hyrje të re në dosjen e duhur. Sepse Postimet dhe departamentet tani ruhen në librat e referencës në një rast të vetëm, pastaj për të ndryshuar emrin, është e mjaftueshme për ta ndryshuar atë vetëm në dosjen.

Emri i kufirit të referencës zakonisht është i përbërë, ai përbëhet nga prefix "FK_", atëherë emri i tabelës po vjen dhe pas nënvizimit është emri i fushës që i referohet identifikuesit të tabelës së dosjeve.

Identifikuesi (ID) zakonisht është një vlerë e brendshme që përdoret vetëm për lidhjet dhe çfarë vlere është ruajtur atje, në shumicën e rasteve është absolutisht indiferent, kështu që ju nuk keni nevojë të përpiqeni të heqin qafe në sekuencën e numrave që ndodhin Në rrjedhën e punës me tabelën, për shembull, pas heqjes së shënimeve nga dosja.

Alter Tabela Tabela shtoni Emrin e Ndërtimit të Tabelës (Fusha1, Fusha 2, ...) Referencat Tabela_Spatch (Fusha1, Fusha 2, ...)
Në këtë rast, kyç primar është paraqitur me një kombinim të disa fushave (fushë1, fushë2, ...) në tryezën e tryezës.

Në të vërtetë, tani do të përditësoni vlerat e pozicionuara dhe të departamenteve të vlerave të identitetit nga librat referues. Ne përdorim komandën e përditësimit për këtë qëllim nga DML:

Update e Set PositionID \u003d (përzgjidhni ID nga pozicionet ku emri \u003d e.position), i cili është i disponueshëm \u003d (përzgjidhni ID nga departamentet ku emri \u003d e.department) nga punonjësit e
Le të shohim se çfarë ndodhi duke ndjekur kërkesën:

Zgjidh * nga punonjësit

Të gjitha, fushat e pozicionuara dhe të departamenteve janë të mbushura me identifikuesit e duhur të pozicionit dhe departamentet në pozicionin dhe fushat e departamenteve në tabelën e punonjësve tani nuk, ju mund të fshini këto fusha:

Alter Tabela punonjës të rënien e pozicionit të kolonës, Departamenti
Tani tabela ka fituar formularin e mëposhtëm:

Zgjidh * nga punonjësit

Id Emri. Ditëlindje Email Pozicionid. I specifikuar.
1000 Ivanov I.I. I PAVLEFSHËM I PAVLEFSHËM 2 1
1001 Petrov P.p. I PAVLEFSHËM I PAVLEFSHËM 3 3
1002 Sidorov S.S. I PAVLEFSHËM I PAVLEFSHËM 1 2
1003 Andreev A.A. I PAVLEFSHËM I PAVLEFSHËM 4 3

Ato. Ne përfundimisht u hoqëm të ruajtjes së informacionit të tepërt. Tani, sipas numrit të pozicioneve dhe departamentit, ne mund të përcaktojmë në mënyrë unike emrat e tyre duke përdorur vlerat në tabelat e referencës:

Zgjidhni e.id, e.name, p.name petessname, d.name Departamenti i emrit të të Left Bashkohu Departamentet D në d.id \u003d e.departmentalid lënë pozitat e bashkangjitjes P në p.id \u003d e.positionid

Në inspektorin e objektit, ne mund të shohim të gjitha objektet e krijuara për këtë tryezë. Nga këtu ju mund të prodhoni manipulime të ndryshme me këto objekte - për shembull, riemëroni ose fshini objekte.

Vlen gjithashtu të përmendet se tabela mund t'i referohet vetvetes, i.e. Ju mund të krijoni një lidhje rekursive. Për shembull, shtoni një fushë tjetër menaxheri në tryezën tonë me punonjësit, të cilët do të tregojnë një punonjës që i nënshtrohet këtij punonjësi. Krijo një fushë:

Punonjësit e tabelës së ndryshueshme shtoni menaxherin int
Në këtë fushë, vlera e pavlefshme është e lejueshme, fusha do të jetë bosh, nëse, për shembull, nuk ka punonjës më të lartë.

Tani le të krijojmë çelësin e jashtëm në tabelën e punonjësve:

ALTER Tabela Punonjësit Shtoni Constraint FK_EMPLYEES_MANAGRIID KEWORE (MAGATERID) Referencat e punonjësve (ID)
Le të krijojmë një diagram dhe të shohim se çfarë duken në mes të tabelave tona:

Si rezultat, ne duhet të shohim figurën e mëposhtme (tabela e punonjësve është e lidhur me tabelat e pozicioneve dhe zhveshjeve, si dhe i referohet vetvetes):

Së fundi, vlen të thuhet se çelësat e referencës mund të përfshijnë opsione shtesë në Delete Cascade dhe në Cascade Update, të cilat sugjerojnë se si të sillen kur fshini ose përditësoni hyrjen në të cilën ka lidhje në tabelën e tabelës. Nëse këto opsione nuk janë të specifikuara, ne nuk mund ta ndryshojmë ID-në në dosjen e tabelës në procesverbal që ka lidhje nga një tabelë tjetër, ne nuk do të jemi në gjendje të fshijmë një hyrje të tillë nga dosja derisa të fshini të gjitha linjat që lidhen me këtë Hyrja ose, ne do të përditësojmë lidhjen me një vlerë tjetër në këto linja.

Për shembull, ri-përzgjedhja me tabelën me opsionin për të fshirë kaskadën për fk_emploes_departmentdent:

Punonjësit e tabelës së drurit krijojnë punonjës të tabelës (int not , emri nvarchar (30), data e ditëlindjes, e-mail nvarchar (30), pozicionid int, departamenti int, menaxheri int, kufizim pk_employees kryesore kryesore (ID), kufizime fk_employees_departmentled çelësi i huaj (i dekoruar ) Referencat Departamentet (ID) në Delete Cascade, Constraint FK_EMPLYEEES_POSITIONIDE KEWNER (POSTIENTID) REFERENCAT POZICAT (ID), Constraint FK_EMPLYEES_MANIBLIZID KEW (ID)) Fut punonjësit (ID, Emri, Ditëlindja, Posited, Departamenti, Managerdi ) Vlerat (1000, n "Ivanov II", "19550219", 2.1, null), (1001, n "PETOV PP", "19831203", 3,3,1003), (1002, n "Sidorov Ss" , "19760607", 1,2,1000), (1003, n "andreev aa", "19820417", 4,3,1000)
Fshini një departament me një identifikues 3 nga tabela e departamenteve:

Fshini departamentet ku id \u003d 3
Le të shohim të dhënat e tabelës së punonjësve:

Zgjidh * nga punonjësit

Id Emri. Ditëlindje Email Pozicionid. I specifikuar. Menaxheri.
1000 Ivanov I.I. 1955-02-19 I PAVLEFSHËM 2 1 I PAVLEFSHËM
1002 Sidorov S.S. 1976-06-07 I PAVLEFSHËM 1 2 1000

Siç mund ta shihni, të dhënat në departamentin 3 nga tabela e punonjësve u pensionuan gjithashtu.

Opsioni në përditësimin e kaskadës sillet në mënyrë të ngjashme, por vepron kur përditëson vlerën e identitetit në dosjen. Për shembull, nëse ndryshojmë ID-në e pozicionit në direktorinë e posteve, atëherë në këtë rast, Departamenti përditësohet në tabelën e punonjësve në vlerën e re të ID që kemi kërkuar në dosjen. Por në këtë rast thjesht nuk do të dëshmojë, sepse Kolona e identitetit në tabelën e departamenteve është opsioni i identitetit, i cili nuk do të na lejojë të kryejmë pyetjen e mëposhtme (të ndryshojë identifikuesin e departamentit 3 deri në 30):

Departamentet e përditësimit të vendosur ID \u003d 30 ku ID \u003d 3
Gjëja kryesore është të kuptoni thelbin e këtyre 2 opsioneve në Delete Cascade dhe në përditësimin e kaskadës. Unë i zbatoj këto opsione shumë në raste të rralla dhe të rekomandojë të menduarit mirë para se t'i specifikoni ato në kufirin e referencës, sepse Me një heqje pa dashje të një rekordi nga një tabelë referimi, kjo mund të çojë në probleme të mëdha dhe të krijojë një reaksion zinxhir.

Shëno Departamentin 3:

Ne japim leje për të shtuar / ndryshuar vlerën e identitetit të identifikimit të identifikimit të identitetit në departamentet e futura (ID, emri) vlerat (3, n "") - ndalojnë shtimin / ndryshimin e identitetit të identifikimit të identitetit.
Plotësisht pastroni tabelën e punonjësve duke përdorur komandën e tabelës së prerë:

Punonjësit e tryezës së prerë.
Dhe rifreskoni të dhënat përsëri duke përdorur komandën e mëparshme të futur:

Vendosni punonjësit (ID, emri, ditëlindja, pozicionet e pozicionuara, të departamenteve, menaxheri) (1000, n "Ivanov I.I.", "19550219", 2,1, null), (1001, n "PETROV PP", "19831203", 3 , 3,1003), (1002, n "Sidorov Ss", "19760607", 1,1,1000), (1003, n "andreev aa", "19820417" 4,3,1000)

I përshtatshëm

Në momentin e dhënë, disa komanda të tjera DDL u shtuan në njohuritë tona:
  • Shtimi i pronës së identitetit në fushë - ju lejon të bëni këtë fushë automatikisht të plotësoni (fushë) për një tabelë;
  • Alter tryezë Name_table Shtoni. list_pole_s_chards - ju lejon të shtoni fusha të reja në tabelë;
  • Alter tryezë Name_table Rënie kolona. list_pole - ju lejon të hiqni fushat nga tabela;
  • Alter tryezë Name_table Shtoni kufizime. Emri i programit Çelësi i huaj.(fusha) Referencat. TABLE_Spatch (Fushat) - ju lejon të përcaktoni lidhjen midis tabelës dhe librit të referencës së tabelës.

Kufizime të tjera - unike, default, kontrolloni

Duke përdorur kufizime unike, mund të thuash se vlerat për çdo rresht në këtë fushë ose në terren duhet të jenë unike. Në rastin e tabelës së punonjësve, ne mund të aplikojmë një kufizim të tillë në fushën e postës elektronike. Vetëm plotësoni vlerat e postës elektronike nëse nuk janë përcaktuar ende:

Përditësimin e punonjësve të vendosur email \u003d " [Email i mbrojtur]"Ku id \u003d 1000 update punonjës të vendosur email \u003d" [Email i mbrojtur]"Ku id \u003d 1001 përditësimin e punonjësve të vendosur email \u003d" [Email i mbrojtur]"Ku id \u003d 1002 përditësimin e punonjësve të vendosur email \u003d" [Email i mbrojtur]"Ku id \u003d 1003
Dhe tani mund të impononi një kufizim unik në këtë fushë:

ALTER Tabela punonjës shtoni kufizime uq_employees_email unik (email)
Tani përdoruesi nuk do të jetë në gjendje të bëjë të njëjtën e-mail nga disa punonjës.

Kufizimi i unike zakonisht quhet si më poshtë - së pari Prefiksi "UQ_" është i pari, atëherë emri i tabelës dhe pas nënvizimit është emri i fushës në të cilën është mbivendosur ky kufizim.

Prandaj, nëse tabela është unike në kontekst, duhet të ketë një kombinim të fushave, atëherë ne i rendisim ato përmes presjes:

Alter Tabela Emri_Table shtoni Emri i Kufizimit Unique (Field1, Fusha 2, ...)
Duke përdorur duke shtuar në fushën e kufizimit të parazgjedhur, ne mund të vendosim vlerën e parazgjedhur që do të zëvendësohet në rast se futja e një rekord të ri Kjo fushë nuk do të renditet në listën e listës së komandës së futur. Ky kufizim mund të vendoset direkt kur krijohet një tabelë.

Le të shtojmë një fushë të re "të marrë datën" në tabelën e punonjësve dhe ta quajmë të marrësh në punë dhe të them se vlera e parazgjedhur e kësaj fushe do të jetë data e tanishme:

ALTER POPLY POBLEY ADD HIREUSTE DATE NUK NULL SYSDETIME ()
Ose nëse kolona e punësuar tashmë ekziston, atëherë ju mund të përdorni sintaksën e mëposhtme:

ALTER Tabela punonjës shtoni SySdatetime Default () për të kërkuar në punë
Këtu nuk kam treguar emrin e kufizimit, sepse Në rastin e parazgjedhur, kam pasur mendimin se nuk ishte aq kritike. Por nëse ju bëni në një mënyrë të mirë, atëherë unë mendoj se ju nuk keni nevojë të jetë dembel dhe me vlerë të vendosni një emër normal. Kjo është bërë si më poshtë:

ALTER Tabela punonjës shtojnë kufizime df_employees_hiredate default sysdatetime () për të marrë në punë
Nuk ishte se kjo kolonë më parë, atëherë kur shton çdo hyrje në fushën e punësuar, vlera aktuale e datës do të futet.

Kur shtoni një hyrje të re, data e tanishme gjithashtu do të futet automatikisht, sigurisht, nëse ne nuk e specifikojmë atë, dmth. Mos specifikoni në listën e kolonave. Le ta tregojmë këtë në shembullin pa specifikuar fushën e punësuar në listën e vlerave të shtuara:

Vendosni punonjësit (ID, Emri, Email) vlerat (1004, n "Sergeev S.S.", " [Email i mbrojtur]")
Le të shohim se çfarë ndodhi:

Zgjidh * nga punonjësit

Id Emri. Ditëlindje Email Pozicionid. I specifikuar. Menaxheri. Të punësojë.
1000 Ivanov I.I. 1955-02-19 [Email i mbrojtur] 2 1 I PAVLEFSHËM 2015-04-08
1001 Petrov P.p. 1983-12-03 [Email i mbrojtur] 3 4 1003 2015-04-08
1002 Sidorov S.S. 1976-06-07 [Email i mbrojtur] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [Email i mbrojtur] 4 3 1000 2015-04-08
1004 Sergeev S.S. I PAVLEFSHËM [Email i mbrojtur] I PAVLEFSHËM I PAVLEFSHËM I PAVLEFSHËM 2015-04-08

Kontrolloni kufirin e kontrollit përdoret kur është e nevojshme të kontrolloni vlerat e futura në fushë. Për shembull, ne ofrojmë këtë kufizim në fushën e numrave të tabelës, të cilat ne kemi një identifikues të punonjësve (ID). Duke përdorur këtë kufizim, le të themi se numrat e tabletëve duhet të jenë nga 1000 në 1999:

ALTER Tabela Punonjës shtoni Constraint ck_employees_id Check (ID midis 1000 dhe 1999)
Kufizimi zakonisht quhet "prefiksi i CK_" shkon së pari, atëherë emri i tabelës dhe emri i fushës në të cilën vendoset ky kufizim.

Le të përpiqemi të shtojmë një hyrje të pavlefshme për të verifikuar që punimet e kufizimit (ne duhet të marrim gabimin e duhur):

Futni vlerat e punonjësve (ID, email) (2000, " [Email i mbrojtur]")
Dhe tani unë do të ndryshoj vlerën e futur në 1500 dhe të sigurohem që hyrja do të futet:

Vendosni punonjësit (ID, email) vlerat (1500, " [Email i mbrojtur]")
Ju gjithashtu mund të krijoni kufizime unike dhe të kontrolloni pa specifikuar emrin:

Punonjësit e tabelave të ndryshueshme shtojnë punonjësit e tabelave unike (e-mail) të alter-it Add Check (ID midis 1000 dhe 1999)
Por kjo nuk është një praktikë e mirë dhe është më mirë të vendosësh emrin e kufizimit në mënyrë eksplicite, sepse Për të zgjidhur më vonë, e cila do të jetë më e vështirë, ju do të duhet të hapni objektin dhe të shikoni atë që ai përgjigjet.

Me emër të mirë, shumë informacion rreth kufizimit mund të gjenden direkt me emrin e tij.

Dhe, në përputhje me rrethanat, të gjitha këto kufizime mund të krijohen menjëherë kur të krijohen një tabelë, nëse nuk është ende. Fshini tabelën:

Punonjësit e tavolinës së rënies.
Dhe rivendosjen e saj me të gjitha kufizimet e krijuara nga një tabelë e krijimit:

Krijo punonjës të tabelës (id int not , emër nvarchar (30), ditëlindjen e ditëlindjes, email nvarchar (30), pozicionid int, i departamentit int, të punësojë datën jo null default sysdatetime (), - për default unë do të bëjë një përjashtim nga kufizimi pk_emplyees Çelësi primar (id), kufizimi i fk_employees_department i referencës së departamenteve (id), kufizimi i fk_employees_positiond tastet e huaja (id), kufizim uq_emploes_email unik (email), Constraint ck_employe_id check (id midis 1000 dhe 1999))

Vendosni punonjësit (ID, Emri, Ditëlindja, Email, pozicionid, i Departamentit) (1000, n "Ivanov I.I.", "19550219", " [Email i mbrojtur]", 2.1), (1001, n" PETROV PP "," 19831203 "," [Email i mbrojtur]", 3,3), (1002, n" Sidorov S.s. "," 19760607 "," [Email i mbrojtur]", 1,2), (1003, n" Andreev A.A. "," 19820417 "," [Email i mbrojtur]",4,3)

Pak për indekset e krijuara gjatë krijimit të kufizimeve kryesore dhe unike

Siç mund ta shihni në screenshot më lart, kur krijoni kufizimet e çelësit primar dhe unike, indekset krijohen automatikisht me të njëjtat emra (pk_employees dhe uq_employees_email). By default, indeksi kryesor kryesor është krijuar si i grumbulluar, dhe për të gjitha indekset e tjera si të pakontrolluara. Vlen të thuhet se koncepti i një indeksi të grupit nuk është në të gjitha DBMS. Tabela mund të ketë vetëm një indeks të grupit (clustered). Clustered - do të thotë që shënimet e tryezës do të renditen nga ky indeks, mund të thuhet gjithashtu se ky indeks ka qasje të drejtpërdrejtë në të gjitha të dhënat e tabelës. Është për të folur indeksin kryesor të tabelës. Nëse ju thoni më shumë të vrazhdë, atëherë ky është një indeks i dehur në tryezë. Indeksi i Cluster është një mjet shumë i fuqishëm që mund të ndihmojë kur optimizon kërkesat, ndërsa thjesht mbani mend këtë. Nëse duam të themi se indeksi i klasterit nuk përdoret në çelësin primar, por për një indeks tjetër, atëherë kur krijohet një çelës primar, ne duhet të specifikojmë opsionin e pacaktuar:

ALTER TABELA EMRI_TABLE shtoni emrin primar primar të kufizimeve të kufizuara (fushë1, fushë 2, ...)
Për shembull, ne do të bëjmë Indeksin e Kufizimit të PK_Motemployees, dhe indeksi i limitit UQ_EMPLYEES_EMAIL është grup. Para së gjithash, fshini këto kufizime:

Alter Tabela e punonjësve rënia e kufizimeve pk_employees Alter Tabela Punonjësit Drop Constraint UQ_EMPLOESS_Email
Tani le t'i krijojmë ato me opsionet e grumbulluara dhe të nonculuara:

Alter Tabela Punonjës shtoni kufizime PK_EMPLYEES KEY PRIMORE (ID) ALTER Tabela Punonjës Add Constraint UQ_EMPLYEES_EMAIL UNIVE CLUSTERED (Email)
Tani, duke përzgjedhur një mostër nga tabela e punonjësve, ne do të shohim se të dhënat janë renditur nga uq_employees_email indeks:

Zgjidh * nga punonjësit

Id Emri. Ditëlindje Email Pozicionid. I specifikuar. Të punësojë.
1003 Andreev A.A. 1982-04-17 [Email i mbrojtur] 4 3 2015-04-08
1000 Ivanov I.I. 1955-02-19 [Email i mbrojtur] 2 1 2015-04-08
1001 Petrov P.p. 1983-12-03 [Email i mbrojtur] 3 3 2015-04-08
1002 Sidorov S.S. 1976-06-07 [Email i mbrojtur] 1 2 2015-04-08

Para kësaj, kur indeksi i grupit ishte indeksi pk_employeees, shënimet e parazgjedhur u renditën nga fusha ID.

Por në këtë rast është vetëm një shembull që tregon thelbin e indeksit të klasterit, sepse Më shumë gjasa, tabela e punonjësve do të bëhet nga fusha ID dhe në disa raste ndoshta ajo do të veprojë si një direktori.

Për librat referues, zakonisht është e këshillueshme që indeksi i grupit të ndërtohet në një çelës primar, sepse Në pyetjet, shpesh i referohemi certifikatës së dosjes për të marrë, për shembull, emrat (postimet, departamentet). Këtu mbani mend atë që kam shkruar më lart, se indeksi i grupit ka qasje të drejtpërdrejtë në rreshtat e tabelës, dhe rrjedh se ne mund të marrim vlerën e çdo kolone pa lartësi shtesë.

Indeksi i grupit është i dobishëm për të aplikuar në fushat me të cilat mostra është më shpesh.

Ndonjëherë në tabelat krijojnë një çelës në një fushë surrogate, në këtë rast është e dobishme për të ruajtur opsionin e indeksit të grumbulluar për një indeks më të përshtatshëm dhe për të specifikuar opsionin e pakontrolluar kur krijoni një çelës primar surrogate.

I përshtatshëm

Në këtë fazë, ne u takuam me të gjitha llojet e kufizimeve, në formën e tyre më të thjeshtë, të cilat krijohen nga ekipi i tipit "ALTER TABLE_TABLE_TABLE shtoni emrin e kufizimit:": ":
  • ÇELESI PRIMAR. - çelesi primar;
  • Çelësi i huaj. - Konfiguro lidhjet dhe kontrollin e integritetit të referencës së të dhënave;
  • Unik - ju lejon të krijoni unike;
  • Kontrolloni. - lejon korrektësinë e të dhënave të dhëna;
  • Default. - ju lejon të vendosni vlerën e parazgjedhur;
  • Vlen të përmendet se të gjitha kufizimet mund të fshihen duke përdorur komandën " Alter tryezë Name_table Kufizimi i rënies. Emri i provimit. "
Ne gjithashtu preku pjesë pjesërisht temën e indekseve dhe disassembled konceptin e grupit ( Clustered.) dhe jocluster ( I nonculluar) Indeks.

Krijimi i indekseve të pavarura

Nën pavarësinë këtu i referohet indekseve që nuk janë krijuar për të kufizuar çelësin primar ose unik.

Indekset mbi fushën ose fushat mund të krijohen nga komanda e mëposhtme:

Krijo Indeksin IDX_EMPLYEEES_NAME ON PUNONJËSIT (NAME)
Gjithashtu, këtu ju mund të specifikoni opsionet e grumbulluara, jo të ndotura, unike, si dhe ju mund të specifikoni drejtimin e klasifikimit të secilit fushë individuale asc (default) ose:

Krijo indeks unik jo të ndërlikuar uq_employs_emaildesc mbi punonjësit (email divizioni)
Kur krijohet një indeks jocluster, opsioni i pakontrollosur mund të lirohet, sepse Ajo nënkuptohet me parazgjedhje, këtu është treguar thjesht për të specifikuar pozicionin e opsionit të grumbulluar ose të nonculluara në ekip.

Fshij indeksin mund të jetë si vijon:

Drop indeks idx_employees_name për punonjësit
Indekset e thjeshta, si dhe kufizimet mund të krijohen në kontekstin e komandës së tabelës së krijimit.

Për shembull, hiqni tabelën:

Punonjësit e tavolinës së rënies.
Dhe ri-paraqesin atë me të gjitha kufizimet e krijuara dhe indekset me një komandë të tabelës:

Krijo punonjës të tabelës (id int not , emër nvarchar (30), data e ditëlindjes, email nvarchar (30), pozicionid int, i departamentit int, të punësojë datën jo null constraint df_employees_hiredate default sysdatetime (), menaxheri int, kufizime pk_employees kryesore (id ), Constraint fk_employees_departsid kyç i jashtëm (idfadid) Referencat Departamentet (ID), kufizime FK_EMPLYEES_POSITIONI IDEKSIONS (ID), Constraint FK_EMPLYEES_MANIBLIZID KEULLI I JASHTME (ID), Constraint UQ_EMPLYEES_EMAIL UNIK (EMAIL), CONDAST CK_EMPLEEES_ID Kontrolloni (ID midis 1000 dhe 1999), indeks idx_emploes_name (name))
Së fundi, futni në tryezën e punonjësve tanë:

Vendosni punonjësit (ID, Emri, Ditëlindja, Email, pozicionid, i Departamenti, Manager) (1000, n "Ivanov I.I.", "19550219", " [Email i mbrojtur]", 2.1, null), (1001, n" PETROV PP "," 19831203 "," [Email i mbrojtur]", 3,3,1003), (1002, n" Sidorov S.s. "," 19760607 "," [Email i mbrojtur]", 1,2,1000), (1003, n" andreev aa. "," 19820417 "," [Email i mbrojtur]",4,3,1000)
Përveç kësaj, vlen të përmendet se në indeksin jo-klaster mund të përfshini vlerat duke specifikuar ato në përfshirjen. Ato. Në këtë rast, indeksi i përfshirjes do të kujtojë indeksin e klasterit, vetëm tani indeksi nuk është i dehur në tryezë, dhe vlerat e nevojshme janë të dehur në indeks. Prandaj, indekse të tilla mund të përmirësojnë performancën e pyetjeve për të zgjedhur (SELECT) nëse të gjitha fushat e listuara janë në dispozicion në Indeks, atëherë është e mundur të apelohet në tabelë fare. Por natyrisht rrit madhësinë e indeksit, sepse Vlerat e fushave të listuara janë dyfishuar në indeks.

Prerë nga msdn. Sintaksa e Komandës së Përbashkët për Krijimin e Indekseve

Krijo [unik] [Clustered | Noncustered] index_name ind (Kolona [ASC |] [, ... n]) [përfshijnë (column_name [, ... n])]

I përshtatshëm

Indekset mund të rrisin normën e mostrave të të dhënave (zgjidhni), por indekset zvogëlojnë shpejtësinë e modifikimit të të dhënave të tabelës, sepse Pas çdo modifikimi, sistemi do të duhet të rindërtojë të gjitha indekset për një tabelë specifike.

Është e këshillueshme që çdo rast të gjesh zgjidhjen optimale, mesin e artë, në mënyrë që performanca e mostrimit dhe modifikimet e të dhënave të ishte në nivelin e duhur. Strategjia për krijimin e indekseve dhe sasisë së tyre mund të varet nga shumë faktorë, për shembull, sa shpesh të dhënat ndryshohen në tabelë.

Përfundim nga DDL.

Siç mund ta shihni, gjuha DDL nuk është aq e palosur sa mund të duket në shikim të parë. Këtu isha në gjendje të tregoja pothuajse të gjitha planet themelore, duke vepruar vetëm tre tryeza.

Gjëja kryesore është të kuptojmë thelbin, dhe pjesën tjetër të praktikës.

Fat i mirë për ju në zotërim këtë gjuhë të mrekullueshme të quajtur SQL.

Deri më sot, kurse SQL për kettles po bëhen gjithnjë e më popullore. Kjo mund të jetë shumë e lehtë për t'u shpjeguar, sepse në botën moderne ju ende mund të përmbushni të ashtuquajturat shërbime të uebit "dinamik". Ata ndryshojnë shell mjaft fleksibël dhe bazohen në të gjithë programuesit e rishtar që vendosën të kushtojnë vende, të regjistruara kryesisht në kurse SQL "për teapots".

Pse të studioni këtë gjuhë?

Para së gjithash, SQL është mësuar të krijojë më tej një shumëllojshmëri të gjerë të aplikacioneve për një nga motorët më të njohura të blogut sot - WordPress. Pas kalimit të disa mësimeve të thjeshta, mund të krijoni kërkesa për çdo kompleksitet që vetëm konfirmon thjeshtësinë e kësaj gjuhe.

Çfarë është SQL?

Ose gjuha e pyetjeve të strukturuara, u krijua me një qëllim të vetëm: për të përcaktuar qasjen tek ata dhe për t'i përpunuar ato për periudha mjaft të shkurtra kohore. Nëse e dini vlerën SQL, atëherë do të kuptohet se ky server është referuar si i ashtuquajturi gjuhë "Necrossound". Kjo është, ajo përfshin vetëm një përshkrim të çdo përbërësi ose rezultate që dëshironi të shihni në të ardhmen në vend. Por kur nuk tregon se cilat rezultate të sakta do të marrin. Çdo kërkesë e re në këtë gjuhë është si një "superstrukturë" shtesë. Është në këtë mënyrë që ata të hynë në bazën e të dhënave, kërkesat dhe do të ekzekutohen.

Cilat procedura mund të kryhen duke përdorur këtë gjuhë?

Pavarësisht thjeshtësisë së saj, baza e të dhënave SQL ju lejon të krijoni mjaft një shumëllojshmëri të gjerë të pyetjeve. Pra, çfarë mund të bëni nëse e mësoni këtë gjuhë të rëndësishme në programim?

  • krijo një shumëllojshmëri të tabelave;
  • marrin, ruajnë dhe ndryshojnë të dhënat e marra;
  • ndryshojnë strukturat e tabelave sipas gjykimit të tyre;
  • kombinoni informacionin e marrë në blloqe të vetme;
  • llogarisni të dhënat e marra;
  • ofrojnë mbrojtje të plotë të informacionit.

Cilat skuadra janë më të njohurit në këtë gjuhë?

Nëse vendosni të vizitoni kurse SQL për kettles, atëherë do të merrni informacion të detajuar për komandat që përdoren në krijimin e kërkesave me të. Më të zakonshmet sot janë ato:

  1. DDL - është një komandë që përcakton të dhënat. Përdoret për të krijuar, ndryshuar dhe fshirë një shumëllojshmëri të gjerë të objekteve në bazën e të dhënave.
  2. DCL - është një komandë që menaxhon të dhënat. Përdoret për të siguruar qasje në përdorues të ndryshëm për informacion në bazën e të dhënave, si dhe për të përdorur tabela ose pikëpamje.
  3. TCL është një ekip që kontrollon një shumëllojshmëri të transaksioneve të gjinisë. Qëllimi i tij kryesor është të përcaktojë goditjen e transaksionit.
  4. DML - manipulon të dhënat e marra. Detyra e saj hyn në leje për të lëvizur informacione të ndryshme nga baza e të dhënave ose për ta bërë atë atje.

Llojet e privilegjeve që ekzistojnë në këtë server

Nën privilegje nënkuptohen veprimet që një ose një tjetër mund të kryhet në përputhje me statusin e saj. Minimal definitivisht është identifikimi i zakonshëm. Natyrisht, me kohën e privilegjeve mund të ndryshojë. Më të vjetër do të fshihen, dhe të reja për të shtuar. Deri më sot, të gjithë ata që i nënshtrohen kurseve të serverëve SQL për kettles njihen se ka disa lloje të veprimeve të lejuara:

  1. Lloji i objektit - Përdoruesi lejohet të kryejë çdo komandë vetëm në lidhje me një objekt të caktuar që është në bazën e të dhënave. Në të njëjtën kohë, privilegjet ndryshojnë për objekte të ndryshme. Ata janë gjithashtu të lidhur jo vetëm për një përdorues të caktuar, por edhe për tavolinat. Nëse dikush, duke përfituar nga aftësitë e saj, krijoi tabelën, atëherë konsiderohet pronari i saj. Prandaj, në të drejtën e tij për të caktuar privilegje të reja për përdoruesit e tjerë që lidhen me informacionin në të.
  2. Lloji i sistemit është i ashtuquajturi të drejtën e autorit ndaj të dhënave. Përdoruesit që kanë marrë privilegje të tilla mund të krijojnë objekte të ndryshme në bazën e të dhënave.

Historia e krijimit të SQL.

Kjo gjuhë u krijua nga IBM Research Lab në vitin 1970. Në atë kohë, emri i tij ishte disi i ndryshëm (vazhdim), por pas disa vitesh përdorimi u ndryshua, paksa e shkurtër. Përkundër kësaj, edhe sot, shumë profesionistë të njohur të programeve globale janë ende të theksuara nga traktati. Krijuar ishte SQL me një gol të vetëm - për të shpikur një gjuhë që do të ishte kaq e thjeshtë saqë mund të kishte edhe probleme të veçanta për të mësuar edhe përdoruesit e thjeshtë të internetit. Interesante faktin se në atë kohë SQL nuk ishte e vetmja gjuhë e ngjashme. Në Kaliforni, një grup tjetër specialistësh zhvilluan ingres të ngjashme, por ai kurrë nuk u bë i përhapur. Deri në vitin 1980, ka pasur disa ndryshime SQL, të cilat ishin të ndryshme nga njëri-tjetri. Për të parandaluar konfuzionin, në vitin 1983 u krijua një version standard, i cili është popullor sot. Kurse SQL "për teapots" ju lejojnë të mësoni shumë më tepër për shërbimin dhe ta studioni plotësisht atë në disa javë.

Komandat kryesore SQL që çdo programues duhet të dijë

SQL ose gjuhë gjuhësore e strukturuar (gjuha e pyetjeve të strukturuara) është projektuar për të menaxhuar të dhënat në sistemin e bazës së të dhënave relacionale (RDBMS). Ky artikull do të tregojë për komandat SQL të përdorura shpesh që çdo programues duhet të jetë i njohur. Ky material është ideal për ata që duan të rifreskojnë njohuritë e tyre për SQL para një interviste për punë. Për ta bërë këtë, çmontoni shembujt e dhënë në artikull dhe mos harroni atë që kaloi në çifte të bazave të të dhënave.

Ju lutem vini re se në disa sisteme të bazës së të dhënave, duhet të specifikoni një pikëpresje në fund të secilit operator. Një pikëpresje është një tregues standard deri në fund të çdo operatori në SQL. Shembujt përdorin MySQL, kështu që është e nevojshme pika me presje.

Vendosja e bazës së të dhënave për shembuj

Krijo një bazë të dhënash për të demonstruar komanda. Ju do të duhet të shkarkoni dy skedarë për punë: dll.sql dhe insertstatements.sql. Pas kësaj, hapni terminalin dhe hyni në tastierë MySQL duke përdorur komandën e mëposhtme (artikulli sugjeron që MySQL është instaluar tashmë në sistem):

MySQL -u rrënjë -p

Pastaj futni fjalëkalimin.

Drejtoni komandën e mëposhtme. Telefononi bazën e të dhënave "Universiteti":

Krijo Universitetin e Bazës së të Dhënave; Përdorni Universitetin; Burim ; Burim

Komandat për të punuar me bazat e të dhënave

1. Shikoni bazat e të dhënave të arritshme

Trego bazat e të dhënave;

2. Krijimi i një baze të re

Krijo bazën e të dhënave;

3. Zgjidhni bazën e të dhënave për përdorim

Përdorim ;

4. Importo komandat SQL nga File.SQL

Burim ;

5. Fshirja e një baze të dhënash

Drop Baza e të dhënave. ;

Duke punuar me tavolina

6. Shikoni tabelat në dispozicion në bazën e të dhënave

Trego tabelat;

7. Krijimi i një tabele të re

Krijoj tabelën ( , , ÇELESI PRIMAR ( ), Çelësi i huaj ( ) Referencat. ());

Kufijtë e integritetit kur përdorin tabelën e krijimit

Mund të jetë e nevojshme për të krijuar kufizime për kolona të caktuara në tabelë. Kur krijoni një tabelë, mund të vendosni kufizimet e mëposhtme:

  • qeliza tavoline nuk mund të jetë null;
  • kyç primar - kyç primar (col_name1, col_name2, ...);
  • Çelësi i jashtëm i jashtëm (col_namex1, ..., col_namexn) Referencat tabela_name (col_namex1, ..., col_namexn).

Ju mund të vendosni më shumë se një çelës primar. Në këtë rast, rezulton një çelës primar i përbërë.

Shembull

Krijo një tabelë "instruktor":

Krijo instruktor Tabela (ID Char (5), Emri Varchar (20) NUK NULL, DEPT_NAME Varchar (20), paga numerike (8.2), çelësi kryesor (id), çelësi i huaj (DEPT_NAME));

8. Informacioni i tabelës

Ju mund të shihni informacione të ndryshme (lloji i vlerave, është çelësi ose jo) për kolonat e tabelës së komandës tjetër:

Përshkruaj ;

9. Shtimi i të dhënave në tabelë

Fut në (, , , ...) vlerat ( , , , …);

Kur shtoni të dhëna në çdo kolonë të tabelës, nuk është e nevojshme të specifikoni emrat e kolonave.

Fut në Vlerat ( , , , …);

10. Përditësimi i të dhënave të tabelës

Përditësoni. Vendosur. = , = ... ku ;

11. Fshirja e të gjitha të dhënave nga tabela

Fshini nga. ;

12. DELETE TABELA

Tryezë ;

Komandat për të krijuar kërkesa

13. Zgjidhni

Zgjidh përdoret për të marrë të dhëna nga një tabelë specifike:

Zgjedh , ... nga. ;

Komanda tjetër mund të tërheqë të gjitha të dhënat nga tabela:

Zgjidh * nga. ;

14. Zgjidhni të dallueshme

Në kolonat e tabelës mund të përmbajnë të dhëna të përsëritura. Përdorni zgjidhni të dallueshme për të marrë vetëm të dhëna jo të përsëritura.

Zgjidhni të dallueshme. , ... nga. ;

15.

Ju mund të përdorni ku fjalen në zgjedhjen për të specifikuar kushtet në pyetjen:

Zgjedh , ... nga. Ku ;

Kushtet e mëposhtme mund të vendosen në pyetjen:

  • krahasimi i tekstit;
  • krahasimi i vlerave numerike;
  • operacionet logjike dhe (s), ose (ose) dhe jo (mohim).

Shembull

Provoni të ekzekutoni komandat e mëposhtme. Kushtojini vëmendje kushteve të specifikuara aty ku:

Zgjidhni * Nga kurs ku detd_name \u003d 'comp. Sci. '; Zgjidh * Nga kurs ku kreditë\u003e 3; Zgjidhni * Nga kurs ku detd_name \u003d "comp. Sci." Dhe kredi\u003e 3;

16. Grupi nga.

Grupi sipas operatorit përdoret shpesh me funksione agregate, të tilla si numërimi, max, min, shuma dhe avg, për grupimin e vlerave të prodhimit.

Zgjedh , ... nga. Grup nga. ;

Shembull

Tërhiqni numrin e kurseve për çdo fakultet:

Zgjidhni Count (kurs_id), DEPT_NAME nga grupi i kursit nga DEPT_NAME;

17. Duke pasur.

Fjala kyçe u shtua në SQL sepse ku nuk mund të përdoret për të punuar me funksione agregate.

Zgjedh , ... nga. Grup nga. Që ka

Shembull

Ne do të tërheqim një listë të fakulteteve që kanë më shumë se një kurs:

Zgjidhni Count (kurs_id), dept_name nga grupi i kursit nga deft_name që ka numërimin (kurs_id)\u003e 1;

18. Rendit nga.

Rendit nga përdoret për të renditur rezultatet e një kërkese që zbret ose në rritje. Rendit nga Sortes Ascending Nëse metoda Asc ose Desc Sorting nuk specifikon.

Zgjedh , ... nga. Urdhër nga. , , ... asc. |

Shembull

Tërhiqni një listë të kurseve në ngjitjen dhe zbritjen e numrit të kredive:

Zgjidh * nga porosia e kursit nga kreditë; Zgjidh * Nga Rendi i kursit nga Credits;

19. Mes.

Midis përdoret për të zgjedhur vlerat e të dhënave nga një hendek i veçantë. Vlerat numerike dhe tekstuale mund të përdoren si dhe datat.

Zgjedh , ... nga. Ku Ndërmjet. Dhe. ;

Shembull

Ne do të tërheqim listën e instruktorëve, paga e të cilave është më shumë se 50,000, por më pak se 100,000:

Zgjidh * nga instruktori ku paga midis 50,000 dhe 100000;

20. Ashtu si

Deklarata e ngjashme është përdorur në Ku për të vendosur shabllonin e kërkimit të një vlere të ngjashme.

Ka dy operatorë të lirë që përdoren si:

  • % (jo, një ose më shumë karaktere);
  • _ (një karakter).
Zgjedh , ... nga. Ku Si ;

Shembull

Tërhiqni listën e kurseve, emri i të cilit përmban "në" dhe listën e kurseve, emri i të cilit fillon me "CS-":

Zgjidh * nga kursi ku titulli si '% në%'; Zgjidh * nga kursi ku kurs_id si "CS -___";

21. In.

Duke përdorur, ju mund të specifikoni vlera të shumta për operatorin ku:

Zgjedh , ... nga. Ku Në ( , , …);

Shembull

Ne do të tërheqim një listë të studentëve nga drejtimet e Comp. Sci., Fizikë dhe Elec. Eng.:

Zgjidh * nga studenti ku DEPT_NAME në ('COMP. SCI.', 'Fizikë', 'Elec.');

22. Bashkohuni.

Join përdoret për të komunikuar dy ose më shumë tabela duke përdorur atribute të zakonshme brenda tyre. Imazhi më poshtë tregon mënyra të ndryshme për të kombinuar në SQL. Kushtojini vëmendje ndryshimit midis shoqatës së jashtme të majtë dhe shoqatës së drejtë të jashtme:

Zgjedh , ... nga. Bashkohen. Në. = ;

Shembulli 1.

Ne do të tërheqim një listë të të gjitha kurseve dhe informacionin përkatës të fakultetit:

Zgjidh * nga departamenti i bashkimit të kursit në kurs.dept_name \u003d Department.Dept_name;

Shembulli 2.

Tërhiqni një listë të të gjitha kurseve të detyrueshme dhe detaje rreth tyre:

Zgjidh Prereq.Course_ID, Titulli, Dept_name, Credits, Prereq_ID nga Prereq Lënia e Jashtme e Jashtme në Prereq.Course_ID \u003d kurs.course_id;

Shembulli 3.

Ne do të tërheqim një listë të të gjitha kurseve, pavarësisht nëse ato janë të nevojshme ose jo:

Zgjidh kurs.course_id, titull, dept_name, kredi, prereq_id nga prereq e drejtë e jashtme bashkohet me kurs në prereq.course_id \u003d kurs.course_id;

23. Shiko.

Pamja është një tabelë virtuale SQL, e krijuar si rezultat i një shprehjeje. Ajo përmban rreshta dhe kolona dhe është shumë e ngjashme me tabelën e zakonshme SQL. Pamja gjithmonë tregon informacionin më të fundit nga baza e të dhënave.

Krijesë

Krijo pamje. Siç , ... nga. Ku ;

Heqje

Pikëpamje. ;

Shembull

Krijo një pamje, e përbërë nga 3 kurse kredi:

24. Funksionet agregate

Këto funksione përdoren për të marrë një rezultat kumulativ që lidhet me të dhënat në shqyrtim. Më poshtë janë përdorur zakonisht funksionet e grumbulluara:

  • Count (col_name) - kthen numrin e rreshtave;
  • Shuma (col_name) - kthen sasinë e vlerave në këtë kolonë;
  • AVG (col_name) - kthen vlerën mesatare të kësaj kolone;
  • Min (col_name) - kthen vlerën më të vogël të kësaj kolone;
  • Max (col_name) - kthen vlerën më të madhe të kësaj kolone.

25. Subqueries të mbivendosur

Subjekti i investuar janë queries SQL që përfshijnë SELECT, nga dhe ku shprehjet e investuara në një kërkesë tjetër.

Shembull

Gjeni kurse që u mësuan në rënien e vitit 2009 dhe në pranverën e vitit 2010:

Zgjidh kursin e dallueshëm nga seksioni ku semestri \u003d 'bien' dhe viti \u003d '2009 dhe kurs në (Select Woss_ID nga seksioni ku semestri \u003d' pranverë 'dhe viti \u003d 2010);

Gjithkush ka një mendim se si të shkruajë kodin TSQL: në formatimin, caktimin e variablave, funksionet e sistemit, standardet e ANSI ose ndonjë çështje tjetër. Dhe këto mendime mund të ndryshojnë ndjeshëm nga njëri-tjetri, siç dëshmohet nga shumë mesazhe në forume dhe diskutime të nxehta në komentet e artikujve. Por shumica do të pajtohen se kodi i mirë i lexueshëm dhe i lartë është zgjidhja më e mirë për të gjithë. Sigurisht, të gjithë snag është se si ta arrihet kjo.

Është mirë që të filloni me krijimin e një sërë standardesh që do të ndihmojnë në identifikimin e zhvilluesve të T-SQL, dhe pastaj t'i referohen atyre kur ndërtimi i zgjidhjeve. Kështu, standardet ndihmojnë në eliminimin e dallimeve dhe të punojnë drejt një qëllimi të përbashkët.

Në këtë artikull, unë do të përqendrohem në detaje mbi parimet e përgjithshme që mund të aplikohen në kodin, pavarësisht nga llojet e operatorëve të T-SQL. Ai mbulon çështje të tilla si formatimi, funksionet e sistemit, elementët e vjetër të gjuhës dhe variablat e përcaktuar nga përdoruesi.

Lexueshmërinë dhe aspekte të tjera

Shumë artikuj janë shkruar për formatimin e TSQL. Ndonjëherë në një pikë të caktuar ju duhet të shihni pjesën më të madhe të kodit, kuptoni se çfarë e bën kodin, për të mos përmendur identifikimin e problemeve të mundshme.

Si shembull, ne përdorim dhe përzgjedh deklaratat që shkruhen me shkronja të linjës, pa linja ose ndarës të hapësirës, \u200b\u200bpërveç kur është e nevojshme:

përdorni aventurensworks2014 shkoni zgjidhni empd.businessentyid, psn.lasname, psn.lastname, emp.SickLeaveHours Sickleave, Emp.NationDnumber Natid, Emp.Jobtitle nga HumanResources.MoMplyee Emp Inner bashkohet me person. Emp.Jobtitle \u003d "(! Lang: Teknik i prodhimit - WC60" or emp.jobtitle="teknik i prodhimit - WC50" order by emp.JobTitle desc,EmpID asc!}

By default, SQL Server është konfiguruar në mënyrë që regjistri i rastit të mos ketë rëndësi. Prandaj, nuk ka asnjë arsye për të cilën kjo qasje nuk mund të përdoret. Ose qasje që ilustron shembullin e mëposhtëm:

Përdorni aventurensworks2014 shkoni zgjidhni empd.businessentyid, psn.lasname, psn.lastname, emp.SickLeaveHours Sickleave, Emp.NationDnumber Natid, Emp.Jobtitle nga HumanResources.MoMplyee Emp Inner bashkohet me person. Emp.Jobtitle \u003d "(! Lang: Teknik i prodhimit - WC60" OR EMP.JOBTITLE="Teknik i prodhimit - WC50" ORDER BY EMP.JOBTITLE DESC,EMPID ASC!}

Kjo është mjaft e pranueshme. Por është e pamundur të lexohet. Imagjinoni që ju duhet të shihni një skript që përmban qindra rreshta të një kodi të tillë.

Edhe kodi TSQL konvertohet, i cili është shumë më i mirë se kjo, mund të jetë e ndërlikuar për të kuptuar nëse është e paqëndrueshme ose e organizuar rastësisht. Por shikoni se çfarë ndodh kur i ndajmë deklaratën e zgjedhur TSQL për disa rreshta, futni artikuj individualë, fjalë kyçe shkruani në shkronja të mëdha dhe shtoni komente për të shpjeguar operatorin:

/ * Hiqni të dhënat e stafit teknik të WC60 dhe WC50. * / Përdor AventurëWorks2014; Shko Select Emp.BusinessentyID si Empd, Psn.Firstname, PSN.LastName, Emp.SickLeaveHours si Sickleave, Emp.NationDnumber si Natid, Emp.Jobtitle nga HumanResources.Mouneee AS PMM Inner Join Person.Person si PSN në Emp.BusinessentyID \u003d PSN .BusinessentiTëd ku (emp.jobtitle \u003d "(! Lang: Teknik i prodhimit - WC60") OR (emp.JobTitle = "Teknik i prodhimit - WC50") ORDER BY emp.JobTitle DESC, EmpID ASC;!}

Ky kod është shumë më i lehtë për t'u marrë parasysh se ai që është dhënë në shembujt e mësipërm. Përdorimi i zhytur në mendime të rreshtave të vargjeve, boshllëqeve, letrave të mëdha dhe indends lehtëson kuptimin e kodit T-SQL, veçanërisht kur të gjithë ndjekin të njëjtat standarde.

Kodi i T-SQL duhet të jetë i qëndrueshëm dhe i formatuar me kujdes në mënyrë që të jetë i përshtatshëm i lexueshëm dhe i kuptueshëm për të gjithë ata që e konsiderojnë atë. Për këtë qëllim, ne duhet të marrim parasysh një gamë të gjerë faktorësh, të tillë si shkronja kapitale, indendat dhe përdorimi i arsyeshëm i ndërprerjeve të rreshtit.

Kur merr një vendim, si të merren me këto elemente, është e nevojshme të peshoni gjithçka tërësisht. Në varësi të rastit specifik, mund të ketë argumente të mira për dhe kundër përdorimit të një qasjeje të caktuar. Sigurohuni që të merrni parasysh të gjitha këto detaje të vogla. Për shembull, duhet të shtoni një hapësirë \u200b\u200bnë të dy anët e deklaratës së krahasimit kur dhe si të bëni një indent ose ku të vendosni kometa në mostër.

Le të kthehemi në komentet që përfaqësojnë një mekanizëm të thjeshtë dhe efektiv për të përshkruar atë që po ndodh në kodin. Duke përfshirë rastin TSQL. Komentet e duhura në mënyrë të duhur mund të kursejnë kohë dhe madje të tregojnë për mospërputhjet. Edhe nëse po shihni kodin tuaj, atëherë vlerësoni komentet e caktuara siç duhet, veçanërisht nëse e keni shkruar këtë kod disa vjet më parë.

Në këtë drejtim, është e nevojshme të merren parasysh nëse do të përfshihen pronat e zgjatura kur krijohen një bazë të dhënash. Prona të avancuara mund të ndihmojnë në sigurimin e një kuptimi më të thellë të bazës së të dhënave dhe të lehtësojnë dokumentacionin e komponentëve të saj.

Një mënyrë tjetër për të lehtësuar kuptimin e kodit është përdorimi i kllapave kur është e nevojshme. Në shembullin e mëparshëm, unë shtova kllapa ku shprehja për të demonstruar këtë koncept. Edhe pse në këtë rast ata vërtet nuk kanë nevojë, ajo shërben si një kujtesë, si dhe komentet. Kllapa të rrumbullakëta ndihmojnë në sqarimin e logjikës së shprehjes për të bërë inspektimin e kodit më të shpejtë dhe të thjeshtë.

Praktika më e mirë konsiderohet të shtojë një pikë me një presje në fund të operatorëve. Edhe pse në shumicën e rasteve nuk është e detyrueshme për SQL Server, Microsoft paralajmëron se është e nevojshme pika. Ajo tashmë është bërë pjesë e standardeve të ANSI-së.

Mundohuni të shmangni përdorimin e komandave goto. Kjo mund të bëjë të vështirë për të kontrolluar kodin, veçanërisht nëse shumë.

Detyra jonë është të zhvillojmë një metodë për formatimin vijues dhe paraqitjen e kodit T-SQL, për ta bërë të lexueshme, të kuptueshme dhe të mbështetur.

Shkrimi i kodit të duhur

Edhe më e rëndësishme është krijimi i kodit të duhur. Ky moment përfshin përdorimin e elementeve moderne të TSQL. Kjo është një gjuhë në zhvillim, kështu që ju duhet të jeni të vëmendshëm për të mos përdorur sintaksë të vjetëruar ose të papërshtatshëm.

Një shembull i zakonshëm i një kodi të vjetër është një kombinim i bazuar në standardin SQL-92, në të cilin gjendja e kombinimit përcaktohet në shprehjen e tyre, siç tregohet në shembullin e mëposhtëm:

Zgjidhni Emp.BusinessentyID si Empd, PSN.Firstname, PSN.LastName, Emp.NationDnumber si Natid nga HumanResources.MoMplyee, Person.Person PSN ku Emp.BusinessentyID \u003d PSN.BusinessentyID dhe Emp.Jobtitle \u003d "(LANG :! Teknik i prodhimit - WC60";!}

Megjithëse SQL Server ende mbështet një qasje të tillë, por ende është e nevojshme t'i përmbahen një modeli të ri, i cili duhet të përfshijë gjendjen e kombinimit në shprehjen nga:

Është shumë më e lehtë për të zgjedhur gjendjen e unifikimit nëse nuk është e fshehur në shprehjen e Ku \u200b\u200bme disa kushte të tjera.

Qasja e dytë ka një avantazh tjetër. Nëse harroni të mundësoni gjendjen e kombinimit në çdo operator, shembulli i parë do të kthejë lidhjen e ndërlidhur që mund të përmbajë një sasi të madhe të të dhënave. Operatori i dytë kthehet një gabim, duke raportuar se diçka është e gabuar.

Një shembull tjetër i një kodi të vjetëruar kur operatori T-SQL përfshin shprehjen e lartë. Në të kaluarën, ne theksuam një shprehje numerike pa kllapa të rrumbullakëta, si në këtë shembull:

Zgjidh Top 10 Titulli, FirstName, LastName nga Person.Person; Megjithëse ende punon në SQL Server, sintaksa e saktë tani përfshin kllapa: Zgjidh Top (10) Titulli, Emri i FirstName, LastName nga Personer.Person;

Ekipi i bazës së të dhënave duhet të punojë në mënyrë aktive në zëvendësimin e kodit të vjetëruar. Shumë elementë T-SQL dhe ANSI janë tashmë të vjetruara ose mund të zemërohen në të ardhmen. Duke marrë parasysh se si standardet po ndryshojnë me shpejtësi, ka shumë të ngjarë, ju keni elemente të vjetëruara në kodin. Për shembull, në SQL Server 2016, parametri i Set RowCount është i vjetëruar për deklaratat, përditësimin dhe fshirjen e TSQL. Ekzistojnë gjithashtu lloje të tekstit të të dhënave, ntext dhe imazhit. Edhe operatorët të tillë si krijojnë default dhe rënie të parazgjedhur ndonjëherë do të bëhen të vjetëruara.

Kur të përcaktoni standardet e kodimit, mos harroni të specifikoni se si të bëni me elementet e vjetëruara. Është e lehtë të thuhet se zhvilluesit duhet t'i shmangin ato, por është e vështirë të arrihet. Prandaj, është e nevojshme të shpjegohet kur dhe si t'i fshish ato. Për fat të mirë, Microsoft ofron informacion në lidhje me atë që është vjetëruar me lirimin e çdo versioni të ri të SQL Server. Ju do të gjeni një listë të këtyre artikujve në seksion Karakteristikat e deprecuara të bazës së të dhënave në SQL Server 2016.

Tani le të shohim një shembull tjetër të një kodi të dyshimtë. Deklarata e mëposhtme e përzgjedhjes bën diçka që nuk duhet - operatori i krahasimit (jo i barabartë) përdoret për NULL:

Përkundër faktit se tabela përmban strings me vlerën e titullit , kjo deklaratë nuk i kthen vargjet dhe nuk e kthen gabimin. Nëse nuk jeni të vëmendshëm, mund të merrni rezultate të pasakta. Për këtë arsye, ky lloj i dizajnit duhet të shmanget dhe të përdoret është null ose nuk është deklaratë e pavlefshme për kthimin e rreshtave të sakta për t'u kthyer në të:

Ky është vetëm një shembull i një grupi në të cilin zhvilluesit mund të hasin probleme kur punojnë me vlerat null dhe TSQL në null. Ju mund të dëshironi të përshkruani gabime më të zakonshme në standardet tuaja.

Gjithashtu do të jetë e nevojshme të vendoset për caktimin e kolonave pseudonim. Përdoret shpesh qasja e mëposhtme: së pari tregon një pseudonim, pastaj shenjën e barabartë, siç tregohet në shembullin e mëposhtëm:

Zgjidh EMPID \u003d Emp.BusinessentyID, PSN.Firstname, PSN.LastName, NATID \u003d Emp.NationDnumber nga HumanResources.MoMplyee Emp Inner Join Personer.Person PSN në Emp.BusinessentyID \u003d Psn.BusinessentiTyID ku Emp.JOBTITLE \u003d "(LANG :!! Teknik - WC60.";!}

Një qasje tjetër është që të shtoni një pseudonim në fund përmes një fjalen opsionale:

Përzgjidhni Emp.BusinessentyID simpid, psn.firstname, psn.lastname, emp.nationalidnumber si Natid nga njerëzimi.MoMplyeeNe Emp Inner Join Person.Person PSN në Emp.BusinessentityID \u003d PSN.BUSITLESTITYID ku Emp.JOBTITLE \u003d "(LANG :!! Teknik - WC60.";!}

Mbështetësit e qasjes së parë argumentojnë se është më e lexueshme. Por mbështetësit e qasjes së dytë gjithashtu argumentojnë se metoda e tyre lejon të arrijë lexueshmëri më të mirë, pasi qasja e parë mund të ngatërrohet me caktimin e variablave. Mbështetësit e qasjes së dytë gjithashtu tregojnë se metoda e tyre është e pajtueshme me standardet e ANSI-së.

Një pyetje tjetër që vlen të merret parasysh përdorimi i procedurave të depozituara të depozituara. Për shembull, deklarata e mëposhtme e përzgjedhur është përdorur nga procedurat e ruajtura sp_mstablespace për të kthyer numrin e rreshtave dhe volumin e hapësirës në disk të përdorur nga tabela e personit. Shembull TSQL Exec:

Ekzekutoni sp_mstablespace "person.person";

Procedurat e ruajtura punojnë në mënyrë të përkryer dhe mund të jenë shumë të rehatshme. Por nuk ka asnjë mënyrë për të gjetur kur Microsoft ndryshon ose i tregon ato plotësisht. Kodi që keni krijuar mund të thyhet, dhe ju nuk do të dini edhe për këtë.

Natyrisht, ka të gjitha llojet e problemeve kur standardizohen dhe kontrollojnë kodin. Një nga detyrat kryesore është të vendosë se sa e rëndësishme është që kodi korrespondon me standardet ANSI. Disa argumentojnë se gjithmonë duhet të korrespondojë me ANSI, sepse e bën atë tolerant dhe të kuptueshëm për zhvilluesit. Nga ana tjetër, ju mund të humbni funksione të rëndësishme duke refuzuar elementet tona. Është e nevojshme të vendosni se çfarë është më e mirë për ekipin dhe organizatën tuaj.

Funksioni i mospërputhjes

SQL Server ofron një numër të funksioneve të sistemit për të kryer operacione të ndryshme. Ju duhet të siguroheni që ato të përdoren në mënyrë korrekte. Funksioni i gabuar nuk mund të kthejë një gabim, por në të njëjtën kohë të kthehet rezultate të pasakta.

Për shembull, funksioni isnumerik është i njohur në mënyrë notike në atë që i kthen rezultate të paparashikueshme, e cila është demonstruar në shembullin e mëposhtëm:

Deklaroni tabelën @A (Cola Varchar (10)); Vendos në vlerat @A ("ABC"), ("123"), ("456 $"), ("22:35:27"); Zgjidhni Cola, rast kur isnumerik (cola) \u003d 1 pastaj hedhur (cola si int) të përfundojë si testesresults nga @a;

Ne krijojmë një variabël tavoline TSQL dhe e mbushim atë me lloje të ndryshme të vlerave që transmetohen si rreshta. Pastaj përdorni funksionin Isnumerik për të verifikuar nëse vlera është numerike. Nëse është e vërtetë ( funksioni kthehet 1.), të përpiqet të konvertojë vlerën në llojin e të dhënave int. Por në këtë rast, kur thelbi i bazës së të dhënave arrin vlerën prej 456 dollarë, është rivendosur dhe mesazhi i gabimit është kthyer:

Konvertimi dështoi kur konverton vlerën Varchar "456 $" për llojin e të dhënave int.

Problemi është se funksioni isnumerik ndonjëherë shkakton një vlerë numerike që nuk mund të shndërrohet në një lloj të të dhënave numerike, si për 456 dollarë. Ajo madje interpreton vlera të tilla si 7E9 dhe $. Ashtu si numerik. Zgjidhja më e mirë për këtë problem është përdorimi i funksionit TRY_Convert:

Deklaroni tabelën @A (Cola Varchar (10)); Vendos në vlerat @A ("ABC"), ("123"), ("456 $"), ("22:35:27"); Zgjidhni Cola, rast kur try_convert (int, cola) nuk është null pastaj hedhur (cola si int) fund si testesresults nga @a;

Konvertimi i të dhënave është një ndarje mjaft komplekse në SQL Server, kështu që ju duhet të jeni të vëmendshëm.

Kur punoni me funksionet e sistemit, ju do të duhet të merreni me funksione të ndryshme që mund të përdoren për të kryer operacione të ngjashme ose mund të kthejnë lloje të ngjashme të informacionit. Për shembull, mund të përdorni funksionin e hedhur ose të konvertuar për të konvertuar vlerën e tipit të të dhënave. Funksioni i hedhur është pjesë e standardeve të ANSI, por ka aftësi të kufizuara.

Funksioni Convert TSQL nuk sigurohet sipas standardeve, por ofron një numër parametrash për të formatuar vlerat e datës dhe kohës. Edhe pse në shumë raste është më mirë të lini formatimin në nivelin e aplikimit. Pavarësisht nga kjo, do të jetë e nevojshme të merrni një vendim cili nga funksionet për t'u përdorur dhe sa e rëndësishme është që ju të përputhni kodin e standardeve të ANSI-së.

Një shembull tjetër i funksioneve të ndërrueshme janë numërimi dhe ekziston, kur ato përdoren për të konfirmuar ekzistencën e të dhënave të caktuara. Për shembull, e ardhshme nëse deklarata kontrollon nëse tabela e personit përmban një varg që ka një vlerë em në kolonën e personalitetit:

Megjithëse ky operator funksionon mirë, mund të rrisni produktivitetin duke përdorur funksionin ekzistues, veçanërisht për grupe të mëdha të të dhënave:

Përdorimi i gabuar i një funksioni nuk është gjithmonë problemi i funksionit. Për shembull, në varësi të situatës, përdorimi i funksionit scope_identy () siguron informata më të sakta se ndryshimi i sistemit @@ Identiteti. Në të dy rastet, vlera e fundit e identifikuesit të gjeneruar për tabelën në seancën aktuale është kthyer. Por funksioni i scope_idency () aplikohet vetëm në një zonë të caktuar, dhe variabli i identitetit @@ nuk e bën këtë, gjë që mund të ndikojë në korrektësinë e vlerës së kthimit. Informacion shtesë në lidhje me këtë problem mund të gjenden në seksionin e dokumentacionit SQL Server scope_identitetit (Transact-SQL).

Përdorimi i funksioneve të sistemit TSQL nuk duhet të jetë arbitrar. Është e nevojshme të peshojmë tërësisht ato që duhet të përdoren.

Variablat dhe parametrat

Konsideroni një shembull të thjeshtë duke demonstruar disa nga problemet që mund të ndodhin:

Deklaroni @a int, @b varchar (25), @c varchar (2), @d varchar, para; Set @a \u003d 25; Set @b \u003d "njëzet e pesë"; Zgjidh @c \u003d "em", @E \u003d 25; Zgjidh @a si "@a", @c si "@c", si "@d", @E si "@ @", @f si "@f";

Në këtë grup të shkurtër të operatorëve të T-SQL, kemi arritur të rregullojmë një numër të gabimeve:

  • Ne deklarojmë variablin @b dhe caktojmë vlerën për të, por kurrë nuk e përdorin atë në deklaratën e zgjedhur;
  • Ne deklarojmë @c me llojin e të dhënave Varchar (2), dhe jo me llojin Char (2);
  • Ne deklarojmë @d si Varchar, pa specifikuar gjatësi, dhe nuk caktojmë një vlerë të ndryshueshme. Pastaj ne përdorim ndryshoren në deklaratën e zgjedhur;
  • Ne përdorim @f në shprehjen e Select, edhe pse ata nuk e deklaruan atë dhe nuk e kanë caktuar rëndësinë për të.

Çdo nga këto skenarë duhet të shmanget, por kur punon me një kod voluminoz, është e lehtë të kalosh disa variabla të padeklaruar ose të papërdorura. Për fat të mirë, SQL Server raporton variablat që ju përpiqeni të përdorni pa deklaruar ato, por kjo nuk vlen për skenarë të tjerë. Standardet tuaja të kodimit duhet të përfshijnë disa përkujtesa, kështu që zhvilluesit kontrollojnë nëse përdorin variabla në mënyrë korrekte.

Në dy nenet e mëparshme të këtij cikli, botuar në Nr. 6 dhe 7 të revistës sonë, ne konsideruam mekanizma të ndryshëm të qasjes së të dhënave, duke përfshirë ADO, BDE dhe alternativat e tyre. Tani ne dimë se si të zgjedhim teknologjinë e qasjes së të dhënave për një palë të veçantë "DBMS - mjet zhvillimi".

Duke pasur një teknologji të qasjes së të dhënave, më në fund mund të mendoni se si të manipuloni vetë të dhënat dhe meta të dhënat. Metodat e manipulimit mund të jenë specifike për këtë DBMS (për shembull, duke përdorur pjesën e klientit të kësaj DBMS për të hyrë në objektet e bazës së të dhënave) ose për këtë mekanizëm të qasjes së të dhënave. Megjithatë, ekziston një metodë më shumë ose më pak universale e manipulimit të të dhënave, të mbështetura nga pothuajse të gjitha DBMS-të relacionale të serverit dhe mekanizmat më të përgjithshëm të të dhënave universale (duke përfshirë përdorimin e tyre së bashku me dbms desktop). Kjo metodë është zbatimi i gjuhës SQL (gjuha e strukturuar e pyetjeve - gjuha e pyetjeve të strukturuara). Më poshtë ne do të shqyrtojmë qëllimin dhe tiparet e kësaj gjuhe, si dhe të studiojmë se si të hiqni dhe përmbledhim të dhënat, të shtoni, fshini dhe modifikojmë të dhënat, të mbrojnë të dhënat nga qasja e paautorizuar, krijoni bazat e të dhënave. Për një studim më të hollësishëm të SQL, ne mund të rekomandojmë librin Martin Grabier "Hyrje në SQL" (M., Lori, 1996) dhe "SQL. Udhëzuesi i referencës "(M., Lori, 1997).

Prezantimi

Gjuha e pavlefshme e pyetjeve është një gjuhë e paçmuar që përdoret për të menaxhuar të dhënat relacionale të DBMS. Termi "Necrossure" do të thotë që në këtë gjuhë mund të formuloni atë që ju duhet të bëni me të dhënat, por ju nuk mund të udhëzoni se si duhet bërë. Me fjalë të tjera, nuk ka struktura algoritmike në këtë gjuhë, të tilla si etiketat, operatorët e ciklit, tranzicionet e kushtëzuara etj.

Gjuha SQL u krijua në fillim të viteve 1970 si rezultat i projektit të kërkimit të IBM, qëllimi i të cilit ishte krijimi i një gjuhe të manipulimit nga të dhënat relacionale. Fillimisht, ai u quajt vazhdim (gjuhë e strukturuar e pyetjeve angleze), pastaj vazhdim / 2, dhe pastaj - vetëm SQL. Standardi zyrtar SQL u botua nga ANSI (Instituti Kombëtar i Standardeve Amerikane - Instituti Kombëtar i Standardizimit, SHBA) në vitin 1986 (kjo është zbatimi më i shpeshtë i SQL). Ky standard u zgjerua në vitin 1989 dhe 1992, kështu që standardi i fundit SQL quhet SQL92. Aktualisht, puna është duke u zhvilluar në standardin SQL3 që përmban disa zgjerime të orientuara nga objekti.

Ekzistojnë tri nivele të konformitetit me standardin ANSI - fillestare, të ndërmjetme dhe të plota. Shumë prodhues të serverit DBMSs, të tilla si IBM, Informix, Microsoft, Oracle dhe Sybase, përdorin zbatimin e vet të SQL bazuar në standardin ANSI (duke iu përgjigjur të paktën nivelit fillestar të pajtueshmërisë me standardin) dhe përmbajnë disa zgjerime specifike për këtë DBMS.

Për më shumë informacion mbi pajtueshmërinë me versionin SQL, të përdorura në një DBMS të veçantë, mund të gjenden në dokumentacionin e furnizuar me këtë DBMS.

Si funksionon SQL

Le të shohim se si funksionon SQL. Supozoni se ka një bazë të dhënash të kontrolluar nga çdo DBMS. Për të nxjerrë të dhëna prej saj, përdoret një pyetje e formuluar në SQL. DBMS përpunon këtë kërkesë, merr të dhënat e kërkuara dhe i kthen ato. Ky proces tregohet skematikisht në Fig. një.

Siç do ta shohim më vonë, SQL lejon jo vetëm të nxjerrë të dhëna, por edhe të përcaktojë strukturën e të dhënave, të shtojë dhe fshijë të dhënat, të kufizojë ose të sigurojë qasje në të dhëna, të mbajë integritetin referues.

Kushtojini vëmendje faktit se vetë SQL nuk është një DBMS ose një produkt i veçantë. Kjo është një gjuhë që përdoret për të bashkëvepruar me DBMS dhe është një pjesë integrale në një kuptim të caktuar.

Përkufizimi i të dhënave Gjuha (DDL)

Gjuha e definicionit të të dhënave përmban operatorë që ju lejojnë të krijoni, ndryshoni dhe shkatërroni bazat e të dhënave dhe objektet brenda tyre (tabela, përfaqësime, etj.). Këta operatorë janë të shënuar në tabelë. një.

Tabela 1

Operator

Përshkrim

Përdoret për të shtuar një tabelë të re në bazën e të dhënave

Përdoret për të fshirë një tabelë nga baza e të dhënave

Përdoret për të ndryshuar strukturën e tabelës ekzistuese

Përdoret për të shtuar një paraqitje të re në bazën e të dhënave

Përdoret për të fshirë pamjen nga baza e të dhënave

Përdoret për të krijuar një indeks për këtë fushë.

Përdoret për të hequr një indeks ekzistues

Përdoret për të krijuar një skemë të re në bazën e të dhënave

Përdoret për të fshirë një diagram nga një bazë të dhënash

Përdoret për të krijuar një domen të ri

Përdoret për të anashkaluar domenin

Përdoret për të hequr një domain nga baza e të dhënave

Gjuha e manipulimit të të dhënave (DML)

Gjuha e manipulimit të të dhënave përmban operatorë që ju lejojnë të zgjidhni, shtoni, fshini dhe modifikoni të dhënat. Ju lutem vini re se këta operatorë nuk janë të detyruar të plotësojnë transaksionin brenda të cilit ata quhen. Operatorët DML janë paraqitur në tabelë. 2.

Tabela 2

Ndonjëherë deklarata e zgjedhur i referohet një kategorie të veçantë të quajtur Data Query Gjuhës (DQL).

Gjuha e kontrollit të kursorit (CCL)

Operatorët e gjuhës së kontrollit të kursorit përdoren për të përcaktuar kursorin, përgatitjen e propozimeve SQL për ekzekutimin, si dhe për disa operatorë të tjerë. Operatorët e CCL janë paraqitur në tabelë. Pesë.

Tabela 5.

Operator

Përshkrim

Përdoret për të përcaktuar një kursor për kërkesë

Përdoret për të përshkruar planin e kërkesës. Ky operator është një zgjerim SQL për Microsoft SQL Server 7.0. Nuk është e detyruar të kandidojë në DBMS të tjera. Për shembull, në rastin e Oracle, përdorni Operatorin e Planit të Shpjeguar

Përdoret për të hapur kursorin pas marrjes së rezultateve të pyetjeve.

Përdoret për të marrë një rresht nga rezultatet e pyetjeve

Përdoret për të mbyllur kursorin

Përdoret për të përgatitur operatorin SQL për ekzekutimin

Përdoret për të ekzekutuar operatorin SQL

Përdoret për të përshkruar kërkesën e përgatitur

Të gjithë operatorët SQL shikohen në Fig. 2.

Çdo deklaratë SQL fillon me një folje, e cila është një fjalë kyçe që përcakton se është pikërisht ky operator (zgjidhni, futni, fshini ...). Operatori gjithashtu përmban sugjerime që përmbajnë informacion rreth asaj se cilat operacione të të dhënave janë bërë. Çdo propozim fillon me një fjalen, siç është, ku, etj. Struktura e propozimit varet nga lloji i tij - një numër propozimesh përmban emrat e tabelave ose fushave, disa mund të përmbajnë fjalë kyçe, konstante ose shprehje shtesë.

Me atë që mund të kryhet nga operatorët SQL

Të gjitha bazat e të dhënave të serverëve moderne (si dhe shumë dbms popullore desktop) përmbajnë një dobi që ju lejon të bëni një ofertë SQL dhe të njiheni me rezultatin e saj. Në veçanti, Pjesa e Klientit Oracle përmban një SQL Plus Utility, dhe Microsoft SQL Server është një SQL Query Analyzer. Është kjo dobia që ne do të përdorim për të demonstruar aftësitë e SQL, dhe si një bazë të dhënash në të cilën ne do të "eksperimentosh", të marrim bazën e të dhënave Northwind, e cila furnizohet me Microsoft SQL Server 7.0. Në parim, ju mund të përdorni një bazë të dhënash dhe çdo ndërmarrje tjetër të aftë për të kryer në këtë bazë të të dhënave SQL-propozuese dhe për të shfaqur rezultatet (ose edhe të shkruani të vetat, duke përdorur ndonjë mjet zhvillimi - Visual Basic, Delphi, C ++ ndërtues, etj) . Megjithatë, vetëm në rast se rekomandohet të bësh një kopje rezervë të kësaj baze të dhënash.



Nëse vëreni gabimin, zgjidhni fragmentin e tekstit dhe shtypni Ctrl + Enter
Share:
Këshilla për ndërtim dhe riparim