Corso_SQL_oracle
Corso_SQL_oracle
1: SELECT
Mostra una colonna a partire da una esistente eseguendo un'operazione aritmetica (mostra
ma non crea!)
Creare alias come etichetta di tabella per maggiore leggibilità, prima sintassi base, poi
esempio
Concatenazione. Mostra colonna unica risultato della fusione delle due. Il risultato sarà tutto
attaccato poco leggibile
Concatenazione 2. Usando il termine ' is a' collega le due colonne con risultato DATO1 is a
DATO 2, per es. Carl is a CLERK
DISTINCT per rimuovere duplicati, per esempio per vedere lista di tutti i department dalla
tabella employees che avrebbe di sicuro dei duplicati
DESCRIBE per vedere struttura tabella. Mostra Nome colonna, se Null, eventuali constraint e
il tipo di dato associato alla colonna
DESCRIBE employees
ALCUNE REGOLE:
SQL non è case sensitive, se si necessita di utilizzare spazi o una dicitura case sensitive, va inserita
tra apici.
Il ; serve a terminare un comando. È necessario nel caso si invii più di un comando insieme,
altrimenti è opzionale.
------------------------------------------------------------------------------------------------------------------------
LEZ. 2 : WHERE
Comparison operator IN. Cerca solo dipendenti il cui manager ha id in quella lista
SELECT first_name
FROM employees
WHERE first_name LIKE 'S%'
Comparison operator LIKE . Ha un carattere prima, la seconda lettera è s per es. Assante,
Esposito ecc...
SELECT first_name
FROM employees
WHERE first_name LIKE '_s%'
Rules of precedence: mostra i dipendenti con salario > di 10000 nel department_id 80 oppure i
dipendenti nel department_id 60
Mostra i dipendenti con salario > di 10000 nel department_id 80 o nel department_id 60
Comando ORDER BY
Ordinare scrivendo il num di colonna anziché nome. Per es. qui ordina per department_id
User input, in questo caso si fa inserire employee_num con & come SUBSTITUTION
VARIABLE per cercare uno specifico employee_id
Repeated substitution, per non dover far inserire più volte all' utente stessa variabile; si crea
con doppia &
UNDEFINE column_name;
Si può definire prima della select il valore della substitution variable con il comando DEFINE
DEFINE employee_num;
SELECT employee_id, first_name, last_name
FROM employees
WHERE employee_id = &employee_num ;
Si può rimuovere il DEFINE con UNDEFINE cui sopra o chiudendo SQL DEVELOPER
SET VERIFY ON
SELECT employee_id, last_name, salary
FROM employees
WHERE employee_id = &employee_num;
--------------------------------------------------------------------------------------------------------------
LEZ. 4: FUNZIONI COLONNA SINGOLA
LOWER sul where, cerca direttamente come tutto minuscolo, anche se nel DB non lo è
Esempio con CONCAT nome e cognome dando nome colonna NAME, con lunghezza
cognome, cerca presenza lettera 'a' nel cognome (nome colonna Contains 'a'), dove il cognome
finisce per 'n'
NEST SINGLE ROW FUNCTIONS, esempio nesting CONCAT E SUBSTR con UPPER,
eseguendo prima le parentesi interne.
Stampa nome intero concatenato alle prime tre lettere cognome, tutto in maiuscolo.
NUMERIC FUNCTIONS
Testare numeric function come ROUND e TRUNC nella tabella temp DUAL
Fare operazioni aritmetiche sulle date, per esempio per vedere le settimane di lavoro da oggi
alla data assunzione e mostrarlo in colonna weeks
------------------------------------------------------------------------------------------------------------------------
SELECT last_name
TO_CHAR(hire_date, 'fmDD Month YYYY')
AS hire_date
FROM employees;
SELECT last_name
TO_CHAR(hire_date, 'fmDdspth "of" Month YYYY fmHH:MI:SS AM') HIREDATE
FROM employees;
Cerca una hire_date in un formato specifico con corrispondenza esatta (anche per gli spazi
vuoti!)
Documentazione:https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/
Format-Models.html#GUID-49B32A81-0904-433E-B7FE-51606672183A
------------------------------------------------------------------------------------------------------------------------
NVL permette di mostrare un' espressione alternativa a null: se la prima espr. è null, verrà
mostrata la seconda. Se la prima è non null, verrà mostrata la prima
Nell' esempio si calcola il guadagno annuale incluse le commissioni dove previste, altrimenti si
somma 0
NVL2 se la prima espr. è not null, viene mostrata la seconda. Se la prima espr. è null viene
mostrata la terza.
Nell' esempio viene mostrato nella colonna income se il gudagno dei dipendenti del dep 50 e 80
derivano solo dal salario o salario + commissioni
Si vuole aumentare lo stipendio per alcune categorie di dipendenti del 10, 15 o 20% in base al
ruolo; per le altre il salario rimane lo stesso. Risultato mostrato nella colonna
REVISED_SALARY
Si categorizza lo stipendio in base al suo ammontare. Se non è presente nelle varie fasce, allora
è eccellente
Il primo esempio si può fare anche con la funzione DECODE, che è specifica della sintassi
Oracle
------------------------------------------------------------------------------------------------------------------------
Esempio con media, massimo, minimo e somma. Si può anche aggiungere DISTINCT prima
della colonna per togliere duplicati, se serve
Documentazione:https://docs.oracle.com/cd/E11882_01/server.112/e41084/
functions003.htm#SQLRF20035
COUNT. Sapere il numero di dipendenti nel dep. 80 che guadagna delle commissioni
SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 80;
Genera report con il numero di dipartimenti che hanno almeno un impiegato, quindi
escludendo quelli che non ne hanno (COUNT e DISTINCT)
Le funzioni di gruppo IGNORANO I VALORI NULL. Per inserirli, usare NVL. Nell'
esempio, nel conteggio i null sono 0 e partecipano alla media. Senza NVL è 0.2125, con 0.0425
Clausola GROUP BY: calcolare la media del salario per ogni dipartimento, ovvero la media di
tutti i salari nel gruppo specificato nella clausola GROUP BY
Visualizzare risultati di gruppi all' interno di altri gruppi. Nell' esempio,prima si divide per
department_id poi ogni gruppo per job_id, quindi vedremo la somma dei salari di ogni
dipartimento per ogni tipo di lavoro (per es dep 110, AC_ACCOUNT, 8300)
Restringere gruppi che sono risultato del group by: HAVING clause (simile a WHERE ma di
gruppo)
Nell' esempio, si vuole trovare il salario massimo in ciascun dipartimento. Il salario massimo
deve essere > 10.000. Bisogna quindi trovare il max sal di ogni dep. raggruppando ogni
department_id con group by, e poi restringere i gruppi a chi ha come max sal > 10.000
ANNIDARE FUNZIONI DI GRUPPO. Nell' esempio di calcola il salario medio per ogni
dipartimento e si mostra il salario medio massimo. La clausola GROUP BY è obbligatoria con
le funzioni di gruppo annidate.
SELECT MAX(AVG(salary))
FROM employees
GROUP BY department_id;
NOTA BENE: chiedere a Ugo come mai dopo SELECT non c'è department_id
------------------------------------------------------------------------------------------------------------------------
Nell' esempio si vuole ottenere le informazioni di tutti i dipendenti (employee_id) dei loro
lavori (job_id e job_title) che però sono in due tabelle diverse cioè employees e jobs. Si usa la
colonna job_id, l' unica in comune, per unire le due tabelle
PREFISSI DI TABELLA per risolvere l'ambiguità di della colonna comune a più tabelle e
velocizzare l'esecuzione. Non si può usare nella clausola WHERE se la colonna è stata prima
usata in USING. Si ottiene con letteraTabella.nomeColonna come nell' esempio sotto
Si può usare la clausola ON anziché USING, così si possono specificare le colonne da unire
THREE-WAY JOIN, JOIN di tre tabelle. Nell' es. report di tutti i dipendenti, i loro
dipartimenti e le cità dove sono localizzati.
AND clause: report delle location_id di tutti i dipendenti sotto il manager_id 149
-----------------------------------------------------------------------------------------
LEZ. 10: SELF JOINS, OUTER JOINS, CROSS JOINS
SELF JOIN Nell'esempio si vuole sapere il nome del manager di ogni dipendente.Nella tabella
employees si sa il manager_id che corrisponde all' employee_id del manager. Si cerca quindi
prima per ogni employee_id il corrispondente manager_id, poi si cerca il manager_id come
employee_id, con relativo last_name. Worker e manager sono alias di tabella
/* risultato:
Employees and Their Managers
-
Rajs works for Mourgos
Raphaely works for King
Rogers works for Kaufling
Russell works for King
*/
NONEQUIJOIN l' operatore utilizzato non è = (per es. employee_id di manager e employee).
Nell'esempio si vuole sapere il livello di lavoro di ciascun dipendente (dato dal suo salario) da
tabella employees e job_grades. In job grades ci sono range di stipendio LOWEST_SAL E
HIGHEST_SAL
OUTER JOIN permette di mostrare quei risultati non visibili in equijoin in quanto non hanno
un valore assegnato (per es. un dipartimento senza dipendenti o viceversa)
LEFT OUTER JOIN mostra tutte le righe che soddisfano una data condizione e le righe che
non hanno corrispondenza nella tabella a sinistra
Nell' es. si vuole mostrare tutte le informazioni dei dipendenti e i loro dipartimenti
indipendentemente dal fatto che un dipendente sia assegnato o meno a un dipartimento.
Grant non appartiene a nessun dep. quindi ha null in department_id e department_name
RIGHT OUTER JOIN mostra tutte le righe che soddisfano una data condizione e le righe che
non hanno corrispondenza nella tabella a destra.
Nell' es. si vuole mostrare tutte le informazioni dei dipendenti e i loro dipartimenti
indipendentemente dal fatto che un dipartimento abbia o meno almeno un impiegato. il
dipartimento 190 non ha dipendenti e mostra null alla colonna last_name
FULL OUTER JOIN mostra tutte le righe che soddisfano una data condizione e anche quelle
che non lo fanno, unendo LEFT e OUTER JOIN
Nell' esempio otterremo sia i dipartimenti con null in last_name perché non hanno dipendenti,
che null in department_id e _name dove un dipendente non è stato assegnato a un
dipartimento.
CROSS JOIN nei casi dove si fa una join senza porre una condizione, viene creata una tabella
che è un prodotto cartesiano, ovvero a ogni riga di una tabella viene assegnata ciascuna riga
dell' altra. Raramente utile.
Nell' esempio si uniscono tutte le 20 righe dei dipendenti con tutte le 8 righe dei dipartimenti,
creando una tabella di 160 righe.
-----------------------------------------------------------------------------------------------------------------
Report di tutti i dipendenti che hanno lo stesso impiego di Taylor e che hanno uno stipendio
maggiore di Taylor
Utilizzo di funzioni di gruppo sulle single-row subquery. Nell' esempio mostra il dipendente
pagato meno di tutti
Subquery con HAVING clause. Nell' esempio lista di tutti i dip. che hanno salario minimo
maggiore rispetto al salario minimo del dip. 50
Single-Row con due tabelle. Si vuole mostrare tutti i dipendenti che sono architetti. Se non ce
ne sono, la subquery dà risultato null e la query principale quando fa il confronto restituisce
null e quindi riga vuota (anche se in employees ci fosse un job_id null, perché il paragone di
due null dà null
Report di tutti i dipendenti non IT Programmers e con il salario inferiore dal minimo
guadagnato da IT Programmers. > ALL più che il massimo, < ALL meno che del minimo
N.B. l' operatore NOT può essere usato con IN, ANY e ALL
NOT IN operator, equivalente di <> ALL. Non va usato se si sospetta che possa esserci un
valore null nella subquery, in tal caso avremmo una colonna vuota (vedere single-row con due
tabelle per spiegazione).
Nell' esempio vogliamo vedere tutti i dipendenti che non sono manager. Potremmo avere
valori null quindi si aggiunge nella subquery WHERE... IS NOT NULL come sotto
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN (SELECT manager_id
FROM employees mgr);
Mostrare tutti i dipendenti che sono manager. Usando l' operatore IN non ci sono problemi
con i valori null perché è equivalente di =ANY
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id IN (SELECT manager_id
FROM employees mgr);
---------------------------------------------------------------------------------------------------------------
LEZ. 13: INSERT
Inserire un record alla volta, nell' esempio un nuovo dip. Se non si specificano le colonne,
bisogna mantenere l'ordine di default della tab nella parte VALUES
Inserire valori NULL se non si conoscono, per aggiornarli dopo con update. Prima sincerarsi i
campi non siano NOT NULL con DESCRIBE nomeTabella. Se possono essere null basta non
dichiarare e aggiornare le colonne dal dato sconosciuto(metodo implicito)
È possibile inserire SYSDATE come data e USER per inserire l' username in utilizzo.
Nell'esempio (ridotto) di seguito, utilizzo di SYSDATE. N.B. inseritO [...] per i dati non di
interesse, per brevità di esempio
N.B.: testare query sopra o chiedere come mai manca VALUES prima della subquery
3)COPIA ESATTA di una tabella su un'altra già esistente (per es. per un backup)
------------------------------------------------------------------------------------------
UPDATE: Nell' es. si spostano dei dipendenti dal dipartimento 60 all' 80. Importante la
clausola WHERE, se omessa viene cambiato a 80 il dipartimento per tutti
UPDATE employees
SET department_id = 80
WHERE department_id = 60;
UPDATE employees
SET job_id = 'IT_PROG', commission_pct = NULL
WHERE employee_id = 113;
UPDATE con SUBQUERY si vuole aggiornare job_id e salario del dipendente 103 con quelli
del 205, senza conoscere job_id e salario di quest'ultimo
UPDATE employees
SET (job_id, salary) = (SELECT job_id, salary
FROM employees
WHERE employee_id = 205)
WHERE employee_id = 103;
UPDATE copy_emp
SET department_id = (SELECT department_id
FROM employees
WHERE employee_id = 100)
WHERE job_id = (SELECT job_id
FROM employees
WHERE employee_id = 200);
DELETE per rimuovere righe da una tabella. Nell' esempio si vuole togliere il dipartimento
'Contracting'
Rimuovere righe con una SUBQUERY. Nell' esempio si vogliono cancellare da employees i
dipendenti del dipartimento che ha un nome che contiene Public nella tabella departments
(colonna department_id in comune)
--------------------------------------------------------------------------------------------------------
Creare tabella dept definendo nome colonna e corrispettivo data type. Si utilizza anche l'
espressione DEFAULT per create_date, che viene inserita se non viene specificata
diversamente dall' utente in fase di inserimento dati
DESCRIBE per verificare la corretta creazione della tabella (vedere lez.1 SELECT)
DESCRIBE dept
Inserire dei vincoli (CONSTRAINTS) a livello di colonna o tabella in fase creazione tabella o dopo
la sua creazione, come ad esempio NOT NULL dove serve che ci sia sempre un dato inserito (nell'
es. sopra potrebbe essere deptno). NOT NULL è solo a livello di colonna. È buona norma attribuire
un nome al vincolo, anziché lasciare che oracle ne crei uno di dafault. I vincoli sono inseriti tutti nel
data dictionary. Verranno spiegati nella lezione sotto
-------------------------------------------------------------------------------------------------------------------
LEZ. 16: CREATE TABLE CONSTRAINT
Definizione della Primary Key creando la tabella dept2 a livello di colonna. La primary key è
inoltre NOT NULL e deve essere una sola in tutta la tabella
La FOREIGN KEY collega una colonna a un'altra della stessa o altra tabella. Se provo a inserire
un dato nella tabella1 colonna1 con la foreign key che non è presente nella tabella2 colonna2
collegata, avrò un errore. Può essere definita a livello di tabella o a livello di colonna. Non si può
cancellare una riga ricercandola per colonna con foreign key (nell' es. department_id) se ci sono dati
al suo interno. Se per es. provo a cancellare un department_id senza dipendenti, funzionerà. Se ci
sono dipendenti, invece darà errore.
CHECK controlla che non venga inserito un dato che non rispetta un certo vincolo, per es. salary
>0
UNIQUE impone che quel dato non abbia un duplicato nella colonna o colonne specificate. Utile
per es. in email o num tel personale
CREARE TABELLA CON SUBQUERY. Nell' esempio si crea una tabella separata per i
SA_REP a partire da employees. Si ereditano i vincoli NOT NULL, ma non altri vincoli e la
primary key non ha il vincolo NOT NULL implicito
N.B. è necessario inserire un alias di colonna dove c'è un'espressione (qui salary*12 ANNSAL),
altrimenti avremo un errore.
--------------------------------------------------------------------------------------------------------------------
ADD per aggiungere una colonna. Il valore è "null" almeno che non si inserisca un valore
default
DROP per cancellare una colonna. Non si può fare se è una primary key, almeno che non sia
stata attivata la funzione 'cascade'
Come sopra con CASCADE,cancella anche se è una primary key. Cancella anche le colonne
che vi fanno riferimento
UNUSED per cancellare successivamente una colonna con molti dati, dove la cancellazione
richiederebbe molto tempo, una volta scollegati gli utenti
N.B. cerca/chiedi se non è uguale aspettare che non ci siano utenti e basta, qual'è il vantaggio
effettivo di unused
READ ONLY per mettere la tabella in sola lettura ed evitare che un utente inserisca dei dati
mentre si eseguono query DDL. In questa modalità si può solo eseguire DROP, QUERY,
RENAME e MOVE
DROP TABLE per cancellare una tabella. Si cancellano i dati ma non lo spazio utilizzato.
SAVEPOINT permette di creare dei punti dove tornare indietro con un rollback.
[...query precedenti...]
SAVEPOINT save_1;
[... query da cancellare...]
ROLLBACK to save_1;
[...query corrette...]
COMMIT;
----------------------------------------------------------------------------------------------------------------------
LEZ. 19: UTENTI e PRIVILEGI
DOC
ORACLE:https://docs.oracle.com/database/121/SQLRF/statements_9014.htm#SQLRF01603
SYSTEM PRIVILEGE:
ALTER USER per modificare la password.Nell'esempio, l' user demo cambia la sua password
in 12345. Lo può fare se ha il privilegio "alter user"
GRANT select
ON employees
TO demo
WITH GRANT OPTION;
Nell' esempio si dà il privilegio update su alcune colonne di departments sia all' utente demo
che al ruolo manager
REVOKE per rimuovere privilegi ad altri utenti, nell' esempio il privilegio select su
employees per l' utente demo. Se demo ha dato il privilegio ad altri utenti, anche per loro
viene revocato.
REVOKE select
ON employees
FROM demo;
In fondo, dopo FROM ... si può aggiungere CASCADE CONSTRAINTS,che serve per
rimuovere ogni vincolo di integrità referenziale creato nell' oggetto con il privilegio
REFERENCES.
Un REFERENCE privilege è un object privilege che permette a utente di definire un vincolo di
integrità referenziale:è necessario per definire una Foreign Key
-----------------------------------------------------------------------------------------------------------------------
Il data dictionary è un set di viste solo lettura che permette, tramite query, di vedere varie
informazioni sui vari oggetti, come proprietari, user, vincoli ecc.. Una vista è una tabella logica
basata su una o più tabelle.
Vista DICTIONARY contiene nome e descrizione breve di ogni vista del data dictionary alle
quali si ha accesso. Per vederle tutte, bisogna avere il privilegio SELECT ANY DICTIONARY
Per visualizzare come è fatta la vista, è utile usare DESCRIBE, anche per le prossime viste
come USER_TABLE ecc
DESCRIBE dictionary;
SELECT *
FROM dictionary
WHERE table_name = 'USER_OBJECTS';
USER_TABLE per accedere alle informazioni di tutte le proprie tabelle; nell' esempio si vuole
sapere il nome di tutte le proprie tabelle
SELECT table_name
FROM user_tables;
ALL_TABLES per vedere una lista di tutte le tabelle alle quali si ha accesso
USER_TAB_COLUMNS mostra i nomi di colonna, data type, lunghezza dei dati dove ci sono
null ecc.. delle proprie tabelle (https://docs.oracle.com/database/121/REFRN/GUID-
F218205C-7D76-4A83-8691-BFD2AD372B63.htm#REFRN20277 )
Nell' esempio una query per visualizzare alcune informazioni sulle colonne della propria
tabella employees (simile all' output del comando DESCRIBE)
Nell' esempio si vedono alcune informazioni su tutti i vincoli creati per la tabella employees.
r_constraint_name è il nome dell' unico vincolo al quale fa riferimento la foreign key, e deletion
rule è la regola per la cancellazione della foreign key : CASCADE quando il record padre
viene cancellato, viene cancellato anche il figlio, SET NULL il figlio viene impostato come
NULL anziché cancellato, NO ACTION il record padre può essere cancellato solo se non c'è
un record figlio.
Constraint_type può essere c per "check constraint on a table” o NOT NULL, P primary key,
U unique key, R referencial integrity
COMMENT statements per inserire una breve descrizione di max 4000 caratteri della tabella
e/o delle sue colonne per una migliore manutenzione e lavoro in team
COMMENT ON TABLE employees
IS 'Employee Information';
Per vedere i commenti delle tabelle/colonne ci sono diverse query, vedere immagine
View_Comment
Nell' esempio si usa USER_TAB_COMMENTS per vedere i commenti di tutte le proprie
tabelle
SELECT *
FROM user_tab_comments;