Query SQL


 
4 Maggio 2002
by Enrico Strocchi - http://digilander.iol.it/strocchi


Indice


Gestione Tabelle

Creare una tabella:

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.

Mostra tutti i database presenti:

SHOW DATABASES;

Cambia database:

USE nomedb;

Mostra il database corrente:

SELECT DATABASE();

Mostra tutte le tabelle del database corrente:

SHOW TABLES;

Mostra una descrizione di tablename:

DESCRIBE tablename;

Cambia la password dello user enrico in pippo:

SET PASSWORD FOR enrico@% = PASSWORD('pippo');