рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Modifica dei dati

Modifica dei dati - раздел Программирование, Appunti sui DataBase Relazionali e sul linguaggio SQL Proviamo Ad Aggiornare Il Valore Di Un Prezzo In Un Record Dove Questo Non E'...

Proviamo ad aggiornare il valore di un prezzo in un record dove questo non e' stato inserito. ricordiamoci che in questo caso non si tratta di un inserimento ma di una modifica del valore NULL precedentemente impostato in quel campo, in quanto il record e' già presente nella tabella:

UPDATE Antichita SET Prezzo = 500000.00 WHERE Oggetto = 'Sedia';

Questo comando imposta il prezzo di tutte le sedie a 500.000£ . anche in questo caso possiamo fare riferimento alla sintassi della clausola WHERE del comando SELECT per essere più o meno specifici nella scelta dei record da modificare. inoltre, esattamente come nel comando SELECT, si possono modificare più colonne con la stessa sintassi usata in questo comando per indicare più colonne (elenco diviso da virgole dopo la clausola SET) .

Gli Indici

Gli indici permettono ad un DBMS di accedere ai dati più rapidamente (nota bene: questa funzionalità è non-standard/non disponibile su tutti i sistemi).Il sistema crea della strutture dati interne (gli indici) per la selezione più veloce di determinate righe quando la selezione è basata su colonne indicizzate. La struttura indica al DBMS dove si trova una certa riga su una tabella con colonne indicizzate, più o meno come il glossario di un libro indica la pagina in cui appare una determinata parola. Creiamo un indice per IDAntiquario nella tabella ANTIQUARI

CREATE INDEX OID_IDX ON ANTIQUARI (IDAntiquari);

Ora un indice sui nomi:

CREATE INDEX NAME_IDX ON ANTIQUARI (CognomeAntiquario, NomeAntiquario);

Per eliminare un indice si usa l’istruzione DROP:

DROP INDEX OID_IDX;

In più, si può usare l’istruzione DROP TABLE per eliminare una tabella (attenzione! Questo significa che la tua tabella viene cancellata). Nel secondo esempio, l’indice è relativo a due colonne, aggregate insieme; in questo caso, possono accadere strani comportamenti… consultare il manuale prima di eseguire questa operazione.

Alcuni DBMS non richiedono l’unicità della chiave primaria. In altre parole, se cercassi di inserire un’altra riga nella tabella ANTIQUARI con un IDAntiquario = 2, alcuni sistemi mi lascerebbero fare quest’operazione, anche se non è consigliabile, in quanto si suppone che il valore di questa colonna sia unico per ciascuna riga. Un modo per ovviare a possibili inconvenienti di questo genere è di creare un indice unico sulla colonna che noi vogliamo sia una chiave primaria, per forzare il sistema ad impedire la duplicazione di valori in quella colonna:

CREATE UNIQUE INDEX OID_IDX ON ANTIQUARI (IDAntiquario);

GROUP BY ed HAVING

Un uso speciale dell’istruzione GROUP BY è di associare una funzione di aggregazione (nella fattispecie COUNT; conta il numero di righe in ciascun gruppo) con dei gruppi di righe. Si assuma che la tabella ANTICHITA abbia la colonna PREZZO e che ciascuna riga abbia un valore inserito in questa colonna. Quello che ci interessa è di vedere il prezzo dell’oggetto più costoso comprato da ciascun acquirente. Si deve impartire via SQL l’ordine di raggruppare gli acquisti di ciascun acquirente, e di stampare il prezzo dell’acquisto più costoso:

SELECT IDAcquirente, MAX(Prezzo)
FROM ANTICHITA
GROUP BY IDAcquirente;

Ora, aggiungiamo l’istruzione di stampare il prezzo massimo di acquisto se supera i 100 dollari; in questo caso si usa l’istruzione HAVING:

SELECT IDAcquirente, MAX(Prezzo)
FROM ANTICHITA
GROUP BY IDAcquirente
HAVING Prezzo > 100;

Altre Subquery

Un altro uso comune delle Queries coinvolge l’uso di operatori per permettere ad una condizione di WHERE di includere l’output di una SELECT di una Query annidata. Dapprima, si mostri la lista degli acquirenti che hanno comprato un oggetto dispendioso (ovvero con il prezzo dell’articolo che superi di 100 dollari il prezzo medio di tutti gli oggetti comprati):

SELECT IDAcquirente
FROM ANTICHITA
WHERE Prezzo >

(SELECT AVG(Prezzo) + 100
FROM ANTICHITA);

La query annidata fra parentesi calcola il prezzo medio, somma 100, ed usando il risultato, si stampa un IDAcquirente per ciascun oggetto venduto di prezzo superiore. Si può usare DISTINCT IDAcquirente per visualizzare una sola riga per ciascun IDAcquirente selezionato.

Stampa i Cognomi della tabella ANTIQUARI, solo se hanno comprato un oggetto:

SELECT COGNOMEANTIQUARIO
FROM ANTIQUARI
WHERE IDAntiquario IN

(SELECT DISTINCT IDAcquirente
FROM ANTICHITA);

La query annidata (o sottoquery) seleziona una lista di acquirenti, e stampa il cognome di un Antiquario se e solo se il suo IDAntiquario appare nella lista selezionata dalla sottoquery (talvolta chiamata lista dei candidati). Nota: alcuni DBMS permettono di usare il segno uguale (‘=’) al posto di IN; per chiarezza, però, si preferisce l’uso di IN, in quanto la sottoquery non ritorna un valore singolo, bensì una lista.

Per un esempio relativo all' UPDATE, sappiamo che il gentiluomo che ha acquistato la libreria ha il Nome sbagliato nel database, e che il nome corretto è Giovanni:

UPDATE ANTIQUARI
SET NOMEANTIQUARIO = 'Giovanni'
WHERE IDAntiquario =

(SELECT IDAcquirente
FROM ANTICHITA
WHERE OGGETTO = 'Libreria');

In primis, la sottoquery cerca l’IDAcquirente per la persona o le persone che hanno acquistato la libreria, in secundis la query esterna aggiorna il Nome.

Regola delle sottoquery:quando si ha una sottoquery come parte di una condizione di WHERE, l’istruzione di SELECT deve avere un numero di colonne pari in numero e tipo a quelle contenute nella condizione di WHERE della query esterna. In altre parole, se si ha “WHERE NomeColonna = (SELECT….);” l’istruzione di Select deve avere solo una colonna, per trovare una corrispondenza con il NomeColonna della condizione di Where esterna; in più, il tipo deve essere il medesimo (due interi, due stringhe di caratteri, etc..).

EXISTS ed ALL

EXISTS usa una sottoquery come condizione: la condizione è Vera se la sottoquery ritorna almeno una riga, ed è Falsa se la sottoquery non ritorna nessuna riga. Questa è una funzionalità non intuitiva con quest’uso specifico. Comunque, se si vuole stampare un riassuntivo clienti solo se il negozio ha venduto Sedie, si può scrivere:

SELECT NomeAcquirente, CognomeAcquirente
FROM ANTIQUARI
WHERE EXISTS

(SELECT *
FROM ANTICHITA
WHERE Oggetto = 'Sedia');

Se nella colonna della tabella ANTICHITA c’è almeno una riga contenente l’articolo sedia, la sottoquery ritorna una o più righe, rendendo Vera la condizione EXISTS; di conseguenza la query stampa gli Antiquari. Se non ci sono righe con l’oggetto Sedia, la query esterna non stamperà alcuna riga.

ALL è un’altra funzionalità inusuale, in quanto la query che contengono l’istruzione ALL possono essere eseguite in altri modi, a volte anche più semplici; diamo un’occhiata alla query di esempio:

SELECT IDAcquirente, Oggetto
FROM ANTICHITA
WHERE Prezzo >= ALL

(SELECT Prezzo
FROM ANTICHITA);

Questa query ritorna l’oggetto con il prezzo più alto (o più di un oggetto se hanno un prezzo uguale e massimo), e l’Acquirente. La sottoquery ritorna una lista di tutti i prezzi nella tabella ANTICHITA, mentre la query esterna passa tutte le righe della tabella ANTICHITA, e se il prezzo è maggiore o uguale di qualunque altro oggetto (ALL = tutti), viene stampato, risultando così l’oggetto con il prezzo più alto. La ragione per cui viene usato il segno di “maggiore o uguale” è che il prezzo dell’oggetto più costoso sarà uguale al prezzo più alto della tabella.

UNION ed Outer Joins (rapida spiegazione non esaustiva)

Si possono presentare casi in cui si voglia vedere il risultato di diverse query insieme, combinando il loro output; in questi casi si usa l’espressione UNION. Per unire l’output delle due query seguenti, stampando tutti gli IDAcquirente, insieme con tutti quelli che hanno mandato un ordine, si esegua:

SELECT IDAcquirente
FROM ANTICHITA
UNION
SELECT IDAntiquario
FROM ORDINI;

Si noti che SQL richiede che la lista di colonne di entrambe le Select siano uguali per tipo, colonna per colonna. In questo caso IDAcquirente ed IDAntiquario sono dello stesso tipo (Interi [integer]). Si noti inoltre che SQL elimina automaticamente le righe duplicate usando UNION (come fossero due set di dati); per le query singole si deve usare DISTINCT.

L’outer join, (join esterno) si usa quando una join fra tabelle viene “unita” con le righe non incluse nella condizione di join; questo risulta particolarmente utile se nella query sono contenute delle costanti di tipo testo. Per esempio:

SELECT IDAntiquario, 'presente in Ordini ed Antichita'
FROM ORDINI, ANTICHITA
WHERE IDAntiquario = IDAcquirente
UNION
SELECT IDAcquirente, 'presente solo in Antichita'
FROM ANTICHITA
WHERE IDAcquirente NOT IN
(SELECT IDAntiquario
FROM ORDINI);

La prima query fa una join per stampare tutti gli Antiquari in entrambe le tabelle, e per aggiungere un breve commento dopo ciascun ID. La UNION combina questa lista con la successiva, che viene generata anzi tutto richiamando gli ID non presenti nella tabella ORDINI, infine stampando gli ID esclusi dalla condizione di join. Quindi, ciascuna riga nella tabella ANTICHITA viene esaminata, e se l’IDAcquirente non è nella lista di esclusione, viene stampato con il commento fra apici. Ci possono essere modi più semplici per generare la stessa lista di ID, ma attaccare a ciascuna riga un commento fisso appropriato è ben più complesso se fatto in altri modi.

Questo concetto è utile in situazioni in cui una chiave primaria viene messa in condizione di join con una chiave secondaria, ma la chiave secondaria può essere NULL per alcune chiavi primarie. Ad esempio, in una tabella la chiave primaria è il venditore e in un’altra è il cliente, con il venditore riportato nella stessa riga. Se un venditore non ha clienti, il suo nome non appare nella tabella dei clienti. L’outer join si usa allora per ottenere la lista di tutti i venditori, insieme con i loro clienti, sia nel caso in cui il venditore abbia clienti sia nel caso in cui non ne abbia, cioè non venga stampato il nome del cliente (un valore di NULL logico) se il venditore non ha clienti, ma è nella tabella dei venditori. In caso contrario, il venditore sarà stampato insieme con ognuno dei suoi clienti.

Un altro punto importante riguardo ai NULL nelle condizioni di join: l’ordine delle tabelle nella lista successiva all’istruzione FROM è molto importante. La regola è che SQL aggiunge la seconda tabella alla prima; se la prima tabella presenta solo righe contenenti NULL nella colonna di join, e la seconda tabella ha una riga con NULL nella colonna di join, tale riga non risulta nella condizione di join, e pertanto deve venire inclusa con i dati di riga della prima tabella. Questa è un altro esempio in cui comunemente viene impiegato un outer join. Il concetto di NULL è importante, e può essere proficuo investigarlo in maniera più approfondita.

BASTA QUERY!!! O non ne avete ancora avuto abbastanza? … adesso si passa a qualcosa del tutto differente…

– Конец работы –

Эта тема принадлежит разделу:

Appunti sui DataBase Relazionali e sul linguaggio SQL

Indice... Introduzione sui database Cos e un database Piccola storia dei database assolutamente incompleta...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Modifica dei dati

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Невидимые планеты
Не менее интересны приводимые в письмах Е.И. Рерих и в «Письмах Махатм» сведения о том, что в Солнечной системе на самом деле гораздо больше планет, чем это известно нашим астрономам. Так, в «Космо

Piccola storia dei database assolutamente incompleta
Probabilmente il più glorioso (ed a tutt' oggi utilizzato) antenato dei database relazionali odierni può essere identificato con la sana e vecchia agenda telefonica. in effetti penso

I Database Relazionali
allora cosa sono questi famigerati Database relazionali? il concetto che sta alla base è , come spesso succede nell' informatica, molto meno "strampalato" di quello che si pensa: i

SQL questo sconosciuto
Abbiamo appena finito di dire che uno dei requisiti fondamentali per poter utilizzare un database relazionale e' avere un "linguaggio" che ci permetta di interrogarlo in maniera opportuna

Commit e Rollback, ovvero come limitare i danni
In tutti i database relazionali minimamente decenti esistono due comandi fondamentali che rispondono per l' appunto al nome di commit e rollback. questi due comandi provvedono a fare in modo che un

I Semafori , ovvero la gestione della multiutenza
Chiariamo subito una cosa: già linguaggi come Clipper avevano strumenti per gestire la multiutenza sui database, ma in quel caso ancora era completamente demandato al programmatore il fatto

Basi del comando SELECT
Come abbiamo detto prima nell' introduzione, nei database relazionali le informazioni sono contenute in tabelle. Un esempio di tabella puo' essere rappresentato dalla tabella dei dati degli impiega

Selezione Condizionata
Per continuare la discussione sulla selezione, facciamo riferimento a questa nuova tabella di esempio TabellaStatisticheImpiegati CodiceImpiegato

Operatori Relazionali
Ci sono sei operatori relazionali in SQL, e dopo averli specificati vedremo come si usano. gli operatori sono: = Uguale <> oppure

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

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 sco

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 sco

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 sco

Funzioni di Aggregazione
In questa sezione introdurrò le cinque più importanti Funzioni di Aggregazione: SUM, AVG, MAX, MIN, e COUNT. Queste funzioni vengono chiamate Di Aggregazione perché serv

Creare Nuove Tabelle
Tutte le tabelle all' interno di un database devono venire create prima o poi. vediamo come possiamo fare. a titolo di esempio prendiamo in esame la creazione della tabella Ordini: CRE

Modificare la struttura delle tabelle
Sempre con la logica di vedere i comandi all' interno di esempi pratici, vediamo come si puo' aggiungere una nuova colonna "Prezzo" alla tabella antichita per permettere l' inserimento de

Inserire dati in una tabella
Per inserire record (righe) in una tabella si usa il seguente comando (esempio riferito alla tabella Antichita a cui e' appena stato aggiunto il prezzo) : INSERT INTO Antichita VALUES

Cancellare dati da una tabella
Adesso proviamo a cancellare la riga di dati che abbiamo appena inserito dalla tabella: DELETE FROM Antichita WHERE Oggetto = 'Ottomana'; Ma, in questo caso

Sommario della Sintassi - Solo per veri masochisti
Qui potete trovare le forme generalizzate dei comandi discussi in questi appunti, più alcuni aggiuntivi che possono risultare comodi e la cui spiegazione e' data a latere. ATTENZI

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги