CREATE TABLE Personale ( Matricola CHAR(5), Cognome VARCHAR(30), Nome VARCHAR(30), CodFisc CHAR(16) not null, Via VARCHAR(25), CAP CHAR(5), Citta VARCHAR(25), Prov CHAR(2), Assunto DATE, Reparto VARCHAR(25), Stipendio INTEGER );
Aggiungere una colonna alla tabella dopo il campo nome:
ALTER TABLE Personale ADD Nascita DATE AFTER nome;
Cancellare una colonna dalla tabella:
ALTER TABLE Personale DROP Assunto;
Creare un indice (UNIQUE se si vuole che non ci siano elementi ugali):
CREATE UNIQUE INDEX Ipers ON Personale (Cognome, Nome);
Eliminare un indice:
DROP INDEX Ipers ON Personale;
Cancellare una tabella:
DROP TABLE Personale;
Gestione Dati
Inserire dati:
INSERT INTO Personale (Matricola,Cognome,Nome,CodFisc,Via,CAP,Citta,Prov,Assunto,Reparto,Stipendio) VALUES ('AB123','Rossi','Paolo','RSSPLA65M20R341E','Via Roma','20100', 'Forlì','FC','01/12/1997','Produzione','960');
Modificare un dato:
UPDATE Personale SET Via = 'via Manzoni' WHERE Matricola = 'AB123';
Modificare più dati:
UPDATE Personale SET Stipendio = Stipendio * 1.05 WHERE Stipendio < 800;
Cancellare dati:
DELETE FROM Personale WHERE Matricola = 'AB123';
Cancellare piu' dati:
DELETE FROM Personale WHERE Assunto < '12/31/1980';
Selezione dei dati
Selezionare tutti i dati di una tabella:
SELECT * FROM Personale;
Selezionare solo alcune righe o alcune colonne di una tabella:
SELECT Cognome,Nome,CodFisc FROM Personale WHERE Stipendio > 1000;
Select con DISTINCT non visualizza righe ripetute:
SELECT DISTINCT Nome FROM Personale;
Per visualizzare il risultato con il titolo della colonna diverso:
SELECT DISTINCT Prov AS Provincia FROM Personale;
Si può mostrare anche un risultato modificato:
SELECT Cognome,Nome,Stipendio AS Vecchio,Stipendio*1.05 AS Nuovo FROM Personale;
Se voglio mostrare solo le righe che hanno un dato in comune fra due tabelle diverse:
SELECT * FROM tabella1,tabella2 WHERE tabella1.Matricola = tabella2.Matricola;
Per mostrare le righe che hanno un dato in comune nella stessa tabella devo usare AS (il campo dirigente contiene il numero di matricola di un altro che si trova nella stessa tabella):
SELECT tab1.cognome,tab1.nome,tab2.cognome FROM tabella1 AS tab1, tabella2 AS tab2 WHERE tab1.dirigente = tab2.matricola;
La condizione WHERE può essere estesa utilizzando gli operatori AND e OR:
SELECT * FROM Personale WHERE Stipendio < 800 AND Assunto < '12/31/1980';
L'output di un SELECT può essere usato per generare una nuova tabella con INTO:
SELECT * INTO forlivesi FROM Personale WHERE Prov = 'FC';
Si possono inserire delle righe in una tabella già esistente usando INSERT INTO:
INSERT INTO Personale SELECT * FROM NuoviAssunti;
Funzioni di aggregazione
Per sapere il numero di righe in una tabella:
SELECT COUNT (*) FROM Personale;
Se invece di (*) si mette il nome di una colonna non vengono conteggiati i campi NULL:
SELECT COUNT (Prov) FROM Personale WHERE Prov = 'FC';
Si può usare il DISTINCT fra parentesi in questo modo si ottiene il numero di valori diversi:
SELECT COUNT (DISTINCT Prov) AS StipendioForlivesi FROM Personale WHERE Stipendio < 800;
L'operatore SUM permette di fare la somma di vari elementi:
SELECT SUM(Stipendio) FROM Personale WHERE Assunto < '12/31/1980';
Dentro le tonde si può mettere anche una espressione:
SELECT SUM (PrezzoUnitario * Quantità) AS Totale FROM Fatture;
Con l'operatore AVG si ottiene la media dei valori:
SELECT AVG(Stipendio) FROM Personale;
Gli operatori MIN e MAX restituiscono il valore minimo e massimo:
SELECT MIN(Stipendio),MAX(Stipendio) FROM Personale;
Se il campo contiene delle stringhe vengono resistuiti il primo e l'ultimo elemento:
SELECT MIN(Cognome),MAX(Cognome) FROM Personale;
Con l'attributo ORDER BY viene scelto in base a cosa devono essere ordinati, quando vengono specificati più argomenti in caso di parità del primo viene considerato il secondo:
SELECT Cognome,Nome FROM Personale ORDER BY Cognome,Nome;
Con ASC e DESC si decide se devono essere ordinati in ordine crescente o decrescente:
SELECT Cognome,Stipendio FROM Personale ORDER BY Stipendio DESC,Cognome;
Con l'operato GROUP BY si dividono le varie righe in gruppi (nell'esempio viene restituito la somma degli stipendi nei vari reparti e il numero di dipendenti):
SELECT Reparto, SUM(Stipendio), COUNT(*) FROM Personale GROUP BY Reparto;
Usando HAVING si possono mettere delle condizioni anche su GROUP BY (l'esempio mostra tutti i reparti con più di 2 dipendenti):
SELECT Reparto, AVG(Stipendio) FROM Personale GROUP BY Reparto HAVING COUNT(*) > 2;
Condizioni di Ricerca
Altri operatori per la ricerca sono BETWEEN - AND per indicare un intervallo:
SELECT Cognome,Nome FROM Personale WHERE Assunto BETWEEN 01/01/1995 AND 12/31/2000;
Con IN invece si indicano gli elementi all'interno di una lista:
SELECT * FROM Personale WHERE Prov IN ('FC','RA','RN','BO');
LIKE permette invece di utilizzare una sorta di espressioni regolari che usano come caratteri jolly "_" per indicare un singolo carattere e "%" per indicare più caratteri:
SELECT * FROM Personale WHERE Cognome LIKE 'Ros%';
Gli operatori WHERE nome campo IS NULL e WHERE nomecampo IS NOT NULL servono per mostrare solo le righe dove nomecampo è NULL o no:
SELECT * FROM Personale WHERE Via IS NOT NULL;
Sicurezza
Si possono definire le tabelle alle quali un utente può accedere, i permessi che questo può avere e da che host si può collegare.
I permessi definibili sono: ALTER modificare le tabelle DELETE cancellare righe da una tabella INDEX creare indici INSERT inserire nuovi dati in una tabella SELECT cercare dati UPDATE modificare i dati esistenti ALL tutti i permessi precedenti.
Il comando GRANT permette di creare un nuovo utente o di concedere permessi a un utente esistente:
GRANT UPDATE ON Personale TO User1,User2;
Con REVOKE invece si possono revocare i permessi:
REVOKE UPDATE ON Personale FROM User1,User2;
Si possono definire condizioni più restrittive specificando le colonne alle quali riferire i permessi:
GRANT UPDATE (Nome,Cognome) ON Personale TO user3;
Il seguente esempio è più completo, permette di definire il database ("ON db.personale" oppure si poteva usare "ON db.*" per avere accesso a tutte le tabelle di db), l'host da cui l'utente user3 si può collegare ("TO user3@%" il % indica qualsiasi host, si poteva mettere anche qualcosa del tipo "TO user3@%.it" per aver accesso solamente da domini .it oppure direttamente l'indirizzo IP "TO user3@192.168.%") e una password (IDENTIFIED BY 'password'):
GRANT ALL ON db.Personale TO user3@% IDENTIFIED BY 'password';
Viste
Le viste sono delle "finestre" su una determinata tabella che permette di
far vedere solo alcuni
campi e non tutta la tabella. I permessi sulle viste sono definiti nello
stesso modo delle tabelle.
Per creare una vista c'è il comando CREATE VIEW:
CREATE VIEW Operaio AS SELECT * FROM Personale WHERE Reparto = 'Produzione';
Per cancellare una vista si usa DROP:
DROP VIEW Impieg;
Interrogazioni Nidificate
E' possibile nidificare le varie condizioni.
Questo esempio cerca i dipendenti con lo stipendio inferiore alla media:
SELECT Cognome,Nome FROM Personale WHERE Stipendio < (SELECT AVG(Stipendio) FROM Personale);
Il predicato ANY indica che qualsiasi risultato della subquery viene confrontato (questo esempio restituisce i dipendenti che non sono in produzione che hanno lo stipendio superiore a quello di uno qualsiasi addetto alla produzione):
SELECT Cognome,Nome FROM Personale WHERE Reparto <> 'Produzione' AND Stipendio > ANY (SELECT Stipendio FROM Personale WHERE Reparto = 'Produzione');
Usando ALL si confrontano tutti i valori della subquery (l'esempio analogo a quello di primo mostra i dipendenti che non sono in produzione che hanno lo stipendio superio a quello di tutti gli addetti alla produzione):
SELECT Cognome,Nome FROM Personale WHERE Reparto <> 'Produzione' AND Stipendio > ALL (SELECT Stipendio FROM Personale WHERE Reparto = 'Produzione');
Il predicato IN invece mostra solo gli elementi che si trovano nella subquery (l'esempio mostra nomi e cognomi dei dipendenti che lavorano nei reparti con più di 10 dipendenti):
SELECT Cognome,Nome FROM Personale WHERE Reparto IN (SELECT Reparto FROM Personale GROUP BY Reparto HAVING COUNT(*) > 10);
Il predicato EXISTS invece mostra il risultato della query se la subquery restituisce qualche valore (esiste anche NOT EXISTS):
SELECT Cognome,Nome FROM Personale WHERE EXISTS (SELECT * FROM Personale WHERE Stipendio > 1000);
Mysql
Qui di seguito alcuni comandi utili quando si utilizza un database Mysql.