Come configurare smartphone e PC. Portale informativo
  • casa
  • Sicurezza
  • Linguaggio di query strutturato - SQL: cronologia, standard, operatori linguistici di base. Lo scopo del linguaggio SQL

Linguaggio di query strutturato - SQL: cronologia, standard, operatori linguistici di base. Lo scopo del linguaggio SQL

E sopra i dati delle tabelle.

Il linguaggio SQL si chiama integrato da contiene le funzioni di un linguaggio di sviluppo completo ed è focalizzato sull'accesso ai dati, per cui è incluso negli strumenti di sviluppo delle applicazioni. Gli standard del linguaggio SQL supportano i linguaggi di programmazione Pascal, Fortran, COBOL, С, ecc.

esiste 2 metodi di utilizzo di SQL incorporato:

  • statico uso della lingua ( SQL statico) - il testo del programma contiene chiamate a funzioni SQL, che sono incluse nel modulo eseguibile dopo la compilazione.
  • dinamico uso della lingua ( SQL dinamico) - costruzione dinamica di chiamate di funzioni SQL e loro interpretazione. ad esempio, è possibile fare riferimento ai dati del database remoto durante l'esecuzione del programma.

Il linguaggio SQL (come altri linguaggi per lavorare con i database) è destinato alla preparazione e all'esecuzione di query. A seguito dell'esecuzione di una query di dati da una o più tabelle, si ottiene un insieme di record, che viene chiamato sottomissione.

Definizione 1

RappresentazioneÈ una tabella che si forma come risultato di una query.

Operatori di base del linguaggio di query SQL

Le istruzioni SQL sono convenzionalmente suddivise in 2 sottolingue:

  1. Linguaggio di definizione dei dati DDL;
  2. Linguaggio di manipolazione dei dati DML.

Nella tabella, * sono contrassegnati con operatori specifici linguaggio.

Diamo un'occhiata alle istruzioni SQL più importanti.

    Dichiarazione di creazione della tabella:

    Il nome della tabella che si sta creando e il nome di almeno una colonna (campo) sono operandi obbligatori. Per il nome della colonna, è necessario specificare il tipo di dati che verranno archiviati in essa.

    Per i singoli campi, è possibile specificare regole aggiuntive per il controllo dei valori immessi in essi. Ad esempio, NON NULLO indica che il campo non può essere vuoto e che deve essere inserito un valore.

    Esempio 1

    Per creare una tabella libri catalogo dei libri, che contiene i campi:

    genere- tipo di libro,

    nome- nome del libro,

    prezzo- il prezzo del libro

    l'operatore potrebbe assomigliare a questo:

    Operatore per modificare la struttura di una tabella:

    Quando si modifica la struttura della tabella, è possibile aggiungere ( INSERISCI), modificare ( MODIFICARE) o eliminare ( GOCCIOLARE) una o più colonne della tabella. Le regole di registrazione per questo operatore sono le stesse dell'operatore. CREA TABELLA... Non è necessario specificare per eliminare una colonna.

    Esempio 2

    Da aggiungere alla tabella libri campi numero, che memorizzerà il numero di libri, puoi scrivere l'operatore:

    Operatore della tabella di rilascio:

    Esempio 3

    Ad esempio, per eliminare una tabella esistente denominata libri basta usare l'operatore:

    Operatore di creazione indice:

    L'operatore crea un indice su una o più colonne di una determinata tabella per velocizzare le operazioni di query e ricerca. È possibile creare più indici per una tabella.

    Opzione opzionale UNICOè responsabile di garantire l'unicità dei valori in tutte le colonne specificate nella dichiarazione.

    ASC imposta l'ordinamento automatico dei valori nelle colonne in ordine crescente (impostazione predefinita) e DESC- in ordine decrescente.

    Operatore di caduta dell'indice:

    Operatore di creazione vista:

    È possibile omettere i nomi delle colonne durante la creazione di una vista. Quindi verranno utilizzati i nomi delle colonne della query, che è descritto dall'operatore corrispondente SELEZIONARE.

    Visualizza l'operatore di eliminazione:

    Operatore selezione record:

    Operatore SELEZIONARE effettua selezioni e calcoli sui dati di una o più tabelle. Il risultato dell'esecuzione dell'operatore è una tabella di risposta che contiene ( TUTTO) o non contiene ( DISTINTO) righe che si ripetono.

    operando A PARTIRE DAL contiene un elenco di tabelle da cui vengono presi i record per selezionare i dati.

    Operatore modifica record:

    I nuovi valori di campo nei record potrebbero non contenere valori ( NULLO) o calcolato secondo un'espressione aritmetica.

    Nuovo operatore di inserimento record:

    Nel primo record dell'operatore INSERIRE i nuovi record vengono inseriti con i valori specificati nelle colonne.

    Nella seconda affermazione dell'operatore INSERIRE vengono introdotte nuove righe, selezionate da un'altra tabella tramite una frase SELEZIONARE.

    Elimina operatore record:

    Come risultato dell'esecuzione dell'operatore, le righe vengono eliminate dalla tabella specificata che soddisfano la condizione, definita dall'operando facoltativo DOVE... Se l'operando DOVE non è specificato, tutti i record della tabella vengono eliminati.

Lo standard del linguaggio SQL è stato adottato nel 1992 ed è ancora utilizzato oggi. È stato lui a diventare lo standard per molti.Certo, alcuni produttori usano le proprie interpretazioni dello standard. Ma in ogni sistema ci sono ancora i componenti principali: le istruzioni SQL.

introduzione

Con l'aiuto di istruzioni SQL, valori, tabelle vengono gestiti e ricevuti per ulteriori analisi e visualizzazioni. Sono un insieme di parole chiave con cui il sistema capisce cosa fare con i dati.

Sono definite diverse categorie di istruzioni SQL:

  • definire gli oggetti del database;
  • manipolazione dei valori;
  • protezione e gestione;
  • parametri di sessione;
  • informazioni sulla base;
  • SQL statico;
  • SQL dinamico.

Istruzioni SQL per la manipolazione dei dati

INSERIRE. Inserisce righe in una tabella esistente. Può essere utilizzato sia per un valore, sia per diversi, determinati da una determinata condizione. Ad esempio:

nome tabella (nome colonna 1, nome colonna 2)

VALORI (valore 1, valore 2).

Per utilizzare un'istruzione INSERT su più valori, la sintassi è:

nome tabella 1 (nome colonna 1, nome colonna 2)

SELEZIONA il nome della colonna 1, il nome della colonna 2

DA nome tabella 2

WHERE nome tabella 2.nome colonna 1> 2

Questa query selezionerà tutti i dati dalla tabella 2 maggiori di 2 nella colonna 1 e li inserirà nella prima.

AGGIORNARE. Come suggerisce il nome, questa istruzione di query SQL aggiorna i dati in una tabella esistente in base a un attributo specifico.

AGGIORNA nome tabella 1

SET nome colonna 2 = "Vasily"

WHERE nome tabella 1.nome colonna 1 = 1

Questa costruzione riempirà con il valore di Vasily tutte le righe in cui incontra il numero 1 nella prima colonna.

Dati dalla tabella. È possibile specificare una condizione o rimuovere tutte le righe.

DELETE FROM nome tabella

WHERE nome tabella Nome colonna 1 = 1

La query sopra eliminerà dal database tutti i dati con un valore di uno nella prima colonna. Ed ecco come puoi cancellare l'intera tabella:

Istruzione SELECT

Lo scopo principale di SELECT è selezionare i dati in base a determinate condizioni. Il risultato del suo lavoro è sempre una nuova tabella con i dati selezionati. L'operatore MS può essere utilizzato in un'ampia varietà di query. Pertanto, insieme ad esso, puoi considerare altre parole chiave correlate.

Per selezionare tutti i dati da una tabella specifica, utilizzare il segno "*".

DA nome tabella 1

Il risultato di questa query sarà una copia esatta della tabella 1.

E qui la selezione viene eseguita secondo la clausola WHERE, che estrae dalla tabella 1 tutti i valori maggiori di 2 nella colonna 1.

DA nome tabella 1

WHERE nome tabella 1.nome colonna 1> 2

Puoi anche indicare nella selezione che sono necessarie solo determinate colonne.

SELEZIONA nome tabella 1.nome colonna 1

DA nome tabella 1

Il risultato di questa query saranno tutte le righe con i valori della colonna 1. Utilizzando le istruzioni MS SQL, puoi creare la tua tabella, sostituendo, calcolando e sostituendo determinati valori al volo.

nome tabella 1 nome colonna 1

nome tabella 1 nome colonna 2

nome della tabella 1 nome della colonna 3

nome tabella 1.nome colonna 2 * nome tabella 1.nome colonna 3 AS SUMMA

DA nome tabella 1

Questa query apparentemente complessa recupera tutti i valori dalla tabella 1, quindi crea nuove colonne EQ e SUMMA. Nella prima inserisce il segno "+", nella seconda il prodotto dei dati delle colonne 2 e 3. Il risultato ottenuto può essere presentato sotto forma di tabella, per capire come funziona:

Quando si utilizza l'istruzione SELECT, è possibile ordinare immediatamente i dati in base a qualsiasi criterio. La parola ORDER BY è usata per questo.

nome tabella 1 nome colonna 1

nome tabella 1 nome colonna 2

nome della tabella 1 nome della colonna 3

DA nome tabella 1

ORDINA PER nome colonna 2

La tabella risultante sarà simile a questa:

Cioè, tutte le righe sono state impostate in modo tale che i valori nella colonna 2 siano in ordine crescente.

I dati possono essere ottenuti anche da più tabelle. Per chiarezza, prima devi immaginare che ce ne siano due nel database, qualcosa del genere:

Tabella "Dipendenti"

Tabella degli stipendi

Ora devi collegare in qualche modo queste due tabelle per ottenere i valori comuni. Usando le istruzioni SQL di base, puoi farlo in questo modo:

Dipendenti.Camera

Nome dell'impiegato

Stipendio

Stipendio maturato

DA Dipendenti, stipendio

WHERE Numero.Dipendenti = Numero.Retribuzione

Qui viene effettuata una selezione da due diverse tabelle di valori, combinate per numero. Il risultato sarà il seguente set di dati:

Qualche informazione in più su SELECT. Utilizzo di funzioni aggregate

Uno degli operatori principali può eseguire alcuni calcoli durante il campionamento. Per fare ciò, usa determinate funzioni e formule.

Ad esempio, per ottenere il numero di record dalla tabella "Impiegati", è necessario utilizzare la query:

SELEZIONA CONTEGGIO (*) COME N

DA Dipendenti

Il risultato è una tabella con un valore e una colonna.

Puoi applicare tale query e vedere cosa succede:

SUM (stipendio maturato) AS SUMMA

MAX (Salario. Maturato) AS MAX

MIN (Salario. Maturato) AS MIN

AVG (Salary.Maturato) AS SRED

DA Stipendio

Il tavolo finale sarà così:

In questo modo è possibile selezionare i valori desiderati dal database, eseguendo al volo il calcolo delle varie funzioni.

Unione, intersezione e differenze

Combina più query in SQL

SELECT Dipendenti.Nome

DA Dipendenti

DOVE Dipendenti.Numero = 1

SELECT Dipendenti.Nome

DA Dipendenti, stipendio

DOVE Stipendio.Numero = 1

Va tenuto presente che con tale join, le tabelle devono essere compatibili. Cioè, hanno lo stesso numero di colonne.

Sintassi dell'istruzione SELECT e ordine di elaborazione

Prima di tutto, SELECT determina l'area da cui prenderà i dati. La parola chiave FROM viene utilizzata per questo. Se non specificato cosa scegliere.

Quindi la clausola SQL WHERE potrebbe essere presente. Con il suo aiuto, SELECT scorre tutte le righe della tabella e verifica la conformità dei dati alla condizione.

Se la query contiene un GROUP BY, i valori vengono raggruppati in base ai parametri specificati.

Operatori per confrontare i dati

Ci sono diversi tipi di loro. In SQL, gli operatori di confronto possono testare diversi tipi di valori.

    "=". Indica, come si può intuire, l'uguaglianza di due espressioni. Ad esempio, è già stato utilizzato negli esempi precedenti: WHERE Salario Numero = 1.

    ">". Segno maggiore. Se il valore del lato sinistro dell'espressione è maggiore, viene restituito un TRUE logico e la condizione è considerata soddisfatta.

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

    Segni "<=» и «>= ". Si differenzia dagli operatori semplici più e meno in quanto se gli operandi sono uguali, anche la condizione sarà vera.

PIACE

Questa parola chiave può essere tradotta come "simile". L'operatore LIKE in SQL viene utilizzato più o meno allo stesso modo: esegue una query utilizzando un modello. Cioè, ti permette di espandere la selezione dei dati dal database usando le espressioni regolari.

Ad esempio, è stata impostata la seguente attività: dalla già nota base "Dipendenti" per ottenere tutte le persone il cui nome termina con "I". Quindi la richiesta può essere composta in questo modo:

DA Dipendenti

DOVE Nome LIKE `% i`

Il segno di percentuale in questo caso indica una maschera, ovvero qualsiasi simbolo e il loro numero. E con la lettera "I" SQL determinerà che l'ultimo carattere dovrebbe essere esattamente quello.

ASTUCCIO

Questa istruzione di SQL Server è un'implementazione a scelta multipla. Assomiglia al costrutto switch in molti linguaggi di programmazione. L'istruzione SQL CASE esegue un'azione su diverse condizioni.

Ad esempio, è necessario selezionare i valori massimo e minimo dalla tabella "Salary".

Quindi la richiesta può essere composta in questo modo:

DA Stipendio

DOVE CASO QUANDO SELEZIONARE MAX (valutato) ALLORA Massimo

QUANDO SELEZIONARE MIN (valutato) POI Minimo

In questo contesto il sistema ricerca i valori massimo e minimo nella colonna Maturati. Quindi, utilizzando END, viene creato un campo "totale", in cui verrà inserito il "Massimo" o il "Minimo", a seconda dell'esito della condizione.

A proposito, SQL ha anche una forma più compatta di CASE - COALESCE.

Operatori di definizione dei dati

Questa vista consente di eseguire una serie di modifiche alle tabelle: creazione, eliminazione, modifica e utilizzo degli indici.

Il primo da considerare è CREATE TABLE. Non fa altro che creare una tabella. Se si digita semplicemente la query CREATE TABLE, non accade nulla, poiché ci sono molti altri parametri da specificare.

Ad esempio, per creare la familiare tabella "Dipendenti", è necessario utilizzare i comandi:

CREA TABELLA Dipendenti

(Numero numero (10) NON NULL

Varchar (50) NOT NULL

Cognome varchar (50) NOT NULL)

In questa query, tra parentesi, vengono immediatamente determinati i nomi dei campi e la loro tipologia, nonché se può essere uguale a NULL.

TABELLA DROP

Esegue un'attività semplice: l'eliminazione della tabella specificata. Ha un parametro IF EXISTS aggiuntivo. Divora un errore alla caduta se la tabella che stai cercando non esiste. Esempio di utilizzo:

DROP TABLE Dipendenti SE ESISTE.

CREA INDICE

SQL ha un sistema di indicizzazione che può velocizzare l'accesso ai dati. In generale, è un collegamento che punta a una colonna specifica. Puoi creare un indice con una semplice query:

CREATE INDEX nome_indice

ON nome_tabella (nome_colonna)

Questo operatore è utilizzato in T-SQL, Oracle, PL SQL e molte altre interpretazioni delle tecnologie.

ALTER TABLE

Un operatore altamente funzionale con numerose opzioni. In generale, cambia la struttura, la definizione e il posizionamento delle tabelle. Operatore utilizzato in Oracle SQL, Postgres e molti altri.

    INSERISCI. Aggiunge una colonna a una tabella. La sua sintassi è la seguente: ALTER TABLE nome_tabella ADD nome_colonna tipo_dati_memorizzati. Può avere un'opzione IF NOT EXISTS per eliminare l'errore se la colonna creata esiste già;

    GOCCIOLARE. Rimuove una colonna. Possiede anche la chiave IF EXISTS, senza la quale verrà generato un errore indicante la mancanza della colonna richiesta;

    MODIFICARE. Serve per rinominare il nome del campo con quello specificato. Esempio di utilizzo: ALTER TABLE nome_tabella CHANGE nome_vecchio nome_nuovo;

    MODIFICARE. Questo comando ti aiuterà a modificare il tipo e gli attributi aggiuntivi di una colonna specifica. Ed è usato in questo modo: ALTER TABLE nome_tabella MODIFY nome_colonna data_type attributi;

CREA VISTA

In SQL esiste una cosa come una vista. In breve, questa è una specie di tabella virtuale con i dati. È formato come risultato di una selezione mediante l'istruzione SQL SELECT. Le viste possono limitare l'accesso al database, nasconderle, sostituire i nomi reali delle colonne.

Il processo di creazione avviene con una semplice richiesta:

CREA VISTA nome vista COME SELEZIONARE DA * nome tabella

La selezione può avvenire come l'intera base nel suo insieme e secondo alcune condizioni.

Un po' di funzioni

Nelle query SQL molto spesso vengono utilizzate varie funzioni integrate che consentono di interagire con i dati e trasformarli al volo. Vale la pena considerarli in quanto costituiscono parte integrante di un linguaggio strutturato.

    CONTARE. Conta record o righe in una tabella specifica. Come parametro, puoi specificare il nome della colonna, quindi i dati verranno presi da essa. SELEZIONA CONTEGGIO * DA Dipendenti;

    AVV. si applica solo alle colonne con dati numerici. Il suo risultato è la determinazione della media aritmetica di tutti i valori;

    MIN e MAX. Queste funzioni sono già state utilizzate in questo articolo. Determinano i valori massimo e minimo dalla colonna specificata;

    SOMMA. È semplice: la funzione calcola la somma dei valori delle colonne. Viene utilizzato esclusivamente per dati di tipo numerico. Aggiungendo il parametro DISTINCT alla query verranno sommati solo i valori univoci;

    IL GIRO. Funzione di arrotondamento per frazioni decimali. La sintassi utilizza il nome della colonna e il numero di posizioni decimali;

    LEN. Una semplice funzione che calcola la lunghezza dei valori delle colonne. Il risultato sarà una nuova tabella che mostra il numero di caratteri;

    ORA. Questa parola chiave viene utilizzata per calcolare la data e l'ora correnti.

Operatori aggiuntivi

Molti degli esempi con istruzioni SQL hanno parole chiave che fanno piccole cose ma rendono comunque molto più semplice il recupero o la manipolazione dei database.

    COME. Viene utilizzato quando è necessario decorare visivamente il risultato assegnando il nome specificato alla tabella risultante.

    TRA. Uno strumento di campionamento molto utile. Indica l'intervallo di valori tra i quali si desidera ottenere i dati. L'input prende un parametro da e verso quale numero viene utilizzato l'intervallo ;.

    NON. L'operatore dà l'opposto dell'espressione.

    TRONCARE. Elimina i dati dall'area specificata del database. Si differenzia da operatori simili in quanto è impossibile recuperare i dati dopo averlo utilizzato. Va notato che l'implementazione di questa parola chiave in diverse interpretazioni di SQL può differire. Pertanto, è meglio leggere le informazioni di riferimento prima di provare TRUNCATE.

    LIMITE. Imposta il numero di righe per l'output. La particolarità dell'operatore è che si trova sempre alla fine. Richiede un parametro obbligatorio e uno facoltativo. Il primo indica quante righe con i dati selezionati mostrare. E se viene utilizzato il secondo, l'operatore funziona come per un intervallo di valori.

    UNIONE. Un operatore molto conveniente per combinare più query. Ha già incontrato tra gli esempi di questo in questo articolo. È possibile visualizzare le righe richieste da più tabelle combinandole con UNION per un uso più conveniente. La sua sintassi è la seguente: SELECT nome_colonna FROM nome_tabella UNION SELECT nome_altro_colonna FROM altro nome_tabella. Il risultato sarà una tabella pivot con le query combinate.

    CHIAVE PRIMARIA. Tradotto come "chiave primaria". In realtà, è proprio questa terminologia che viene utilizzata nei materiali di riferimento. Significa un identificatore univoco per la stringa. Viene utilizzato, di regola, quando si crea una tabella per specificare il campo che la conterrà.

    PREDEFINITO. Proprio come l'operatore precedente, viene utilizzato durante l'esecuzione della query di creazione. Definisce il valore predefinito che verrà utilizzato per popolare il campo quando viene creato.

    NULLO. Quando scrivono query, i principianti e non solo i programmatori spesso dimenticano la possibilità di ottenere un valore NULL. Di conseguenza, nel codice si insinua un errore, difficile da rintracciare durante il debug. Pertanto, quando si creano tabelle, si selezionano o si ricalcolano valori, è necessario fermarsi e pensare se l'occorrenza di NULL in questa parte della query viene presa in considerazione.

    Memoria. Questo articolo ha mostrato diverse funzioni che possono eseguire alcune attività. Quando si sviluppa una shell per lavorare con un database, è possibile "superare" la valutazione di semplici espressioni per il sistema di gestione del database. In alcuni casi, questo dà un significativo aumento delle prestazioni.

    Restrizioni. Se hai bisogno di ottenere solo due da un database con migliaia di righe, allora dovresti usare operatori come LIMIT o TOP. Non è necessario recuperare i dati utilizzando il linguaggio di sviluppo della shell.

    Composto. Dopo aver recuperato i dati da diverse tabelle, molti programmatori iniziano a riunirli utilizzando la memoria della shell. Ma perché? Dopotutto, puoi fare una richiesta in cui tutto questo sarà presente. Non è necessario scrivere codice aggiuntivo e riservare memoria aggiuntiva nel sistema.

    Ordinamento. Se è possibile applicare l'ordinamento in una query, ovvero tramite un DBMS, è necessario utilizzarlo. Ciò consentirà di risparmiare notevolmente sulle risorse durante l'esecuzione di un programma o servizio.

    Molte richieste. Se devi inserire molti record in sequenza, per l'ottimizzazione dovresti pensare all'inserimento di dati in batch con una singola query. Aumenterà anche le prestazioni dell'intero sistema nel suo insieme.

    Posizionamento dei dati sofisticato. Prima di elaborare la struttura del database, è necessario pensare se è necessario un tale numero di tabelle e campi. Forse c'è un modo per combinarli o scartarne alcuni. Molto spesso i programmatori utilizzano una quantità eccessiva di dati che non verranno mai utilizzati da nessuna parte.

    Tipi. Per risparmiare spazio e risorse, è necessario essere sensibili ai tipi di dati utilizzati. Se è possibile utilizzare un tipo meno "pesante" per la memoria, è necessario utilizzarlo. Ad esempio, se sai che il valore numerico in questo campo non supererà 255, allora perché utilizzare un INT a 4 byte se c'è un TINYINT di 1 byte.

Conclusione

In conclusione, va notato che il linguaggio di query strutturato SQL è ormai utilizzato quasi ovunque: siti, servizi web, programmi per PC, applicazioni per dispositivi mobili. Pertanto, la conoscenza di SQL aiuterà tutti i rami dello sviluppo.

Allo stesso tempo, le modifiche dello standard della lingua originale a volte differiscono l'una dall'altra. Ad esempio, le istruzioni SQL PL possono avere una sintassi diversa da SQL Server. Pertanto, prima di iniziare a sviluppare con questa tecnologia, vale la pena leggere le guide su di essa.

In futuro, è improbabile che compaiano analoghi che potrebbero superare SQL in termini di funzionalità e prestazioni, quindi quest'area è una nicchia piuttosto promettente per qualsiasi programmatore.

SQL (StructuredQueryLanguage) è un linguaggio informatico universale utilizzato per creare, modificare e manipolare dati in database relazionali. Il linguaggio SQL si basa sull'algebra relazionale ed è un insieme di operatori.

Ci sono 4 gruppi di operatori. Considera un gruppo di Data Manipulation Language (DML, SQL DML)

Selezione dati

La selezione dei dati è l'operazione SQL più comune. L'istruzione SELECT è una delle istruzioni più importanti in questo linguaggio per la selezione dei dati. La sintassi per questo operatore è la seguente:

SELECT colonna FROM tabella

Le istruzioni SELECT devono contenere le parole SELECT e FROM; altre parole chiave sono facoltative.

La parola chiave SELECT è seguita dalle informazioni sui campi da includere nel set di dati risultante. Un asterisco (*) denota tutti i campi di una tabella, ad esempio:

La seguente sintassi viene utilizzata per selezionare una colonna:

SELEZIONARE Società

Un esempio di selezione di più colonne è simile al seguente:

SELEZIONARE Società, Telefono,posta

La parola chiave FROM viene utilizzata per specificare i nomi delle tabelle da cui vengono prelevati i record, ad esempio:

SELEZIONARE * A PARTIRE DAL Clienti

Questa query restituirà tutti i campi della tabella Clienti.

È possibile utilizzare la clausola WHERE per filtrare i risultati restituiti dall'istruzione SELECT (opzionale)

SELEZIONA * DA Prodotti WHERE Categoria = 4

Varie espressioni possono essere utilizzate nella clausola WHERE,

WHERE espressione1 [(AND | OR) espressione2 ...]

Per esempio:

SELEZIONA * DA Prodotti WHERE Categoria = 2 E Postavshik> 10

SELEZIONA Nome, Prezzo DA Prodotti WHERE Categoria = 3 O Prezzo< 50

Puoi utilizzare i seguenti operatori:

< Меньше

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

<>Non uguale

> Altro

> = Maggiore o uguale

La clausola ORDER BY (opzionale) viene utilizzata per ordinare il set di dati risultante per una o più colonne. Le parole chiave ASC (crescente) o DESC (decrescente) vengono utilizzate per determinare l'ordinamento. Per impostazione predefinita, i dati sono ordinati in ordine crescente.

Modifica dei dati

Oltre a recuperare i dati, SQL può essere utilizzato per aggiornare ed eliminare dati, copiare record in altre tabelle ed eseguire altre operazioni. Di seguito esamineremo le istruzioni UPDATE, DELETE e INSERT utilizzate per eseguire alcune di queste attività.

AGGIORNAMENTO dichiarazione

L'istruzione UPDATE viene utilizzata per modificare i valori in una o più colonne di una tabella. La sintassi per questo operatore è:

UPDATE tabella SET colonna1 = espressione1 criteri WHERE

L'espressione nella clausola SET può essere una costante o il risultato di una valutazione. Ad esempio, per aumentare i prezzi di tutti i prodotti che costano meno di $ 10, puoi eseguire la seguente query:

AGGIORNAMENTO Prodotti SET Prezzo = Prezzo * 1.1 WHERE Prezzo< 10

Dichiarazione DELETE

Per eliminare righe dalle tabelle, utilizzare l'istruzione DELETE, la cui sintassi è:

ELIMINA DA tabella WHERE criteri

Rimuovi tutti i prodotti con un valore inferiore a 100:

ELIMINA DA Prodotti DOVE Prezzo< 100

OperatoreINSERIRE

Per aggiungere record alle tabelle, utilizzare l'istruzione INSERT, la cui sintassi è:

INSERT INTO tabella (VALUES (espressione [, ...])

Ad esempio, per aggiungere un nuovo cliente alla tabella Clienti, è possibile utilizzare la seguente query:

INSERIRE NEI VALORI Clienti (ID cliente, Nome azienda) ('XYZ', 'XYZ Deli')

La base del linguaggio SQL è costituita da operatori, suddivisi condizionatamente in più gruppi in base alle loro funzioni. È possibile distinguere i seguenti gruppi di istruzioni (non sono elencate tutte le istruzioni SQL):

Operatori Ddl (Data Definition Language)

Dichiarazioni DDL - Dichiarazioni di definizione dell'oggetto del database

    CREA SCHEMA - crea uno schema di database

    DROP SHEMA - elimina uno schema di database

    CREA TABELLA - crea una tabella

    ALTER TABLE - modifica una tabella

    DROP TABLE - rilascia un tavolo

    CREA DOMINIO - crea un dominio

    ALTER DOMAIN - cambia dominio

    DROP DOMAIN - elimina dominio

    CREA COLLATION - crea una sequenza

    ELIMINA RACCOLTA - elimina una sequenza

    CREA VISTA - crea una vista

    DROP VIEW - rimuovi una vista

Operatori Dml (linguaggio di manipolazione dei dati)

Operatori DML - Operatori di manipolazione dei dati

    SELECT - seleziona le righe dalle tabelle

    INSERT - aggiungi righe a una tabella

    AGGIORNAMENTO - cambia le righe in una tabella

    DELETE - elimina le righe in una tabella

    COMMIT - conferma le modifiche apportate

    ROLLBACK - annulla le modifiche apportate

Operatori di protezione e controllo dei dati

    CREA ASSERZIONE - crea vincolo

    DROP ASSERTION - rimuovi un vincolo

    GRANT - concede privilegi a un utente o un'applicazione per manipolare oggetti

    REVOKE - revoca i privilegi dell'utente o dell'applicazione

Inoltre, ci sono gruppi di operatori per impostare i parametri di sessione, ottenere informazioni sul database, istruzioni SQL statiche, istruzioni SQL dinamiche. I più importanti per l'utente sono gli operatori di manipolazione dei dati (DML).

Esempi di utilizzo degli operatori di manipolazione dei dati

INSERT - inserimento di righe in una tabella

Esempio 1 . Inserimento di una riga in una tabella:

VALORI (4, "Ivanov");

Esempio 2 ... Inserimento di più righe nella tabella, selezionate da un'altra tabella (i dati sui fornitori della tabella P, che hanno numeri maggiori di 2, vengono inseriti nella tabella TMP_TABLE):

TMP_TABLE (PNUM, PNAME)

SELEZIONA PNUM, PNAME

DOVE P.PNUM> 2;

AGGIORNAMENTO - aggiornamento delle righe in una tabella

Esempio 3 ... Aggiornamento di più righe in una tabella:

SET PNAME = "Pushnikov"

DOVE P.PNUM = 1;

DELETE - eliminazione di righe in una tabella

Esempio 4 . Eliminazione di più righe in una tabella:

DOVE P.PNUM = 1;

Esempio 5 ... Eliminazione di tutte le righe in una tabella:

Esempi di utilizzo dell'istruzione SELECT

L'istruzione SELECT è infatti l'istruzione SQL più importante e complessa per l'utente. È inteso per il recupero di dati da tabelle, ad es. egli, infatti, implementa uno degli scopi principali del database: fornire informazioni all'utente.

L'istruzione SELECT viene sempre eseguita su alcune delle tabelle del database.

Commento... I database, infatti, possono contenere non solo tabelle persistenti, ma anche tabelle temporanee e cosiddette viste. Le viste sono semplicemente istruzioni SELECT memorizzate nel database. Dal punto di vista degli utenti, una vista è una tabella che non è memorizzata in modo permanente nel database, ma "appare" al momento dell'accesso. Dal punto di vista dell'istruzione SELECT, le tabelle persistenti e le tabelle e le viste temporanee hanno lo stesso aspetto. Naturalmente, l'effettiva esecuzione dell'istruzione SELECT da parte del sistema tiene conto delle differenze tra le tabelle e le viste memorizzate, ma queste differenze nascosto dall'utente.

Il risultato di un'istruzione SELECT è sempre una tabella. Pertanto, i risultati delle azioni rendono l'istruzione SELECT simile agli operatori di algebra relazionale. Qualsiasi operatore di algebra relazionale può essere espresso da un'istruzione SELECT opportunamente formulata. La complessità dell'istruzione SELECT è determinata dal fatto che contiene tutte le funzionalità dell'algebra relazionale, nonché funzionalità aggiuntive che non sono disponibili nell'algebra relazionale.

Nella prima parte abbiamo già toccato un po' il linguaggio DML, utilizzando la quasi totalità dei suoi comandi, ad eccezione del comando MERGE.

Parlerò di DML nella mia sequenza sviluppata dall'esperienza personale. Lungo la strada, proverò anche a parlarvi dei luoghi "scivolosi" su cui vale la pena soffermarsi, questi luoghi "scivolosi" che sono simili in molti dialetti del linguaggio SQL.

Perché il libro di testo è dedicato a una vasta gamma di lettori (non solo programmatori), quindi la spiegazione, a volte, sarà appropriata, ad es. lungo e noioso. Questa è la mia visione del materiale, che si ottiene principalmente nella pratica come risultato dell'attività professionale.

L'obiettivo principale di questo tutorial, passo dopo passo, è sviluppare una comprensione completa dell'essenza del linguaggio SQL e insegnarti come applicare correttamente le sue costruzioni. Anche i professionisti del settore potrebbero essere interessati a scorrere questo materiale, magari potranno tirar fuori qualcosa di nuovo per se stessi, o forse sarà semplicemente utile leggere per rinfrescarsi la memoria. Spero che tutti lo troveranno interessante.

Perché DML nel dialetto del database MS SQL è molto connesso con la sintassi della costruzione SELECT, quindi inizierò a parlare di DML con esso. A mio parere, la costruzione SELECT è la costruzione più importante del linguaggio DML, poiché a spese di esso o di sue parti, viene effettuata la selezione dei dati necessari dalla banca dati.

Il DML contiene i seguenti costrutti:

  • SELECT - selezione dati
  • INSERT - inserimento nuovi dati
  • AGGIORNAMENTO - aggiornamento dati
  • DELETE - cancellazione dei dati
  • MERGE - unione di dati

In questa parte, tratteremo solo la sintassi di base del comando SELECT, che assomiglia a questa:

SELECT column_list o * FROM source WHERE filter ORDER BY sort_expression
L'argomento dell'istruzione SELECT è molto ampio, quindi in questa parte mi concentrerò solo sui suoi costrutti di base. Credo che, senza conoscere bene la base, non si possa iniziare a studiare strutture più complesse, perché quindi tutto ruoterà attorno a questa costruzione di base (subquery, unioni, ecc.).

Anche in questa parte parlerò anche della proposta TOP. Non ho volutamente indicato questa frase nella sintassi di base, poiché è implementato in modo diverso nei diversi dialetti del linguaggio SQL.

Se il DDL è più statico, ad es. con l'aiuto di esso vengono create strutture rigide (tabelle, collegamenti, ecc.), Quindi il linguaggio DML è di natura dinamica, qui puoi ottenere i risultati corretti in diversi modi.

L'allenamento proseguirà anche in modalità Step by Step, ad es. durante la lettura, devi provare immediatamente a seguire l'esempio con le tue mani. Successivamente, analizzi il risultato e provi a capirlo intuitivamente. Se qualcosa non è chiaro, ad esempio il significato di una funzione, contatta Internet per ricevere assistenza.

Gli esempi verranno mostrati nel database Test, che è stato creato utilizzando DDL + DML nella prima parte.

Per coloro che non hanno creato un database nella prima parte (poiché non tutti potrebbero essere interessati al linguaggio DDL), è possibile utilizzare il seguente script:

Test dello script di creazione del database

Creazione di un database CREATE DATABASE Test GO - imposta il database Test come corrente USE Test GO - crea tabelle di riferimento CREATE TABLE Positions (ID int IDENTITY (1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Name nvarchar (30) NOT NULL) CREATE TABLE Departments (ID int IDENTITY (1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Name nvarchar (30) NOT NULL) GO - riempi le tabelle di riferimento con i dati SET IDENTITY_INSERT Posizioni (ID, Name) VALUES (1, N "Contabile" ) , (2, N "Direttore"), (3, N "Programmatore"), (4, N "Programmatore Senior") SET IDENTITY_INSERT Posizioni OFF GO SET IDENTITY_INSERT Reparti ON INSERT Reparti (ID, Nome) VALORI (1, N " Amministrazione"), (2, N "Contabilità"), (3, N "IT") SET IDENTITY_INSERT Departments OFF GO - crea una tabella con i dipendenti CREATE TABLE Impiegati (ID int NOT NULL, Name nvarchar (30), Birthday date , Email 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 FOREIGN KEY (DepartmentID) REFERENCES Reparti (ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES Posizioni (ID), CONEFERENCES Posizioni (ID), Email_STRAID CHECK, CONEFERENCES. ID BETWEEN 1000 AND 1999), INDEX IDX_Employees_Name (Nome)) GO - riempilo con INSERISCI i dati dei dipendenti (ID, Nome, Compleanno, Email, PositionID, DepartmentID, ManagerID) VALUES (1000, N " Ivanov II "," 19550219 ", " [e-mail protetta]", 2,1, NULL), (1001, N" Petrov P.P. "," 19831203 "," [e-mail protetta]", 3,3,1003), (1002, N" Sidorov SS "," 19760607 "," [e-mail protetta]", 1,2.1000), (1003, N" Andreev A.A. "," 19820417 "," [e-mail protetta]",4,3,1000)

Ecco fatto, ora siamo pronti per iniziare a imparare il linguaggio DML.

SELECT - operatore di selezione dati

Innanzitutto, per l'editor di query attivo, eseguiremo il test del database corrente selezionandolo nell'elenco a discesa o utilizzando il comando "USE Test".

Iniziamo con il modulo SELECT più elementare:

SELEZIONA * DA Dipendenti
In questa query, chiediamo di restituire tutte le colonne (indicate da "*") dalla tabella Impiegati - puoi leggerlo come "SELECT all_fields FROM table_employees". Se c'è un indice cluster, i dati restituiti saranno molto probabilmente ordinati da esso, in questo caso dalla colonna ID (ma non è questo il punto, poiché nella maggior parte dei casi specificheremo esplicitamente l'ordinamento usando ORDER BY ...) :

ID Nome Compleanno E-mail ID posizione IDDipartimento Data di assunzione ID manager
1000 Ivanov I.I. 1955-02-19 [e-mail protetta] 2 1 2015-04-08 NULLO
1001 Petrov P.P. 1983-12-03 [e-mail protetta] 3 3 2015-04-08 1003
1002 Sidorov S.S. 1976-06-07 [e-mail protetta] 1 2 2015-04-08 1000
1003 Andreev A.A. 1982-04-17 [e-mail protetta] 4 3 2015-04-08 1000

In generale, vale la pena dire che nel dialetto MS SQL, la forma più semplice di una query SELECT potrebbe non contenere un blocco FROM, in questo caso puoi usarlo per ottenere alcuni valori:

SELECT 5550/100 * 15, SYSDATETIME (), - ottenere la data di sistema del database SIN (0) + COS (0)

(Nessun nome di colonna) (Nessun nome di colonna) (Nessun nome di colonna)
825 2015-04-11 12:12:36.0406743 1

Nota che l'espressione (5550/100 * 15) ha dato il risultato 825, anche se se contiamo sulla calcolatrice, otteniamo il valore (832,5). Il risultato 825 è stato ottenuto per il motivo che nella nostra espressione tutti i numeri sono interi, quindi il risultato è un intero, ad es. (5550/100) ci dà 55, non (55,5).

Ricorda quanto segue, la seguente logica funziona in MS SQL:

  • Intero / Intero = Intero (cioè, in questo caso, si verifica la divisione tra interi)
  • Reale / Intero = Reale
  • Intero / Reale = Reale
Quelli. il risultato viene convertito in un tipo più grande, quindi negli ultimi 2 casi otteniamo un numero reale (pensa come in matematica: l'intervallo di numeri reali è maggiore dell'intervallo di numeri interi, quindi il risultato viene convertito in esso):

SELEZIONA 123/10, - 12 123./10, - 12,3 123/10. - 12,3
Qui (123.) = (123.0), solo in questo caso 0 può essere eliminato e solo il punto può essere lasciato.

Per altre operazioni aritmetiche si applica la stessa logica, ma nel caso della divisione questa sfumatura è più rilevante.

Pertanto, prestare attenzione al tipo di dati delle colonne numeriche. Nel caso in cui sia intero e sia necessario ottenere un risultato reale, utilizzare la trasformazione o semplicemente inserire un punto dopo il numero specificato come costante (123.).

È possibile utilizzare la funzione CAST o CONVERT per convertire i campi. Ad esempio, utilizzeremo il campo ID, lo abbiamo di tipo int:

SELECT ID, ID / 100, - qui ci sarà una divisione intera CAST (ID AS float) / 100, - usa la funzione CAST per convertire in tipo float CONVERT (float, ID) / 100, - usa la funzione CONVERT per convertire in tipo float ID/100. - usiamo la trasformazione indicando che il denominatore è un numero reale FROM Impiegati

ID (Nessun nome di colonna) (Nessun nome di colonna) (Nessun nome di colonna) (Nessun nome di colonna)
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

In una nota. Nel database ORACLE non è consentita la sintassi senza il blocco FROM, a questo scopo viene utilizzata la tabella di sistema DUAL, che contiene una riga:

SELECT 5550/100 * 15, - e in ORACLE il risultato sarà 832.5 sysdate, sin (0) + cos (0) FROM DUAL


Nota. Il nome della tabella in molti RDB può essere preceduto dal nome dello schema:

SELECT * FROM dbo.Dipendenti - dbo - nome schema

Uno schema è un'unità logica di un database, che ha un proprio nome e consente di raggruppare oggetti del database come tabelle, viste, ecc. al suo interno.

La definizione di uno schema in diversi database può differire, da qualche parte lo schema è direttamente correlato all'utente del database, ad es. in questo caso possiamo dire che lo schema e l'utente sono sinonimi e tutti gli oggetti creati nello schema sono essenzialmente oggetti di questo utente. In MS SQL, uno schema è un'unità logica indipendente che può essere creata da sola (vedi CREATE SCHEMA).

Per impostazione predefinita, nel database MS SQL viene creato uno schema denominato dbo (proprietario del database) e tutti gli oggetti creati vengono creati in questo schema per impostazione predefinita. Di conseguenza, se specifichiamo semplicemente il nome della tabella nella query, verrà cercata nello schema dbo del database corrente. Se vogliamo creare un oggetto in uno schema specifico, dovremo anche anteporre al nome dell'oggetto il nome dello schema, ad esempio "CREATE TABLE schema_name.table_name (...)".

Nel caso di MS SQL, il nome dello schema può essere preceduto anche dal nome del database in cui si trova questo schema:

SELECT * FROM Test.dbo.Employees - database_name.schema_name.table
Questa precisazione è utile, ad esempio, se:

  • in una richiesta ci riferiamo a oggetti situati in diversi schemi o database
  • è necessario trasferire i dati da uno schema o database a un altro
  • essendo in un database, è necessario richiedere dati da un altro database
  • eccetera.
Uno schema è uno strumento molto conveniente che è utile quando si sviluppa un'architettura di database, in particolare database di grandi dimensioni.

Inoltre, non dimenticare che nel testo della richiesta possiamo utilizzare sia commenti a riga singola "- ..." che a più righe "/ * ... * /". Se la richiesta è ampia e complessa, i commenti possono essere molto utili, tu o qualcun altro, dopo un po', ricordate o capite la sua struttura.

Se ci sono molte colonne nella tabella, e specialmente se ci sono ancora molte righe nella tabella, inoltre se effettuiamo query al database tramite la rete, allora una selezione con un elenco diretto dei campi necessari separati da virgole sarà preferibile:

SELEZIONA ID, nome DA Dipendenti

Quelli. qui diciamo che dobbiamo solo restituire i campi ID e Nome dalla tabella. Il risultato sarà il seguente (a proposito, l'ottimizzatore qui ha deciso di utilizzare l'indice creato nel campo Nome):

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

In una nota. A volte è utile esaminare come vengono recuperati i dati, ad esempio, per scoprire quali indici sono in uso. Questo può essere fatto facendo clic sul pulsante "Visualizza piano di esecuzione stimato" o impostando "Includi piano di esecuzione effettivo - Includi il piano di esecuzione effettivo della query nel risultato" (in questo caso, saremo in grado di vedere il piano effettivo, rispettivamente , solo dopo l'esecuzione della query):

L'analisi del piano di esecuzione è molto utile quando si ottimizza una query, permette di scoprire quali indici mancano o quali non vengono utilizzati affatto ed è possibile eliminarli.

Se hai appena iniziato a padroneggiare DML, ora non è così importante per te, prendi nota e puoi tranquillamente dimenticartene (potrebbe non esserti mai utile) - il nostro obiettivo iniziale è imparare le basi del linguaggio DML e impara come usarli correttamente, e l'ottimizzazione è già un'arte separata. A volte è più importante che tu abbia solo una query scritta correttamente che restituisca il risultato corretto da un punto di vista del soggetto e le singole persone siano già impegnate nella sua ottimizzazione. Per cominciare, devi imparare a scrivere semplicemente le query correttamente, utilizzando qualsiasi mezzo per raggiungere l'obiettivo. L'obiettivo principale che devi raggiungere ora è che la tua query restituisca risultati corretti.

Impostazione degli alias per le tabelle

Quando si elencano le colonne, possono essere precedute dal nome della tabella nel blocco FROM:

SELECT Impiegati.ID, Impiegati.Nome FROM Impiegati

Ma questa sintassi è solitamente scomoda da usare, perché il nome della tabella può essere lungo. Per questi scopi, di solito vengono impostati e utilizzati nomi più brevi - alias:

SELECT emp.ID, emp.Nome FROM Impiegati AS emp
o

SELECT emp.ID, emp.Name FROM Employees emp - La parola chiave AS può essere eliminata (preferisco questa opzione)

Qui emp è un alias per la tabella Employees che può essere utilizzato nel contesto di questa istruzione SELECT. Quelli. possiamo dire che nel contesto di questa istruzione SELECT stiamo dando alla tabella un nuovo nome.

Ovviamente, in questo caso, i risultati della query saranno esattamente gli stessi di "SELECT ID, Name FROM Employees". Per quello che sarà necessario sarà più chiaro (nemmeno in questa parte), per ora ricordiamo solo che il nome della colonna può essere preceduto (specificato) sia direttamente dal nome della tabella, sia utilizzando un alias. Puoi usare una delle due cose qui, ad es. se hai specificato un alias, dovrai utilizzarlo, ma non potrai più utilizzare il nome della tabella.

In una nota. In ORACLE è consentita solo l'opzione di specificare un alias di tabella senza la parola chiave AS.

DISTINCT - scarta le righe duplicate

La parola chiave DISTINCT viene utilizzata per eliminare le righe duplicate dal risultato della query. In parole povere, immagina che prima la query venga eseguita senza l'opzione DISTINCT e quindi tutti i duplicati vengano eliminati dal risultato. Dimostriamolo per maggiore chiarezza con un esempio:

Creiamo una tabella temporanea per la dimostrazione CREATE TABLE #Trash (ID int NOT NULL PRIMARY KEY, Col1 varchar (10), Col2 varchar (10), Col3 varchar (10)) - riempi questa tabella con tutti i tipi di spazzatura INSERT #Trash ( ID, Col1, Col2, Col3) VALORI (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") - vediamo cosa la query restituisce senza un'opzione DISTINCT SELECT Col1, Col2, Col3 FROM #Trash - guarda cosa restituisce la query con l'opzione DISTINCT SELECT DISTINCT Col1, Col2, Col3 FROM #Trash - elimina la tabella temporanea DROP TABLE #Trash

Chiaramente sarà simile a questo (tutti i duplicati sono contrassegnati con lo stesso colore):

Ora diamo un'occhiata a dove può essere applicato, con un esempio più pratico: restituiremo solo identificatori di reparto univoci dalla tabella Impiegati (ovvero, scopriremo gli ID reparto in cui sono elencati i dipendenti):

SELEZIONA ID Dipartimento DISTINTO DA Dipendenti

Qui abbiamo 4 righe, perché non ci sono combinazioni duplicate (DepartmentID, PositionID) nella nostra tabella.

Torniamo un attimo al DDL

Poiché non ci sono dati sufficienti per esempi demo, e voglio dirti in modo più ampio e chiaro, espandiamo leggermente la nostra tabella Employess. Inoltre, ricordiamo un po' di DDL, come si suol dire "la ripetizione è la madre dell'apprendimento", e inoltre andiamo un po' avanti e applichiamo l'istruzione UPDATE:

Crea nuove colonne ALTER TABLE Impiegati ADD LastName nvarchar (30), - FirstName nvarchar (30), - MiddleName nvarchar (30), - Patronymic Salary float, - e, naturalmente, RFP in una sorta di float BonusPercent - percentuale per il calcolo del bonus dallo stipendio GO - li riempiamo con i dati (alcuni dati sono volutamente omessi) AGGIORNAMENTO Impiegati SET Cognome = N "Ivanov", Nome = N "Ivan", Secondo Nome = N "Ivanovich", Stipendio = 5000, BonusPercent = 50 WHERE ID = 1000 - Ivanov II AGGIORNAMENTO Impiegati SET Cognome = N "Petrov", Nome = N "Petr", Secondo Nome = N "Petrovich", Stipendio = 1500, BonusPercent = 15 WHERE ID = 1001 - Petrov P.P. AGGIORNAMENTO Impiegati SET Cognome = N "Sidorov", Nome = N "Sidor", Secondo Nome = NULL, Stipendio = 2500, BonusPercent = NULL WHERE ID = 1002 - Sidorov S.S. UPDATE Impiegati SET Cognome = N "Andreev", FirstName = N "Andrey", MiddleName = NULL, Salary = 2000, BonusPercent = 30 WHERE ID = 1003 - Andreev A.A.

Assicuriamoci che i dati siano stati aggiornati correttamente:

SELEZIONA * DA Dipendenti

ID Nome Cognome Nome di battesimo Secondo nome Stipendio Percentuale di bonus
1000 Ivanov I.I. Ivanov Ivan Ivanovich 5000 50
1001 Petrov P.P. Petrov Peter Petrovic 1500 15
1002 Sidorov S.S. Sidorov Sidor NULLO 2500 NULLO
1003 Andreev A.A. Andreev Andrey NULLO 2000 30

Impostazione di alias per le colonne di query

Penso che sarà più facile mostrare qui che scrivere:

SELECT - assegna un nome alla colonna calcolata LastName + "" + FirstName + "" + MiddleName AS nome completo, - usa le virgolette, poiché viene utilizzato lo spazio HireDate AS "Data di ricezione", - uso di parentesi quadre, poiché lo spazio bianco viene utilizzato Compleanno AS [Data di nascita], - la parola AS è facoltativa Stipendio ZP DA Dipendenti

Nome e cognome data della ricevuta Data di nascita ZP
Ivanov Ivan Ivanovich 2015-04-08 1955-02-19 5000
Petrov Petr Petrovich 2015-04-08 1983-12-03 1500
NULLO 2015-04-08 1976-06-07 2500
NULLO 2015-04-08 1982-04-17 2000

Come puoi vedere, gli alias di colonna che abbiamo impostato si riflettono nell'intestazione della tabella risultante. In realtà, questo è lo scopo principale degli alias di colonna.

Si prega di notare, perché gli ultimi 2 dipendenti non hanno un secondo nome (valore NULL), quindi anche il risultato dell'espressione "LastName +" "+ FirstName +" "+ MiddleName" ci ha restituito NULL.

Per unire (aggiungere, concatenare) stringhe in MS SQL, utilizzare il simbolo "+".

Ricorda che tutte le espressioni in cui è coinvolto NULL (ad esempio, divisione per NULL, addizione con NULL) restituiranno NULL.

In una nota.
Nel caso di ORACLE, l'operatore "||" viene utilizzato per concatenare le stringhe. e la concatenazione sarà simile a "LastName ||" "|| FirstName ||" "|| MiddleName". Per ORACLE vale la pena notare che ha un'eccezione per i tipi di stringa, per loro NULL e una stringa vuota "" sono la stessa cosa, quindi in ORACLE questa espressione tornerà per gli ultimi 2 dipendenti Sidorov Sidor e Andreyev Andrey. Al momento della versione di ORACLE 12c, per quanto ne so, non esiste alcuna opzione che modifichi questo comportamento (se non è corretto, per favore correggimi). Qui è difficile per me giudicare se è buono o cattivo, perché in alcuni casi il comportamento di una stringa NULL è più conveniente come in MS SQL, e in altri come in ORACLE.

Tutti gli alias di colonna di cui sopra sono validi anche in ORACLE, ad eccezione di [...].


Per non recintare la costruzione usando la funzione ISNULL, in MS SQL possiamo usare la funzione CONCAT. Consideriamo e confrontiamo 3 opzioni:

SELECT LastName + "" + FirstName + "" + MiddleName FullName1, - 2 opzioni per sostituire NULL con stringhe vuote "" (otteniamo lo stesso comportamento di ORACLE) ISNULL (LastName, "") + "" + ISNULL (FirstName, "") + "" + ISNULL (secondo nome, "") FullName2, CONCAT (Cognome, "", FirstName, "", secondo nome) FullName3 FROM Impiegati

Nome Completo1 Nome Completo2 Nome Completo3
Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich
Petrov Petr Petrovich Petrov Petr Petrovich Petrov Petr Petrovich
NULLO Sidorov Sidor Sidorov Sidor
NULLO Andreev Andrey Andreev Andrey

In MS SQL, gli alias possono essere specificati anche utilizzando il segno di uguale:

SELEZIONA "Data di ammissione" = Data di assunzione, - oltre a "…" e […] puoi utilizzare "…" [Data di nascita] = Compleanno, ZP = Stipendio FROM Dipendenti

L'uso della parola chiave AS o del segno di uguale per specificare l'alias è probabilmente più una questione di gusti. Ma quando si analizzano le richieste di altre persone, questa conoscenza può tornare utile.

Dirò infine che per gli alias è meglio impostare i nomi usando solo caratteri e numeri latini, evitando l'uso di "...", "..." e [...], cioè usare le stesse regole che abbiamo usato per nominare le tabelle. Inoltre, negli esempi userò solo tali nomi e non "...", "..." e [...].

Operatori aritmetici SQL di base


La priorità di esecuzione degli operatori aritmetici è la stessa della matematica. Se necessario, l'ordine degli operatori può essere modificato utilizzando le parentesi - (a + b) * (x / (y-z)).

E ripeto ancora una volta che qualsiasi operazione con NULL dà NULL, ad esempio: 10 + NULL, NULL * 15/3, 100 / NULL - tutto questo risulterà in NULL. Quelli. semplicemente parlando un valore indefinito non può dare un risultato definito. Tenerne conto durante la composizione di una query e, se necessario, elaborare i valori NULL con le funzioni ISNULL, COALESCE:

SELEZIONA ID, Nome, Stipendio / 100 * BonusPercent AS Risultato1, - senza elaborare i valori NULL Salario / 100 * ISNULL (BonusPercent, 0) AS Risultato2, - usa la funzione ISNULL Stipendio / 100 * COALESCE (BonusPercent, 0) AS Risultato3 - - usiamo la funzione COALESCE FROM Employees

Ti parlerò un po' della funzione COALESCE:

COALESCE (espr1, espr2, ..., espr) - Restituisce il primo valore non NULL in un elenco di valori.

SELECT COALESCE (f1, f1 * f2, f2 * f3) val - in questo caso verrà restituito il terzo valore FROM (SELECT null f1, 2 f2, 3 f3) q

Fondamentalmente, mi concentrerò sul parlare dei costrutti DML e per la maggior parte non parlerò delle funzioni che si troveranno negli esempi. Se non capisci cosa fa questa o quella funzione, cerca la sua descrizione su Internet, puoi persino cercare informazioni contemporaneamente da un gruppo di funzioni, ad esempio cercando nella ricerca di Google "Funzioni stringa MS SQL", " Funzioni matematiche MS SQL” o “Funzioni MS SQL che gestiscono NULL”. Ci sono molte informazioni sulle funzioni e puoi trovarle facilmente. Ad esempio, nella libreria MSDN, puoi leggere di più sulla funzione COALESCE:

Estratto da MSDN Confronto tra COALESCE e CASE

L'espressione COALESCE è una scorciatoia di sintassi per un'espressione CASE. Ciò significa che il codice COALESCE (espressione1, ... n) viene riscritto dall'ottimizzatore di query come la seguente espressione CASE:

CASE QUANDO (espressione1 NON È NULL) THEN espressione1 QUANDO (espressione2 NON È NULL) THEN espressione2 ... ELSE espressioneN END

Ad esempio, considera come puoi utilizzare il resto della divisione (%). Questo operatore è molto utile quando è necessario suddividere i record in gruppi. Ad esempio, tiriamo fuori tutti i dipendenti che hanno numeri pari del personale (ID), ad es. quegli ID che sono divisibili per 2:

SELECT ID, Nome FROM Impiegati WHERE ID% 2 = 0 - il resto della divisione per 2 è 0

ORDER BY - ordina il risultato della query

La clausola ORDER BY viene utilizzata per ordinare il risultato della query.

SELEZIONA Cognome, Nome, Stipendio FROM Impiegati ORDINA PER Cognome, Nome - ordina il risultato per 2 colonne - per Cognome e poi per Nome

Per una nota. Per l'ordinamento ascendente, c'è la parola chiave ASC, ma poiché l'ordinamento ascendente viene utilizzato per impostazione predefinita, puoi dimenticare questa opzione (non ricordo il caso in cui una volta ho usato questa opzione).

Vale la pena notare che nella clausola ORDER BY puoi anche utilizzare campi che non sono elencati nella clausola SELECT (tranne nel caso in cui viene utilizzato DISTINCT, ne parlerò di seguito). Ad esempio, andrò un po' avanti utilizzando l'opzione TOP e mostrerò come, ad esempio, puoi selezionare 3 dipendenti che hanno lo stipendio più alto, tenendo conto che non dovrei mostrare lo stipendio stesso per motivi di riservatezza:

SELECT TOP 3 - restituisce solo i primi 3 record dell'intero risultato ID, Cognome, Nome FROM Impiegati ORDER BY Salary DESC - ordina il risultato in ordine decrescente di Salary

ID Cognome Nome di battesimo
1000 Ivanov Ivan
1002 Sidorov Sidor

Naturalmente, qui c'è un caso in cui diversi dipendenti possono avere lo stesso stipendio ed è difficile dire quali tre dipendenti restituirà questa richiesta, questo deve già essere risolto con il task manager. Supponiamo che, dopo aver discusso di questo problema con il task manager, tu abbia accettato e deciso di utilizzare la seguente opzione: effettuare un ulteriore ordinamento per data di nascita (cioè, i giovani ci sono cari) e se la data di nascita di più dipendenti possono coincidere (del resto anche questo non è escluso), quindi si può fare un terzo ordinamento in ordine decrescente di valori ID (nell'ultimo turno, la selezione includerà quelli con l'ID massimo - ad esempio quelli che sono stati accettati per ultimi, diciamo che i numeri del personale vengono emessi in sequenza con noi):

SELECT TOP 3 - restituisce solo i primi 3 record dell'intero risultato ID, Cognome, Nome FROM Impiegati ORDER BY Stipendio DESC, - 1. ordina il risultato in ordine decrescente di Stipendio Compleanno, - 2. poi per Data di nascita ID DESC - 3. e per la completa univocità del risultato aggiungiamo l'ordinamento per ID

Quelli. dovresti cercare di rendere prevedibile il risultato della query, in modo che in caso di debriefing del volo, puoi spiegare perché esattamente queste persone sono state incluse nella "lista nera", ad es. tutto è stato scelto onestamente, secondo le regole approvate.

L'ordinamento può essere eseguito anche utilizzando diverse espressioni nella clausola ORDER BY:

SELEZIONARE Cognome, Nome FROM Dipendenti ORDER BY CONCAT (Cognome, "", Nome) - utilizzare l'espressione

Inoltre, in ORDER BY, puoi utilizzare gli alias specificati per le colonne:

SELECT CONCAT (Cognome, "", Nome) fi FROM Dipendenti ORDER BY fi - utilizzando un alias

Va notato che nel caso di utilizzo della clausola DISTINCT, nella clausola ORDER BY possono essere utilizzate solo le colonne elencate nel blocco SELECT. Quelli. dopo aver applicato l'operazione DISTINCT, otteniamo un nuovo set di dati, con un nuovo set di colonne. Per questo motivo, il seguente esempio non funzionerà:

SELECT DISTINCT Cognome, Nome, Stipendio FROM Impiegati ORDER BY ID - L'ID non è presente nel set finale, che abbiamo ottenuto utilizzando DISTINCT

Quelli. la clausola ORDER BY viene applicata al set di risultati, prima che il risultato venga restituito all'utente.

Nota 1. Inoltre, nella clausola ORDER BY, puoi utilizzare i numeri delle colonne elencate nella SELECT:

SELEZIONA Cognome, Nome, Stipendio FROM Impiegati ORDER BY - ordina nell'ordine di 3 DESC, - 1.diminuendo Stipendio 1, - 2.per Cognome 2 - 3.per Nome

Per i principianti, sembra conveniente e allettante, ma è meglio dimenticare e non utilizzare mai questa opzione di ordinamento.

Se in questo caso (quando i campi sono elencati esplicitamente), questa opzione è ancora accettabile, allora per il caso che utilizza "*" è meglio non utilizzare mai questa opzione. Perché - perché se qualcuno, ad esempio, cambia l'ordine delle colonne nella tabella o elimina le colonne (e questa è una situazione normale), anche la tua query potrebbe funzionare, ma già in modo errato, perché l'ordinamento può già andare su altre colonne e questo è insidioso perché questo errore potrebbe non essere rilevato molto presto.

Se le colonne fossero elencate in modo esplicito, nella situazione precedente, la query continuerebbe a funzionare, ma anche correttamente (poiché tutto è definito in modo esplicito) o darebbe semplicemente un errore che questa colonna non esiste.

Quindi puoi tranquillamente dimenticare l'ordinamento per numeri di colonna.

Nota 2.
In MS SQL, quando si ordina in ordine crescente, i valori NULL verranno visualizzati per primi.

SELEZIONA BonusPercent DA Dipendenti ORDINA PER BonusPercent

Di conseguenza, quando si utilizza DESC, saranno alla fine

SELEZIONA BonusPercent DA Dipendenti ORDINA PER BonusPercent DESC

Se è necessario modificare la logica per l'ordinamento dei valori NULL, utilizzare le espressioni, ad esempio:

SELEZIONA BonusPercent DA Dipendenti ORDER BY ISNULL (BonusPercent, 100)

ORACLE fornisce 2 opzioni per questo scopo NULLS FIRST e NULLS LAST (usato per impostazione predefinita). Ad esempio:

SELEZIONA BonusPercent DA Dipendenti ORDINA PER BonusPercent DESC NULLS ULTIMO

Prestare attenzione a questo quando si passa a un particolare database.

TOP - restituisce il numero specificato di record

Estratto da MSDN. TOP: limita il numero di righe restituite nel set di risultati della query a un numero o una percentuale specificati. Se la clausola TOP viene utilizzata insieme alla clausola ORDER BY, il set di risultati è limitato alle prime N righe del risultato ordinato. In caso contrario, le prime N righe vengono restituite in un ordine indefinito.

Di solito questa espressione viene utilizzata con la clausola ORDER BY e abbiamo già visto esempi in cui era necessario restituire le prime N righe del set di risultati.

Senza ORDER BY, questa clausola viene solitamente utilizzata quando hai solo bisogno di guardare una tabella a noi sconosciuta, in cui possono esserci molti record, in questo caso ad esempio possiamo chiedere di restituirci solo le prime 10 righe , ma per chiarezza diremo solo 2:

SELEZIONA I TOP 2 * DA Dipendenti

Puoi anche specificare la parola PERCENT, per restituire la corrispondente percentuale di righe dal set di risultati:

SELEZIONA IL TOP 25 PERCENT * DA Dipendenti

Nella mia pratica, è la selezione in base al numero di righe che viene utilizzata più spesso.

Puoi anche utilizzare l'opzione WITH TIES con TOP, che aiuterà a restituire tutte le righe in caso di ordinamento ambiguo, ad es. questa frase restituirà tutte le righe uguali in composizione alle righe che rientrano nella selezione TOP N, di conseguenza è possibile selezionare più di N righe. Aggiungiamo un altro "Programmatore" con uno stipendio di 1500 per dimostrazione:

INSERISCI Dipendenti (ID, Nome, Email, PositionID, DepartmentID, ManagerID, Salary) VALUES (1004, N "Nikolaev N.N.", " [e-mail protetta]",3,3,1003,1500)

E introdurremo un altro dipendente senza specificare la posizione e il dipartimento con uno stipendio di 2000:

INSERISCI Dipendenti (ID, nome, email, ID posizione, ID reparto, ID manager, stipendio) VALORI (1005, N "Aleksandrov A.A.", " [e-mail protetta]", NULL, NULL, 1000,2000)

Ora usiamo l'opzione CON TIES per selezionare tutti i dipendenti il ​​cui stipendio corrisponde agli stipendi di 3 dipendenti, con lo stipendio più basso (spero che sarà chiaro in seguito a cosa sto guidando):

SELEZIONA I TOP 3 CON LEGAMI ID, Nome, Stipendio DA Dipendenti ORDINA PER Stipendio

Qui, sebbene sia indicato TOP 3, la richiesta ha restituito 4 record, poiché il valore dello stipendio che ha restituito TOP 3 (1500 e 2000) è stato riscontrato in 4 dipendenti. A quanto pare funziona così:

In una nota.
In diversi database, TOP è implementato in modi diversi, in MySQL c'è una clausola LIMIT per questo, in cui puoi anche impostare un offset iniziale.

In ORACLE 12c, hanno anche introdotto il proprio analogo che combina le funzionalità di TOP e LIMIT - ricerca con le parole "ORACLE OFFSET FETCH". Prima di 12c, la pseudo-colonna ROWNUM era comunemente usata per questo scopo.


Ma cosa succede se si applicano contemporaneamente le clausole DISTINCT e TOP? A queste domande è facile rispondere attraverso la sperimentazione. In generale, non aver paura e non essere pigro per sperimentare, tk. la maggior parte viene appresa nella pratica. L'ordine delle parole nell'istruzione SELECT è il seguente, con DISTINCT che viene prima, seguito da TOP, ad es. se pensi in modo logico e leggi da sinistra a destra, allora il primo sarà lo scarto dei duplicati, quindi TOP sarà fatto su questo set. Bene, controlliamo e assicuriamoci che sia così:

SELEZIONA DISTINCT TOP 2 Stipendio DA Impiegati ORDINA PER Stipendio

Stipendio
1500
2000

Quelli. Di conseguenza, abbiamo ottenuto i 2 stipendi più bassi di tutti. Naturalmente, potrebbe esserci un caso in cui lo stipendio di alcuni dipendenti potrebbe non essere specificato (NULL), perché lo schema ci permette di farlo. Pertanto, a seconda dell'attività, decidiamo di elaborare i valori NULL nella clausola ORDER BY o semplicemente scartare tutti i record in cui Salary è NULL, e per questo ci rivolgiamo allo studio della clausola WHERE.

WHERE - condizione per la selezione delle righe

Questa offerta serve per filtrare i record in base a una condizione specificata. Ad esempio, selezioniamo tutti i dipendenti che lavorano nel reparto "IT" (il suo ID = 3):

SELECT ID, Cognome, Nome, Stipendio FROM Impiegati WHERE DepartmentID = 3 - IT ORDER BY Cognome, Nome

ID Cognome Nome di battesimo Stipendio
1004 NULLO NULLO 1500
1003 Andreev Andrey 2000
1001 Petrov Peter 1500

La clausola WHERE viene scritta prima del comando ORDER BY.

L'ordine in cui i comandi vengono applicati all'insieme originale di Impiegati è il seguente:

  1. WHERE - se specificato, la prima cosa dall'intero set di dipendenti è selezionare solo i record che soddisfano la condizione
  2. DISTINCT - se specificato, tutti i duplicati vengono scartati
  3. ORDER BY - se specificato, viene eseguito l'ordinamento del risultato
  4. TOP - se specificato, viene restituito solo il numero di record specificato dal risultato ordinato

Facciamo un esempio per chiarezza:

SELECT DISTINCT TOP 1 Salario FROM Impiegati WHERE DepartmentID = 3 ORDER BY Salary

Apparirà così:

Vale la pena notare che la verifica di NULL non viene eseguita con un segno di uguale, ma utilizzando gli operatori IS NULL e IS NOT NULL. Ricorda solo che non puoi confrontare con NULL usando l'operatore "=" (segno uguale), perché anche il risultato dell'espressione sarà NULL.

Ad esempio, selezioniamo tutti i dipendenti che non hanno un dipartimento specificato (ad esempio DepartmentID IS NULL):

SELEZIONA ID, Nome FROM Impiegati WHERE DepartmentID IS NULL

Ora, ad esempio, calcoliamo il bonus per tutti i dipendenti che hanno il valore BonusPercent (ovvero BonusPercent NON È NULL):

SELEZIONA ID, Nome, Stipendio / 100 * BonusPercent AS Bonus FROM Dipendenti DOVE BonusPercent NON È NULL

A proposito, se ci pensi, il valore BonusPercent può essere zero (0) e il valore può anche essere inserito con un segno meno, perché non abbiamo imposto alcuna restrizione su questo campo.

Bene, dopo aver parlato del problema, ci è stato detto finora di considerare che se (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:

SELEZIONA ID, Nome, Stipendio / 100 * BonusPercent AS Bonus FROM Dipendenti DOVE NON (BonusPercent<=0 OR BonusPercent IS NULL)

Quelli. qui abbiamo iniziato a studiare gli operatori booleani. Espressione tra parentesi “(BonusPercent<=0 OR BonusPercent IS NULL)» проверяет на то что у сотрудника нет бонуса, а NOT инвертирует это значение, т.е. говорит «верни всех сотрудников которые не сотрудники у которых нет бонуса».

Inoltre, questa espressione può essere riscritta e dire subito subito "restituire tutti i dipendenti che hanno un bonus" esprimendo ciò con l'espressione (BonusPercent> 0 e BonusPercent IS NOT NULL):

SELEZIONA ID, Nome, Stipendio / 100 * BonusPercent AS Bonus FROM Dipendenti DOVE BonusPercent> 0 E BonusPercent NON È NULL

Inoltre, nella clausola WHERE, puoi controllare vari tipi di espressioni usando operatori e funzioni aritmetici. Ad esempio, un controllo simile può essere eseguito utilizzando un'espressione con la funzione ISNULL:

SELEZIONA ID, Nome, Stipendio / 100 * BonusPercent AS Bonus FROM Dipendenti WHERE ISNULL (BonusPercent, 0)> 0

Operatori booleani e semplici di confronto

Sì, non puoi fare a meno della matematica qui, quindi facciamo una breve escursione negli operatori booleani e di confronto semplici.

Ci sono solo 3 operatori booleani in SQL - AND, OR e NOT:

Per ogni operatore booleano, puoi portare tabelle di verità, che mostrano inoltre quale sarà il risultato quando le condizioni possono essere uguali a NULL:

Esistono i seguenti semplici operatori di confronto che vengono utilizzati per formare le condizioni:

Inoltre ci sono 2 operatori per testare un valore/espressione per NULL:

È ZERO Verifica dell'uguaglianza NULL
NON E' NULLA Verifica della disuguaglianza NULL

Priorità: 1) Tutti gli operatori di confronto; 2) NON; 3) E; 4) OPPURE.

Quando si costruiscono espressioni logiche complesse, vengono utilizzate le parentesi:

((condizione1 AND condizione2) OR NOT (condizione3 AND condizione4 AND condizione5)) OR (…)

Inoltre, utilizzando le parentesi, è possibile modificare la sequenza standard dei calcoli.

Qui ho cercato di dare un'idea dell'algebra booleana in un volume sufficiente per il lavoro. Come puoi vedere, per scrivere condizioni più complicate, non puoi fare a meno della logica, ma non ce n'è molto qui (AND, OR e NOT) e le persone l'hanno inventato, quindi tutto è abbastanza logico.

Andiamo alla fine della seconda parte

Come puoi vedere, anche sulla sintassi di base dell'istruzione SELECT, puoi parlare a lungo, ma per rimanere nel quadro dell'articolo, alla fine mostrerò ulteriori operatori logici - BETWEEN, IN e PIACE.

TRA - verificare l'ingresso nell'intervallo

Valore_testato TRA valore_iniziale E valore_finale

Le espressioni possono essere utilizzate come valori.

Facciamo un esempio:

SELEZIONA ID, Nome, Stipendio FROM Impiegati WHERE Stipendio TRA 2000 E 3000 - chi ha uno stipendio nell'intervallo 2000-3000

In realtà, BETWEEN è una notazione semplificata come:

SELEZIONA ID, Nome, Stipendio FROM Impiegati WHERE Stipendio> = 2000 AND Stipendio<=3000 -- все у кого ЗП в диапозоне 2000-3000

Prima della parola BETWEEN, è possibile utilizzare la parola NOT, che controllerà il valore per non entrare nell'intervallo specificato:

SELECT ID, Nome, Stipendio FROM Impiegati WHERE Stipendio NOT TRA 2000 E 3000 - simile a NOT (Salario> = 2000 AND Stipendio<=3000)

Di conseguenza, nel caso di utilizzo di BETWEEN, IN, LIKE, puoi anche combinarle con altre condizioni utilizzando AND e OR:

SELEZIONA ID, Nome, Stipendio FROM Impiegati WHERE Stipendio TRA 2000 E 3000 - chi ha uno stipendio nell'intervallo 2000-3000 AND DepartmentID = 3 - conta solo i dipendenti del dipartimento 3

IN - verifica l'inserimento nell'elenco dei valori

Questo operatore ha questo aspetto:

Tested_value IN (valore1, valore2, ...)

Penso che sia più facile mostrare con un esempio:

SELEZIONA ID, Nome, Stipendio FROM Impiegati WHERE PositionID IN (3,4) - chi ha una posizione di 3 o 4

Quelli. è essenzialmente la stessa della seguente espressione:

SELECT ID, Nome, Stipendio FROM Impiegati WHERE PositionID = 3 OR PositionID = 4 - chi ha una posizione di 3 o 4

In caso di NOT, sarà lo stesso (otteniamo tutti tranne quelli del dipartimento 3 e 4):

SELECT ID, nome, stipendio FROM dipendenti WHERE PositionID NOT IN (3,4) - simile a NOT (PositionID = 3 OR PositionID = 4)

Inoltre, una query con NOT IN può essere espressa tramite AND:

SELEZIONA ID, nome, stipendio FROM Dipendenti WHERE PositionID<>3 AND IDposizione<>4 - equivalente a PositionID NOT IN (3,4)

Nota che non sarai in grado di cercare valori NULL usando la clausola IN, perché controllando NULL = NULL verrà restituito anche NULL, non True:

SELECT ID, Nome, DepartmentID FROM Impiegati WHERE DepartmentID IN (1,2, NULL) - I record NULL non verranno inclusi nel risultato

In questo caso, suddividi il controllo in più condizioni:

SELEZIONA ID, Nome, IDDipartimento FROM Impiegati WHERE IDDipartimento IN (1,2) - 1 o 2 OR IDDipartimento IS NULL - o NULL

Oppure puoi scrivere qualcosa come:

SELECT ID, Name, DepartmentID FROM Impiegati WHERE ISNULL (DepartmentID, -1) IN (1,2, -1) - se sei sicuro che non ci sia dipartimento con ID = -1

Penso che la prima opzione, in questo caso, sarà più corretta e affidabile. Ok, questo è solo un esempio, per dimostrare quali altre strutture possono essere costruite.

Vale anche la pena menzionare un errore ancora più insidioso relativo a NULL, che può essere commesso utilizzando la costruzione NOT IN. Ad esempio, proviamo a selezionare tutti i dipendenti, ad eccezione di quelli il cui reparto è uguale a 1 o il cui reparto non è specificato affatto, ad es. è zero. Come soluzione, l'opzione si suggerisce:

SELECT ID, nome, DepartmentID FROM Impiegati WHERE DepartmentID NOT IN (1, NULL)

Ma dopo aver eseguito la query, non otterremo una singola riga, anche se ci aspettavamo di vedere quanto segue:

Di nuovo, lo scherzo qui è stato giocato da NULL specificato nell'elenco dei valori.

Vediamo perché in questo caso si è verificato un errore logico. Espandiamo la query utilizzando AND:

SELECT ID, nome, DepartmentID FROM Impiegati WHERE DepartmentID<>1 AND IDDipartimento<>NULL - problema a causa di questo controllo NULL - questa condizione restituirà sempre NULL

Condizione corretta (IDDipartimento<>NULL) ci darà sempre incertezza qui, ad es. NULLO. Ora ricordiamo la tabella di verità per l'operatore AND, dove (TRUE AND NULL) restituisce NULL. Quelli. quando la condizione a sinistra è soddisfatta (IDDipartimento<>1) a causa della condizione giusta non definita, di conseguenza, otteniamo il valore indefinito dell'intera espressione (DepartmentID<>1 AND IDDipartimento<>NULL), quindi la stringa non sarà inclusa nel risultato.

Puoi riscrivere correttamente la condizione come segue:

SELECT ID, Nome, DepartmentID FROM Impiegati WHERE DepartmentID NOT IN (1) - o in questo caso solo DepartmentID<>1 AND DepartmentID IS NOT NULL - e controlla separatamente NOT NULL

IN può ancora essere utilizzato con le sottoquery, ma torneremo a quella forma nelle parti successive di questo tutorial.

MI PIACE - controlla una stringa rispetto a uno schema

Parlerò di questo operatore solo nella sua forma più semplice, che è uno standard ed è supportato dalla maggior parte dei dialetti del linguaggio SQL. Anche in questa forma può essere utilizzato per risolvere molti problemi che richiedono il controllo del contenuto di una stringa.

Questo operatore ha questo aspetto:

Tested_string LIKE string_pattern

I seguenti caratteri speciali possono essere utilizzati in "pattern_string":

  1. Il trattino basso "_" - dice che al suo posto può essere qualsiasi singolo carattere
  2. Il segno di percentuale "%" - dice che al suo posto può essere un qualsiasi numero di caratteri, incluso nessuno
Consideriamo esempi con il simbolo "%" (in pratica, tra l'altro, è più spesso usato):

SELECT ID, Nome FROM Impiegati WHERE Nome LIKE "Pet%" - il cui nome inizia con le lettere "Pet" SELECT ID, Cognome FROM Impiegati WHERE Cognome LIKE "% s" - il cui cognome termina con "s" SELECT ID, Cognome FROM Dipendenti WHERE Cognome LIKE "% pe%" - il cui cognome contiene la combinazione "pe"

Diamo un'occhiata agli esempi con il simbolo "_":

SELECT ID, Cognome FROM Impiegati WHERE Cognome LIKE "_yetrov" - per i quali il cognome è costituito da un qualsiasi primo carattere seguito da lettere "etrov" SELECT ID, Cognome FROM Impiegati WHERE Cognome LIKE "____ s" - per cui il cognome è costituito da quattro caratteri qualsiasi e le successive lettere "s"

Con l'aiuto di ESCAPE, puoi specificare un carattere di escape, che annulla l'azione di convalida dei caratteri speciali "_" e "%". Questa clausola viene utilizzata quando si desidera verificare direttamente la presenza di un segno di percentuale o di un carattere di sottolineatura in una stringa.

Per dimostrare ESCAPE, mettiamo un po' di spazzatura in una voce:

UPDATE Impiegati SET FirstName = "It's_trash contenente%" WHERE ID = 1005

E vediamo cosa restituiscono le seguenti query:

SELECT * FROM Impiegati WHERE Nome LIKE "%! %%" ESCAPE "!" - la riga contiene il segno "%" SELECT * FROM Impiegati WHERE Nome LIKE "%! _%" ESCAPE "!" - la riga contiene il "_"

Se devi controllare una stringa per una corrispondenza completa, invece di LIKE è meglio usare solo il segno "=":

SELECT * FROM Impiegati WHERE Nome = "Pietro"

In una nota.
In MS SQL, nel modello dell'operatore LIKE, puoi anche impostare una ricerca per espressioni regolari, leggilo su Internet se le capacità standard di questo operatore non ti bastano.

ORACLE utilizza la funzione REGEXP_LIKE per cercare le espressioni regolari.

Un po' di corde

Nel caso in cui si controlli una stringa per la presenza di caratteri Unicode, sarà necessario inserire il carattere N davanti alle virgolette, ad es. N "…". Ma poiché abbiamo tutti i campi carattere nella tabella in formato Unicode (tipo nvarchar), puoi sempre utilizzare questo formato per questi campi. Esempio:

SELECT ID, Nome FROM Impiegati WHERE Nome LIKE N "Pet%" SELECT ID, Cognome FROM Impiegati WHERE Cognome = N "Petrov"

Se fatto correttamente, quando si confronta con un campo di tipo varchar (ASCII), si dovrebbe provare a utilizzare i controlli utilizzando "..." e quando si confronta un campo con il tipo nvarchar (Unicode), si dovrebbe provare a utilizzare i controlli utilizzando N " ...". Questo viene fatto per evitare conversioni di tipo implicite durante l'esecuzione della query. La stessa regola viene utilizzata quando si inseriscono (INSERT) valori in un campo o si aggiornano (UPDATE).

Quando si confrontano le stringhe, vale la pena considerare che, a seconda dell'impostazione del database (confronto), il confronto delle stringhe può essere senza distinzione tra maiuscole e minuscole (quando "Petrov" = "PETROV") o senza distinzione tra maiuscole e minuscole (quando "Petrov"<>"PETROV".
Nel caso di un'impostazione con distinzione tra maiuscole e minuscole, se si desidera effettuare una ricerca senza distinzione tra maiuscole e minuscole, è possibile, ad esempio, effettuare una conversione preliminare dell'espressione destra e sinistra in un caso - superiore o inferiore:

SELECT ID, Nome FROM Impiegati WHERE UPPER (Nome) LIKE UPPER (N "Pet%") - o LOWER (Nome) LIKE LOWER (N "Pet%") SELECT ID, Cognome FROM Impiegati WHERE UPPER (Cognome) = UPPER ( N "Petrov") - o INFERIORE (Cognome) = INFERIORE (N "Petrov")

Un po' di date

Quando si controlla una data, è possibile utilizzare, come per le stringhe, le virgolette singole "...".

Indipendentemente dalle impostazioni internazionali in MS SQL, è possibile utilizzare la seguente sintassi della data "AAAAMMGG" (anno, mese, giorno contigui senza spazi). MS SQL capirà sempre questo formato di data:

SELEZIONA ID, Nome, Data di nascita FROM Dipendenti WHERE Data di nascita TRA "19800101" E "19891231" - Dipendenti anni '80 ORDINA PER Data di nascita

In alcuni casi è più conveniente impostare la data utilizzando la funzione DATEFROMPARTS:

SELEZIONA ID, Nome, Compleanno FROM Dipendenti WHERE Compleanno TRA DATEFROMPARTS (1980,1,1) E DATEFROMPARTS (1989,12,31) ORDINA PER Compleanno

Esiste anche una funzione simile DATETIMEFROMPARTS, che viene utilizzata per impostare la data e l'ora (per il tipo datetime).

Puoi anche utilizzare la funzione CONVERTI se devi convertire una stringa in un valore di data o data e ora:

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

I valori 104 e 120 indicano quale formato di data viene utilizzato nella stringa. È possibile trovare una descrizione di tutti i formati validi nella libreria MSDN cercando "MS SQL CONVERT".

Ci sono molte funzioni per lavorare con le date in MS SQL, cerca "funzioni ms sql per lavorare con le date".

Nota. Tutti i dialetti del linguaggio SQL hanno il proprio set di funzioni per lavorare con le date e applicano il proprio approccio per lavorare con esse.

Un po' di numeri e delle loro trasformazioni

Le informazioni in questa sezione saranno probabilmente più utili per i professionisti IT. Se non lo sei, e il tuo obiettivo è semplicemente imparare a scrivere query per ottenere le informazioni di cui hai bisogno dal database, allora potresti non aver bisogno di tali sottigliezze, ma in ogni caso, puoi saltare il testo e prendere qualcosa da notare , perché... se hai iniziato a imparare SQL, stai già entrando nell'IT.

A differenza della funzione di conversione CAST, la funzione CONVERT consente di impostare un terzo parametro, responsabile dello stile di conversione (formato). Diversi tipi di dati possono avere il proprio set di stili che possono influenzare il risultato restituito. Abbiamo già parlato dell'uso degli stili quando abbiamo esaminato la conversione di una stringa con la funzione CONVERTI in tipi data e data e ora.

Maggiori dettagli su CAST, CONVERT e stili sono disponibili in MSDN - "Funzioni CAST e CONVERT (Transact-SQL)": msdn.microsoft.com/ru-ru/library/ms187928.aspx

Per semplificare gli esempi, qui verranno utilizzate le istruzioni Transact-SQL DECLARE e SET.

Naturalmente, nel caso della conversione di un numero intero in un numero reale (che ho fornito all'inizio di questa lezione, per dimostrare la differenza tra divisione intera e reale), la conoscenza delle sfumature della conversione non è così critica, da lì abbiamo fatto una conversione da intero a reale (il cui intervallo è molto più grande dell'intervallo di numeri interi):

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

Forse non valeva la pena specificare il metodo della conversione implicita ottenuta dividendo per (1.), poiché è consigliabile provare a fare delle conversioni esplicite, per un maggiore controllo sulla tipologia del risultato ottenuto. Anche se, nel caso in cui desideriamo ottenere un risultato di tipo numerico, con il numero specificato di cifre dopo la virgola, possiamo usare il trucco in MS SQL per moltiplicare un valore intero per (1., 1.0, 1.00, ecc. ):

DECLARE @int int SET @ int = 123 SELECT @ int * 1., - numerico (12, 0) - 0 posizioni decimali @ int * 1.0, - numerico (13, 1) - 1 carattere @ int * 1.00, - numerico ( 14, 2) - 2 cifre - anche se a volte è meglio fare una conversione esplicita CAST (@int AS numeric (20, 0)), - 123 CAST (@int AS numeric (20, 1)), - 123.0 CAST ( @int AS numerico (20, 2)) - 123.00

In alcuni casi, i dettagli della conversione possono essere davvero importanti perché influiscono sulla correttezza del risultato ottenuto, ad esempio, quando si converte un valore numerico in una stringa (varchar). Diamo un'occhiata ad esempi di conversione di denaro e valori float in varchar:

Comportamento durante la conversione di denaro in varchar DECLARE @money money SET @money = 1025.123456789 - ci sarà una conversione implicita in 1025.1235, perché il tipo denaro memorizza solo 4 cifre dopo il punto decimale SELECT @money, - 1025.1235 - per impostazione predefinita CAST e CONVERT si comportano allo stesso modo (ovvero, in parole povere, viene applicato lo stile 0) CAST (@money as varchar (20)), - 1025.12 CONVERT (varchar (20), @money), - 1025.12 CONVERT (varchar (20), @money, 0), - 1025.12 (stile 0 - nessun separatore di millesimi e 2 posizioni decimali (formato predefinito)) CONVERT ( varchar (20) , @money, 1), - 1.025.12 (stile 1 - usa il separatore dei millesimi e 2 cifre decimali) CONVERT (varchar (20), @money, 2) - 1025,1235 (stile 2 - nessun separatore e 4 cifre dopo la virgola)

Comportamento durante la conversione da float a varchar DECLARE @ float1 float SET @ float1 = 1025.123456789 DECLARE @ float2 float SET @ float2 = 1231025.123456789 SELECT @ float1, - 1025.123456789 @ float2, - 1231025.12345679 - si comportano come CAST e CONVERT per impostazione predefinita. parlando, viene applicato lo stile 0) - stile 0 - Non più di 6 cifre. Quando necessario, viene utilizzata la notazione esponenziale dei numeri: durante la conversione in varchar, qui accadono cose davvero terribili CAST (@ float1 as varchar (20)), - 1025.12 CONVERT (varchar (20), @ float1), - 1025.12 CONVERT (varchar ( 20 ), @ float1, 0), - 1025.12 CAST (@ float2 come varchar (20)), - 1.23103e + 006 CONVERT (varchar (20), @ float2), - 1.23103e + 006 CONVERT (varchar (20 ), @ float2, 0), - 1.23103e + 006 - stile 1 - Sempre 8 bit. Si usa sempre la notazione esponenziale. - anche questo stile per float non è molto preciso CONVERT (varchar (20), @ float1, 1), - 1.0251235e + 003 CONVERT (varchar (20), @ float2, 1), - 1.2310251e + 006 - style 2 - Sempre a 16 bit. Si usa sempre la notazione esponenziale. - qui con maggiore precisione CONVERT (varchar (30), @ float1, 2), - 1.025123456789000e + 003 - OK CONVERT (varchar (30), @ float2, 2) - 1.231025123456789e + 006 - OK

Come puoi vedere dall'esempio, i tipi float float, real in alcuni casi possono davvero creare un grosso errore, specialmente quando si distilla su una stringa e viceversa (questo può essere con vari tipi di integrazioni, quando i dati, ad esempio, vengono trasferiti in file di testo da un sistema all'altro) ...

Se è necessario controllare in modo esplicito la precisione fino a un certo segno, più di 4, a volte è meglio utilizzare il tipo decimale/numerico per memorizzare i dati. Se 4 caratteri sono sufficienti, puoi utilizzare il tipo di denaro: corrisponde approssimativamente a numerico (20,4).

Decimale e numerico DECLARE @money money SET @money = 1025.123456789 - 1025.1235 DECLARE @ float1 float SET @ float1 = 1025.123456789 DECLARE @ float2 float SET @ float2 = 1231025.123456789 DECLARE @numeric Cumeric (2867) SET45 @numeric as varchar (20)), - 1025.12345679 CONVERT (varchar (20), @numeric), - 1025.12345679 CAST (@money come numerico (28,9)), - 1025.123500000 CAST (@ float1 come numerico (28, 9)), - 1025.123456789 CAST (@ float2 come numerico (28,9)) - 1231025.123456789

Nota.
Da MS SQL 2008, è possibile utilizzare al posto del costrutto:
  • ms sql server
  • Aggiungi i tag

    Principali articoli correlati