Operatører med funktioner til SQL-sprogformål. DML-udsagn - datamanipulationsudsagn

Grundlæggende SQL-operatører.

SQL (Structured Query Language) strukturerede forespørgsler") - universel computersprog, bruges til at oprette, ændre og administrere data i relationelle databaser data. SQL-sproget er baseret på relationel algebra og er en samling af operatører.

Der er 4 grupper af operatører. Lad os overveje en gruppe af datamanipulationsoperatører (Data Manipulation Language, DML, SQL DML)

Datavalg

Datavalg er den mest almindelige operation, der udføres med ved hjælp af SQL. SELECT-sætningen er en af ​​de vigtigste sætninger på dette sprog, der bruges til at udvælge data. Syntaksen for denne operator er som følger:

VÆLG kolonne FRA tabel

SELECT-sætninger skal indeholde ordene SELECT og FROM; andre søgeord er valgfrie.

Nøgleordet SELECT efterfølges af information om, hvilke felter der skal inkluderes i det resulterende datasæt. En stjerne (*) angiver alle tabelfelter, for eksempel:

For at vælge en kolonne skal du bruge følgende syntaks:

SELECT Firma

Et eksempel på valg af flere kolonner ser sådan ud:

VÆLG firma, telefon, mail

For at angive navnene på de tabeller, hvorfra poster er valgt, skal du bruge søgeord FRA for eksempel:

VÆLG * FRA kunder

Denne forespørgsel returnerer alle felter fra tabellen Kunder.

Du kan bruge et WHERE-udtryk (valgfrit) til at filtrere resultaterne, der returneres af en SELECT-sætning

VÆLG * FRA produkter HVOR Kategori = 4

Du kan bruge forskellige udtryk i WHERE-sætningen,

WHERE udtryk1 [(OG | ELLER) udtryk2 ...]

For eksempel:

VÆLG * FRA produkter HVOR Kategori = 2 OG Postavshik > 10

VÆLG Navn, Pris FRA Produkter WHERE Kategori= 3 ELLER Pris< 50

Du kan bruge følgende operatorer:

< Меньше

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

<>Ikke lige

> mere

>= Større end eller lig med

ORDER BY-udtrykket (valgfrit) bruges til at sortere det resulterende datasæt efter en eller flere kolonner. Nøgleordene ASC (stigende) eller DESC (faldende) bruges til at bestemme sorteringsrækkefølgen. Som standard sorteres data i stigende rækkefølge.

Dataændring

Ud over at hente data kan SQL bruges til at opdatere og slette data, kopiere poster til andre tabeller og udføre andre handlinger. Nedenfor vil vi se på UPDATE-, DELETE- og INSERT-sætningerne, der bruges til at løse nogle af disse problemer.

OPDATERING erklæring

For at ændre værdier i en eller flere kolonner i en tabel skal du bruge UPDATE-sætningen. Syntaksen for denne operator er:

OPDATERING tabel SET kolonne1 = udtryk1 WHERE-kriterier

Udtrykket i SET-udtrykket kan være en konstant eller resultatet af en beregning. For at øge priserne på alle produkter, der koster mindre end 10 USD, kan du f.eks. køre følgende forespørgsel:

OPDATERING Produkter SÆT Pris = Pris * 1.1 HVOR Pris< 10

SLET erklæring

For at slette rækker fra tabeller skal du bruge DELETE-operatoren, hvis syntaks er:

SLET FRA tabel WHERE kriterier

Fjern alle produkter, der koster mindre end 100.

Syntaks SELECT erklæring har følgende form:

VÆLG<список атрибутов>/* FRA<список таблиц>

Firkantede parenteser angiver elementer, der muligvis ikke er til stede i anmodningen.

Liste over alle elever.

VÆLG * FRA studerende

VÆLG id_st, efternavn FRA elev

Bemærk, at hvis du tilføjer ORDER BY efternavnsklausulen til denne forespørgsel, vil listen blive sorteret efter efternavn. Som standard antages sortering at være i stigende rækkefølge. Ønskes faldende rækkefølge, tilføjes ordet DESC efter attributnavnet.

Vis en liste over karakterer, som en elev har modtaget med koden "1".

Giv en liste over koder for studerende, der har modtaget mindst én D eller C i eksamenerne.

I WHERE-sætningen kan du skrive et udtryk vha aritmetiske operatorer sammenligninger (<, >, etc.) og logiske operatorer (AND, OR, NOT) som i konventionelle programmeringssprog.

Sammen med sammenligningsoperatorer og logiske operatorer til at lave betingelser i SQL sprog(på grund af de særlige forhold i anvendelsesområdet) er der en række specielle operatører, der som regel ikke har nogen analoger på andre sprog. Disse er operatørerne:

  • IN – indgang i et bestemt sæt værdier;
  • MELLEM – indtræden i et bestemt værdiområde;
  • LIKE – mønstertilpasningstest;
  • ER NULL – tjek for en udefineret værdi.

IN-operatoren bruges til at kontrollere, om en værdi er inkluderet i et sæt. Ja, anmodning

giver det samme resultat som ovenstående forespørgsel (det vil vise identifikatorerne for alle ansøgere, der har modtaget mindst én D eller C i eksamenerne).

Det samme resultat kan opnås ved at bruge MELLEM-operatoren:

Angiv alle elever, hvis efternavn begynder med bogstavet A.

I dette tilfælde er det praktisk at bruge LIKE-operatoren.

LIKE-operatoren gælder udelukkende for tegnfelter og giver dig mulighed for at bestemme, om et felts værdi matcher et mønster. Mønsteret kan indeholde specialtegn:

_ (understregning) – erstatter ethvert enkelt tegn;

% (procenttegn) – erstatter en sekvens af et vilkårligt antal tegn.

Meget ofte er der behov for at beregne minimum-, maksimum- eller gennemsnitsværdier i kolonner. For eksempel skal du muligvis beregne din GPA. For at udføre sådanne beregninger giver SQL specielle aggregerede funktioner:

  • MIN - minimumsværdi i kolonne;
  • MAX – maksimal værdi i kolonnen;
  • SUM - summen af ​​værdierne i kolonnen;
  • AVG – gennemsnitsværdi i kolonnen;
  • COUNT – antallet af ikke-NULL-værdier i kolonnen.

Følgende forespørgsel beregner gennemsnittet af alle scores opnået af studerende i eksamener.

VÆLG AVG(mark) FRA mark_st

Naturligvis kan du bruge aggregerede funktioner sammen med WHERE-klausulen:

Denne forespørgsel vil beregne den gennemsnitlige score for en studerende med en kode på 100 baseret på resultaterne af alle eksamener, han har taget.

Denne forespørgsel vil beregne den gennemsnitlige score for studerende baseret på resultaterne af at bestå eksamen med kode 10. Ud over de diskuterede mekanismer

I den første del har vi allerede berørt DML-sproget lidt ved at bruge næsten hele sættet af dets kommandoer, med undtagelse af MERGE-kommandoen.

Jeg vil tale om DML i henhold til min sekvens udviklet på personlig erfaring. Undervejs vil jeg også forsøge at tale om de "glatte" steder, der er værd at fokusere på; disse "glatte" steder ligner hinanden i mange dialekter af SQL-sproget.

Fordi lærebogen er dedikeret til en bred vifte af læsere (ikke kun programmører), så vil forklaringen nogle gange være passende, dvs. lang og trættende. Dette er min vision for materialet, som hovedsageligt er opnået i praksis som følge af faglig aktivitet.

Hovedmålet med denne tutorial, trin for trin, er at udvikle en komplet forståelse af essensen af ​​SQL-sproget og lære dig, hvordan du korrekt anvender dets konstruktioner. Fagfolk inden for dette felt kan også være interesseret i at scrolle igennem dette materiale, måske vil de være i stand til at lære noget nyt for sig selv, eller måske vil det bare være nyttigt at læse for at genopfriske deres hukommelse. Jeg håber, at alle vil finde det interessant.

Fordi DML i MS SQL database dialekt er meget tæt forbundet med syntaksen af ​​SELECT konstruktionen, så jeg vil begynde at tale om DML med det. Efter min mening er SELECT-konstruktionen den vigtigste konstruktion i DML-sproget, fordi på grund af det eller dets dele, hentes de nødvendige data fra databasen.

DML-sproget indeholder følgende konstruktioner:

  • SELECT – datavalg
  • INSERT – indsættelse af nye data
  • OPDATERING – dataopdatering
  • SLET – sletning af data
  • FLET – datasammenfletning

I denne del vil vi kun se på den grundlæggende syntaks for SELECT-kommandoen, som ser sådan ud:

VÆLG kolonneliste eller * FRA kilde WHERE-filter ORDER BY sort_expression
Emnet for SELECT-sætningen er meget bredt, så i denne del vil jeg kun fokusere på dens grundlæggende strukturer. Jeg tror, ​​at uden at kende det grundlæggende godt, kan man ikke begynde at studere mere. komplekse strukturer, fordi så vil alt dreje sig om dette grundlæggende design (underforespørgsler, joinforbindelser osv.).

Som en del af denne del vil jeg også fortælle om TOP-tilbuddet. Jeg har med vilje ikke angivet denne sætning i den grundlæggende syntaks, fordi... det er implementeret forskelligt i forskellige SQL-dialekter.

Hvis DDL-sproget er mere statisk, dvs. med dens hjælp skabes stive strukturer (tabeller, relationer osv.), så er DML-sproget dynamisk af natur, her kan du få de rigtige resultater på forskellige måder.

Træningen vil også fortsætte i Step by Step mode, dvs. Når du læser, skal du straks prøve at fuldføre eksemplet med dine egne hænder. Derefter analyserer du det opnåede resultat og forsøger at forstå det intuitivt. Hvis noget forbliver uklart, for eksempel betydningen af ​​en funktion, så vend dig til internettet for at få hjælp.

Eksemplerne vil blive vist i Testdatabasen, som blev oprettet ved hjælp af DDL+DML i første del.

For dem, der ikke oprettede en database i første del (da ikke alle måske er interesserede i DDL-sproget), kan de bruge følgende script:

Test database oprettelse script

Oprettelse af en database CREATE DATABASE Test GO -- gør testdatabasen aktuel BRUG Test GO -- opret referencetabeller CREATE TABLE Positions(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Name nvarchar(30) NOT NULL) CREATE TABEL Afdelinger (ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Name nvarchar(30) NOT NULL) GO -- udfyld referencetabellerne med data SET IDENTITY_INSERT Positioner ON INSERT Positions(ID,Name)VALUES (1, N"Accountant" ), (2,N"Director"), (3,N"Programmer"), (4,N"Senior Programmer") SET IDENTITY_INSERT Positioner FRA GO SET IDENTITY_INSERT Afdelinger ON INSERT Afdelinger(ID,Navn)VÆRDIER (1,N "Administration"), (2,N"Accounting"), (3,N"IT") SET IDENTITY_INSERT Afdelinger OFF GO -- opret en tabel med medarbejdere OPRET TABEL Medarbejdere(ID int NOT NULL, Navn nvarchar( 30), Fødselsdato , E-mail nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME(), ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID_Employees PRIMARY KEY (ID_EmployeeDeparte) (ID_EmployeeDepartei) CES afdelinger( ID), CON STRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positioner(ID), CONSTRAINT FK_Employees_ManagerID UDENLANDSKE NØGLE (ManagerID) REFERENCES Medarbejdere(ID), CONSTRAINT UQ_Employees_Em OG 1999), INDEX IDX_Emp loyees_Name(Name)) GO - - udfyld det med data INSERT Medarbejdere (ID,Navn,Fødselsdag,E-mail,PositionID,DepartmentID,ManagerID)VALUES (1000,N"Ivanov I.I.","19550219"," [e-mailbeskyttet]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [e-mailbeskyttet]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [e-mailbeskyttet]",1,2,1000), (1003,N"Andreev A.A.","19820417"," [e-mailbeskyttet]",4,3,1000)

Det er det, nu er vi klar til at begynde at lære DML-sproget.

SELECT – datavalgsoperatør

Først og fremmest, for den aktive forespørgselseditor, lad os lave den aktuelle database Test ved at vælge den i rullelisten eller bruge kommandoen "USE Test".

Lad os starte med den mest grundlæggende form for SELECT:

VÆLG * FRA Medarbejdere
I denne forespørgsel beder vi om at returnere alle kolonner (angivet med et "*") fra tabellen Medarbejdere - du kan læse dette som "VÆLG alle_felter FRA medarbejdere_tabellen." Hvis der er et klynget indeks, vil de returnerede data højst sandsynligt blive sorteret efter det, i I dette tilfælde efter ID-kolonne (men dette er ikke vigtigt, da vi i de fleste tilfælde eksplicit vil angive sorteringen selv ved at bruge BESTIL EFTER ...):

ID Navn Fødselsdag E-mail Positions-ID Afdelings-ID Ansættelsesdato ManagerID
1000 Ivanov I.I. 1955-02-19 [e-mailbeskyttet] 2 1 2015-04-08 NUL
1001 Petrov P.P. 1983-12-03 [e-mailbeskyttet] 3 3 2015-04-08 1003
1002 Sidorov S.S. 1976-06-07 [e-mailbeskyttet] 1 2 2015-04-08 1000
1003 Andreev A.A. 1982-04-17 [e-mailbeskyttet] 4 3 2015-04-08 1000

Generelt er det værd at sige, at i MS SQL dialekten mest simpel form VÆLG forespørgsel indeholder muligvis ikke en FROM-blok, i hvilket tilfælde du kan bruge den til at få nogle værdier:

SELECT 5550/100*15, SYSDATETIME(), -- henter databasesystemets dato SIN(0)+COS(0)

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

Bemærk venligst, at udtrykket (5550/100*15) gav resultatet 825, selvom hvis vi regner på en lommeregner vil værdien være (832,5). Resultatet 825 blev opnået af den grund, at i vores udtryk er alle tallene heltal, derfor er resultatet et heltal, dvs. (5550/100) giver os 55, ikke (55,5).

Husk at følgende logik virker i MS SQL:

  • Heltal / Heltal = Heltal (dvs. i dette tilfælde forekommer heltalsdeling)
  • Real / Heltal = Real
  • Heltal / Real = Real
De der. resultatet konverteres til en større type, så i de sidste 2 tilfælde får vi et reelt tal (tænk ligesom i matematik - et interval af reelle tal mere rækkevidde heltal, så resultatet konverteres til det):

SELECT 123/10, -- 12 123./10, -- 12.3 123/10. -- 12.3
Her (123.) = (123.0), er det bare, at i dette tilfælde kan 0 kasseres og kun punktet tilbage.

Med andre aritmetiske operationer Den samme logik gælder, det er bare, at i tilfælde af opdeling er denne nuance mere relevant.

Vær derfor opmærksom på datatypen for numeriske kolonner. Hvis det er et heltal, og du skal have et rigtigt resultat, skal du bruge en transformation eller blot sætte en prik efter det tal, der er angivet som en konstant (123.).

Du kan bruge funktionen CAST eller KONVERTER til at konvertere felter. Lad os for eksempel bruge ID-feltet, det er af typen int:

SELECT ID, ID/100, -- heltals division vil forekomme her CAST(ID AS float)/100, -- brug CAST funktionen til at konvertere til float typen CONVERT(float,ID)/100, -- brug CONVERT funktionen at konvertere til typen float ID/100. -- brug transformation ved at angive, at nævneren er et reelt tal FRA medarbejdere

ID (Intet kolonnenavn) (Intet kolonnenavn) (Intet kolonnenavn) (Intet 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 seddel. I ORACLE-databasen er syntaks uden FROM-blok uacceptabel; til dette formål bruges DUAL-systemtabellen, som indeholder en linje:

VÆLG 5550/100*15, -- og i ORACLE vil resultatet være lig med 832,5 sysdate, sin(0)+cos(0) FRA DUAL


Bemærk. Tabelnavnet i mange RDB'er kan indledes med skemanavnet:

VÆLG * FRA dbo.Medarbejdere -- dbo – skemanavn

Et skema er en logisk enhed i en database, som har sit eget navn og giver dig mulighed for at gruppere databaseobjekter såsom tabeller, visninger osv. i sig selv.

Definitionen af ​​et skema i forskellige databaser kan variere; i nogle tilfælde er skemaet direkte relateret til databasebrugeren, dvs. i dette tilfælde kan vi sige, at skemaet og brugeren er synonymer, og at alle objekter, der er oprettet i skemaet, i det væsentlige er objekter given bruger. I MS SQL er et skema en uafhængig logisk enhed, der kan oprettes på egen hånd (se OPRET SKEMA).

Som standard oprettes et skema i MS SQL-databasen med navnet dbo (Database Owner), og det er det. skabte objekter som standard oprettes de i dette skema. Derfor, hvis vi blot angiver navnet på en tabel i en forespørgsel, vil den blive søgt i dbo-skemaet for den aktuelle database. Hvis vi vil oprette et objekt i et specifikt skema, skal vi også sætte objektnavnet foran skemanavnet, for eksempel "CREATE TABLE skemanavn.tabelnavn(...)".

I tilfælde af MS SQL navn skemaer kan også indledes med navnet på den database, hvori skemaet er placeret:

VÆLG * FRA Test.dbo.Employees -- databasenavn.skemanavn.tabel
Denne præcisering kan for eksempel være nyttig, hvis:

  • i én anmodning får vi adgang til objekter placeret i forskellige skemaer eller databaser
  • du skal overføre data fra et skema eller en database til en anden
  • er du i én database, skal du anmode om data fra en anden database
  • og så videre.
Et skema er et meget praktisk værktøj, som er nyttigt at bruge, når man udvikler databasearkitektur, især store databaser.

Glem heller ikke, at vi i anmodningsteksten kan bruge både enkeltlinjede “-- ...” og flerlinjede “/* ... */” kommentarer. Hvis anmodningen er stor og kompleks, kan kommentarer i høj grad hjælpe dig eller en anden, efter nogen tid, med at huske eller forstå dens struktur.

Hvis der er mange kolonner i tabellen, og især hvis der stadig er mange rækker i tabellen, plus hvis vi laver forespørgsler til databasen over netværket, så vil det være at foretrække at vælge med en direkte liste over de felter, du skal bruge, adskilt af kommaer:

VÆLG ID, Navn FRA medarbejdere

De der. her siger vi, at vi kun skal returnere ID- og Navn-felterne fra tabellen. Resultatet bliver som følger (forresten, optimeringsværktøjet her besluttede at bruge indekset oprettet af feltet Navn):

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

På en seddel. Nogle gange er det nyttigt at se på, hvordan data hentes, for eksempel for at finde ud af, hvilke indekser der bruges. Dette kan gøres ved at klikke på knappen "Vis estimeret udførelsesplan" eller ved at indstille "Inkluder faktisk udførelsesplan - Inkluder den faktiske forespørgselsudførelsesplan i resultatet" (i dette tilfælde vil vi kun kunne se den rigtige plan, hhv. efter at have udført anmodningen):

Udførelsesplananalyse er meget nyttig, når du optimerer en forespørgsel; den giver dig mulighed for at finde ud af, hvilke indekser der mangler, eller hvilke indekser der slet ikke bruges og kan fjernes.

Hvis du lige er begyndt at lære DML, så er dette nu ikke så vigtigt for dig, bare tag det til efterretning, og du kan roligt glemme det (måske får du aldrig brug for det) - vores oprindelige mål er at lære det grundlæggende i DML-sproget og lære at bruge dem korrekt, og optimering er allerede en særskilt kunst. Nogle gange er det vigtigere, at du blot har en korrekt skrevet forespørgsel, der returnerer det korrekte resultat fra et emnesynspunkt, og at enkelte personer allerede er i gang med at optimere den. Først skal du lære, hvordan du simpelthen skriver forespørgsler korrekt ved at bruge alle midler til at nå målet. hovedformålet Det, du nu skal opnå, er, at din forespørgsel returnerer de korrekte resultater.

Opsætning af tabelaliaser

Når du angiver kolonner, kan de indledes med navnet på tabellen placeret i FROM-blokken:

VÆLG Employees.ID, Employees.Name FRA Medarbejdere

Men denne syntaks er normalt ubelejlig at bruge, fordi tabelnavnet kan være langt. Til disse formål mere korte navne– aliaser:

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

SELECT emp.ID,emp.Name FROM Employees emp -- AS nøgleordet kan udelades (jeg foretrækker denne mulighed)

Her er emp et alias for tabellen Employees, som kan bruges i forbindelse med denne SELECT-sætning. De der. vi kan sige, at vi i forbindelse med denne SELECT-sætning giver tabellen et nyt navn.

Selvfølgelig vil forespørgselsresultaterne i dette tilfælde være nøjagtigt de samme som for "SELECT ID, Name FROM Employees". Hvorfor dette er nødvendigt vil blive klart senere (ikke engang i denne del), for nu husker vi bare, at kolonnenavnet kan indledes (afklares) enten direkte af tabelnavnet eller ved at bruge et alias. Her kan du bruge en af ​​to ting, dvs. Hvis du angiver et alias, skal du bruge det, men du kan ikke længere bruge tabelnavnet.

På en seddel. I ORACLE er kun muligheden for at angive et tabelalias uden AS nøgleordet tilladt.

DISTINCT – kassering af duplikerede rækker

Nøgleordet DISTINCT bruges til at kassere duplikerede rækker fra forespørgselsresultatet. Forestil dig groft sagt først at udføre en forespørgsel uden indstillingen DISTINCT og derefter kassere alle dubletter fra resultatet. Lad os demonstrere dette for større klarhed ved at bruge et eksempel:

Lad os oprette en midlertidig tabel til demonstration CREATE TABLE #Trash(ID int NOT NULL PRIMARY KEY, Col1 varchar(10), Col2 varchar(10), Col3 varchar(10)) - fill denne tabel alle slags affald INDSÆT #Trash(ID,Col1,Col2,Col3)VÆRDIER (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 ") -- lad os se, hvad forespørgslen returnerer uden DISTINCT SELECT-indstillingen Col1,Col2,Col3 FROM #Trash -- lad os se, hvad forespørgslen returnerer med DISTINCT SELECT-indstillingen DISTINCT Col1,Col2,Col3 FROM #Trash -- slet den midlertidige tabel DROP TABLE #Trash

Visuelt vil det se sådan ud (alle dubletter er markeret med samme farve):

Lad os nu se på, hvor dette kan anvendes, ved at bruge et mere praktisk eksempel - vi vender kun tilbage unikke identifikatorer afdelinger (dvs. vi finder ud af ID'erne for de afdelinger, hvor medarbejderne er registreret):

VÆLG DISTINCT DepartmentID FRA Medarbejdere

Her har vi 4 linjer, fordi... Der er ingen gentagne kombinationer (DepartmentID, PositionID) i vores tabel.

Lad os vende tilbage til DDL et øjeblik.

Da vi begynder at løbe tør for data til demo-eksempler, og vi ønsker at tale mere omfattende og tydeligt, lad os udvide vores Employess-tabel lidt. Lad os derudover huske lidt DDL, som de siger, "gentagelse er læringens moder," og plus, lad os springe lidt fremad igen og anvende UPDATE-sætningen:

Vi opretter nye kolonner ÆNDRINGSTABEL Medarbejdere ADD Efternavn nvarchar(30), -- efternavn Fornavn nvarchar(30), -- fornavn Mellemnavn nvarchar(30), -- mellemnavn Løn float, -- og selvfølgelig løn i nogle enheder BonusPercent float -- procentdel for beregning af bonus fra GO-lønnen -- udfyld dem med data (nogle data er med vilje udeladt) OPDATERING Medarbejdere SET Efternavn=N"Ivanov", FirstName=N"Ivan", MiddleName=N"Ivanovich", Løn=5000,BonusPercent= 50 HVOR ID=1000 -- Ivanov I.I. OPDATERING Medarbejdere SET Efternavn=N"Petrov",FirstName=N"Petr",MiddleName=N"Petrovich", Løn=1500,BonusPercent= 15 WHERE ID=1001 -- Petrov P.P. OPDATERING Medarbejdere SET Efternavn=N"Sidor",FirstName=N"Sidor",MiddleName=NULL, Løn=2500,BonusPercent=NULL WHERE ID=1002 -- Sidorov S.S. OPDATERING Medarbejdere SET Efternavn=N"Andreev",FirstName=N"Andrey",MiddleName=NULL, Løn=2000,BonusPercent= 30 WHERE ID=1003 -- Andreev A.A.

Lad os sikre os, at dataene blev opdateret korrekt:

VÆLG * FRA Medarbejdere

ID Navn Efternavn Fornavn Mellemnavn Løn BonusProcent
1000 Ivanov I.I. Ivanov Ivan Ivanovich 5000 50
1001 Petrov P.P. Petrov Peter Petrovich 1500 15
1002 Sidorov S.S. Sidorov Sidor NUL 2500 NUL
1003 Andreev A.A. Andreev Andrey NUL 2000 30

Indstilling af aliaser for forespørgselskolonner

Jeg tror, ​​det vil være lettere at vise her end at skrive:

VÆLG -- giv et navn til den beregnede kolonne Efternavn+" "+Fornavn+" "+Mellemnavn AS Fuldt navn, -- brug dobbelte anførselstegn, fordi plads er brugt HireDate AS " Dato for modtagelse", -- brug firkantede parenteser, fordi plads er brugt Fødselsdag AS [ Fødselsdato], -- ordet AS er ikke nødvendigt Løn ZP FRA Medarbejdere

Fulde navn Dato for modtagelse Fødselsdato ZP
Ivanov Ivan Ivanovich 2015-04-08 1955-02-19 5000
Petrov Petr Petrovich 2015-04-08 1983-12-03 1500
NUL 2015-04-08 1976-06-07 2500
NUL 2015-04-08 1982-04-17 2000

Som vi kan se, afspejles de kolonnealiaser, vi har angivet, i overskriften på den resulterende tabel. Faktisk er dette hovedformålet med kolonnealiaser.

Bemærk venligst, fordi de sidste 2 medarbejdere havde ikke et mellemnavn angivet (NULL-værdi), så returnerede resultatet af udtrykket "Efternavn+" "+Fornavn+" "+Mellemnavn" også NULL til os.

For at forbinde (tilføje, sammenkæde) strenge i MS SQL, bruges "+" symbolet.

Husk at alle udtryk, der involverer NULL (f.eks. division med NULL, tilføjelse med NULL) vil returnere NULL.

På en seddel.
I tilfælde af ORACLE bruges operatoren "||" til at sammenkæde strenge og sammenkædningen ville se ud som "Efternavn||" "||Fornavn||" "||Mellemnavn". For ORACLE er det værd at bemærke, at det har en undtagelse for strengtyper, for dem er NULL og den tomme streng "" det samme, så i ORACLE vil et sådant udtryk vende tilbage for de sidste 2 ansatte "Sidor Sidor" og "Andrey Andreev”. På tidspunktet for ORACLE 12c, så vidt jeg ved, er der ingen mulighed, der ændrer denne adfærd (hvis jeg tager fejl, så ret mig venligst). Her er det svært for mig at vurdere, om det er godt eller dårligt, fordi... I nogle tilfælde er opførselen af ​​en NULL-streng mere bekvem, som i MS SQL, og i andre, som i ORACLE.

I ORACLE er alle de ovennævnte kolonnealiasser også gyldige, undtagen [...].


For ikke at indhegne konstruktionen ved hjælp af ISNULL-funktionen, kan vi i MS SQL bruge CONCAT-funktionen. Lad os overveje og sammenligne 3 muligheder:

VÆLG Efternavn+" "+Fornavn+" "+Mellemnavn Fuldt Navn1, -- 2 muligheder for at erstatte NULL tomme linjer"" (vi får den samme adfærd som i ORACLE) ISNULL(Efternavn,"")+" "+ISNULL(Fornavn,"")+" "+ISNULL(Mellemnavn,"") Fuldt Navn2, CONCAT(Efternavn," ", Fornavn, " ", Mellemnavn) Fuldt Navn3 FRA medarbejdere

Fuldt navn1 Fuldt navn2 Fuldt navn3
Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich
Petrov Petr Petrovich Petrov Petr Petrovich Petrov Petr Petrovich
NUL Sidorov Sidor Sidorov Sidor
NUL Andreev Andrey Andreev Andrey

I MS SQL kan aliaser også angives med lighedstegnet:

SELECT "Reception date"=Lejedato, -- udover "..." og […] kan du bruge "..." [Fødselsdato]=Fødselsdag, ZP=Løn FRA medarbejdere

At bruge AS nøgleordet eller lighedstegnet til at angive et alias er nok mere en smagssag. Men når man analyserer andres anmodninger, kan denne viden være nyttig.

Til sidst vil jeg sige, at det er bedre at angive navne til aliaser kun ved at bruge latinske tegn og tal, undgå brugen af ​​"...", "..." og […], det vil sige bruge de samme regler, som vi brugte ved navngivning af tabeller . Yderligere vil jeg i eksemplerne kun bruge sådanne navne og ingen "...", "..." og […].

Grundlæggende SQL aritmetiske operatører


Udførelsesprioriteten for aritmetiske operatorer er den samme som i matematik. Om nødvendigt kan rækkefølgen af ​​operatørernes anvendelse ændres ved hjælp af parenteser - (a+b)*(x/(y-z)).

Og jeg gentager endnu en gang, at enhver operation med NULL producerer NULL, for eksempel: 10+NULL, NULL*15/3, 100/NULL - alt dette vil resultere i NULL. De der. Enkelt sagt kan en udefineret værdi ikke give et bestemt resultat. Tag dette i betragtning, når du sammensætter din forespørgsel, og håndter om nødvendigt NULL-værdier ved hjælp af funktionerne ISNULL og COALESCE:

VÆLG ID, Navn, Løn/100*BonusPercent AS Result1, -- uden at behandle NULL-værdier​Salary/100*ISNULL(BonusPercent,0) AS Result2, -- brug ISNULL-funktionen Løn/100*COALESCE(BonusPercent,0) SOM Resultat3 - - brug funktionen COALESCE FROM Employees

Jeg vil fortælle dig lidt om COALESCE-funktionen:

COALESCE (udtr1, udtr2, ..., udtrn) - Returnerer den første ikke-NULL-værdi fra en liste med værdier.

SELECT COALESCE(f1, f1*f2, f2*f3) val -- i dette tilfælde vil den tredje værdi blive returneret FRA (SELECT null f1, 2 f2, 3 f3) q

Jeg vil mest fokusere på at tale om DML-konstruktioner, og for det meste vil jeg ikke tale om de funktioner, der vil optræde i eksemplerne. Hvis du ikke forstår, hvad en bestemt funktion gør, så kig efter dens beskrivelse på internettet, du kan endda søge efter information efter gruppe af funktioner på én gang, for eksempel ved at spørge i Google søgning"FRK. SQL-strenge funktioner", "MS SQL matematiske funktioner" eller "MS SQL funktioner NULL-behandling." Der er meget information om funktioner, og du kan nemt finde det. For eksempel kan du i MSDN-biblioteket finde ud af mere om COALESCE-funktionen:

Klipning fra MSDN Sammenligning af COALESCE og CASE

COALESCE-udtrykket er en syntaktisk genvej til CASE-udtrykket. Dette betyder, at COALESCE(udtryk1,...n) omskrives af forespørgselsoptimeringsværktøjet som følgende CASE-udtryk:

CASE WHEN (udtryk1 ER IKKE NULL) SÅ udtryk1 NÅR (udtryk2 ER IKKE NULL) SÅ udtryk2 ... ELSE udtrykN SLUT

Lad os for eksempel se på, hvordan du kan bruge resten af ​​divisionen (%). Denne operatør meget nyttig, når du skal opdele poster i grupper. Lad os for eksempel trække alle medarbejdere ud, der har lige personalenumre (ID), dvs. disse ID'er, der er delelige med 2:

VÆLG ID,Navn FRA Medarbejdere WHERE ID%2=0 -- resten, når divideret med 2 er 0

BESTIL EFTER – sortering af forespørgselsresultatet

ORDER BY-udtrykket bruges til at sortere resultatet af en forespørgsel.

VÆLG Efternavn, Fornavn, Løn FRA Medarbejdere BESTIL EFTER Efternavn, Fornavn -- sorter resultatet efter 2 kolonner - efter Efternavn og derefter efter Fornavn

For en note. Der er et ASC nøgleord til sortering i stigende rækkefølge, men da stigende sortering er standard, kan du glemme denne mulighed (jeg kan ikke huske et tidspunkt, hvor jeg brugte denne mulighed).

Det er værd at bemærke, at i BESTILLINGS-klausul BY kan også bruges til felter, der ikke er opført i SELECT-sætningen (bortset fra det tilfælde, hvor DISTINCT bruges, som jeg vil diskutere nedenfor). Som et eksempel vil jeg løbe lidt frem ved at bruge TOP-muligheden og vise, hvordan du for eksempel kan udvælge 3 medarbejdere, der har den højeste løn, under hensyntagen til, at jeg af fortrolighedshensyn ikke bør vise selve lønnen:

VÆLG TOP 3 -- returner kun de første 3 poster fra hele resultat ID, Efternavn, Fornavn FRA Medarbejdere BESTIL EFTER Løn DESC -- sorter resultatet i faldende rækkefølge efter løn

ID Efternavn Fornavn
1000 Ivanov Ivan
1002 Sidorov Sidor

Selvfølgelig er der her tale om, at flere medarbejdere kan have samme løn, og det er svært at sige, hvilke tre medarbejdere, der bliver returneret denne anmodning, skal dette allerede løses med opgavelederen. Lad os sige, efter at have diskuteret denne opgave med lederen, accepterede og besluttede du at bruge følgende mulighed - at foretage yderligere sortering efter fødselsdatofeltet (dvs. vi værdsætter unge mennesker), og hvis fødselsdatoen for flere medarbejdere kan falde sammen (det er trods alt heller ikke udelukket), så kan du foretage en tredje sortering i faldende rækkefølge af ID-værdier (sidst i prøven vil være dem med det højeste ID - for eksempel dem, der blev accepteret sidst, lad os sige personalenumre udstedes sekventielt):

VÆLG TOP 3 -- returner kun de første 3 poster fra hele resultatet ID, Efternavn, Fornavn FRA Medarbejdere BESTIL EFTER Løn DESC, -- 1. sorter resultatet i faldende rækkefølge efter Løn fødselsdag, -- 2. derefter efter fødselsdato ID DESC -- 3 .og for fuldstændig utvetydighed af resultatet, tilføje sortering efter ID

De der. man bør forsøge at gøre resultatet af forespørgslen forudsigelig, så man i tilfælde af en udredning kan forklare, hvorfor netop disse personer kom med på ”den sorte liste”, dvs. alt blev valgt ærligt, efter de etablerede regler.

Du kan også sortere ved hjælp af forskellige udtryk i ORDER BY-sætningen:

VÆLG Efternavn, Fornavn FRA medarbejdere BESTIL VED KONCAT(Efternavn," ", Fornavn) -- brug udtrykket

Du kan også bruge aliaser angivet for kolonner i ORDER BY:

SELECT CONCAT(Efternavn," ",FirstName) fi FRA medarbejdere BESTIL AF fi -- brug et alias

Det er værd at bemærke, at når du bruger DISTINCT-udtrykket, er det kun de kolonner, der er angivet i SELECT-blokken, der kan bruges i ORDER BY-udtrykket. De der. efter at have anvendt DISTINCT-operationen får vi nyt sæt data med et nyt sæt kolonner. Af denne grund vil følgende eksempel ikke fungere:

VÆLG DISTINCT Efternavn, Fornavn, Løn FRA medarbejdere BESTIL EFTER ID -- ID er ikke i det resulterende sæt, vi fik med DISTINCT

De der. ORDER BY-klausulen anvendes på det resulterende sæt, før resultatet returneres til brugeren.

Note 1. Du kan også bruge numrene på de kolonner, der er angivet i SELECT i ORDER BY-sætningen:

VÆLG Efternavn,Fornavn,Løn FRA Medarbejdere BESTIL EFTER -- sorter i rækkefølge 3 DESC, -- 1. faldende Løn 1, -- 2. efter Efternavn 2 -- 3. efter Fornavn

For begyndere ser det praktisk og fristende ud, men det er bedre at glemme og aldrig bruge denne sorteringsmulighed.

Hvis i dette tilfælde (når felterne er eksplicit angivet), denne mulighed stadig er acceptabel, så er det i tilfælde af at bruge "*" bedre aldrig at bruge denne mulighed. Hvorfor - fordi hvis nogen f.eks. ændrer rækkefølgen af ​​kolonnerne i tabellen eller sletter kolonner (og det er en normal situation), kan din forespørgsel stadig fungere, men forkert, fordi sortering kan allerede udføres efter andre kolonner, og det er lumsk pga denne fejl bliver muligvis ikke afsløret meget snart.

Hvis søjlerne var eksplicit angivet, ville forespørgslen i ovenstående situation enten fortsætte med at fungere, men også korrekt (da alt er eksplicit defineret), eller det ville simpelthen give en fejl, der af denne kolonne eksisterer ikke.

Så du kan roligt glemme at sortere efter kolonnenumre.

Note 2.
I MS SQL, når du sorterer i stigende rækkefølge, vil NULL-værdier blive vist først.

VÆLG BonusPercent FRA Medarbejdere BESTIL EFTER BonusPercent

Derfor, når du bruger DESC, vil de være i slutningen

VÆLG BonusPercent FRA Medarbejdere BESTIL EFTER BonusPercent DESC

Hvis du har brug for at ændre logikken for sortering af NULL-værdier, så brug udtryk, for eksempel:

VÆLG BonusPercent FRA Medarbejdere BESTIL VED ISNULL(BonusPercent,100)

ORACLE giver to muligheder til dette formål: NULLS FIRST og NULLS LAST (bruges som standard). For eksempel:

VÆLG BonusPercent FRA Medarbejdere BESTIL EFTER BonusPercent DESC NULLS LAST

Vær opmærksom på dette, når du skifter til en bestemt database.

TOP – returner det angivne antal poster

Uddrag fra MSDN. TOP—Begrænser antallet af rækker, der returneres i forespørgselsresultatsættet, til et angivet antal eller procent. Når et TOP-udtryk bruges sammen med et ORDER BY-udtryk, er resultatsættet begrænset til de første N rækker af det sorterede resultat. Ellers returneres de første N rækker i uspecificeret rækkefølge.

Typisk bruges dette udtryk med en ORDER BY-klausul, og vi har allerede set på eksempler, hvor det var nødvendigt at returnere de første N rækker fra resultatsættet.

Uden ORDER BY bruges denne klausul normalt, når vi blot skal se på en for os ukendt tabel, som kan have mange poster, i dette tilfælde kan vi f.eks. bede om kun at returnere de første 10 rækker, men for klarhed vil vi kun sige 2:

VÆLG TOP 2 * FRA Medarbejdere

Du kan også angive ordet PERCENT for at returnere den tilsvarende procentdel af rækker fra resultatsættet:

VÆLG TOP 25 PROCENT * FRA Medarbejdere

I min praksis er stikprøvetagning efter antal rækker oftest brugt.

Du kan også bruge WITH BIES muligheden med TOP, som vil hjælpe med at returnere alle rækker i tilfælde af tvetydig sortering, dvs. denne sætning returnerer alle rækker, der er lige i sammensætning, til rækkerne, der falder ind under TOP N-udvælgelsen; som et resultat kan der vælges mere end N rækker. Lad os tilføje en anden "Programmer" med en løn på 1500 til demonstration:

INSERT Employees(ID,Name,Email,PositionID,DepartmentID,ManagerID,Løn) VALUES(1004,N"Nikolaev N.N."," [e-mailbeskyttet]",3,3,1003,1500)

Og lad os tilføje endnu en medarbejder uden at angive stillingen og afdelingen med en løn på 2000:

INSERT Medarbejdere(ID,Navn,E-mail,PositionID,DepartmentID,ManagerID,Løn) VALUES(1005,N"Alexandrov A.A."," [e-mailbeskyttet]",NULL,NULL,1000,2000)

Lad os nu vælge, ved hjælp af WITH TIES-muligheden, alle medarbejdere, hvis løn falder sammen med lønningerne for 3 ansatte, med den mindste løn (jeg håber, at det vil fremgå yderligere, hvad jeg går efter):

VÆLG TOP 3 MED BÅND ID,Navn,Løn FRA Medarbejdere BESTIL EFTER Løn

Her, selvom TOP 3 er angivet, returnerede anmodningen 4 poster, fordi Lønværdien, der gav TOP 3 (1500 og 2000) blev fundet hos 4 ansatte. Visuelt fungerer det sådan her:

På en seddel.
TOP er implementeret i forskellige databaser forskellige veje, i MySQL er der en LIMIT-klausul til dette, hvor du yderligere kan indstille startforskydningen.

I ORACLE 12c introducerede de også deres egen analog, der kombinerer funktionaliteten af ​​TOP og LIMIT - søg efter ordene "ORACLE OFFSET FETCH". Før version 12c blev pseudo-kolonnen ROWNUM typisk brugt til dette formål.


Hvad sker der, hvis du anvender DISTINCT- og TOP-klausulerne på samme tid? Sådanne spørgsmål kan nemt besvares ved at udføre eksperimenter. Generelt, vær ikke bange og vær ikke doven til at eksperimentere, fordi... Det meste læres gennem praksis. Ordrækkefølgen i SELECT-sætningen er som følger: DISTINCT kommer først, efterfulgt af TOP, dvs. Hvis du tænker logisk og læser fra venstre mod højre, så vil den første, der kasserer dubletter, blive anvendt, og så laves TOP baseret på dette sæt. Nå, lad os tjekke og sikre os, at dette er tilfældet:

VÆLG DISTINKT TOP 2 Løn FRA Medarbejdere BESTIL EFTER Løn

Løn
1500
2000

De der. som følge heraf fik vi de 2 mindste lønninger af alle. Der kan selvfølgelig være tilfældet, at lønnen for nogle medarbejdere måske ikke er specificeret (NULL), pga Ordningen giver os mulighed for dette. Afhængigt af opgaven beslutter vi os derfor for enten at behandle NULL-værdier i ORDER BY-klausulen eller blot kassere alle poster, for hvilke Salary er NULL, og for dette fortsætter vi med at studere WHERE-klausulen.

WHERE – rækkevalgstilstand

Denne sætning bruges til at filtrere poster efter givet tilstand. Lad os for eksempel vælge alle medarbejdere, der arbejder i "IT"-afdelingen (dens ID=3):

VÆLG ID,Efternavn,Fornavn,Løn FRA Medarbejdere WHERE DepartmentID=3 -- DET BESTILLES EFTER Efternavn,Fornavn

ID Efternavn Fornavn Løn
1004 NUL NUL 1500
1003 Andreev Andrey 2000
1001 Petrov Peter 1500

WHERE-sætningen er skrevet før ORDER BY-kommandoen.

Rækkefølgen for at anvende kommandoerne på det oprindelige medarbejdersæt er som følger:

  1. WHERE – hvis det er angivet, så er det første trin fra hele sættet af medarbejdere kun at vælge poster, der opfylder betingelsen
  2. DISTINCT – hvis det er angivet, kasseres alle dubletter
  3. BESTIL EFTER – hvis det er angivet, sorteres resultatet
  4. TOP – hvis det er angivet, returneres kun det angivne antal poster fra det sorterede resultat

Lad os se på et eksempel for klarhedens skyld:

VÆLG DISTINKT TOP 1 Løn FRA Medarbejdere HVOR Afdelings-ID=3 BESTIL EFTER Løn

Visuelt vil det se sådan ud:

Det er værd at bemærke, at kontrol for NULL ikke udføres med et lighedstegn, men ved at bruge operatorerne IS NULL og IS NOT NULL. Bare husk at du ikke kan sammenligne på NULL ved at bruge "=" (lighedstegn) operatoren, fordi resultatet af udtrykket vil også være lig med NULL.

Lad os f.eks. vælge alle medarbejdere, der ikke har en afdeling specificeret (dvs. afdelings-ID ER NULL):

VÆLG ID, Navn FRA Medarbejdere, HVOR afdelings-ID ER NULL

Lad os nu som et eksempel beregne bonussen for alle medarbejdere, der har angivet BonusPercent-værdien (dvs. BonusPercent ER IKKE NULL):

VÆLG ID, Navn, Løn/100*BonusPercent SOM bonus FRA medarbejdere, HVOR BonusPercent IKKE ER NULL

Ja, forresten, hvis du tænker over det, kan BonusPercent-værdien være lig med nul (0), og værdien kan også indtastes med et minustegn, fordi vi ikke har pålagt begrænsninger for dette felt.

Nå, efter at have fortalt om problemet, fik vi nu besked på at overveje, at hvis (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:

VÆLG ID, Navn, Løn/100*BonusPercent SOM Bonus FRA Medarbejdere, HVOR IKKE(BonusPercent<=0 OR BonusPercent IS NULL)

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

Dette udtryk kan også omskrives ved straks at sige "returner alle medarbejdere, der har en bonus" ved at udtrykke dette med udtrykket (BonusPercent>0 og BonusPercent ER IKKE NULL):

VÆLG ID, Navn, Løn/100*BonusPercent SOM bonus FRA medarbejdere, HVOR BonusPercent>0 OG BonusPercent IKKE ER NULL

Også i WHERE-blokken kan du kontrollere forskellige slags udtryk ved hjælp af aritmetiske operatorer og funktioner. For eksempel kan en lignende kontrol udføres ved hjælp af et udtryk med ISNULL-funktionen:

VÆLG ID,Navn,Løn/100*BonusPercent SOM bonus FRA medarbejdere, HVOR ISNULL(BonusPercent,0)>0

Booleske operatorer og simple sammenligningsoperatorer

Ja, vi kan ikke undvære matematik her, så lad os tage en kort udflugt til boolske og simple sammenligningsoperatorer.

Der er kun 3 boolske operatorer i SQL - AND, OR og NOT:

For hver boolsk operator kan du give sandhedstabeller, der yderligere viser, hvad resultatet vil være, når betingelserne kan være NULL:

Der er følgende simple operatører sammenligninger, der bruges til at danne betingelser:

Derudover er der 2 operatorer til at kontrollere en værdi/udtryk for NULL:

ER NULL Test for NULL-lighed
ER IKKE NULL Test for NULL ulighed

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

Når man bygger kompleks logiske udtryk parenteser bruges:

((betingelse1 OG betingelse2) ELLER IKKE(betingelse3 OG betingelse4 OG betingelse5)) ELLER (…)

Ved at bruge parenteser kan du også ændre standardrækkefølgen af ​​beregninger.

Her forsøgte jeg at give en idé om boolsk algebra i et volumen, der er tilstrækkeligt til arbejde. Som du kan se, for at skrive mere komplekse forhold kan du ikke undvære logik, men der er ikke meget af det her (OG, ELLER og IKKE), og det er opfundet af mennesker, så alt er ret logisk.

Lad os gå til slutningen af ​​anden del

Som du kan se, kan vi selv om den grundlæggende syntaks for SELECT-operatoren tale i meget lang tid, men for at holde mig inden for artiklens omfang vil jeg endelig vise yderligere logiske operatorer– MELLEM, IN og LIKE.

MELLEM – kontrollerer for inklusion i et interval

Test_værdi MELLEM startværdi OG slutværdi

Udtryk kan fungere som værdier.

Lad os se på et eksempel:

VÆLG ID, Navn, Løn FRA Medarbejdere HVOR Løn MELLEM 2000 OG 3000 -- som har en løn i intervallet 2000-3000

Faktisk er BETWEEN en forenklet notation af formen:

VÆLG ID, Navn, Løn FRA Medarbejdere HVOR Løn>=2000 OG Løn<=3000 -- все у кого ЗП в диапозоне 2000-3000

Ordet IKKE kan bruges før ordet BETWEEN, som vil kontrollere, om værdien ikke er inden for det angivne område:

VÆLG ID, Navn, Løn FRA Medarbejdere, HVOR Løn IKKE MELLEM 2000 OG 3000 -- svarer til NOT(Løn>=2000 OG Løn<=3000)

Derfor, hvis du bruger BETWEEN, IN, LIKE, kan du også kombinere dem med andre forhold ved at bruge OG og ELLER:

VÆLG ID, Navn, Løn FRA Medarbejdere HVOR Løn MELLEM 2000 OG 3000 -- som har en løn i intervallet 2000-3000 OG AfdelingsID=3 -- tag kun hensyn til medarbejdere i afdeling 3

IN – tjek for medtagelse i listen over værdier

Denne operatør har følgende form:

Test_værdi IN (værdi1, værdi2, ...)

Jeg tror, ​​det er nemmere at vise med et eksempel:

VÆLG ID, Navn, Løn FRA Medarbejdere WHERE PositionID IN(3,4) -- hvis stilling er 3 eller 4

De der. dette er grundlæggende det samme som følgende udtryk:

VÆLG ID, Navn, Løn FRA Medarbejdere WHERE PositionID=3 ELLER PositionID=4 -- hvis stilling er 3 eller 4

I tilfælde af IKKE vil det være ens (vi får alle undtagen dem fra afdeling 3 og 4):

VÆLG ID, Navn, Løn FRA Medarbejdere WHERE PositionID NOT IN(3,4) -- svarende til NOT(PositionID=3 OR PositionID=4)

En forespørgsel med NOT IN kan også udtrykkes ved hjælp af OG:

VÆLG ID, Navn, Løn FRA Medarbejdere HVOR StillingsID<>3OG PositionID<>4 -- svarende til PositionID NOT IN(3,4)

Bemærk venligst, at søgning efter NULL-værdier ved hjælp af IN-konstruktionen ikke vil fungere, fordi checking NULL=NULL vil også returnere NULL, ikke True:

SELECT ID,Name,DepartmentID FROM Employees WHERE DepartmentID IN(1,2,NULL) -- NULL-poster vil ikke blive inkluderet i resultatet

I dette tilfælde skal du opdele checken i flere betingelser:

VÆLG ID, Navn, Afdelings-ID FRA medarbejdere, HVOR Afdelings-ID IN(1,2) -- 1 eller 2 ELLER Afdelings-ID ER NULL -- eller NULL

Eller du kan skrive noget som:

VÆLG ID,Navn,AfdelingsID FRA Medarbejdere WHERE ISNULL(AfdelingID,-1) IN(1,2,-1) -- hvis du er sikker på, at der ikke er nogen afdeling med ID=-1

Jeg tror, ​​at den første mulighed, i dette tilfælde, vil være mere korrekt og pålidelig. Okay, dette er blot et eksempel for at demonstrere, hvilke andre strukturer der kan bygges.

Det er også værd at nævne en endnu mere snigende fejl forbundet med NULL, som kan laves ved brug af NOT IN-konstruktionen. Lad os for eksempel prøve at udvælge alle medarbejdere undtagen dem, hvis afdeling er 1, eller hvis afdeling slet ikke er angivet, dvs. er lig med NULL. Som en løsning foreslår følgende mulighed sig selv:

VÆLG ID, Navn, Afdelings-ID FRA medarbejdere, HVOR Afdelings-ID IKKE I(1,NULL)

Men efter at have udført forespørgslen, vil vi ikke modtage en eneste række, selvom vi forventede at se følgende:

Igen blev vittigheden her spillet af NULL angivet i listen over værdier.

Lad os se på, hvorfor der opstod en logisk fejl i dette tilfælde. Lad os udvide forespørgslen ved at bruge OG:

VÆLG ID, Navn, Afdelings-ID FRA Medarbejdere HVOR Afdelings-ID<>1 OG AfdelingsID<>NULL -- problemet skyldes dette NULL-tjek - denne betingelse vil altid returnere NULL

Rigtig stand (afdelings-ID<>NULL) vil altid give os usikkerhed her, dvs. NUL. Husk nu sandhedstabellen for AND-operatoren, hvor (TRUE AND NULL) giver NULL. De der. når den venstre betingelse er opfyldt (afdelings-ID<>1) på grund af en udefineret ret betingelse, vil vi ende med en udefineret værdi for hele udtrykket (afdelings-ID<>1 OG AfdelingsID<>NULL), så strengen vil ikke blive inkluderet i resultatet.

Betingelsen kan omskrives korrekt som følger:

VÆLG ID, Navn, Afdelings-ID FRA Medarbejdere HVOR Afdelings-ID IKKE I(1) -- eller i dette tilfælde blot Afdelings-ID<>1 OG afdelings-ID ER IKKE NULL - og tjek separat for IKKE NULL

IN kan også bruges med underforespørgsler, men vi vender tilbage til denne formular i efterfølgende dele af denne vejledning.

LIKE – kontrol af en streng ved hjælp af et mønster

Jeg vil kun tale om denne operatør i sin enkleste form, som er en standard og understøttes af de fleste dialekter i SQL-sproget. Selv i denne form kan den bruges til at løse mange problemer, der kræver kontrol af indholdet af en streng.

Denne operatør har følgende form:

Test_streng SOM string_pattern

Følgende specialtegn kan bruges i "pattern_string":

  1. Understregningen "_" betyder, at ethvert enkelt tegn kan tage dets plads
  2. Procenttegnet "%" - siger, at det kan erstattes af et hvilket som helst antal tegn, inklusive ingen
Lad os se på eksempler med "%"-symbolet (i praksis bruges det forresten oftere):

VÆLG ID, Navn FRA Medarbejdere WHERE Navn LIKE "Pet%" -- hvis navn begynder med bogstaverne "Pet" VÆLG ID, Efternavn FRA Medarbejdere WHERE Efternavn SOM "%ov" -- hvis efternavn slutter med "ov" SELECT ID, Efternavn FRA Medarbejdere WHERE Efternavn SOM "%re%" -- hvis efternavn indeholder kombinationen "re"

Lad os se på eksempler med symbolet "_":

VÆLG ID,Efternavn FRA Medarbejdere WHERE Efternavn LIKE "_etrov" -- hvis efternavn består af et hvilket som helst fortegn og efterfølgende bogstaver "etrov" VÆLG ID, Efternavn FRA Medarbejdere WHERE Efternavn SOM "____ov" -- hvis efternavn består af fire vilkårlige tegn og efterfølgende bogstaver "ov"

Ved at bruge ESCAPE kan du angive et escape-tegn, der annullerer kontroleffekten af ​​specialtegnene "_" og "%". Denne klausul bruges, når du direkte vil tjekke for et procenttegn eller en understregning i en streng.

For at demonstrere ESCAPE, lad os lægge skrald i én indgang:

OPDATERING Medarbejdere SET FirstName="Dette er papirkurven indeholdende %" WHERE ID=1005

Og lad os se, hvad de følgende forespørgsler returnerer:

VÆLG * FRA Medarbejdere HVOR Fornavn SOM "%!%%" ESCAPE "!" -- Linjen indeholder "%"-tegn VÆLG * FRA Medarbejdere HVOR Fornavn SOM "%!_%" ESCAPE "!" -- Linjen indeholder "_"-tegn

Hvis du har brug for at tjekke en streng for en komplet match, så i stedet for LIKE er det bedre blot at bruge "=" tegnet:

VÆLG * FRA Medarbejdere WHERE Fornavn="Peter"

På en seddel.
I MS SQL, i LIKE operator skabelonen, kan du også angive en søgning ved hjælp af regulære udtryk; læs om det på internettet, hvis standardfunktionerne for denne operator ikke er nok for dig.

ORACLE bruger REGEXP_LIKE-funktionen til at søge ved hjælp af regulære udtryk.

Lidt om strenge

I tilfælde af at kontrollere en streng for tilstedeværelsen af ​​Unicode-tegn, skal du placere tegnet N før anførselstegnene, dvs. N"...". Men da alle tegnfelter i vores tabel er i Unicode-format (nvarchar-type), kan du altid bruge dette format til disse felter. Eksempel:

VÆLG ID,Navn FRA Medarbejdere WHERE Navn LIKE N"Pet%" VÆLG ID,Efternavn FRA Medarbejdere WHERE Efternavn=N"Petrov"

Når det er gjort korrekt, når du sammenligner med et felt af typen varchar (ASCII), bør du prøve at bruge test ved hjælp af "...", og når du sammenligner et felt med typen nvarchar (Unicode), bør du prøve at bruge test ved hjælp af N" ...". Dette gøres for at undgå implicitte typekonverteringer under udførelse af forespørgsler. Vi bruger den samme regel, når vi indsætter (INSERT) værdier i et felt eller opdaterer dem (UPDATE).

Når du sammenligner strenge, er det værd at overveje, at afhængigt af databaseindstillingerne (sortering) kan strengsammenligning enten være ufølsom (når "Petrov" = "PETROV") eller store og små bogstaver (når "Petrov"<>"PETROV").
Hvis der er tale om en indstilling, der skelner mellem store og små bogstaver, kan du, hvis du vil foretage en søgning, der skelner mellem store og små bogstaver, f.eks. forhåndskonvertere højre og venstre udtryk til ét bogstav - øvre eller nedre:

VÆLG ID,Navn FRA Medarbejdere WHERE UPPER(Navn) LIKE UPPER(N"Pet%") -- eller LOWER(Navn) LIKE LOWER(N"Pet%") VÆLG ID,Efternavn FRA Medarbejdere WHERE UPPER(Efternavn)=UPPER( N"Petrov") -- eller LOWER(Efternavn)=LOWER(N"Petrov")

Lidt om datoer

Når du tjekker efter en dato, kan du som med strenge bruge enkelte anførselstegn "...".

Uanset regionale indstillinger i MS SQL kan du bruge følgende datosyntaks "ÅÅÅÅMMDD" (år, måned, dag sammen uden mellemrum). MS SQL vil altid forstå dette datoformat:

VÆLG ID, Navn, Fødselsdag FRA Medarbejdere HVOR Fødselsdag MELLEM "19800101" OG "19891231" -- ansatte i 80'erne BESTIL EFTER Fødselsdag

I nogle tilfælde er det mere praktisk at indstille datoen ved hjælp af DATEFROMPARTS-funktionen:

VÆLG ID, Navn, Fødselsdag FRA Medarbejdere HVOR Fødselsdag MELLEM DATEFROMPARTS(1980,1,1) OG DATEFROMPARTS(1989,12,31) BESTIL EFTER Fødselsdag

Der er også en lignende funktion DATETIMEFROMPARTS, som bruges til at indstille dato og klokkeslæt (for datetime-typen).

Du kan også bruge funktionen KONVERTER, hvis du har brug for at konvertere en streng til en dato- eller datotidsværdi:

VÆLG KONVERTER(dato,"12.03.2015",104), KONVERTER(datotid,"2014-11-30 17:20:15",120)

Værdierne 104 og 120 angiver, hvilket datoformat der er brugt i strengen. Du kan finde en beskrivelse af alle gyldige formater i MSDN-biblioteket ved at søge efter "MS SQL CONVERT".

Der er mange funktioner til at arbejde med datoer i MS SQL, se efter "ms sql-funktioner til at arbejde med datoer."

Bemærk. Alle dialekter i SQL-sproget har deres eget sæt funktioner til at arbejde med datoer og anvende deres egen tilgang til at arbejde med dem.

Lidt om tal og deres transformationer

Oplysningerne i dette afsnit vil sandsynligvis være mere nyttige for it-specialister. Hvis du ikke er en, og dit mål simpelthen er at lære at skrive forespørgsler for at få de oplysninger, du har brug for fra databasen, så har du måske ikke brug for sådanne finesser, men under alle omstændigheder kan du hurtigt gå gennem teksten og tage noter , fordi. Hvis du er begyndt at studere SQL, så er du allerede i gang med IT.

I modsætning til CAST-konverteringsfunktionen kan du angive en tredje parameter i CONVERT-funktionen, som er ansvarlig for konverteringsstilen (formatet). Forskellige datatyper kan have deres eget sæt stilarter, som kan påvirke det returnerede resultat. Vi har allerede berørt brugen af ​​stilarter, når vi overvejer konvertering af en streng ved hjælp af KONVERTER-funktionen til dato- og dato- og klokkeslætstyper.

Du kan læse mere om CAST, CONVERT funktioner og stilarter i MSDN - "CAST and CONVERT Functions (Transact-SQL)": msdn.microsoft.com/ru-ru/library/ms187928.aspx

For at forenkle eksemplerne vil Transact-SQL-sprogsætningerne DECLARE og SET blive brugt her.

Selvfølgelig, i tilfælde af at konvertere et heltal til et reelt tal (som jeg gav i begyndelsen af ​​denne lektion, for at demonstrere forskellen mellem heltal og reel division), er viden om nuancerne i konverteringen ikke så kritisk, fordi der lavede vi en heltal til reel konvertering (hvis rækkevidden er meget større end rækkevidden af ​​heltal):

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

Måske var det ikke værd at specificere metoden for den implicitte konvertering opnået ved at dividere med (1.), fordi Det er tilrådeligt at forsøge at udføre eksplicitte konverteringer for at få større kontrol over den opnåede type resultat. Selvom vi ønsker at få et resultat af typen numerisk med et specificeret antal cifre efter decimaltegnet, så kan vi bruge et trick i MS SQL til at gange en heltalværdi med (1., 1.0, 1.00 osv.) :

DECLARE @int int SET @int=123 VÆLG @int*1., -- numeric(12, 0) - 0 decimaler @int*1.0, -- numeric(13, 1) - 1 decimal @int*1.00, -- numeric(14, 2) - 2 tegn -- selvom det nogle gange er bedre at udføre en eksplicit 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 nogle tilfælde kan detaljerne i konverteringen være rigtig vigtige, fordi... de påvirker rigtigheden af ​​det opnåede resultat, f.eks. i det tilfælde, hvor der foretages en konvertering fra en numerisk værdi til en streng (varchar). Lad os se på eksempler på at konvertere penge og flydende værdier til varchar:

Adfærd ved konvertering af penge til varchar DECLARE @money money SET @money = 1025.123456789 -- der vil være en implicit konvertering til 1025.1235, fordi pengetypen gemmer kun 4 cifre efter decimaltegnet VÆLG @penge, -- 1025.1235 -- som standard opfører CAST og KONVERT sig det samme (dvs. groft sagt anvendes stil 0) CAST(@penge som varchar(20)) , -- 1025.12 KONVERTER(varchar(20), @penge), -- 1025.12 KONVERTER(varchar(20), @penge, 0), -- 1025.12 (stil 0 - ingen tusindedele separator og 2 decimaler (standardformat)) KONVERTER( varchar(20), @penge, 1), -- 1.025.12 (stil 1 - bruger en tusindedele separator og 2 decimaler) KONVERTER(varchar(20), @penge, 2) -- 1025.1235 (stil 2 - ingen separator og 4 tal efter decimaltegnet)

Opførsel ved konvertering af float til varchar DECLARE @float1 float SET @float1 = 1025.123456789 DECLARE @float2 float SET @float2 = 1231025.123456789 SELECT @float1, -- 1025.12345 @ 4120 @ 5.210 @ 5.210 @ 5.210 79 -- Som standard opfører CAST og CONVERT det samme ( dvs. groft sagt bruges stil 0) -- stilart 0 - Ikke mere end 6 cifre. Eksponentiel notation bruges af nødvendighed -- der sker virkelig skræmmende ting her, når der konverteres 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 - Altid 8 cifre. Videnskabelig notation for tal bruges altid. -- denne stil for float er heller ikke særlig nøjagtig CONVERT(varchar(20), @float1, 1), -- 1,0251235e+003 CONVERT(varchar(20), @float2, 1), -- 1,2310251e+006 - - stil 2 - Altid 16 bit. Videnskabelig notation for tal bruges altid. -- her er nøjagtigheden bedre CONVERT(varchar(30), @float1, 2), -- 1,025123456789000e+003 - OK CONVERT(varchar(30), @float2, 2) -- 1,231025123456789e+006 - OK

Som det fremgår af eksemplet, flyder flydende typer, reelle i nogle tilfælde kan faktisk skabe en stor fejl, især når de konverteres til en streng og tilbage (dette kan ske med forskellige typer integrationer, når data f.eks. overføres i tekstfiler fra et system til et andet).

Hvis du eksplicit skal kontrollere præcision op til et bestemt fortegn, mere end 4, så er det nogle gange bedre at bruge decimal-/numerisk type til at gemme data. Hvis 4 tegn er nok, så kan du bruge pengetypen - den svarer cirka til numerisk(20,4).

Decimal og numerisk DECLARE @money money SET @money = 1025.123456789 -- 1025.1235 DECLARE @float1 float SET @float1 = 1025.123456789 DECLARE @float2 float SET @2 er10,9 DECLARE @2 er 3 DEKL. ic(28,9) SET @numeric = 1025.123456789 VÆLG CAST ( @numerisk som varchar(20)), -- 1025.12345679 KONVERTER(varchar(20), @numeric), -- 1025.12345679 CAST(@penge som numerisk(28,9)), -- 1025.123500000 CAST(@numeric( 28 ,9)), -- 1025.123456789 CAST(@float2 som numerisk(28,9)) -- 1231025.123456789

Bemærk.
Siden version MS SQL 2008 kan du bruge følgende konstruktion i stedet:
  • ms sql server
  • Tilføj tags

    Structure Query Language (SQL) blev skabt som et resultat af udviklingen af ​​den relationelle datamodel og er i øjeblikket det de facto standardsprog for relationelle DBMS'er. SQL-sproget i dag understøttes af et stort antal DBMS af forskellige typer.

    Navnet på SQL-sproget udtales normalt "es-qu-el". Nogle gange bruges det mnemoniske navn "See-Quel".

    SQL-sproget giver brugeren (med minimal indsats fra hans side) følgende muligheder:

    Opret databaser og tabeller med en komplet beskrivelse af deres struktur

    Udfør grundlæggende datamanipulationsoperationer: indsættelse, ændring, sletning af data

    Kør både enkle og komplekse forespørgsler.

    SQL-sproget er relationelt komplet.

    Strukturen og syntaksen af ​​dens kommandoer er ret enkel, og sproget i sig selv er universelt, dvs. syntaksen og strukturen af ​​dets kommandoer ændres ikke, når man flytter fra et DBMS til et andet.

    SQL-sproget har to hovedkomponenter:

    DDL (Data Definition Language) til at definere databasestrukturer og kontrollere adgangen til data

    DML (Data Manipulation Language) sprog designet til at hente og opdatere data.

    SQL er et ikke-proceduresprog, hvilket betyder, at når du bruger det, skal du angive, hvilke oplysninger der skal indhentes, ikke hvordan de kan opnås. SQL-kommandoer er almindelige engelske ord (SELECT, INSERT osv.). Lad os først se på SQL DML-sætningerne:

    SELECT - valg af data fra databasen

    INSERT - indsættelse af data i en tabel

    OPDATERING - opdatering af data i en tabel

    SLET - sletning af data fra en tabel

    SELECT erklæring

    SELECT-operatoren udfører handlinger svarende til følgende relationelle algebra-operationer: udvælgelse, projektion og joinforbindelse.

    Den enkleste SQL-forespørgsel, der bruger den, ser sådan ud:

    VÆLG kolonnenavn FRA tbl

    Det udvalgte søgeord efterfølges af en kommasepareret liste over kolonner, hvis data vil blive returneret af forespørgslen. Fra nøgleordet angiver fra hvilken tabel (eller visning) dataene hentes.

    Resultatet af en udvalgt forespørgsel er altid en tabel kaldet resultattabellen. Desuden kan resultaterne af en forespørgsel udført ved hjælp af select-sætningen bruges til at oprette en ny tabel. Hvis resultaterne af to forespørgsler på forskellige tabeller har samme format, kan du kombinere dem til én tabel. Tabellen opnået som et resultat af en forespørgsel kan også være genstand for yderligere forespørgsler.

    For at vælge alle kolonner og alle rækker i en tabel, skal du blot udstede en SELECT * FROM tbl;

    Overvej produkttabellen, som indeholder prisoplysninger for forskellige typer produkter:

    Anmod om resultat

    VÆLG * FRA Produkt;

    vil være hele produkttabellen.

    Du kan vælge specifikke tabelkolonner ved hjælp af en forespørgsel

    SELECT col1, col2, … , coln FRA tbl;

    Altså resultatet af anmodningen

    VÆLG Type, Pris FRA Produkt;

    der vil være et bord

    Listen over kolonner i select-sætningen bruges også, hvis det er nødvendigt at ændre rækkefølgen af ​​kolonnerne i den resulterende tabel:

    For kun at vælge de tabelrækker, der opfylder visse begrænsninger, bruges et særligt nøgleord efterfulgt af en logisk betingelse. Hvis en post opfylder denne betingelse, indgår den i resultatet. Ellers kasseres posten.

    For eksempel at vælge de produkter fra produkttabellen, hvis pris opfylder prisbetingelsen<3200, можно осуществить, используя запрос

    VÆLG * FRA Produkt hvor Pris<3200;

    Hans resultat:

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

    Brug af BETWEEN var1 OG var2-konstruktionen giver dig mulighed for at kontrollere, om værdierne af et udtryk falder inden for området fra var1 til var2 (inklusive disse værdier):

    VÆLG * FRA Produkt hvor Pris MELLEM 3000 OG 3500;

    I lighed med NOT MELLEM operatoren er der NOT IN operatoren.

    Kolonnenavne angivet i SELECT-sætningen kan omdøbes. Hertil bruges AS nøgleordet, som dog kan udelades, da det er implicit underforstået. For eksempel anmodning

    SELECT Type AS model, Type_id AS num FROM Produkt hvor Type_id =3

    vender tilbage (aliasnavne skal skrives uden anførselstegn):

    LIKE-operatoren er designet til at sammenligne en streng med et mønster:

    VÆLG * FRA tbl hvor col_name SOM "abc"

    Denne forespørgsel returnerer kun de poster, der indeholder strengværdien abc i kolonnen kolonnenavn.

    Eksemplet må bruge to jokertegn: "_" og "%". Den første af dem erstatter et vilkårligt tegn i skabelonen, og den anden erstatter en sekvens af vilkårlige tegn. Så "abc%" matcher enhver streng, der starter med abc, "abc_" matcher en 4-tegns streng, der starter med abc, "%z" matcher enhver streng, der slutter med z, og endelig "%z%" - sekvenser af tegn, der indeholder z.

    Du kan finde alle poster i produkttabellen, hvor Type-værdien begynder med bogstavet "a" således:

    VÆLG * FRA Produkt hvor skriv LIKE "a%";

    lastbilvægte

    Hvis søgestrengen indeholder et jokertegn, skal du angive escape-tegnet i ESCAPE-sætningen. Dette kontroltegn skal bruges i mønsteret før jokertegnet, hvilket indikerer, at jokertegnet skal behandles som et almindeligt tegn. For eksempel, hvis du skulle søge efter alle værdier i et felt, der indeholdt tegnet "_", så ville mønsteret "%_%" resultere i, at alle poster fra tabellen blev returneret. I dette tilfælde skal skabelonen skrives som følger:

    "%|_%" ESCAPE "|"

    For at kontrollere værdien for overholdelse af strengen "20%" kan du bruge følgende operator:

    LIKE "20#%" ESCAPE "#"

    Operatoren IS NULL giver dig mulighed for at kontrollere fraværet (tilstedeværelsen) af en NULL-værdi i felterne i en tabel. Brug af almindelige sammenligningsoperatorer i disse tilfælde kan give ukorrekte resultater, fordi sammenligning med NULL resultater i UNKNOWN. Derfor skal udvælgelsesbetingelsen se sådan ud:

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

    Standardudvælgelsesresultatet returnerer poster i samme rækkefølge, som de er gemt i databasen. Hvis du vil sortere poster efter en af ​​kolonnerne, skal du bruge ORDER BY-sætningen efterfulgt af navnet på den kolonne:

    VÆLG * FRA tbl BESTIL EFTER col_name;

    Denne forespørgsel returnerer poster i stigende rækkefølge efter attributværdien col_name.

    Du kan også sortere poster efter flere kolonner. For at gøre dette skal deres navne angives efter ORDER BY adskilt af kommaer:

    VÆLG * FRA tbl BESTIL EFTER col_name1, col_name2.

    Poster vil blive sorteret efter feltet col_name1; hvis der er flere poster med en matchende værdi i kolonnen col_name1, vil de blive sorteret efter feltet col_name2.

    Hvis du vil sortere posterne i omvendt rækkefølge (f.eks. faldende efter dato), skal du angive ORDER BY col_name DESC.

    Til direkte sortering er der nøgleordet ASC, som accepteres som standardværdi.

    Hvis prøveresultatet indeholder hundredvis eller tusindvis af poster, tager deres output og behandling betydelig tid.

    Derfor er information ofte opdelt i sider og præsenteret for brugeren i portioner. Paginering bruges ved at bruge grænseordet efterfulgt af antallet af poster, der skal vises. Følgende forespørgsel henter de første 10 poster, mens den samtidig sorterer baglæns i feltet col_name1:

    VÆLG * FRA tbl BESTIL EFTER col_name1 DESC LIMIT 10

    For at hente de næste 10 poster skal du bruge nøgleordet limit med to værdier: den første angiver den position, hvorfra resultatet skal udskrives, og den anden angiver antallet af poster, der skal hentes:

    VÆLG * FRA tbl BESTIL EFTER col_name1 DESC LIMIT 10,10

    For at hente de næste 10 poster skal du bruge LIMIT 20, 10 konstruktionen.

    Og over tabellen data.

    SQL-sproget kaldes indbygget, fordi Det indeholder funktionerne i et fuldgyldigt udviklingssprog og er fokuseret på dataadgang, som et resultat af det er en del af applikationsudviklingsværktøjer. SQL-sprogstandarder understøtter programmeringssprogene Pascal, Fortran, COBOL, C osv.

    Eksisterer 2 metoder til at bruge Embedded SQL:

    • statisk sprogbrug ( statisk SQL) – programteksten indeholder kald til SQL-funktioner, som er inkluderet i det eksekverbare modul efter kompilering.
    • dynamisk sprogbrug ( dynamisk SQL) – dynamisk konstruktion af SQL-funktionskald og deres fortolkning. For eksempel, kan du få adgang til data fra en ekstern database under programafvikling.

    SQL-sproget (som andre sprog til at arbejde med databaser) er designet til at forberede og udføre forespørgsler. Som et resultat af at udføre en dataforespørgsel fra en eller flere tabeller opnås et sæt poster, som kaldes præsentation.

    Definition 1

    Ydeevne er en tabel, der er dannet som et resultat af at udføre en forespørgsel.

    Grundlæggende SQL Query Language Operatører

    SQL-sprogoperatører er konventionelt opdelt i 2 undersprog:

    1. Data Definition Sprog DDL;
    2. Datamanipulationssprog DML.

    I tabellen er de markeret med * specifikke operatører Sprog.

    Lad os se på de vigtigste SQL-sætninger.

      Oprettelse af tabeloprettelse:

      Navnet på den tabel, der oprettes, og navnet på mindst én kolonne (felt) er obligatoriske operander. For kolonnenavnet skal du angive den type data, der skal gemmes i det.

      For individuelle felter kan du angive yderligere regler for styring af de værdier, der indtastes i dem. For eksempel, IKKE NULL angiver, at feltet ikke må være tomt og skal udfyldes med en værdi.

      Eksempel 1

      At lave en tabel bøger bogkatalog, som indeholder felterne:

      type- type bog,

      navn- bogtitel,

      pris– bogens pris

      udsagnet kan se sådan ud:

      Operatør til ændring af bordstruktur:

      Når du ændrer tabelstrukturen, kan du tilføje ( TILFØJE), lave om ( MODIFICERE) eller slet ( DRÅBE) en eller flere tabelkolonner. Reglerne for registrering af denne operatør er de samme som for operatøren OPRET TABEL. For at slette en kolonne behøver du ikke at angive den.

      Eksempel 2

      For at tilføje til en tabel bøger felter nummer, hvor antallet af bøger vil blive gemt, kan du skrive operatøren:

      Bordfaldsoperatør:

      Eksempel 3

      For eksempel at droppe en eksisterende tabel med navnet bøger det er nok at bruge operatøren:

      Operatør for oprettelse af indeks:

      Operatøren opretter et indeks på en eller flere kolonner i en given tabel, hvilket kan fremskynde forespørgsels- og opslagsoperationer. Der kan oprettes flere indekser til en tabel.

      Valgfri mulighed ENESTÅENDE er ansvarlig for at sikre, at værdierne i alle kolonner, der er angivet i erklæringen, er unikke.

      A.S.C. indstiller værdierne i kolonnerne til at blive sorteret automatisk i stigende rækkefølge (standard), og DESC– i faldende rækkefølge.

      Indeksfaldsoperatør:

      Vis oprettelsesoperatør:

      Når du opretter en visning, behøver du ikke at angive kolonnenavne. Derefter vil kolonnenavnene fra forespørgslen, som er beskrevet af den tilsvarende operatør, blive brugt VÆLG.

      Se fjernelsesoperatør:

      Operatør for valg af rekord:

      Operatør VÆLG udfører stikprøver og beregninger på data fra en eller flere tabeller. Resultatet af at udføre operatoren er en svartabel, der indeholder ( ALLE) eller indeholder ikke ( DISTINKT) linjer, der gentages.

      Operand FRA indeholder en liste over tabeller, hvorfra poster tages til datavalg.

      Operatør for registreringsændringer:

      Nye feltværdier i poster indeholder muligvis ikke værdier ( NUL) eller beregnes efter et aritmetisk udtryk.

      Operatør til indsættelse af nye poster:

      I den første operatørpost INDSÆT Nye poster indtastes med specificerede værdier i kolonnerne.

      I den anden operatørpost INDSÆT nye rækker indtastes, valgt fra en anden tabel gennem en klausul VÆLG.

      Operatør for sletning af post:

      Som et resultat af udførelse af operatoren slettes rækker, der opfylder betingelsen angivet af den valgfri operand, fra den angivne tabel HVOR. Hvis operanden HVOR ikke er angivet, slettes alle tabelposter.