Appunti per Scuola e Università
humanisticheUmanistiche
Appunti e tesine di tutte le materie per gli studenti delle scuole medie riguardanti le materie umanistiche: dall'italiano alla storia riguardanti le materie umanistiche: dall'italiano alla storia 
sceintificheScientifiche
Appunti, analisi, compresione per le scuole medie suddivisi per materie scientifiche, per ognuna troverai appunti, dispense, esercitazioni, tesi e riassunti in download.
tecnicheTecniche
Gli appunti, le tesine e riassunti di tecnica amministrativa, ingegneria tecnico, costruzione. Tutti gli appunti di AppuntiMania.com gratis!
Appunti
informatica
CComputerDatabaseInternetJava
Linux unixReti


AppuntiMania.com » Informatica » Appunti di database » Selezione Condizionata

Selezione Condizionata




Visite: 1096Gradito:apreciate 4-stela [ Medio appunti ]
Leggi anche appunti:

Database


DATABASE IL PROGRAMMA ACCESS Access è un programma per la gestione

DB Spaziali


DB Spaziali I dati territoriali (geometrici) sono oramai importanti per molte organizzazioni.. I

Il Linguaggio SQL


Il Linguaggio SQL Ora che abbiamo visto rapidamente cosa sta alla base di
immagine di categoria

Scarica gratis Selezione Condizionata

Selezione Condizionata


Per continuare la discussione sulla selezione, facciamo riferimento a questa nuova tabella di esempio

TabellaStatisticheImpiegati

CodiceImpiegato

StipendioAnnuo

Benefici

Posizione

010

75000000

15000000 

Dirigente

105

65000000

15000000 

Dirigente

152

60000000

15000000 

Dirigente

215

60000000

12500000 

Dirigente

244

50000000

12000000 

Impiegato

300

45000000

10000000 

Impiegato

335

40000000

10000000 

Impiegato

400

32000000

7500000 

Apprendista

441

28000000

7500000 

Apprendista

Operatori Relazionali

Ci sono sei operatori relazionali in SQL, e dopo averli specificati vedremo come si usano. gli operatori sono:

=

Uguale

<> oppure != (vedere manuali)

Non Uguale 

<

Minore di

>

Maggiore di

<=

Minore o uguale di

>=

Maggiore o uguale di

La clausola WHERE viene utilizzata per specificare che si desidera vedere solo certe righe della tabella, basandosi per la scelta sul criterio stabilito nella clausola stessa. Penso che un paio di esempi possano rendere più chiaro il funzionamento della stessa.

Se si vuole vedere il Codice Impiegato di quegli impiegati che hanno uno stipendio annuo maggiore di 50 milioni possiamo farlo così:

SELECT CodiceImpiegato
FROM TabellaStatisticeImpiegati
WHERE StipendioAnnuo >= 50000000;

Notate che abbiamo utilizzato il simbolo >= (Maggiore o uguale di), in quanto vogliamo vedere sia coloro che hanno uno stipendio di 50 milioni che quelli che hanno uno stipendio maggiore di 50 milioni. il risultato sarà il seguente:

CodiceImpiegato





la parte del comando  WHERE che contiene la regola discriminante, in questo caso StipendioAnnuo >= 50000000, e' conosciuta come una  condizione (un' operazione il cui risultato può essere Vero o Falso). La stessa cosa può essere fatta anche con colonne che contengono testo invece che numeri:

SELECT CodiceImpiegato
FROM TabellaStatisticheImpiegati
WHERE POSIZIONE = 'Dirigente';

Questo comando mostrerà come risultato il codice impiegato di tutti i dirigenti. Generalmente quando si utilizzano colonne di testo ci si limita agli operatori = e != , e bisogna assicurarsi che tutti i testi utilizzati compaiano nel comando racchiusi tra singoli apici ('). N.B. il singolo apice e' l' identificatore di testo nell' SQL ANSI, ma alcuni DBMS usano altri qualificatori come i doppi apici. 

Condizioni più complesse: Condizioni multiple e Operatori Logici 

L' operatore AND congiunge due o più condizioni, e ritorna tutte e solo le righe che soddisfano TUTTE le condizioni. Per esempio, per mostrare i codici di tutti gli impiegati con uno stipendio superiore ai 40 milioni si utilizza il comando seguente:

SELECT CodiceImpiegato
FROM TabellaStatisticheImpiegati
WHERE StipendioAnnuo  > 40000000 AND Posizione = 'Impiegato';

L' operatore OR collega anch'esso due o più condizioni, ma ritorna una riga se UNA QUALSIASI delle condizioni inserite risulta vera. ad esempio per vedere tutti coloro che  hanno uno stipendio annuo inferiore a 40 milioni o ricevono meno di 10 milioni in benefici accessori si utilizza la seguente query:

SELECT CodiceImpiegato
FROM TabellaStatisticheImpiegati
WHERE StipendioAnnuo  < 40000000 OR Benefici < 10000000;

AND ed OR possono venire combinati, come nell' esempio seguente:

SELECT CodiceImpiegato
FROM TabellaStatisticheImpiegati
WHERE Posizione = 'Dirigente' AND StipendioAnnuo > 60000000 OR Benefici > 12000000;

Per prima cosa, SQL trova le righe in cui lo stipendio annuo e' maggiore di 60 milioni e che contengono nella colonna Posizione la parola 'Dirigente', quindi si tiene in memoria questa lista e controlla che soddisfino la condizione OR relativa ad avere benefici per più di 12 milioni. Notate che la condizione AND viene risolta per prima, cosa che modifica nettamente i risultati. spendiamo un paio di parole in più su questo fatto, in quanto se non ben compreso può portare a differenze sostanziali nei risultati delle query ed alla difficile comprensione del perché ciò è avvenuto.

Per generalizzare quello che avviene, SQL calcola i risultati delle operazioni AND per determinare quali sono le righe che soddisfano la condizione (ricordate: TUTTE le condizioni devono essere vere), quindi questi risultati vengono utilizzati per essere confrontati con la condizione OR, e vengono mostrate solo le righe rimanenti dove una qualsiasi delle operazioni collegate dall' operatore OR risulta vera (True). Matematicamente , SQL valuta tutte le condizioni realizzate tramite operatori relazionali, quindi valuta le 'coppie' di AND e quindi gli OR (dove entrambi gli operatori sono valutati da sinistra a destra).

Per fare un esempio, guardiamo cosa succede quando il nostro DBMS valuta una determinata condizione, ricordando che i valori booleani 'vero' e 'falso' in SQL vengono espressi come True e False . il primo passo che il DBMS fa e' di valutare i risultati delle operazioni svolte tramite gli operatori relazionali, quindi si prepara a valutare gli operatori logici sui risultati. mettiamo che dalla valutazione di una condizione complessa al nostro DBMS sia risultato quanto segue:

True AND False OR True AND True OR False AND False

La prima cosa che fa sarà valutare le coppie di AND, ottenendo quanto segue:

True AND False OR True AND True OR False AND False = False OR True OR False
1° coppia          2° Coppia        3°Coppia

Quindi parte a valutare gli OR, da sinistra a destra, ottenendo al primo passaggio quanto segue:

False OR True OR False = True OR False
1° coppia

ed alla fine, valutando l' ultima espressione , arriva al risultato definitivo

True OR False = True

Il risultato finale e' True (vero) e quindi la riga che ha generato questa sequenza di valori verrà inserita all' interno di quelle passate dalla query. Assicuratevi di leggere attentamente anche la prossima sezione sull' operatore NOT e di avere ben compreso l' ordine di valutazione degli operatori, in quanto e' un argomento difficile da spiegare in poche righe, pertanto posso solo sperare di essere stato sufficientemente chiaro.

Per variare l' ordine di esecuzione , ad esempio se volete una lista di dipendenti che percepiscono uno stipendio maggiore di 50 milioni o con benefici maggiori di 10 milioni e che siano dei dirigenti, si usano le parentesi, come in questo esempio:

SELECT CodiceImpiegato
FROM TabellaStatisticheImpiegati
WHERE Posizione = 'Dirigente' AND (StipendioAnnuo > 50000000 OR Benefici > 10000000);


IN , BETWEEN e NOT

Un metodo semplice per usare delle condizioni multiple e' quello di impiegare le due clausole  IN e BETWEEN. Per esempio, se volete vedere tutti i dipendenti che siano dirigenti o impiegati potete fare così:

SELECT CodiceImpiegato
FROM TabellaStatisticheImpiegati
WHERE Posizione IN ('Dirigente', 'Impiegato');

Oppure per avere la lista di coloro che hanno uno stipendio maggiore o uguale di  30 milioni e minore o uguale a 50 milioni potete impiegare il seguente comando

SELECT CodiceImpiegato
FROM TabellaStatisticheImpiegati
WHERE StipendioAnnuo BETWEEN 30000000 AND 50000000;

Invece, per mostrare tutti quelli che non sono compresi nell' intervallo, potete usare:

SELECT CodiceImpiegato
FROM TabellaStatisticheImpiegati
WHERE StipendioAnnuo NOT BETWEEN 30000000 AND 50000000;

Similarmente, la clausola  NOT IN restituisce tutte le righe escluse dalla lista generata dalla relativa IN, quindi se voleste vedere tutti coloro che non sono ne' dirigenti ne' impiegati potete farlo con il comando

SELECT CodiceImpiegato
FROM TabellaStatisticheImpiegati
WHERE Posizione NOT IN ('Dirigente', 'Impiegato');

Inoltre, l' operatore NOT  può venire utilizzato in congiunzione con AND ed OR per invertirne il risultato, ma va tenuto conto che mentre i due operatori AND ed OR sono binari (usano 2 condizioni) il NOT e' unario, cioè si riferisce ad una sola condizione; inoltre il NOT viene calcolato PRIMA dell' AND e dell' OR .

Ordine in SQL degli operatori logici  (tutti funzionano da sinistra a destra)

NOT

AND

OR

Utilizzare la clausola LIKE ed il carattere jolly %

Mettiamo di voler estrarre dalla nostra tabella TabellaImpiegati i codici fiscali di tutti gli impiegati il cui nome inizia per  'S'; possiamo procedere così:

SELECT CFisc
FROM TabellaImpiegati
WHERE NOME LIKE 'A%';

Il carattere percento (%) viene utilizzato pre rappresentare ogni possibile carattere (numeri, lettere o segni di interpunzione) o blocchi di caratteri che possono venire trovati dopo il carattere 'A'. similmente, se volessimo trovare coloro il cui nome termina in 'A' potremmo farlo con '%A', o se volessimo trovare quelli il cui nome contiene una A potremmo farlo con '%A%'. Visto che il funzionamento dell' operatore Like varia tantissimo da DBMS a DBMS consiglio di verificare la sintassi esatta nel vostro sistema prima di impiegarlo e per vedere quali altre possibilità vi può  offrire


I Join

In questa sezione discuteremo solo degli inner joins, e degli  equijoins, che , in genere, sono estremamente utili. Per informazioni più dettagliate in merito vi rimando ai link che ho inserito in fondo a questa pagina e che credo possano esservi di un qualche aiuto

Le norme generali sulla buona progettazione dei database suggeriscono che ogni tabella contenga dati relativi solo ad una singola 'entità' e che i dati aggiuntivi rispetto ad essa possano venire recuperati tramite relazioni con altre tabelle create tramite i Join. per prima cosa partiamo da un esempio, rappresentato dalle tabelle seguenti:


Antiquari

IDAntiquario

CognomeAntiquario

NomeAntiquario

01

Jones

Bill

02

Smith

Bob

15

Lawson

Patricia

21

Akins

Jane

50

Fowler

Sam


Ordini

IDAntiquario

OggettoRicercato

02

Tavolo

02

Scrivania

21

Sedia

15

Specchio


Antichita

IDVenditore

IDAcquirente

Oggetto

01

50

Letto

02

15

Tavolo

15

02

Sedia

21

50

Specchio

50

01

Scrivania

01

21

Cassettiera

02

21

Tavolinetto da Caffè

15

50

Sedia

01

15

Portagioielli

02

21

Terracotta

21

02

Libreria

50

01

Piantana

Le Chiavi

Per prima cosa vediamo il concetto di Chiave. Una Chiave Primaria ( o primary key) e' una colonna o un gruppo di colonne che identificano in maniera univoca (singola) ogni data riga rispetto alle altre. Tradotto in un linguaggio un po' più semplice, e' quell' insieme di informazioni che mi permettere di distinguere ogni singolo record da ogni altro record. Per esempio, nella tabella Antiquari il campo IDAntiquario distingue in maniera precisa ogni singolo record (non ci sono due record con lo stesso numero nel campo IDAntiquario ne' ci possono logicamente essere). questo significa che non possono esistere due righe della tabella con lo stesso codice in IDAntiquario e che se anche due antiquari avessero lo stesso nome e lo stesso cognome sarebbero comunque differenziato da un codice diverso, permettendoci così di non confonderli tra di loro, e che quindi ci verrà molto più comodo usare il codice rispetto al nome + cognome per  collegarci alle altre tabelle del database.

Una Chiave Esterna (o foreign key ) e' invece una colonna presente in una tabella nella quale si registrano dati che sono la chiave primaria di un' altra tabella. per fare un' esempio con il nostro database le colonne IDVenditore e IDAcquirente della tabella antichità sono chiavi esterne in quanto fanno riferimento ai valori contenuti nella chiave primaria della tabella Antiquari, cioè IDAntiquario. In 'Informatichese' questa corrispondenza viene chiamata Integrità Referenziale (o referential integrity per gli inglesofoni), ed impongono il limite che all' interno dei campi della colonna della chiave esterna non possono comparire valori che non siano stati precedentemente inseriti nella colonna della chiave primaria relativa, altrimenti ci si troverebbe di fronte ad un errore chiamato 'Violazione dell' integrità referenziale' che renderebbe il database inconsistente, cioè in pratica inutilizzabile. In pratica, come risulta chiaro dall' esempio, viene utilizzata la chiave primaria di una certa tabella per fare riferimento ai dati contenuti nel record relativo senza dovere riportarli nella seconda tabella. nel nostro esempio infatti viene utilizzato il campo 'IDAntiquario' per sapere chi ha comprato e chi ha venduto un determinato oggetto nella tabella Antichita, senza dovere riportare il nome ed il cognome sia dell' acquirente che del venditore.

Creare un Join

Lo scopo delle Chiavi appena discusse e' quella di correlare i dati attraverso le tabelle, senza dover in questo modo ripetere su tutte le tabelle i dati più frequenti, il che e' il vero scopo e la sostanziale differenza tra i database relazionali ed altri tipi di database. per esempio possiamo trovare i nomi di coloro che hanno comprato una sedia senza dover mettere il nome ed il cognome dell' acquirente nella tabella antichità. possiamo infatti ottenerne il nome mettendo in relazione coloro che hanno comprato una sedia con la lista di tutti i nomi degli antiquari della tabella Antiquari attraverso l' utilizzo dell' IDAcquirente, che mette in relazione i dati nelle due tabelle. per trovare i nomi di chi ha comprato una sedia possiamo , in pratica, utilizzare la seguente query:

SELECT CognomeAntiquario, NomeAntiquario
FROM Antiquari, Antichita
WHERE IdAcquirente = IDAntiquario AND Oggetto = 'Sedia';

Iniziamo ad analizzare le particolarità di questa query. la prima che balza all' occhio subito e' che ENTRAMBE le tabelle sono coinvolte nella query e citate di fianco alla clausola FROM. la seconda cosa e' che nella clausola WHERE le due chiavi delle due tabelle sono messe in relazione tramite l' uso della condizione IdAcquirente = IDAntiquario e quindi ristretto tramite la condizione Oggetto = 'Sedia' a coloro che hanno acquistato una sedia. La condizione che mette in collegamento le due tabelle (IDAcquirente=IDAntiquario) e' il nostro Join (in italiano connessione). Visto che la condizione che crea il join e' un uguale, questo tipo di join e' chiamato un  equijoin. Il risultato di questa query saranno due nomi: Smith, Bob e Fowler, Sam.

La notazione a punti (Dot notation) permette di specificare il nome della tabella a cui si riferisce il campo , evitando così possibili ambiguità. pur essendo più 'faticosa' e' nettamente preferibile visto che migliora notevolmente la leggibilità della query e riduce la possibilità di errori. la nostra query precedente in dot notation sarebbe così:

SELECT Antiquari.CognomeAntiquario, Antiquari.NomeAntiquario
FROM Antiquari, Antichita
WHERE Antichita.IdAcquirente = Antiquari.IDAntiquario AND Antichita.Oggetto = 'Sedia';

Questa notazione non sarebbe (e non e') necessaria se i nomi di tutti i campi di ogni tabella differissero l' uno dall' altro, ma e' comunque un' ottima abitudine da prendere e diventa fondamentale appena la struttura del database cresce a sufficienza da non essere più verificabile a colpo d'occhio

Clausola DISTINCT e l'Eliminazione dei Duplicati

Prendiamo in esame la necessità, nel nostro database di esempio, di avere una lista dei codici e dei nomi esclusivamente degli antiquari che hanno venduto un oggetto. Ovviamente si vorrà che nella lista risultante ogni venditore sia elencato una sola volta, indipendentemente dal numero di oggetti che ha venduto - non vogliamo sapere quanti oggetti ha venduto un antiquario, ma solo che abbia venduto qualcosa (per poterli conteggiare invece fare riferimento alla successiva sezione sulle funzioni di aggregazione). Questo significa che dobbiamo dire ad SQL di eliminare le righe duplicate delle vendite dello stesso antiquario, e quindi elencare ognuno di questi una volta sola. Per ottenere questo scopo utilizzeremo la clausola DISTINCT.

Per prima cosa ci serve un equijoin (come e' stato spiegato subito sopra) alla tabella degli Antiquari per potere ottenere i dati particolareggiati di ogni antiquario, cioè cognome e nome. Ovviamente in merito va mantenuta ben in mente quella che prima e' stata definita l' Integrità referenziale, cioè nel caso in cui non esistesse un record relativo al codice presente nel campo IDVenditore all' interno del campo IDAntiquario nella tabella Antiquari il minimo che può accadere è che il record non venga mostrato, mentre addirittura su alcuni DBMS si verificherebbe un errore di integrità referenziale violata bloccando l' esecuzione della query. come abbiamo detto inoltre vogliamo eliminare le occorrenze multiple dei record nella nostra lista, quindi impieghiamo la clausola Distinct sulle colonne in cui potrebbe verificarsi l' occorrenza multipla stessa

Per aggiungere un' ulteriore livello di complessità della query , vogliamo i risultati in ordine alfabetico prima per cognome e poi per nome. per fare questo possiamo utilizzare la clausola ORDER BY . La nostra query finale sarà la seguente:

SELECT DISTINCT IDVenditore, CognomeAntiquario, NomeAntiquario
FROM Antichita, Antiquari
WHERE IDVenditore = IDAntiquario
ORDER BY CognomeAntiquario, NomeAntiquario;

In questo esempio particolare, visto che tutti hanno venduto almeno un oggetto, avremo una lista completa di tutti gli antiquari, in ordine alfabetico per cognome e nome. Per uso futuro (cioè se un qualche sadico ve lo viene a chiedere) tenete presente che questo tipo di Join è da considerarsi nella categoria degli inner joins.


Scarica gratis Selezione Condizionata
Appunti su:



Scarica 100% gratis e , tesine, riassunti



Registrati ora

Password dimenticata?
  • Appunti superiori
  • In questa sezione troverai sunti esame, dispense, appunti universitari, esercitazioni e tesi, suddivisi per le principali facoltà.
  • Università
  • Appunti, dispense, esercitazioni, riassunti direttamente dalla tua aula Universitaria
  • all'Informatica
  • Introduzione all'Informatica, Information and Comunication Tecnology, componenti del computer, software, hardware ...