Selezione dei dati della tabella

Nota: per completare le esercitazioni e gli esempi contenuti nella presente sezione è necessario essere connessi a Oracle Database come utente HR da SQL Developer. Per le istruzioni, vedere "Connessione a Oracle Database come utente HR da SQL Developer".

Informazioni sulle query

Una query o un'istruzione SQL SELECT seleziona i dati da una o più tabelle o viste.

La forma di query più semplice presenta la sintassi seguente:

SELECT select_list FROM source_list

Il valore select_list specifica le colonne da cui è necessario selezionare i dati e source_list specifica le tabelle o le viste che contengono queste colonne.

Una query nidificata in un'altra istruzione SQL è chiamata subquery.

Nell'ambiente SQL*Plus è possibile immettere una query (o qualsiasi altra istruzione SQL) dopo il prompt SQL>.

Nell'ambiente SQL Developer è possibile immettere una query o qualsiasi altra istruzione SQL nel Foglio di lavoro.

Nota: quando viene visualizzato il risultato di una query, i record possono essere in qualsiasi ordine, a meno che non si specifichi il relativo ordine con la clausola ORDER BY. Per ulteriori informazioni, vedere "Ordinamento dei dati selezionati".

Vedere anche:

Esecuzione di query in SQL Developer

In questa sezione viene descritto come eseguire le query in SQL Developer utilizzando il foglio di lavoro.

Nota: il foglio di lavoro non è limitato alle query; è possibile utilizzarlo per eseguire qualsiasi istruzione SQL.

Passi per eseguire le query in SQL Developer:

  1. Se il frame destro di SQL Developer mostra il riquadro hr_conn:

    1. Se il riquadro secondario Foglio di lavoro non viene visualizzato, selezionare la scheda Foglio di lavoro.

    2. Andare al punto 4.

  2. Selezionare l'icona Foglio di lavoro SQL.

  3. Se viene visualizzata la finestra Seleziona connessione:

    1. Se il campo Connessione non ha il valore hr_conn, selezionare tale valore dal menu.

    2. Selezionare OK.

    Viene visualizzato un riquadro con una scheda denominata hr_conn e due riquadri secondari, Worksheet e Query Builder. Nel foglio di lavoro è possibile immettere un'istruzione SQL.

  4. Nel foglio di lavoro digitare una query (istruzione SELECT).
  5. Fare clic sull'icona Esegui istruzione.

    Viene eseguita la query. Sotto il foglio di lavoro viene visualizzato il riquadro Risultati query, che mostra il risultato della query.

  6. Nella scheda hr_conn fare clic sull'icona Cancella.

    La query scompare ed è possibile immettere un'altra istruzione SQL nel foglio di lavoro. Quando si esegue un'altra istruzione SQL, il relativo risultato viene visualizzato nel riquadro Risultato query, sostituendo il risultato dell'istruzione SQL eseguita in precedenza.

Vedere anche: Oracle SQL Developer User's Guide per informazioni sull'uso del foglio di lavoro in SQL Developer

Esercitazione: Selezione di tutte le colonne di una tabella

Questa esercitazione mostra come selezionare tutte le colonne della tabella EMPLOYEES.

Passi per selezionare tutte le colonne della Tabella EMPLOYEES:

  1. Se viene visualizzato un riquadro con la scheda hr_conn, selezionarlo. In caso contrario, fare clic sull'icona Foglio di lavoro SQL, come in "Esecuzione di query in SQL Developer".

  2. Nel foglio di lavoro immettere la seguente query:

    SELECT * FROM EMPLOYEES;

  3. Fare clic sull'icona Esegui istruzione.

    Viene eseguita la query. Sotto il foglio di lavoro viene visualizzato il riquadro Risultati query, che mostra tutte le colonne della tabella DIPENDENTI.

Attenzione: prestare molta attenzione all'utilizzo di SELECT * nelle tabelle con colonne che memorizzano dati riservati, come password o informazioni sulle carte di credito.

Vedere anche: "Esercitazione: Visualizzazione delle proprietà e dei dati delle tabelle EMPLOYEES con SQL Developer" per informazioni su un altro modo di visualizzare i dati delle tabelle con SQL Developer

Esercitazione: Selezione di colonne specifiche di una tabella

Questa esercitazione mostra come selezionare solo le colonne FIRST_NAME, LAST_NAME e DEPARTMENT_ID della tabella EMPLOYEES.

Per selezionare solo FIRST_NAME, LAST_NAME e DEPARTMENT_ID, procedere come segue.

  1. Se viene visualizzato un riquadro con la scheda hr_conn, selezionarlo. In caso contrario, fare clic sull'icona Foglio di lavoro SQL, come in "Esecuzione di query in SQL Developer".

  2. Se il riquadro Foglio di lavoro contiene una query, cancellare la query selezionando l'icona Cancella.

  3. Nel foglio di lavoro immettere la seguente query:

    SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID FROM EMPLOYEES;

  4. Fare clic sull'icona Esegui istruzione.

    Viene eseguita la query. Sotto il foglio di lavoro viene visualizzato il riquadro Risultato query, che mostra i risultati della query, simili al testo seguente.

FIRST_NAME           LAST_NAME                 DEPARTMENT_ID

-------------------- ------------------------- -------------
Donald               OConnell                             50
Douglas              Grant                                50
Jennifer             Whalen                               10
Michael              Hartstein                            20
Pat                  Fay                                  20
Susan                Mavris                               40
Hermann              Baer                                 70
Shelley              Higgins                             110
William              Gietz                               110
Steven               King                                 90
Neena                Kochhar                              90

FIRST_NAME           LAST_NAME                 DEPARTMENT_ID

-------------------- ------------------------- -------------
Lex                  De Haan                              90
...
Kevin                Feeney                               50

107 rows selected.

Visualizzazione delle colonne selezionate sotto nuove intestazioni

Nei risultati dell'interrogazione visualizzata, le intestazioni di colonna predefinite sono nomi di colonna. Per visualizzare una colonna con una nuova intestazione, specificare la nuova intestazione (alias) immediatamente dopo il nome di colonna. L'alias rinomina la colonna per la durata della query, ma non ne modifica il nome nel database.

La query nell'Esercitazione: selezione di colonne specifiche di una tabella seleziona le stesse colonne della query in "Esercitazione: selezione di colonne specifiche di una tabella", ma specifica anche gli alias relativi. Poiché non sono racchiusi tra virgolette, gli alias sono visualizzati in lettere maiuscole.

Se si racchiudono tra virgolette gli alias delle colonne, le maiuscole e le minuscole vengono mantenute e gli alias possono includere spazi, come nell'Esempio 2-6.

Vedere anche: Oracle Database SQL Language Reference per ulteriori informazioni sull'istruzione SELECT, inclusa l'alias di colonna (c_alias)

Esempio 2-5 Visualizzazione delle colonne selezionate sotto nuove intestazioni

SELECT FIRST_NAME First, LAST_NAME last, DEPARTMENT_ID DepT
FROM EMPLOYEES;

Il risultato è simile al testo seguente:

FIRST                LAST                            DEPT
-------------------- ------------------------- ----------
Donald               OConnell                          50
Douglas              Grant                             50
Jennifer             Whalen                            10
Michael              Hartstein                         20
Pat                  Fay                               20
Susan                Mavris                            40
Hermann              Baer                              70
Shelley              Higgins                          110
William              Gietz                            110
Steven               King                              90
Neena                Kochhar                           90

FIRST                LAST                            DEPT
-------------------- ------------------------- ----------
Lex                  De Haan                           90
...
Kevin                Feeney                            50

107 rows selected.

Esempio 2-6 Mantenimento dell'utilizzo delle maiuscole e minuscole e inclusione di spazi negli alias di colonne

SELECT FIRST_NAME "Given Name", LAST_NAME "Family Name"
FROM EMPLOYEES;

Il risultato è simile al testo seguente:

Given Name           Family Name
-------------------- -------------------------
Donald               OConnell
Douglas              Grant
Jennifer             Whalen
Michael              Hartstein
Pat                  Fay
Susan                Mavris
Hermann              Baer
Shelley              Higgins
William              Gietz
Steven               King
Neena                Kochhar

Given Name           Family Name
-------------------- -------------------------
Lex                  De Haan
...
Kevin                Feeney

107 rows selected.

Selezione dei dati che soddisfano le condizioni specificate

Per selezionare solo dati che corrispondono a una condizione specificata, includere la clausola WHERE nell'istruzione SELECT.

La condizione nella clausola WHERE può essere qualsiasi condizione SQL (per informazioni sulle condizioni SQL, vedere Oracle Database SQL Language Reference).

La query in Esempio 2-7 seleziona i dati solo per i dipendenti del reparto 90.

Per selezionare i dati solo per i dipendenti dei reparti 100, 110 e 120, utilizzare la seguente clausola WHERE:

WHERE DEPARTMENT_ID IN (100, 110, 120);

La query nell'Esempio 2-8 seleziona i dati solo per i dipendenti il cui cognome inizia con "Ma".

Per selezionare i dati solo per i dipendenti il cui cognome include "ma", utilizzare la seguente clausola WHERE:

WHERE LAST_NAME LIKE '%ma%';

La query nell'Esempio 2-9 verifica due condizioni: se lo stipendio è almeno pari a 11000 e se la percentuale di commissione non è nulla.

Vedere anche:

Esempio 2-7 Selezione dei dati da un dipartimento

SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90;

Il risultato è simile al testo seguente:

FIRST_NAME           LAST_NAME                 DEPARTMENT_ID
-------------------- ------------------------- -------------
Steven               King                                 90
Neena                Kochhar                              90
Lex                  De Haan                              90

3 rows selected.

Esempio 2-8 Selezione di dati per i cognome che iniziano con la stessa sottostringa

SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE LAST_NAME LIKE 'Ma%';

Il risultato è simile al testo seguente:

FIRST_NAME           LAST_NAME
-------------------- -------------------------
Jason                Mallin
Steven               Markle
James                Marlow
Mattea               Marvins
Randall              Matos
Susan                Mavris

6 rows selected.

Esempio da 2 a 9 Selezione di dati che soddisfano due condizioni

SELECT FIRST_NAME, LAST_NAME, SALARY, COMMISSION_PCT "%"
FROM EMPLOYEES
WHERE (SALARY >= 11000) AND (COMMISSION_PCT IS NOT NULL);

Il risultato è simile al testo seguente:

FIRST_NAME           LAST_NAME                     SALARY          %
-------------------- ------------------------- ---------- ----------
John                 Russell                        14000         .4
Karen                Partners                       13500         .3
Alberto              Errazuriz                      12000         .3
Gerald               Cambrault                      11000         .3
Lisa                 Ozer                           11500        .25
Ellen                Abel                           11000         .3

6 rows selected.

Ordinamento dei dati selezionati

Quando vengono visualizzati i risultati di un query, i record possono trovarsi in qualsiasi ordine, a meno che non si specifichi il rispettivo ordine con la clausola ORDER BY.

I risultati della query in Esempio 2-10 vengono ordinati in base a LAST_NAME, in ordine crescente (impostazione predefinita).

In alternativa, in SQL Developer è possibile omettere la clausola ORDER BY e fare doppio clic sul nome della colonna per eseguire l'ordinamento.

Il criterio di ordinamento non deve essere incluso nell'elenco di selezione, come mostra l'Esempio 2-11.

Vedere anche: Oracle Database SQL Language Reference per ulteriori informazioni sull'istruzione SELECT, inclusa la clausola ORDER BY.

Esempio di ordinamento dei dati selezionati in base a LAST_NAME 2-10

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE
FROM EMPLOYEES
ORDER BY LAST_NAME;

Risultato:

FIRST_NAME           LAST_NAME                 HIRE_DATE
-------------------- ------------------------- ---------
Ellen                Abel                      11-MAY-04
Sundar               Ande                      24-MAR-08
Mozhe                Atkinson                  30-OCT-05
David                Austin                    25-JUN-05
Hermann              Baer                      07-JUN-02
Shelli               Baida                     24-DEC-05
Amit                 Banda                     21-APR-08
Elizabeth            Bates                     24-MAR-07
...
FIRST_NAME           LAST_NAME                 HIRE_DATE
-------------------- ------------------------- ---------
Jose Manuel          Urman                     07-MAR-06
Peter                Vargas                    09-JUL-06
Clara                Vishney                   11-NOV-05
Shanta               Vollman                   10-OCT-05
Alana                Walsh                     24-APR-06
Matthew              Weiss                     18-JUL-04
Jennifer             Whalen                    17-SEP-03
Eleni                Zlotkey                   29-JAN-08

107 rows selected

Esempio 2-11 Ordinamento dei dati selezionati in funzione di una colonna non selezionato

SELECT FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
ORDER BY LAST_NAME;

Risultato:

FIRST_NAME           HIRE_DATE
-------------------- ---------
Ellen                11-MAY-04
Sundar               24-MAR-08
Mozhe                30-OCT-05
David                25-JUN-05
Hermann              07-JUN-02
Shelli               24-DEC-05
Amit                 21-APR-08
Elizabeth            24-MAR-07
...
FIRST_NAME           HIRE_DATE
-------------------- ---------
Jose Manuel          07-MAR-06
Peter                09-JUL-06
Clara                11-NOV-05
Shanta               10-OCT-05
Alana                24-APR-06
Matthew              18-JUL-04
Jennifer             17-SEP-03
Eleni                29-JAN-08

107 rows selected.

Selezione dei dati da più tabelle

Per selezionare dati da più tabelle, utilizzare una query denominata join. Le tabelle in un join devono condividere almeno un nome di colonna.

Si supponga di voler selezionare FIRST_NAME, LAST_NAME e DEPARTMENT_NAME di ciascun dipendente. FIRST_NAME e LAST_NAME sono presenti nella tabella EMPLOYEES e DEPARTMENT_NAME si trova nella tabella DEPARTMENTS. Entrambe le tabelle contengono DEPARTMENT_ID. È possibile utilizzare la query nell'Esempio 2-12.

I qualificatori del nome di tabella sono facoltativi per i nomi di colonna che appaiono solo in una tabella di un join, ma sono obbligatori per i nomi di colonna che appaiono in entrambe le tabelle. La query seguente è equivalente alla query nell'Esempio 2-12:

SELECT FIRST_NAME "First",
LAST_NAME "Last",
DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
ORDER BY DEPARTMENT_NAME, LAST_NAME;

Per rendere più leggibili le query che utilizzano il nome di colonna qualificato, utilizzare gli alias di tabella, come illustrato nell'esempio riportato di seguito.

SELECT FIRST_NAME "First",
LAST_NAME "Last",
DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES e, DEPARTMENTS d
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_NAME, e.LAST_NAME;

Anche se gli alias vengono creati nella clausola FROM, è possibile utilizzarli prima nella query, come mostrato nell'esempio riportato di seguito.

SELECT e.FIRST_NAME "First",
e.LAST_NAME "Last",
d.DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES e, DEPARTMENTS d
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_NAME, e.LAST_NAME;

Per ulteriori informazioni sui join, vedere anche il documento Oracle Database SQL Language Reference

Esempio 2-12 Selezione di dati da due tabelle (unione di due tabelle tramite join)

SELECT EMPLOYEES.FIRST_NAME "First",
EMPLOYEES.LAST_NAME "Last",
DEPARTMENTS.DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
ORDER BY DEPARTMENTS.DEPARTMENT_NAME, EMPLOYEES.LAST_NAME;

Risultato:

First                Last                      Dept. Name
-------------------- ------------------------- ------------------------------
William              Gietz                     Accounting
Shelley              Higgins                   Accounting
Jennifer             Whalen                    Administration
Lex                  De Haan                   Executive
Steven               King                      Executive
Neena                Kochhar                   Executive
John                 Chen                      Finance
...
Jose Manuel          Urman                     Finance
Susan                Mavris                    Human Resources
David                Austin                    IT
...
Valli                Pataballa                 IT
Pat                  Fay                       Marketing
Michael              Hartstein                 Marketing
Hermann              Baer                      Public Relations
Shelli               Baida                     Purchasing
...
Sigal                Tobias                    Purchasing
Ellen                Abel                      Sales
...
Eleni                Zlotkey                   Sales
Mozhe                Atkinson                  Shipping
...
Matthew              Weiss                     Shipping

106 rows selected.

Uso di operatori e funzioni nelle query

select_list di una query può includere espressioni SQL, che a loro volta possono includere operatori SQL e funzioni SQL. Tali operatori e funzioni possono utilizzare i dati della tabella come operandi e argomenti. Le espressioni SQL vengono valutate e i rispettivi valori compaiono nei risultati della query.

Vedere anche:

Uso degli operatori aritmetici nelle query

Gli operatori aritmetici di base—+ (aggiunta), - (sottrazione), \* (moltiplicazione) e / (divisione)—operano sui valori delle colonne.

La query nell'Esempio 2-13 visualizza LAST_NAME, SALARY (paga mensile). La paga annuale per ciascun dipendente nel dipartimento 90, in ordine decrescente di SALARY.

Esempio 2-13 Uso di un'espressione aritmetica in una query

SELECT LAST_NAME,
SALARY "Monthly Pay",
SALARY * 12 "Annual Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90
ORDER BY SALARY DESC;

Risultato:

LAST_NAME                 Monthly Pay Annual Pay
------------------------- ----------- ----------
King                            24000     288000
De Haan                         17000     204000
Kochhar                         17000     204000

Uso delle funzioni numeriche nelle query

Le funzioni numeriche accettano input numerici e restituiscono valori numerici. Ogni funzione numerica restituisce un singolo valore per ogni riga valutata.

Le funzioni numeriche supportate da SQL sono elencate e descritte in Oracle Database SQL Language Reference.

La query nell'Esempio 2-14 utilizza la funzione numerica ROUND per visualizzare la paga giornaliera di ciascun dipendente nel dipartimento 100, arrotondata al centesimo più vicino.

La query nell'esempio 2-15 utilizza la funzione numerica TRUNC per visualizzare la paga giornaliera di ciascun dipendente nel dipartimento 100, troncata al dollaro più vicino.

Per ulteriori informazioni sulle funzioni numeriche SQL, vedere anche: Oracle Database SQL Language Reference

Esempio di dati numerici di arrotondamento 2-14

SELECT LAST_NAME,
ROUND (((SALARY * 12)/365), 2) "Daily Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

Risultato:

LAST_NAME                  Daily Pay
------------------------- ----------
Chen                          269.59
Faviet                        295.89
Greenberg                     394.52
Popp                          226.85
Sciarra                       253.15
Urman                         256.44

6 rows selected.

Esempio 2-15 Troncamento di dati numerici

SELECT LAST_NAME,
TRUNC ((SALARY * 12)/365) "Daily Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

Risultato:

LAST_NAME                  Daily Pay
------------------------- ----------
Chen                             269
Faviet                           295
Greenberg                        394
Popp                             226
Sciarra                          253
Urman                            256

6 rows selected.

Uso dell'operatore di concatenazione nelle query

L'operatore di concatenazione (||) combina due stringhe in un'unica stringa aggiungendo la seconda stringa alla prima. Ad esempio, 'a'||'b'='ab'. È possibile utilizzare questo operatore per combinare le informazioni di due colonne o espressioni nella stessa colonna del risultato di una query.

La query nell'Esempio 2-16 concatena il nome, uno spazio e il cognome di ogni dipendente selezionato.

Per ulteriori informazioni sull'operatore di concatenazione, vedere anche: Oracle Database SQL Language Reference

Esempio 2-16 Concatenazione di dati carattere

SELECT FIRST_NAME || ' ' || LAST_NAME "Name"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

Risultato:

Name
----------------------------------------------
John Chen
Daniel Faviet
Nancy Greenberg
Luis Popp
Ismael Sciarra
Jose Manuel Urman

6 rows selected.

Uso delle funzioni di stringa nelle query

Le funzioni carattere accettano l'input del carattere. La maggior parte di esse restituisce valori di carattere, ma alcune restituiscono valori numerici. Ogni funzione di stringa restituisce un singolo valore per ogni riga valutata.

Le funzioni di stringa supportate dal linguaggio SQL sono elencate e descritte in Oracle Database SQL Language Reference.

Le funzioni UPPER, INITCAP e LOWER visualizzano gli argomenti di carattere rispettivamente in maiuscolo, con la maiuscola iniziale e in minuscolo.

La query nell'Esempio 2-17 visualizza LAST_NAME in maiuscolo, FIRST_NAME con il primo carattere in maiuscolo e tutti gli altri in minuscolo e EMAIL in minuscolo.

Vedere anche: Oracle Database SQL Language Reference per ulteriori informazioni sulle funzioni dei caratteri SQL

Esempio 2-17 Modifica dell'utilizzo delle maiuscole e minuscole dei dati carattere

SELECT UPPER(LAST_NAME) "Last",
INITCAP(FIRST_NAME) "First",
LOWER(EMAIL) "E-Mail"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY EMAIL;

Risultato:

Last                      First                E-Mail
------------------------- -------------------- -------------------------
FAVIET                    Daniel               dfaviet
SCIARRA                   Ismael               isciarra
CHEN                      John                 jchen
URMAN                     Jose Manuel          jmurman
POPP                      Luis                 lpopp
GREENBERG                 Nancy                ngreenbe

6 rows selected.

Uso delle funzioni Datetime nelle query

Le funzioni di data e ora operano sui valori DATA, indicatore orario e intervallo. Ogni funzione Datetime restituisce un singolo valore per ogni riga valutata.

Le funzioni Datetime supportate da SQL sono elencate e descritte in Oracle Database SQL Language Reference.

Per ogni valore di DATA e ora, Oracle Database memorizza le seguenti informazioni:

Per ogni valore di indicatore orario, Oracle Database memorizza anche la parte frazionaria del secondo, di cui è possibile specificare la precisione. Per memorizzare anche il fuso orario, utilizzare il tipo di dati TIMESTAMP WITH TIME ZONE o TIMESTAMP WITH LOCAL TIME ZONE.

Per ulteriori informazioni sul tipo di dati DATE, vedere Oracle Database SQL Language Reference.

Per ulteriori informazioni sul tipo di dati TIMESTAMP, vedere Oracle Database SQL Language Reference.

Per informazioni sugli altri tipi di dati indicatore orario e sui tipi di curve, vedere Oracle Database SQL Language Reference.

La query nell'Esempio 2-18 utilizza le funzioni EXTRACT e SYSDATE per mostrare per quanti anni è stato impiegato ciascun dipendente nel dipartimento 100. La funzione SYSDATE restituisce la data corrente dell'orologio di sistema come valore DATE. Per ulteriori informazioni sulla funzione SYSDATE, vedere Oracle Database SQL Language Reference. Per informazioni sulla funzione EXTRACT, vedere Oracle Database SQL Language Reference.

La query nell'Esempio 2-19 utilizza la funzione SYSTIMESTAMP per visualizzare la data e l'ora di sistema correnti. La funzione SYSTIMESTAMP restituisce un valore TIMESTAMP. Per informazioni sulla funzione SYSTIMESTAMP, vedere Oracle Database SQL Language Reference.

La tabella nella clausola FROM della query, DUAL, è una tabella contenente un'unico riga che Oracle Database crea automaticamente insieme al dizionario dati. Effettuare la scelta da DUAL quando si desidera calcolare un'espressione costante con l'istruzione SELECT. Poiché DUAL contiene una sola riga, la costante viene restituita una sola volta. Per ulteriori informazioni sulla selezione da DUAL, vedere Oracle Database SQL Language Reference.

Vedere anche: Oracle Database SQL Language Reference per ulteriori informazioni sulle funzioni SQL datetime

Esempio 2-18 Visualizzazione del numero di anni tra le date

SELECT LAST_NAME,
(EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE)) "Years Employed"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY "Years Employed";

Risultato:

LAST_NAME                 Years Employed
------------------------- --------------
Popp                                   5
Urman                                  6
Chen                                   7
Sciarra                                7
Greenberg                             10
Faviet                                10

6 rows selected.

Esempio 2-19 Visualizzazione della data e dell'ora di sistema

SELECT EXTRACT(HOUR FROM SYSTIMESTAMP) || ':' ||
EXTRACT(MINUTE FROM SYSTIMESTAMP) || ':' ||
ROUND(EXTRACT(SECOND FROM SYSTIMESTAMP), 0) || ', ' ||
EXTRACT(MONTH FROM SYSTIMESTAMP) || '/' ||
EXTRACT(DAY FROM SYSTIMESTAMP) || '/' ||
EXTRACT(YEAR FROM SYSTIMESTAMP) "System Time and Date"
FROM DUAL;

I risultati dipendono dal valore SYSTIMESTAMP corrente, ma hanno il formato seguente:

System Time and Date
-------------------------------------------------------------------
18:17:53, 12/27/2012

Uso delle funzioni di conversione nelle query

Le funzioni di conversione convertono un tipo di dati in un altro.

Le funzioni di conversione supportate dal linguaggio SQL sono elencate e descritte in Oracle Database SQL Language Reference.

La query nell'Esempio 2-20 utilizza la funzione TO_CHAR per convertire valori HIRE_DATE (che sono di tipo DATE) in valori carattere che hanno il formato FMMonth DD YYYY. FM rimuove gli vuoti iniziali e finali dal nome del mese. FMMonth DD YYYY è un esempio di modello formato data/ora. Per informazioni sui modelli di formati DateTime, vedere Oracle Database SQL Language Reference.

La query nell'Esempio 2-21 utilizza la funzione TO_NUMBER per convertire valori POSTAL_CODE (che sono di tipo VARCHAR2) in valori di tipo NUMBER, utilizzati nei calcoli.

Vedere anche:

Esempio di conversione di date in caratteri utilizzando un modello di formato 2-20

SELECT LAST_NAME,
HIRE_DATE,
TO_CHAR(HIRE_DATE, 'FMMonth DD YYYY') "Date Started"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

Risultato:

LAST_NAME                 HIRE_DATE Date Started
------------------------- --------- -----------------
Chen                      28-SEP-05 September 28 2005
Faviet                    16-AUG-02 August 16 2002
Greenberg                 17-AUG-02 August 17 2002
Popp                      07-DEC-07 December 7 2007
Sciarra                   30-SEP-05 September 30 2005
Urman                     07-MAR-06 March 7 2006

6 rows selected.

Esempio 2-21 Conversione di caratteri in numeri

SELECT CITY,
POSTAL_CODE "Old Code",
TO_NUMBER(POSTAL_CODE) + 1 "New Code"
FROM LOCATIONS
WHERE COUNTRY_ID = 'US'
ORDER BY POSTAL_CODE;

Risultato:

CITY                           Old Code       New Code
------------------------------ ------------ ----------
Southlake                      26192             26193
South Brunswick                50090             50091
Seattle                        98199             98200
South San Francisco            99236             99237

4 rows selected.

Uso delle funzioni di aggregazione nelle query

Una funzione aggregata accetta un gruppo di righe e restituisce una singola riga di risultati. Il gruppo di righe può essere un'intera tabella o una vista.

Le funzioni di aggregazione supportate dal linguaggio SQL sono elencate e descritte in Oracle Database SQL Language Reference.

Le funzioni di aggregazione sono particolarmente potenti quando sono utilizzate con la clausola GROUP BY, che raggruppa il risultato della query in base a uno o più colonne, con un risultato per ciascun gruppo.

La query nell'Esempio 2-22 utilizza la funzione COUNT e la clausola GROUP BY per mostrare quante persone riportano a ciascun manager. Il carattere jolly, *, rappresenta un intero record. L'Esempio 2-22 mostra che il dipendente non fa riferimento a un responsabile. La query riportata di seguito seleziona il nome, il cognome e la qualifica di tale dipendente:

COLUMN FIRST_NAME FORMAT A10;
COLUMN LAST_NAME FORMAT A10;
COLUMN JOB_TITLE FORMAT A10;

SELECT e.FIRST_NAME,
e.LAST_NAME,
j.JOB_TITLE
FROM EMPLOYEES e, JOBS j
WHERE e.JOB_ID = j.JOB_ID
AND MANAGER_ID IS NULL;

Risultato:

FIRST_NAME LAST_NAME  JOB_TITLE
---------- ---------- ----------
Steven     King       President

Per fare in modo che la query restituisca solo righe per i quali i valori aggregati soddisfano le condizioni specificate, utilizzare una funzione di aggregazione nella clausola HAVING della query.

La query nell'Esempio 2-23 mostra quanto ogni dipartimento ogni anno spende per gli stipendi, ma solo per le dipartimenti per le quali tale importo sono superiori a $1.000.000.

La query nell'Esempio 2-24 utilizza diverse funzioni di aggregazione per mostrare le statistiche per gli stipendi di ciascun JOB_ID.

Vedere anche: Oracle Database SQL Language Reference per ulteriori informazioni sulle funzioni di aggregazione SQL

Esempio 2-22 Conteggio del numero di righe in ciascun gruppo

SELECT MANAGER_ID "Manager",
COUNT(*) "Number of Reports"
FROM EMPLOYEES
GROUP BY MANAGER_ID
ORDER BY MANAGER_ID;

Risultato:

Manager Number of Reports
---------- -----------------
       100                14
       101                 5
       102                 1
       103                 4
       108                 5
       114                 5
       120                 8
       121                 8
       122                 8
       123                 8
       124                 8
       145                 6
       146                 6
       147                 6
       148                 6
       149                 6
       201                 1
       205                 1
                           1

19 rows selected.

Esempio 2-23 Limitazione delle funzioni di aggregazione alle righe che soddisfano una condizione

SELECT DEPARTMENT_ID "Department",
SUM(SALARY*12) "All Salaries"
FROM EMPLOYEES
HAVING SUM(SALARY * 12) >= 1000000
GROUP BY DEPARTMENT_ID;

Risultato:

Department All Salaries
---------- ------------
        50      1876800
        80      3654000

Esempio 2-24 con le funzioni di aggregazione per le informazioni statistica

SELECT JOB_ID,
COUNT(*) "#",
MIN(SALARY) "Minimum",
ROUND(AVG(SALARY), 0) "Average",
MEDIAN(SALARY) "Median",
MAX(SALARY) "Maximum",
ROUND(STDDEV(SALARY)) "Std Dev"
FROM EMPLOYEES
GROUP BY JOB_ID
ORDER BY JOB_ID;

Risultato:

JOB_ID              #    Minimum    Average     Median    Maximum    Std Dev
---------- ---------- ---------- ---------- ---------- ---------- ----------
AC_ACCOUNT          1       8300       8300       8300       8300          0
AC_MGR              1      12008      12008      12008      12008          0
AD_ASST             1       4400       4400       4400       4400          0
AD_PRES             1      24000      24000      24000      24000          0
AD_VP               2      17000      17000      17000      17000          0
FI_ACCOUNT          5       6900       7920       7800       9000        766
FI_MGR              1      12008      12008      12008      12008          0
HR_REP              1       6500       6500       6500       6500          0
IT_PROG             5       4200       5760       4800       9000       1926
MK_MAN              1      13000      13000      13000      13000          0
MK_REP              1       6000       6000       6000       6000          0
PR_REP              1      10000      10000      10000      10000          0
PU_CLERK            5       2500       2780       2800       3100        239
PU_MAN              1      11000      11000      11000      11000          0
SA_MAN              5      10500      12200      12000      14000       1525
SA_REP             30       6100       8350       8200      11500       1524
SH_CLERK           20       2500       3215       3100       4200        548
ST_CLERK           20       2100       2785       2700       3600        453
ST_MAN              5       5800       7280       7900       8200       1066

19 rows selected.

Uso di funzioni relative a NULL nelle query

Le funzioni relative a NULL facilitano la gestione dei valori NULL.

Le funzioni correlate a NULL supportate da SQL sono elencate e descritte in Oracle Database SQL Language Reference.

La query nell'Esempio 2-25 restituisce il cognome e le commissioni dei dipendenti il cui cognome inizia con 'B'. Se un dipendente non riceve alcuna commissione (ossia, se COMMISSION_PCT è NULL), la funzione NVL sostituisce "Non applicabile" con NULL.

La query nell'Esempio 2-26 restituisce il cognome, lo stipendio e il reddito dei dipendenti il cui cognome inizia con 'B', utilizzando la funzione NVL2. Se COMMISSION_PCT non è NULL, il reddito è lo stipendio più la commissione; se COMMISSION_PCT è NULL, il reddito è solo lo stipendio.

Vedere anche:

Esempio 2-25 Sostituzione di una stringa per un valore NULL

SELECT LAST_NAME,
NVL(TO_CHAR(COMMISSION_PCT), 'Not Applicable') "COMMISSION"
FROM EMPLOYEES
WHERE LAST_NAME LIKE 'B%'
ORDER BY LAST_NAME;

Risultato:

LAST_NAME                 COMMISSION
------------------------- ----------------------------------------
Baer                      Not Applicable
Baida                     Not Applicable
Banda                     .1
Bates                     .15
Bell                      Not Applicable
Bernstein                 .25
Bissot                    Not Applicable
Bloom                     .2
Bull                      Not Applicable

9 rows selected.

Esempio 2-26 che specifica espressioni diverse per valori NULL e non NULL

SELECT LAST_NAME, SALARY,
NVL2(COMMISSION_PCT, SALARY + (SALARY * COMMISSION_PCT), SALARY) INCOME
FROM EMPLOYEES WHERE LAST_NAME LIKE 'B%'
ORDER BY LAST_NAME;

Risultato:

LAST_NAME                     SALARY     INCOME
------------------------- ---------- ----------
Baer                           10000      10000
Baida                           2900       2900
Banda                           6200       6820
Bates                           7300       8395
Bell                            4000       4000
Bernstein                       9500      11875
Bissot                          3300       3300
Bloom                          10000      12000
Bull                            4100       4100

9 rows selected.

Uso delle espressioni CASE nelle query

Un'espressione CASE consente di utilizzare la logica IF … THEN … ELSE nelle istruzioni SQL senza richiamare i sottoprogrammi. Esistono due tipi di espressioni CASE, semplici e ricercate.

La query nell'Esempio 2-27 utilizza un'espressione CASE semplice per mostrare il nome del paese per ogni codice paese.

La query nell'Esempio 2-28 utilizza un'espressione CASE cercata per mostrare gli aumenti di stipendio proposti (15%, 10%, 5% o 0%) in base agli intervalli di date associati all'anzianità di servizio.

Vedere anche:

Esempio 2-27 Utilizzo di un'espressione CASE semplice in una query

SELECT UNIQUE COUNTRY_ID ID,
       CASE COUNTRY_ID
         WHEN 'AU' THEN 'Australia'
         WHEN 'BR' THEN 'Brazil'
         WHEN 'CA' THEN 'Canada'
         WHEN 'CH' THEN 'Switzerland'
         WHEN 'CN' THEN 'China'
         WHEN 'DE' THEN 'Germany'
         WHEN 'IN' THEN 'India'
         WHEN 'IT' THEN 'Italy'
         WHEN 'JP' THEN 'Japan'
         WHEN 'MX' THEN 'Mexico'
         WHEN 'NL' THEN 'Netherlands'
         WHEN 'SG' THEN 'Singapore'
         WHEN 'UK' THEN 'United Kingdom'
         WHEN 'US' THEN 'United States'
       ELSE 'Unknown'
       END COUNTRY
FROM LOCATIONS
ORDER BY COUNTRY_ID;

Risultato:

ID COUNTRY
-- --------------
AU Australia
BR Brazil
CA Canada
CH Switzerland
CN China
DE Germany
IN India
IT Italy
JP Japan
MX Mexico
NL Netherlands
SG Singapore
UK United Kingdom
US United States

14 rows selected.

Esempio 2-28 Utilizzo di un'espressione CASE cercata in una query

SELECT LAST_NAME "Name",
HIRE_DATE "Started",
SALARY "Salary",
CASE
  WHEN HIRE_DATE < TO_DATE('01-Jan-03', 'dd-mon-yy')
    THEN TRUNC(SALARY*1.15, 0)
  WHEN HIRE_DATE >= TO_DATE('01-Jan-03', 'dd-mon-yy') AND
       HIRE_DATE < TO_DATE('01-Jan-06', 'dd-mon-yy')
    THEN TRUNC(SALARY*1.10, 0)
  WHEN HIRE_DATE >= TO_DATE('01-Jan-06', 'dd-mon-yy') AND
       HIRE_DATE < TO_DATE('01-Jan-07', 'dd-mon-yy')
    THEN TRUNC(SALARY*1.05, 0)
  ELSE SALARY
END "Proposed Salary"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY HIRE_DATE;

Risultato:

Name                      Started       Salary Proposed Salary
------------------------- --------- ---------- ---------------
Faviet                    16-AUG-02       9000           10350
Greenberg                 17-AUG-02      12008           13809
Chen                      28-SEP-05       8200            9020
Sciarra                   30-SEP-05       7700            8470
Urman                     07-MAR-06       7800            8190
Popp                      07-DEC-07       6900            6900

6 rows selected.

Uso della funzione DECODE nelle query

La funzione DECODE confronta un'espressione con diversi valori di ricerca. Ogni volta che il valore dell'espressione corrisponde a un valore di ricerca, DECODE restituisce il risultato associato a tale valore di ricerca. Se non viene trovata alcuna corrispondenza, DECODE restituisce il valore predefinito (se specificato) o NULL (se non è specificato alcun valore predefinito).

La query nell'Esempio 2-29 utilizza la funzione DECODE per mostrare gli aumenti dello stipendio proposti per tre lavori differenti. L'espressione è JOB_ID; i valori di ricerca sono 'PU_CLERK', 'SH_CLERK' e 'ST_CLERK' e il valore predefinito è SALARY.

Nota: gli argomenti della funzione DECODE possono essere qualsiasi tipo di carattere o numerico SQL. Oracle converte automaticamente l'espressione e ogni valore di ricerca nel tipo di dati del primo valore di ricerca prima del confronto. Oracle converte automaticamente il valore restituito nello stesso tipo di dati del primo risultato. Se il primo risultato ha il tipo di dati CHAR o se il primo risultato è NULL, Oracle converte il valore restituito nel tipo di dati VARCHAR2.

Vedere anche:

Esempio da 2 a 29 mediante la funzione DECODE in una query

SELECT LAST_NAME, JOB_ID, SALARY,
DECODE(JOB_ID,
'PU_CLERK', SALARY * 1.10,
'SH_CLERK', SALARY * 1.15,
'ST_CLERK', SALARY * 1.20,
SALARY) "Proposed Salary"
FROM EMPLOYEES
WHERE JOB_ID LIKE '%_CLERK'
AND LAST_NAME < 'E'
ORDER BY LAST_NAME;

Risultato:

LAST_NAME                 JOB_ID         SALARY Proposed Salary
------------------------- ---------- ---------- ---------------
Atkinson                  ST_CLERK         2800            3360
Baida                     PU_CLERK         2900            3190
Bell                      SH_CLERK         4000            4600
Bissot                    ST_CLERK         3300            3960
Bull                      SH_CLERK         4100            4715
Cabrio                    SH_CLERK         3000            3450
Chung                     SH_CLERK         3800            4370
Colmenares                PU_CLERK         2500            2750
Davies                    ST_CLERK         3100            3720
Dellinger                 SH_CLERK         3400            3910
Dilly                     SH_CLERK         3600            4140

11 rows selected.