• operatori set

    Gli operatori SET

    Tutte le istruzioni SELECT restituiscono un insieme di righe. Gli operatori SET combinano i risultati di due o più query in un unico risultato.

    Questa pratica è conosciuta come una query composta (compound query). Oracle fornisce quattro operatori insiemistici: UNION, UNION ALL, INTERSECT e MINUS.

    Rispetto allo standard ISO per SQL,  Oracle utilizza MINUS al posto di EXCEPT. A parte questa piccola deviazione, tutto il resto è identico allo standerd ISO SQL.
    La differenza può essere importante quando si fa il porting delle applicazioni sviluppate per un database di terze parti per l’ambiente Oracle.

    Panoramica degli operatori SET

    Gli operatori SET utilizzati nelle query composte sono desxritti nella seguente tabella:

    OPERATOREDESCRIZIONE
    UNIONrestituisce le righe provenienti da due query, ordinate e senza duplicati
    UNION ALLrestituisce le righe provenienti da due query, non ordinate e con duplicati
    INTERSECTrestituisce solo le righe che figurano in entrambi i set di risultati delle query, ordinate e senza duplicati
    MINUSrestituisce solo le righe del primo set di risultati che non compaiono nel secondo set di risultati, ordinate e senza duplicati

    Questi comandi sono equivalenti agli operatori standard utilizzati in matematica per la teoria degli insiemi, spesso raffigurati graficamente come diagrammi di Venn.

    Insiemi e diagrammi di Venn

    Considerimo i raggruppamenti di esseri viventi, classificati come segue:

    • Le creature con due gambe: esseri umani, pappagalli, pipistrelli
    • Le creature che possono volare: pappagalli, pipistrelli, api
    • Le creature con pelliccia: orsi, pipistrelli

    Ogni classificazione è un insieme, e ogni membro dell’insieme è un elemento.

    L’unione dei tre insiemi sono gli esseri umani, i pappagalli, i pipistrelli, le api e gli orsi. Sono gli elementi presenti in tutti gli insiemi, senza duplicazioni.

    L’intersezione degli insiemi sono gli elementi che sono comuni a tutti e tre gli insiemi, rimuovendo i duplicati. In questo esempio, l’intersezione di tutti e tre gli insiemi ha solo un elemento: i pipistrelli. L’intersezione degli insiemi delle creature a due gambe e delle creature che possono volare ha due elementi: pappagalli e pipistrelli.
    La differenza (minus) tra due insiemi è data dagli elementi di un insieme senza gli elementi di un altro; nell’esempio in esame, l’insieme delle creature a due zampe meno l’insieme delle creature che possono volare, meno l’insieme delle creature pelose, da come risultato un singolo elemento: gli esseri umani.
    Questi insiemi possono essere rappresentati graficamente come il diagramma di Venn mostrato nella Figura (i diagrammi di Venn prendono il nome da John Venn, che ha formalizzato la teoria all’Università di Cambridge nel XIX secolo).

     

    diagramma di venn

     

    Il cerchio in alto a sinistra della figura rappresenta l’insieme delle creature a due zampe; il cerchio in alto a destra è dato dalle creature che possono volare; il cerchio in basso è costituito dagli animali con pelliccia. L’unione, l’intersezione e la differenza degli insiemi si possono individuare facilmente osservando gli elementi nelle varie parti dei cerchi che si sovrappongono o meno. Il diagramma in figura comprende anche l’insieme universale, rappresentata dal rettangolo. L’insieme universale è dato da tutti gli elementi che esistono ma che non sono membri dei gruppi definiti. In questo caso, l’insieme universale sarebbe definito come tutte le creature viventi che si sono evolute senza pelliccia, due gambe, o la capacità di volare (come i pesci).

    Caratteristiche degli operatori SET

    Tutti gli operatori insiemistici eseguono query composte, combinando i risultati da due o più query.
    Se un’istruzione SELECT ha più di un operatore insiemistico (e quindi più di due query), le singole query saranno eseguite nell’ordine specificato: dall’alto in basso e da sinistra a destra. Al momento non c’è differenza tra gli operatori SET per quanto riguarda la precedenza, anche se lo standard ISO SQL voglia introdurre una priorità maggiore per INTERSECT. Per poter gestire la precedenza di un operatore in maniera diversa, è possibile usare le parentesi.

    Ciascuna query in una query composta selezionerà un proprio elenco doi colonne. Il numero di colonne selezionate da ciascuna query deve essere uguale. Una query composta con la prima query che seleziona tre elementi e la seconda che ne seleziona quattro genera un errore. Non serve che abbiano lo stesso nome o  lo stesso alias di colonna, né che debbano provenire dalle stesse tabelle (o sottoquery). Piuttosto, anche se il tipo di dati per ciascuna colonna non deve essere esattamente lo stesso, almeno devono appartenere allo stesso gruppo di dati. Per esempio, le colonne selezionate dalla prima query potrebbero essere DATE e NUMBER, e quelli dalla seconda query potrebbero essere TIMESTAMP e INTEGER. Il set di risultati della query composta avrà le colonne con il più alto livello di precisione: in questo caso, TIMESTAMP e NUMBER. Gli operatori insiemistici non faranno alcun tipo di casting implicito. Se la seconda query recupera colonne di tipo VARCHAR2, la query composta genera un errore anche se le variabili stringa possono essere convertite in DATE e NUMBER validi.

    UNION, MINUS, e INTERSECT combinano sempre i risultati degli insiemi delle query di input, quindi ordinano i risultati e rimuovono le righe duplicate. L’ordinamento si basa su tutte le colonne, da sinistra a destra. Se tutte le colonne in due righe hanno lo stesso valore, allora viene restituita solo la prima riga nel risultato dell’insieme composto. Con questi tre operatori, l’output  verrà quindi ordinato. Se il tipo di ordinamento (che è ascendente, basato sull’ordine in cui le colonne figurano nelle liste di selezione) non è l’ordine che si desidera, è possibile mettere una singola clausola ORDER BY alla fine della query composta. Non è possibile utilizzare ORDER BY in qualche altra query che compone l’intera query composta, in quanto ciò comprometterebbe l’ordinamento necessario per rimuovere i duplicati.
    UNION ALL è l’eccezione alla regola di ordinamento-no-duplicati: l’insieme di risultati delle due query di input verranno concatenati per formare il risultato dell’interrogazione composto. Ma anche in questo caso non è possibile usare ORDER BY nelle singole query; può apparire solo a fine della query composta.

     

    Giulio Cantali – IT Consultant

    Creatore di Database Master, il primo percorso per diventare esperti di database

Lascia un commento

Se vuoi condividere la tua opinione, lascia un commento

Puoi usare questi tag e attributi: HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">