Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Sigurnost
  • Strukturirani jezik upita - SQL: istorija, standardi, osnovni jezički operatori. Svrha SQL jezika

Strukturirani jezik upita - SQL: istorija, standardi, osnovni jezički operatori. Svrha SQL jezika

I preko podataka tabela.

Poziva se SQL jezik ugrađen pošto sadrži funkcije punopravnog razvojnog jezika i fokusiran 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 uključene u izvršni modul nakon kompilacije.
  • dinamičan upotreba jezika ( dinamički SQL) - dinamička konstrukcija poziva SQL funkcija i njihova interpretacija. Na primjer, možete se pozivati ​​na podatke udaljene baze podataka tokom izvršavanja programa.

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

Definicija 1

Performanse Je tabela 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 tabeli, * su označeni sa specifični operateri jezik.

Pogledajmo najvažnije SQL izraze.

    Izjava o kreiranju tabele:

    Ime tabele koja se kreira i ime najmanje jedne kolone (polja) su obavezni operandi. Za ime kolone morate navesti tip podataka koji će biti pohranjen u njemu.

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

    Primjer 1

    Za kreiranje tabele 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 tabele:

    Prilikom promjene strukture tabele možete dodati ( DODATI), promijeniti ( IZMJENI) ili izbrisati ( DROP) jedna ili više kolona tabele. Pravila snimanja za ovog operatera su ista kao i za operatera. CREATE TABLE... Ne morate specificirati za brisanje stupca.

    Primjer 2

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

    Operator za ispuštanje tablice:

    Primjer 3

    Na primjer, da ispustite postojeću tablicu pod nazivom knjige samo koristite operatera:

    Operator kreiranja indeksa:

    Operator kreira indeks na jednoj ili više kolona date tabele kako bi ubrzao operacije upita i pretraživanja. Za jednu tabelu može se kreirati više indeksa.

    Opciona opcija UNIQUE odgovoran je za osiguranje jedinstvenosti vrijednosti u svim stupcima koji su navedeni u izjavi.

    ASC postavlja automatsko sortiranje vrijednosti u kolonama uzlaznim redoslijedom (podrazumevano), i DESC- u opadajućem redosledu.

    Operator pada indeksa:

    Prikaži operatora kreiranja:

    Možete izostaviti nazive kolona kada kreirate pogled. Tada će se koristiti nazivi kolona iz upita, što opisuje odgovarajući operator SELECT.

    Prikaži operatora za brisanje:

    Operator odabira zapisa:

    Operater SELECT vrši odabire i proračune podataka iz jedne ili više tabela. Rezultat izvršavanja operatora je tabela odgovora koja sadrži ( SVE) ili ne sadrži ( DISTINCT) redovi koji se ponavljaju.

    Operand OD sadrži listu tabela 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 INSERT unose se novi zapisi sa navedenim vrijednostima u kolonama.

    U drugoj izjavi operatera INSERT uvode se novi redovi, birani iz druge tabele kroz rečenicu SELECT.

    Operator za brisanje zapisa:

    Kao rezultat izvršavanja operatora, iz navedene tablice se brišu redovi 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 svakom sistemu i dalje postoje glavne komponente - SQL izrazi.

Uvod

Uz pomoć SQL naredbi, vrijednosti, tabele se upravljaju i primaju na dalju analizu i prikaz. Oni su skup ključnih riječi pomoću kojih sistem razumije šta da radi sa 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 manipulaciju podacima

INSERT. Umeće redove u postojeću tabelu. Može se koristiti kako za jednu vrijednost, tako i za nekoliko, određenih određenim uvjetom. Na primjer:

naziv tabele (ime kolone 1, ime kolone 2)

VRIJEDNOSTI (vrijednost 1, vrijednost 2).

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

naziv tabele 1 (ime kolone 1, ime kolone 2)

SELECT ime kolone 1, ime kolone 2

IZ naziva tabele 2

WHERE ime tabele 2. ime kolone 1> 2

Ovaj upit će izabrati sve podatke iz tabele 2 koji su veći od 2 u koloni 1 i umetnuti ih u prvu.

UPDATE. Kao što naziv implicira, ovaj izraz SQL upita ažurira podatke u postojećoj tablici na temelju specifičnog atributa.

AŽURIRAJ naziv tabele 1

SET ime kolone 2 = "Vasily"

WHERE ime tabele 1. ime kolone 1 = 1

Ova konstrukcija će popuniti Vasilijevu vrijednost sve redove u kojima on naiđe na broj 1 u prvoj koloni.

Podaci iz tabele. Možete odrediti uvjet ili ukloniti sve linije.

DELETE FROM ime tablice

Naziv tabele WHERE Ime kolone 1 = 1

Gornji upit će izbrisati iz baze podataka sve podatke sa vrijednošću jedan u prvoj koloni. A ovako možete očistiti cijelu tabelu:

SELECT izraz

Glavna svrha SELECT je odabir podataka prema određenim uvjetima. Rezultat njegovog rada je uvijek nova tabela sa odabranim podacima. MS operator se može koristiti u širokom spektru upita. Stoga, uz to, možete razmotriti i druge povezane ključne riječi.

Da biste odabrali sve podatke iz određene tabele, koristite znak "*".

IZ naziva tabele 1

Rezultat ovog upita bit će tačna kopija tabele 1.

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

IZ naziva tabele 1

WHERE ime tabele 1. ime kolone 1> 2

Također možete naznačiti u odabiru da su potrebne samo određene kolone.

SELECT ime tabele 1. ime kolone 1

IZ naziva tabele 1

Rezultat ovog upita će biti svi redovi sa 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 tabele 1 naziv kolone 1

naziv tabele 1 naziv kolone 2

naziv tabele 1 naziv kolone 3

naziv tabele 1.ime kolone 2 * ime tabele 1.ime kolone 3 AS SUMMA

IZ naziva tabele 1

Ovaj naizgled složen upit dohvaća sve vrijednosti iz tabele 1, a zatim kreira nove kolone EQ i SUMMA. U prvom se upisuje znak "+", u drugom proizvod podataka iz kolona 2 i 3. Dobijeni rezultat se može prikazati u obliku tabele, da bi se razumjelo kako funkcionira:

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

naziv tabele 1 naziv kolone 1

naziv tabele 1 naziv kolone 2

naziv tabele 1 naziv kolone 3

IZ naziva tabele 1

ORDER BY naziv kolone 2

Dobivena tabela će izgledati ovako:

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

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

Tabela "Zaposleni".

Tabela plata

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

Employees.Room

Zaposleni Ime

Plata.Oklada

Plaća obračunata

OD zaposlenih, Plata

WHERE Employees.Broj = Plata.Broj

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

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

Jedan od glavnih operatera može izvršiti neke kalkulacije prilikom uzorkovanja. Da bi to učinio, koristi određene funkcije i formule.

Na primjer, da biste dobili broj zapisa iz tabele "Zaposleni", trebate koristiti upit:

ODABIR BROJ (*) KAO N

OD zaposlenih

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

Možete primijeniti takav upit i vidjeti šta se dešava:

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

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

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

AVG (Plata.Obračunata) KAO SRED

OD plate

Finalni sto će izgledati ovako:

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

Unija, ukrštanje i razlike

Kombinirajte više upita u SQL-u

SELECT Employees.Name

OD zaposlenih

GDJE Zaposleni.Broj = 1

SELECT Employees.Name

OD zaposlenih, Plata

GDJE Plata.Broj = 1

Treba imati na umu da sa takvim spajanjem tabele moraju biti kompatibilne. Odnosno, imati isti broj kolona.

SELECT Sintaksa iskaza i redoslijed obrade

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

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

Ako upit sadrži GROUP BY, tada se vrijednosti grupišu prema navedenim parametrima.

Operatori za poređenje podataka

Ima ih nekoliko vrsta. U SQL-u, operatori poređenja mogu testirati različite tipove vrijednosti.

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

    ">". Veliki 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.

LIKE

Ova ključna riječ se može prevesti kao "slično". Operator LIKE u SQL-u se koristi na isti način - on izvršava upit koristeći obrazac. Odnosno, omogućava vam da proširite izbor podataka iz baze podataka pomoću regularnih izraza.

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

OD zaposlenih

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.

CASE

Ovaj SQL Server izraz je implementacija višestrukog izbora. Podsjeća na konstrukciju prekidača u mnogim programskim jezicima. SQL CASE izraz izvodi akciju pod nekoliko uvjeta.

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

Tada se zahtjev može sastaviti ovako:

OD plate

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

KADA ODABRATE MIN ONDA Minimum

U tom kontekstu, sistem traži maksimalnu i minimalnu vrijednost u koloni Accrued. Zatim se pomoću KRAJ kreira polje "ukupno" u koje će se uneti "Maksimum" ili "Minimum", ovisno o rezultatu uvjeta.

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

Operatori definicije podataka

Ovaj prikaz vam omogućava da izvršite razne promjene u tabelama - kreiranje, brisanje, modificiranje i rad sa indeksima.

Prva stvar koju treba razmotriti je CREATE TABLE. Ne radi ništa više od kreiranja tabele. Ako samo upišete upit CREATE TABLE, ništa se neće dogoditi, jer postoji još nekoliko parametara koje treba navesti.

Na primjer, da biste kreirali poznatu tablicu "Zaposleni", trebate koristiti naredbe:

CREATE TABLE Zaposleni

(Broj broj (10) NOT 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 da li može biti jednako NULL.

DROP TABLE

Obavlja jedan jednostavan zadatak - brisanje navedene tabele. Ima dodatni parametar IF EXISTS. On proždire grešku pri ispuštanju ako tabela koju tražite ne postoji. Primjer upotrebe:

ISPUSTI TABELU Zaposleni AKO POSTOJI.

CREATE INDEX

SQL ima sistem indeksa koji može ubrzati pristup podacima. Općenito, to je veza koja upućuje na određenu kolonu. Možete kreirati indeks jednostavnim upitom:

CREATE INDEX naziv_indeksa

ON table_name (ime_kolone)

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

ALTER TABLE

Vrlo funkcionalan operater s brojnim opcijama. Generalno, mijenja strukturu, definiciju i smještaj tabela. Korišćen operator u Oracle SQL-u, Postgresu i mnogim drugim.

    DODATI. Dodaje kolonu u tabelu. Njegova sintaksa je sljedeća: ALTER TABLE table_name DODAJ column_name pohranjeni_tip_podataka. Može imati opciju IF NOT EXISTS za potiskivanje greške ako kolona koja se kreira već postoji;

    DROP. Uklanja kolonu. Takođe ima ključ IF EXISTS, bez kojeg će biti generisana greška koja ukazuje da nedostaje potrebna kolona;

    CHANGE. Služi za preimenovanje imena polja u navedeno. Primjer upotrebe: ALTER TABLE table_name CHANGE old_name new_name;

    IZMJENI. Ova naredba će vam pomoći da promijenite tip i dodatne atribute određene kolone. I koristi se ovako: ALTER TABLE table_name MODIFY column_name data_type atributi;

CREATE VIEW

U SQL-u postoji nešto što je pogled. Ukratko, ovo je neka vrsta virtuelne tabele sa podacima. Formira se kao rezultat selekcije koristeći SQL SELECT izraz. Pogledi mogu ograničiti pristup bazi podataka, sakriti ih, zamijeniti stvarna imena kolona.

Proces kreiranja odvija se jednostavnim zahtjevom:

CREATE VIEW ime pogleda KAO SELECT FROM * ime tablice

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

Malo o funkcijama

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

    COUNT. Broji zapise ili redove u određenoj tabeli. Kao parametar možete odrediti ime kolone, a zatim će se podaci preuzeti iz nje. SELECT COUNT * FROM Employees;

    AVG. odnosi se samo na kolone sa numeričkim podacima. Njegov rezultat je određivanje aritmetičke sredine svih vrijednosti;

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

    SUMA. Jednostavno je - funkcija izračunava zbir vrijednosti stupca. Koristi se isključivo za numerički tip podataka. Dodavanjem parametra DISTINCT upitu, sabrat će se samo jedinstvene vrijednosti;

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

    LEN. Jednostavna funkcija koja izračunava dužinu vrijednosti stupca. Rezultat će biti nova tabela koja prikazuje broj znakova;

    SAD. 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 rade male stvari, ali ipak čine dohvaćanje ili manipulaciju bazama podataka mnogo lakšim.

    AS. Koristi se kada trebate vizualno ukrasiti rezultat dodjeljivanjem navedenog imena rezultujućoj tabeli.

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

    NE. Operator daje suprotno od izraza.

    TRUNCATE. Briše podatke iz navedenog područja baze podataka. Razlikuje se od sličnih operatera po tome što je nemoguće oporaviti podatke nakon upotrebe. 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 nego pokušate TRUNCATE.

    LIMIT. Postavlja broj linija za izlaz. Posebnost operatora je da se uvijek nalazi na kraju. Potrebno je jedan obavezni parametar i jedan opcioni. Prvi pokazuje koliko redova sa odabranim podacima treba prikazati. A ako se koristi drugi, tada operator radi kao za raspon vrijednosti.

    UNION. Veoma zgodan operator za kombinovanje više upita. On se već sreo među primjerima ovoga u ovom članku. Možete prikazati potrebne redove iz nekoliko tabela tako što ćete ih kombinirati sa UNION za praktičniju upotrebu. Njegova sintaksa je sljedeća: SELECT column_name FROM table_name UNION SELECT other_column_name FROM other table_name. Rezultat će biti zaokretna tabela sa kombinovanim upitima.

    PRIMARNI KLJUČ. Prevedeno kao "primarni ključ". Zapravo, upravo se ta terminologija koristi u referentnim materijalima. To znači jedinstveni identifikator za string. Koristi se, po pravilu, prilikom kreiranja tabele za određivanje polja koje će je sadržavati.

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

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

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

    Ograničenja. Ako trebate da dobijete samo dva iz baze podataka sa hiljadama redova, onda biste trebali koristiti operatore poput LIMIT ili TOP. Nema potrebe za dohvaćanjem podataka korištenjem jezika za razvoj ljuske.

    Compound. Nakon preuzimanja podataka iz nekoliko tabela, mnogi programeri počinju da ih spajaju koristeći shell memoriju. Ali zašto? Uostalom, možete napraviti jedan zahtjev u kojem će sve to biti prisutno. Ne morate pisati dodatni kod i rezervisati dodatnu memoriju u sistemu.

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

    Mnogo zahtjeva. Ako morate da umetnete mnogo zapisa uzastopno, za optimizaciju biste trebali razmisliti o grupnom umetanju podataka sa jednim upitom. To će također povećati performanse cijelog sistema u cjelini.

    Sofisticirano postavljanje podataka. Prije izrade strukture baze podataka, morate razmisliti da li vam je potreban toliki broj tabela i polja. Možda postoji način da ih kombinujete 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žak" za memoriju, onda ga je potrebno koristiti. Na primjer, ako znate da numerička vrijednost u ovom polju neće premašiti 255, zašto onda koristiti 4-bajtni INT ako postoji TINYINT od 1 bajta.

Zaključak

U zaključku, treba napomenuti da se strukturirani jezik upita SQL danas koristi gotovo svugdje - web stranice, web servisi, programi za PC, aplikacije za mobilne uređaje. Stoga će poznavanje SQL-a pomoći svim granama razvoja.

Istovremeno, modifikacije standarda originalnog jezika ponekad se razlikuju jedna od druge. 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, malo je vjerovatno da će se 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 kreiranje, modificiranje i manipulaciju podacima u relacijskim bazama podataka. SQL jezik je baziran na relacionoj algebri i kolekcija je operatora.

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

Odabir podataka

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

SELECT kolonu IZ tabele

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 tabeli, na primjer:

Za odabir jedne kolone koristi se sljedeća sintaksa:

SELECT Kompanija

Primjer odabira više kolona izgleda ovako:

SELECT Kompanija, telefon,Mail

Ključna riječ FROM se koristi za specificiranje imena tabela iz kojih se preuzimaju zapisi, na primjer:

SELECT * OD Kupci

Ovaj upit će vratiti sva polja iz tabele Kupci.

Možete koristiti klauzulu WHERE da filtrirate rezultate koje vraća SELECT izraz (opciono)

ODABIR * IZ proizvoda GDJE Kategorija = 4

U klauzuli WHERE mogu se koristiti različiti izrazi,

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

na primjer:

ODABIR * 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:

< Меньше

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

<>Nije jednako

> Više

> = Veće ili jednako

ORDER BY klauzula (opciono) se koristi za sortiranje rezultirajućeg skupa podataka po jednoj ili više kolona. Ključne riječi ASC (uzlazno) ili DESC (opadajuće) se koriste za određivanje redoslijeda sortiranja. Podrazumevano, podaci se sortiraju uzlaznim redoslijedom.

Modifikacija podataka

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

UPDATE izjava

Naredba UPDATE se koristi za promjenu vrijednosti u jednoj ili više kolona tabele. Sintaksa za ovaj operator je:

UPDATE tablica SET stupac1 = izraz1 WHERE kriterij

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 dolara, možete pokrenuti sljedeći upit:

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

Izjava DELETE

Da izbrišete redove iz tabela, koristite naredbu DELETE, čija je sintaksa:

IZBRIŠI IZ tabele WHERE kriterijuma

Uklonite sve proizvode čija je vrijednost manja od 100:

IZBRIŠI IZ proizvoda GDJE Cijena< 100

OperaterINSERT

Za dodavanje zapisa u tabele, koristite naredbu INSERT, čija je sintaksa:

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

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

INSERT IN TO Customers (CustomerID, CompanyName) VRIJEDNOSTI (‘XYZ’, ‘XYZ Deli’)

Osnovu SQL jezika čine operatori, uslovno podeljeni u nekoliko grupa prema njihovim 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 šeme baze podataka

    CREATE TABLE - kreiranje tabele

    ALTER TABLE - modificirati tabelu

    DROP TABLE - ispustiti sto

    CREATE DOMAIN - kreirajte domenu

    ALTER DOMAIN - promijeniti domenu

    DROP DOMAIN - brisanje domene

    CREATE COLLATION - kreirajte sekvencu

    DROP COLLATION - brisanje sekvence

    CREATE VIEW - kreirajte pogled

    DROP VIEW - ukloniti pogled

Dml (jezik za upravljanje podacima) operatori

DML operatori - Operatori manipulacije podacima

    SELECT - odaberite redove iz tabela

    INSERT - dodati redove u tabelu

    UPDATE - promijeniti redove u tabeli

    DELETE - brisanje redova u tabeli

    COMMIT - urezivanje napravljenih promjena

    ROLLBACK - vraćanje izvršenih promjena

Operateri zaštite i kontrole podataka

    CREATE ASSERTION - kreirajte ograničenje

    DROP ASSERTION - ukloniti ograničenje

    GRANT - dodijelite privilegije korisniku ili aplikaciji za manipulaciju objektima

    REVOKE - opoziva 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 - ubacivanje redova u tabelu

Primjer 1 . Umetanje jednog reda u tabelu:

VRIJEDNOSTI (4, "Ivanov");

Primjer 2 ... Umetanje nekoliko redova u tabelu, izabranih iz druge tabele (podaci o dobavljačima iz tabele P, koji imaju brojeve veće od 2, ubacuju se u tabelu TMP_TABLE):

TMP_TABLE (PNUM, PNAME)

ODABIR PNUM, PNAME

GDJE P.PNUM> 2;

UPDATE - ažuriranje redova u tabeli

Primjer 3 ... Ažuriranje više redova u tabeli:

SET PNAME = "Pušnjikov"

GDJE P.PNUM = 1;

DELETE - brisanje redova u tabeli

Primjer 4 . Brisanje više redova u tabeli:

GDJE P.PNUM = 1;

Primjer 5 ... Brisanje svih redova u tabeli:

Primjeri korištenja naredbe SELECT

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

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

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

Rezultat SELECT izraza je uvijek tabela. Dakle, rezultati akcija čine SELECT naredbu 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 karakteristike relacione algebre, kao i dodatne karakteristike koje nisu dostupne u relacionoj algebri.

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

Govorit ću o DML-u u svojoj sekvenci razvijenoj iz ličnog iskustva. Usput ću pokušati da vam ispričam i o "klizavim" mestima na koja se vredi usredsrediti, ovim "klizavim" mestima koja su slična u mnogim dijalektima SQL jezika.

Jer udžbenik je posvećen širokom krugu čitalaca (ne samo programera), tada će objašnjenje, ponekad, biti prikladno, tj. dugo i zamorno. Ovo je moje viđenje materijala koji se uglavnom dobija u praksi kao rezultat profesionalne aktivnosti.

Glavni cilj ovog tutorijala, korak po korak, je razviti potpuno razumijevanje suštine SQL jezika i naučiti vas kako pravilno primijeniti njegove konstrukcije. Profesionalci u ovoj oblasti također mogu biti zainteresirani za listanje ovog materijala, možda će uspjeti da iznesu nešto novo za sebe, ili će možda 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 je u velikoj mjeri 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, jer 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 - ubacivanje novih podataka
  • AŽURIRANJE - 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 je vrlo opsežna, pa ću se u ovom dijelu fokusirati samo na njegove osnovne konstrukcije. Vjerujem da, bez dobrog poznavanja osnove, ne možete početi proučavati složenije strukture, jer onda će se sve vrtjeti oko ove osnovne konstrukcije (podupiti, sindikati, itd.).

Takođe u ovom dijelu govoriću i o TOP prijedlogu. Namjerno nisam naznačio ovu rečenicu u osnovnoj sintaksi, jer različito se implementira u različitim dijalektima SQL jezika.

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

Obuka će se nastaviti i u Korak po korak modu, tj. kada čitate, morate odmah pokušati vlastitim rukama slijediti primjer. Nakon toga analizirate rezultat i pokušavate ga intuitivno razumjeti. 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 kreirana korištenjem DDL + DML u prvom dijelu.

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

Test skripte za kreiranje baze podataka

Kreiranje baze podataka CREATE DATABASE Test GO - napravi test bazu podataka trenutnom KORISTI Test GO - kreiraj referentne tabele CREATE TABLE Pozicije (ID int IDENTITY (1,1) NOT NULL OGRANIČENJE PK_Positions PRIMARY KEY, Ime 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 tabele podacima SET IDENTITY_INSERT Pozicije (ID, Ime) VRIJEDNOSTI (1, N "Računovodja" ) , (2, N "Direktor"), (3, N "Programer"), (4, N "Stariji programer") POSTAVI IDENTITY_INSERT pozicije ISKLJUČENO GO SET IDENTITY_INSERT Odjeljenja UKLJUČENO INSERT Odjeljenja (ID, ime) VRIJEDNOSTI (1, N " Administracija"), (2, N "Računovodstvo"), (3, N "IT") POSTAVI IDENTITY_INSERT Odjela OFF GO - kreiraj tabelu sa zaposlenima KREIRAJ TABELU Zaposleni (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 PRIMARNI KLJUČ (ID), CONSTRAINT FK_Employees_DepartmentID STRANI KLJUČ (ID odjela) REFERENCES Odjeljenja (ID), CONSTRAINT FK_Employees_PositionID STRANI KEY (PositionID) REFERENCES POZICIJECONEFERENSKE POZICIJE (PozicijeCONEFERENSKE), (PozicijeCONEFERENSKE, POSICONEFERENSTRA). ID IZMEĐU 1000 I 1999), INDEX IDX_Employees_Name (Ime)) GO - ispunite sa INSERT podacima o zaposlenima (ID, Ime, Rođendan, Email, PositionID, DepartmentID, ManagerID) VRIJEDNOSTI (1000, N " Ivanov II "," 19550 " [email protected]", 2,1, NULL), (1001, N" Petrov P.P. "," 19831203 "," [email protected]", 3,3,1003), (1002, N" Sidorov S.S. "," 19760607 "," [email protected]", 1,2,1000), (1003, N" Andreev A.A. "," 19820417 "," [email protected]",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, izvršit ćemo test trenutne baze podataka odabirom na padajućoj listi ili korištenjem naredbe "USE Test".

Počnimo s najosnovnijim SELECT formom:

SELECT * FROM Employees
U ovom upitu tražimo da vratimo sve kolone (označene sa "*") iz tabele Employees - ovo možete pročitati kao "SELECT all_fields FROM table_employees". Ako postoji grupirani indeks, vraćeni podaci će najvjerovatnije biti sortirani po njemu, u ovom slučaju po ID koloni (ali to nije poenta, jer ćemo u većini slučajeva sami eksplicitno specificirati sortiranje koristeći ORDER BY... ) :

ID Ime Rođendan Email PositionID DepartmentID HireDate ID menadžera
1000 Ivanov I.I. 1955-02-19 [email protected] 2 1 2015-04-08 NULL
1001 Petrov P.P. 1983-12-03 [email protected] 3 3 2015-04-08 1003
1002 Sidorov S.S. 1976-06-07 [email protected] 1 2 2015-04-08 1000
1003 Andreev A.A. 1982-04-17 [email protected] 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 kolone) (bez naziva kolone) (bez naziva kolone)
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, dobijamo vrijednost (832,5). Rezultat 825 je dobijen iz razloga što su u našem izrazu svi brojevi cijeli brojevi, pa je rezultat cijeli broj, tj. (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)
  • Pravo / Cijelo = Stvarno
  • Integer / Real = Real
One. rezultat se pretvara u veći tip, tako da u zadnja 2 slučaja dobijamo 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 tačka.

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

Stoga obratite pažnju na tip podataka numeričkih kolona. U slučaju da je cijeli broj, a trebate dobiti pravi rezultat, onda koristite transformaciju ili jednostavno stavite tačku iza broja navedenog kao konstante (123.).

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

SELECT ID, ID / 100, - ovdje će biti cjelobrojna podjela CAST (ID AS float) / 100, - koristite funkciju CAST za pretvaranje u tip s plutajućim brojem CONVERT (float, ID) / 100, - koristite funkciju CONVERT za pretvaranje na tip float ID / 100. - koristimo transformaciju navodeći da je imenilac realan broj IZ Zaposlenih

ID (bez naziva kolone) (bez naziva kolone) (bez naziva kolone) (bez naziva kolone)
1000 10 10 10 10.000000
1001 10 10.01 10.01 10.010000
1002 10 10.02 10.02 10.020000
1003 10 10.03 10.03 10.030000

Napomenu. U bazi podataka ORACLE sintaksa bez bloka FROM nije dozvoljena, u tu svrhu se koristi sistemska tabela DUAL koja sadrži jedan red:

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


Bilješka. Nazivu tabele u mnogim RDB-ovima može prethoditi ime šeme:

SELECT * FROM dbo.Employees - dbo - ime sheme

Šema je logička jedinica baze podataka, koja ima svoje ime i omogućava vam da grupišete objekte baze podataka kao što su tabele, pogledi itd. unutar nje.

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

Prema zadanim postavkama, jedna shema pod nazivom dbo (Vlasnik baze podataka) se kreira u MS SQL bazi podataka, a svi kreirani objekti se kreiraju u ovoj shemi po defaultu. Shodno tome, ako jednostavno navedemo ime tablice u upitu, tada će se tražiti u dbo šemi trenutne baze podataka. Ako želimo da kreiramo objekat u određenoj šemi, takođe ćemo morati da dodamo naziv objekta nazivu šeme, na primer, "CREATE TABLE schema_name.table_name (...)".

U slučaju MS SQL-a, imenu šeme može prethoditi i naziv baze podataka u kojoj se ova 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.
Šema 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 jednoredni "- ..." i višeredni "/ * ... * /" komentare. Ako je zahtjev velik i složen, onda komentari mogu biti od velike pomoći, vi ili neko drugi nakon nekog vremena zapamtite ili shvatite njegovu strukturu.

Ako u tabeli ima puno kolona, ​​a pogotovo ako u tabeli ima još puno redova, plus ako vršimo upite bazi podataka preko mreže, onda se odabire sa direktnim popisom polja koja trebate odvojiti zarezima će biti poželjno:

SELECT ID, Name FROM Employees

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

ID 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 se sazna koji se indeksi koriste. To se može učiniti ako kliknete na dugme "Prikaži procijenjeni plan izvršenja" ili postavite "Uključi stvarni plan izvršenja - Uključite stvarni plan izvršenja upita u rezultat" :

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

Ako ste tek počeli da savladavate DML, sada vam to nije toliko važno, samo uzmite u obzir i možete sigurno zaboraviti na to (možda vam nikada neće biti od koristi) - naš početni cilj je naučiti osnove DML-a jezika i naučite kako ih pravilno koristiti, a optimizacija je već posebna umjetnost. Ponekad je važnije da imate samo ispravno napisan upit koji daje ispravan rezultat sa stanovišta subjekta, a pojedini ljudi su već uključeni u njegovu optimizaciju. 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 tačne rezultate.

Postavljanje aliasa za tabele

Prilikom navođenja stupaca, njima može prethoditi ime tablice u bloku FROM:

SELECT Employees.ID, Employees.Name FROM Employees

Ali ova sintaksa je obično nezgodna za korištenje, jer ime tabele može biti dugačko. U ove 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 (ja preferiram ovu opciju)

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

Naravno, u ovom slučaju, rezultati upita će biti potpuno isti kao za "SELECT ID, Name FROM Employees". Za šta će biti potrebno bit će jasno dalje (čak ni u ovom dijelu), za sada samo zapamtimo da imenu kolone može prethoditi (navesti) ili direktno ime tabele, ili pomoću aliasa. Ovdje možete koristiti jednu od dvije stvari, tj. ako ste naveli pseudonim, morat ćete ga koristiti, ali više ne možete koristiti ime tablice.

Napomenu. U ORACLE-u je dozvoljena samo opcija specificiranja alijasa tablice bez ključne riječi AS.

DISTINCT - odbaciti duple linije

Ključna riječ DISTINCT se koristi za odbacivanje dupliciranih redova 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 ovo radi veće jasnoće na primjeru:

Kreirajmo privremenu tabelu za demonstraciju CREATE TABLE #Trash (ID int NOT NULL PRIMARY KEY, Col1 varchar (10), Col2 varchar (10), Col3 varchar (10)) - popunite ovu tabelu sa 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 šta upit se vraća bez opcije DISTINCT SELECT Col1, Col2, Col3 IZ #Trash - da vidimo šta upit vraća sa DISTINCT opcijom SELECT DISTINCT Col1, Col2, Col3 IZ #Trash - izbrišite privremenu tablicu DROP TABLE #Trash

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

Sada pogledajmo gdje se to može primijeniti, uz praktičniji primjer - vratit ćemo samo jedinstvene identifikatore odjela iz tabele Zaposleni (tj. saznati ID-ove odjela u kojima su zaposleni):

ODABERITE DISTINCT DepartmentID IZ Employees

Ovdje imamo 4 reda, jer u našoj tabeli nema duplih kombinacija (DepartmentID, PositionID).

Vratimo se na trenutak na DDL

Pošto nema dovoljno podataka za demo primjere, a želim vam reći opširnije i jasnije, hajde da malo proširimo našu tabelu 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 kolone ALTER TABLE Zaposleni DODAJ Prezime nvarchar (30), - prezime Ime nvarchar (30), - ime Srednje ime nvarchar (30), - patronim Plata float, - i, naravno, RFP u nekoj vrsti BonusPercent float - postotak za obračunavanje bonusa od GO plate - popunjavamo ih podacima (neki podaci su namjerno izostavljeni) UPDATE Zaposleni SET Prezime = N "Ivanov", Ime = N "Ivan", MiddleName = N "Ivanovič", Plata = 5000, BonusPercent = 50 GDJE ID = 1000 - Ivanov II AŽURIRANJE Zaposleni SET Prezime = N "Petrov", Ime = N "Petr", Srednje Ime = N "Petrović", Plata = 1500, Procenat bonusa = 15 GDJE ID = 1001 - Petrov P.P. UPDATE Zaposleni SET Prezime = N "Sidorov", Ime = N "Sidor", Srednje Ime = NULL, Plata = 2500, Procenat bonusa = NULL GDJE ID = 1002 - Sidorov S.S. AŽURIRAJ Zaposleni SET Prezime = N "Andrejev", Ime = N "Andrej", Srednje Ime = NULL, Plata = 2000, Procenat bonusa = 30 GDJE ID = 1003 - Andreev A.A.

Uvjerimo se da su podaci uspješno ažurirani:

SELECT * FROM Employees

ID Ime Prezime Ime Srednje ime Plata BonusPercent
1000 Ivanov I.I. Ivanov Ivane Ivanovich 5000 50
1001 Petrov P.P. Petrov Peter Petrovich 1500 15
1002 Sidorov S.S. Sidorov Sidor NULL 2500 NULL
1003 Andreev A.A. Andreev Andrey NULL 2000 30

Postavljanje aliasa za kolone upita

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

SELECT - dajte ime izračunatom stupcu Prezime + "" + Ime + "" + MiddleName AS puno ime, - koristite dvostruke navodnike, jer prostor se koristi HireDate AS "Datum prijema", - upotreba uglastih zagrada, pošto koristi se razmak Rođendan AS [Datum rođenja], - riječ AS nije obavezna Plata ZP OD Zaposlenih

Puno ime datum prijema 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, pseudonimi kolona koje smo postavili odražavaju se u zaglavlju rezultirajuće tablice. Zapravo, ovo je glavna svrha pseudonima kolona.

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

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

Zapamtite da će svi izrazi u kojima je uključena NULL (na primjer, dijeljenje sa NULL, sabiranje sa NULL) vratiti NULL.

Napomenu.
U slučaju ORACLE, operator "||" se koristi za spajanje nizova. a spajanje će izgledati kao "Prezime ||" "|| Ime ||" "|| MiddleName". Za ORACLE vrijedi napomenuti da ima izuzetak za tipove stringova, za njih NULL i prazan string "" su jedno te isto, stoga će se u ORACLE-u ovaj izraz vratiti za zadnja 2 zaposlena 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). Ovde mi je teško da procenim da li je to dobro ili loše, jer u nekim slučajevima je ponašanje NULL stringa pogodnije kao u MS SQL-u, au drugim kao u ORACLE-u.

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


Kako ne bismo ograđivali konstrukciju pomoću funkcije ISNULL, u MS SQL-u možemo koristiti funkciju CONCAT. Hajde da razmotrimo i uporedimo 3 opcije:

SELECT Prezime + "" + Ime + "" + MiddleName FullName1, - 2 opcije za zamjenu NULL praznim nizovima "" (dobijamo 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 Andreev Andrey Andreev Andrey

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

ODABERITE "Datum prijema" = Datum zapošljavanja, - pored "..." i […] možete koristiti "..." [Datum rođenja] = Rođendan, ZP = Plata OD Zaposlenih

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

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

Osnovni SQL aritmetički operatori


Prioritet izvršavanja 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 sa NULL daje NULL, na primjer: 10 + NULL, NULL * 15/3, 100 / NULL - sve će to rezultirati NULL. One. jednostavno govoreći, nedefinirana vrijednost ne može dati definitivan rezultat. Uzmite ovo u obzir prilikom sastavljanja upita i, ako je potrebno, obradite NULL vrijednosti s funkcijama ISNULL, COALESCE:

SELECT ID, Ime, Plata / 100 * BonusPercent AS Result1, - bez obrade NULL vrijednosti Plata / 100 * ISNULL (BonusPercent, 0) KAO Rezultat2, - koristite funkciju ISNULL Plata / 100 * COALESCE (BonusPercent, 0) KAO Rezultat3 - - koristimo funkciju SPAJANJE IZ Zaposlenih

Reći ću vam malo o funkciji COALESCE:

COALESCE (expr1, expr2, ..., exprn) - Vraća prvu vrijednost koja nije NULL na listi 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

U osnovi, fokusiraću se na razgovor o DML konstrukcijama, a uglavnom neću govoriti o funkcijama koje će se naći u primjerima. Ako ne razumijete šta radi ova ili ona funkcija, potražite njen opis na Internetu, čak možete pretraživati ​​informacije odjednom po grupi funkcija, na primjer, pretraživanjem u Google pretrazi "MS SQL string funkcije", " 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 Poređenje COALESCE i CASE

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

SLUČAJ KADA (izraz1 NIJE NULL) ONDA izraz1 KADA (izraz 2 NIJE NULL) ONDA izraz2 ... ELSE izrazN KRAJ

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

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

ORDER BY - sortiraj rezultat upita

ORDER BY klauzula se koristi za sortiranje rezultata upita.

ODABERITE Prezime, Ime, Platu OD Zaposlenih REDAJTE PO Prezime, Ime - poredajte rezultat po 2 kolone - po Prezimu, a poslije po Imenu

Za napomenu. Za rastuće sortiranje postoji ključna riječ ASC, ali pošto se uzlazno sortiranje koristi po defaultu, možete zaboraviti na ovu opciju (ne sjećam se slučaja da sam nekada 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 TOP opciju i pokazati kako, na primjer, možete odabrati 3 zaposlenika koji imaju najveću platu, vodeći računa da ne bih trebao prikazivati ​​samu platu radi 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 opadajućem redoslijedu plaće

ID Prezime Ime
1000 Ivanov Ivane
1002 Sidorov Sidor

Naravno, ovde postoji slučaj da više zaposlenih može imati istu platu i teško je reći koja tri zaposlena će vratiti ovaj zahtev, to već treba da se reši sa menadžerom zadataka. Pretpostavimo da ste nakon razgovora o ovom problemu sa menadžerom zadataka pristali i odlučili da koristite sljedeću opciju - da izvršite dodatno sortiranje po polju datuma rođenja (tj. mladi su nam dragi) i ako je datum rođenja nekoliko zaposlenika se može poklopiti (uostalom, to također nije isključeno), tada možete izvršiti treće sortiranje po opadajućem redoslijedu 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 TOP 3 - vrati samo prva 3 zapisa iz cijelog ID-a rezultata, Prezime, Ime OD Zaposlenih REDAJTE PO DESC-u plaće, - 1. sortirajte rezultat u opadajućem redoslijedu po datumu rođenja plaće, - 2. zatim po datumu rođenja ID DESC-u - 3. a za potpunu nedvosmislenost rezultata dodajemo sortiranje po ID-u

One. trebalo bi da pokušate da rezultat upita učinite predvidljivim, tako da u slučaju debrifinga leta možete objasniti zašto su upravo ti ljudi uvršteni na „crnu listu“, tj. sve je izabrano pošteno, po odobrenim pravilima.

Sortiranje se također može obaviti korištenjem različitih izraza u klauzuli ORDER BY:

ODABERITE Prezime, Ime OD Zaposlenih ORDER PO KONKATU (Prezime, "", Ime) - koristite izraz

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

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

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

SELECT DISTINCT Prezime, Ime, Plata OD Zaposlenih ORDER BY ID - ID nije prisutan u konačnom setu, koji smo dobili koristeći DISTINCT

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

Napomena 1. Također, u ORDER BY klauzuli možete koristiti brojeve kolona navedenih u SELECT:

ODABERITE Prezime, Ime, Platu OD Zaposlenih ORDER BY - redoslijed po redoslijedu od 3 DESC, - 1.smanjenje plaće 1, - 2.prezime 2 - 3.by Ime

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

Ako je u ovom slučaju (kada su polja eksplicitno navedena) ova opcija i dalje prihvatljiva, onda je za slučaj koji koristi "*" bolje da ovu opciju nikada ne koristite. Zašto - jer ako neko, na primjer, promijeni redoslijed kolona u tabeli, ili izbriše kolone (a to je normalna situacija), možda će i vaš upit raditi, ali već pogrešno, jer sortiranje već može ići na druge kolone, a to je podmuklo jer ova greška možda neće biti otkrivena vrlo brzo.

Da su kolone eksplicitno navedene, onda bi u gornjoj situaciji upit ili nastavio da radi, ali i korektno (pošto je sve eksplicitno definisano), ili bi jednostavno dao grešku da ta kolona ne postoji.

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

Napomena 2.
U MS SQL-u, prilikom sortiranja uzlaznim redoslijedom, prvo će se pojaviti NULL vrijednosti.

SELECT BonusPercent FROM Employees ORDER BY BonusPercent

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

ODABERITE BonusPercent IZ Zaposlenih ORDER BY BonusPercent DESC

Ako trebate promijeniti logiku za sortiranje NULL vrijednosti, onda koristite izraze, na primjer:

ODABERITE BonusPercent IZ Zaposlenih ORDER PO ISNULL (BonusPercent, 100)

ORACLE nudi 2 opcije za ovu svrhu NULLS FIRST i NULLS LAST (koristi se po defaultu). Na primjer:

ODABERITE BonusPercent IZ Zaposlenih ORDER PO BonusPercent DESC NULL LAST

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

TOP - vraća navedeni broj zapisa

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

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

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

IZABERITE TOP 2 * OD Zaposlenih

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

IZABERITE NAJBOLJIH 25 POSTO * OD Zaposlenih

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

Možete koristiti i opciju WITH TIES sa TOP, koja će pomoći da se vrate svi redovi u slučaju dvosmislenog sortiranja, tj. ova rečenica će vratiti sve redove koji su po sastavu jednaki redovima koji spadaju u izbor TOP N, kao rezultat, može se izabrati više od N redova. Dodajmo još jednog "Programera" sa platom od 1500 za demonstraciju:

INSERT Employees (ID, Name, Email, PositionID, DepartmentID, ManagerID, Salary) VRIJEDNOSTI (1004, N "Nikolaev N.N.", " [email protected]",3,3,1003,1500)

I uvest ćemo još jednog zaposlenog bez navođenja pozicije i odjela sa platom od 2000:

INSERT Employees (ID, Name, Email, PositionID, DepartmentID, ManagerID, Salary) VRIJEDNOSTI (1005, N "Alexandrov A.A.", " [email protected]", NULL, NULL, 1000,2000)

Sada koristimo opciju SA VEZAMA da izaberemo sve zaposlene čija plata odgovara platama 3 zaposlena, sa najmanjom platom (nadam se da će kasnije postati jasno na šta ciljam):

IZABERITE TOP 3 SA KRAVATAMA ID, Ime, Plata OD Zaposlenika REDAJTE PO Plati

Ovdje, iako je naznačeno TOP 3, zahtjev je vratio 4 zapisa, pošto Vrijednost plate koja je vratila TOP 3 (1500 i 2000) pronađena je kod 4 zaposlena. 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đe su predstavili svoj analogni kombinujući funkcionalnost TOP i LIMIT - pretraživanje po rečima "ORACLE OFFSET FETCH". Prije 12c, ROWNUM pseudo-kolona se obično koristila za ovu svrhu.


Ali šta se dešava ako istovremeno primenite klauzule DISTINCT i TOP? Na ova pitanja je lako odgovoriti eksperimentisanjem. Općenito, ne bojte se i ne budite lijeni eksperimentirati, tk. većina se nauči u praksi. Redoslijed riječi u naredbi SELECT je sljedeći, pri čemu je DISTINCT prvi, 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, hajde da provjerimo i uvjerimo se da je to slučaj:

IZABERITE DISINCT TOP 2 Plate OD Zaposlenih REDAJTE PO Plati

Plata
1500
2000

One. Kao rezultat toga, dobili smo 2 najmanje plate od svih. Naravno, može postojati slučaj da plata za neke zaposlene možda nije navedena (NULL), jer shema nam to omogućava. 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.

WHERE - uslov za odabir redova

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

ODABIR ID, Prezime, Ime, Plata OD Zaposlenih GDJE ID odjela = 3 - RED PO Prezime, Ime

ID Prezime Ime Plata
1004 NULL NULL 1500
1003 Andreev Andrey 2000
1001 Petrov Peter 1500

Klauzula WHERE je napisana prije naredbe ORDER BY.

Redoslijed po kojem se naredbe primjenjuju na originalni skup zaposlenih je sljedeći:

  1. GDJE - ako je navedeno, onda je prva stvar iz cijelog skupa Zaposleni odabrati samo zapise koji zadovoljavaju uslov
  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 se vraća samo navedeni broj zapisa

Razmotrimo primjer radi jasnoće:

ODABERITE DISINCT TOP 1 Platu OD Zaposlenih GDJE ID odjela = 3 RED PO Plati

To će izgledati ovako:

Vrijedi napomenuti da se provjera NULL ne vrši sa znakom jednakosti, već korištenjem IS NULL i IS NOT NULL operatora. Samo zapamtite da ne možete porediti sa NULL koristeći "=" (znak jednakosti) operator, jer rezultat izraza će također biti NULL.

Na primjer, izaberimo sve zaposlenike koji nemaju specificiran odjel (tj. DepartmentID JE NULL):

SELECT ID, Name FROM Employees WHERE DepartmentID JE NULL

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

ODABIR ID, Ime, Plata / 100 * BonusPercent KAO Bonus OD Zaposlenih GDJE BonusPercent NIJE NULL

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

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

ODABIR ID, Ime, Plata / 100 * BonusPercent KAO Bonus OD Zaposlenih GDJE NE (BonusPercent<=0 OR BonusPercent IS NULL)

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

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

ODABIR ID, Ime, Plata / 100 * BonusPercent KAO Bonus OD Zaposlenih GDJE BonusPercent> 0 I BonusPercent NIJE NULL

Također, u klauzuli WHERE možete provjeriti različite vrste izraza koristeći aritmetičke operatore i funkcije. Na primjer, slična provjera se može obaviti korištenjem izraza s funkcijom ISNULL:

ODABIR ID, Ime, Plata / 100 * BonusPercent KAO Bonus OD Zaposlenih GDJE NISU (BonusPercent, 0)> 0

Logički i jednostavni operatori poređenja

Da, ovdje ne možete bez matematike, pa hajde da napravimo kratak izlet u Bulove i jednostavne operatore poređenja.

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 poređenja koji se koriste za formiranje uslova:

Plus, postoje 2 operatora za testiranje vrijednosti/izraza za NULL:

IS NULL Provjera jednakosti NULL
NIJE NULL Provjera NULL nejednakosti

Prioritet: 1) Svi operatori poređenja; 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, korištenjem zagrada možete promijeniti standardni redoslijed izračunavanja.

Ovdje sam pokušao dati ideju o Booleovoj algebri u dovoljnoj količini za rad. Kao što vidite, da pišete komplikovanije uslove, ne možete bez logike, ali je ovde nema mnogo (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 da bih ostao unutar okvira članka, na kraju ću pokazati dodatne logičke operatore - BETWEEN, IN i LIKE.

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, Platu OD Zaposlenih GDJE Plata IZMEĐU 2000 I 3000 - ko ima platu u rasponu od 2000-3000

Zapravo, BETWEEN je pojednostavljena notacija kao što je:

ODABERITE ID, Ime, Platu OD Zaposlenih GDJE Plata> = 2000 I Plata<=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, Platu OD Zaposlenih GDJE Plata NE IZMEĐU 2000 I 3000 - slično NE (Plata> = 2000 I Plata<=3000)

U skladu s tim, u slučaju korištenja IZMEĐU, IN, LIKE, možete ih kombinirati i sa drugim uvjetima pomoću AND i OR:

ODABERITE ID, Ime, Platu OD Zaposlenih GDJE Plata IZMEĐU 2000 I 3000 - ko ima platu u rasponu od 2000-3000 I DepartmentID = 3 - računajte samo zaposlene u odjelu 3

IN - provjeriti ulazak u listu vrijednosti

Ovaj operator izgleda ovako:

Testirana_vrijednost IN (vrijednost1, vrijednost2, ...)

Mislim da je lakše pokazati na primjeru:

ODABERITE ID, Ime, Platu FROM Employees WHERE PositionID IN (3,4) - ko ima poziciju 3 ili 4

One. u suštini je isti kao sljedeći izraz:

ODABERITE ID, Ime, Platu OD Zaposlenih GDJE PositionID = 3 ILI PositionID = 4 - ko ima poziciju 3 ili 4

U slučaju NE biće isto (dobijamo sve osim onih iz odjeljenja 3 i 4):

ODABERITE ID, Ime, Platu OD Zaposlenih GDJE PositionID NIJE IN (3,4) - slično NOT (PositionID = 3 ILI PositionID = 4)

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

ODABERITE ID, Ime, Platu FROM Employees WHERE PositionID<>3 I PositionID<>4 - ekvivalent PositionID NOT IN (3,4)

Imajte na umu da nećete moći tražiti NULL vrijednosti koristeći IN klauzulu, jer provjera NULL = NULL će također 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 uslova:

SELECT ID, Name, DepartmentID FROM Employees WHERE DepartmentID IN (1,2) - 1 ili 2 ILI DepartmentID JE NULL - ili NULL

Ili možete napisati nešto poput:

ODABERITE ID, Ime, ID odjela IZ Zaposlenih GDJE JE NULL (ID odjela, -1) U (1,2, -1) - ako ste sigurni da ne postoji odjel sa 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.

Vrijedi spomenuti i još podmuklu grešku vezanu za NULL, koja se može napraviti kada se koristi NOT IN konstrukcija. Na primjer, pokušajmo da odaberemo sve zaposlene, osim onih čiji je odjel jednak 1 ili čiji odjel uopće nije naveden, tj. je NULL. Kao rješenje, opcija se nameće sama od sebe:

ODABIR ID, naziv, ID odjela IZ Zaposlenih GDJE ID odjela NIJE U (1, NULL)

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

Opet, šalu je ovdje odigrao NULL specificiran u listi vrijednosti.

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

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

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

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

SELECT ID, Name, DepartmentID FROM Employees GDE DepartmentID NIJE IN (1) - ili u ovom slučaju samo DepartmentID<>1 I DepartmentID NIJE NULL - i zasebno provjerite NOT NULL

IN se i dalje može koristiti sa podupitima, ali ćemo se vratiti na taj oblik u kasnijim dijelovima ovog vodiča.

LIKE - provjerite niz prema uzorku

Govoriću o ovom operatoru samo u njegovom najjednostavnijem obliku, koji je standard i podržava ga većina dijalekata SQL jezika. Čak iu 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 se mogu koristiti u "pattern_string":

  1. Donja crta "_" - kaže da na njenom mjestu 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 "%" (u praksi se, inače, č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 Zaposleni GDJE Prezime LIKE "% pe%" - čije prezime sadrži kombinaciju "pe"

Pogledajmo primjere sa simbolom "_":

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

Uz pomoć ESCAPE, možete odrediti izlazni znak, koji poništava radnju validacije specijalnih znakova "_" i "%". Ova klauzula se koristi kada želite direktno provjeriti prisustvo znaka postotka ili donje crte u nizu.

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

AŽURIRAJ Zaposleni SET Ime = "Ima_smeće sadrži%" GDJE ID = 1005

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

SELECT * FROM Employees GDJE Ime KAO "%! %%" BJEŽI "!" - linija sadrži znak "%" SELECT * FROM Employees GDJE Ime LIKE "%! _%" ESCAPE "!" - red 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 LIKE operatora možete postaviti i 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 prisustvo Unicode znakova, morat ćete staviti N znak ispred navodnika, tj. N "...". Ali pošto imamo sva znakovna polja u tabeli u Unicode formatu (tip nvarchar), uvijek možete koristiti ovaj format za ova polja. primjer:

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

Ako je urađeno ispravno, kada upoređujete s poljem tipa varchar (ASCII), trebali biste pokušati koristiti provjere koristeći "...", a kada upoređujete polje sa tipom nvarchar (Unicode), trebali biste pokušati koristiti provjere pomoću N " ...". Ovo se radi kako bi se izbjegle implicitne konverzije tipova tokom izvršavanja upita. Isto pravilo se koristi prilikom umetanja (INSERT) vrijednosti u polje ili njihovog ažuriranja (UPDATE).

Prilikom upoređivanja stringova, vrijedi uzeti u obzir da, ovisno o postavci baze podataka (kolaciji), poređenje nizova može biti neosjetljivo na velika i mala slova (kada je "Petrov" = "PETROV") ili osjetljivo na velika i mala slova (kada je "Petrov"<>"PETROV").
U slučaju postavke osjetljive na velika i mala slova, ako želite napraviti pretragu bez obzira na velika i mala slova, možete, na primjer, napraviti preliminarnu konverziju desnog i lijevog izraza u jedno veliko ili veće:

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

Malo o datumima

Kada provjeravate datum, možete koristiti, kao i kod stringova, 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" - Zaposleni 80-ih REDAJTE PO rođendanu

U nekim slučajevima je zgodnije 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 DANAU Rođenja

Postoji i slična funkcija DATETIMEFROMPARTS, koja se koristi za postavljanje datuma i vremena (za tip 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 važećih formata u MSDN biblioteci traženjem "MS SQL CONVERT".

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

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

Malo o brojevima i njihovim transformacijama

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

Za razliku od funkcije CAST konverzije, funkcija CONVERT vam omogućava da postavite treći parametar, koji je odgovoran za stil (format) konverzije. Različiti tipovi podataka mogu imati vlastiti skup stilova koji mogu utjecati na vraćeni rezultat. Već smo se dotakli upotrebe stilova kada smo gledali pretvaranje stringa sa funkcijom CONVERT u tipove 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 realan broj (što sam dao na početku ove lekcije, kako bih pokazao razliku između cjelobrojnog i realnog dijeljenja), poznavanje nijansi konverzije nije toliko kritično, pošto 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), @ CONVERT (@min_int AS float), @ CONVERT14_intma (float), @AST14_intma (float) (@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 precizirati metodu implicitne konverzije dobivene dijeljenjem sa (1.), jer preporučljivo je pokušati izvršiti eksplicitne konverzije, radi veće kontrole nad vrstom dobivenog rezultata. Iako, u slučaju da želimo dobiti rezultat tipa numeric, sa navedenim brojem znamenki iza decimalne zareze, onda možemo koristiti trik u MS SQL-u da pomnožimo cjelobrojnu vrijednost sa (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 cifre - iako je ponekad bolje napraviti eksplicitnu konverziju 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, detalji konverzije mogu biti zaista važni jer utiču na ispravnost dobijenog rezultata, na primer, prilikom pretvaranja numeričke vrednosti u niz (varchar). Pogledajmo primjere pretvaranja novca i float vrijednosti 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 tip novca pohranjuje samo 4 znamenke nakon decimalnog zareza SELECT @money, - 1025.1235 - prema zadanim postavkama CAST i CONVERT se ponašaju 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 hiljaditih i 2 decimalna mjesta (podrazumevani format)) CONVERT (varchar (20) , @money, 1), - 1,025,12 (stil 1 - koristi separator hiljaditih i 2 decimale) PRETVORI (varchar (20), @money, 2) - 1025,1235 (stil 2 - bez separatora i 4 cifre nakon decimalnog zareza)

Ponašanje prilikom konverzije float varchar DECLARE @ float1 plovak SET @ float1 = 1.025,123456789 DECLARE @ float2 plovak SET @ float2 = 1.231.025,123456789 SELECT @ float1, - 1.025,123456789 @ float2, - 1.231.025,12345679 -. Ponašaju isto kao CAST i pretvoriti po defaultu To je, otprilike govoreći, primjenjuje se stil 0) - stil 0 - Ne više od 6 cifara. Kada je potrebno, koristi se eksponencijalna notacija brojeva - pri pretvaranju u varchar, ovdje se dešavaju zaista 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. Eksponencijalna notacija se uvijek koristi. - ovaj stil za float takođe nije baš precizan CONVERT (varchar (20), @ float1, 1), - 1.0251235e + 003 CONVERT (varchar (20), @ float2, 1), - 1.2310251e + 006 - stil 2 - Uvijek 16 bit. Eksponencijalna notacija se uvijek koristi. - ovdje sa 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 zaista mogu stvoriti veliku grešku, posebno kada se destiliraju u niz i nazad (ovo može biti s raznim vrstama integracija, kada se podaci, na primjer, prenose u tekstualne datoteke sa jednog sistema na drugi) ...

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

Decimalni i numeričkih DECLARE @money novac SET @money = 1025,123456789-1025,1235 DECLARE @ float1 plovak SET @ float1 = 1.025,123456789 DECLARE @ float2 plovak SET @ float2 = 1.231.025,123456789 DECLARE @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 numerički (28 , 9) kao numerički (28 , 9) float9 (28 , 9) float9 numerički (28 , 9) 16 , (28,9)) - 1231025.123456789

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

    Top srodni članci