Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Siguria
  • Gjuha e strukturuar e pyetjeve - SQL: historia, standardet, operatorët bazë të gjuhës. Qëllimi i gjuhës SQL

Gjuha e strukturuar e pyetjeve - SQL: historia, standardet, operatorët bazë të gjuhës. Qëllimi i gjuhës SQL

Dhe mbi të dhënat e tabelave.

Gjuha SQL quhet të ndërtuara që nga viti ai përmban funksionet e një gjuhe zhvillimi të plotë dhe fokusohet në aksesin e të dhënave, si rezultat i së cilës përfshihet në mjetet e zhvillimit të aplikacionit. Standardet e gjuhës SQL mbështesin gjuhët e programimit Pascal, Fortran, COBOL, С, etj.

ekziston 2 metoda të përdorimit të SQL të ngulitur:

  • statike përdorimi i gjuhës ( SQL statike) - teksti i programit përmban thirrje për funksionet SQL, të cilat përfshihen në modulin e ekzekutueshëm pas kompilimit.
  • dinamike përdorimi i gjuhës ( SQL dinamike) - ndërtimi dinamik i thirrjeve të funksioneve SQL dhe interpretimi i tyre. Për shembull, mund t'i referoheni të dhënave të bazës së të dhënave në distancë gjatë ekzekutimit të programit.

Gjuha SQL (si gjuhët e tjera për të punuar me bazat e të dhënave) është menduar për përgatitjen dhe ekzekutimin e pyetjeve. Si rezultat i ekzekutimit të një kërkimi të të dhënave nga një ose më shumë tabela, fitohet një grup rekordesh, i cili quhet paraqitjen.

Përkufizimi 1

PerformancaËshtë një tabelë që formohet si rezultat i një pyetjeje.

Operatorët bazë të gjuhës së pyetjeve SQL

Deklaratat SQL ndahen në mënyrë konvencionale në 2 nëngjuhë:

  1. Gjuha e përkufizimit të të dhënave DDL;
  2. Gjuha e manipulimit të të dhënave DML.

Në tabelë, * janë shënuar me operatorë të veçantë gjuhe.

Le të hedhim një vështrim në deklaratat më të rëndësishme SQL.

    Deklarata e krijimit të tabelës:

    Emri i tabelës që po krijohet dhe emri i të paktën një kolone (fushe) janë operandë të kërkuar. Për emrin e kolonës, duhet të specifikoni llojin e të dhënave që do të ruhen në të.

    Për fusha individuale, mund të specifikoni rregulla shtesë për kontrollin e vlerave që futen në to. Për shembull, JO NULL tregon se fusha nuk mund të jetë bosh dhe duhet të futet një vlerë në të.

    Shembulli 1

    Për të krijuar një tabelë librat katalogu i librave, i cili përmban fushat:

    lloji- lloji i librit,

    emri- titulli i librit,

    çmimi- çmimi i librit

    operatori mund të duket si ky:

    Operatori për ndryshimin e strukturës së një tabele:

    Kur ndryshoni strukturën e tabelës, mund të shtoni ( SHTO), ndrysho ( MODIFIKONI) ose fshini ( RËZË) një ose më shumë kolona të tabelës. Rregullat e regjistrimit për këtë operator janë të njëjta si për operatorin. KRIJONI TABELA... Ju nuk keni nevojë të specifikoni për të fshirë një kolonë.

    Shembulli 2

    Për të shtuar në tabelë librat fusha numri, i cili do të ruajë numrin e librave, mund të shkruani operatorin:

    Operatori i tabelës së rënies:

    Shembulli 3

    Për shembull, për të hedhur një tabelë ekzistuese me emrin librat thjesht përdorni operatorin:

    Operatori i krijimit të indeksit:

    Operatori krijon një indeks në një ose më shumë kolona të një tabele të caktuar për të shpejtuar operacionet e kërkimit dhe kërkimit. Mund të krijohen indekse të shumta për një tabelë.

    Opsioni opsional UNIKështë përgjegjës për sigurimin e unike të vlerave në të gjitha kolonat që janë specifikuar në deklaratë.

    ASC vendos renditjen automatike të vlerave në kolona në rend rritës (parazgjedhje) dhe DESC- në rend zbritës.

    Operatori i rënies së indeksit:

    Shiko operatorin e krijimit:

    Ju mund të hiqni emrat e kolonave kur krijoni një pamje. Pastaj do të përdoren emrat e kolonave nga pyetësori, i cili përshkruhet nga operatori përkatës ZGJIDH.

    Shiko operatorin e fshirjes:

    Operatori i përzgjedhjes së regjistrimit:

    Operatori ZGJIDH bën zgjedhje dhe llogaritje mbi të dhënat nga një ose më shumë tabela. Rezultati i ekzekutimit të operatorit është një tabelë përgjigjesh që përmban ( TE GJITHA) ose nuk përmban ( TË DAKTUAR) rreshta që përsëriten.

    Operand NGA përmban një listë tabelash nga të cilat merren të dhënat për të zgjedhur të dhënat.

    Operatori i ndryshimit të rekordit:

    Vlerat e reja të fushave në regjistrime mund të mos përmbajnë vlera ( I PAVLEFSHËM) ose llogaritet sipas një shprehje aritmetike.

    Operatori i ri i futjes së rekordit:

    Në rekordin e parë të operatorit INSERT të dhënat e reja futen me vlerat e specifikuara në kolona.

    Në deklaratën e dytë të operatorit INSERT futen rreshta të rinj, të zgjedhur nga një tabelë tjetër përmes një fjalie ZGJIDH.

    Fshi operatorin e regjistrimit:

    Si rezultat i ekzekutimit të operatorit, rreshtat fshihen nga tabela e specifikuar që plotësojnë kushtin, i cili përcaktohet nga operandi opsional KU... Nëse operandi KU nuk është specifikuar, atëherë të gjitha të dhënat e tabelës fshihen.

Standardi i gjuhës SQL u miratua në vitin 1992 dhe përdoret ende sot. Ishte ai që u bë standardi për shumë njerëz.Sigurisht, disa prodhues përdorin interpretimet e tyre të standardit. Por në çdo sistem ka ende përbërësit kryesorë - deklaratat SQL.

Prezantimi

Me ndihmën e deklaratave SQL, vlerat, tabelat menaxhohen dhe merren për analiza dhe shfaqje të mëtejshme. Ato janë një grup fjalësh kyçe me të cilat sistemi kupton se çfarë të bëjë me të dhënat.

Përcaktohen disa kategori të deklaratave SQL:

  • përcaktimi i objekteve të bazës së të dhënave;
  • manipulimi i vlerave;
  • mbrojtjen dhe menaxhimin;
  • parametrat e sesionit;
  • informacion në lidhje me bazën;
  • SQL statike;
  • SQL dinamike.

Deklaratat SQL për manipulimin e të dhënave

INSERT. Fut rreshtat në një tabelë ekzistuese. Mund të përdoret si për një vlerë, ashtu edhe për disa, të përcaktuara nga një kusht i caktuar. Për shembull:

emri i tabelës (emri i kolonës 1, emri i kolonës 2)

VLERAT (vlera 1, vlera 2).

Për të përdorur një deklaratë INSERT në vlera të shumta, sintaksa është:

emri i tabelës 1 (emri i kolonës 1, emri i kolonës 2)

ZGJIDHni emrin e kolonës 1, emrin e kolonës 2

NGA emri i tabelës 2

WHERE emri i tabelës 2.emri i kolonës 1> 2

Ky pyetje do të zgjedhë të gjitha të dhënat nga tabela 2 që janë më të mëdha se 2 në kolonën 1 dhe do t'i vendosë ato në të parën.

PËRDITËSOJE. Siç nënkupton edhe emri, kjo deklaratë e pyetjes SQL përditëson të dhënat në një tabelë ekzistuese bazuar në një atribut specifik.

PËRDITËSO emrin e tabelës 1

SET emrin e kolonës 2 = "Vasily"

KU emri i tabelës 1.emri i kolonës 1 = 1

Ky ndërtim do të plotësojë vlerën e Vasilit të gjitha rreshtat në të cilat ai ndeshet me numrin 1 në kolonën e parë.

Të dhënat nga tabela. Mund të specifikoni një kusht ose të hiqni të gjitha rreshtat.

FSHI NGA emri i tabelës

Emri i tabelës WHERE Emri i kolonës 1 = 1

Pyetja e mësipërme do të fshijë nga baza e të dhënave të gjitha të dhënat me vlerën një në kolonën e parë. Dhe kështu mund të pastroni të gjithë tabelën:

SELECT deklaratë

Qëllimi kryesor i SELECT është të zgjedhë të dhënat sipas kushteve të caktuara. Rezultati i punës së tij është gjithmonë një tabelë e re me të dhënat e përzgjedhura. Operatori MS mund të përdoret në një shumëllojshmëri të gjerë pyetjesh. Prandaj, së bashku me të, mund të merrni parasysh fjalë kyçe të tjera të lidhura.

Për të zgjedhur të gjitha të dhënat nga një tabelë specifike, përdorni shenjën "*".

NGA emri i tabelës 1

Rezultati i kësaj pyetjeje do të jetë një kopje e saktë e tabelës 1.

Dhe këtu zgjedhja kryhet sipas klauzolës WHERE, e cila nxjerr nga tabela 1 të gjitha vlerat më të mëdha se 2 në kolonën 1.

NGA emri i tabelës 1

WHERE emri i tabelës 1.emri i kolonës 1> 2

Ju gjithashtu mund të tregoni në përzgjedhjen se nevojiten vetëm disa kolona.

ZGJIDH emrin e tabelës 1.emri i kolonës 1

NGA emri i tabelës 1

Rezultati i kësaj pyetjeje do të jenë të gjitha rreshtat me vlera nga kolona 1. Duke përdorur deklaratat MS SQL, ju mund të krijoni tabelën tuaj, duke zëvendësuar, llogaritur dhe zëvendësuar vlera të caktuara në fluturim.

emri i tabelës 1 emri i kolonës 1

emri i tabelës 1 emri i kolonës 2

emri i tabelës 1 emri i kolonës 3

emri i tabelës 1. emri i kolonës 2 * emri i tabelës 1. emri i kolonës 3 AS SUMMA

NGA emri i tabelës 1

Kjo pyetje në dukje komplekse merr të gjitha vlerat nga tabela 1, më pas krijon kolona të reja EQ dhe SUMMA. Në të parën hyn shenjën "+", në të dytën produktin e të dhënave nga kolonat 2 dhe 3. Rezultati i marrë mund të paraqitet në formën e një tabele, për të kuptuar se si funksionon:

Kur përdorni deklaratën SELECT, mund t'i renditni menjëherë të dhënat sipas çdo kriteri. Për këtë përdoret fjala ORDER BY.

emri i tabelës 1 emri i kolonës 1

emri i tabelës 1 emri i kolonës 2

emri i tabelës 1 emri i kolonës 3

NGA emri i tabelës 1

RENDIT SIPAS emrit të kolonës 2

Tabela që rezulton do të duket si kjo:

Kjo do të thotë, të gjitha rreshtat u vendosën në një mënyrë të tillë që vlerat në kolonën 2 të jenë në rend rritës.

Të dhënat mund të merren edhe nga disa tabela. Për qartësi, së pari duhet të imagjinoni se ka dy prej tyre në bazën e të dhënave, diçka si kjo:

Tabela "Punonjësit".

Tabela e pagave

Tani ju duhet të lidhni disi këto dy tabela për të marrë vlerat e përbashkëta. Duke përdorur deklaratat bazë SQL, mund ta bëni si kjo:

Punonjësit.Dhomë

Punonjësit Emri

Paga. Bast

Paga e përllogaritur

NGA Punonjësit, Paga

KU Punonjësit.Numri = Paga.Numri

Këtu, një përzgjedhje bëhet nga dy tabela të ndryshme vlerash, të kombinuara sipas numrit. Rezultati do të jetë grupi i të dhënave në vijim:

Pak më shumë rreth SELECT. Përdorimi i funksioneve agregate

Një nga operatorët kryesorë mund të bëjë disa llogaritje gjatë marrjes së mostrave. Për ta bërë këtë, ai përdor funksione dhe formula të caktuara.

Për shembull, për të marrë numrin e të dhënave nga tabela "Punonjësit", duhet të përdorni pyetjen:

ZGJIDH NUMRIN (*) SI N

NGA Punonjësit

Rezultati është një tabelë me një vlerë dhe një kolonë.

Ju mund të aplikoni një pyetje të tillë dhe të shihni se çfarë ndodh:

SUM (Paga. E përllogaritur) SI SHUMË

MAX (Paga. E përllogaritur) AS MAX

MIN (Paga. E përllogaritur) SI MIN

AVG (Paga. E përllogaritur) SI SRED

NGA rroga

Tabela përfundimtare do të jetë si kjo:

Në këtë mënyrë, ju mund të zgjidhni vlerat e dëshiruara nga baza e të dhënave, duke kryer llogaritjen e funksioneve të ndryshme në fluturim.

Bashkimi, kryqëzimi dhe dallimet

Kombinoni pyetje të shumta në SQL

SELECT Punonjësit.Emri

NGA Punonjësit

KU Punonjësit.Numri = 1

SELECT Punonjësit.Emri

NGA Punonjësit, Paga

KU Paga.Numri = 1

Duhet të kihet parasysh se me një bashkim të tillë, tabelat duhet të jenë të pajtueshme. Kjo do të thotë, keni të njëjtin numër kolonash.

SELECT Sintaksa e Deklaratës dhe Rendi i Përpunimit

Para së gjithash, SELECT përcakton zonën nga e cila do të marrë të dhënat. Për këtë përdoret fjala kyçe FROM. Nëse nuk specifikohet se çfarë të zgjidhni.

Pastaj klauzola SQL WHERE mund të jetë e pranishme. Me ndihmën e tij, SELECT kalon nëpër të gjitha rreshtat e tabelës dhe kontrollon të dhënat për pajtueshmërinë me kushtin.

Nëse pyetja përmban një GROUP BY, atëherë vlerat grupohen sipas parametrave të specifikuar.

Operatorët për krahasimin e të dhënave

Ka disa lloje të tyre. Në SQL, operatorët e krahasimit mund të testojnë për lloje të ndryshme vlerash.

    "=". Tregon, siç mund ta merrni me mend, barazinë e dy shprehjeve. Për shembull, është përdorur tashmë në shembujt e mësipërm - WHERE Paga. Numri = 1.

    ">". Shenjë më e madhe. Nëse vlera e anës së majtë të shprehjes është më e madhe, atëherë kthehet një TRUE logjik dhe kushti konsiderohet i përmbushur.

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

    Shenjat "<=» и «>= ". Ai ndryshon nga operatorët e thjeshtë gjithnjë e më pak në atë që nëse operandët janë të barabartë, kushti do të jetë gjithashtu i vërtetë.

LIKE

Kjo fjalë kyçe mund të përkthehet si "e ngjashme". Operatori LIKE në SQL përdoret pothuajse në të njëjtën mënyrë - ai ekzekuton një pyetje duke përdorur një model. Kjo do të thotë, ju lejon të zgjeroni përzgjedhjen e të dhënave nga baza e të dhënave duke përdorur shprehje të rregullta.

Për shembull, u vendos detyra e mëposhtme: nga baza tashmë e njohur "Punonjësit" për të marrë të gjithë njerëzit emri i të cilëve përfundon me "I". Atëherë kërkesa mund të përpilohet si kjo:

NGA Punonjësit

KU Emri LIKE `% i`

Shenja e përqindjes në këtë rast nënkupton një maskë, domethënë çdo simbol dhe numrin e tyre. Dhe me shkronjën "I" SQL do të përcaktojë që karakteri i fundit duhet të jetë pikërisht ai.

RAST

Kjo deklaratë SQL Server është një zbatim me shumë zgjedhje. Ai i ngjan konstruksionit të ndërprerësit në shumë gjuhë programimi. Deklarata SQL CASE kryen një veprim në disa kushte.

Për shembull, duhet të zgjidhni vlerat maksimale dhe minimale nga tabela "Paga".

Atëherë kërkesa mund të përpilohet si kjo:

NGA rroga

KU RASI KUR ZGJIDH MAKSIMIN (Vlerësohet) PASTAJ Maksimumi

KUR ZGJIDHET MIN (Vlerësohet) PASTAJ Minimumi

Në këtë kontekst, sistemi kërkon vlerat maksimale dhe minimale në kolonën e Përllogaritur. Më pas, duke përdorur FUND, krijohet një fushë "total", në të cilën do të futet "Maksimumi" ose "Minimumi", në varësi të rezultatit të kushtit.

Nga rruga, SQL ka gjithashtu një formë më kompakte të CASE - COALESCE.

Operatorët e përkufizimit të të dhënave

Kjo pamje ju lejon të kryeni një sërë ndryshimesh në tabela - krijimin, fshirjen, modifikimin dhe punën me indekset.

E para që duhet marrë parasysh është KRIJO TABELA. Nuk bën asgjë më shumë se të krijojë një tabelë. Nëse thjesht shkruani pyetjen CREATE TABLE, asgjë nuk ndodh, pasi ka disa parametra të tjerë për t'u specifikuar.

Për shembull, për të krijuar tabelën e njohur "Punonjësit", duhet të përdorni komandat:

KRIJO TABELË Punonjësit

(Numri numër (10) JO NULL

Varchar (50) JO NULL

Mbiemri varchar (50) JO NULL)

Në këtë pyetje, në kllapa, përcaktohen menjëherë emrat e fushave dhe llojet e tyre, si dhe nëse mund të jetë i barabartë me NULL.

TABELA E RËZIMIT

Kryen një detyrë të thjeshtë - fshirjen e tabelës së specifikuar. Ka një parametër shtesë IF EXISTS. Ajo gëlltit një gabim në rënie nëse tabela që po kërkoni nuk ekziston. Shembull përdorimi:

TABELA E HIQI Punonjësit NËSE EKZISTON.

KRIJONI INDEKS

SQL ka një sistem indeksimi që mund të përshpejtojë aksesin e të dhënave. Në përgjithësi, është një lidhje që tregon një kolonë specifike. Ju mund të krijoni një indeks me një pyetje të thjeshtë:

KRIJO INDEKSIT index_name

ON tabela_emri (emri_kolona)

Ky operator përdoret në T-SQL, Oracle, PL SQL dhe shumë interpretime të tjera të teknologjive.

TABELA ALTER

Një operator shumë funksional me opsione të shumta. Në përgjithësi, ajo ndryshon strukturën, përkufizimin dhe vendosjen e tabelave. Operatori i përdorur në Oracle SQL, Postgres dhe shumë të tjerë.

    SHTO. Shton një kolonë në një tabelë. Sintaksa e saj është si vijon: ALTER TABLE - emri i tabelës SHTO SHTO emrin e_kolonës ruajtur_lloj_të dhënash. Mund të ketë një opsion NËSE NUK EKZISTON për të shtypur gabimin nëse kolona që po krijohet ekziston tashmë;

    RËZË. Heq një kolonë. Ai gjithashtu ka çelësin IF EXISTS, pa të cilin do të gjenerohet një gabim që tregon se mungon kolona e kërkuar;

    NDRYSHIM. Shërben për të riemërtuar emrin e fushës në atë të specifikuar. Shembull përdorimi: NDRYSHO emrin e tabelës TABELA NDRYSHO emrin e vjetër të emrit të ri;

    MODIFIKONI. Kjo komandë do t'ju ndihmojë të ndryshoni llojin dhe atributet shtesë të një kolone specifike. Dhe përdoret si kjo: ALTER TABLE emri i tabelës MODIFIKO emri i kolonës_tipi i të dhënave;

KRIJO PAMJE

Në SQL, ekziston një gjë e tillë si një pamje. Me pak fjalë, kjo është një lloj tabele virtuale me të dhëna. Formohet si rezultat i një përzgjedhjeje duke përdorur deklaratën SQL SELECT. Pamjet mund të kufizojnë aksesin në bazën e të dhënave, t'i fshehin ato, të zëvendësojnë emrat e vërtetë të kolonave.

Procesi i krijimit zhvillohet me një kërkesë të thjeshtë:

KRIJO emrin e pamjes së pamjes SI ZGJEDH NGA * emri i tabelës

Përzgjedhja mund të bëhet si e gjithë baza në tërësi, dhe sipas disa kushteve.

Pak për funksionet

Në pyetjet SQL, shumë shpesh përdoren funksione të ndryshme të integruara që ju lejojnë të ndërveproni me të dhënat dhe t'i transformoni ato menjëherë. Ato ia vlen të merren parasysh pasi përbëjnë një pjesë integrale të një gjuhe të strukturuar.

    COUNT. Numëron rekorde ose rreshta në një tabelë specifike. Si parametër, mund të specifikoni emrin e kolonës, pastaj të dhënat do të merren prej saj. SELECT COUNT * FROM Punonjësit;

    AVG. vlen vetëm për kolonat me të dhëna numerike. Rezultati i tij është përcaktimi i mesatares aritmetike të të gjitha vlerave;

    MIN dhe MAX. Këto funksione janë përdorur tashmë në këtë artikull. Ata përcaktojnë vlerat maksimale dhe minimale nga kolona e specifikuar;

    SHUMË. Është e thjeshtë - funksioni llogarit shumën e vlerave të kolonës. Përdoret ekskluzivisht për llojin numerik të të dhënave. Duke shtuar parametrin DISTINCT në pyetje, do të përmblidhen vetëm vlerat unike;

    RRUmbullakët. Funksioni i rrumbullakimit për thyesat dhjetore. Sintaksa përdor emrin e kolonës dhe numrin e numrave dhjetorë;

    LEN. Një funksion i thjeshtë që llogarit gjatësinë e vlerave të kolonës. Rezultati do të jetë një tabelë e re që tregon numrin e karaktereve;

    TANI. Kjo fjalë kyçe përdoret për të llogaritur datën dhe kohën aktuale.

Operatorë shtesë

Shumë nga shembujt me deklarata SQL kanë fjalë kyçe që bëjnë gjëra të vogla, por megjithatë e bëjnë shumë më të lehtë marrjen ose manipulimin e bazave të të dhënave.

    AS. Përdoret kur ju duhet të dekoroni vizualisht rezultatin duke caktuar emrin e specifikuar në tabelën që rezulton.

    NDËRMJET. Një mjet shumë i dobishëm për marrjen e mostrave. Ai tregon gamën e vlerave midis të cilave dëshironi të merrni të dhëna. Hyrja merr një parametër nga dhe deri në cilin numër përdoret diapazoni ;.

    JO. Operatori jep të kundërtën e shprehjes.

    I PRAKTUAR. Fshin të dhënat nga zona e specifikuar e bazës së të dhënave. Ai ndryshon nga operatorët e ngjashëm në atë që është e pamundur të rikuperoni të dhënat pas përdorimit të tyre. Duhet të theksohet se zbatimi i kësaj fjale kyçe në interpretime të ndryshme të SQL mund të ndryshojë. Prandaj, është mirë të lexoni informacionin e referencës përpara se të provoni TRUNCATE.

    LIMIT. Vendos numrin e linjave për dalje. E veçanta e operatorit është se ai ndodhet gjithmonë në fund. Duhet një parametër i kërkuar dhe një opsional. E para tregon se sa rreshta me të dhënat e zgjedhura duhet të shfaqen. Dhe nëse përdoret e dyta, atëherë operatori punon si për një sërë vlerash.

    UNION. Një operator shumë i përshtatshëm për kombinimin e pyetjeve të shumta. Ai tashmë ka takuar ndër shembujt e kësaj në këtë artikull. Ju mund të shfaqni rreshtat e kërkuar nga disa tabela duke i kombinuar me UNION për përdorim më të përshtatshëm. Sintaksa e saj është si më poshtë: SELECT emri i kolonës FROM emri i tabelës UNION SELECT other_column_name NGA një emër_tabele tjetër. Rezultati do të jetë një tabelë kryesore me pyetjet e kombinuara.

    ÇELESI PRIMAR. Përkthyer si "çelës kryesor". Në fakt, është pikërisht kjo terminologji që përdoret në materialet referuese. Do të thotë një identifikues unik për vargun. Përdoret, si rregull, kur krijoni një tabelë për të specifikuar fushën që do ta përmbajë atë.

    PARALAKTUAR. Ashtu si operatori i mëparshëm, ai përdoret gjatë ekzekutimit të pyetjes së krijimit. Ai përcakton vlerën e paracaktuar që do të përdoret për të mbushur fushën kur të krijohet.

    I PAVLEFSHËM. Kur shkruajnë pyetje, fillestarët dhe jo vetëm programuesit shpesh harrojnë mundësinë e marrjes së një vlere NULL. Si rezultat, një gabim zvarritet në kod, i cili është i vështirë për t'u gjetur gjatë korrigjimit. Prandaj, kur krijoni tabela, zgjidhni ose rillogaritni vlerat, duhet të ndaleni dhe të mendoni nëse është marrë parasysh shfaqja e NULL në këtë pjesë të pyetjes.

    Kujtesa. Ky artikull ka treguar disa funksione që mund të kryejnë disa detyra. Kur zhvilloni një guaskë për të punuar me një bazë të dhënash, ju mund të "peshoni" vlerësimin e shprehjeve të thjeshta në sistemin e menaxhimit të bazës së të dhënave. Në disa raste, kjo jep një rritje të konsiderueshme të performancës.

    Kufizimet. Nëse ju duhet të merrni vetëm dy nga një bazë të dhënash me mijëra rreshta, atëherë duhet të përdorni operatorë si LIMIT ose TOP. Nuk ka nevojë të merren të dhënat duke përdorur gjuhën e zhvillimit të guaskës.

    Kompleksi. Pas marrjes së të dhënave nga disa tabela, shumë programues fillojnë t'i bashkojnë ato duke përdorur memorien e guaskës. Por pse? Në fund të fundit, ju mund të bëni një kërkesë në të cilën e gjithë kjo do të jetë e pranishme. Ju nuk keni nevojë të shkruani kod shtesë dhe të rezervoni memorie shtesë në sistem.

    Renditja. Nëse është e mundur të aplikoni porosinë në një pyetje, domethënë me anë të një DBMS, atëherë duhet ta përdorni atë. Kjo do të kursejë ndjeshëm burimet kur ekzekutoni një program ose shërbim.

    Kërkesa të shumta. Nëse duhet të futni shumë regjistrime në mënyrë sekuenciale, atëherë për optimizim duhet të mendoni për futjen e të dhënave në grup me një pyetje të vetme. Ai gjithashtu do të rrisë performancën e të gjithë sistemit në tërësi.

    Vendosja e sofistikuar e të dhënave. Para se të hartoni strukturën e bazës së të dhënave, duhet të mendoni nëse keni nevojë për një numër të tillë tabelash dhe fushash. Ndoshta ka një mënyrë për t'i kombinuar ato ose për të hedhur poshtë disa. Shumë shpesh programuesit përdorin një sasi të tepërt të të dhënave që nuk do të përdoren kurrë askund.

    Llojet. Për të kursyer hapësirë ​​dhe burime, duhet të jeni të ndjeshëm ndaj llojeve të të dhënave të përdorura. Nëse është e mundur të përdoret një lloj që është më pak "i rëndë" për kujtesën, atëherë është e nevojshme ta përdorni atë. Për shembull, nëse e dini se vlera numerike në këtë fushë nuk do të kalojë 255, atëherë pse të përdorni një INT 4-bajtë nëse ka një TINYINT prej 1 bajt.

konkluzioni

Si përfundim, duhet të theksohet se gjuha e strukturuar e pyetjeve SQL tani përdoret pothuajse kudo - faqe, shërbime në internet, programe për PC, aplikacione për pajisje celulare. Prandaj, njohja e SQL do të ndihmojë të gjitha degët e zhvillimit.

Në të njëjtën kohë, modifikimet e standardit të gjuhës origjinale ndonjëherë ndryshojnë nga njëra-tjetra. Për shembull, deklaratat PL SQL mund të kenë një sintaksë të ndryshme nga SQL Server. Prandaj, para se të filloni të zhvilloni me këtë teknologji, ia vlen të lexoni udhëzuesit për të.

Në të ardhmen, analogët që mund të tejkalojnë SQL në funksionalitet dhe performancë nuk ka gjasa të shfaqen, kështu që kjo zonë është një vend mjaft premtues për çdo programues.

SQL (StructuredQueryLanguage) është një gjuhë kompjuterike universale e përdorur për të krijuar, modifikuar dhe manipuluar të dhënat në bazat e të dhënave relacionale. Gjuha SQL bazohet në algjebër relacionale dhe është një koleksion operatorësh.

Ka 4 grupe operatorësh. Konsideroni një grup të gjuhëve të manipulimit të të dhënave (DML, SQL DML)

Zgjedhja e të dhënave

Zgjedhja e të dhënave është operacioni më i zakonshëm SQL. Deklarata SELECT është një nga pohimet më të rëndësishme në këtë gjuhë për zgjedhjen e të dhënave. Sintaksa për këtë operator është si më poshtë:

ZGJIDH kolonën NGA tabela

Deklaratat SELECT duhet të përmbajnë fjalët SELECT dhe FROM; fjalë kyçe të tjera janë opsionale.

Fjala kyçe SELECT ndiqet nga informacione se cilat fusha të përfshihen në grupin e të dhënave që rezulton. Një yll (*) tregon të gjitha fushat në një tabelë, për shembull:

Sintaksa e mëposhtme përdoret për të zgjedhur një kolonë:

ZGJIDH Kompania

Një shembull i zgjedhjes së kolonave të shumta duket si ky:

ZGJIDH Kompania, Telefoni,Postë

Fjala kyçe FROM përdoret për të specifikuar emrat e tabelave nga të cilat merren të dhënat, për shembull:

ZGJIDH * NGA Klientët

Ky pyetje do t'i kthejë të gjitha fushat nga tabela e klientëve.

Ju mund të përdorni klauzolën WHERE për të filtruar rezultatet e kthyera nga deklarata SELECT (opsionale)

ZGJIDH * NGA Produktet WHERE Kategoria = 4

Shprehje të ndryshme mund të përdoren në klauzolën WHERE,

WHERE shprehja 1 [(DHE | OSE) shprehja2 ...]

për shembull:

ZGJIDH * NGA Produktet WHERE Kategoria = 2 DHE Postavshik> 10

SELECT Emrin, Çmimi NGA Produktet WHERE Kategoria = 3 OSE Çmimi< 50

Ju mund të përdorni operatorët e mëposhtëm:

< Меньше

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

<>Jo të barabartë

> Më shumë

> = Më e madhe ose e barabartë

Klauzola ORDER BY (opsionale) përdoret për të renditur grupin e të dhënave që rezulton sipas një ose më shumë kolonave. Fjalët kyçe ASC (në ngjitje) ose DESC (në zbritje) përdoren për të përcaktuar rendin e renditjes. Si parazgjedhje, të dhënat renditen në rend rritës.

Modifikimi i të dhënave

Përveç marrjes së të dhënave, SQL mund të përdoret për përditësimin dhe fshirjen e të dhënave, kopjimin e të dhënave në tabela të tjera dhe kryerjen e operacioneve të tjera. Më poshtë do të shikojmë deklaratat UPDATE, DELETE dhe INSERT të përdorura për të përmbushur disa nga këto detyra.

Përditëso deklaratën

Deklarata UPDATE përdoret për të ndryshuar vlerat në një ose më shumë kolona të një tabele. Sintaksa për këtë operator është:

Përditëso SET-in e tabelës kolona1 = shprehja1 KU kriteret

Shprehja në klauzolën SET mund të jetë një konstante ose rezultat i një vlerësimi. Për shembull, për të rritur çmimet e të gjitha produkteve që kushtojnë më pak se 10 dollarë, mund të kryeni pyetjen e mëposhtme:

Përditëso Produktet SET Çmimi = Çmimi * 1.1 KU Çmimi< 10

FSHI deklaratën

Për të fshirë rreshtat nga tabelat, përdorni deklaratën DELETE, sintaksa e të cilit është:

FSHI NGA tabela KU kriteret

Hiqni të gjitha produktet me vlerë më të vogël se 100:

FSHIJE NGA Produktet KU Çmimi< 100

OperatoriINSERT

Për të shtuar regjistrime në tabela, përdorni deklaratën INSERT, sintaksa e së cilës është:

INSERT NË tabelën (VLERAT (shprehje [, ...])

Për shembull, për të shtuar një klient të ri në tabelën e klientëve, mund të përdorni pyetjen e mëposhtme:

VLERA NË Klientët (ID-ja e klientit, emri i kompanisë) ("XYZ", "XYZ Deli")

Baza e gjuhës SQL përbëhet nga operatorë, të ndarë me kusht në disa grupe sipas funksioneve të tyre. Grupet e mëposhtme të deklaratave mund të dallohen (jo të gjitha deklaratat SQL janë të listuara):

Operatorët Ddl (Gjuha e Përkufizimit të të Dhënave).

Deklaratat DDL - Deklaratat e përkufizimit të objektit të bazës së të dhënave

    KRIJO SKEMA - krijoni një skemë të bazës së të dhënave

    DROP SHEMA - hidhni një skemë të bazës së të dhënave

    KRIJO TABELA - krijoni një tabelë

    ALTER TABLE - modifikoni një tabelë

    DOP TABLE - hidhni një tryezë

    KRIJO DOMAIN - krijoni një domen

    ALTER DOMAIN - ndryshoni domenin

    HIQ DOMAIN - fshi domenin

    KRIJO KOLLACION - krijoni një sekuencë

    DOP COLLATION - fshini një sekuencë

    KRIJO PAMJE - krijoni një pamje

    HIQ PAMJEN - hiqni një pamje

Operatorët Dml (Gjuha e Manipulimit të të Dhënave).

Operatorët DML - Operatorët e Manipulimit të të Dhënave

    SELECT - zgjidhni rreshtat nga tabelat

    INSERT - shtoni rreshta në një tabelë

    UPDATE - ndryshoni rreshtat në një tabelë

    DELETE - fshini rreshtat në një tabelë

    COMMIT - kryeni ndryshimet e bëra

    ROLLBACK - riktheje ndryshimet e bëra

Operatorët e mbrojtjes dhe kontrollit të të dhënave

    KRIJO POSHTIM - krijoni kufizime

    DOP ASSERTION - hiqni një kufizim

    GRANT - jepni privilegje një përdoruesi ose aplikacioni për të manipuluar objektet

    REVOKE - revokoni privilegjet e përdoruesit ose të aplikacionit

Për më tepër, ekzistojnë grupe operatorësh për vendosjen e parametrave të sesionit, marrjen e informacionit rreth bazës së të dhënave, deklaratat statike SQL, deklaratat dinamike SQL. Më të rëndësishmit për përdoruesin janë operatorët e manipulimit të të dhënave (DML).

Shembuj të përdorimit të operatorëve të manipulimit të të dhënave

INSERT - futja e rreshtave në një tabelë

Shembulli 1 . Futja e një rreshti në një tabelë:

VLERA (4, "Ivanov");

Shembulli 2 ... Futja e disa rreshtave në tabelë, të zgjedhura nga një tabelë tjetër (të dhënat për furnizuesit nga tabela P, të cilët kanë numra më të mëdhenj se 2, futen në tabelën TMP_TABLE):

TMP_TABLE (PNUM, PNAME)

ZGJIDH PNUM, PNAME

KU P.PNUM> 2;

UPDATE - përditësimi i rreshtave në një tabelë

Shembulli 3 ... Përditësimi i shumë rreshtave në një tabelë:

SET PNAME = "Pushnikov"

KU P.PNUM = 1;

DELETE - fshirja e rreshtave në një tabelë

Shembulli 4 . Fshirja e shumë rreshtave në një tabelë:

KU P.PNUM = 1;

Shembulli 5 ... Fshirja e të gjitha rreshtave në një tabelë:

Shembuj të përdorimit të deklaratës SELECT

Deklarata SELECT është në fakt deklarata më e rëndësishme dhe komplekse SQL për përdoruesin. Është menduar për marrjen e të dhënave nga tabelat, d.m.th. ai, në fakt, zbaton një nga qëllimet kryesore të bazës së të dhënave - të sigurojë informacion për përdoruesit.

Deklarata SELECT ekzekutohet gjithmonë në disa nga tabelat në bazën e të dhënave.

Komentoni... Në fakt, bazat e të dhënave mund të përmbajnë jo vetëm tabela të qëndrueshme, por edhe tabela të përkohshme dhe të ashtuquajturat pamje. Pamjet janë thjesht deklarata SELECT të ruajtura në bazën e të dhënave. Nga këndvështrimi i përdoruesve, një pamje është një tabelë që nuk ruhet në mënyrë të përhershme në bazën e të dhënave, por "shfaqet" në momentin kur aksesohet. Nga këndvështrimi i deklaratës SELECT, tabelat e vazhdueshme dhe tabelat dhe pamjet e përkohshme duken saktësisht të njëjta. Sigurisht, ekzekutimi aktual i deklaratës SELECT nga sistemi merr parasysh ndryshimet midis tabelave dhe pamjeve të ruajtura, por këto dallime i fshehur nga përdoruesi.

Rezultati i një deklarate SELECT është gjithmonë një tabelë. Kështu, rezultatet e veprimeve e bëjnë deklaratën SELECT të ngjashme me operatorët e algjebrës relacionale. Çdo operator algjebër relacional mund të shprehet me një deklaratë SELECT të formuluar në mënyrë të përshtatshme. Kompleksiteti i deklaratës SELECT përcaktohet nga fakti se ai përmban të gjitha tiparet e algjebrës relacionale, si dhe veçori shtesë që nuk janë të disponueshme në algjebër relacionale.

Në pjesën e parë, ne kemi prekur tashmë pak gjuhën DML, duke përdorur pothuajse të gjithë grupin e komandave të saj, me përjashtim të komandës MERGE.

Unë do të flas për DML në sekuencën time të zhvilluar nga përvoja personale. Gjatë rrugës do të përpiqem t'ju tregoj edhe për vendet "rrëshqitëse" ku ia vlen të fokusohemi, këto vende "të rrëshqitshme" që janë të ngjashme në shumë dialekte të gjuhës SQL.

Sepse teksti i kushtohet një game të gjerë lexuesish (jo vetëm programues), atëherë shpjegimi, ndonjëherë do të jetë i përshtatshëm, d.m.th. e gjatë dhe e lodhshme. Ky është vizioni im për materialin, i cili kryesisht përftohet në praktikë si rezultat i veprimtarisë profesionale.

Qëllimi kryesor i këtij tutoriali, hap pas hapi, është të zhvillojë një kuptim të plotë të thelbit të gjuhës SQL dhe t'ju mësojë se si të zbatoni saktë ndërtimet e saj. Profesionistët në këtë fushë mund të jenë gjithashtu të interesuar të lëvizin nëpër këtë material, ndoshta ata do të jenë në gjendje të nxjerrin diçka të re për veten e tyre, ose ndoshta do të jetë thjesht e dobishme të lexojnë për të rifreskuar kujtesën e tyre. Shpresoj se të gjithë do ta kenë interesante.

Sepse DML në dialektin e bazës së të dhënave MS SQL është shumë i lidhur me sintaksën e konstruksionit SELECT, atëherë do të filloj të flas për DML me të. Sipas mendimit tim, ndërtimi SELECT është ndërtimi më i rëndësishëm i gjuhës DML, që nga ajo kohë në kurriz të tij ose pjesëve të tij, bëhet përzgjedhja e të dhënave të nevojshme nga baza e të dhënave.

DML përmban konstruktet e mëposhtme:

  • SELECT - përzgjedhja e të dhënave
  • INSERT - futja e të dhënave të reja
  • UPDATE - përditësimi i të dhënave
  • DELETE - fshirja e të dhënave
  • MERGE - bashkimi i të dhënave

Në këtë pjesë, ne do të mbulojmë vetëm sintaksën bazë të komandës SELECT, e cila duket kështu:

ZGJIDH listën e kolonave ose * NGA burimi WHERE filtro ORDER BY sort_expression
Tema e deklaratës SELECT është shumë e gjerë, ndaj në këtë pjesë do të ndalem vetëm në konstruktet e saj bazë. Unë besoj se, pa e njohur mirë bazën, nuk mund të filloni të studioni struktura më komplekse, sepse atëherë gjithçka do të sillet rreth këtij konstruksioni bazë (nënpyetje, bashkime, etj.).

Gjithashtu në këtë pjesë do të flas edhe për propozimin TOP. Unë me qëllim nuk e tregova këtë fjali në sintaksën bazë, pasi zbatohet ndryshe në dialekte të ndryshme të gjuhës SQL.

Nëse DDL është më statike, d.m.th. me ndihmën e saj krijohen struktura të ngurta (tabela, lidhje, etj.), atëherë gjuha DML ka natyrë dinamike, këtu mund të merrni rezultatet e sakta në mënyra të ndryshme.

Trajnimi do të vazhdojë edhe në modalitetin Hap pas hapi, d.m.th. kur lexoni, duhet të përpiqeni menjëherë të ndiqni shembullin me duart tuaja. Pas kësaj, ju analizoni rezultatin dhe përpiqeni ta kuptoni atë në mënyrë intuitive. Nëse diçka mbetet e paqartë, për shembull, kuptimi i një funksioni, atëherë kontaktoni Internetin për ndihmë.

Shembujt do të shfaqen në bazën e të dhënave Test, e cila u krijua duke përdorur DDL + DML në pjesën e parë.

Për ata që nuk krijuan një bazë të dhënash në pjesën e parë (pasi jo të gjithë mund të jenë të interesuar në gjuhën DDL), mund të përdorni skriptin e mëposhtëm:

Testi i skriptit të krijimit të bazës së të dhënave

Krijimi i një baze të dhënash KRIJO BAZË TË TË DHËNAVE Test GO - bëj bazën e të dhënave të Testit të tanishme PËRDORIMI Test GO - krijo tabela referuese KRIJO TABELA Pozicionet (ID int IDENTITY (1,1) NOT NULL KUFIZIM PK_Pozicionet ÇELËSI PRIMAR, Emri nvarchar (30) NOT NULL) CREATE Departamentet (ID int IDENTITY (1,1) NUK KUFIZIM NULL PK_Departamentet ÇELËSI PRIMAR, Emri nvarchar (30) NOT NULL) SHKO - plotësoni tabelat e referencës me të dhëna SET IDENTITY_INSERT Pozicionet (ID, Emri) VALUES (1, N "Llogaritar") , (2, N "Drejtor"), (3, N "Programues"), (4, N "Programues i vjetër") SET IDENTITY_INSERT Pozicionet OFF SHKO SET IDENTITY_INSERT Departamentet ON INSERT Departamentet (ID, Emri) VALUES (1, N " Administrata"), (2, N "Kontabilitet"), (3, N "IT") SET IDENTITY_INSERT Departamentet OFF SHKO - krijoni një tabelë me punonjësit KRIJO TABELA Punonjësit (ID int NOT NULL, Emri nvarchar (30), Data e ditëlindjes , Email nvarchar (30), PositionID int, DepartmentID int, HireDate data NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME (), ID Manager int, C ONSTRAINT PK_Punonjësit PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID) REFERENCES Departamentet (ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCESIDONEECKES (PositionID) ID MES 1000 DHE 1999), INDEKSI IDX_Emri_Punonjësit (Emri)) SHKO - plotësojeni me INSERT të dhënat e punonjësve (ID, Emri, Ditëlindja, Email, Pozicioni ID, ID Departamenti, ID e Menaxherit) VLERAT (1000, N " Ivanov "5,291" " [email i mbrojtur]", 2,1, NULL), (1001, N" Petrov P.P. "," 19831203 "," [email i mbrojtur]", 3,3,1003), (1002, N" Sidorov S.S. "," 19760607 "," [email i mbrojtur]", 1,2,1000), (1003, N" Andreev A.A. "," 19820417 "," [email i mbrojtur]",4,3,1000)

Kjo është e gjitha, tani ne jemi gati të fillojmë të mësojmë gjuhën DML.

SELECT - operatori i përzgjedhjes së të dhënave

Para së gjithash, për redaktorin aktiv të pyetjeve, ne do të bëjmë Testimin e bazës aktuale të bazës së të dhënave duke e zgjedhur atë në listën rënëse ose duke përdorur komandën "USE Test".

Le të fillojmë me formën më themelore SELECT:

SELECT * NGA Punonjësit
Në këtë pyetje, ne po kërkojmë të kthejmë të gjitha kolonat (të treguara me "*") nga tabela e Punonjësve - mund ta lexoni këtë si "ZGJIDHni të gjitha_fushat NGA tabela_punonjësit". Nëse ka një indeks të grupuar, të dhënat e kthyera ka shumë të ngjarë të renditen sipas tij, në këtë rast sipas kolonës ID (por kjo nuk është çështja, pasi në shumicën e rasteve ne do të specifikojmë në mënyrë eksplicite renditjen duke përdorur ORDER BY ...) :

ID Emri ditëlindjen Email ID e pozicionit ID e Departamentit Data e punësimit ID-ja e menaxherit
1000 Ivanov I.I. 1955-02-19 [email i mbrojtur] 2 1 2015-04-08 I PAVLEFSHËM
1001 Petrov P.P. 1983-12-03 [email i mbrojtur] 3 3 2015-04-08 1003
1002 Sidorov S.S. 1976-06-07 [email i mbrojtur] 1 2 2015-04-08 1000
1003 Andreev A.A. 1982-04-17 [email i mbrojtur] 4 3 2015-04-08 1000

Në përgjithësi, vlen të thuhet se në dialektin MS SQL, forma më e thjeshtë e pyetjes SELECT mund të mos përmbajë bllokun FROM, në këtë rast mund ta përdorni për të marrë disa vlera:

SELECT 5550/100 * 15, SYSDATETIME (), - duke marrë datën e sistemit të bazës së të dhënave SIN (0) + COS (0)

(Nuk ka emër kolone) (Nuk ka emër kolone) (Nuk ka emër kolone)
825 2015-04-11 12:12:36.0406743 1

Ju lutemi vini re se shprehja (5550/100 * 15) dha rezultatin 825, megjithëse nëse llogarisim në kalkulator, marrim vlerën (832.5). Rezultati 825 është marrë për arsye se në shprehjen tonë të gjithë numrat janë numra të plotë, prandaj rezultati është një numër i plotë, d.m.th. (5550/100) na jep 55, jo (55.5).

Mbani mend sa vijon, logjika e mëposhtme funksionon në MS SQL:

  • Integer / Integer = Integer (d.m.th., në këtë rast, ndodh ndarja e numrit të plotë)
  • Real / E tërë = Real
  • Integer / Real = Real
ato. rezultati konvertohet në një lloj më të madh, kështu që në 2 rastet e fundit marrim një numër real (mendoni si në matematikë - diapazoni i numrave realë është më i madh se diapazoni i numrave të plotë, kështu që rezultati konvertohet në të):

ZGJEDH 123/10, - 12 123./10, - 12.3 123/10. - 12.3
Këtu (123.) = (123.0), vetëm në këtë rast 0 mund të hidhet dhe mund të lihet vetëm pika.

Për veprimet e tjera aritmetike, vlen e njëjta logjikë, por në rastin e ndarjes, kjo nuancë është më e rëndësishme.

Prandaj, kushtojini vëmendje llojit të të dhënave të kolonave numerike. Në rast se është numër i plotë, dhe ju duhet të merrni një rezultat real, atëherë përdorni transformimin, ose thjesht vendosni një periudhë pas numrit të specifikuar si konstante (123.).

Mund të përdorni funksionin CAST ose CONVERT për të konvertuar fushat. Për shembull, do të përdorim fushën ID, e kemi të tipit int:

SELECT ID, ID / 100, - këtu do të jetë një ndarje e plotë CAST (ID AS float) / 100, - përdorni funksionin CAST për ta kthyer në llojin notues CONVERT (float, ID) / 100, - përdorni funksionin CONVERT për ta kthyer në lloji float ID / 100. - ne përdorim transformimin duke treguar se emëruesi është një numër real FROM Punonjësit

ID (Nuk ka emër kolone) (Nuk ka emër kolone) (Nuk ka emër kolone) (Nuk ka emër kolone)
1000 10 10 10 10.000000
1001 10 10.01 10.01 10.010000
1002 10 10.02 10.02 10.020000
1003 10 10.03 10.03 10.030000

Në një shënim. Në bazën e të dhënave ORACLE, sintaksa pa bllokun FROM nuk lejohet, për këtë përdoret tabela e sistemit DUAL, e cila përmban një rresht:

SELECT 5550/100 * 15, - dhe në ORACLE rezultati do të jetë 832.5 sysdate, sin (0) + cos (0) FROM DUAL


Shënim. Emri i tabelës në shumë RDB mund të paraprihet nga emri i skemës:

SELECT * FROM dbo.Punonjësit - dbo - emri i skemës

Një skemë është një njësi logjike e një baze të dhënash, e cila ka emrin e vet dhe ju lejon të gruponi objektet e bazës së të dhënave si tabelat, pamjet, etj. brenda vetes.

Përkufizimi i një skeme në baza të ndryshme të dhënash mund të ndryshojë, diku skema lidhet drejtpërdrejt me përdoruesin e bazës së të dhënave, d.m.th. në këtë rast, mund të themi se skema dhe përdoruesi janë sinonime dhe të gjitha objektet e krijuara në skemë janë në thelb objekte të këtij përdoruesi. Në MS SQL, një skemë është një njësi logjike e pavarur që mund të krijohet vetë (shih KRIJO SKEMA).

Si parazgjedhje, një skemë e quajtur dbo (Pronari i bazës së të dhënave) krijohet në bazën e të dhënave MS SQL dhe të gjitha objektet e krijuara krijohen në këtë skemë si parazgjedhje. Prandaj, nëse thjesht specifikojmë emrin e tabelës në pyetje, atëherë ajo do të kërkohet në skemën dbo të bazës së të dhënave aktuale. Nëse duam të krijojmë një objekt në një skemë specifike, do të duhet të paraqesim edhe emrin e objektit me emrin e skemës, për shembull, "KRIJO TABLE schema_name.tabela_name (...)".

Në rastin e MS SQL, emri i skemës gjithashtu mund të paraprihet nga emri i bazës së të dhënave në të cilën ndodhet kjo skemë:

SELECT * FROM Test.dbo.Punonjësit - database_name.schema_name.table
Ky sqarim është i dobishëm, për shembull, nëse:

  • në një kërkesë i referohemi objekteve të vendosura në skema ose baza të të dhënave të ndryshme
  • ju duhet të transferoni të dhëna nga një skemë ose bazë të dhënash në tjetrën
  • duke qenë në një bazë të dhënash, ju duhet të kërkoni të dhëna nga një bazë tjetër e të dhënave
  • etj.
Një skemë është një mjet shumë i përshtatshëm që është i dobishëm gjatë zhvillimit të një arkitekture të bazës së të dhënave, veçanërisht bazave të të dhënave të mëdha.

Gjithashtu, mos harroni se në tekstin e kërkesës mund të përdorim të dy komentet me një rresht "- ..." dhe me shumë rreshta "/ * ... * /". Nëse kërkesa është e madhe dhe komplekse, atëherë komentet mund të jenë shumë të dobishme, ju ose dikush tjetër, pas një kohe, mbani mend ose kuptoni strukturën e saj.

Nëse ka shumë kolona në tabelë, dhe veçanërisht nëse ka ende shumë rreshta në tabelë, plus nëse bëjmë pyetje në bazën e të dhënave përmes rrjetit, atëherë ndahet një përzgjedhje me një listë të drejtpërdrejtë të fushave që ju nevojiten. me presje do të jetë e preferueshme:

SELECT ID, Emri FROM Punonjësit

ato. këtu themi se duhet të kthejmë vetëm fushat ID dhe Emri nga tabela. Rezultati do të jetë si më poshtë (nga rruga, optimizuesi këtu vendosi të përdorë indeksin e krijuar në fushën Emri):

ID Emri
1003 Andreev A.A.
1000 Ivanov I.I.
1001 Petrov P.P.
1002 Sidorov S.S.

Në një shënim. Ndonjëherë është e dobishme të shikosh se si merren të dhënat, për shembull, për të gjetur se cilët indekse janë në përdorim. Kjo mund të bëhet nëse klikoni në butonin "Shfaq planin e vlerësuar të ekzekutimit" ose vendosni "Përfshi planin aktual të ekzekutimit - Përfshi planin aktual të ekzekutimit të pyetjes në rezultat" :

Analiza e planit të ekzekutimit është shumë e dobishme kur optimizoni një pyetje, ju lejon të zbuloni se cilët indekse mungojnë ose cilët indekse nuk përdoren fare dhe mund t'i fshini ato.

Nëse sapo keni filluar të zotëroni DML, atëherë tani nuk është aq e rëndësishme për ju, thjesht mbani shënim dhe mund ta harroni me siguri (mund të mos jetë kurrë e dobishme për ju) - qëllimi ynë fillestar është të mësojmë bazat e DML gjuhën dhe mësoni se si t'i përdorni ato në mënyrë korrekte, dhe optimizimi është tashmë një art më vete. Ndonjëherë është më e rëndësishme që thjesht të keni një pyetje të shkruar saktë që kthen rezultatin e saktë nga pikëpamja e lëndës, dhe njerëz individualë janë tashmë të angazhuar në optimizimin e tij. Për të filluar, duhet të mësoni se si thjesht t'i shkruani saktë pyetjet, duke përdorur çdo mjet për të arritur qëllimin. Qëllimi kryesor që duhet të arrini tani është që pyetja juaj të japë rezultate të sakta.

Vendosja e pseudonimeve për tabelat

Kur renditni kolonat, ato mund të paraprihen nga emri i tabelës në bllokun FROM:

SELECT Employees.ID, Employees.Name FROM Employees

Por kjo sintaksë zakonisht është e papërshtatshme për t'u përdorur, sepse emri i tabelës mund të jetë i gjatë. Për këto qëllime, zakonisht vendosen dhe përdoren emra më të shkurtër - pseudonimi:

SELECT emp.ID, emp.Emri FROM Employees AS emp
ose

SELECT emp.ID, emp.Name FROM Employees emp - Fjala kyçe AS mund të hiqet (Unë preferoj këtë opsion)

Këtu emp është një pseudonim për tabelën Employees që mund të përdoret në kontekstin e kësaj deklarate SELECT. ato. mund të themi se në kontekstin e kësaj deklarate SELECT po i japim tabelës një emër të ri.

Natyrisht, në këtë rast, rezultatet e pyetjes do të jenë saktësisht të njëjta si për "SELECT ID, Emri FROM Employees". Për atë që do të jetë e nevojshme do të jetë e qartë më tej (as edhe në këtë pjesë), tani për tani thjesht kujtojmë se emri i kolonës mund të paraprihet (specifikohet) ose drejtpërdrejt me emrin e tabelës, ose duke përdorur një pseudonim. Ju mund të përdorni një nga dy gjërat këtu, d.m.th. nëse keni specifikuar një pseudonim, atëherë do t'ju duhet ta përdorni, por nuk mund ta përdorni më emrin e tabelës.

Në një shënim. Në ORACLE, lejohet vetëm opsioni i specifikimit të një pseudonimi të tabelës pa fjalën kyçe AS.

SHQYRTIM - hidhni linjat e kopjuara

Fjala kyçe DISTINCT përdoret për të hequr rreshtat e kopjuar nga rezultati i pyetjes. Përafërsisht, imagjinoni që fillimisht pyetja të ekzekutohet pa opsionin DISTINCT dhe më pas të gjitha dublikatat të hiqen nga rezultati. Le ta demonstrojmë këtë për qartësi më të madhe me një shembull:

Le të krijojmë një tabelë të përkohshme për demonstrim CREATE TABLE #Trash (ID int NOT NULL PRIMARY KEY, Col1 varchar (10), Col2 varchar (10), Col3 varchar (10)) - mbusheni këtë tabelë me të gjitha llojet e mbeturinave INSERT #Trash ( ID, kolon 1, kolon 2, kolon 3) VLERA (1, "A", "A", "A"), (2, "A", "B", "C"), (3, "C", "A" ", "B "), (4," A "," A "," B "), (5," B "," B "," B "), (6," A "," A ", " B ") , (7, "A", "A", "A"), (8, "C", "A", "B"), (9, "C", "A", "B" "), ( 10, "A", "A", "B"), (11, "A", NULL, "B"), (12, "A", NULL, "B") - le të shohim se çfarë pyetja kthehet pa një opsion DISTINCT SELECT Col1, Col2, Col3 FROM #Trash - le të shohim se çfarë kthen pyetja me opsionin DISTINCT SELECT DISTINCT Col1, Col2, Col3 FROM #Trash - fshini tabelën e përkohshme DROP TABLE #Trash

Është e qartë se do të duket kështu (të gjitha dublikatat janë shënuar me të njëjtën ngjyrë):

Tani le të shohim se ku mund të zbatohet kjo, me një shembull më praktik - ne do të kthejmë vetëm identifikuesit unikë të departamentit nga tabela e punonjësve (d.m.th., zbuloni ID-të e departamentit në të cilat janë renditur punonjësit):

ZGJIDHNI DISTINCT Departamentin NGA Punonjësit

Këtu kemi marrë 4 rreshta, sepse nuk ka kombinime dublikate (DepartmentID, PositionID) në tabelën tonë.

Kthehu në DDL për një moment

Meqenëse nuk ka të dhëna të mjaftueshme për shembuj demo, dhe dua t'ju them më gjerësisht dhe qartë, le të zgjerojmë pak tabelën tonë Employess. Përveç kësaj, le të kujtojmë pak DDL, siç thonë ata "përsëritja është nëna e të mësuarit", dhe plus përsëri le të vrapojmë pak përpara dhe të zbatojmë deklaratën UPDATE:

Krijo kolona të reja ALTER TABLE Punonjësit SHTO Mbiemri nvarchar (30), - mbiemri Emri Emri nvarchar (30), - Emri Emri i Mesëm nvarchar (30), - patronimik Paga float, - dhe, natyrisht, RFP në një lloj bonusiPërqindja e flotës - përqindje për llogaritja e bonusit nga paga GO - ne i mbushim ato me të dhëna (disa të dhëna janë hequr qëllimisht) PËRDITËSIM Punonjësit SET Mbiemri = N "Ivanov", Emri = N "Ivan", Emri i Mesëm = N "Ivanovich", Paga = 5000, BonusPërqind = 50 KU ID = 1000 - Ivanov II Përditëso Punonjësit SET Mbiemri = N "Petrov", Emri = N "Peter", Emri i Mesëm = N "Petrovich", Paga = 1500, BonusPërqindja = 15 KU ID = 1001 - Petrov P.P. Përditëso Punonjësit SET Mbiemri = N "Sidorov", Emri = N "Sidor", Emri i Mesëm = NULL, Paga = 2500, BonusPërqindja = NULL KU ID = 1002 - Sidorov S.S. Përditëso Punonjësit SET Mbiemri = N "Andreev", Emri = N "Andrey", Emri i Mesëm = NULL, Paga = 2000, BonusPërqindja = 30 KU ID = 1003 - Andreev A.A.

Le të sigurohemi që të dhënat janë përditësuar me sukses:

SELECT * NGA Punonjësit

ID Emri Mbiemri Emri Emri i mesëm Paga BonusPërqindje
1000 Ivanov I.I. Ivanov Ivan Ivanovich 5000 50
1001 Petrov P.P. Petrov Pjetri Petroviç 1500 15
1002 Sidorov S.S. Sidorov Sidor I PAVLEFSHËM 2500 I PAVLEFSHËM
1003 Andreev A.A. Andreev Andrey I PAVLEFSHËM 2000 30

Vendosja e pseudonimeve për kolonat e pyetjeve

Unë mendoj se do të jetë më e lehtë të tregosh këtu sesa të shkruaj:

SELECT - jepni një emër kolonës së llogaritur Mbiemri + "" + Emri + "" + Emri i Mesëm AS emri i plotë, - përdorni thonjëza të dyfishta, pasi hapësira përdoret HireDate AS "Data e pritjes", - përdorimi i kllapave katrore, që nga viti përdoret hapësira e bardhë Ditëlindja AS [Data e lindjes], - fjala AS është opsionale Paga ZP NGA Punonjësit

Emri i plotë data e marrjes Data e lindjes ZP
Ivanov Ivan Ivanovich 2015-04-08 1955-02-19 5000
Petrov Petr Petrovich 2015-04-08 1983-12-03 1500
I PAVLEFSHËM 2015-04-08 1976-06-07 2500
I PAVLEFSHËM 2015-04-08 1982-04-17 2000

Siç mund ta shihni, pseudonimet e kolonës që vendosëm pasqyrohen në kokën e tabelës që rezulton. Në fakt, ky është qëllimi kryesor i pseudonimeve të kolonave.

Ju lutemi vini re, sepse 2 punonjësit e fundit nuk kanë një emër të mesëm (vlera NULL), atëherë rezultati i shprehjes "Mbiemri +" "+ Emri +" "+ Emri i mesëm" na ktheu gjithashtu NULL.

Për të bashkuar (shtuar, bashkuar) vargjet në MS SQL, përdorni simbolin "+".

Mos harroni se të gjitha shprehjet në të cilat përfshihet NULL (për shembull, pjesëtimi me NULL, shtimi me NULL) do të kthejnë NULL.

Në një shënim.
Në rastin e ORACLE, operatori "||" përdoret për të bashkuar vargjet. dhe lidhja do të duket si "Mbiemri ||" "|| Emri ||" "|| Emri i mesëm". Për ORACLE vlen të përmendet se ka një përjashtim për llojet e vargjeve, për ta NULL dhe një varg bosh "" janë një dhe e njëjta, prandaj në ORACLE kjo shprehje do të kthehet për 2 punonjësit e fundit Sidorov Sidor dhe Andreyev Andrey. Në kohën e versionit të ORACLE 12c, me sa di unë, nuk ka asnjë opsion që e ndryshon këtë sjellje (nëse nuk është e drejtë, ju lutem më korrigjoni). Këtu e kam të vështirë të gjykoj nëse është e mirë apo e keqe, sepse në disa raste sjellja e një vargu NULL është më e përshtatshme si në MS SQL, dhe në të tjera si në ORACLE.

Të gjitha pseudonimet e mësipërme të kolonës janë gjithashtu të vlefshme në ORACLE, përveç [...].


Për të mos e rrethuar konstruksionin duke përdorur funksionin ISNULL, në MS SQL mund të përdorim funksionin CONCAT. Le të shqyrtojmë dhe krahasojmë 3 opsione:

SELECT LastName + "" + FirstName + "" + MiddleName FullName1, - 2 opsione për zëvendësimin e NULL me vargjet boshe "" (marrim të njëjtën sjellje si në ORACLE) ISNULL (LastName, "") + "" + ISNULL (FirstName, "") + "" + ISNULL (Emri i mesëm, "") Emri i plotë2, CONCAT (Mbiemri, "", Emri, "", Emri i Mesëm) Emri i plotë3 FROM Punonjësit

Emri i plotë 1 Emri i plotë 2 Emri i plotë 3
Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich
Petrov Petr Petrovich Petrov Petr Petrovich Petrov Petr Petrovich
I PAVLEFSHËM Sidorov Sidor Sidorov Sidor
I PAVLEFSHËM Andreev Andrey Andreev Andrey

Në MS SQL, pseudonimet mund të specifikohen gjithashtu duke përdorur shenjën e barabartë:

SELECT "Data e pranimit" = HireDate, - përveç "…" dhe [...] mund të përdorni "..." [Data e lindjes] = Ditëlindja, ZP = Paga NGA Punonjësit

Përdorimi i fjalës kyçe AS ose i shenjës së barazimit për të specifikuar pseudonimin është ndoshta më shumë çështje shije. Por kur analizoni kërkesat e njerëzve të tjerë, kjo njohuri mund të jetë e dobishme.

Së fundi, do të them se për pseudonimet është më mirë të vendosni emra duke përdorur vetëm karaktere dhe numra latinë, duke shmangur përdorimin e "...", "..." dhe [...], domethënë të përdorni të njëjtat rregulla. që kemi përdorur gjatë emërtimit të tabelave. Më tej, në shembujt do të përdor vetëm emra të tillë dhe jo "...", "..." dhe [...].

Operatorët bazë aritmetik SQL


Prioriteti i ekzekutimit të operatorëve aritmetikë është i njëjtë si në matematikë. Nëse është e nevojshme, rendi i operatorëve mund të ndryshohet duke përdorur kllapa - (a + b) * (x / (y-z)).

Dhe e përsëris edhe një herë se çdo operacion me NULL jep NULL, për shembull: 10 + NULL, NULL * 15/3, 100 / NULL - e gjithë kjo do të rezultojë në NULL. ato. thjesht duke folur një vlerë të papërcaktuar nuk mund të japë një rezultat të caktuar. Merrni këtë parasysh kur hartoni një pyetje dhe, nëse është e nevojshme, përpunoni vlerat NULL me funksionet ISNULL, COALESCE:

SELECT ID, Emri, Paga / 100 * BonusPercent SI Rezultati1, - pa përpunuar vlera NULL Paga / 100 * ISNULL (BonusPercent, 0) SI Rezultati2, - përdorni funksionin ISNULL Paga / 100 * COALESCE (BonusPercent Rezultati, 30) - - ne përdorim funksionin BASHKIMI NGA Punonjësit

Do t'ju tregoj pak për funksionin COALESCE:

COALESCE (expr1, expr2, ..., exprn) - Kthen vlerën e parë jo-NULL në një listë vlerash.

SELECT COALESCE (f1, f1 * f2, f2 * f3) val - në këtë rast vlera e tretë do të kthehet FROM (SELECT null f1, 2 f2, 3 f3) q

Në thelb, unë do të fokusohem në të folurit për konstruktet DML, dhe në pjesën më të madhe nuk do të flas për funksionet që do të gjenden në shembuj. Nëse nuk e kuptoni se çfarë bën ky apo ai funksion, kërkoni përshkrimin e tij në internet, madje mund të kërkoni informacion menjëherë nga një grup funksionesh, për shembull, duke kërkuar në kërkimin Google "funksionet e vargut MS SQL", " Funksionet matematikore MS SQL” ose “Funksionet MS SQL që trajtojnë NULL”. Ka shumë informacione për funksionet dhe mund t'i gjeni lehtësisht. Për shembull, në bibliotekën MSDN, mund të lexoni më shumë rreth funksionit COALESCE:

Fragment nga MSDN Krahasimi i BASHKIMIT dhe RASTIT

Shprehja COALESCE është një shkurtore sintaksore për një shprehje CASE. Kjo do të thotë që kodi COALESCE (shprehja1, ... n) rishkruhet nga optimizuesi i pyetjeve si shprehja e mëposhtme CASE:

RAST KUR (shprehja 1 NUK ËSHTË NULL) THËNË shprehja 1 KUR (shprehja 2 NUK ESHTE NULL) THENË shprehja 2 ... ELSE shprehjeN FUND

Si shembull, merrni parasysh se si mund të përdorni pjesën e mbetur të pjesëtimit (%). Ky operator është shumë i dobishëm kur ju duhet të ndani të dhënat në grupe. Për shembull, le të nxjerrim të gjithë punonjësit që kanë numra çift personeli (ID), d.m.th. ato ID që ndahen me 2:

SELECT ID, Emri FROM Punonjësit WHERE ID% 2 = 0 - pjesa e mbetur e pjesëtimit me 2 është 0

ORDER BY - renditni rezultatin e pyetjes

Klauzola ORDER BY përdoret për të renditur rezultatin e pyetjes.

ZGJIDHni Mbiemrin, Mbiemrin, Pagën NGA Punonjësit RENDOSJE SIPAS Mbiemrit, Emrit - renditni rezultatin sipas 2 kolonave - sipas Mbiemrit dhe më pas sipas Emrit

Për një shënim. Për renditjen në rritje, ekziston fjala kyçe ASC, por meqenëse renditja në ngjitje përdoret si parazgjedhje, mund ta harroni këtë opsion (nuk më kujtohet rasti që dikur e kam përdorur këtë opsion).

Vlen të përmendet se në klauzolën ORDER BY, mund të përdorni edhe fusha që nuk janë të listuara në klauzolën SELECT (përveç rastit kur përdoret DISTINCT, për këtë do të flas më poshtë). Për shembull, do të vrapoj pak përpara duke përdorur opsionin TOP dhe do të tregoj se si, për shembull, mund të zgjidhni 3 punonjës që kanë pagën më të lartë, duke marrë parasysh që nuk duhet të tregoj vetë pagën për qëllime konfidencialiteti:

ZGJIDH TOP 3 - kthe vetëm 3 rekordet e para nga i gjithë rezultati ID, Mbiemri, Emri NGA Punonjësit RENDIT SIPAS rrogës DESC - rendit rezultatin në rend zbritës të pagës

ID Mbiemri Emri
1000 Ivanov Ivan
1002 Sidorov Sidor

Sigurisht, këtu ka një rast që disa punonjës mund të kenë të njëjtën pagë dhe është e vështirë të thuhet se cilët tre punonjës do t'i kthejë kjo kërkesë, kjo tashmë duhet të zgjidhet me menaxherin e detyrave. Supozoni, pasi keni diskutuar këtë problem me menaxherin e detyrave, ju ranë dakord dhe vendosët të përdorni opsionin e mëposhtëm - të bëni një renditje shtesë sipas fushës së datës së lindjes (d.m.th., të rinjtë janë të dashur për ne), dhe nëse data e lindjes së disa punonjës mund të përkojnë (në fund të fundit, kjo gjithashtu nuk përjashtohet), atëherë mund të bëni një renditje të tretë në rend zbritës të vlerave të ID-së (në radhën e fundit, zgjedhja do të përfshijë ata me ID-në maksimale - për shembull, ato të cilët u pranuan të fundit, le të themi se numrat e personelit lëshohen në mënyrë sekuenciale me ne):

ZGJIDH TOP 3 - kthe vetëm 3 rekordet e para nga i gjithë rezultati ID, Mbiemri, Emri NGA Punonjësit RENDOSJA SIPAS rrogës DESC, - 1. renditni rezultatin në rend zbritës të ditëlindjes së pagës, - 2. më pas sipas datës së lindjes ID DESC - 3. dhe për paqartësi të plotë të rezultatit shtojmë renditjen sipas ID

ato. duhet të përpiqeni ta bëni rezultatin e pyetjes të parashikueshëm, në mënyrë që në rast të informimit të fluturimit, të mund të shpjegoni pse pikërisht këta persona u përfshinë në "listën e zezë", dmth. gjithçka u zgjodh me ndershmëri, sipas rregullave të miratuara.

Renditja mund të bëhet gjithashtu duke përdorur shprehje të ndryshme në klauzolën ORDER BY:

ZGJIDHni Mbiemrin, Mbiemrin NGA Punonjësit ORDER BY CONCAT (LastName, "", FirstName) - përdorni shprehjen

Gjithashtu, në ORDER BY, mund të përdorni pseudonimet e specifikuara për kolonat:

SELECT CONCAT (LastName, "", FirstName) fi FROM Employees ORDER BY fi - duke përdorur një pseudonim

Duhet të theksohet se në rastin e përdorimit të klauzolës DISTINCT, vetëm kolonat e listuara në bllokun SELECT mund të përdoren në klauzolën ORDER BY. ato. pas aplikimit të operacionit DISTINCT, marrim një grup të ri të dhënash, me një grup të ri kolonash. Për këtë arsye, shembulli i mëposhtëm nuk do të funksionojë:

ZGJIDHNI TË NDRYSHËM Mbiemrin, Emrin, Pagën NGA Punonjësit RENDOSJE SIPAS ID - ID nuk është e pranishme në grupin përfundimtar, të cilin e morëm duke përdorur DISTINCT

ato. klauzola ORDER BY zbatohet në grupin e rezultateve, përpara se rezultati t'i kthehet përdoruesit.

Shënim 1. Gjithashtu, në klauzolën ORDER BY, mund të përdorni numrat e kolonave të listuara në SELECT:

ZGJIDH Mbiemrin, Mbiemrin, Pagën FROM Punonjësit RENDOSJE SIPAS - renditje sipas renditjes 3 DESC, - 1.paga në rënie 1, - 2.nga mbiemri 2 - 3.sipas emrit

Për fillestarët, duket e përshtatshme dhe joshëse, por është më mirë të harroni dhe të mos përdorni kurrë këtë opsion klasifikimi.

Nëse në këtë rast (kur fushat janë renditur në mënyrë eksplicite), ky opsion është ende i pranueshëm, atëherë për rastin që përdor "*" është më mirë të mos e përdorni kurrë këtë opsion. Pse - sepse nëse dikush, për shembull, ndryshon rendin e kolonave në tabelë, ose fshin kolonat (dhe kjo është një situatë normale), pyetja juaj gjithashtu mund të funksionojë, por tashmë është e gabuar, sepse renditja tashmë mund të shkojë në kolona të tjera, dhe kjo është e fshehtë sepse ky gabim mund të mos zbulohet shumë shpejt.

Nëse kolonat do të renditeshin në mënyrë eksplicite, atëherë në situatën e mësipërme, pyetja ose do të vazhdonte të funksiononte, por edhe në mënyrë korrekte (pasi gjithçka është e përcaktuar në mënyrë eksplicite), ose thjesht do të jepte një gabim që kjo kolonë nuk ekziston.

Kështu që mund të harroni me siguri renditjen sipas numrave të kolonave.

Shënim 2.
Në MS SQL, kur renditni në rend rritës, vlerat NULL do të shfaqen së pari.

ZGJIDHNI BonusPercent NGA Punonjësit RENDOSJE NGA BonusPercent

Prandaj, kur përdorni DESC, ato do të jenë në fund

ZGJIDH BonusPercent NGA Punonjësit RENDOSJE SIPAS BonusPercent DESC

Nëse keni nevojë të ndryshoni logjikën për renditjen e vlerave NULL, atëherë përdorni shprehje, për shembull:

ZGJIDHni BonusPërqindje NGA Punonjësit RENDOSUR NGA ISNULL (BonusPercent, 100)

ORACLE ofron 2 opsione për këtë qëllim NULLS FIRST dhe NULLS LAST (përdoret si parazgjedhje). Për shembull:

ZGJIDH BonusPercent NGA Punonjësit RENDOSJE NGA BonusPercent DESC NULLS FUNDIT

Kushtojini vëmendje kësaj kur kaloni në një bazë të dhënash të veçantë.

TOP - ktheni numrin e specifikuar të regjistrimeve

Fragment nga MSDN. TOP - Kufizon numrin e rreshtave të kthyer në rezultatin e pyetjes të vendosur në një numër ose përqindje të caktuar. Nëse klauzola TOP përdoret në lidhje me klauzolën ORDER BY, atëherë grupi i rezultateve kufizohet në rreshtat e parë N të rezultatit të renditur. Përndryshe, rreshtat e parë N kthehen në rend të pacaktuar.

Zakonisht kjo shprehje përdoret me klauzolën ORDER BY dhe ne kemi parë tashmë shembuj kur ishte e nevojshme të ktheheshin N rreshtat e parë nga grupi i rezultateve.

Pa ORDER BY, kjo klauzolë zakonisht përdoret kur thjesht duhet të shikoni një tabelë të panjohur për ne, në të cilën mund të ketë shumë regjistrime, në këtë rast, për shembull, mund të kërkojmë të na kthejnë vetëm 10 rreshtat e parë , por për qartësi do të themi vetëm 2:

ZGJIDH TOP 2 * NGA Punonjësit

Ju gjithashtu mund të specifikoni fjalën PERCENT, në mënyrë që të ktheni përqindjen përkatëse të rreshtave nga grupi i rezultateve:

ZGJIDHNI 25 PËRQINDHËT TOP * NGA Punonjësit

Në praktikën time, është zgjedhja sipas numrit të rreshtave që përdoret më shpesh.

Mund të përdorni gjithashtu opsionin WITH TIES me TOP, i cili do të ndihmojë në kthimin e të gjitha rreshtave në rast të një renditjeje të paqartë, d.m.th. kjo fjali do t'i kthejë të gjitha rreshtat që janë të barabartë në përbërje me rreshtat që bien në përzgjedhjen TOP N, si rezultat, mund të zgjidhen më shumë se N rreshta. Le të shtojmë një "Programues" tjetër me një pagë 1500 për demonstrim:

INSERT Punonjësit (ID, Emri, Email, Pozicioni ID, ID Departamenti, ID Menaxheri, Paga) VLERAT (1004, N "Nikolaev N.N.", " [email i mbrojtur]",3,3,1003,1500)

Dhe ne do të prezantojmë një punonjës më shumë pa specifikuar pozicionin dhe departamentin me një pagë 2000:

INSERT Punonjësit (ID, Emri, Email, Pozicioni ID, ID Departamenti, ID Menaxheri, Paga) VLERAT (1005, N "Aleksandrov A.A.", " [email i mbrojtur]", NULL, NULL, 1000,2000)

Tani le të përdorim opsionin WITH TIES për të zgjedhur të gjithë punonjësit, paga e të cilëve përputhet me pagat e 3 punonjësve, me pagën më të vogël (shpresoj të bëhet e qartë se çfarë po drejtoj më vonë):

ZGJIDH TOP 3 ME KRAVETË ID, Emri, Paga NGA Punonjësit RENDOSJA SIPAS rrogës

Këtu, megjithëse tregohet TOP 3, kërkesa ktheu 4 regjistrime, pasi Vlera e pagës që ktheu TOP 3 (1500 dhe 2000) u gjet në 4 punonjës. Me sa duket funksionon kështu:

Në një shënim.
Në baza të ndryshme të të dhënave, TOP zbatohet në mënyra të ndryshme, në MySQL ekziston një klauzolë LIMIT për këtë, në të cilën mund të vendosni gjithashtu një kompensim fillestar.

Në ORACLE 12c, ata prezantuan gjithashtu analogun e tyre duke kombinuar funksionalitetin e TOP dhe LIMIT - kërkimi me fjalët "ORACLE OFFSET FETCH". Përpara 12c, pseudokolona ROWNUM përdorej zakonisht për këtë qëllim.


Por çfarë ndodh nëse aplikoni klauzolat DISTINCT dhe TOP në të njëjtën kohë? Këto pyetje janë të lehta për t'u përgjigjur përmes eksperimentimit. Në përgjithësi, mos kini frikë dhe mos u bëni dembel për të eksperimentuar, tk. shumica e tij mësohet në praktikë. Renditja e fjalëve në deklaratën SELECT është si më poshtë, ku i pari vjen DISTINCT, i ndjekur nga TOP, d.m.th. nëse mendoni logjikisht dhe lexoni nga e majta në të djathtë, atëherë e para do të jetë hedhja e dublikatave dhe më pas do të bëhet TOP në këtë grup. Epo, le të kontrollojmë dhe të sigurohemi që është kështu:

ZGJEDHNI rrogën 2 TOP TË NDRYSHME NGA Punonjësit RENDOSUR SIPAS rrogës

Paga
1500
2000

ato. Si rezultat, ne morëm 2 pagat më të vogla nga të gjitha. Sigurisht, mund të ketë një rast që paga për disa punonjës mund të mos jetë e specifikuar (NULL), sepse skema na lejon ta bëjmë këtë. Prandaj, në varësi të detyrës, ne vendosim ose të përpunojmë vlerat NULL në klauzolën ORDER BY, ose thjesht të hedhim poshtë të gjitha të dhënat në të cilat Paga është NULL, dhe për këtë i drejtohemi studimit të klauzolës WHERE.

WHERE - kusht për zgjedhjen e rreshtave

Kjo ofertë shërben për të filtruar regjistrimet sipas një kushti të caktuar. Për shembull, le të zgjedhim të gjithë punonjësit që punojnë në departamentin "IT" (ID-ja e tij = 3):

ZGJIDH ID-në, Mbiemrin, Emrin, Pagën NGA Punonjësit WHERE DepartmentID = 3 - RENDOSJE SIPAS Mbiemrit, Emrit

ID Mbiemri Emri Paga
1004 I PAVLEFSHËM I PAVLEFSHËM 1500
1003 Andreev Andrey 2000
1001 Petrov Pjetri 1500

Klauzola WHERE shkruhet para komandës ORDER BY.

Rendi në të cilin komandat zbatohen në grupin origjinal të punonjësve është si më poshtë:

  1. KU - nëse specifikohet, atëherë gjëja e parë nga i gjithë grupi i punonjësve është të zgjidhni vetëm regjistrimet që plotësojnë kushtin
  2. DISTINCT - nëse specifikohet, të gjitha dublikatat hidhen
  3. ORDER BY - nëse specifikohet, bëhet renditja e rezultatit
  4. TOP - nëse specifikohet, vetëm numri i caktuar i regjistrimeve kthehet nga rezultati i renditur

Le të shqyrtojmë një shembull për qartësi:

ZGJIDHNI 1 Rrogën e Dalluar TOP NGA Punonjësit WHERE DepartmentID = 3 RENDOSJE SIPAS rrogës

Do të duket kështu:

Vlen të theksohet se kontrollimi për NULL nuk bëhet me shenjën e barazimit, por duke përdorur operatorët IS NULL dhe IS NOT NULL. Vetëm mbani mend se nuk mund të krahasoheni me NULL duke përdorur operatorin "=" (shenjë e barabartë), sepse edhe rezultati i shprehjes do të jetë NULL.

Për shembull, le të zgjedhim të gjithë punonjësit që nuk kanë një departament të specifikuar (d.m.th. ID-ja e Departamentit ËSHTË NULL):

ZGJIDH ID-në, Emrin NGA Punonjësit KU ID e Departamentit ËSHTË NULL

Tani, për shembull, le të llogarisim bonusin për të gjithë punonjësit që kanë vlerën BonusPercent (d.m.th. Përqindja e Bonusit NUK ËSHTË NULL):

SELECT ID, Emri, Paga / 100 * BonusPërqind SI Bonus NGA Punonjësit KU BonusPërqindja NUK ËSHTË NULL

Nga rruga, nëse mendoni për këtë, vlera e BonusPercent mund të jetë zero (0), dhe vlera gjithashtu mund të futet me një shenjë minus, sepse ne nuk vendosëm asnjë kufizim në këtë fushë.

Epo, pasi folëm për problemin, deri më tani na është thënë të marrim parasysh se nëse (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:

SELECT ID, Emri, Paga / 100 * BonusPercent SI Bonus NGA Punonjësit WHERE NOT (BonusPercent<=0 OR BonusPercent IS NULL)

ato. këtu filluam të studiojmë operatorët boolean. Shprehja në kllapa “(BonusPercent<=0 OR BonusPercent IS NULL)» проверяет на то что у сотрудника нет бонуса, а NOT инвертирует это значение, т.е. говорит «верни всех сотрудников которые не сотрудники у которых нет бонуса».

Gjithashtu, kjo shprehje mund të rishkruhet dhe menjëherë të thotë "kthehuni të gjithë punonjësit që kanë një bonus" duke e shprehur këtë me shprehjen (BonusPercent> 0 dhe BonusPercent NUK ËSHTË NULL):

SELECT ID, Emri, Paga / 100 * BonusPercent SI Bonus NGA Punonjësit KU BonusPercent> 0 DHE BonusPercent NUK ËSHTË NULL

Gjithashtu, në klauzolën WHERE, mund të kontrolloni lloje të ndryshme shprehjesh duke përdorur operatorë dhe funksione aritmetike. Për shembull, një kontroll i ngjashëm mund të bëhet duke përdorur një shprehje me funksionin ISNULL:

SELECT ID, Emri, Paga / 100 * BonusPercent AS Bonus FROM Punonjësit WHERE ISNULL (BonusPercent, 0)> 0

Operatorët Boolean dhe të thjeshtë të krahasimit

Po, këtu nuk mund të bësh pa matematikë, kështu që le të bëjmë një ekskursion të shkurtër në operatorët Boolean dhe të thjeshtë të krahasimit.

Ekzistojnë vetëm 3 operatorë Boolean në SQL - AND, OSE dhe JO:

Për secilin operator Boolean, mund të sillni tabela të së vërtetës, të cilat gjithashtu tregojnë se cili do të jetë rezultati kur kushtet mund të jenë të barabarta me NULL:

Ekzistojnë operatorët e mëposhtëm të thjeshtë të krahasimit që përdoren për të formuar kushte:

Plus ka 2 operatorë për të testuar një vlerë / shprehje për NULL:

ËSHTË NULL Kontrollimi për barazi NULL
NUK ËSHTË NULL Kontrollimi për pabarazi NULL

Prioriteti: 1) Të gjithë operatorët e krahasimit; 2) JO; 3) DHE; 4) OSE.

Kur ndërtohen shprehje logjike komplekse, përdoren kllapat:

((kushti 1 DHE kushti 2) OSE JO (kushti 3 DHE kushti 4 DHE kushti 5)) OSE (…)

Gjithashtu, duke përdorur kllapa, mund të ndryshoni sekuencën standarde të llogaritjeve.

Këtu u përpoqa të jap një ide të algjebrës Boolean në vëllim të mjaftueshëm për punë. Siç mund ta shihni, për të shkruar kushte më të ndërlikuara, nuk mund të bëni pa logjikë, por këtu nuk ka shumë (DHE, OSE dhe JO) dhe njerëzit e shpikën, kështu që gjithçka është mjaft logjike.

Shkojmë në fund të pjesës së dytë

Siç mund ta shihni, edhe për sintaksën bazë të deklaratës SELECT, mund të flisni për një kohë shumë të gjatë, por për të qëndruar brenda kornizës së artikullit, në fund do të tregoj operatorë logjikë shtesë - BETWEEN, IN dhe LIKE.

NDËRMJET - kontrolloni për hyrje në gamë

Vlera e_testuar MIDIS vlerës_fillesës DHE vlerës së_përfundimit

Shprehjet mund të përdoren si vlera.

Le të marrim një shembull:

SELECT ID, Emri, Paga NGA Punonjësit WHERE Paga MES 2000 DHE 3000 - kush ka një pagë në intervalin 2000-3000

Në fakt, BETWEEN është një shënim i thjeshtuar si:

SELECT ID, Emri, Paga FROM Punonjësit WHERE Paga> = 2000 DHE Paga<=3000 -- все у кого ЗП в диапозоне 2000-3000

Përpara fjalës BETWEEN, fjala NUK mund të përdoret, e cila do të kontrollojë vlerën për të mos hyrë në intervalin e specifikuar:

SELECT ID, Emri, Paga NGA Punonjësit KU Paga JO MES 2000 DHE 3000 - e ngjashme me NUK (Paga> = 2000 DHE Paga<=3000)

Prandaj, në rastin e përdorimit BETWEEN, IN, LIKE, ju gjithashtu mund t'i kombinoni ato me kushte të tjera duke përdorur AND dhe OSE:

SELECT ID, Emri, Paga NGA Punonjësit KU Paga MES 2000 DHE 3000 - që ka një pagë në intervalin 2000-3000 DHE ID Departamenti = 3 - numërohen vetëm punonjësit e departamentit 3

IN - kontrolloni për hyrje në listën e vlerave

Ky operator duket si ky:

Vlera e_testuar IN (vlera 1, vlera 2, ...)

Unë mendoj se është më e lehtë të tregohet me një shembull:

SELECT ID, Emri, Paga NGA Punonjësit WHERE PositionID IN (3,4) - i cili ka një pozicion prej 3 ose 4

ato. në thelb është e njëjtë me shprehjen e mëposhtme:

SELECT ID, Emri, Paga NGA Punonjësit WHERE PositionID = 3 OSE PositionID = 4 - kush ka një pozicion prej 3 ose 4

Në rastin e JO, do të jetë njësoj (ne marrim të gjithë përveç atyre nga departamenti 3 dhe 4):

SELECT ID, Emri, Paga NGA Punonjësit WHERE PositionID NOT IN (3,4) - ngjashëm me NOT (PositionID = 3 OSE PositionID = 4)

Gjithashtu, një pyetje me NOT IN mund të shprehet përmes DHE:

SELECT ID, Emri, Paga NGA Punonjësit WHERE Pozicioni ID<>3 DHE ID-ja e pozicionit<>4 - ekuivalente me Pozicioni ID NUK IN (3,4)

Vini re se nuk do të jeni në gjendje të kërkoni për vlera NULL duke përdorur klauzolën IN, sepse duke kontrolluar NULL = NULL do të kthejë gjithashtu NULL, jo True:

ZGJIDH ID-në, Emrin, ID-në e Departamentit NGA Punonjësit WHERE DepartmentID IN (1,2, NULL) - Të dhënat NULL nuk do të përfshihen në rezultat

Në këtë rast, ndani çekun në disa kushte:

ZGJIDH ID-në, Emrin, ID-në e Departamentit NGA Punonjësit WHERE ID-ja e Departamentit NË (1,2) - 1 ose 2 OSE ID-ja e Departamentit ËSHTË NULL - ose NULL

Ose mund të shkruani diçka si:

ZGJIDH ID-në, Emrin, ID-në e Departamentit FROM Punonjësit WHERE ISNULL (ID Departamenti, -1) IN (1,2, -1) - nëse jeni i sigurt se nuk ka departament me ID = -1

Unë mendoj se opsioni i parë, në këtë rast, do të jetë më i saktë dhe më i besueshëm. Në rregull, ky është vetëm një shembull, për të demonstruar se çfarë strukturash të tjera mund të ndërtohen.

Vlen gjithashtu të përmendet një gabim edhe më tinëzar në lidhje me NULL, i cili mund të bëhet kur përdorni konstruksionin NOT IN. Për shembull, le të përpiqemi të zgjedhim të gjithë punonjësit, përveç atyre, departamenti i të cilëve është i barabartë me 1 ose departamenti i të cilëve nuk është i specifikuar fare, d.m.th. është NULL. Si zgjidhje, opsioni sugjeron vetveten:

ZGJIDH ID-në, Emrin, ID-në e Departamentit NGA Punonjësit WHERE DepartmentID NOT IN (1, NULL)

Por pas ekzekutimit të pyetjes, ne nuk do të marrim një rresht të vetëm, megjithëse prisnim të shihnim sa vijon:

Përsëri, shakaja këtu u luajt nga NULL e specifikuar në listën e vlerave.

Le të shohim pse ndodhi një gabim logjik në këtë rast. Le ta zgjerojmë pyetjen duke përdorur AND:

ZGJIDH ID-në, Emrin, ID-në e Departamentit FROM Punonjësit WHERE ID-në e Departamentit<>1 DHE IDID<>NULL - problem për shkak të këtij kontrolli NULL - ky kusht do të kthehet gjithmonë NULL

Gjendja e duhur (ID e Departamentit<>NULL) do të na japë gjithmonë pasiguri këtu, d.m.th. I PAVLEFSHËM. Tani le të kujtojmë tabelën e së vërtetës për operatorin AND, ku (TRUE AND NULL) jep NULL. ato. kur plotësohet kushti i majtë (ID e Departamentit<>1) për shkak të kushtit të drejtë të papërcaktuar, si rezultat, marrim vlerën e papërcaktuar të të gjithë shprehjes (DepartmentID<>1 DHE IDID<>NULL), kështu që vargu nuk do të përfshihet në rezultat.

Ju mund ta rishkruani gjendjen saktë si më poshtë:

ZGJIDH ID-në, Emrin, ID-në e Departamentit NGA Punonjësit WHERE DepartmentID NUK IN (1) - ose në këtë rast vetëm ID-në e Departamentit<>1 DHE IDID NUK ËSHTË NULL - dhe veçmas kontrolloni për NOT NULL

IN mund të përdoret ende me nën-pyetje, por ne do të kthehemi në atë formë në pjesët e mëvonshme të këtij tutoriali.

LIKE - kontrolloni një varg kundrejt një modeli

Unë do të flas për këtë operator vetëm në formën e tij më të thjeshtë, e cila është një standard dhe mbështetet nga shumica e dialekteve të gjuhës SQL. Edhe në këtë formë, mund të përdoret për të zgjidhur shumë probleme që kërkojnë kontrollimin e përmbajtjes së një vargu.

Ky operator duket si ky:

Vargu i testuar LIKE string_pattern

Karakteret e mëposhtme speciale mund të përdoren në "pattern_string":

  1. Nënvizimi "_" - thotë se në vend të tij mund të jetë çdo personazh i vetëm
  2. Shenja e përqindjes "%" - thotë se në vend të saj mund të jetë çdo numër karakteresh, duke përfshirë asnjë
Le të shqyrtojmë shembuj me simbolin "%" (në praktikë, nga rruga, përdoret më shpesh):

SELECT ID, Emri FROM Punonjësit WHERE Emri LIKE "Pet%" - emri i të cilit fillon me shkronjat "Pet" SELECT ID, Mbiemri FROM Punonjësit WHERE LastName LIKE "% s" - mbiemri i të cilit përfundon me "s" SELECT ID, LastName FROM Punonjësit WHERE LastName LIKE "% pe%" - mbiemri i të cilëve përmban kombinimin "pe"

Le të shohim shembuj me simbolin "_":

SELECT ID, LastName FROM Employees WHERE LastName LIKE "_yetrov" - për të cilët mbiemri përbëhet nga çdo karakter i parë i ndjekur nga shkronjat "etrov" SELECT ID, LastName FROM Employees WHERE LastName LIKE "____ s" - nga kush përbëhet mbiemri çdo katër karaktere dhe shkronjat pasuese "s"

Me ndihmën e ESCAPE, mund të specifikoni një karakter ikjeje, i cili anulon veprimin e vërtetimit të karaktereve speciale "_" dhe "%". Kjo klauzolë përdoret kur dëshironi të kontrolloni drejtpërdrejt praninë e një shenje përqindjeje ose një nënvizimi në një varg.

Për të demonstruar ESCAPE, le të vendosim disa mbeturina në një hyrje:

UPDATE Punonjësit SET FirstName = "It's_trash përmban%" WHERE ID = 1005

Dhe le të shohim se çfarë kthehen pyetjet e mëposhtme:

SELECT * FROM Punonjësit WHERE Emri i parë LIKE "%! %%" ESCAPE "!" - rreshti përmban shenjën "%" SELECT * FROM Employees WHERE Emri LIKE "%! _%" ESCAPE "!" - rreshti përmban "_"

Nëse ju duhet të kontrolloni një varg për një përputhje të plotë, atëherë në vend të LIKE është më mirë të përdorni vetëm shenjën "=":

SELECT * FROM Punonjësit WHERE FirstName = "Peter"

Në një shënim.
Në MS SQL, në shabllonin e operatorit LIKE, mund të vendosni gjithashtu një kërkim me shprehje të rregullta, të lexoni në lidhje me të në internet nëse aftësitë standarde të këtij operatori nuk janë të mjaftueshme për ju.

ORACLE përdor funksionin REGEXP_LIKE për të kërkuar shprehje të rregullta.

Pak për vargjet

Në rastin e kontrollit të një vargu për praninë e karaktereve Unicode, do t'ju duhet të vendosni karakterin N përpara thonjëzave, d.m.th. N "...". Por duke qenë se ne i kemi të gjitha fushat e karaktereve në tabelë në formatin Unicode (lloji nvarchar), këtë format mund ta përdorni gjithmonë për këto fusha. Shembull:

SELECT ID, Emri FROM Punonjësit WHERE Emri LIKE N "Pet%" SELECT ID, LastName FROM Employees WHERE LastName = N "Petrov"

Nëse bëhet si duhet, kur krahasoni me një fushë të tipit varchar (ASCII), duhet të përpiqeni të përdorni kontrolle duke përdorur "...", dhe kur krahasoni një fushë me llojin nvarchar (Unicode), duhet të përpiqeni të përdorni kontrolle duke përdorur N " ...". Kjo bëhet për të shmangur konvertimet e tipit të nënkuptuar gjatë ekzekutimit të pyetjes. I njëjti rregull përdoret kur futni (INSERT) vlerat në një fushë ose përditësoni ato (UPDATE).

Gjatë krahasimit të vargjeve, vlen të merret parasysh që, në varësi të cilësimeve të bazës së të dhënave (kolacioni), krahasimi i vargjeve mund të jetë ose i pandjeshëm ndaj shkronjave (kur "Petrov" = "PETROV") ose i ndjeshëm ndaj shkronjave (kur "Petrov"<>"PETROV").
Në rastin e cilësimeve të ndjeshme ndaj shkronjave, nëse dëshironi të bëni një kërkim të pandjeshëm ndaj shkronjave të mëdha, mund, për shembull, të bëni një konvertim paraprak të shprehjes së djathtë dhe të majtë në një rast - sipërm ose poshtë:

SELECT ID, Emri FROM Punonjësit WHERE UPPER (Emri) LIKE UPPER (N "Pet%") - ose LOWER (Emri) LIKE LOWER (N "Pet%") SELECT ID, LastEmri FROM Punonjësit WHERE UPPER (Mbiemri) = UPPER (N "Petrov") - ose LOWER (Mbiemri) = LOWER (N "Petrov")

Pak për datat

Kur kontrolloni për një datë, mund të përdorni, si me vargjet, thonjëza të vetme "...".

Pavarësisht nga cilësimet rajonale në MS SQL, mund të përdorni sintaksën e mëposhtme të datës "YYYYMMDD" (viti, muaji, dita e afërt pa hapësira). MS SQL gjithmonë do ta kuptojë këtë format të datës:

SELECT ID, Emri, Ditëlindja FROM Punonjësit WHERE Birthday BETWEEN "19800101" DHE "19891231" - Punonjësit e viteve '80 RENDOSJE NGA Ditëlindja

Në disa raste, është më e përshtatshme të vendosni datën duke përdorur funksionin DATEFROMPARTS:

SELECT ID, Emri, Ditëlindja FROM Punonjësit WHERE Ditëlindja BETWEEN DATEFROMPARTS (1980,1,1) DATEFROMPARTS (1989,12,31) RENDIT SIPAS ditëlindjes

Ekziston gjithashtu një funksion i ngjashëm DATETIMEFROMPARTS, i cili përdoret për të vendosur datën dhe orën (për llojin e datës).

Ju gjithashtu mund të përdorni funksionin CONVERT nëse keni nevojë të konvertoni një varg në një vlerë datë ose datë:

SELECT CONVERT (data, "03/12/2015", 104), CONVERT (data, ora "2014-11-30 17:20:15", 120)

Vlerat 104 dhe 120 tregojnë se cili format i datës përdoret në varg. Mund të gjeni një përshkrim të të gjitha formateve të vlefshme në bibliotekën MSDN duke kërkuar "MS SQL CONVERT".

Ka shumë funksione për të punuar me data në MS SQL, kërkoni "funksionet ms sql për të punuar me datat".

Shënim. Të gjitha dialektet e gjuhës SQL kanë grupin e tyre të funksioneve për të punuar me datat dhe zbatojnë qasjen e tyre për të punuar me to.

Pak për numrat dhe transformimet e tyre

Informacioni në këtë seksion ndoshta do të jetë më i dobishëm për profesionistët e IT. Nëse nuk jeni, dhe qëllimi juaj është thjesht të mësoni se si të shkruani pyetje për të marrë informacionin që ju nevojitet nga baza e të dhënave, atëherë mund të mos keni nevojë për hollësi të tilla, por në çdo rast, mund të kaloni nëpër tekst dhe të vini në dukje diçka. , sepse... nëse keni filluar të mësoni SQL, tashmë jeni duke u futur në IT.

Ndryshe nga funksioni i konvertimit CAST, funksioni CONVERT ju lejon të vendosni një parametër të tretë, i cili është përgjegjës për stilin (formatin) e konvertimit. Lloje të ndryshme të dhënash mund të kenë grupin e tyre të stileve që mund të ndikojnë në rezultatin e kthyer. Ne kemi prekur tashmë përdorimin e stileve kur shikuam konvertimin e një vargu me funksionin CONVERT në llojet e datës dhe datës.

Më shumë detaje rreth CAST, CONVERT dhe stilet mund të gjenden në MSDN - "Funksionet CAST dhe CONVERT (Transact-SQL)": msdn.microsoft.com/ru-ru/library/ms187928.aspx

Për të thjeshtuar shembujt, deklaratat Transact-SQL DECLARE dhe SET do të përdoren këtu.

Sigurisht, në rastin e konvertimit të një numri të plotë në një numër real (të cilin e dhashë në fillim të këtij mësimi, për të demonstruar ndryshimin midis pjesëtimit të numrit të plotë dhe atij real), njohja e nuancave të konvertimit nuk është aq kritike, që nga viti atje kemi bërë një konvertim nga numër i plotë në real (vargu i të cilit është shumë më i madh se diapazoni i numrave të plotë):

DEKLARONI @min_int int SET @ min_int = -2147483648 DEKLARONI @max_int int SET @ max_int = 2147483647 SELECT - (-2147483648) @ min_int, CAST (@min_int AS float), @41, CONVERT (@min_int AS float), CONVERT, @41, CONVERT @ 47, CONVER (@max_int AS float), CONVERT (float, @ max_int), - numerike (16.6) @ min_int / 1., - (-2147483648.000000) @ max_int / 1. - 2147483647.000000

Ndoshta nuk ia vlente të specifikohej metoda e konvertimit të nënkuptuar të përftuar duke pjesëtuar me (1.), pasi është e këshillueshme që të përpiqeni të bëni konvertime të qarta, për më shumë kontroll mbi llojin e rezultatit të marrë. Edhe pse, në rast se duam të marrim një rezultat të tipit numerik, me numrin e caktuar të shifrave pas presjes dhjetore, atëherë mund të përdorim trukun në MS SQL për të shumëzuar një vlerë të plotë me (1., 1.0, 1.00, etj. ):

DEKLARONI @int int SET @ int = 123 SELECT @ int * 1., - numerike (12, 0) - 0 vende dhjetore @ int * 1.0, - numerike (13, 1) - 1 karakter @ int * 1.00, - numerike ( 14, 2) - 2 shifra - megjithëse ndonjëherë është më mirë të bëhet një konvertim i qartë CAST (@int AS numerike (20, 0)), - 123 CAST (@int AS numerike (20, 1)), - 123.0 CAST ( @int AS numerike (20, 2)) - 123.00

Në disa raste, detajet e konvertimit mund të jenë vërtet të rëndësishme sepse ato ndikojnë në korrektësinë e rezultatit të marrë, për shembull, kur konvertohet një vlerë numerike në një varg (varchar). Le të shohim shembuj të konvertimit të parave dhe vlerave të notave në varchar:

Sjellja gjatë konvertimit të parave në varchar DEKLARONI @money para SET @money = 1025.123456789 - do të ketë një konvertim të nënkuptuar në 1025.1235, sepse lloji i parasë ruan vetëm 4 shifra pas presjes dhjetore SELECT @money, - 1025.1235 - sipas parazgjedhjes CAST dhe CONVERT sillen njësoj (d.m.th., duke thënë përafërsisht, zbatohet stili 0) CAST (@money si varchar (20)), - 1025.12 CONVERT (varchar (20), @money), - 1025.12 CONVERT (varchar (20), @money, 0), - 1025.12 (stili 0 - pa ndarës të njëmijtë dhe 2 shifra dhjetore (formati i parazgjedhur)) CONVERT ( varchar (20) , @money, 1), - 1,025.12 (stili 1 - përdor ndarësin e mijëtë dhe 2 shifra dhjetore) CONVERT (varchar (20), @money, 2) - 1025.1235 (stili 2 - pa ndarës dhe 4 shifra pas presjes dhjetore)

Sjellja kur konvertimin noton në VARCHAR deklarojë @ float1 noton SET @ float1 = 1.025,123456789 deklarojnë @ float2 noton SET @ float2 = 1.231.025,123456789 SELECT @ float1, - 1.025,123456789 @ float2, - 1.231.025,12345679 -. Sillen njëjtë si hedhura dhe kthyer by default Kjo është, afërsisht në të folur, zbatohet stili 0) - stili 0 - Jo më shumë se 6 shifra. Kur është e nevojshme, përdoret shënimi eksponencial i numrave - kur konvertohet në varchar, gjëra vërtet të tmerrshme ndodhin këtu CAST (@ float1 si varchar (20)), - 1025.12 CONVERT (varchar (20), @ float1), - 1025.12 CONVERT (varchar ( 20 ), @ float1, 0), - 1025,12 CAST (@ float2 si varchar (20)), - 1,23103e + 006 CONVERT (varchar (20), @ float2), - 1,23103e + 006 CONVERT (varchar (20 ), @ float2, 0), - 1.23103e + 006 - stili 1 - Gjithmonë 8 bit. Shënimi eksponencial përdoret gjithmonë. - ky stil për float nuk është gjithashtu shumë i saktë CONVERT (varchar (20), @ float1, 1), - 1.0251235e + 003 CONVERT (varchar (20), @ float2, 1), - 1.2310251e + 006 - stili 2 - Gjithmonë 16 bit. Shënimi eksponencial përdoret gjithmonë. - këtu me saktësi më të mirë CONVERT (varchar (30), @ float1, 2), - 1.025123456789000e + 003 - OK CONVERT (varchar (30), @ float2, 2) - 1.231025123456786 - OK +0

Siç mund ta shihni nga shembulli, llojet lundruese notojnë, reale në disa raste mund të krijojnë vërtet një gabim të madh, veçanërisht kur distiloni në një varg dhe mbrapa (kjo mund të jetë me lloje të ndryshme integrimesh, kur të dhënat, për shembull, transferohen në skedarë teksti nga një sistem në tjetrin) ...

Nëse keni nevojë të kontrolloni në mënyrë të qartë saktësinë deri në një shenjë të caktuar, më shumë se 4, atëherë ndonjëherë është më mirë të përdorni llojin dhjetor / numerik për të ruajtur të dhënat. Nëse 4 karaktere janë të mjaftueshme, atëherë mund të përdorni llojin e parave - afërsisht korrespondon me numerike (20,4).

Decimal dhe numerike të deklarojë @money paratë SET @money = 1025,123456789-1025,1235 deklarojnë @ float1 noton SET @ float1 = 1.025,123456789 deklarojnë @ float2 SET noton @ float2 = 1.231.025,123456789 deklarojnë @numeric Cumeric (2867) SET45 @numeric si VARCHAR (20)), - 1025.12345679 CONVERT (varchar (20), @numeric), - 1025.12345679 CAST (@money si numerike (28,9)), - 1025.123500000 CAST (@ float1 si numerike (28 , 21 float 1 si numerike (28 , 20 C) (28,9)) - 1231025.123456789

Shënim.
Që nga MS SQL 2008, ju mund të përdorni në vend të konstruktit:
  • server ms sql
  • Shto etiketa

    Artikujt kryesorë të lidhur