Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Sigurnost
  • Jezik strukturiranih upita - SQL: povijest, standardi, osnovni jezični operatori. Svrha SQL jezika

Jezik strukturiranih upita - SQL: povijest, standardi, osnovni jezični operatori. Svrha SQL jezika

I preko podataka tablica.

Jezik SQL se zove ugrađeni od sadrži funkcije punopravnog razvojnog jezika i usmjeren je na pristup podacima, zbog čega je uključen u alate za razvoj aplikacija. Standardi SQL jezika podržavaju programske jezike Pascal, Fortran, COBOL, S, itd.

Postoji 2 metode korištenja ugrađenog SQL-a:

  • statički upotreba jezika ( statički SQL) - tekst programa sadrži pozive SQL funkcijama koje su nakon kompilacije uključene u izvršni modul.
  • dinamičan upotreba jezika ( dinamički SQL) - dinamička konstrukcija poziva SQL funkcija i njihova interpretacija. Na primjer, možete se obratiti na podatke udaljene baze podataka tijekom izvođenja programa.

SQL jezik (kao i drugi jezici za rad s bazama podataka) namijenjen je za pripremu i izvršavanje upita. Kao rezultat izvršavanja upita podataka iz jedne ili više tablica, dobiva se skup zapisa koji se naziva podnošenje.

Definicija 1

Izvođenje Je tablica koja se formira kao rezultat upita.

Osnovni operatori SQL upitnog jezika

SQL izrazi se konvencionalno dijele na 2 podjezika:

  1. Jezik definicije podataka DDL;
  2. Jezik za manipulaciju podacima DML.

U tablici su * označene sa specifični operateri Jezik.

Pogledajmo najvažnije SQL naredbe.

    Izjava o kreiranju tablice:

    Naziv tablice koja se kreira i naziv barem jednog stupca (polja) su obavezni operandi. Za naziv stupca morate odrediti vrstu podataka koji će biti pohranjeni u njemu.

    Za pojedinačna polja možete odrediti dodatna pravila za kontrolu vrijednosti koje se unose u njih. Na primjer, NIJE NULL označava da polje ne može biti prazno i ​​da se u njega mora unijeti vrijednost.

    Primjer 1

    Za izradu tablice knjige katalog knjiga koji sadrži polja:

    tip- vrsta knjige,

    Ime- Naslov knjige,

    cijena- cijena knjige

    operator bi mogao izgledati ovako:

    Operator za promjenu strukture tablice:

    Prilikom promjene strukture tablice možete dodati ( DODATI), promijeniti ( IZMIJENI) ili izbrisati ( PAD) jedan ili više stupaca tablice. Pravila snimanja za ovog operatera su ista kao i za operatera. STVORI TABLU... Ne morate specificirati za brisanje stupca.

    Primjer 2

    Za dodavanje u tablicu knjige polja broj, koji će pohraniti broj knjiga, možete napisati operator:

    Operator za ispuštanje tablice:

    Primjer 3

    Na primjer, za ispuštanje postojeće tablice pod nazivom knjige samo upotrijebi operator:

    Operator za kreiranje indeksa:

    Operator stvara indeks na jednom ili više stupaca dane tablice kako bi ubrzao operacije upita i pretraživanja. Za jednu tablicu može se stvoriti više indeksa.

    Izborna opcija JEDINSTVENO odgovoran je za osiguranje jedinstvenosti vrijednosti u svim stupcima koji su navedeni u izjavi.

    ASC postavlja automatsko sortiranje vrijednosti u stupcima uzlaznim redoslijedom (zadano) i DESC- u silaznom redoslijedu.

    Operator ispuštanja indeksa:

    Operator za kreiranje prikaza:

    Možete izostaviti nazive stupaca prilikom izrade pogleda. Tada će se koristiti nazivi stupaca iz upita, što opisuje odgovarajući operator ODABERI.

    Prikaži operator brisanja:

    Operator odabira zapisa:

    Operater ODABERI vrši odabire i izračune na podacima iz jedne ili više tablica. Rezultat izvršavanja operatora je tablica odgovora koja sadrži ( SVI) ili ne sadrži ( RAZLIČIT) redovi koji se ponavljaju.

    Operand IZ sadrži popis tablica iz kojih se uzimaju zapisi za odabir podataka.

    Operator promjene zapisa:

    Nove vrijednosti polja u zapisima ne smiju sadržavati vrijednosti ( NULL) ili izračunati prema aritmetičkom izrazu.

    Novi operator umetanja zapisa:

    U prvom zapisu operatera UMETNUTI novi zapisi se unose s navedenim vrijednostima u stupcima.

    U drugoj izjavi operatera UMETNUTI uvode se novi redovi, birani iz druge tablice kroz rečenicu ODABERI.

    Operator za brisanje zapisa:

    Kao rezultat izvršavanja operatora, redovi se brišu iz navedene tablice koji zadovoljavaju uvjet koji je definiran opcijskim operandom GDJE... Ako je operand GDJE nije navedeno, tada se brišu svi zapisi tablice.

Standard jezika SQL usvojen je 1992. godine i koristi se i danas. On je bio taj koji je mnogima postao standard.Naravno, neki proizvođači koriste vlastita tumačenja standarda. Ali u bilo kojem sustavu još uvijek postoje glavne komponente - SQL izrazi.

Uvod

Uz pomoć SQL naredbi, vrijednosti, tablice se upravljaju i primaju na daljnju analizu i prikaz. Oni su skup ključnih riječi pomoću kojih sustav razumije što treba učiniti s podacima.

Definirano je nekoliko kategorija SQL izraza:

  • definiranje objekata baze podataka;
  • manipulacija vrijednostima;
  • zaštita i upravljanje;
  • parametri sesije;
  • informacije o bazi;
  • statički SQL;
  • dinamički SQL.

SQL izrazi za manipuliranje podacima

UMETNUTI. Umeće retke u postojeću tablicu. Može se koristiti i za jednu vrijednost i za nekoliko, određenih određenim uvjetom. Na primjer:

naziv tablice (naziv stupca 1, naziv stupca 2)

VRIJEDNOSTI (vrijednost 1, vrijednost 2).

Za korištenje INSERT izraza na više vrijednosti, sintaksa je:

naziv tablice 1 (naziv stupca 1, naziv stupca 2)

SELECT naziv stupca 1, naziv stupca 2

IZ naziva tablice 2

WHERE naziv tablice 2.naziv stupca 1> 2

Ovaj će upit odabrati sve podatke iz tablice 2 koji su veći od 2 u stupcu 1 i umetnuti ih u prvi.

AŽURIRANJE. Kao što naziv implicira, ovaj izraz SQL upita ažurira podatke u postojećoj tablici na temelju određenog atributa.

AŽURIRAJ naziv tablice 1

SET naziv stupca 2 = "Vasily"

WHERE naziv tablice 1.naziv stupca 1 = 1

Ova konstrukcija će popuniti Vasilijevu vrijednost sve retke u kojima se susreće s brojem 1 u prvom stupcu.

Podaci iz tablice. Možete odrediti uvjet ili ukloniti sve retke.

DELETE FROM naziv tablice

Naziv tablice WHERE. Naziv stupca 1 = 1

Gornji upit će izbrisati iz baze podataka sve podatke s vrijednošću jedan u prvom stupcu. I ovako možete očistiti cijelu tablicu:

SELECT izraz

Glavna svrha SELECT je odabir podataka prema određenim uvjetima. Rezultat njegova rada uvijek je nova tablica s odabranim podacima. MS operator se može koristiti u velikom broju upita. Stoga, uz njega, možete razmotriti i druge povezane ključne riječi.

Za odabir svih podataka iz određene tablice koristite znak "*".

IZ naziva tablice 1

Rezultat ovog upita bit će točna kopija tablice 1.

I ovdje se odabir vrši prema klauzuli WHERE, koja izdvaja iz tablice 1 sve vrijednosti veće od 2 u stupcu 1.

IZ naziva tablice 1

WHERE naziv tablice 1.naziv stupca 1> 2

Također možete naznačiti u odabiru da su potrebni samo određeni stupci.

SELECT naziv tablice 1. naziv stupca 1

IZ naziva tablice 1

Rezultat ovog upita bit će svi retki s vrijednostima iz stupca 1. Koristeći MS SQL izraze, možete kreirati vlastitu tablicu, zamjenjujući, izračunavajući i zamjenjujući određene vrijednosti u hodu.

naziv tablice 1 naziv stupca 1

naziv tablice 1 naziv stupca 2

naziv tablice 1 naziv stupca 3

naziv tablice 1.naziv stupca 2 * naziv tablice 1.naziv stupca 3 AS SUMMA

IZ naziva tablice 1

Ovaj naizgled složen upit dohvaća sve vrijednosti iz tablice 1, a zatim stvara nove stupce EQ i SUMMA. U prvom se upisuje znak "+", u drugom proizvod podataka iz stupaca 2 i 3. Dobiveni rezultat može se prikazati u obliku tablice, kako bi se razumjelo kako radi:

Kada koristite izraz SELECT, možete odmah sortirati podatke prema bilo kojem kriteriju. Za to se koristi riječ ORDER BY.

naziv tablice 1 naziv stupca 1

naziv tablice 1 naziv stupca 2

naziv tablice 1 naziv stupca 3

IZ naziva tablice 1

ORDER BY naziv stupca 2

Dobivena tablica će izgledati ovako:

Odnosno, svi su redovi postavljeni takvim redoslijedom da su vrijednosti u stupcu 2 u rastućem redoslijedu.

Podaci se također mogu dobiti iz nekoliko tablica. Radi jasnoće, prvo morate zamisliti da ih postoje dva u bazi podataka, otprilike ovako:

Tablica "Zaposlenici".

Tablica plaća

Sada morate nekako povezati ove dvije tablice da biste dobili zajedničke vrijednosti. Koristeći osnovne SQL izraze, to možete učiniti na sljedeći način:

Zaposlenici.Soba

Zaposlenici Ime

Plaća.Oklada

Obračunata plaća

OD Zaposlenika, Plaća

WHERE Zaposlenici.Broj = Plaća.Broj

Ovdje se vrši odabir iz dvije različite tablice vrijednosti, kombiniranih brojem. Rezultat će biti sljedeći skup podataka:

Malo više o SELECT. Korištenje agregatnih funkcija

Jedan od glavnih operatera može napraviti neke izračune prilikom uzorkovanja. Da bi to učinio, koristi određene funkcije i formule.

Na primjer, da biste dobili broj zapisa iz tablice "Zaposlenici", trebate upotrijebiti upit:

ODABIR BROJ (*) KAO N

OD Zaposlenika

Rezultat je tablica s jednom vrijednošću i stupcem.

Možete primijeniti takav upit i vidjeti što se događa:

SUM (Plaća. Obračunata) KAO SUMMA

MAX (Plaća. Obračunata) KAO MAX

MIN (Plaća. Obračunata) KAO MIN

PROSJEČNA (Plaća.Obračunata) KAO SRED

OD Plaće

Konačna tablica će izgledati ovako:

Na taj način možete odabrati željene vrijednosti iz baze podataka, obavljajući izračun različitih funkcija u hodu.

Unija, sjecište i razlike

Kombinirajte više upita u SQL-u

SELECT Employees.Name

OD Zaposlenika

GDJE Zaposlenici.Broj = 1

SELECT Employees.Name

OD Zaposlenika, Plaća

GDJE Plaća.Broj = 1

Treba imati na umu da kod takvog spajanja tablice moraju biti kompatibilne. To jest, imati isti broj stupaca.

SELECT Sintaksa iskaza i redoslijed obrade

Prije svega, SELECT određuje područje iz kojeg će uzimati podatke. Za to se koristi ključna riječ FROM. Ako nije navedeno što odabrati.

Tada može biti prisutna SQL klauzula WHERE. Uz njegovu pomoć, SELECT prolazi kroz sve retke tablice i provjerava usklađenost podataka s uvjetom.

Ako upit sadrži GROUP BY, tada se vrijednosti grupiraju prema navedenim parametrima.

Operatori za usporedbu podataka

Ima ih nekoliko vrsta. U SQL-u, operatori za usporedbu mogu testirati različite vrste vrijednosti.

    "=". Označava, kao što možete pretpostaviti, jednakost dvaju izraza. Na primjer, već je korišteno u gornjim primjerima - WHERE Plaća. Broj = 1.

    ">". Veći znak. Ako je vrijednost lijeve strane izraza veća, onda se vraća logički TRUE i uvjet se smatra ispunjenim.

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

    znakovi "<=» и «>= ". Razlikuje se od jednostavnih operatora manje ili više po tome što ako su operandi jednaki, uvjet će također biti istinit.

KAO

Ova se ključna riječ može prevesti kao "slično". Operator LIKE u SQL-u se koristi na isti način - izvršava upit pomoću uzorka. Odnosno, omogućuje vam proširenje odabira podataka iz baze podataka pomoću regularnih izraza.

Na primjer, postavljen je sljedeći zadatak: iz već poznate baze "Zaposlenici" dobiti sve osobe čije ime završava na "I". Tada se zahtjev može sastaviti ovako:

OD Zaposlenika

WHERE Ime LIKE `% i`

Znak postotka u ovom slučaju znači masku, odnosno bilo koji simbol i njihov broj. A po slovu "I" SQL će odrediti da posljednji znak treba biti upravo to.

SLUČAJ

Ova izjava SQL Servera je implementacija višestrukog izbora. Podsjeća na konstrukciju prekidača u mnogim programskim jezicima. SQL CASE izraz izvodi radnju pod nekoliko uvjeta.

Na primjer, morate odabrati maksimalnu i minimalnu vrijednost iz tablice "Plaća".

Tada se zahtjev može sastaviti ovako:

OD Plaće

GDJE SLUČAJ KADA ODABRATE MAX (Procijenjeno) ONDA Maksimum

KADA ODABRATE MIN ONDA Minimum

U tom kontekstu, sustav traži maksimalnu i minimalnu vrijednost u stupcu Accrued. Zatim se pomoću END kreira polje "ukupno" u koje će se unijeti "Maksimum" ili "Minimum", ovisno o rezultatu uvjeta.

Inače, SQL ima i kompaktniji oblik CASE - COALESCE.

Operatori definicije podataka

Ovaj prikaz vam omogućuje izvođenje raznih promjena u tablicama - stvaranje, brisanje, modificiranje i rad s indeksima.

Prva stvar koju treba razmotriti je CREATE TABLE. Ne radi ništa više od stvaranja stola. Ako samo upišete upit CREATE TABLE, ništa se ne događa, budući da treba navesti još nekoliko parametara.

Na primjer, da biste stvorili poznatu tablicu "Zaposlenici", trebate koristiti naredbe:

CREATE TABLE Zaposlenici

(Broj broj (10) NIJE NULL

Varchar (50) NIJE NULL

Prezime varchar (50) NOT NULL)

U ovom upitu u zagradama se odmah određuju nazivi polja i njihovi tipovi, kao i može li biti jednako NULL.

ISPUSTI STOL

Obavlja jedan jednostavan zadatak - brisanje navedene tablice. Ima dodatni parametar IF EXISTS. Projeda grešku pri ispuštanju ako tablica koju tražite ne postoji. Primjer upotrebe:

ISPUSTI STOL Zaposlenici AKO POSTOJI.

IZRADI INDEKS

SQL ima sustav indeksa koji može ubrzati pristup podacima. Općenito, to je poveznica koja upućuje na određeni stupac. Možete stvoriti indeks jednostavnim upitom:

CREATE INDEX naziv_indeksa

ON naziv_tablice (naziv_stupca)

Ovaj operator se koristi u T-SQL, Oracle, PL SQL i mnogim drugim interpretacijama tehnologija.

ALTER TABLE

Vrlo funkcionalan operater s brojnim opcijama. Općenito, mijenja strukturu, definiciju i smještaj tablica. Korišteni operator u Oracle SQL-u, Postgresu i mnogim drugima.

    DODATI. Dodaje stupac u tablicu. Njegova sintaksa je sljedeća: ALTER TABLE ime_tablice DODAJ ime_stupca_pohranjeni_tip_podataka. Može imati opciju IF NOT EXISTS za suzbijanje greške ako stupac koji se kreira već postoji;

    PAD. Uklanja stupac. Također ima ključ IF EXISTS, bez kojeg će se generirati pogreška koja pokazuje da nedostaje traženi stupac;

    PROMIJENITI. Služi za preimenovanje imena polja u navedeno. Primjer upotrebe: ALTER TABLE naziv_tablice CHANGE staro_naziv novo_ime;

    IZMIJENI. Ova naredba će vam pomoći da promijenite vrstu i dodatne atribute određenog stupca. I koristi se ovako: ALTER TABLE table_name MODIFY column_name data_type atributi;

STVORI POGLED

U SQL-u postoji nešto što je pogled. Ukratko, ovo je svojevrsna virtualna tablica s podacima. Formira se kao rezultat odabira pomoću SQL SELECT izraza. Pogledi mogu ograničiti pristup bazi podataka, sakriti ih, zamijeniti stvarne nazive stupaca.

Proces kreiranja odvija se jednostavnim zahtjevom:

CREATE VIEW ime pogleda KAO SELECT FROM * naziv tablice

Odabir se može odvijati kako cijele baze u cjelini, tako i prema nekom uvjetu.

Malo o funkcijama

U SQL upitima se vrlo često koriste razne ugrađene funkcije koje vam omogućuju interakciju s podacima i njihovu transformaciju u hodu. Vrijedi ih razmotriti jer čine sastavni dio strukturiranog jezika.

    RAČUNATI. Broji zapise ili retke u određenoj tablici. Kao parametar možete odrediti naziv stupca, a zatim će se podaci preuzeti iz njega. ODABIR BROJ * IZ Zaposlenika;

    PROSJEČAN odnosi se samo na stupce s brojčanim podacima. Njegov rezultat je određivanje aritmetičke sredine svih vrijednosti;

    MIN i MAX. Ove su funkcije već korištene u ovom članku. Oni određuju maksimalne i minimalne vrijednosti iz navedenog stupca;

    IZNOS. Jednostavno je - funkcija izračunava zbroj vrijednosti stupca. Koristi se isključivo za numeričku vrstu podataka. Dodavanjem parametra DISTINCT upitu, zbrojit će se samo jedinstvene vrijednosti;

    KRUG. Funkcija zaokruživanja za decimalne razlomke. Sintaksa koristi naziv stupca i broj decimalnih mjesta;

    LEN. Jednostavna funkcija koja izračunava duljinu vrijednosti stupca. Rezultat će biti nova tablica koja prikazuje broj znakova;

    SADA. Ova ključna riječ se koristi za izračunavanje trenutnog datuma i vremena.

Dodatni operateri

Mnogi primjeri sa SQL naredbama imaju ključne riječi koje čine male stvari, ali ipak uvelike olakšavaju dohvaćanje ili manipulaciju bazama podataka.

    KAO. Koristi se kada trebate vizualno ukrasiti rezultat dodjeljivanjem navedenog naziva rezultirajućoj tablici.

    IZMEĐU. Vrlo zgodan alat za uzorkovanje. Označava raspon vrijednosti među kojima želite dobiti podatke. Ulaz uzima parametar od i do kojeg se broja koristi raspon ;.

    NE. Operator daje suprotno od izraza.

    SKRATITI. Briše podatke iz navedenog područja baze podataka. Razlikuje se od sličnih operatera po tome što je nemoguće oporaviti podatke nakon korištenja. Treba napomenuti da se implementacija ove ključne riječi u različitim interpretacijama SQL-a može razlikovati. Stoga je najbolje pročitati referentne informacije prije pokušaja TRUNCATE.

    OGRANIČITI. Postavlja broj redaka za izlaz. Posebnost operatora je da se uvijek nalazi na kraju. Potreban je jedan obavezni parametar i jedan izborni. Prvi označava koliko redaka s odabranim podacima treba prikazati. A ako se koristi drugi, tada operator radi kao za raspon vrijednosti.

    UNIJA. Vrlo zgodan operator za kombiniranje više upita. Među primjerima toga već se susreo u ovom članku. Možete prikazati potrebne retke iz nekoliko tablica kombinirajući ih s UNION za praktičniju upotrebu. Njegova sintaksa je sljedeća: SELECT column_name FROM table_name UNION SELECT other_column_name FROM another table_name. Rezultat će biti zaokretna tablica s kombiniranim upitima.

    GLAVNI KLJUČ. Prevedeno kao "primarni ključ". Zapravo, upravo se ta terminologija koristi u referentnim materijalima. To znači jedinstveni identifikator za niz. Koristi se, u pravilu, pri izradi tablice za određivanje polja koje će je sadržavati.

    ZADANO. Kao i prethodni operator, koristi se tijekom izvršavanja upita za kreiranje. Definira zadanu vrijednost koja će se koristiti za popunjavanje polja kada se kreira.

    NULL. Prilikom pisanja upita početnici i ne samo programeri često zaborave na mogućnost dobivanja NULL vrijednosti. Kao rezultat toga, u kod se uvlači pogreška koju je teško pronaći tijekom otklanjanja pogrešaka. Stoga, prilikom izrade tablica, odabira ili ponovnog izračunavanja vrijednosti, trebate zastati i razmisliti o tome uzima li se u obzir pojava NULL-a u ovom dijelu upita.

    Memorija. Ovaj članak je pokazao nekoliko funkcija koje mogu obavljati neke zadatke. Prilikom razvoja ljuske za rad s bazom podataka, možete "prevagati" evaluaciju jednostavnih izraza sustavu za upravljanje bazom podataka. U nekim slučajevima to daje značajno povećanje performansi.

    Ograničenja. Ako trebate dobiti samo dva iz baze podataka s tisućama redaka, onda biste trebali koristiti operatore poput LIMIT ili TOP. Nema potrebe za dohvaćanjem podataka korištenjem jezika za razvoj ljuske.

    Spoj. Nakon dohvaćanja podataka iz nekoliko tablica, mnogi programeri ih počinju skupljati koristeći memoriju ljuske. Ali zašto? Uostalom, možete napraviti jedan zahtjev u kojem će sve to biti prisutno. Ne morate pisati dodatni kod i rezervirati dodatnu memoriju u sustavu.

    Sortiranje. Ako je moguće primijeniti poredak u upitu, odnosno putem DBMS-a, onda ga trebate koristiti. To će značajno uštedjeti na resursima prilikom pokretanja programa ili usluge.

    Mnogo zahtjeva. Ako morate umetnuti mnogo zapisa uzastopno, za optimizaciju biste trebali razmisliti o grupnom umetanju podataka s jednim upitom. Također će povećati performanse cijelog sustava u cjelini.

    Sofisticirano postavljanje podataka. Prije izrade strukture baze podataka, morate razmisliti o tome trebate li toliki broj tablica i polja. Možda postoji način da ih kombinirate ili neke odbacite. Vrlo često programeri koriste preveliku količinu podataka koji se nikada nigdje neće koristiti.

    Vrste. Da biste uštedjeli prostor i resurse, morate biti osjetljivi na vrste podataka koji se koriste. Ako je moguće koristiti tip koji je manje "teški" za memoriju, onda ga je potrebno koristiti. Na primjer, ako znate da brojčana vrijednost u ovom polju neće premašiti 255, zašto onda koristiti 4-bajtni INT ako postoji TINYINT od 1 bajta.

Zaključak

Zaključno, treba napomenuti da se strukturirani jezik upita SQL danas koristi gotovo posvuda - web stranice, web servisi, programi za računala, aplikacije za mobilne uređaje. Stoga će poznavanje SQL-a pomoći svim granama razvoja.

Istodobno, modifikacije standarda izvornog jezika ponekad se međusobno razlikuju. Na primjer, PL SQL izrazi mogu imati drugačiju sintaksu od SQL Servera. Stoga, prije nego što počnete razvijati ovu tehnologiju, vrijedi pročitati vodiče o njoj.

U budućnosti se vjerojatno neće pojaviti analozi koji bi mogli nadmašiti SQL u funkcionalnosti i performansama, tako da je ovo područje prilično obećavajuća niša za svakog programera.

SQL (StructuredQueryLanguage) je univerzalni računalni jezik koji se koristi za stvaranje, modificiranje i manipulaciju podacima u relacijskim bazama podataka. SQL jezik temelji se na relacijskoj algebri i skup je operatora.

Postoje 4 grupe operatera. Razmotrimo grupu jezika za manipulaciju podacima (DML, SQL DML)

Odabir podataka

Odabir podataka je najčešća SQL operacija. Izraz SELECT jedan je od najvažnijih izraza u ovom jeziku za odabir podataka. Sintaksa za ovaj operator je sljedeća:

SELECT stupac IZ tablice

SELECT izrazi moraju sadržavati riječi SELECT i FROM; ostale ključne riječi nisu obavezne.

Nakon ključne riječi SELECT slijede informacije o tome koja polja treba uključiti u rezultirajući skup podataka. Zvjezdica (*) označava sva polja u tablici, na primjer:

Za odabir jednog stupca koristi se sljedeća sintaksa:

ODABERI Društvo

Primjer odabira više stupaca izgleda ovako:

ODABERI Društvo, telefon,Mail

Ključna riječ FROM koristi se za određivanje naziva tablica iz kojih se dohvaćaju zapisi, na primjer:

ODABERI * IZ Kupci

Ovaj će upit vratiti sva polja iz tablice Kupci.

Možete koristiti klauzulu WHERE za filtriranje rezultata koje vraća naredba SELECT (nije obavezno)

ODABIR * IZ proizvoda GDJE Kategorija = 4

U klauzuli WHERE mogu se koristiti različiti izrazi,

GDJE izraz1 [(I | ILI) izraz2 ...]

na primjer:

ODABERITE * IZ proizvoda GDJE Kategorija = 2 I Postavshik> 10

ODABERITE Naziv, Cijena IZ proizvoda GDJE Kategorija = 3 ILI Cijena< 50

Možete koristiti sljedeće operatore:

< Меньше

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

<>Nejednak

> Više

> = Veće ili jednako

Klauzula ORDER BY (izborno) koristi se za sortiranje rezultirajućeg skupa podataka po jednom ili više stupaca. Ključne riječi ASC (uzlazno) ili DESC (padajuće) koriste se za određivanje redoslijeda sortiranja. Podaci se prema zadanim postavkama sortiraju uzlaznim redoslijedom.

Promjena podataka

Osim dohvaćanja podataka, SQL se može koristiti za ažuriranje i brisanje podataka, kopiranje zapisa u druge tablice i izvođenje drugih operacija. U nastavku ćemo pogledati naredbe UPDATE, DELETE i INSERT koje se koriste za postizanje nekih od ovih zadataka.

Izjava UPDATE

Naredba UPDATE koristi se za promjenu vrijednosti u jednom ili više stupaca tablice. Sintaksa za ovaj operator je:

UPDATE tablica SET stupac1 = izraz1 WHERE kriterija

Izraz u klauzuli SET može biti konstanta ili rezultat evaluacije. Na primjer, da biste podigli cijene svih proizvoda koji koštaju manje od 10 USD, možete pokrenuti sljedeći upit:

UPDATE Proizvodi SET Cijena = Cijena * 1.1 GDJE Cijena< 10

Izjava DELETE

Za brisanje redaka iz tablica koristite naredbu DELETE, čija je sintaksa:

DELETE FROM tablice WHERE kriterija

Uklonite sve proizvode čija je vrijednost manja od 100:

IZBRIŠI IZ proizvoda GDJE Cijena< 100

OperaterUMETNUTI

Za dodavanje zapisa u tablice, koristite izraz INSERT čija je sintaksa:

INSERT INTO tablicu (VRIJEDNOSTI (izraz [, ...])

Na primjer, da biste dodali novog kupca u tablicu Kupci, možete koristiti sljedeći upit:

INSERT INTO Customers (CustomerID, CompanyName) VRIJEDNOSTI ('XYZ', 'XYZ Deli')

Osnovu jezika SQL čine operatori, uvjetno podijeljeni u nekoliko skupina prema svojim funkcijama. Mogu se razlikovati sljedeće grupe iskaza (nisu navedeni svi SQL izrazi):

Ddl (jezik definicije podataka) operatori

DDL izjave - Izjave o definiciji objekata baze podataka

    CREATE SCHEMA - kreirajte shemu baze podataka

    DROP SHEMA - ispuštanje sheme baze podataka

    CREATE TABLE - kreirati tablicu

    ALTER TABLE - modificirati tablicu

    DROP TABLE - ispustiti stol

    CREATE DOMAIN - kreirati domenu

    ALTER DOMAIN - promijeniti domenu

    DROP DOMAIN - izbrisati domenu

    CREATE COLLATION - kreirajte slijed

    DROP COLLATION - brisanje niza

    CREATE VIEW - stvoriti pogled

    DROP VIEW - ukloniti pogled

Dml (jezik za upravljanje podacima) operatori

DML operatori - Operatori manipulacije podacima

    SELECT - odabir redaka iz tablica

    INSERT - dodati redove u tablicu

    UPDATE - promijeniti redove u tablici

    DELETE - brisanje redaka u tablici

    COMMIT - urezivanje napravljenih promjena

    ROLLBACK - vraćanje izvršenih promjena

Operateri zaštite i kontrole podataka

    CREATE ASSERTION - stvoriti ograničenje

    DROP ASSERTION - ukloniti ograničenje

    GRANT - dodijeli privilegije korisniku ili aplikaciji za manipulaciju objektima

    REVOKE - opozvati privilegije korisnika ili aplikacije

Osim toga, postoje grupe operatora za postavljanje parametara sesije, dobivanje informacija o bazi podataka, statički SQL izrazi, dinamički SQL izrazi. Korisniku su najvažniji operatori manipulacije podacima (DML).

Primjeri korištenja operatora za manipulaciju podacima

INSERT - umetanje redaka u tablicu

Primjer 1 . Umetanje jednog retka u tablicu:

VRIJEDNOSTI (4, "Ivanov");

Primjer 2 ... Umetanje nekoliko redaka u tablicu, odabranih iz druge tablice (podaci o dobavljačima iz tablice P, koji imaju brojeve veće od 2, umeću se u tablicu TMP_TABLE):

TMP_TABLE (PNUM, PNAME)

ODABIR PNUM, PNAME

GDJE P.PNUM> 2;

UPDATE - ažuriranje redaka u tablici

Primjer 3 ... Ažuriranje više redaka u tablici:

POSTAVI PNAME = "Pušnjikov"

GDJE P.PNUM = 1;

DELETE - brisanje redaka u tablici

Primjer 4 . Brisanje više redaka u tablici:

GDJE P.PNUM = 1;

Primjer 5 ... Brisanje svih redaka u tablici:

Primjeri korištenja izraza SELECT

SELECT izraz je zapravo najvažniji i najsloženiji SQL izraz za korisnika. Namijenjen je za dohvaćanje podataka iz tablica, t.j. on, zapravo, implementira jednu od glavnih svrha baze podataka - pružanje informacija korisniku.

Naredba SELECT uvijek se izvršava na nekim tablicama u bazi podataka.

Komentar... Zapravo, baze podataka mogu sadržavati ne samo trajne tablice, već i privremene tablice i takozvane poglede. Pogledi su jednostavno SELECT izjave pohranjene u bazi podataka. Sa stajališta korisnika, pogled je tablica koja nije trajno pohranjena u bazi, već se „pojavljuje“ u trenutku kada joj se pristupa. Sa stajališta SELECT izraza, trajne tablice i privremene tablice i pogledi izgledaju potpuno isto. Naravno, stvarno izvršavanje naredbe SELECT od strane sustava uzima u obzir razlike između pohranjenih tablica i pogleda, ali te razlike skriven od korisnika.

Rezultat naredbe SELECT uvijek je tablica. Dakle, rezultati akcija čine naredbu SELECT sličnim operatorima relacijske algebre. Bilo koji operator relacijske algebre može se izraziti prikladno sročenim SELECT naredbom. Složenost naredbe SELECT određena je činjenicom da sadrži sve značajke relacijske algebre, kao i dodatne značajke koje nisu dostupne u relacijskoj algebri.

U prvom dijelu smo se već malo dotakli DML jezika, koristeći gotovo cijeli skup njegovih naredbi, s izuzetkom naredbe MERGE.

Govorit ću o DML-u u svom vlastitom nizu razvijenom iz osobnog iskustva. Usput ću vam pokušati ispričati i o "skliskim" mjestima na koja se vrijedi usredotočiti, tim "skliskim" mjestima koja su slična u mnogim dijalektima SQL jezika.

Jer udžbenik je posvećen širokom krugu čitatelja (ne samo programera), tada će objašnjenje, ponekad biti prikladno, t.j. dugo i zamorno. Ovo je moje viđenje materijala koji se uglavnom dobiva u praksi kao rezultat profesionalnog djelovanja.

Glavni cilj ovog tutoriala, korak po korak, je razviti potpuno razumijevanje suštine SQL jezika i naučiti vas kako pravilno primijeniti njegove konstrukcije. Profesionalci u ovom području također bi mogli biti zainteresirani za listanje ovog materijala, možda će uspjeti iznijeti nešto novo za sebe, ili će im jednostavno biti korisno pročitati kako bi osvježili pamćenje. Nadam se da će svima biti zanimljivo.

Jer DML u dijalektu baze podataka MS SQL jako je povezan sa sintaksom konstrukcije SELECT, onda ću s njim početi govoriti o DML-u. Po mom mišljenju, konstrukcija SELECT je najvažnija konstrukcija DML jezika, budući da o trošku njega ili njegovih dijelova vrši se odabir potrebnih podataka iz baze podataka.

DML sadrži sljedeće konstrukcije:

  • SELECT - odabir podataka
  • INSERT - umetanje novih podataka
  • UPDATE - ažuriranje podataka
  • DELETE - brisanje podataka
  • MERGE - spajanje podataka

U ovom dijelu ćemo pokriti samo osnovnu sintaksu naredbe SELECT, koja izgleda ovako:

SELECT column_list ili * FROM source WHERE filter ORDER BY sort_expression
Tema naredbe SELECT vrlo je opsežna, pa ću se u ovom dijelu usredotočiti samo na njegove osnovne konstrukcije. Vjerujem da, bez dobrog poznavanja baze, ne možete početi proučavati složenije strukture, jer tada će se sve vrtjeti oko ove osnovne konstrukcije (podupiti, sindikati itd.).

Također u ovom dijelu govorit ću i o TOP prijedlogu. Ovu rečenicu namjerno nisam naznačio u osnovnoj sintaksi, budući da različito se implementira u različitim dijalektima SQL jezika.

Ako je DDL statičniji, t.j. uz pomoć njega se stvaraju krute strukture (tablice, veze itd.), tada je DML jezik dinamične prirode, ovdje možete dobiti točne rezultate na različite načine.

Obuka će se također nastaviti u Step by Step modu, tj. kada čitate, morate odmah pokušati slijediti primjer vlastitim rukama. Nakon toga analizirate rezultat i pokušavate ga razumjeti intuitivno. Ako nešto ostane nejasno, na primjer, značenje funkcije, obratite se Internetu za pomoć.

Primjeri će biti prikazani na Test bazi podataka koja je u prvom dijelu kreirana korištenjem DDL + DML.

Za one koji nisu kreirali bazu podataka u prvom dijelu (budući da nisu svi zainteresirani za DDL jezik), možete koristiti sljedeću skriptu:

Test skripte za kreiranje baze podataka

Stvaranje baze podataka CREATE DATABASE Test GO - neka testna baza bude trenutna USE Test GO - stvori referentne tablice CREATE TABLE Pozicije (ID int IDENTITY (1,1) NOT NULL OGRANIČENJE PK_Positions PRIMARY KEY, Naziv nvarchar (30) NOT NULL) CREATE TABLE Odjeli (ID int IDENTITY (1,1) NOT NULL OGRANIČENJE PK_Departments PRIMARY KEY, Naziv nvarchar (30) NOT NULL) GO - ispunite referentne tablice podacima SET IDENTITY_INSERT Pozicije (ID, naziv) VRIJEDNOSTI (1, N "Računovođa" ) , (2, N "Direktor"), (3, N "Programer"), (4, N "Viši programer") POSTAVI IDENTITY_INSERT pozicije ISKLJUČI GO POSTAVI IDENTITY_INSERT Odjeli UKLJUČENO INSERT Odjeli (ID, naziv) VRIJEDNOSTI (1, N " Administracija"), (2, N "Računovodstvo"), (3, N "IT") POSTAVI IDENTITY_INSERT Odjeli ISKLJUČENO GO - kreiraj tablicu sa zaposlenicima KREIRAJ TABELU Zaposlenici (ID int NOT NULL, Ime nvarchar (30), Datum rođenja , E-pošta nvarchar (30), PositionID int, DepartmentID int, HireDate date NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME (), ManagerID int, C ONSTRAINT PK_Employees PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID STRANI KLJUČ (ID odjela) REFERENCES Odjeli (ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES (PositionID) REFERENCES (PozicijeCONEFERENSKE) (PozicijeCONEFERENSTRA), (PozicijeCONEFERENSTRA), (PozicijeCONEFERENSTRA). ID IZMEĐU 1000 I 1999), INDEX IDX_Employees_Name (Ime)) GO - ispunite ga INSERT podacima o zaposlenicima (ID, Ime, Rođendan, Email, PositionID, DepartmentID, ManagerID) VRIJEDNOSTI (1000, N " Ivanov II "," 19550 " [e-mail zaštićen]", 2,1, NULL), (1001, N" Petrov P.P. "," 19831203 "," [e-mail zaštićen]", 3,3,1003), (1002, N" Sidorov S.S. "," 19760607 "," [e-mail zaštićen]", 1,2,1000), (1003, N" Andreev A.A. "," 19820417 "," [e-mail zaštićen]",4,3,1000)

To je to, sada smo spremni za početak učenja DML jezika.

SELECT - operator odabira podataka

Prije svega, za aktivni uređivač upita napravit ćemo test trenutne baze podataka odabirom na padajućem popisu ili korištenjem naredbe "USE Test".

Počnimo s najosnovnijim SELECT obrascem:

ODABERITE * IZ Zaposlenika
U ovom upitu tražimo da vratimo sve stupce (označene sa "*") iz tablice Zaposlenici - ovo možete pročitati kao "SELECT all_fields FROM table_employees". Ako postoji grupirani indeks, vraćeni podaci će najvjerojatnije biti razvrstani po njemu, u ovom slučaju po ID stupcu (ali to nije poanta, jer ćemo u većini slučajeva sami eksplicitno specificirati sortiranje pomoću ORDER BY... ) :

iskaznica Ime Rođendan E-mail PositionID ID odjela Datum zaposlenja ID upravitelja
1000 Ivanov I.I. 1955-02-19 [e-mail zaštićen] 2 1 2015-04-08 NULL
1001 Petrov P.P. 1983-12-03 [e-mail zaštićen] 3 3 2015-04-08 1003
1002 Sidorov S.S. 1976-06-07 [e-mail zaštićen] 1 2 2015-04-08 1000
1003 Andreev A.A. 1982-04-17 [e-mail zaštićen] 4 3 2015-04-08 1000

Općenito, vrijedi reći da u MS SQL dijalektu najjednostavniji oblik SELECT upita možda ne sadrži blok FROM, u ovom slučaju ga možete koristiti za dobivanje nekih vrijednosti:

SELECT 5550/100 * 15, SYSDATETIME (), - dobivanje sistemskog datuma baze podataka SIN (0) + COS (0)

(bez naziva stupca) (bez naziva stupca) (bez naziva stupca)
825 2015-04-11 12:12:36.0406743 1

Imajte na umu da je izraz (5550/100 * 15) dao rezultat 825, iako ako računamo na kalkulator, dobivamo vrijednost (832,5). Rezultat 825 dobiven je iz razloga što su u našem izrazu svi brojevi cijeli brojevi, dakle rezultat je cijeli broj, t.j. (5550/100) nam daje 55, a ne (55,5).

Zapamtite sljedeće, sljedeća logika radi u MS SQL-u:

  • Integer / Integer = Integer (tj. u ovom slučaju dolazi do dijeljenja cijelog broja)
  • Stvarno / Cijelo = Stvarno
  • Integer / Real = Real
Oni. rezultat se pretvara u veći tip, pa u zadnja 2 slučaja dobivamo realan broj (razmislite kao u matematici - raspon realnih brojeva je veći od raspona cijelih brojeva, pa se rezultat pretvara u njega):

SELECT 123/10, - 12 123./10, - 12,3 123/10. - 12.3
Ovdje (123.) = (123.0), samo u ovom slučaju 0 se može ispustiti i ostaviti samo točka.

Za ostale aritmetičke operacije vrijedi ista logika, ali u slučaju dijeljenja ova nijansa je relevantnija.

Stoga obratite pozornost na vrstu podataka brojčanih stupaca. U slučaju da je cijeli broj, a trebate dobiti pravi rezultat, tada koristite transformaciju ili jednostavno stavite točku nakon broja navedenog kao konstante (123.).

Za pretvaranje polja možete koristiti funkciju CAST ili CONVERT. Na primjer, koristit ćemo ID polje, imamo ga tipa int:

ODABIR ID, ID / 100, - ovdje će biti cjelobrojna podjela CAST (ID AS float) / 100, - upotrijebite funkciju CAST za pretvaranje u plutajući tip CONVERT (float, ID) / 100, - koristite funkciju CONVERT za pretvaranje u tip float ID / 100. - koristimo transformaciju navodeći da je nazivnik realan broj IZ Zaposlenih

iskaznica (bez naziva stupca) (bez naziva stupca) (bez naziva stupca) (bez naziva stupca)
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

Napomenu. U bazi podataka ORACLE sintaksa bez bloka FROM nije dopuštena, u tu svrhu koristi se tablica DUAL sustava koja sadrži jedan redak:

SELECT 5550/100 * 15, - i u ORACLE-u rezultat će biti 832.5 sysdate, sin (0) + cos (0) IZ DUAL


Bilješka. Ime tablice u mnogim RDB-ovima može prethoditi nazivu sheme:

SELECT * FROM dbo.Employees - dbo - naziv sheme

Shema je logička jedinica baze podataka koja ima svoje ime i omogućuje grupiranje objekata baze podataka kao što su tablice, pogledi itd. unutar nje.

Definicija sheme u različitim bazama podataka može se razlikovati, negdje je shema izravno povezana s korisnikom baze podataka, tj. u ovom slučaju možemo reći da su shema i korisnik sinonimi i da su svi objekti stvoreni u shemi u biti objekti ovog korisnika. U MS SQL-u, shema je neovisna logička jedinica koja se može kreirati sama (pogledajte CREATE SCHEMA).

Prema zadanim postavkama, jedna shema pod nazivom dbo (Vlasnik baze podataka) kreira se u bazi podataka MS SQL, a svi kreirani objekti se kreiraju u ovoj shemi prema zadanim postavkama. Prema tome, ako jednostavno navedemo naziv tablice u upitu, tada će se tražiti u dbo shemi trenutne baze podataka. Ako želimo stvoriti objekt u određenoj shemi, također ćemo morati dodati naziv objekta nazivu sheme, na primjer, "CREATE TABLE schema_name.table_name (...)".

U slučaju MS SQL-a, nazivu sheme također može prethoditi naziv baze podataka u kojoj se ta shema nalazi:

SELECT * FROM Test.dbo.Employees - database_name.schema_name.table
Ovo pojašnjenje je korisno, na primjer, ako:

  • u jednom zahtjevu upućujemo na objekte koji se nalaze u različitim shemama ili bazama podataka
  • trebate prenijeti podatke iz jedne sheme ili baze podataka u drugu
  • budući da ste u jednoj bazi podataka, morate zatražiti podatke iz druge baze podataka
  • itd.
Shema je vrlo zgodan alat koji je koristan pri razvoju arhitekture baze podataka, posebno velikih baza podataka.

Također, ne zaboravite da u tekstu zahtjeva možemo koristiti i jednorečne "- ..." i višerečne "/ * ... * /" komentare. Ako je zahtjev velik i složen, onda komentari mogu biti od velike pomoći, vi ili netko drugi nakon nekog vremena zapamtite ili shvatite njegovu strukturu.

Ako u tablici ima puno stupaca, a pogotovo ako još uvijek ima puno redaka u tablici, plus ako vršimo upite bazi podataka preko mreže, tada se odabire s izravnim popisom polja koja trebate odvojiti zarezima će biti poželjno:

SELECT ID, Name FROM Employees

Oni. ovdje kažemo da samo trebamo vratiti ID i Name polja iz tablice. Rezultat će biti sljedeći (usput, optimizator je ovdje odlučio koristiti indeks kreiran u polju Naziv):

iskaznica Ime
1003 Andreev A.A.
1000 Ivanov I.I.
1001 Petrov P.P.
1002 Sidorov S.S.

Napomenu. Ponekad je korisno pogledati kako se podaci dohvaćaju, na primjer, da biste saznali koji se indeksi koriste. To se može učiniti ako kliknete gumb "Prikaži procijenjeni plan izvršenja" ili postavite "Uključi stvarni plan izvršenja - u rezultat uključi stvarni plan izvršenja upita":

Analiza plana izvršenja vrlo je korisna pri optimizaciji upita, omogućuje vam da saznate koji indeksi nedostaju ili koji indeksi se uopće ne koriste te ih možete izbrisati.

Ako ste tek počeli savladavati DML, sada vam to nije toliko važno, samo zabilježite i možete ga sigurno zaboraviti (možda vam nikada neće biti od koristi) - naš početni cilj je naučiti osnove DML jezika i naučite ih pravilno koristiti, a optimizacija je već zasebna umjetnost. Ponekad je važnije da imate samo ispravno napisan upit koji daje ispravan rezultat s predmetne točke gledišta, a pojedini ljudi su već angažirani na njegovoj optimizaciji. Za početak, morate naučiti kako jednostavno ispravno napisati upite, koristeći bilo koji način za postizanje cilja. Glavni cilj koji sada trebate postići je da vaš upit vrati točne rezultate.

Postavljanje aliasa za tablice

Prilikom navođenja stupaca, može im prethoditi naziv tablice u bloku FROM:

SELECT Employees.ID, Employees.Name FROM Employees

Ali ova sintaksa je obično nezgodna za korištenje, jer naziv tablice može biti dug. U te svrhe obično se postavljaju i koriste kraći nazivi - alias:

SELECT emp.ID, emp.Name FROM Employees AS emp
ili

SELECT emp.ID, emp.Name FROM Employees emp - AS ključna riječ može biti ispuštena (preferiram ovu opciju)

Ovdje je emp pseudonim za tablicu Employees koji se može koristiti u kontekstu ove SELECT izraza. Oni. možemo reći da u kontekstu ove izjave SELECT tablici dajemo novo ime.

Naravno, u ovom slučaju, rezultati upita bit će potpuno isti kao za "ODABIR ID, Ime od zaposlenika". Za što će biti potrebno bit će jasno dalje (čak ni u ovom dijelu), za sada se samo prisjetimo da nazivu stupca može prethoditi (navesti) ili izravno ime tablice, ili pomoću aliasa. Ovdje možete koristiti jednu od dvije stvari, tj. ako ste naveli alias, morat ćete ga koristiti, ali više ne možete koristiti naziv tablice.

Napomenu. U ORACLE-u je dopuštena samo opcija specificiranja aliasa tablice bez ključne riječi AS.

DISTINCT - odbaciti duple linije

Ključna riječ DISTINCT koristi se za odbacivanje dupliciranih redaka iz rezultata upita. Grubo govoreći, zamislite da se prvo izvršava upit bez opcije DISTINCT, a zatim se svi duplikati odbacuju iz rezultata. Pokažimo to radi veće jasnoće na primjeru:

Kreirajmo privremenu tablicu za demonstraciju CREATE TABLE #Trash (ID int NOT NULL PRIMARY KEY, Col1 varchar (10), Col2 varchar (10), Col3 varchar (10)) - ispunite ovu tablicu svim vrstama smeća INSERT #Trash ( ID, Col1, Col2, Col3) VRIJEDNOSTI (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") - da vidimo što upit se vraća bez opcije DISTINCT SELECT Col1, Col2, Col3 FROM #Trash - pogledajmo što će upit vratiti s DISTINCT opcijom SELECT DISTINCT Col1, Col2, Col3 FROM #Trash - izbrišite privremenu tablicu DROP TABLE #Trash

Jasno je da će izgledati ovako (svi duplikati označeni su istom bojom):

Pogledajmo sada gdje se to može primijeniti, uz praktičniji primjer - vratit ćemo samo jedinstvene identifikatore odjela iz tablice Zaposlenici (tj. saznati ID-ove odjela u kojima su zaposlenici navedeni):

ODABERITE DISTINCT DepartmentID IZ Employees

Ovdje smo dobili 4 reda, jer u našoj tablici nema duplih kombinacija (DepartmentID, PositionID).

Vratimo se na trenutak na DDL

Budući da nema dovoljno podataka za demo primjere, a želim vam reći opširnije i jasnije, malo proširimo našu tablicu Employess. Uz to, prisjetimo se malo DDL-a, kako kažu "ponavljanje je majka učenja", i još jednom pođimo malo naprijed i primijenimo naredbu UPDATE:

Kreirajte nove stupce ALTER TABLE Zaposlenici DODAJ Prezime nvarchar (30), - prezime Ime nvarchar (30), - ime MiddleName nvarchar (30), - prezime Plaća float, - i, naravno, RFP u nekoj vrsti BonusPercent float - postotak za izračunavanje bonusa od GO plaće - popunjavamo ih podacima (neki podaci su namjerno izostavljeni) UPDATE Zaposlenici SET Prezime = N "Ivanov", Ime = N "Ivan", MiddleName = N "Ivanovič", Plaća = 5000, BonusPercent = 50 GDJE ID = 1000 - Ivanov II UPDATE Zaposlenici SET Prezime = N "Petrov", Ime = N "Petr", Srednje Ime = N "Petrovich", Plaća = 1500, BonusPercent = 15 GDJE ID = 1001 - Petrov P.P. UPDATE Zaposlenici SET Prezime = N "Sidorov", Ime = N "Sidor", MiddleName = NULL, Plaća = 2500, BonusPercent = NULL GDJE ID = 1002 - Sidorov S.S. UPDATE Zaposlenici SET Prezime = N "Andreev", Ime = N "Andrey", MiddleName = NULL, Plaća = 2000, BonusPercent = 30 GDJE ID = 1003 - Andreev A.A.

Provjerite jesu li podaci uspješno ažurirani:

ODABERITE * IZ Zaposlenika

iskaznica Ime Prezime Ime Srednje ime Plaća BonusPercent
1000 Ivanov I.I. Ivanov Ivan Ivanoviču 5000 50
1001 Petrov P.P. Petrov Petar Petroviču 1500 15
1002 Sidorov S.S. Sidorov Sidor NULL 2500 NULL
1003 Andreev A.A. Andrejev Andrej NULL 2000 30

Postavljanje aliasa za stupce upita

Mislim da će ovdje biti lakše pokazati nego napisati:

SELECT - dajte naziv izračunatom stupcu Prezime + "" + Ime + "" + MiddleName KAO puno ime, - koristite dvostruke navodnike, jer prostor se koristi HireDate AS "Datum prijema", - korištenje uglastih zagrada, budući da koristi se razmak Rođendan AS [Datum rođenja], - riječ AS nije obavezna Plaća ZP OD Zaposlenika

Puno ime datum primitka Datum rođenja ZP
Ivanov Ivan Ivanovič 2015-04-08 1955-02-19 5000
Petrov Petr Petrovič 2015-04-08 1983-12-03 1500
NULL 2015-04-08 1976-06-07 2500
NULL 2015-04-08 1982-04-17 2000

Kao što možete vidjeti, aliasi stupaca koje smo postavili odražavaju se u zaglavlju rezultirajuće tablice. Zapravo, ovo je glavna svrha pseudonima stupaca.

Napominjemo, jer zadnja 2 zaposlenika nemaju srednje ime (NULL vrijednost), tada nam je rezultat izraza "Prezime +" "+ FirstName +" "+ MiddleName" također vratio NULL.

Za spajanje (dodavanje, spajanje) nizova u MS SQL-u koristite simbol "+".

Zapamtite da će svi izrazi u kojima je NULL uključen (na primjer, dijeljenje s NULL, zbrajanje s NULL) vratiti NULL.

Napomenu.
U slučaju ORACLE, operator "||" se koristi za spajanje nizova. a spajanje će izgledati kao "Prezime ||" "|| Ime ||" "|| MiddleName". Za ORACLE je vrijedno napomenuti da ima iznimku za tipove nizova, za njih su NULL i prazan niz "" jedno te isto, stoga će se u ORACLE-u ovaj izraz vratiti za zadnja 2 zaposlenika Sidorov Sidor i Andreyev Andrey. U vrijeme verzije ORACLE 12c, koliko ja znam, ne postoji opcija koja mijenja ovo ponašanje (ako nije ispravno, ispravite me). Ovdje mi je teško procijeniti je li to dobro ili loše, jer u nekim slučajevima ponašanje NULL niza je prikladnije kao u MS SQL-u, au drugim kao u ORACLE-u.

Svi gornji aliasi stupaca također su važeći u ORACLE-u, osim [...].


Kako konstrukciju ne bismo ogradili funkcijom ISNULL, u MS SQL-u možemo koristiti funkciju CONCAT. Razmotrimo i usporedimo 3 opcije:

SELECT Prezime + "" + Ime + "" + MiddleName FullName1, - 2 opcije za zamjenu NULL praznim nizovima "" (dobivamo isto ponašanje kao u ORACLE) ISNULL (Prezime, "") + "" + ISNULL (Ime, "") + "" + ISNULL (MiddleName, "") FullName2, CONCAT (Prezime, "", FirstName, "", MiddleName) FullName3 FROM Employees

Puno ime1 Puno ime2 Puno ime3
Ivanov Ivan Ivanovič Ivanov Ivan Ivanovič Ivanov Ivan Ivanovič
Petrov Petr Petrovič Petrov Petr Petrovič Petrov Petr Petrovič
NULL Sidorov Sidor Sidorov Sidor
NULL Andrej Andrej Andrej Andrej

U MS SQL-u, aliasi se također mogu navesti pomoću znaka jednakosti:

ODABERITE "Datum prijema" = Datum zapošljavanja, - uz "..." i […] možete koristiti "..." [Datum rođenja] = rođendan, ZP = Plaća od zaposlenika

Korištenje ključne riječi AS ili znaka jednakosti za određivanje aliasa vjerojatno je više stvar ukusa. Ali kada analizirate zahtjeve drugih ljudi, ovo znanje može dobro doći.

Na kraju, reći ću da je za pseudonime bolje postaviti imena koristeći samo latinične znakove i brojeve, izbjegavajući korištenje "...", "..." i [...], odnosno koristiti ista pravila koje smo koristili prilikom imenovanja tablica. Nadalje, u primjerima ću koristiti samo takva imena, a ne "...", "..." i [...].

Osnovni SQL aritmetički operatori


Prioritet izvršenja aritmetičkih operatora je isti kao u matematici. Ako je potrebno, redoslijed operatora se može promijeniti pomoću zagrada - (a + b) * (x / (y-z)).

I još jednom ponavljam da svaka operacija s NULL daje NULL, na primjer: 10 + NULL, NULL * 15/3, 100 / NULL - sve će to rezultirati NULL. Oni. jednostavno govoreći, nedefinirana vrijednost ne može dati definitivan rezultat. Uzmite to u obzir prilikom sastavljanja upita i, ako je potrebno, obradite NULL vrijednosti s funkcijama ISNULL, COALESCE:

ODABIR ID, Ime, Plaća / 100 * BonusPercent AS Result1, - bez obrade NULL vrijednosti Plaća / 100 * ISNULL (BonusPercent, 0) KAO Rezultat2, - koristite funkciju ISNULL Plaća / 100 * COALESCE (BonusPercent, 0) KAO Rezultat3 - - koristimo funkciju SPAJANJE OD zaposlenika

Reći ću vam malo o funkciji COALESCE:

COALESCE (expr1, expr2, ..., exprn) - Vraća prvu vrijednost koja nije NULL na popisu vrijednosti.

SELECT COALESCE (f1, f1 * f2, f2 * f3) val - u ovom slučaju treća vrijednost će biti vraćena FROM (SELECT null f1, 2 f2, 3 f3) q

Uglavnom, fokusirat ću se na razgovor o DML konstrukcijama, a uglavnom neću govoriti o funkcijama koje će se naći u primjerima. Ako ne razumijete što radi ova ili ona funkcija, potražite njezin opis na Internetu, čak možete tražiti informacije odjednom po grupi funkcija, na primjer, pretraživanjem u Google pretraživanju "MS SQL niz funkcija", " MS SQL matematičke funkcije” ili “MS SQL funkcije koje rukuju NULL-om”. Postoji mnogo informacija o funkcijama i lako ih možete pronaći. Na primjer, u MSDN biblioteci možete pročitati više o funkciji COALESCE:

Izvod iz MSDN-a Usporedba COALESCE i CASE

COALESCE izraz je sintaktički prečac za CASE izraz. To znači da je kod COALESCE (izraz1, ... n) prepisan od strane optimizatora upita kao sljedeći CASE izraz:

CASE WHEN (izraz1 NIJE NULL) THEN izraz1 WHEN (izraz 2 NIJE NULL) THEN izraz2 ... ELSE izrazN END

Kao primjer, razmotrite kako možete upotrijebiti ostatak dijeljenja (%). Ovaj operator je vrlo koristan kada trebate podijeliti zapise u grupe. Na primjer, izvucimo sve zaposlenike koji imaju parne kadrovske brojeve (ID), t.j. oni ID-ovi koji su djeljivi s 2:

SELECT ID, Name FROM Employees WHERE ID% 2 = 0 - ostatak dijeljenja s 2 je 0

ORDER BY - sortiraj rezultat upita

Klauzula ORDER BY koristi se za sortiranje rezultata upita.

ODABERITE Prezime, Ime, Plaću OD Zaposlenika REDAJTE PO Prezime, Ime - poredajte rezultat po 2 stupca - Prezime, a poslije po Ime

Za napomenu. Za uzlazno sortiranje postoji ključna riječ ASC, ali budući da se uzlazno sortiranje koristi prema zadanim postavkama, možete zaboraviti na ovu opciju (ne sjećam se slučaja da sam jednom koristio ovu opciju).

Vrijedi napomenuti da u klauzuli ORDER BY možete koristiti i polja koja nisu navedena u klauzuli SELECT (osim u slučaju kada se koristi DISTINCT, o tome ću govoriti u nastavku). Na primjer, trčat ću malo unaprijed koristeći opciju TOP i pokazati kako, na primjer, možete odabrati 3 zaposlenika koji imaju najveću plaću, vodeći računa da ne bih trebao prikazivati ​​samu plaću zbog povjerljivosti:

ODABIR TOP 3 - vrati samo prva 3 zapisa iz cijelog ID-a rezultata, Prezime, Ime OD Zaposlenika ORDER BY Plaća DESC - sortiraj rezultat u silaznom redoslijedu plaće

iskaznica Prezime Ime
1000 Ivanov Ivan
1002 Sidorov Sidor

Naravno, ovdje se radi o slučaju da nekoliko zaposlenika može imati istu plaću i teško je reći koja će tri zaposlenika vratiti ovaj zahtjev, to već treba riješiti s voditeljem zadataka. Pretpostavimo da ste nakon razgovora o ovom problemu s upraviteljem zadataka pristali i odlučili koristiti sljedeću opciju - napraviti dodatno sortiranje po polju datuma rođenja (tj. mladi su nam dragi) i ako je datum rođenja nekoliko se zaposlenika može poklopiti (uostalom, to također nije isključeno), tada možete izvršiti treće sortiranje silaznim redoslijedom vrijednosti ID-a (u posljednjem koraku odabir će uključivati ​​one s maksimalnim ID-om - na primjer, one koji su zadnji primljeni, recimo kadrovski brojevi se kod nas izdaju uzastopno):

ODABIR VRH 3 - vrati samo prva 3 zapisa iz cijelog ID-a rezultata, Prezime, Ime OD Zaposlenika ORDER BY Plaća DESC, - 1. sortiraj rezultat u silaznom redoslijedu Plaća Rođendan, - 2. zatim po Datumu rođenja ID DESC - 3. a za potpunu nedvosmislenost rezultata dodajemo sortiranje po ID-u

Oni. pokušajte rezultat upita učiniti predvidljivim, tako da u slučaju pregleda leta možete objasniti zašto su upravo te osobe uvrštene na “crnu listu”, tj. sve je izabrano pošteno, prema odobrenim pravilima.

Razvrstavanje se također može izvršiti pomoću različitih izraza u klauzuli ORDER BY:

ODABERITE Prezime, Ime OD Zaposlenika REDUS PO KONKATU (Prezime, "", Ime) - koristite izraz

Također, u ORDER BY, možete koristiti pseudonime navedene za stupce:

ODABIR CONCAT (Prezime, "", Ime) fi FROM Employees ORDER BY fi - koristeći alias

Treba napomenuti da se u slučaju korištenja klauzule DISTINCT u klauzuli ORDER BY mogu koristiti samo stupci navedeni u bloku SELECT. Oni. nakon primjene operacije DISTINCT, dobivamo novi skup podataka, s novim skupom stupaca. Iz tog razloga, sljedeći primjer neće raditi:

ODABIR DISTINCT Prezime, Ime, Plaća OD Zaposlenika ORDER BY ID - ID nije prisutan u konačnom setu, koji smo dobili koristeći DISTINCT

Oni. ORDER BY klauzula se primjenjuje na skup rezultata, prije nego što se rezultat vrati korisniku.

Napomena 1. Također, u klauzuli ORDER BY možete koristiti brojeve stupaca koji su navedeni u SELECT:

ODABERI Prezime, Ime, Plaću OD Zaposlenika ORDER BY - redoslijed redoslijeda od 3 DESC, - 1.smanjenje plaće 1, - 2.prezime 2 - 3.by Ime

Za početnike izgleda prikladno i primamljivo, ali bolje je zaboraviti i nikada ne koristiti ovu opciju razvrstavanja.

Ako je u ovom slučaju (kada su polja izričito navedena) ova opcija još uvijek prihvatljiva, onda je za slučaj koji koristi "*" bolje nikada ne koristiti ovu opciju. Zašto - jer ako netko, na primjer, promijeni redoslijed stupaca u tablici, ili izbriše stupce (a to je normalna situacija), vaš upit također može raditi, ali već pogrešno, jer sortiranje već može ići na druge stupce, a to je podmuklo jer se ova pogreška možda neće otkriti vrlo brzo.

Kada bi stupci bili eksplicitno navedeni, onda bi u gornjoj situaciji upit ili nastavio raditi, ali i ispravno (pošto je sve eksplicitno definirano), ili bi jednostavno dao grešku da ovaj stupac ne postoji.

Dakle, možete sigurno zaboraviti na sortiranje prema brojevima stupaca.

Napomena 2.
U MS SQL-u, pri sortiranju uzlaznim redoslijedom, najprije će se pojaviti NULL vrijednosti.

ODABIR BonusPercent IZ Zaposlenika ORDER BY BonusPercent

Sukladno tome, kada koristite DESC, oni će biti na kraju

ODABERITE BonusPercent IZ Zaposlenika RED BY BonusPercent DESC

Ako trebate promijeniti logiku za razvrstavanje NULL vrijednosti, upotrijebite izraze, na primjer:

ODABIR BonusPercent FROM Employees ORDER PO ISNULL (BonusPercent, 100)

ORACLE nudi 2 opcije za ovu svrhu NULLS FIRST i NULLS LAST (koristi se prema zadanim postavkama). Na primjer:

ODABERITE BonusPercent OD Zaposlenika POREDI PO BonusPercent DESC NULL LAST

Obratite pažnju na to kada prelazite na određenu bazu podataka.

TOP - vraća navedeni broj zapisa

Izvod iz MSDN-a. TOP - Ograničava broj redaka vraćenih u skupu rezultata upita na određeni broj ili postotak. Ako se klauzula TOP koristi zajedno s klauzulom ORDER BY, tada je skup rezultata ograničen na prvih N redaka sortiranog rezultata. Inače, prvih N redaka vraća se nedefiniranim redoslijedom.

Obično se ovaj izraz koristi s klauzulom ORDER BY i već smo pogledali primjere kada je bilo potrebno vratiti prvih N redaka iz skupa rezultata.

Bez ORDER BY, ova klauzula se obično koristi kada samo trebate pogledati nam nepoznatu tablicu u kojoj može biti puno zapisa, u ovom slučaju, na primjer, možemo tražiti da nam vrati samo prvih 10 redaka , ali radi jasnoće reći ćemo samo 2:

ODABERITE TOP 2 * OD Zaposlenika

Također možete odrediti riječ PERCENT, kako biste vratili odgovarajući postotak redaka iz skupa rezultata:

ODABERITE NAJBOLJIH 25 POSTO * OD Zaposlenika

U mojoj praksi češće se koristi odabir po broju redaka.

Također možete koristiti opciju WITH TIES s TOP, što će pomoći da se vrate svi retki u slučaju dvosmislenog sortiranja, tj. ova rečenica će vratiti sve retke koji su po sastavu jednaki recima koji spadaju u odabir TOP N, kao rezultat toga može se odabrati više od N redaka. Dodajmo još jednog "Programera" s plaćom od 1500 za demonstraciju:

INSERT Employees (ID, Name, Email, PositionID, DepartmentID, ManagerID, Plaća) VRIJEDNOSTI (1004, N "Nikolaev N.N.", " [e-mail zaštićen]",3,3,1003,1500)

I uvest ćemo još jednog zaposlenika bez navođenja pozicije i odjela s plaćom od 2000:

INSERT Employees (ID, Name, Email, PositionID, DepartmentID, ManagerID, Plaća) VRIJEDNOSTI (1005, N "Aleksandrov A.A.", " [e-mail zaštićen]", NULL, NULL, 1000,2000)

Sada upotrijebimo opciju S VEZAMA da odaberemo sve zaposlenike čija plaća odgovara plaćama 3 zaposlenika, s najmanjom plaćom (nadam se da će kasnije postati jasno na što ciljam):

ODABERITE TOP 3 S KRAVAMA ID, Ime, Plaća OD Zaposlenika RED PO Plaći

Ovdje, iako je naznačen TOP 3, zahtjev je vratio 4 zapisa, budući da vrijednost plaće koja je vratila TOP 3 (1500 i 2000) pronađena je kod 4 zaposlenika. Očigledno funkcionira ovako:

Napomenu.
U različitim bazama podataka TOP se implementira na različite načine, u MySQL-u za to postoji klauzula LIMIT u kojoj možete dodatno postaviti početni pomak.

U ORACLE 12c također su predstavili vlastiti analog koji kombinira funkcionalnost TOP i LIMIT - pretraživanje po riječima "ORACLE OFFSET FETCH". Prije 12c, ROWNUM pseudostupac se obično koristio u tu svrhu.


Ali što se događa ako istodobno primijenite klauzule DISTINCT i TOP? Na ova pitanja je lako odgovoriti eksperimentiranjem. Općenito, nemojte se bojati i nemojte biti lijeni eksperimentirati, tk. većina se nauči u praksi. Redoslijed riječi u naredbi SELECT je sljedeći, pri čemu je prvo DISTINCT, a zatim TOP, tj. ako razmišljate logično i čitate s lijeva na desno, onda će prvo biti odbacivanje duplikata, a onda će se napraviti TOP na ovom setu. Pa, provjerimo i uvjerimo se da je to slučaj:

ODABERITE DISTINCT TOP 2 Plaća OD Zaposlenika RED PO Plaći

Plaća
1500
2000

Oni. Kao rezultat toga, dobili smo 2 najmanje plaće od svih. Naravno, može postojati slučaj da plaća za neke zaposlenike možda nije navedena (NULL), jer shema nam to omogućuje. Stoga, ovisno o zadatku, odlučujemo ili obraditi NULL vrijednosti u klauzuli ORDER BY ili jednostavno odbaciti sve zapise u kojima je Salary NULL, a za to se okrećemo proučavanju klauzule WHERE.

GDJE - uvjet za odabir redaka

Ova ponuda služi za filtriranje zapisa prema određenom uvjetu. Na primjer, izaberimo sve zaposlenike koji rade u "IT" odjelu (njegov ID = 3):

ODABIR ID, Prezime, Ime, Plaća FROM Employees WHERE ID odjela = 3 - RED PO Prezime, Ime

iskaznica Prezime Ime Plaća
1004 NULL NULL 1500
1003 Andrejev Andrej 2000
1001 Petrov Petar 1500

Klauzula WHERE je napisana prije naredbe ORDER BY.

Redoslijed kojim se naredbe primjenjuju na izvorni skup zaposlenika je sljedeći:

  1. GDJE - ako je navedeno, tada je prva stvar iz cijelog skupa Zaposlenika odabrati samo zapise koji zadovoljavaju uvjet
  2. DISTINCT - ako je navedeno, svi duplikati se odbacuju
  3. ORDER BY - ako je navedeno, vrši se sortiranje rezultata
  4. TOP - ako je navedeno, iz sortiranog rezultata vraća se samo navedeni broj zapisa

Razmotrimo primjer radi jasnoće:

ODABIR DISTINCT TOP 1 Plaća OD Zaposlenika GDJE ID odjela = 3 RED PO Plaći

To će izgledati ovako:

Vrijedi napomenuti da se provjera NULL-a ne vrši predznakom jednakosti, već pomoću operatora IS NULL i IS NOT NULL. Samo zapamtite da ne možete usporediti s NULL pomoću operatora "=" (znak jednakosti), jer rezultat izraza će također biti NULL.

Na primjer, odaberimo sve zaposlenike koji nemaju naveden odjel (tj. ID odjela JE NULL):

SELECT ID, Name FROM Employees WHERE DepartmentID JE NULL

Sada, na primjer, izračunajmo bonus za sve zaposlenike koji imaju vrijednost BonusPercent (tj. BonusPercent NIJE NULL):

ODABIR ID, Ime, Plaća / 100 * BonusPercent KAO Bonus OD Zaposlenika GDJE BonusPercent NIJE NULL

Inače, ako malo bolje razmislite, vrijednost BonusPercent može biti nula (0), a vrijednost se može unijeti i sa predznakom minus, jer ovom polju nismo nametnuli nikakva ograničenja.

Pa, nakon razgovora o problemu, dosad nam je rečeno da razmotrimo da ako (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:

ODABIR ID, Ime, Plaća / 100 * BonusPercent KAO Bonus OD Zaposlenika GDJE NE (BonusPercent<=0 OR BonusPercent IS NULL)

Oni. ovdje smo počeli proučavati booleove operatore. Izraz u zagradama “(BonusPercent<=0 OR BonusPercent IS NULL)» проверяет на то что у сотрудника нет бонуса, а NOT инвертирует это значение, т.е. говорит «верни всех сотрудников которые не сотрудники у которых нет бонуса».

Također, ovaj izraz se može prepisati i odmah reći "vrati sve zaposlenike koji imaju bonus" izražavajući to izrazom (BonusPercent> 0 i BonusPercent IS NOT NULL):

ODABIR ID, Ime, Plaća / 100 * BonusPercent KAO Bonus OD Zaposlenika GDJE BonusPercent> 0 I BonusPercent NIJE NULL

Također, u klauzuli WHERE možete provjeriti različite vrste izraza pomoću aritmetičkih operatora i funkcija. Na primjer, slična se provjera može napraviti pomoću izraza s funkcijom ISNULL:

ODABIR ID, Ime, Plaća / 100 * BonusPercent KAO Bonus OD Zaposlenika GDJE ISNULL (BonusPercent, 0)> 0

Logički i jednostavni operatori za usporedbu

Da, ovdje ne možete bez matematike, pa krenimo na kratki izlet u Booleove i jednostavne operatore usporedbe.

Postoje samo 3 Booleova operatora u SQL-u - AND, OR i NOT:

Za svaki Boolean operator možete donijeti tablice istinitosti, koje dodatno pokazuju kakav će biti rezultat kada uvjeti mogu biti jednaki NULL:

Postoje sljedeći jednostavni operatori usporedbe koji se koriste za formiranje uvjeta:

Osim toga, postoje 2 operatora za testiranje vrijednosti/izraza za NULL:

JE NULL Provjera jednakosti NULL
NIJE NULL Provjera NULL nejednakosti

Prioritet: 1) Svi operatori usporedbe; 2) NE; 3) I; 4) ILI.

Prilikom konstruiranja složenih logičkih izraza koriste se zagrade:

((uvjet1 I uvjet2) ILI NE (uvjet3 I uvjet4 I uvjet5)) ILI (…)

Također, pomoću zagrada možete promijeniti standardni slijed izračuna.

Ovdje sam pokušao dati ideju o Booleovoj algebri u dovoljnoj količini za rad. Kao što vidite, da pišete kompliciranije uvjete, ne možete bez logike, ali ovdje je nema puno (I, ILI i NE) i ljudi su to izmislili, tako da je sve logično.

Idemo do kraja drugog dijela

Kao što vidite, čak i o osnovnoj sintaksi naredbe SELECT možete pričati jako dugo, ali kako bismo ostali unutar okvira članka, na kraju ću pokazati dodatne logičke operatore - BETWEEN, IN i KAO.

IZMEĐU - provjerite ulazak u raspon

Testirana_vrijednost IZMEĐU početne_vrijednosti I krajnje_vrijednosti

Izrazi se mogu koristiti kao vrijednosti.

Uzmimo primjer:

ODABERITE ID, Ime, Plaću OD Zaposlenika GDJE Plaća IZMEĐU 2000 I 3000 - tko ima plaću u rasponu od 2000-3000

Zapravo, BETWEEN je pojednostavljena oznaka kao što je:

ODABERITE ID, Ime, Plaću OD Zaposlenika GDJE Plaća> = 2000 I Plaća<=3000 -- все у кого ЗП в диапозоне 2000-3000

Prije riječi IZMEĐU može se koristiti riječ NOT koja će provjeriti vrijednost da ne ulazi u navedeni raspon:

ODABERITE ID, Ime, Plaću OD Zaposlenika GDJE Plaća NE IZMEĐU 2000 I 3000 - slično NE (Plaća> = 2000 I Plaća<=3000)

Sukladno tome, u slučaju korištenja BETWEEN, IN, LIKE, također ih možete kombinirati s drugim uvjetima pomoću AND i OR:

ODABERITE ID, Ime, Plaću OD Zaposlenika GDJE Plaća IZMEĐU 2000 I 3000 - tko ima plaću u rasponu od 2000-3000 I DepartmentID = 3 - računajte samo zaposlenike odjela 3

IN - provjeriti ulazak u popis vrijednosti

Ovaj operator izgleda ovako:

Testirana_vrijednost IN (vrijednost1, vrijednost2, ...)

Mislim da je to lakše prikazati na primjeru:

ODABERITE ID, Ime, Plaću FROM Employees WHERE PositionID IN (3,4) - tko ima poziciju 3 ili 4

Oni. u biti je isti kao sljedeći izraz:

ODABERITE ID, ime, plaću od zaposlenika GDJE PositionID = 3 ILI PositionID = 4 - tko ima poziciju 3 ili 4

U slučaju NE, bit će isto (dobivamo sve osim onih iz odjela 3 i 4):

ODABERITE ID, ime, plaću od zaposlenika GDJE PositionID NIJE IN (3,4) - slično NOT (ID pozicije = 3 ILI PositionID = 4)

Također, upit s NOT IN može se izraziti kroz AND:

ODABERITE ID, Ime, Plaću FROM Employees WHERE PositionID<>3 I ID pozicije<>4 - ekvivalent PositionID NOT IN (3,4)

Imajte na umu da nećete moći tražiti NULL vrijednosti pomoću IN klauzule, jer provjera NULL = NULL također će vratiti NULL, a ne True:

SELECT ID, Name, DepartmentID FROM Employees WHERE DepartmentID IN (1,2, NULL) - NULL zapisi neće biti uključeni u rezultat

U tom slučaju podijelite ček na nekoliko uvjeta:

ODABIR ID, naziv, ID odjela OD zaposlenika GDJE ID odjela IN (1,2) - 1 ili 2 ILI DepartmentID JE NULL - ili NULL

Ili možete napisati nešto poput:

SELECT ID, Name, DepartmentID FROM Employees WHERE ISNULL (DepartmentID, -1) IN (1,2, -1) - ako ste sigurni da ne postoji odjel s ID = -1

Mislim da će prva opcija, u ovom slučaju, biti ispravnija i pouzdanija. U redu, ovo je samo primjer, da se pokaže koje se druge strukture mogu izgraditi.

Također je vrijedno spomenuti još podmukliju pogrešku vezanu za NULL, a koja se može napraviti kada se koristi NOT IN konstrukcija. Na primjer, pokušajmo odabrati sve zaposlenike, osim onih čiji je odjel jednak 1 ili čiji odjel uopće nije naveden, t.j. je NULL. Kao rješenje sugerira se opcija:

ODABIR ID, naziv, ID odjela OD zaposlenika GDJE ID odjela NIJE IN (1, NULL)

No nakon izvršenja upita nećemo dobiti niti jedan redak, iako smo očekivali da ćemo vidjeti sljedeće:

Opet, šalu je ovdje odigrao NULL naveden u popisu vrijednosti.

Pogledajmo zašto je u ovom slučaju došlo do logičke pogreške. Proširimo upit pomoću I:

SELECT ID, Name, DepartmentID FROM Employees WHERE DepartmentID<>1 I ID odjela<>NULL - problem zbog ove provjere NULL - ovaj uvjet će uvijek vratiti NULL

Pravo stanje (ID odjela<>NULL) uvijek će nam ovdje dati nesigurnost, t.j. NULL. Sada se prisjetimo tablice istinitosti za operator AND, gdje (TRUE AND NULL) daje NULL. Oni. kada je ispunjen lijevi uvjet (ID odjela<>1) zbog nedefiniranog ispravnog uvjeta, kao rezultat, dobivamo nedefiniranu vrijednost cijelog izraza (DepartmentID<>1 I ID odjela<>NULL), tako da niz neće biti uključen u rezultat.

Uvjet možete ispravno prepisati na sljedeći način:

ODABERITE ID, ime, ID odjela IZ Employees WHERE DepartmentID NOT IN (1) - ili u ovom slučaju samo DepartmentID<>1 I DepartmentID NIJE NULL - i zasebno provjerite NOT NULL

IN se još uvijek može koristiti s podupitima, ali vratit ćemo se na taj oblik u kasnijim dijelovima ovog vodiča.

LIKE - provjerite niz prema uzorku

Govorit ću o ovom operatoru samo u njegovom najjednostavnijem obliku, koji je standard i podržava ga većina dijalekata jezika SQL. Čak i u ovom obliku, može se koristiti za rješavanje mnogih problema koji zahtijevaju provjeru sadržaja niza.

Ovaj operator izgleda ovako:

Testirani_string LIKE string_pattern

Sljedeći posebni znakovi mogu se koristiti u "pattern_string":

  1. Podvlaka "_" - govori da umjesto njega može biti bilo koji pojedinačni znak
  2. Znak postotka "%" - kaže da na njegovom mjestu može biti bilo koji broj znakova, uključujući nijedan
Razmotrimo primjere sa simbolom "%" (usput rečeno, u praksi se češće koristi):

SELECT ID, Name FROM Employees WHERE Ime KAO "Pet%" - čije ime počinje slovima "Pet" SELECT ID, Prezime FROM Employees GDJE Prezime KAO "% s" - čije prezime završava sa "s" SELECT ID, Prezime FROM Zaposlenici GDJE Prezime KAO "% pe%" - čije prezime sadrži kombinaciju "pe"

Pogledajmo primjere sa simbolom "_":

ODABIR ID, Prezime OD Zaposlenika GDJE Prezime KAO "_yetrov" - za koga se prezime sastoji od bilo kojeg prvog znaka praćenog slovima "etrov" ODABIR ID, Prezime OD Zaposlenika GDJE Prezime KAO "____ s" - za koga se prezime sastoji od bilo koja četiri znaka i sljedeća slova "s"

Uz pomoć ESCAPE, možete odrediti escape znak, koji poništava radnju provjere valjanosti posebnih znakova "_" i "%". Ova se klauzula koristi kada želite izravno provjeriti prisutnost znaka postotka ili donje crte u nizu.

Da bismo demonstrirali ESCAPE, stavimo malo smeća u jedan unos:

UPDATE Zaposlenici SET Ime = "It's_trash containing%" WHERE ID = 1005

I da vidimo što vraćaju sljedeći upiti:

ODABERITE * IZ Zaposlenika GDJE Ime KAO "%! %%" BJEŽI "!" - redak sadrži znak "%" SELECT * FROM Employees WHERE Ime LIKE "%! _%" ESCAPE "!" - redak sadrži "_"

Ako trebate provjeriti niz za potpuno podudaranje, onda je umjesto LIKE bolje koristiti samo znak "=":

SELECT * FROM Employees WHERE Ime = "Petar"

Napomenu.
U MS SQL-u, u predlošku operatora LIKE, također možete postaviti pretragu po regularnim izrazima, pročitajte o tome na internetu ako vam standardne mogućnosti ovog operatora nisu dovoljne.

ORACLE koristi funkciju REGEXP_LIKE za traženje regularnih izraza.

Malo o žicama

U slučaju provjere niza na prisutnost Unicode znakova, morat ćete staviti znak N ispred navodnika, tj. N "...". No budući da imamo sva znakovna polja u tablici u Unicode formatu (tip nvarchar), uvijek možete koristiti ovaj format za ta polja. Primjer:

SELECT ID, Name FROM Employees WHERE Ime LIKE N "Pet%" SELECT ID, Prezime FROM Employees WHERE Prezime = N "Petrov"

Ako se radi ispravno, kada uspoređujete s poljem tipa varchar (ASCII), trebali biste pokušati koristiti provjere pomoću "...", a kada uspoređujete polje s tipom nvarchar (Unicode), trebali biste pokušati koristiti provjere pomoću N " ...". To je učinjeno kako bi se izbjegle implicitne pretvorbe tipa tijekom izvršavanja upita. Isto pravilo se koristi prilikom umetanja (INSERT) vrijednosti u polje ili njihovog ažuriranja (UPDATE).

Kada uspoređujete nizove, vrijedi uzeti u obzir da, ovisno o postavci baze podataka (kolaciji), usporedba nizova može biti neosjetljiva na velika i mala slova (kada je "Petrov" = "PETROV") ili osjetljiva na velika i mala slova (kada je "Petrov"<>"PETROV").
U slučaju postavke osjetljive na velika i mala slova, ako želite izvršiti pretraživanje bez obzira na velika i mala slova, možete, na primjer, napraviti preliminarnu pretvorbu desnog i lijevog izraza u jedno veliko i veliko - gornje ili donje:

ODABIR ID, Ime OD Zaposlenika GDJE GORNJE (Ime) LIKE UPPER (N "Pet%") - ili LOWER (Ime) LIKE LOWER (N "Pet%") ODABIR ID, Prezime OD Zaposlenika GDJE UPPER (Prezime) = UPPER ( N "Petrov") - ili LOWER (Prezime) = LOWER (N "Petrov")

Malo o datumima

Prilikom provjere datuma, možete koristiti, kao i kod nizova, jednostruke navodnike "...".

Bez obzira na regionalne postavke u MS SQL-u, možete koristiti sljedeću sintaksu datuma "GGGGMMDD" (godina, mjesec, dan bez razmaka). MS SQL će uvijek razumjeti ovaj format datuma:

ODABERITE ID, Ime, Rođendan OD Zaposlenika GDJE Rođendan IZMEĐU "19800101" I "19891231" - Zaposlenici 80-ih SREDSTVA PO rođendanu

U nekim je slučajevima prikladnije postaviti datum pomoću funkcije DATEFROMPARTS:

ODABERITE ID, Ime, Rođendan OD Zaposlenika GDJE Rođendan IZMEĐU DATEFROMPARTS (1980,1,1) I DATEFROMPARTS (1989,12,31) RED PO rođendanu

Postoji i slična funkcija DATETIMEFROMPARTS, koja se koristi za postavljanje datuma i vremena (za vrstu datuma i vremena).

Također možete koristiti funkciju CONVERT ako trebate pretvoriti niz u vrijednost datuma ili vremena:

ODABIR PRETVORI (datum, "03/12/2015", 104), PRETVORI (datum i vrijeme, "2014-11-30 17:20:15", 120)

Vrijednosti 104 i 120 označavaju koji se format datuma koristi u nizu. Možete pronaći opis svih valjanih formata u MSDN biblioteci traženjem "MS SQL CONVERT".

Postoji puno funkcija za rad s datumima u MS SQL-u, potražite "ms sql funkcije za rad s datumima".

Bilješka. Svi dijalekti jezika SQL imaju svoj skup funkcija za rad s datumima i primjenjuju vlastiti pristup radu s njima.

Malo o brojevima i njihovim transformacijama

Informacije u ovom odjeljku vjerojatno će biti korisnije IT stručnjacima. Ako niste, a vaš je cilj jednostavno naučiti pisati upite kako biste dobili informacije koje su vam potrebne iz baze podataka, možda vam takve suptilnosti neće trebati, ali u svakom slučaju možete preskočiti tekst i uzeti nešto na znanje , jer... ako ste počeli učiti SQL, već ulazite u IT.

Za razliku od funkcije pretvorbe CAST, funkcija CONVERT omogućuje postavljanje trećeg parametra, koji je odgovoran za stil (format) pretvorbe. Različite vrste podataka mogu imati vlastiti skup stilova koji mogu utjecati na vraćeni rezultat. Već smo se dotakli upotrebe stilova kada smo gledali pretvaranje niza s funkcijom CONVERT u tipove datuma i datuma i vremena.

Više detalja o CAST, CONVERT i stilovima možete pronaći u MSDN - "CAST i CONVERT funkcije (Transact-SQL)": msdn.microsoft.com/ru-ru/library/ms187928.aspx

Da bismo pojednostavili primjere, ovdje će se koristiti Transact-SQL izrazi DECLARE i SET.

Naravno, u slučaju pretvaranja cijelog broja u realni broj (što sam dao na početku ove lekcije, kako bih pokazao razliku između cjelobrojnog i realnog dijeljenja), poznavanje nijansi pretvorbe nije toliko kritično, od tamo smo izvršili konverziju cijelih u realni (čiji je raspon mnogo veći od raspona cijelih brojeva):

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), @min_int AS float, @ CONVERT14, 7 - CONVERT14, 7 (@max_int AS float), CONVERT (float, @ max_int), - numerički (16.6) @ min_int / 1., - (-2147483648.000000) @ max_int / 1. - 2147483647.000000

Možda nije bilo vrijedno specificirati metodu implicitne konverzije dobivene dijeljenjem s (1.), budući da preporučljivo je pokušati izvršiti eksplicitne pretvorbe, radi veće kontrole nad vrstom dobivenog rezultata. Iako, u slučaju da želimo dobiti rezultat tipa numeric, s navedenim brojem znamenki iza decimalne točke, onda možemo koristiti trik u MS SQL-u da pomnožimo cjelobrojnu vrijednost s (1., 1.0, 1.00, itd. ):

DECLARE @int int SET @ int = 123 SELECT @ int * 1., - numerički (12, 0) - 0 decimalnih mjesta @ int * 1.0, - numerički (13, 1) - 1 znak @ int * 1.00, - numerički ( 14, 2) - 2 znamenke - iako je ponekad bolje napraviti eksplicitnu pretvorbu CAST (@int AS numerički (20, 0)), - 123 CAST (@int AS numerički (20, 1)), - 123.0 CAST ( @int AS numerički (20, 2)) - 123,00

U nekim slučajevima pojedinosti pretvorbe mogu biti jako važne jer utječu na ispravnost dobivenog rezultata, na primjer, prilikom pretvaranja numeričke vrijednosti u niz (varchar). Pogledajmo primjere pretvaranja vrijednosti novca i float u varchar:

Ponašanje pri pretvaranju novca u varchar DECLARE @money money SET @money = 1025.123456789 - doći će do implicitne konverzije u 1025.1235, jer vrsta novca pohranjuje samo 4 znamenke nakon decimalne točke SELECT @money, - 1025.1235 - prema zadanim postavkama CAST i CONVERT ponašaju se isto (tj., grubo govoreći, primjenjuje se stil 0) CAST (@money kao varchar (20)), - 1025.12 CONVERT (varchar (20), @money), - 1025.12 CONVERT (varchar (20), @money, 0), - 1025.12 (stil 0 - bez separatora tisućice i 2 decimalna mjesta (zadani format)) CONVERT (varchar (20) , @money, 1), - 1,025,12 (stil 1 - koristite separator tisućice i 2 decimalna mjesta) PRETVORI (varchar (20), @money, 2) - 1025,1235 (stil 2 - bez separatora i 4 znamenke nakon decimalne točke)

Ponašanje prilikom pretvaranja plutaju na varchar proglasi 'float1 plovak SET' float1 = 1025,123456789 proglasiti 'float2 plovak SET' float2 = 1.231.025,123456789 SELECT 'float1 - 1025,123456789' float2 - 1.231.025,12345679 - ponašaju isto kao CAST i pretvoriti (tj To jest, približno govoreći , primjenjuje se stil 0) - stil 0 - Ne više od 6 znamenki. Kada je potrebno, koristi se eksponencijalna notacija brojeva - pri pretvaranju u varchar ovdje se događaju stvarno strašne stvari CAST (@ float1 kao varchar (20)), - 1025.12 CONVERT (varchar (20), @ float1), - 1025.12 CONVERT (varchar ( 20 ), @ float1, 0), - 1025.12 CAST (@ float2 kao varchar (20)), - 1.23103e + 006 CONVERT (varchar (20), @ float2), - 1.23103e + 006 CONVERT (varchar (20 ), @ float2, 0), - 1.23103e + 006 - stil 1 - Uvijek 8 bita. Uvijek se koristi eksponencijalna notacija. - ovaj stil za float također nije baš precizan CONVERT (varchar (20), @ float1, 1), - 1.0251235e + 003 CONVERT (varchar (20), @ float2, 1), - 1.2310251e + 006 - stil 2 - Uvijek 16 bit. Uvijek se koristi eksponencijalna notacija. - ovdje s boljom preciznošću CONVERT (varchar (30), @ float1, 2), - 1.025123456789000e + 003 - OK CONVERT (varchar (30), @ float2, 2) - 1.231025123456706e - +

Kao što možete vidjeti iz primjera, plutajući tipovi float, real u nekim slučajevima stvarno mogu stvoriti veliku pogrešku, posebno kada se destiliraju u niz i natrag (to može biti s raznim vrstama integracija, kada se podaci, na primjer, prenose u tekstualne datoteke s jednog sustava na drugi) ...

Ako trebate eksplicitno kontrolirati preciznost do određenog predznaka, više od 4, ponekad je bolje koristiti decimalni/numerički tip za pohranu podataka. Ako su dovoljna 4 znaka, onda možete koristiti vrstu novca - otprilike odgovara brojčanoj (20,4).

Decimalni numerički proglasiti @money novca SET @money = 1025,123456789 - 1025,1235 proglasiti @ float1 plovak SET 'float1 = 1025,123456789 proglasiti' float2 plovak SET 'float2 = 1.231.025,123456789 proglasiti @numeric Cumeric (2867) SET45 @numeric kao VARCHAR (20)), - 1025.12345679 CONVERT (varchar (20), @numeric), - 1025.12345679 CAST (@money kao numerički (28,9)), - 1025.123500000 CAST (@ float1 kao brojčani (28 , 925) kao brojčani (28 , 925) , (28,9)) - 1231025.123456789

Bilješka.
Od MS SQL 2008 umjesto konstrukcije možete koristiti:
  • ms sql poslužitelj
  • Dodaj oznake

    Vrhunski povezani članci