SQL-setninger for å definere data. Strukturert spørringsspråk - SQL: historikk, standarder, grunnleggende språkoperatører

I den første delen berørte vi allerede DML-språket, og brukte nesten hele settet med kommandoer, med unntak av MERGE-kommandoen.

Jeg vil snakke om DML i henhold til min egen sekvens, utviklet fra personlig erfaring. Underveis skal jeg også prøve å snakke om de "slippy" stedene som er verdt å fokusere på, disse "glatte" stedene ligner på mange dialekter SQL-språk.

Fordi læreboken er dedikert til et bredt spekter av lesere (ikke bare programmerere), da vil forklaringen noen ganger være passende, dvs. lang og kjedelig. Dette er min visjon om materialet, som i hovedsak ble innhentet i praksis som følge av faglig aktivitet.

Hovedmålet med denne opplæringen, trinn for trinn, er å utvikle en fullstendig forståelse av essensen av SQL-språket og lære deg hvordan du bruker konstruksjonene på riktig måte. Fagfolk på dette feltet kan også være interessert i å bla gjennom dette materialet, kanskje vil de kunne lære noe nytt for seg selv, eller kanskje det bare vil være nyttig å lese for å friske opp hukommelsen. Jeg håper alle vil finne det interessant.

Fordi DML i MS SQL-databasedialekten er veldig nært knyttet til syntaksen til SELECT-konstruksjonen, så jeg vil begynne å snakke om DML med den. Etter min mening er SELECT-konstruksjonen den viktigste konstruksjonen. DML språk, fordi på grunn av den eller dens deler, hentes nødvendige data fra databasen.

DML-språket inneholder følgende konstruksjoner:

  • SELECT – datavalg
  • INSERT – setter inn nye data
  • OPPDATERING – dataoppdatering
  • SLETT – sletter data
  • MERGE – datasammenslåing

I denne delen vil vi kun se på den grunnleggende syntaksen til SELECT-kommandoen, som ser slik ut:

VELG kolonneliste eller * FRA kilde WHERE-filter ORDER BY sort_expression
Emnet for SELECT-utsagnet er veldig bredt, så i denne delen vil jeg kun fokusere på dens grunnleggende strukturer. Jeg tror at uten å kjenne det grunnleggende godt, kan du ikke begynne å studere mer komplekse strukturer, fordi... da vil alt dreie seg om denne grunnleggende designen (underspørringer, sammenføyninger osv.).

Også, som en del av denne delen, vil jeg også snakke om TOPP-tilbudet. Jeg indikerte ikke denne setningen med vilje i den grunnleggende syntaksen, fordi... det er implementert forskjellig i forskjellige SQL-dialekter.

Hvis DDL-språket er mer statisk, dvs. med dens hjelp skapes stive strukturer (tabeller, relasjoner osv.), da er DML-språket dynamisk av natur, her kan du få de riktige resultatene på forskjellige måter.

Treningen vil også fortsette i Step by Step-modus, dvs. Når du leser, bør du umiddelbart prøve å fullføre eksemplet med egne hender. Deretter analyserer du resultatet og prøver å forstå det intuitivt. Hvis noe forblir uklart, for eksempel betydningen av en funksjon, kan du henvende deg til Internett for å få hjelp.

Eksemplene vil bli vist i Testdatabasen, som ble opprettet med DDL+DML i første del.

For de som ikke opprettet en database i den første delen (siden ikke alle kanskje er interessert i DDL-språket), kan de bruke følgende skript:

Test databaseopprettingsskript

Opprette en database CREATE DATABASE Test GO -- gjør testdatabasen gjeldende BRUK Test GO -- lag referansetabeller CREATE TABLE Positions(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Name nvarchar(30) NOT NULL) CREATE TABELL Avdelinger (ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Name nvarchar(30) NOT NULL) GO -- fyll referansetabellene med data SET IDENTITY_INSERT Posisjoner PÅ INSERT Posisjoner(ID,Navn)VERDIER (1, N"Regnskapsfører" ), (2,N"Direktor"), (3,N"Programmer"), (4,N"Senior Programmer") SET IDENTITY_INSERT Posisjoner AV GÅ SET IDENTITY_INSERT Avdelinger PÅ SETT inn Avdelinger(ID,Navn)VERDIER (1,N "Administrasjon"), (2,N"Regnskap"), (3,N"IT") SET IDENTITY_INSERT Avdelinger AV GO -- opprett en tabell med ansatte LAG TABELL Ansatte(ID int NOT NULL, Navn nvarchar( 30), bursdagsdato , e-post nvarchar(30), posisjons-ID int, avdelings-ID int, ansatt dato NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME(), ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID_EmployeeId FKD) ES-avdelinger( ID), TRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES Employees(ID), CONSTRAINT UQ_Employees_Employees_Em 1999), INDEX IDX_Emplo yes_Name (Navn)) GÅ - - fyll den med data SETT inn ansatte (ID, navn, bursdag, e-post, posisjons-ID, avdelings-ID, leder-ID) VERDIER (1000,N"Ivanov I.I.","19550219"," [e-postbeskyttet]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [e-postbeskyttet]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [e-postbeskyttet]",1,2,1000), (1003,N"Andreev A.A.","19820417"," [e-postbeskyttet]",4,3,1000)

Det er det, nå er vi klare til å begynne å lære DML-språket.

SELECT – datavalgoperatør

Først av alt, for den aktive spørringseditoren, la oss gjøre den gjeldende databasen Test ved å velge den i rullegardinlisten eller bruke kommandoen "USE Test".

La oss starte med den mest grunnleggende formen for SELECT:

VELG * FRA Ansatte
I denne spørringen ber vi om å returnere alle kolonner (angitt med en "*") fra tabellen Ansatte - du kan lese dette som "VELG alle_felt FRA ansatte_tabellen." Hvis det er en gruppert indeks, vil de returnerte dataene mest sannsynlig bli sortert etter den, i dette tilfellet etter ID-kolonnen (men dette er ikke viktig, siden vi i de fleste tilfeller vil spesifisere sorteringen i eksplisitt selv ved å bruke BESTILL ETTER ...):

ID Navn Fødselsdag E-post Posisjons-ID Avdelings-ID LeieDato ManagerID
1000 Ivanov I.I. 1955-02-19 [e-postbeskyttet] 2 1 2015-04-08 NULL
1001 Petrov P.P. 1983-12-03 [e-postbeskyttet] 3 3 2015-04-08 1003
1002 Sidorov S.S. 1976-06-07 [e-postbeskyttet] 1 2 2015-04-08 1000
1003 Andreev A.A. 1982-04-17 [e-postbeskyttet] 4 3 2015-04-08 1000

Generelt er det verdt å si at i MS SQL dialekten mest Enkel form SELECT-spørringen inneholder kanskje ikke en FROM-blokk, i så fall kan du bruke den til å få noen verdier:

SELECT 5550/100*15, SYSDATETIME(), -- får systemdato DB SIN(0)+COS(0)

(Ingen kolonnenavn) (Ingen kolonnenavn) (Ingen kolonnenavn)
825 2015-04-11 12:12:36.0406743 1

Vær oppmerksom på at uttrykket (5550/100*15) ga resultatet 825, men hvis vi regner på en kalkulator vil verdien være (832,5). Resultatet 825 ble oppnådd av den grunn at i vårt uttrykk er alle tallene heltall, derfor er resultatet et heltall, dvs. (5550/100) gir oss 55, ikke (55,5).

Husk at følgende logikk fungerer i MS SQL:

  • Heltall / Heltall = Heltall (dvs. i dette tilfellet oppstår heltallsdivisjon)
  • Virkelig / Heltall = Virkelig
  • Heltall / Virkelig = Virkelig
De. resultatet konverteres til større type, så i de siste 2 tilfellene får vi et reelt tall (tenk som i matematikk - rekkevidde reelle tall er større enn rekkevidden av heltall, så resultatet blir konvertert til det):

SELECT 123/10, -- 12 123./10, -- 12.3 123/10. -- 12.3
Her (123.) = (123.0), er det bare at i dette tilfellet kan 0 forkastes og bare punktet igjen.

Den samme logikken gjelder for andre aritmetiske operasjoner, men ved divisjon er denne nyansen mer relevant.

Vær derfor oppmerksom på datatypen til numeriske kolonner. Hvis det er et heltall, og du trenger å få et reelt resultat, kan du bruke en transformasjon, eller bare sette en prikk etter tallet angitt som en konstant (123.).

Du kan bruke CAST- eller KONVERTER-funksjonen til å konvertere felt. La oss for eksempel bruke ID-feltet, det er av typen int:

SELECT ID, ID/100, -- heltallsdivisjon vil forekomme her CAST(ID AS float)/100, -- bruk CAST-funksjonen for å konvertere til flytetypen CONVERT(float,ID)/100, -- bruk CONVERT-funksjonen for å konvertere til typen float ID/100. -- bruk transformasjon ved å spesifisere at nevneren er et reelt tall FRA ansatte

ID (Ingen kolonnenavn) (Ingen kolonnenavn) (Ingen kolonnenavn) (Ingen kolonnenavn)
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

På en lapp. I ORACLE-databasen er syntaks uten FROM-blokk uakseptabel der, for dette formålet brukes DUAL-systemtabellen, som inneholder en linje:

VELG 5550/100*15, -- og i ORACLE vil resultatet være lik 832.5 sysdate, sin(0)+cos(0) FRA DUAL


Merk. Tabellnavnet i mange RDB-er kan innledes med skjemanavnet:

VELG * FRA dbo.Ansatte -- dbo – skjemanavn

Et skjema er en logisk enhet i en database, som har sitt eget navn og lar deg gruppere databaseobjekter som tabeller, visninger osv. i seg selv.

Definisjonen av et skjema i forskjellige databaser kan være forskjellig i noen tilfeller, skjemaet er direkte relatert til databasebrukeren, dvs. i dette tilfellet kan vi si at skjemaet og brukeren er synonymer og at alle objekter som er opprettet i skjemaet i hovedsak er objekter til denne brukeren. I M.S. SQL-skjema er en uavhengig logisk enhet som kan opprettes på egen hånd (se LAG SKEMA).

Som standard opprettes ett skjema i MS SQL-databasen med navnet dbo (databaseeier), og det er det. opprettet objekter som standard er de opprettet i dette skjemaet. Følgelig, hvis vi bare spesifiserer navnet på en tabell i en spørring, vil den bli søkt i dbo-skjemaet til den gjeldende databasen. Hvis vi ønsker å lage et objekt i et spesifikt skjema, må vi også sette objektnavnet foran skjemanavnet, for eksempel "CREATE TABLE schema_name.table_name(...)".

Når det gjelder MS SQL, kan skjemanavnet også innledes med navnet på databasen der skjemaet er plassert:

VELG * FRA Test.dbo.Employees -- databasenavn.skjemanavn.tabell
Denne avklaringen kan være nyttig, for eksempel hvis:

  • i en forespørsel får vi tilgang til objekter som ligger i ulike ordninger eller databaser
  • du må overføre data fra ett skjema eller database til en annen
  • er du i en database, må du be om data fra en annen database
  • og så videre.
Et skjema er et veldig praktisk verktøy som er nyttig å bruke når man utvikler databasearkitektur, spesielt store databaser.

Ikke glem at vi i forespørselsteksten kan bruke både enkeltlinjede “-- ...”- og flerlinjers “/* ... */”-kommentarer. Hvis forespørselen er stor og kompleks, kan kommentarer i stor grad hjelpe deg eller noen andre, etter en stund, til å huske eller forstå strukturen.

Hvis det er mange kolonner i tabellen, og spesielt hvis det fortsatt er mange rader i tabellen, pluss hvis vi gjør spørringer til databasen over nettverket, vil det være å foretrekke å velge med en direkte liste over feltene du trenger, atskilt med komma:

VELG ID, Navn FRA ansatte

De. her sier vi at vi kun trenger å returnere ID- og Navn-feltene fra tabellen. Resultatet blir som følger (forresten, optimalisereren her bestemte seg for å bruke indeksen opprettet av Navn-feltet):

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

På en lapp. Noen ganger er det nyttig å se på hvordan data hentes, for eksempel for å finne ut hvilke indekser som brukes. Dette kan gjøres ved å klikke på "Vis estimert utførelsesplan"-knappen eller angi "Inkluder faktisk utførelsesplan" (i dette tilfellet vil vi kunne se ekte plan, henholdsvis bare etter å ha utført forespørselen):

Utførelsesplananalyse er veldig nyttig når du optimaliserer en spørring, den lar deg finne ut hvilke indekser som mangler eller hvilke indekser som ikke brukes i det hele tatt og kan fjernes.

Hvis du nettopp har begynt å lære DML, så er dette ikke så viktig for deg, bare legg merke til det, og du kan trygt glemme det (kanskje du aldri trenger det) - vårt første mål er å lære det grunnleggende om DML-språket og lære hvordan du bruker dem riktig, og optimalisering er allerede en egen kunst. Noen ganger er det viktigere at du rett og slett har en korrekt skrevet spørring som gir riktig resultat fra et emnesynspunkt, og at enkeltpersoner allerede optimaliserer det. Først må du lære hvordan du ganske enkelt skriver spørringer riktig, ved å bruke alle midler for å nå målet. Hovedmålet du nå må oppnå er at søket ditt skal gi de riktige resultatene.

Sette tabellaliaser

Når du viser kolonner, kan de innledes med navnet på tabellen i FROM-blokken:

VELG Employees.ID, Employees.Name FRA Ansatte

Men denne syntaksen er vanligvis upraktisk å bruke, fordi tabellnavnet kan være langt. For disse formål er kortere navn vanligvis spesifisert og brukt - aliaser:

VELG emp.ID,emp.Name FRA Employees AS emp
eller

SELECT emp.ID,emp.Name FROM Employees emp -- AS-nøkkelordet kan utelates (jeg foretrekker dette alternativet)

Her er emp et alias for Employees-tabellen som kan brukes i sammenheng med denne SELECT-setningen. De. vi kan si at i sammenheng med denne SELECT-setningen gir vi tabellen et nytt navn.

Selvfølgelig, i dette tilfellet, vil søkeresultatene være nøyaktig de samme som for "SELECT ID, Name FROM Employees". Hvorfor dette er nødvendig vil bli klart senere (ikke engang i denne delen), for nå husker vi bare at kolonnenavnet kan innledes (avklares) enten direkte av tabellnavnet, eller ved å bruke et alias. Her kan du bruke en av to ting, dvs. Hvis du angir et alias, må du bruke det, men du kan ikke lenger bruke tabellnavnet.

På en lapp. I ORACLE er bare muligheten til å spesifisere et tabellalias uten AS-nøkkelordet tillatt.

DISTINCT – forkaster dupliserte rader

Nøkkelordet DISTINCT brukes til å forkaste dupliserte rader fra søkeresultatet. Grovt sett, forestill deg først å utføre en spørring uten DISTINCT-alternativet, og deretter forkaste alle duplikater fra resultatet. La oss demonstrere dette for større klarhet ved å bruke et eksempel:

La oss lage en midlertidig tabell for demonstrasjon CREATE TABLE #Trash(ID int NOT NULL PRIMARY KEY, Col1 varchar(10), Col2 varchar(10), Col3 varchar(10)) -- fyll denne tabellen med alle slags søppel INSERT #Trash (ID,Col1, Col2,Col3)VERDIER (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") - la oss se hva forespørselen returnerer uten alternativet DISTINCT SELECT Col1,Col2,Col3 FROM #Trash -- la oss se hva spørringen returnerer med DISTINCT SELECT DISTINCT alternativet Col1,Col2,Col3 FROM #Trash -- slett den midlertidige tabellen DROP TABLE #Trash

Visuelt vil det se slik ut (alle duplikater er merket med samme farge):

La oss nå se på hvor dette kan brukes, ved å bruke et mer praktisk eksempel - vi vil bare returnere unike avdelingsidentifikatorer fra tabellen Ansatte (dvs. vi vil finne ut ID-ene til avdelingene der ansatte er registrert):

VELG DISTINCT DepartmentID FRA Ansatte

Her har vi 4 linjer, fordi... Det er ingen gjentatte kombinasjoner (DepartmentID, PositionID) i tabellen vår.

La oss gå tilbake til DDL et øyeblikk.

Siden vi begynner å gå tom for data for demo-eksempler, og vi ønsker å snakke mer omfattende og tydelig, la oss utvide Employess-tabellen litt. I tillegg, la oss huske litt DDL, som de sier, "repetisjon er læringens mor," og i tillegg, la oss hoppe videre litt igjen og bruke UPDATE-setningen:

Vi oppretter nye kolonner ENDRINGSTABELL Ansatte ADD Etternavn nvarchar(30), -- etternavn Fornavn nvarchar(30), -- fornavn Mellomnavn nvarchar(30), -- mellomnavn Lønnsflyt, -- og selvfølgelig lønn i noen enheter BonusPercent flyte -- prosentandel for beregning av bonus fra GO lønn -- fyll dem med data (noen data er med vilje utelatt) OPPDATERING Ansatte SET LastName=N"Ivanov", FirstName=N"Ivan", MiddleName=N"Ivanovich", Lønn=5000,BonusProsent= 50 HVOR ID=1000 -- Ivanov I.I. OPPDATERING Ansatte SET Etternavn=N"Petrov",FirstName=N"Petr",MiddleName=N"Petrovich", Lønn=1500,BonusPercent= 15 WHERE ID=1001 -- Petrov P.P. OPPDATERING Ansatte SET Etternavn=N"Sidor",FirstName=N"Sidor",MiddleName=NULL, Lønn=2500,BonusPercent=NULL WHERE ID=1002 -- Sidorov S.S. OPPDATERING Ansatte SET Etternavn=N"Andreev",FirstName=N"Andrey",MiddleName=NULL, Lønn=2000,BonusProsent= 30 WHERE ID=1003 -- Andreev A.A.

La oss sørge for at dataene ble oppdatert:

VELG * FRA Ansatte

ID Navn Etternavn Fornavn Mellomnavn Lønn BonusProsent
1000 Ivanov I.I. Ivanov Ivan Ivanovich 5000 50
1001 Petrov P.P. Petrov Peter Petrovitsj 1500 15
1002 Sidorov S.S. Sidorov Sidor NULL 2500 NULL
1003 Andreev A.A. Andreev Andrey NULL 2000 30

Angi aliaser for spørringskolonner

Jeg tror det blir lettere å vise her enn å skrive:

SELECT -- gi navnet til den beregnede kolonnen Etternavn+" "+Fornavn+" "+Mellomnavn AS Fullt navn, -- bruk doble anførselstegn, fordi et mellomrom benyttes HireDate AS "Dato for mottak", -- bruk av firkantede parenteser, pga plass brukes Birthday AS [Fødselsdato], -- ordet AS er ikke nødvendig Lønn ZP FRA ansatte

Fullt navn dato for kvitering Fødselsdato ZP
Ivanov Ivan Ivanovich 2015-04-08 1955-02-19 5000
Petrov Petr Petrovitsj 2015-04-08 1983-12-03 1500
NULL 2015-04-08 1976-06-07 2500
NULL 2015-04-08 1982-04-17 2000

Som vi kan se, gjenspeiles kolonnealiasene vi spesifiserte i overskriften til den resulterende tabellen. Faktisk er dette hovedformålet med kolonnealiaser.

Vær oppmerksom, fordi de siste 2 ansatte hadde ikke et mellomnavn spesifisert (NULL-verdi), så returnerte resultatet av uttrykket "Etternavn+" "+Fornavn+" "+Mellomnavn" også NULL til oss.

For å koble sammen (legge til, sammenkoble) strenger i MS SQL, brukes "+"-symbolet.

Husk at alle uttrykk som involverer NULL (for eksempel divisjon med NULL, addisjon med NULL) vil returnere NULL.

På en lapp.
I tilfellet med ORACLE, brukes "||"-operatoren til å sette sammen strenger og sammenkoblingen vil se ut som "Etternavn||" "||Fornavn||" "|Mellomnavn". For ORACLE er det verdt å merke seg at det har for strengtyper Det er et unntak, for dem er NULL og den tomme strengen "" det samme, så i ORACLE vil et slikt uttrykk komme tilbake for de siste 2 ansatte "Sidorov Sidor" og "Andrey Andreev". På tidspunktet for ORACLE 12c, så vidt jeg vet, er det ikke noe alternativ som endrer denne oppførselen (hvis jeg tar feil, vennligst korriger meg). Her er det vanskelig for meg å bedømme om dette er bra eller dårlig, fordi... i noen tilfeller er oppførselen til en NULL-streng mer praktisk, som i MS SQL, og i andre, som i ORACLE.

I ORACLE er alle kolonnealiasene oppført ovenfor også gyldige, bortsett fra [...].


For ikke å inngjerde konstruksjonen ved hjelp av ISNULL-funksjonen, kan vi i MS SQL bruke CONCAT-funksjonen. La oss vurdere og sammenligne tre alternativer:

SELECT Etternavn+" "+Fornavn+" "+Mellomnavn Fullnavn1, -- 2 alternativer for å erstatte NULL med tomme strenger "" (vi får samme oppførsel som i ORACLE) ISNULL(Etternavn,"")+" "+ISNULL(Fornavn," ")+ " "+ISNULL(Mellomnavn,"") Fullt Navn2, CONCAT(Etternavn," ",Fornavn," ",Mellomnavn) Fullt Navn3 FRA ansatte

Fullt navn1 Fullt navn2 Fullt navn3
Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich
Petrov Petr Petrovitsj Petrov Petr Petrovitsj Petrov Petr Petrovitsj
NULL Sidorov Sidor Sidorov Sidor
NULL Andreev Andrey Andreev Andrey

I MS SQL kan aliaser også spesifiseres med likhetstegnet:

SELECT "Reception date"=Lejedato, -- i tillegg til "..." og […] kan du bruke "..." [Fødselsdato]=Fødselsdag, ZP=Lønn FRA ansatte

Å bruke søkeordet AS eller likhetstegnet for å spesifisere et alias er nok mer en smakssak. Men når man analyserer andres forespørsler, kan denne kunnskapen være nyttig.

Til slutt vil jeg si at det er bedre å angi navn for aliaser med bare latinske tegn og tall, og unngå bruken av "...", "..." og […], det vil si bruke de samme reglene som vi brukte når vi navnga tabeller . Videre vil jeg i eksemplene bare bruke slike navn og ingen "...", "..." og […].

Grunnleggende aritmetikk SQL-setninger


Utførelsesprioritet aritmetiske operatorer det samme som i matematikk. Om nødvendig kan rekkefølgen for bruk av operatorene endres ved å bruke parenteser - (a+b)*(x/(y-z)).

Og jeg gjentar nok en gang at enhver operasjon med NULL produserer NULL, for eksempel: 10+NULL, NULL*15/3, 100/NULL - alt dette vil resultere i NULL. De. Enkelt sagt, en udefinert verdi kan ikke gi et bestemt resultat. Ta hensyn til dette når du komponerer søket ditt, og håndter om nødvendig NULL-verdier ved å bruke funksjonene ISNULL og COALESCE:

VELG ID,Navn, Lønn/100*BonusPercent AS Result1, -- uten å behandle NULL-verdier​Salary/100*ISNULL(BonusPercent,0) AS Result2, -- bruk ISNULL-funksjonen Lønn/100*COALESCE(BonusPercent,0) SOM Resultat3 - - bruk funksjonen COALESCE FROM Ansatte

Jeg skal fortelle deg litt om COALESCE-funksjonen:

COALESCE (uttr1, uttr2, ..., uttrn) - Returnerer den første ikke-NULL-verdien fra en liste med verdier.

SELECT COALESCE(f1, f1*f2, f2*f3) val -- i dette tilfellet vil den tredje verdien bli returnert FRA (VELG null f1, 2 f2, 3 f3) q

Jeg vil mest fokusere på å snakke om DML-konstruksjoner, og for det meste vil jeg ikke snakke om funksjonene som vil vises i eksemplene. Hvis du ikke forstår hva en bestemt funksjon gjør, se etter beskrivelsen på Internett, du kan til og med søke etter informasjon etter gruppe av funksjoner samtidig, for eksempel ved å spørre i Google søk"MS SQL-strengfunksjoner", "MS SQL matematiske funksjoner" eller "MS SQL-funksjoner NULL-behandling." Det er mye informasjon om funksjoner, og du kan enkelt finne den. I MSDN-biblioteket kan du for eksempel finne ut mer om COALESCE-funksjonen:

Klipp fra MSDN Sammenligning av COALESCE og CASE

COALESCE-uttrykket er en syntaktisk snarvei for CASE-uttrykket. Dette betyr at COALESCE(uttrykk1,...n) skrives om av spørringsoptimereren som følgende CASE-uttrykk:

CASE WHEN (uttrykk1 ER IKKE NULL) THEN expression1 WHEN (uttrykk2 ER IKKE NULL) THEN expression2 ... ELSE expressionN END

La oss for eksempel se på hvordan du kan bruke resten av divisjonen (%). Denne operatøren veldig nyttig når du trenger å dele opp poster i grupper. La oss for eksempel trekke ut alle ansatte som har partallsnummer (ID), dvs. disse ID-ene som er delbare med 2:

VELG ID,Navn FRA ansatte WHERE ID%2=0 -- resten når delt på 2 er 0

BESTILL ETTER – sorterer søkeresultatet

ORDER BY-leddet brukes til å sortere resultatet av en spørring.

VELG Etternavn, Fornavn, Lønn FRA ansatte BESTILL ETTER Etternavn, Fornavn -- bestill resultatet etter 2 kolonner - etter Etternavn, og deretter etter Fornavn

For en merknad. Det er et ASC nøkkelord for sortering i stigende rekkefølge, men siden stigende sortering er standard, kan du glemme dette alternativet (jeg husker ikke en gang jeg brukte dette alternativet).

Det er verdt å merke seg at i ORDRE klausul BY kan også brukes for felt som ikke er oppført i SELECT-leddet (bortsett fra tilfellet når DISTINCT brukes, som jeg vil diskutere nedenfor). Som et eksempel vil jeg løpe litt fremover ved å bruke TOP-alternativet og vise hvordan du for eksempel kan velge 3 ansatte som har høyest lønn, tatt i betraktning at jeg av konfidensialitetsformål ikke bør vise selve lønnen:

VELG TOPP 3 -- returner kun de første 3 postene fra hele resultat-ID, Etternavn, Fornavn FRA ansatte BESTILLE ETTER lønn DESC -- sorter resultatet i synkende rekkefølge av lønn

ID Etternavn Fornavn
1000 Ivanov Ivan
1002 Sidorov Sidor

Selvfølgelig er det et tilfelle her at flere ansatte kan ha samme lønn og det er vanskelig å si hvilke tre ansatte som skal returneres denne forespørselen, dette må allerede løses med oppgavelederen. La oss si, etter å ha diskutert denne oppgaven med lederen, ble du enig og bestemte deg for å bruke følgende alternativ - å gjøre ytterligere sortering etter fødselsdatofeltet (dvs. vi verdsetter unge mennesker), og hvis fødselsdatoen til flere ansatte kan falle sammen (tross alt, dette er heller ikke ekskludert), så kan du gjøre en tredje sortering i synkende rekkefølge av ID-verdier (siste i prøven vil være de med høyest ID - for eksempel de som ble akseptert sist, la oss si personnummer utstedes sekvensielt):

VELG TOPP 3 -- returner kun de første 3 postene fra hele resultat-ID, Etternavn, Fornavn FRA ansatte BESTILLE ETTER lønn DESC, -- 1. sorter resultatet i synkende rekkefølge etter lønns fødselsdag, -- 2. deretter etter fødselsdato ID DESC -- 3 og for fullstendig klarhet i resultatet, legger vi til sortering etter ID.

De. du bør prøve å gjøre resultatet av forespørselen forutsigbart, slik at du ved en eventuell debriefing kan forklare hvorfor akkurat disse personene ble inkludert på "svartelisten", dvs. alt ble valgt ærlig, i henhold til de etablerte reglene.

Du kan også sortere ved å bruke forskjellige uttrykk i ORDER BY-leddet:

VELG Etternavn, Fornavn FRA ansatte ORDER BY CONCAT(Etternavn," ",Fornavn) -- bruk uttrykket

Du kan også bruke aliaser spesifisert for kolonner i ORDER BY:

SELECT CONCAT(Etternavn," ",Fornavn) fi FRA ansatte BESTILLE ETTER fi -- bruk et alias

Det er verdt å merke seg at når du bruker DISTINCT-leddet, kan kun kolonnene som er oppført i SELECT-blokken brukes i ORDER BY-leddet. De. etter å ha brukt DISTINCT-operasjonen, får vi et nytt datasett, med et nytt sett med kolonner. Av denne grunn vil ikke følgende eksempel fungere:

VELG DISTINCT Etternavn, Fornavn, Lønn FRA ansatte BESTILL ETTER ID -- ID er ikke i det resulterende settet vi fikk med DISTINCT

De. ORDER BY-klausulen brukes på det resulterende settet før resultatet returneres til brukeren.

Merknad 1. Du kan også bruke tallene på kolonnene som er oppført i SELECT i ORDER BY-klausulen:

VELG Etternavn,Fornavn,Lønn FRA Ansatte BESTILL ETTER -- sorter i rekkefølge 3 DESC, -- 1. synkende Lønn 1, -- 2. etter Etternavn 2 -- 3. etter Fornavn

For nybegynnere ser det praktisk og fristende ut, men det er bedre å glemme og aldri bruke dette sorteringsalternativet.

Hvis i dette tilfellet (når feltene er eksplisitt oppført), dette alternativet fortsatt er akseptabelt, er det bedre å aldri bruke dette alternativet ved bruk av "*". Hvorfor - fordi hvis noen for eksempel endrer rekkefølgen på kolonnene i tabellen, eller sletter kolonner (og dette er en normal situasjon), kan søket ditt fortsatt fungere, men feil, fordi sortering kan allerede gjøres på andre kolonner, og dette er lumsk fordi denne feilen blir kanskje ikke avslørt veldig snart.

Hvis søylene var eksplisitt oppført, så i situasjonen ovenfor, vil spørringen enten fortsette å fungere, men også korrekt (siden alt er eksplisitt definert), eller det ville ganske enkelt gi en feilmelding om at den gitte kolonnen ikke eksisterer.

Så du kan trygt glemme å sortere etter kolonnenummer.

Notat 2.
I MS SQL ved sortering i stigende rekkefølge NULL-verdier vises først.

VELG BonusPercent FRA Ansatte BESTILLE ETTER BonusPercent

Følgelig, når du bruker DESC, vil de være på slutten

VELG BonusPercent FRA Ansatte BESTILL ETTER BonusPercent DESC

Hvis du trenger å endre logikken for sortering av NULL-verdier, bruk uttrykk, for eksempel:

VELG bonusprosent FRA ansatte BESTILL ETTER ISNULL(Bonusprosent,100)

ORACLE gir to alternativer for dette formålet: NULLS FØRST og NULLER SISTE (brukes som standard). For eksempel:

VELG BonusPercent FRA Ansatte BESTILL ETTER BonusPercent DESC NULLS SISTE

Vær oppmerksom på dette når du bytter til en bestemt database.

TOPP – returner det angitte antallet poster

Utdrag fra MSDN. TOPP – begrenser antall rader som returneres i spørringsresultatsettet til et spesifisert antall eller prosent. Når en TOP-klausul brukes sammen med en ORDER BY-klausul, er resultatsettet begrenset til de første N radene i det sorterte resultatet. I ellers De første N radene returneres i uspesifisert rekkefølge.

Vanligvis brukes dette uttrykket med en ORDER BY-klausul, og vi har allerede sett på eksempler der det var nødvendig å returnere de første N radene fra resultatsettet.

Uten ORDER BY brukes vanligvis denne klausulen når vi bare skal se på en tabell som er ukjent for oss, som kan ha mange poster, i dette tilfellet kan vi for eksempel be om å returnere kun de første 10 radene, men for klarhet vil vi si bare 2:

VELG TOPP 2 * FRA Ansatte

Du kan også angi ordet PERCENT for å returnere den tilsvarende prosentandelen av rader fra resultatsettet:

VELG TOPP 25 PROSENT * FRA Ansatte

I min praksis brukes oftest prøvetaking etter antall rader.

Du kan også bruke WITH TIES-alternativet med TOP, som vil bidra til å returnere alle rader i tilfelle tvetydig sortering, dvs. denne setningen vil returnere alle rader som er like i sammensetning til radene som faller inn i TOP N-utvalget som et resultat, la oss legge til en annen "Programmer" med en lønn på 1500 for demonstrasjon.

INSERT Ansatte(ID,Navn,E-post,PosisjonsID,DepartmentID,LederID,Lønn) VALUES(1004,N"Nikolaev N.N."," [e-postbeskyttet]",3,3,1003,1500)

Og la oss legge til en annen ansatt uten å angi stillingen og avdelingen med en lønn på 2000:

INSERT Ansatte(ID,Navn,E-post,PosisjonsID,DepartmentID,ManagerID,Lønn) VALUES(1005,N"Alexandrov A.A."," [e-postbeskyttet]",NULL,NULL,1000,2000)

La oss nå velge, ved å bruke WITH TIES-alternativet, alle ansatte hvis lønn sammenfaller med lønnen til 3 ansatte, med den minste lønnen (jeg håper det vil være tydeligere hva jeg kommer til):

VELG TOPP 3 MED BÅND ID,Navn,Lønn FRA Ansatte BESTILL ETTER lønn

Her, selv om TOP 3 er angitt, returnerte forespørselen 4 poster, fordi lønnsverdien som ga TOP 3 (1500 og 2000) ble funnet hos 4 ansatte. Visuelt fungerer det omtrent slik:

På en lapp.
TOP er implementert i forskjellige databaser forskjellige måter, i MySQL er det en LIMIT-klausul for dette, der du i tillegg kan sette startforskyvningen.

I ORACLE 12c introduserte de også sin egen analog, som kombinerer funksjonaliteten til TOP og LIMIT - søk etter ordene "ORACLE OFFSET FETCH". Før versjon 12c ble pseudo-kolonnen ROWNUM vanligvis brukt til dette formålet.


Men hva skjer hvis du bruker DISTINCT- og TOP-klausulene samtidig? Slike spørsmål kan enkelt besvares ved å utføre eksperimenter. Generelt, ikke vær redd og ikke vær lat til å eksperimentere, fordi... Det meste læres gjennom praksis. Ordrekkefølgen i SELECT-setningen er som følger: DISTINCT kommer først, etterfulgt av TOP, dvs. Hvis du tenker logisk og leser fra venstre til høyre, vil duplikatene først bli brukt, og deretter TOP vil bli laget basert på dette settet. Vel, la oss sjekke og sørge for at dette er tilfelle:

VELG DISTINKT TOP 2 Lønn FRA Ansatte BESTILL ETTER Lønn

Lønn
1500
2000

De. som et resultat fikk vi de 2 minste lønningene av alle. Selvfølgelig kan det være tilfelle at lønnen for noen ansatte kanskje ikke er spesifisert (NULL), pga Ordningen lar oss gjøre dette. Derfor, avhengig av oppgaven, bestemmer vi oss for å enten behandle NULL-verdier i ORDER BY-klausulen, eller ganske enkelt forkaste alle poster som Salary er NULL for, og for dette fortsetter vi med å studere WHERE-klausulen.

HVOR – tilstand for radvalg

Denne setningen brukes til å filtrere poster etter en gitt tilstand. La oss for eksempel velge alle ansatte som jobber i "IT"-avdelingen (ID=3):

VELG ID,Etternavn,Fornavn,Lønn FRA ansatte WHERE DepartmentID=3 -- DET BESTILLES ETTER Etternavn,Fornavn

ID Etternavn Fornavn Lønn
1004 NULL NULL 1500
1003 Andreev Andrey 2000
1001 Petrov Peter 1500

WHERE-leddet er skrevet før ORDER BY-kommandoen.

Rekkefølgen for å bruke kommandoene på det første settet med ansatte er som følger:

  1. HVOR – hvis spesifisert, er det første trinnet fra hele settet med ansatte å velge bare poster som tilfredsstiller betingelsen
  2. DISTINCT – hvis spesifisert, blir alle duplikater forkastet
  3. BESTILL ETTER – hvis spesifisert, blir resultatet sortert
  4. TOPP – hvis spesifisert, returneres bare det angitte antallet poster fra det sorterte resultatet

La oss se på et eksempel for klarhet:

VELG DISTINKT TOP 1 Lønn FRA Ansatte HVOR AvdelingsID=3 BESTILLE ETTER Lønn

Visuelt vil det se slik ut:

Det er verdt å merke seg at sjekking for NULL ikke gjøres med et likhetstegn, men bruker operatorene IS NULL og IS NOT NULL. Bare husk at du ikke kan sammenligne på NULL ved å bruke "=" (likningstegn)-operatoren, fordi resultatet av uttrykket vil også være lik NULL.

La oss for eksempel velge alle ansatte som ikke har spesifisert en avdeling (dvs. avdelings-ID ER NULL):

VELG ID, Navn FRA ansatte HVOR avdelings-ID ER NULL

La oss nå, som et eksempel, beregne bonusen for alle ansatte som har angitt BonusPercent-verdien (dvs. BonusPercent ER IKKE NULL):

VELG ID,Navn,Lønn/100*BonusPercent AS Bonus FRA ansatte HVOR BonusPercent IKKE ER NULL

Ja, forresten, hvis du tenker deg om, kan BonusPercent-verdien være lik null (0), og verdien kan også legges inn med et minustegn, fordi vi ikke har pålagt noen begrensninger på dette feltet.

Vel, etter å ha fortalt om problemet, ble vi bedt om å vurdere at hvis (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:

VELG ID,Navn,Lønn/100*BonusPercent AS Bonus FRA ansatte HVOR IKKE(BonusPercent<=0 OR BonusPercent IS NULL)

De. Det var her vi begynte å lære om boolske operatorer. Uttrykket i parentes "(BonusPercent<=0 OR BonusPercent IS NULL)» проверяет на то что у сотрудника нет бонуса, а NOT инвертирует это значение, т.е. говорит «верни всех сотрудников которые не сотрудники у которых нет бонуса».

Du kan også skrive om dette uttrykket ved umiddelbart å si «returner alle ansatte som har en bonus» ved å uttrykke dette med uttrykket (BonusPercent>0 og BonusPercent IS NOT NULL):

VELG ID,Navn,Lønn/100*BonusPercent AS Bonus FRA ansatte HVOR BonusPercent>0 OG BonusPercent IKKE ER NULL

Også i WHERE-blokken kan du sjekke ulike typer uttrykk ved å bruke aritmetiske operatorer og funksjoner. For eksempel kan en lignende sjekk gjøres ved å bruke et uttrykk med ISNULL-funksjonen:

VELG ID,Navn,Lønn/100*BonusPercent AS Bonus FRA ansatte WHERE ISNULL(BonusPercent,0)>0

Boolske operatorer og enkle sammenligningsoperatorer

Ja, du kan ikke klare deg uten matematikk her, så la oss ta en kort utflukt til boolske og enkle sammenligningsoperatorer.

Det er bare 3 boolske operatorer i SQL - AND, OR og NOT:

For hver boolske operator kan du gi sannhetstabeller som i tillegg viser hva resultatet blir når betingelsene kan være NULL:

Det er følgende enkle operatører sammenligninger som brukes til å danne forhold:

I tillegg er det 2 operatorer for å sjekke en verdi/uttrykk for NULL:

ER NULL Tester for NULL-likhet
ER IKKE NULL Tester for NULL ulikhet

Prioritet: 1) Alle sammenligningsoperatører; 2) IKKE; 3) OG; 4) ELLER.

Når du bygger kompleks logiske uttrykk parenteser brukes:

((tilstand1 OG betingelse2) ELLER IKKE(tilstand3 OG tilstand4 OG tilstand5)) ELLER (...)

Ved å bruke parenteser kan du også endre standardrekkefølgen for beregninger.

Her har jeg forsøkt å gi en idé om Boolsk algebra i et volum tilstrekkelig for arbeid. Som du kan se, for å skrive mer komplekse forhold kan du ikke klare deg uten logikk, men det er ikke mye av det her (OG, ELLER og IKKE), og det ble oppfunnet av folk, så alt er ganske logisk.

La oss gå til slutten av den andre delen

Som du kan se, selv om den grunnleggende syntaksen til SELECT-operatoren kan vi snakke veldig lenge, men for å holde meg innenfor rammen av artikkelen vil jeg til slutt vise flere logiske operatorer - BETWEEN, IN og LIKE.

BETWEEN – sjekker om det er inkludert i et område

Test_verdi MELLOM start_verdi OG sluttverdi

Uttrykk kan fungere som verdier.

La oss se på et eksempel:

VELG ID, Navn, Lønn FRA Ansatte HVOR Lønn MELLOM 2000 OG 3000 -- som har en lønn i området 2000-3000

Faktisk er BETWEEN en forenklet notasjon av formen:

VELG ID,Navn,Lønn FRA Ansatte HVOR Lønn>=2000 OG lønn<=3000 -- все у кого ЗП в диапозоне 2000-3000

Ordet NOT kan brukes før ordet BETWEEN, som vil sjekke om verdien ikke er innenfor det angitte området:

VELG ID,Navn,Lønn FRA ansatte HVOR Lønn IKKE MELLOM 2000 OG 3000 -- ligner IKKE(Lønn>=2000 OG Lønn<=3000)

Følgelig, hvis du bruker BETWEEN, IN, LIKE, kan du også kombinere dem med andre forhold ved å bruke AND og OR:

VELG ID, Navn,Lønn FRA Ansatte HVOR Lønn MELLOM 2000 OG 3000 -- som har en lønn i området 2000-3000 OG AvdelingsID=3 -- ta kun hensyn til ansatte i avdeling 3

IN – sjekk for inkludering i listen over verdier

Denne operatøren har følgende form:

Test_verdi IN (verdi1, verdi2, ...)

Jeg tror det er lettere å vise med et eksempel:

VELG ID, Navn, Lønn FRA ansatte WHERE PositionID IN(3,4) -- hvis stilling er 3 eller 4

De. dette er i hovedsak det samme som følgende uttrykk:

VELG ID, Navn, Lønn FRA ansatte HVOR PosisjonsID=3 ELLER StillingsID=4 -- hvis stilling er 3 eller 4

I tilfelle IKKE vil det være likt (vi får alle unntatt de fra avdeling 3 og 4):

VELG ID,Navn,Lønn FRA ansatte WHERE PositionID NOT IN(3,4) -- lignende NOT(PositionID=3 OR PositionID=4)

Et søk med NOT IN kan også uttrykkes ved å bruke OG:

VELG ID, Navn, Lønn FRA Ansatte HVOR StillingsID<>3OG Posisjons-ID<>4 -- tilsvarende PositionID NOT IN(3,4)

Vær oppmerksom på at søk etter NULL-verdier ved å bruke IN-konstruksjonen ikke vil fungere, fordi å sjekke NULL=NULL vil også returnere NULL, ikke True:

SELECT ID,Name,DepartmentID FROM Ansatte WHERE DepartmentID IN(1,2,NULL) -- NULL-poster vil ikke inkluderes i resultatet

I dette tilfellet, del sjekken inn i flere forhold:

VELG ID, Navn, Avdelings-ID FRA ansatte HVOR Avdelings-ID IN(1,2) -- 1 eller 2 ELLER Avdelings-ID ER NULL -- eller NULL

Eller du kan skrive noe sånt som:

VELG ID,Navn,DepartmentID FRA Ansatte HVOR ISNULL(DepartmentID,-1) IN(1,2,-1) -- hvis du er sikker på at det ikke er noen avdeling med ID=-1

Jeg tror det første alternativet, i dette tilfellet, vil være mer riktig og pålitelig. Ok, dette er bare et eksempel for å demonstrere hvilke andre strukturer som kan bygges.

Det er også verdt å nevne en enda mer snikende feil knyttet til NULL, som kan gjøres ved bruk av NOT IN-konstruksjonen. La oss for eksempel prøve å velge alle ansatte unntatt de hvis avdeling er 1 eller hvis avdeling ikke er spesifisert i det hele tatt, dvs. er lik NULL. Som en løsning foreslår følgende alternativ seg selv:

VELG ID, Navn, Avdelings-ID FRA ansatte HVOR Avdelings-ID IKKE IN(1,NULL)

Men etter å ha utført spørringen, vil vi ikke motta en eneste rad, selv om vi forventet å se følgende:

Igjen ble vitsen her spilt av NULL spesifisert i listen over verdier.

La oss se på hvorfor det oppsto en logisk feil i dette tilfellet. La oss utvide søket ved å bruke OG:

VELG ID,Navn,DepartmentID FRA Ansatte WHERE AvdelingsID<>1 OG AvdelingsID<>NULL -- problemet er på grunn av denne NULL-kontrollen - denne betingelsen vil alltid returnere NULL

Riktig tilstand (avdelings-ID<>NULL) vil alltid gi oss usikkerhet her, dvs. NULL. Husk nå sannhetstabellen for AND-operatoren, der (TRUE AND NULL) gir NULL. De. når den venstre betingelsen er oppfylt (DepartmentID<>1) på grunn av en udefinert riktig tilstand, vil vi ende opp med en udefinert verdi for hele uttrykket (avdelings-ID<>1 OG AvdelingsID<>NULL), slik at strengen ikke blir inkludert i resultatet.

Betingelsen kan omskrives riktig som følger:

VELG ID, Navn, Avdelings-ID FRA ansatte HVOR Avdelings-ID IKKE I(1) -- eller i dette tilfellet bare Avdelings-ID<>1 OG avdelings-ID ER IKKE NULL -- og se separat for IKKE NULL

IN kan også brukes med underspørringer, men vi kommer tilbake til dette skjemaet i påfølgende deler av denne opplæringen.

LIKE – sjekke en streng ved hjelp av et mønster

Jeg vil snakke om denne operatøren bare i sin enkleste form, som er en standard og støttes av de fleste dialekter i SQL-språket. Selv i denne formen kan den brukes til å løse mange problemer som krever å sjekke innholdet i en streng.

Denne operatøren har følgende form:

Test_string LIKE string_pattern

Følgende spesialtegn kan brukes i "pattern_string":

  1. Understrekingen "_" betyr at ethvert enkelt tegn kan ta dens plass
  2. Prosenttegnet "%" - sier at det kan erstattes av et hvilket som helst antall tegn, inkludert ingen
La oss se på eksempler med "%"-symbolet (i praksis brukes det oftere):

SELECT ID,Name FROM Ansatte WHERE Navn LIKE "Pet%" -- hvis navn begynner med bokstavene "Pet" SELECT ID, LastName FROM Ansatte WHERE Etternavn LIKE "%ov" -- hvis etternavn slutter med "ov" SELECT ID, Etternavn FRA ansatte WHERE Etternavn LIKE "%re%" -- hvis etternavn inneholder kombinasjonen "re"

La oss se på eksempler med "_"-symbolet:

VELG ID,Etternavn FRA Ansatte WHERE Etternavn LIKE "_etrov" -- hvis etternavn består av et hvilket som helst fortegn og påfølgende bokstaver "etrov" VELG ID, Etternavn FRA ansatte WHERE Etternavn SOM "____ov" -- hvis etternavn består av fire tegn og påfølgende bokstaver "ov"

Ved å bruke ESCAPE kan du spesifisere et escape-tegn som kansellerer kontrolleffekten til spesialtegnene "_" og "%". Denne klausulen brukes når du vil direkte se etter et prosenttegn eller en understreking i en streng.

For å demonstrere ESCAPE, la oss legge søppel i én oppføring:

OPPDATERING Ansatte SET FirstName="Dette er søppel som inneholder %" WHERE ID=1005

Og la oss se hva følgende spørringer returnerer:

VELG * FRA ansatte HVOR Fornavn SOM "%!%%" ESCAPE "!" -- linjen inneholder "%"-tegn SELECT * FRA ansatte HVOR Fornavn LIKE "%!_%" ESCAPE "!" -- linjen inneholder "_"-tegn

Hvis du trenger å sjekke en streng for en fullstendig match, så i stedet for LIKE er det bedre å bare bruke "="-tegnet:

VELG * FRA ansatte WHERE FirstName="Peter"

På en lapp.
I MS SQL, i LIKE-operatormalen, kan du også spesifisere et søk ved å bruke regulære uttrykk, lese om det på Internett hvis standardfunksjonene til denne operatoren ikke er nok for deg.

ORACLE bruker REGEXP_LIKE-funksjonen til å søke med regulære uttrykk.

Litt om strenger

I tilfelle du sjekker en streng for tilstedeværelsen av Unicode-tegn, må du plassere tegnet N foran anførselstegnene, dvs. N"...". Men siden alle tegnfeltene i tabellen vår er i Unicode-format (nvarchar-type), kan du alltid bruke dette formatet for disse feltene. Eksempel:

VELG ID,Navn FRA ansatte WHERE Navn LIKE N"Pet%" VELG ID,Etternavn FRA ansatte WHERE Etternavn=N"Petrov"

Når det er gjort riktig, når du sammenligner med et felt av typen varchar (ASCII), bør du prøve å bruke tester ved å bruke "...", og når du sammenligner et felt med typen nvarchar (Unicode), bør du prøve å bruke tester med N" ...". Dette gjøres for å unngå implisitte typekonverteringer under kjøring av spørringer. Vi bruker samme regel når vi setter inn (INSERT) verdier i et felt eller oppdaterer dem (UPDATE).

Når du sammenligner strenger, er det verdt å vurdere poenget at, avhengig av databaseinnstillingene (kollasjon), kan strengsammenligning enten skille mellom store og små bokstaver (når "Petrov" = "PETROV") eller store og små bokstaver (når "Petrov"<>"PETROV").
Når det gjelder en innstilling som skiller mellom store og små bokstaver, hvis du ønsker å foreta et søk som ikke skiller mellom store og små bokstaver, kan du for eksempel forhåndskonvertere høyre og venstre uttrykk til én store og små bokstaver - øvre eller nedre:

SELECT ID,Name FROM Ansatte WHERE UPPER(Navn) LIKE UPPER(N"Pet%") -- eller LOWER(Name) LIKE LOWER(N"Pet%") VELG ID,Etternavn FRA Ansatte WHERE UPPER(LastName)=UPPER( N"Petrov") -- eller LOWER(Etternavn)=LOWER(N"Petrov")

Litt om datoer

Når du sjekker etter en dato, kan du bruke, som med strenger, enkle anførselstegn "...".

Uavhengig av regionale innstillinger i MS SQL, kan du bruke følgende datosyntaks "ÅÅÅÅMMDD" (år, måned, dag sammen uten mellomrom). MS SQL vil alltid forstå dette datoformatet:

VELG ID, Navn, Bursdag FRA Ansatte HVOR Bursdag MELLOM "19800101" OG "19891231" -- ansatte på 80-tallet BESTILL ETTER bursdag

I noen tilfeller er det mer praktisk å stille inn datoen ved å bruke DATEFROMPARTS-funksjonen:

VELG ID, Navn, Bursdag FRA Ansatte HVOR Bursdag MELLOM DATEFROMPARTS(1980,1,1) OG DATEFROMPARTS(1989,12,31) BESTILL ETTER Fødselsdag

Det er også en lignende funksjon DATETIMEFROMPARTS, som brukes til å stille inn dato og klokkeslett (for dato- og klokkesletttypen).

Du kan også bruke KONVERTER-funksjonen hvis du trenger å konvertere en streng til en dato- eller datotidsverdi:

SELECT CONVERT(date,"12.03.2015",104), CONVERT(datetime,"2014-11-30 17:20:15",120)

Verdiene 104 og 120 indikerer hvilket datoformat som brukes i strengen. Du kan finne en beskrivelse av alle gyldige formater i MSDN-biblioteket ved å søke etter "MS SQL CONVERT".

Det er mange funksjoner for å jobbe med datoer i MS SQL, se etter "ms sql-funksjoner for å jobbe med datoer."

Merk. Alle dialekter i SQL-språket har sitt eget sett med funksjoner for å jobbe med datoer og bruke sin egen tilnærming til å jobbe med dem.

Litt om tall og deres transformasjoner

Informasjonen i denne delen vil sannsynligvis være mer nyttig for IT-spesialister. Hvis du ikke er en, og målet ditt ganske enkelt er å lære å skrive spørringer for å få informasjonen du trenger fra databasen, trenger du kanskje ikke slike finesser, men i alle fall kan du raskt gå gjennom teksten og ta notater , fordi . Hvis du har begynt å studere SQL, begynner du allerede på IT.

I motsetning til CAST-konverteringsfunksjonen, kan du spesifisere en tredje parameter i CONVERT-funksjonen, som er ansvarlig for konverteringsstilen (formatet). Ulike datatyper kan ha sitt eget sett med stiler, noe som kan påvirke det returnerte resultatet. Vi har allerede berørt bruken av stiler når vi vurderer konvertering av en streng ved å bruke KONVERTER-funksjonen til dato- og dato- og klokkesletttypene.

Du kan lese mer om CAST, CONVERT funksjoner og stiler i MSDN - "CAST and CONVERT Functions (Transact-SQL)": msdn.microsoft.com/ru-ru/library/ms187928.aspx

For å forenkle eksemplene vil Transact-SQL-språksetningene DECLARE og SET brukes her.

Selvfølgelig, i tilfelle av å konvertere et heltall til et reelt tall (som jeg ga i begynnelsen av denne leksjonen, for å demonstrere forskjellen mellom heltall og reell divisjon), er kunnskap om nyansene til konverteringen ikke så kritisk, fordi der gjorde vi en konvertering av heltall til reell (som rekkevidden er mye større enn rekkevidden av heltall):

DECLARE @min_int int SET @min_int=-2147483648 DECLARE @max_int int SET @max_int=2147483647 SELECT -- (-2147483648) @min_int,CAST(@min_int AS float), CONVERT(float,@2min_4int), @2min_4int), ,CAST(@max_int AS float),CONVERT(float,@max_int), -- numeric(16,6) @min_int/1., -- (-2147483648.000000) @max_int/1. -- 2147483647,000000

Kanskje det ikke var verdt å spesifisere metoden for den implisitte konverteringen oppnådd ved å dele med (1.), fordi Det er tilrådelig å prøve å gjøre eksplisitte konverteringer for større kontroll over typen resultat som oppnås. Selv om vi ønsker å få et resultat av typen numerisk, med et spesifisert antall sifre etter desimaltegnet, kan vi bruke et triks i MS SQL for å multiplisere en heltallsverdi med (1., 1.0, 1.00, etc.) :

DEKLARE @int int SET @int=123 VELG @int*1., -- numeric(12, 0) - 0 desimalplasser @int*1.0, -- numeric(13, 1) - 1 desimal @int*1.00, -- numeric(14, 2) - 2 tegn -- selv om det noen ganger er bedre å gjøre en eksplisitt konvertering CAST(@int AS numeric(20, 0)), -- 123 CAST(@int AS numeric(20, 1) ), -- 123,0 CAST(@int AS numeric(20, 2)) -- 123,00

I noen tilfeller kan detaljene i konverteringen være veldig viktige, fordi... de påvirker riktigheten av det resulterende resultatet, for eksempel når du konverterer en numerisk verdi til en streng (varchar). La oss se på eksempler på å konvertere penger og flyteverdier til varchar:

Atferd ved konvertering av penger til varchar DECLARE @money money SET @money = 1025.123456789 -- det vil være en implisitt konvertering til 1025.1235, fordi pengetypen lagrer bare 4 sifre etter desimaltegnet SELECT @money, -- 1025.1235 -- som standard oppfører CAST og CONVERT det samme (dvs. grovt sett brukes stil 0) CAST(@money som varchar(20)) , -- 1025.12 CONVERT(varchar(20), @money), -- 1025.12 CONVERT(varchar(20), @money, 0), -- 1025.12 (stil 0 - ingen tusendeler skilletegn og 2 desimaler (standardformat)) KONVERTER( varchar(20), @penger, 1), -- 1.025.12 (stil 1 - bruker en tusendels skilletegn og 2 desimaler) KONVERTER(varchar(20), @penger, 2) -- 1025.1235 (stil 2 - ingen skilletegn og 4 tall etter desimaltegn)

Atferd ved konvertering av float til varchar DECLARE @float1 float SET @float1 = 1025.123456789 DECLARE @float2 float SET @float2 = 1231025.123456789 SELECT @float1, -- 1025.12345 9 -- Som standard oppfører CAST og CONVERT det samme (dvs. grovt sett brukes stil 0) -- stil 0 - Ikke mer enn 6 sifre. Eksponentiell notasjon brukes av nødvendighet -- virkelig skumle ting skjer her når du konverterer til varchar CAST(@float1 som varchar(20)), -- 1025.12 CONVERT(varchar(20), @float1), -- 1025.12 CONVERT(varchar( 20 ), @float1, 0), -- 1025,12 CAST(@float2 som varchar(20)), -- 1,23103e+006 CONVERT(varchar(20), @float2), -- 1,23103e+006 CONVERT(varchar( 20 ), @float2, 0), -- 1.23103e+006 -- stil 1 - Alltid 8 sifre. Vitenskapelig notasjon for tall brukes alltid. -- denne stilen for float er heller ikke veldig nøyaktig CONVERT(varchar(20), @float1, 1), -- 1,0251235e+003 CONVERT(varchar(20), @float2, 1), -- 1,2310251e+006 - - stil 2 - Alltid 16 bits. Vitenskapelig notasjon for tall brukes alltid. -- her er nøyaktigheten allerede bedre CONVERT(varchar(30), @float1, 2), -- 1,025123456789000e+003 - OK CONVERT(varchar(30), @float2, 2) -- 1,231025123456789e+006 - OK

Som man kan se av eksemplet flyter flytende typer, ekte i noen tilfeller kan faktisk skape en stor feil, spesielt når de konverteres til en streng og tilbake (dette kan skje med ulike typer integrasjoner, når data for eksempel overføres i tekstfiler fra ett system til et annet).

Hvis du trenger å eksplisitt kontrollere presisjonen opp til et bestemt tegn, mer enn 4, så er det noen ganger bedre å bruke desimal/numerisk type for å lagre data. Hvis 4 tegn er nok, kan du bruke pengetypen - den tilsvarer omtrent numerisk(20,4).

Desimal og numerisk DECLARE @money money SET @money = 1025.123456789 -- 1025.1235 DECLARE @float1 float SET @float1 = 1025.123456789 DECLARE @float2 float SET @float2 = 52.numer ic(28,9) SET @numeric = 1025.123456789 VELG CAST ( @numeric as varchar(20)), -- 1025.12345679 CONVERT(varchar(20), @numeric), -- 1025.12345679 CAST(@money as numeric(28,9)), -- 1025.123500000 CAST(@numeric(1 CAST(@numeric) 28 ,9)), -- 1025.123456789 CAST(@float2 som numerisk(28,9)) -- 1231025.123456789

Merk.
Fra versjon MS SQL 2008 kan du bruke følgende konstruksjon i stedet:
  • ms sql server
  • Legg til merkelapper

    Det strukturerte spørringsspråket SQL er basert på relasjonskalkulus med variable tupler. SQL-språket er designet for å utføre operasjoner på tabeller, opprette, slette, endre struktur og på tabelldata, velge, endre, legge til og slette, samt noen relaterte operasjoner. SQL er et ikke-prosedyrespråk og inneholder ikke kontrollsetninger for organisering av rutiner, input, output osv.


    Del arbeidet ditt på sosiale nettverk

    Hvis dette verket ikke passer deg, er det nederst på siden en liste over lignende verk. Du kan også bruke søkeknappen


    Strukturert spørringsspråk SQL: historie, standarder,

    Grunnleggende språkoperatører.

    Det strukturerte spørringsspråket SQL er basert på relasjonskalkulus med variable tupler. Språket har flere standarder. SQL-språket er designet for å utføre operasjoner på tabeller (opprette, slette, endre strukturen) og på tabelldata (velge, endre, legge til og slette), samt noen relaterte operasjoner. SQL er et ikke-prosedyrespråk og inneholder ikke kontrollsetninger, subrutineorganisering, input-output, etc. I denne forbindelse brukes SQL ikke autonomt, det er vanligvis nedsenket i miljøet til det innebygde DBMS-programmeringsspråket (for eksempel FoxPro DBMS Visual FoxPro, ObjectPAL DBMS Paradox, Visual Basic for Applications DBMS Access).

    I moderne DBMS-er med interaktivt grensesnitt kan du lage spørringer ved å bruke andre verktøy, for eksempel QBE. Bruk av SQL kan imidlertid ofte forbedre effektiviteten av databehandlingen i databasen. Når du for eksempel forbereder en spørring i Access-miljøet, kan du flytte fra Query Builder-vinduet (utforme en eksempelspørring på QBE-språket) til et vindu med tilsvarende SQL-setning. I noen tilfeller er det lettere å forberede en ny spørring ved å redigere en eksisterende ved å endre SQL-setningen. Sammensetningen av SQL-setninger kan variere noe i forskjellige DBMS-er. SQL-språket har ikke funksjonene til et fullverdig utviklingsspråk, men er fokusert på datatilgang, så det er inkludert i programutviklingsverktøy. I dette tilfellet kalles det innebygd SQL. SQL-språkstandarden støttes av moderne implementeringer av følgende programmeringsspråk: PL/1, Ada, C, COBOL, Fortran, MUMPS og Pascal.

    I spesialiserte applikasjonsutviklingssystemer av klient-server-typen er programmeringsmiljøet i tillegg vanligvis supplert med kommunikasjonsverktøy (etablere og frakoble forbindelser med databaseservere, oppdage og behandle feil som oppstår i nettverket osv.), verktøy for å utvikle brukergrensesnitt, designverktøy og feilsøking Det er to hovedmetoder for å bruke innebygd SQL: statisk og dynamisk. Ved statisk bruk av språk (statisk SQL), inneholder programteksten kall til SQL-språkfunksjoner, som er rigid inkludert i den kjørbare modulen etter kompilering.

    Endringer i kalte funksjoner kan være på nivået til individuelle anropsparametere ved bruk av programmeringsspråkvariabler. Når man bruker språket dynamisk (dynamisk SQL), antas det at kall til SQL-funksjoner bygges dynamisk og tolkningen av disse kallene, for eksempel tilgang til data fra en ekstern database, under programkjøring. Den dynamiske metoden brukes vanligvis i tilfeller der applikasjonen ikke kjenner typen SQL-kall på forhånd og den er konstruert i dialog med brukeren. Hovedformålet med SQL-språket (så vel som andre språk for å jobbe med databaser) er å forberede og utføre spørringer. Henting av data fra én eller flere tabeller kan resultere i et sett med poster som kalles en visning. En visning er i hovedsak en tabell som genereres som et resultat av en spørring. Vi kan si at det er en type lagret spørring. Du kan bygge flere visninger ved å bruke de samme tabellene. Selve visningen beskrives ved å spesifisere visningsidentifikatoren og forespørselen som må gjøres for å få den.

    For å gjøre arbeidet med visninger enklere, er konseptet med en markør introdusert i SQL-språket. En markør er en slags peker som brukes til å bevege seg gjennom sett med poster mens de behandles. Beskrivelsen og bruken av en markør i SQL er som følger. I den beskrivende delen av programmet er en variabel av typen markør (CURSOR) knyttet til en SQL-setning (vanligvis en SELECT-setning). I den utførende delen av programmet åpnes markøren (OPEN<имя курсора>), flytter markøren gjennom poster (FETCH<имя курсора>...), etterfulgt av passende behandling, og til slutt lukking av markøren (CLOSE<имя курсора>).

    Grunnleggende språkoperatører

    La oss beskrive en minimal undergruppe av SQL-språket, basert på implementeringen i standard ODBC (Open Database Connectivity) grensesnitt fra Microsoft. SQL-språkoperatorer kan deles inn i to underspråk: Data Definition Language (DDL) og Data Manipulation Language (DML) De viktigste SQL-språkoperatorene er presentert i tabellen.

    La oss vurdere formatet og de grunnleggende egenskapene til de viktigste operatørene, med unntak av spesifikke operatører merket i tabellen med symbolet "*". Vi vil utelate uviktige operander og syntakselementer (for eksempel regelen som brukes i mange programmeringssystemer for å sette ";" på slutten av operatoren).

    1. Operatør lage en tabellhar formatet:

    LAG BORD<имя таблицы>

    (<имя столбца> <тип данных>

    [,<имя столбца> <тип данных> ]...)

    Operatorens nødvendige operander er navnet på tabellen som opprettes og navnet på minst én kolonne (felt) som indikerer typen data som er lagret i denne kolonnen.

    Når du oppretter en tabell, kan noen tilleggsregler for å kontrollere verdiene som er lagt inn i dem spesifiseres for individuelle felt. NOT NULL-konstruksjonen tjener nettopp dette formålet, og for en tabellkolonne betyr det at en verdi må defineres i den kolonnen.

    SQL-setninger

    Utsikt

    Navn

    Hensikt

    LAG BORD

    DROPPE BORD

    ENDRE TABELL

    LAG INDEKS

    SLIPP INDEKS

    LAG UTSIKT

    DROP VISNING

    STOR*

    REVOKE*

    lage en tabell

    slette en tabell

    endre tabellstruktur

    indeksoppretting

    slette en indeks

    skape en visning

    sletter en visning

    tildele privilegier

    fjerning av privilegier

    PLUKKE UT

    UPDAT

    SETT INN

    SLETT

    eksempler på poster

    skiftende poster

    sette inn nye poster

    sletting av oppføringer

    Generelt kan forskjellige DBMS-er bruke forskjellige typer data. ODBC-grensesnittet støtter sine egne standarddatatyper, for eksempel tegn (SQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHAR), osv. Når du arbeider med databasen til en bestemt DBMS gjennom ODBC-grensesnittet, konverteres standarddatatypene som støttes av grensesnittet automatisk inn i kildedatatyper og omvendt. Om nødvendig kan datautveksling mellom programmet og datakilden utføres uten konvertering i kildens interne dataformat.

    Eksempel 1 . Opprette en tabell.

    La oss si at du vil lage en tabellvare som beskriver varer som har følgende felt: type produkt, komp_id-identifikator for produksjonsbedriften, navnet på produktet og prisen på produktet. Tabelldefinisjonssetningen kan se slik ut:

    CREATE TABLE varer (type SQL_CHAR(8) NOT NULL,

    comp_id SQL_CHAR(10) NOT NULL, navn SQL_VARCHAR(20),

    pris SQL_DECIMAL(8,2)).

    2. Operatør endringer i tabellstrukturenhar formatet:

    ENDRE TABELL<имя таблицы>

    ((LEGG TIL, ENDRE, DROPPE)<имя столбца> [<тип данных>]

    [,(LEGG TIL, ENDRE, DROP)<имя столбца> [<тип данных>]]...)

    Endre strukturen til en tabell kan bestå av å legge til (ADD), endre (MODIFY) eller fjerne (DROP) en eller flere tabellkolonner. Reglene for å skrive ALTER TABLE-setningen er de samme som for CREATE TABLE-setningen. Når du sletter en kolonne, angi<тип данных>ikke nødvendig.

    3. Operatør slette en tabellhar formatet:

    DROPPE BORD<имя таблицы>

    Operatoren lar deg slette en eksisterende tabell. For eksempel, for å slette en tabell kalt elementer, er det nok å skrive en setning som: DROP TABLE elementer.

    4. Operatør lage en indekshar formatet:

    LAG INDEKS< имя индекса >

    PÅ< имя таблицы >

    (<имя столбца>[ASC | DESC]

    [,<имя столбца>[ASC | DESC]...)

    Operatoren lar deg lage en indeks på en eller flere kolonner gitt tabell for å fremskynde gjennomføringen av forespørsler og søkeoperasjoner med et bord. Du kan lage flere indekser på en enkelt tabell Ved å spesifisere det valgfrie UNIQUE-alternativet, kan du sikre at verdiene i alle kolonner som er spesifisert i setningen, er unike. Å lage en indeks ved å bruke UNIQUE-attributtet betyr i hovedsak å definere en nøkkel i en tidligere opprettet tabell. Når du oppretter en indeks, kan du spesifisere rekkefølgen automatisk sortering verdier i kolonner i stigende rekkefølge ASC (standard), eller synkende rekkefølge DESC. For forskjellige kolonner kan du angi annen rekkefølge sortering.

    5. Operatør slette en indekshar formatet:

    SLIPP INDEKS<имя индекса>

    Denne operatoren lar deg slette en tidligere opprettet indeks med det tilsvarende navnet. Så, for eksempel, for å ødelegge main_indx-indeksen på emp-tabellen, er det nok å skrive DROP INDEX main_indx-setningen.

    6. Operatør skape en visninghar formatet:

    LAG UTSIKT<имя представления>

    [(<имя столбца> [,<имя столбца> ]...)]

    SOM<оператор SELECT>

    Denne operatøren lar deg lage en visning. Hvis kolonnenavn ikke er spesifisert i visningen, vil kolonnenavnene fra spørringen beskrevet av den tilsvarende SELECT-setningen bli brukt.

    7. Slett operatør representasjonen har følgende format:

    DROP VISNING<имя представления>

    Operatøren lar deg slette en tidligere opprettet visning. Merk at når du sletter en visning, slettes ikke tabellene som deltar i spørringen. Fjerning av en gerg-representasjon gjøres med en operator av skjemaet: DROP VIEW repr.

    8. Rekordvalgoperatør har formatet:

    PLUKKE UT

    < список данных >

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

    ... ]

    ...]

    Dette er den viktigste setningen av alle SQL-setninger. Dens funksjonalitet er enorm. La oss se på de viktigste. SELECT-setningen lar deg velge og utføre beregninger på data fra en eller flere tabeller. Resultatet av setningen er en responstabell, som kan ha (DISTINKT) dupliserte rader eller ikke. Som standard er alle rader, inkludert dupliserte, inkludert i svartabellen. Datavalg involverer poster fra en eller flere tabeller oppført i listen over FROM-operanden. Datalisten kan inneholde navnene på kolonnene som deltar i spørringen, samt uttrykk over kolonnene. I det enkleste tilfellet kan uttrykk inneholde kolonnenavn, aritmetiske symboler (+, , *, /), konstanter og parenteser. Hvis et uttrykk er skrevet i datalisten, utføres det sammen med datautvalget beregninger, hvis resultater faller inn i en ny (opprettet) kolonne i svartabellen. Når du bruker kolonnenavn på flere tabeller i datalister, brukes en konstruksjon av skjemaet for å indikere at en kolonne tilhører en bestemt tabell:<имя таблицы>.<имя столбца>.

    WHERE-operanden spesifiserer betingelsene som må oppfylles av postene i den resulterende tabellen. Uttrykk<условие выборки>er boolsk. Elementene kan være kolonnenavn, sammenligningsoperasjoner, aritmetiske operasjoner, logiske koblinger (AND, OR, NO), parenteser, spesialfunksjoner LIKE, NULL, IN, etc. GROUP BY-operanden lar deg velge grupper i det resulterende settet med poster.

    9. Operatør registrere endringerhar formatet:

    OPPDATER<имя таблицы>

    SETT<имя столбца> = {<выражение>, NULL )

    [, SET<имя столбца> = {<выражение>, NULL)...]

    Utførelsen av en UPDATE-setning består av å endre verdiene i tabellkolonnene spesifisert av SET-operanden for de postene som tilfredsstiller betingelsen spesifisert av WHERE-operanden. Nye feltverdier i poster kan være tomme (NULL) eller beregnes i henhold til et aritmetisk uttrykk. Reglene for å skrive aritmetiske og logiske uttrykk ligner på de tilsvarende reglene for SELECT-setningen.

    10. Operatør sette inn nye posterhar to typer formater:

    SETT INN I<имя таблицы>

    [(<список столбцов>)]

    VERDIER (<список значений>)

    SETT INN I<имя таблицы>

    [(<список столбцов>)]

    <предложение SELECT>

    I det første formatet brukes INSERT-setningen til å legge inn nye poster med spesifiserte verdier i kolonnene. Rekkefølgen på kolonnenavnene må samsvare med rekkefølgen til verdiene som er oppført i listen over VALUES-operanden. Hvis<список столбцов>utelatt, så inn<списке значений>Alle verdier må være oppført i rekkefølgen til tabellstrukturkolonnene.I det andre formatet er INSERT-setningen ment å inngåen gitt tabell med nye rader valgt fra en annen tabell medved å bruke SELECT-leddet.

    SIDE 1

    Andre lignende verk som kan interessere deg.vshm>

    16. Lær det grunnleggende om det strukturerte spørringsspråket T-SQL 34,15 KB
    For å oppnå dette målet er det nødvendig å løse følgende oppgaver: lage spørringer for å velge fra flere tabeller i SQL-språk ved å bruke spesifiserte utvalgskriterier; opprette en utvalgsspørring i SQL som inneholder statisk aggregerte funksjoner; opprette en spørring som kombinerer resultatene av to eller flere spørringer til ett resultatsett ved å bruke UNION-kommandoen. Som et resultat av å fullføre arbeidet, bør studentene kjenne til: kategorier av SQL-kommandoer; grunnleggende SQL-kommandoer brukes til å bygge en spørring; prinsipper for å lage SQL-spørringer...
    6030. SPRÅK SOM UTVIKLINGSFENOMEN. EKSTERNE OG INTERNE FAKTORER FOR SPRÅKUTVIKLING 17,38 KB
    Problemet med språkets opprinnelse involverer to spørsmål. Det første spørsmålet er knyttet til problemet med språkets opprinnelse generelt, hvordan det utviklet seg menneskelig språk hvordan mennesket lærte å snakke et sekund med opprinnelsen til hvert enkelt språk. Det er ingen bevis for denne perioden bevart, derfor, når de studerer språkets opprinnelse generelt, må lingvister operere ikke bare med språklige fakta, men også med data fra relaterte vitenskaper. Interessen for problemet med språkets opprinnelse oppsto for lenge siden.
    10870. Tverrfaglige forbindelser av kurset "Profesjonelt russisk språk". Transformasjon og differensiering av det profesjonelle russiske språket 10,57 KB
    Transformasjon og differensiering av det profesjonelle russiske språket 1. Transformasjon og differensiering av det profesjonelle russiske språket. Syntaktiske normer bestemmes av språkets struktur og gjennomgår, som andre ortopiske, leksikalske og morfologiske normer, endringer i språkutviklingsprosessen. Når man mestrer syntaksen til et ikke-morsmål, er det en rekke vanskeligheter som oppstår når man velger kontrollformer og koordinerer konstruksjonen av setninger ved hjelp av deltakende setning velge ønsket preposisjon og så videre.
    6929. Historien om Delphi-språket 13,01 KB
    Delphi er den greske byen der det delfiske oraklet levde. Delphi er en kombinasjon av flere viktige teknologier: En kompilator med høy ytelse i maskinkode Objektorientert modell av komponenter Visuell og derfor høyhastighets konstruksjon av applikasjoner fra programvareprototyper Skalerbare verktøy for å bygge databaser Kompiler til maskinkode Kompiler innebygd i Delphi gir høy ytelse nødvendig for byggeapplikasjoner i arkitekturen...
    10869. Begrepene "profesjonelt språk", "spesialitetsspråk", deres differensiering. Profesjonelt russisk språk: dets opprinnelse, funksjoner, funksjonsomfang (med hensyn til spesifikasjonene til spesialiteten) 9,5 KB
    Differensiering av språk. Hver økonomisk spesialitet i tillegg til felles språk felles for alle økonomer og har sitt eget spesielle og spesialiserte språk. Spesialister kommuniserer på disse profesjonelle språkene muntlig og skriftlig. I det økonomiske språksystemet er det problemer felles for alle fagspråk.
    1335. Grunnleggende orddannelsesmodeller på moderne amerikansk engelsk 117,01 KB
    De viktigste forskjellene mellom amerikansk og britisk engelsk. Problemet med å bestemme verdensstatusen til amerikansk engelsk. Amerikansk engelsk i den moderne verden. Leksikale trekk ved amerikansk engelsk.
    1936. HISTORIE, STRUKTUR OG GRUNNLEGGENDE KONSEPT FOR ØKOLOGI 495,77 KB
    Begrepet "økologi" er dannet fra de greske røttene "oikos" - hjemmet, det umiddelbare miljøet til en person og "logoer" - vitenskap. Derfor, i bokstavelig forstand, er økologi vitenskapen om organismer, inkludert mennesker, observert innenfor rammen av deres hjem, og Spesiell oppmerksomhet fokuserer på naturen til forbindelsene mellom organismer og deres miljø.
    17746. Pedagogikk for kunst: historie og viktigste utviklingstrender 25,96 KB
    Oppgaven med testen er å vurdere begrepet barns kunstneriske kreativitet, identifisere forskningen til fremragende lærere og psykologer og historien om dannelsen av barns kunstneriske kreativitet. En manifestasjon av kunstnerisk kreativitet kan være individuelle verk - utført uavhengig eller under veiledning av en voksen, tegninger, modellering, muntlig og skriftlig kunst, melodier, dramatisering, dans, samt korsang, teaterforestillinger, kunst og håndverk, utskjæring, dukketeater, tegne- og skjønnlitterære filmer og...
    6285. Kontrolluttalelser 103,51 KB
    Sløyfeoperatører Sløyfeoperatorer brukes til å organisere gjentatte beregninger. For å organisere en sløyfe trenger du en variabel kalt en sløyfeparameter eller en sløyfekontrollvariabel. Enhver syklus består av: innledende innstillinger eller loop parameter initialisering blokk; loop bodies, det vil si de setningene som utføres flere ganger; syklus parameter modifikasjonsblokk; sjekke betingelsen for å gå ut av løkken, som kan plasseres enten foran løkkens kropp, så snakker de om en løkke med en forutsetning eller etter kroppen...
    2784. Betingede og utvalgserklæringer 16 KB
    Tilstandsoperatør If. Derfor kan du allerede skrive følgende oppgaveoperatorer: Koren:=Sqrtxy; Modul:=bsxy. For å implementere slike betingede hopp i Pascal, brukes If og Else-operatorene, samt Goto ubetinget hopp-operator. La oss se på If-utsagnet.

    Structure Query Language (SQL) ble opprettet som et resultat av utviklingen av relasjonsdatamodellen og er for tiden de facto språkstandarden relasjonell DBMS. SQL-språket i dag støttes av et stort antall DBMS av forskjellige typer.

    Navnet på SQL-språket uttales vanligvis "es-qu-el". Noen ganger brukes det mnemoniske navnet "See-Quel".

    SQL-språket gir brukeren (med minimal innsats fra hans side) følgende muligheter:

    Lag databaser og tabeller med full beskrivelse deres strukturer

    Utfør grunnleggende datamanipulasjonsoperasjoner: sette inn, endre, slette data

    Kjør både enkle og komplekse spørringer.

    SQL-språket er relasjonsmessig komplett.

    Strukturen og syntaksen til kommandoene er ganske enkle, og språket i seg selv er universelt, dvs. syntaksen og strukturen til kommandoene endres ikke når du flytter fra en DBMS til en annen.

    SQL-språket har to hovedkomponenter:

    DDL (Data Definition Language) for å definere databasestrukturer og kontrollere tilgang til data

    DML (Data Manipulation Language) språk designet for å hente og oppdatere data.

    SQL er et ikke-prosedyrespråk, noe som betyr at når du bruker det, må du spesifisere hvilken informasjon som skal innhentes, ikke hvordan den kan innhentes. SQL-kommandoer er vanlige engelske ord (SELECT, INSERT, etc.). La oss først se på SQL DML-setningene:

    SELECT - velge data fra databasen

    INSERT - setter inn data i en tabell

    OPPDATERING - oppdatering av data i en tabell

    SLETT - sletting av data fra en tabell

    SELECT-setning

    SELECT-setningen utfører handlinger som tilsvarer følgende operasjoner relasjonsalgebra: prøvetaking, projeksjon og tilkobling.

    Den enkleste SQL-spørringen som bruker den, ser slik ut:

    VELG kolonnenavn FRA tbl

    Etter nøkkelen ord velge følger en kommadelt liste over kolonner hvis data vil bli returnert som et resultat av spørringen. Fra nøkkelordet spesifiserer fra hvilken tabell (eller visning) dataene hentes.

    Resultatet av en utvalgsspørring er alltid en tabell kalt resultattabellen. Dessuten kan resultatene av en spørring utført ved hjelp av select-setningen brukes til å lage en ny tabell. Hvis resultatene av to spørringer til forskjellige bord har samme format, kan de kombineres til én tabell. Tabellen oppnådd som et resultat av en spørring kan også være gjenstand for ytterligere spørringer.

    For å velge alle kolonner og alle rader i en tabell, gjør du det VELG spørring* FRA tbl;

    Tenk på produkttabellen som inneholder informasjon om prisen på forskjellige typer Produkter:

    Be om resultat

    VELG * FRA Produkt;

    vil være hele produkttabellen.

    Du kan velge spesifikke tabellkolonner ved hjelp av en spørring

    SELECT col1, col2, …, coln FRA tbl;

    Så resultatet av forespørselen

    VELG Type, Pris FRA Produkt;

    det blir et bord

    Listen over kolonner i select-setningen brukes også hvis det er nødvendig å endre rekkefølgen på kolonnene i den resulterende tabellen:

    For å velge bare de tabellradene som tilfredsstiller visse begrensninger, brukes et spesielt nøkkelord, etterfulgt av en logisk betingelse. Hvis en post tilfredsstiller denne betingelsen, er den inkludert i resultatet. Ellers blir oppføringen forkastet.

    For eksempel å velge de produktene fra produkttabellen hvis pris tilfredsstiller prisbetingelsen<3200, можно осуществить, используя запрос

    VELG * FRA Produkt hvor Pris<3200;

    Hans resultat:

    Betingelsen kan sammensettes og kombineres med de logiske operatorene NOT , AND, OR, XOR, for eksempel: hvor id_ Pris>500 AND Price<3500. Допускается также использование выражений в условии: where Price>(1+1) og strengkonstanter: der navn= "autovekter".

    Ved å bruke BETWEEN var1 OG var2-konstruksjonen kan du sjekke om verdiene til et uttrykk faller innenfor området fra var1 til var2 (inkludert disse verdiene):

    VELG * FRA Produkt hvor Pris MELLOM 3000 OG 3500;

    I likhet med NOT MELLOM-operatoren, er det NOT IN-operatoren.

    Kolonnenavn spesifisert i SELECT-leddet kan gis nytt navn. Til dette brukes søkeordet AS, som imidlertid kan utelates, siden det er implisitt. For eksempel forespørsel

    VELG Type AS-modell, Type_id AS num FROM Produkt der Type_id =3

    vil returnere (aliasnavn skal skrives uten anførselstegn):

    LIKE-operatoren er designet for å sammenligne en streng med et mønster:

    VELG * FRA tbl hvor col_name LIKE "abc"

    Denne spørringen returnerer bare de postene som inneholder strengverdien abc i kolonnen col_name.

    Eksemplet har lov til å bruke to jokertegn: "_" og "%". Den første av dem erstatter ett vilkårlig tegn i malen, og det andre erstatter en sekvens av vilkårlige tegn. Så, "abc%" samsvarer med en hvilken som helst streng som begynner med abc, "abc_" samsvarer med en 4-tegnsstreng som begynner med abc, "%z" samsvarer med en hvilken som helst streng som slutter med z, og til slutt, "%z%" - sekvenser av tegn som inneholder z.

    Du kan finne alle poster i produkttabellen der Type-verdien begynner med bokstaven "a" slik:

    VELG * FRA Produkt der Skriv LIKE "a%";

    lastebilvekter

    Hvis søkestrengen inneholder et jokertegn, må du spesifisere escape-tegnet i ESCAPE-leddet. Dette kontrolltegnet må brukes i mønsteret før jokertegnet, noe som indikerer at jokertegnet skal behandles som et vanlig tegn. For eksempel, hvis du ønsker å finne alle verdier i et felt som inneholder tegnet "_", vil mønsteret "%_%" resultere i at alle poster fra tabellen returneres. I dette tilfellet skal malen skrives som følger:

    "%|_%" ESCAPE "|"

    For å sjekke verdien for samsvar med strengen "20%" kan du bruke følgende operatør:

    LIKE "20#%" ESCAPE "#"

    Operatoren IS NULL lar deg sjekke fraværet (tilstedeværelsen) av en NULL-verdi i feltene i en tabell. Bruk av vanlige sammenligningsoperatorer i disse tilfellene kan gi ukorrekte resultater fordi sammenligning med NULL-resultater i UKJENT. Derfor bør valgbetingelsen se slik ut:

    hvor col_name ER NULL, i stedet for hvor col_name=NULL.

    Standardvalgresultatet returnerer poster i samme rekkefølge som de er lagret i databasen. Hvis du vil sortere poster etter en av kolonnene, må du bruke ORDER BY-leddet, etterfulgt av navnet på den kolonnen:

    VELG * FRA tbl BESTILL ETTER col_name;

    Denne spørringen vil returnere poster i stigende rekkefølge etter attributtverdien col_name.

    Du kan også sortere poster etter flere kolonner. For å gjøre dette må navnene deres spesifiseres etter ORDER BY atskilt med komma:

    VELG * FRA tbl BESTILL ETTER col_name1, col_name2.

    Postene vil bli sortert etter feltet col_name1; hvis det er flere poster med en samsvarende verdi i kolonnen col_name1, vil de bli sortert etter feltet col_name2.

    Hvis du vil sortere postene i omvendt rekkefølge (for eksempel synkende etter dato), må du angi ORDER BY col_name DESC.

    For direkte sortering er det ASC-nøkkelordet, som er akseptert som standardverdi.

    Hvis prøveresultatet inneholder hundrevis eller tusenvis av poster, tar produksjonen og behandlingen betydelig tid.

    Derfor blir informasjon ofte delt inn i sider og presentert for brukeren i porsjoner. Paginering brukes ved å bruke grenseordet etterfulgt av antall oppføringer som skal vises. Følgende spørring henter de første 10 postene samtidig som den sorteres bakover i feltet col_name1:

    VELG * FRA tbl BESTILL ETTER col_name1 DESC LIMIT 10

    For å hente de neste 10 postene, bruk grenseordet med to verdier: den første angir posisjonen som resultatet skal skrives ut fra, og den andre angir antall poster som skal hentes:

    VELG * FRA tbl BESTILL ETTER col_name1 DESC LIMIT 10,10

    For å hente de neste 10 postene må du bruke LIMIT 20, 10-konstruksjonen.

    Og over tabellen data.

    SQL-språket kalles innebygd, fordi Det inneholder funksjonene til et fullverdig utviklingsspråk, og er fokusert på datatilgang, som et resultat av dette er en del av applikasjonsutviklingsverktøy. SQL-språkstandarder støtter programmeringsspråkene Pascal, Fortran, COBOL, C, etc.

    Finnes 2 metoder for å bruke innebygd SQL:

    • statisk språkbruk ( statisk SQL) – programteksten inneholder kall til SQL-funksjoner, som er inkludert i den kjørbare modulen etter kompilering.
    • dynamisk språkbruk ( dynamisk SQL) – dynamisk konstruksjon av SQL-funksjonskall og deres tolkning. For eksempel, kan du få tilgang til data fra en ekstern database under programkjøring.

    SQL-språket (som andre språk for å jobbe med databaser) er designet for å forberede og utføre spørringer. Som et resultat av å utføre en dataspørring fra en eller flere tabeller, oppnås et sett med poster, som kalles presentasjon.

    Definisjon 1

    Opptreden er en tabell som dannes som et resultat av å utføre en spørring.

    Grunnleggende SQL Query Language Operatorer

    SQL-språkoperatører er konvensjonelt delt inn i 2 underspråk:

    1. Datadefinisjonsspråk DDL;
    2. Datamanipulasjonsspråk DML.

    I tabellen er de merket med * spesifikke operatører Språk.

    La oss se på de viktigste SQL-setningene.

      Tabellopprettingserklæring:

      Navnet på tabellen som opprettes og navnet på minst én kolonne (felt) er obligatoriske operander. For kolonnenavnet må du spesifisere typen data som skal lagres i den.

      For individuelle felt kan du spesifisere tilleggsregler for å kontrollere verdiene som legges inn i dem. For eksempel, IKKE NULL indikerer at feltet ikke kan være tomt og må fylles ut med en verdi.

      Eksempel 1

      For å lage en tabell bøker bokkatalog, som inneholder feltene:

      type– type bok,

      Navn- boktittel,

      pris– pris på boka

      uttalelsen kan se slik ut:

      Operatør for å endre tabellstruktur:

      Når du endrer tabellstrukturen, kan du legge til ( LEGG TIL), endring ( ENDRE) eller slett ( MISTE) én eller flere tabellkolonner. Reglene for registrering av denne operatøren er de samme som for operatøren LAG BORD. For å slette en kolonne trenger du ikke spesifisere den.

      Eksempel 2

      For å legge til en tabell bøker Enger Antall, der antall bøker vil bli lagret, kan du skrive operatøren:

      Bordslippoperatør:

      Eksempel 3

      For eksempel å slette en eksisterende tabell med navn bøker det er nok å bruke operatøren:

      Operatør for opprettelse av indeks:

      Operatøren oppretter en indeks på én eller flere kolonner i en gitt tabell, noe som kan fremskynde spørrings- og oppslagsoperasjoner. Flere indekser kan opprettes for én tabell.

      Valgfritt alternativ UNIK er ansvarlig for å sikre at verdiene i alle kolonner som er spesifisert i setningen er unike.

      A.S.C. setter automatisk sortering av kolonneverdier i stigende rekkefølge (standard), og DESC– i synkende rekkefølge.

      Indeksslippoperatør:

      Vis opprettelsesoperatør:

      Når du oppretter en visning, trenger du ikke å angi kolonnenavn. Deretter vil kolonnenavnene fra spørringen, som er beskrevet av den tilsvarende operatøren, brukes PLUKKE UT.

      Se fjerningsoperatør:

      Rekordvalgsoperatør:

      Operatør PLUKKE UT utfører prøvetaking og beregninger på data fra en eller flere tabeller. Resultatet av å utføre operatøren er en responstabell som inneholder ( ALLE) eller inneholder ikke ( DISTINKT) linjer som gjentas.

      Operand FRA inneholder en liste over tabeller som poster hentes fra for datavalg.

      Operatør for postendring:

      Nye feltverdier i poster kan ikke inneholde verdier ( NULL) eller beregnet etter et aritmetisk uttrykk.

      Operatør for å sette inn nye poster:

      I den første operatørposten SETT INN Nye poster legges inn med spesifiserte verdier i kolonnene.

      I den andre operatørposten SETT INN nye rader legges inn, valgt fra en annen tabell gjennom en klausul PLUKKE UT.

      Operatør for sletting av poster:

      Som et resultat av å kjøre operatoren, slettes rader som tilfredsstiller betingelsen spesifisert av den valgfrie operanden fra den spesifiserte tabellen HVOR. Hvis operanden HVOR ikke er spesifisert, slettes alle tabelloppføringer.

    Og over tabellen data.

    SQL-språket kalles innebygd, fordi Det inneholder funksjonene til et fullverdig utviklingsspråk, og er fokusert på datatilgang, som et resultat av dette er en del av applikasjonsutviklingsverktøy. SQL-språkstandarder støtter programmeringsspråkene Pascal, Fortran, COBOL, C, etc.

    Finnes 2 metoder for å bruke innebygd SQL:

    • statisk språkbruk ( statisk SQL) – programteksten inneholder kall til SQL-funksjoner, som er inkludert i den kjørbare modulen etter kompilering.
    • dynamisk språkbruk ( dynamisk SQL) – dynamisk konstruksjon av SQL-funksjonskall og deres tolkning. For eksempel, kan du få tilgang til data fra en ekstern database under programkjøring.

    SQL-språket (som andre språk for å jobbe med databaser) er designet for å forberede og utføre spørringer. Som et resultat av å utføre en dataspørring fra en eller flere tabeller, oppnås et sett med poster, som kalles presentasjon.

    Definisjon 1

    Opptreden er en tabell som dannes som et resultat av å utføre en spørring.

    Grunnleggende SQL Query Language Operatorer

    SQL-språkoperatører er konvensjonelt delt inn i 2 underspråk:

    1. Datadefinisjonsspråk DDL;
    2. Datamanipulasjonsspråk DML.

    I tabellen er de merket med * spesifikke operatører Språk.

    La oss se på de viktigste SQL-setningene.

      Tabellopprettingserklæring:

      Navnet på tabellen som opprettes og navnet på minst én kolonne (felt) er obligatoriske operander. For kolonnenavnet må du spesifisere typen data som skal lagres i den.

      For individuelle felt kan du spesifisere tilleggsregler for å kontrollere verdiene som legges inn i dem. For eksempel, IKKE NULL indikerer at feltet ikke kan være tomt og må fylles ut med en verdi.

      Eksempel 1

      For å lage en tabell bøker bokkatalog, som inneholder feltene:

      type– type bok,

      Navn- boktittel,

      pris– pris på boka

      uttalelsen kan se slik ut:

      Operatør for å endre tabellstruktur:

      Når du endrer tabellstrukturen, kan du legge til ( LEGG TIL), endring ( ENDRE) eller slett ( MISTE) én eller flere tabellkolonner. Reglene for registrering av denne operatøren er de samme som for operatøren LAG BORD. For å slette en kolonne trenger du ikke spesifisere den.

      Eksempel 2

      For å legge til en tabell bøker Enger Antall, der antall bøker vil bli lagret, kan du skrive operatøren:

      Bordslippoperatør:

      Eksempel 3

      For eksempel å slette en eksisterende tabell med navn bøker det er nok å bruke operatøren:

      Operatør for opprettelse av indeks:

      Operatøren oppretter en indeks på én eller flere kolonner i en gitt tabell, noe som kan fremskynde spørrings- og oppslagsoperasjoner. Flere indekser kan opprettes for én tabell.

      Valgfritt alternativ UNIK er ansvarlig for å sikre at verdiene i alle kolonner som er spesifisert i setningen er unike.

      A.S.C. setter automatisk sortering av kolonneverdier i stigende rekkefølge (standard), og DESC– i synkende rekkefølge.

      Indeksslippoperatør:

      Vis opprettelsesoperatør:

      Når du oppretter en visning, trenger du ikke å angi kolonnenavn. Deretter vil kolonnenavnene fra spørringen, som er beskrevet av den tilsvarende operatøren, brukes PLUKKE UT.

      Se fjerningsoperatør:

      Rekordvalgsoperatør:

      Operatør PLUKKE UT utfører prøvetaking og beregninger på data fra en eller flere tabeller. Resultatet av å utføre operatøren er en responstabell som inneholder ( ALLE) eller inneholder ikke ( DISTINKT) linjer som gjentas.

      Operand FRA inneholder en liste over tabeller som poster hentes fra for datavalg.

      Operatør for postendring:

      Nye feltverdier i poster kan ikke inneholde verdier ( NULL) eller beregnet etter et aritmetisk uttrykk.

      Operatør for å sette inn nye poster:

      I den første operatørposten SETT INN Nye poster legges inn med spesifiserte verdier i kolonnene.

      I den andre operatørposten SETT INN nye rader legges inn, valgt fra en annen tabell gjennom en klausul PLUKKE UT.

      Operatør for sletting av poster:

      Som et resultat av å kjøre operatoren, slettes rader som tilfredsstiller betingelsen spesifisert av den valgfrie operanden fra den spesifiserte tabellen HVOR. Hvis operanden HVOR ikke er spesifisert, slettes alle tabelloppføringer.