Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ambientazione Sci-
Valerio Martella
July 11, 2011
Contents
1
2
3
4
Introduzione.
2.1
2.2
2.3
Buisness Rules
Progettazione Fisica
4.1
4.2
4.3
4.4
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
Implementazione
5.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
Script di creazione
. . . . . . . . . . . . . . . . . . . . . . . . . .
Sicurezza
13
Triggers
14
7.1
Buisness rule 2
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
7.2
Buisness rule 1
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
7.3
Buisness rule 3
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.4
. . . . . . . . . . . . . .
Query
16
8.1
8.2
8.3
8.4
15
15
. . . . . . .
. . . . . . . . . . . .
16
17
17
Calcolo della classica di navi da battaglia dotate di velivoli ordinata per il numero di velivoli avversari abbattuti
. . . . . . . . .
17
8.5
. . . . . . .
17
8.6
17
8.7
8.8
pianeta P
8.9
18
18
18
8.10 Calcololo del numero di marinai di ogni razza per ogni nave . . .
18
19
. . . . . . . . .
19
19
8.14 Calcolo dei Marinai che Sono di una specie originaria di un pianeta nel sistema "S" o che hanno avuto un incarico in una otta
stanziata su un pianeta nel sistema "S"
. . . . . . . . . . . . . .
19
20
8.16 Calcolo delle navi con parti prodotte in pianeti con alte temperature 20
20
9.1
20
9.2
20
10 Ottimizzazione Query
21
1.69sec)
(0.06sec 0.00sec)
(0.76sec 0.48sec)
(2.45sec 0.05sec)
(1.21sec 0.13sec)
(1.21sec 0.13sec)
. . . . . . . . . . . .
21
. . . . . . . . . . . .
24
. . . . . . . . . . . .
25
. . . . . . . . . . . .
27
. . . . . . . . . . . .
32
. . . . . . . . . . . .
33
11 Stored Procedure
36
12 Views
37
13 Transazioni
38
Introduzione.
enormi StarDestroyers Imperiali di Star Wars alle piccole scorte classe Deant di Star Trek DS9. Gli sceneggiatori di questo genere di narrativa pongono
organizazione politica
un'altezza espressi in decine di metri, una massa espressa in tonnellate, un motore a impulso, pu avere un motore di curvatura, degli scudi che hanno una
certa resistenza e pu essere o meno da guerra.
Un motore ha un modello,
Ogni armamento ha un
Sia armamenti
che velivoli sono costruiti in fabbriche , ognuna delle quali ha una locazione geograca su un pianeta ed appartiene ad una Casa di Produzione ed sono di un
modello,un modello di velivolo ha una potenza massima, un modello di armamento ha una gittata massima e una cadenza di tiro, inoltre pu essere basato
su un innumerevole numero di tecnologie e principi, quindi opportuno inserire
una breve descrizione. Su ogni nave c' un equipaggio formato da marinai. Ogni
marinaio appartiene a una specie, ha un nome e un cognome (o equivalenti a seconda delle tradizioni della razza ed etnia cui appartiene, indicati quindi come
nome personale e nome di famiglia), una data di nascita, eventualmente una
data di morte e uno storico degli incarichi, in cui ogni incarico ha una data di
inizio incarico, eventualmente una data di ne incarico,un grado e una mansione. Un grado ha un nome e un certo valore nella scala gerarchica delle fazioni
cui appartiene. Una mansione ha un nome e un ponte su cui viene svolta. Una
specie ha un nome, un pianeta d'origine, un tipo di atmosfera respirabile pi
innumerevoli altre caratteristiche univoche e dicilmente prevedibili in fase di
progettazione. Ogni otta appartiene ad un Impero,uno stato o una generica
organizzazione o fazione, ha un porto di stanza ed un ammiraglio. Una fazione
ha un nome e ha il suo quartier generale su un pianeta. Un pianeta ha un nome
ed orbita in un sistema, ha una serie di coordinate spaziali, una temperatura
media, e la sua orbita ha un apogeo ed un perigeo.
Progettazione Fisica
nel primo caso si scelto di incorpare il padre nelle glie essendo profonda la
distinzione tra le due entit,nel secondo caso si scelto di incorpare le glie nel
padre,essendo la distinzione tra le due entit ebile, aggiungendo l' attributo
booleano IsWarship a Nave in modo da poter tener traccia della dierenza.
Produzione Arm.
Produzione Vel.
Pilota
Nascita
Xenologia
Origine
Speciche
Tipologia Arm.
Tipologia Vel.
Fa_Fl
Fl_Na
Cl_Mc
Cl_Mi
Locazione
Inc_Mar
In_Gr
Compito
Stanza
QG
in tutti i casi la chiave della tabella che partecipa con cardinalit n posta come
chiave esterna (o foregin key) della tabella con cardinalit n.
Implementazione
PRIMARY KEY( i d M o d V e l i v o l o )
ENGINE=InnoDB ;
ENGINE=InnoDB ;
CREATE TABLE M a n s i o n e
PRIMARY KEY( i d I n c a r i c o )
P o n t e VARCHAR( 2 0 ) NULL,
ENGINE=InnoDB ;
CREATE TABLE P i a n e t a
PRIMARY KEY( I d P i a n e t a )
ENGINE=InnoDB ;
CREATE TABLE M o t o r e I m p l z
VARCHAR( 2 0 ) NULL,
PRIMARY KEY( i d M o t o r e I m p l z )
ENGINE=InnoDB ;
PRIMARY KEY( i d M o t o r e C u r v )
ENGINE=InnoDB ;
PRIMARY KEY( I d G r a d o )
ENGINE=InnoDB ;
CREATE TABLE F a z i o n e
PRIMARY KEY( I d F a z i o n e ) ,
FOREIGN KEY( I d P i a n e t a )
ON DELETE NO ACTION
REFERENCES P i a n e t a ( I d P i a n e t a )
ON UPDATE CASCADE )
ENGINE=InnoDB ;
CREATE TABLE F a c i l i t y
PRIMARY KEY( i d F a c i l i t y ) ,
INDEX F a c i l i t y _ F K I n d e x 1 ( I d P i a n e t a ) ,
FOREIGN KEY( I d P i a n e t a )
REFERENCES P i a n e t a ( I d P i a n e t a )
ON DELETE RESTRICT
ON UPDATE CASCADE )
ENGINE=InnoDB ;
CREATE TABLE S p e c i e
PRIMARY KEY( i d S p e c i e ) ,
INDEX S p e c i e _ F K I n d e x 1 ( I d P i a n e t a ) ,
FOREIGN KEY( I d P i a n e t a )
REFERENCES P i a n e t a ( I d P i a n e t a )
ON DELETE NO ACTION
ON UPDATE CASCADE )
ENGINE=InnoDB ;
CREATE TABLE G e r a r c h i a
IdFazione ) ,
INDEX Fazione_has_Grado_FKIndex1 ( I d F a z i o n e ) ,
INDEX Fazione_has_Grado_FKIndex2 ( Grado_IdGrado ) ,
FOREIGN KEY( I d F a z i o n e )
ON DELETE CASCADE
REFERENCES F a z i o n e ( I d F a z i o n e )
ON UPDATE CASCADE,
REFERENCES Grado ( I d G r a d o )
ON UPDATE CASCADE )
ENGINE=InnoDB ;
CREATE TABLE C l a s s
10
PRIMARY KEY( C l a s s ) ,
INDEX Class_FKIndex2 ( MotoreCurv_idMotoreCurv ) ,
INDEX Class_FKIndex3 ( M o t o r e I m p l z _ i d M o t o r e I m p l z ) ,
FOREIGN KEY( MotoreCurv_idMotoreCurv )
ON DELETE RESTRICT
REFERENCES MotoreCurv ( i d M o t o r e C u r v )
ON UPDATE RESTRICT,
FOREIGN KEY( M o t o r e I m p l z _ i d M o t o r e I m p l z )
ON DELETE RESTRICT
REFERENCES M o t o r e I m p l z ( i d M o t o r e I m p l z )
ON UPDATE RESTRICT )
ENGINE=InnoDB ;
CREATE TABLE F l o t t a
PRIMARY KEY( I d F l e e t ) ,
INDEX F l o t t a _ F K I n d e x 1 ( I d P i a n e t a ) ,
INDEX F l o t t a _ F K I n d e x 2 ( I d F a z i o n e ) ,
FOREIGN KEY( I d P i a n e t a )
REFERENCES P i a n e t a ( I d P i a n e t a )
ON DELETE RESTRICT
ON UPDATE CASCADE,
FOREIGN KEY( I d F a z i o n e )
REFERENCES F a z i o n e ( I d F a z i o n e )
ON DELETE CASCADE
ON UPDATE CASCADE )
ENGINE=InnoDB ;
CREATE TABLE M a r i n a i o
PRIMARY KEY( M a t r i c o l a ) ,
INDEX Marinaio_FKIndex1 ( I d P i a n e t a ) ,
INDEX Marinaio_FKIndex2 ( i d S p e c i e ) ,
FOREIGN KEY( I d P i a n e t a )
ON DELETE NO ACTION
FOREIGN KEY( i d S p e c i e )
ON DELETE RESTRICT
REFERENCES P i a n e t a ( I d P i a n e t a )
ON UPDATE NO ACTION,
REFERENCES S p e c i e ( i d S p e c i e )
ON UPDATE CASCADE )
ENGINE=InnoDB ;
11
CREATE TABLE V e l i v o l o
PRIMARY KEY( i d V e l i v o l o ) ,
INDEX V e l i v o l o _ F K I n d e x 1 ( P i l o t a _ M a t r i c o l a ) ,
INDEX V e l i v o l o _ F K I n d e x 3 ( M o d V e l i v o l o _ i d M o d V e l i v o l o ) ,
INDEX V e l i v o l o _ F K I n d e x 4 ( F a c i l i t y _ i d F a c i l i t y ) ,
FOREIGN KEY( P i l o t a _ M a t r i c o l a )
ON DELETE RESTRICT
REFERENCES M a r i n a i o ( M a t r i c o l a )
ON UPDATE CASCADE,
FOREIGN KEY( M o d V e l i v o l o _ i d M o d V e l i v o l o )
ON DELETE RESTRICT
REFERENCES M o d V e l i v o l o ( i d M o d V e l i v o l o )
ON UPDATE CASCADE,
FOREIGN KEY( F a c i l i t y _ i d F a c i l i t y )
ON DELETE RESTRICT
REFERENCES
Facility ( idFacility )
ON UPDATE CASCADE )
ENGINE=InnoDB ;
PRIMARY KEY( C o d i c e ) ,
INDEX Nave_FKIndex1 ( F l o t t a _ I d F l e e t ) ,
INDEX Nave_FKIndex2 ( C l a s s ) ,
INDEX Nave_FKIndex3 ( F a c i l i t y _ i d F a c i l i t y ) ,
FOREIGN KEY( F l o t t a _ I d F l e e t )
ON DELETE RESTRICT
REFERENCES F l o t t a ( I d F l e e t )
ON UPDATE CASCADE,
FOREIGN KEY( C l a s s )
ON DELETE RESTRICT
REFERENCES C l a s s ( C l a s s )
ON UPDATE RESTRICT,
FOREIGN KEY( F a c i l i t y _ i d F a c i l i t y )
ON DELETE RESTRICT
REFERENCES
Facility ( idFacility )
ON UPDATE CASCADE )
ENGINE=InnoDB ;
CREATE TABLE I n c a r i c o
12
PRIMARY KEY( I d I n c a r i c o ) ,
INDEX I n c a r i c o _ F K I n d e x 1 ( M a r i n a i o _ M a t r i c o l a ) ,
INDEX I n c a r i c o _ F K I n d e x 2 ( M a n s i o n e _ i d I n c a r i c o ) ,
INDEX I n c a r i c o _ F K I n d e x 3 ( Grado_IdGrado ) ,
FOREIGN KEY( M a r i n a i o _ M a t r i c o l a )
ON DELETE CASCADE
REFERENCES M a r i n a i o ( M a t r i c o l a )
ON UPDATE CASCADE,
FOREIGN KEY( M a n s i o n e _ i d I n c a r i c o )
ON DELETE RESTRICT
REFERENCES M a n s i o n e ( i d I n c a r i c o )
ON UPDATE CASCADE,
REFERENCES Grado ( I d G r a d o )
ON UPDATE CASCADE,
REFERENCES Nave ( C o d i c e )
ON UPDATE CASCADE )
ENGINE=InnoDB ;
REFERENCES Nave ( C o d i c e )
ON UPDATE CASCADE,
FOREIGN KEY( F a c i l i t y _ i d F a c i l i t y )
ON DELETE RESTRICT
ON UPDATE CASCADE,
REFERENCES
Facility ( idFacility )
ON UPDATE CASCADE )
ENGINE=InnoDB ;
Sicurezza
Su questo database sono previsti due tipi di utenti con diversi permessi a seconda
delel tabelle su cui hanno i permessi di lettura, inserimento e modica:
13
GRANT <elenco privilegi> ON <nome tabella> TO <nome utente> IDENTIFIED BY < password utente>
Elenco privilegi: I privilegi sono quelli sopra elencati (lettura, modica, inserimento, cancellazione) che al DB vengono indicati come Select,
Update, Insert, Delete.
Nome tabella: Il nome della tabella a cui ci si riferisce, una sola. Non
si pu fare elenco di tutte le tabelle a cui dare determinati permessi
Triggers
Create t r i g g e r
before
for
Incarico_Data_consistency
i n s e r t on I n c a r i c o
each
row
begin
if
then
SET NEW. D a t a F i n e I n c a r i c o = new . D a t a I n i z i o I n c a r i c o ;
end
if ;
end ;
}
delimiter
Create t r i g g e r
before
for
Marinaio_Date_consistency
i n s e r t on M a r i n a i o
each
row
begin
if
then
SET NEW. DataDiMorte = NULL;
end
if ;
end ;
}
delimiter
14
Create t r i g g e r
before
for
Class_noPonti_Consistency
i n s e r t on C l a s s
each
row
begin
if
then
SET new . I s W a r S h i p = True ;
end
if ;
end ;
}
delimiter
15
delimiter
Create t r i g g e r
for
each
Incarico_Grado_conistency
after
i n s e r t on I n c a r i c o
row
begin
select
f l o t t a . idFazione
flotta
j o i n Nave on ( f l o t t a . i d F l e e t = n a v e . f l o t t a _ i d F l e e t )
join
into
@faction
from
on ( I n c a r i c o . N a v e _ c o d i c e = Nave . C o d i c e )
Incarico
where new . i d I n c a r i c o = i d I n c a r i c o ;
s e l e c t count ( )
i n t o @count from G e r a r c h i a
then
@count = 0
insert
end
into
Gerarchia
values
( new . g r a d o _ i d G r a d o ,
@faction ) ;
if ;
end ;
}
delimiter
Query
d i s t i n c t Nome , S i s t e m a from
left
join
Facility
where F a c i l i t y . i d F a c i l i t y
set
(0.01
on ( Nome = F a c i l i t y . i d P i a n e t a )
i s NULL
sec )
16
order by ( Nome ) ;
M a r i n a i o . Nome , M a r i n a i o . Cognome , M a r i n a i o . M a t r i c o l a
Marinaio
join
Incarico
from
on ( M a r i n a i o . M a t r i c o l a = I n c a r i c o . M a r i n a i o _ M a t r i c o l a )
(0.01
sec )
C l a s s . C l a s s , NomeVaro , C u r v a t u r a
( ( Nave
join
Class
from
on Nave . C l a s s = C l a s s . C l a s s )
j o i n MotoreCurv on i d M o t o r e C u r v = MotoreCurv_idMotoreCurv )
where C u r v a t u r a > 5
set
(0.01
order by ( C u r v a t u r a ) desc ;
sec )
(( Velivolo
Incarico
as Tacche , count ( V e l i v o l o . i d V e l i v o l o )
as
Velivoli
from
on P i l o t a _ M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
j o i n Nave on Nave_Codice = C o d i c e )
where D a t a F i n e I n c a r i c o
i s NULL
(0.82
desc ;
sec )
A l l i a n c e N a m e , count ( d i s t i n c t
from F l o t t a
join
Fazione
idFleet )
as NumFlotte
, count ( d i s t i n c t
j o i n Nave on ( F l o t t a _ i d F l e e t = F l o t t a . i d F l e e t )
on ( F l o t t a . i d F a z i o n e = F a z i o n e . i d F a z i o n e )
group by A l l i a n c e N a m e ;
set
(0.02
sec )
join
Incarico
on ( C o d i c e = Nave_Codice )
j o i n Grado on ( i d G r a d o = Grado_idGrado )
17
NomeVar
where C o d i c e = 1 2 i n t o @max ;
s e l e c t NomeVaro , M a r i n a i o _ M a t r i c o l a , HScalaComando from
j o i n Grado on (
Incarico
i d G r a d o = Grado_idGrado )
j o i n Nave on ( C o d i c e = Nave_Codice )
where C o d i c e = 1 and HScalaComando = @max ;
set
(0.00
sec )
distinct
Nave
join
join
Flotta
from
idFleet
on ( Nave . C l a s s = C l a s s . C l a s s )
Class
on ( I d F l e e t = F l o t t a _ I d F l e e t )
(0.00
is
null ;
sec )
join
distinct
Class . Class
Facility
join
on ( i d F a c i l i t y = F a c i l i t y _ i d F a c i l i t y )
where F a c i l i t y . i d P i a n e t a
set
from C l a s s
( C l a s s . C l a s s = Nave . C l a s s )
(0.03
= 15;
sec )
j o i n Nave on ( C o d i c e = Nave_Codice )
(0.06
sec )
Marinaio
join
Specie
Incarico
on (
on (
on (
C o d i c e = Nave_Codice )
Matricola = Marinaio_Matricola
Marinaio . i d S p e c i e = Specie . i d S p e c i e )
where D a t a F i n e I n c a r i c o
is
null
18
set
(2.71
sec )
join
Marinaio
join
Mansione
Incarico
on (
on (
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
j o i n Grado on ( i d G r a d o = Grado_idGrado )
j o i n Nave on ( Nave_Codice = Nave . C o d i c e )
where M a n s i o n e . i d I n c a r i c o = 1 4 and Nave . C l a s s = 1 0 and Grado_idGrado
in
join
Incarico
on (
Marinaio_Matricola = Matricola
join
Mansione
on (
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
)
)
j o i n Grado on ( i d G r a d o = Grado_idGrado )
j o i n Nave on ( Nave_Codice = Nave . C o d i c e )
where M a n s i o n e . i d I n c a r i c o = 1 4 and Nave . C l a s s = 1 0
set
(0.06
);
sec )
idVelivolo
Velivolo
join
from
Incarico
on ( P i l o t a _ M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
j o i n Grado on ( Grado_idGrado = i d G r a d o
(0.68
sec )
Marinaio_Matricola )
where I n c a r i c o . D a t a F i n e I n c a r i c o
i s NULL
(0.76
as N_Marinai from
desc ;
sec )
distinct
Incarico
join
Marinaio . Matricola ,
Marinaio
M a r i n a i o . Nome ,
M a r i n a i o . Cognome from
on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
19
join
specie
join
Pianeta
on ( M a r i n a i o . i d S p e c i e = S p e c i e . i d S p e c i e )
on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
Flotta
join
Pianeta
on ( f l o t t a _ i d F l e e t = F l o t t a . i d F l e e t )
a on
f l o t t a . idpianeta = a . idpianeta )
(2.27
sec )
Incarico . idIncarico
from I n c a r i c o
join
Marinaio
on ( M a r i n a i o . M a t r i c o l a =
I n c a r i c o . Marinaio_matricola
(1.21
sec )
d i s t i n c t Nave . NomeVaro
from Nave j o i n
join
Pianeta
Facility
on ( Nave . F a c i l i t y _ i d F a c i l i t y = i d F a c i l i t y )
on ( F a c i l i t y . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
j o i n Armamento on ( Armamento . N a v e _ c o d i c e = n a v e . C o d i c e )
join
Facility
join
Pianeta
as
as
Facility2
pianeta2
on ( Armamento . F a c i l i t y _ i d F a c i l i t y = f a c i l i t y 2 . i d F a c i l
on ( F a c i l i t y 2 . i d P i a n e t a = P i a n e t a 2 . i d P i a n e t a )
where p i a n e t a . A v r g t e m p e r a t u r a > 5 0 or
set
(0.11
50;
sec )
20
10
Ottimizzazione Query
Marinaio
join
Specie
on (
Incarico
on (
on (
C o d i c e = Nave_Codice )
Matricola = Marinaio_Matricola
Marinaio . i d S p e c i e = Specie . i d S p e c i e )
where D a t a F i n e I n c a r i c o
is
null
select_type :
table :
SIMPLE
Specie
t y p e : ALL p o s s i b l e _ k e y s : PRIMARY
key : NULL
k e y _ l e n : NULL
r e f : NULL
rows :
Using temporary ;
Extra :
5063
Using
id :
filesort
row
select_type :
table :
type :
key :
SIMPLE
Marinaio
p o s s i b l e _ k e y s : PRIMARY, Marinaio_FKIndex2
ref
Marinaio_FKIndex2
key_len :
ref :
rows :
19
Using index
Extra :
id :
2.
3.
row
select_type :
table :
type :
key :
ref
rows :
possible_keys :
I n c a r i c o _ F K I n d e x 1 , Nave_Codice
Incarico_FKIndex1
key_len :
ref :
SIMPLE
Incarico
21
Using where
Extra :
id :
select_type :
table :
type :
4.
row
SIMPLE
Nave
p o s s i b l e _ k e y s : PRIMARY
eq_ref
key : PRIMARY
key_len :
ref :
s h i p . I n c a r i c o . Nave_Codice
rows :
Extra :
rows i n
set
(0.00
sec )
Specie
(104 )
Se si va a
(105 ),
N ave Incarico
M arinaio Specie.
Si vede subito infatti che eseguendo
mysql> s e l e c t
straight_join
Codice
NomeVaro
NameRace
count ( NameRace )
+++++
|
4001
4001
| AESXCW
4001
4001
| BYXPWZMCAD
4001
| CQUTXYD
4001
4001
| DWGDOB
4001
| EHNKVPKHVBS
4001
| ELYYEFXQCFXSLKNNW |
4001
DJBYI
+++++
10
rows i n
set
(1.66
sec )
22
select
mysql> e x p l a i n
straight_join
select_type :
table :
SIMPLE
Nave
t y p e : ALL p o s s i b l e _ k e y s : PRIMARY
key : NULL
k e y _ l e n : NULL
r e f : NULL
rows :
3754
Using temporary ;
Extra :
Using
id :
select_type :
type :
filesort
2.
row
table :
SIMPLE
Incarico
ref
possible_keys :
I n c a r i c o _ F K I n d e x 1 , Nave_Codice
key :
Nave_Codice
key_len :
ref :
s h i p . Nave . C o d i c e
rows :
31
Using where
Extra :
id :
select_type :
type :
eq_ref
3.
row
table :
SIMPLE
Marinaio
p o s s i b l e _ k e y s : PRIMARY, Marinaio_FKIndex2
key : PRIMARY
key_len :
ref :
ship . I n c a r i c o . Marinaio_Matricola
rows :
Extra :
id :
select_type :
table :
type :
4.
key_len :
p o s s i b l e _ k e y s : PRIMARY
ship . Marinaio . i d S p e c i e
rows :
Extra :
Specie
eq_ref
key : PRIMARY
ref :
row
SIMPLE
1
4 rows
in
set
(0.00
sec )
23
join
Marinaio
join
Mansione
Incarico
on (
on (
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
j o i n Grado on ( i d G r a d o = Grado_idGrado )
j o i n Nave on ( Nave_Codice = Nave . C o d i c e )
where M a n s i o n e . i d I n c a r i c o = 1 4 and Nave . C l a s s = 1 0 and Grado_idGrado
in
( s e l e c t max ( Grado_idGrado )
from M a r i n a i o
join
Incarico
on (
Marinaio_Matricola = Matricola
join
Mansione
on (
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
)
)
j o i n Grado on ( i d G r a d o = Grado_idGrado )
j o i n Nave on ( Nave_Codice = Nave . C o d i c e )
where M a n s i o n e . i d I n c a r i c o = 1 4 and Nave . C l a s s = 1 0
);
Marinaio
join
Mansione
Incarico
on (
on (
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
j o i n Grado on ( i d G r a d o = Grado_idGrado )
j o i n Nave on ( Nave_Codice = Nave . C o d i c e )
where M a n s i o n e . i d I n c a r i c o = 1 4 and Nave . C l a s s = 1 0 i n t o @max ;
select
join
Marinaio
join
Mansione
Incarico
on (
on (
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
j o i n Grado on ( i d G r a d o = Grado_idGrado )
j o i n Nave on ( Nave_Codice = Nave . C o d i c e )
where M a n s i o n e . i d I n c a r i c o = 1 4 and Nave . C l a s s = 1 0 and Grado_idGrado = @max ;
Usando la variabile @Max per memorizzare il risultato della subquery si
riesce a spezzare la query in due query con meno complessit temporale
mysql> s e l e c t max ( Grado_idGrado )
>
>
>
>
Marinaio
join
join
Mansione
Incarico
on (
from
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
j o i n Grado on ( i d G r a d o = Grado_idGrado )
Query OK,
row
affected
mysql> mysql> s e l e c t
>
>
>
on (
Marinaio
join
join
Mansione
sec )
Incarico
on (
(0.00
on (
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
j o i n Grado on ( i d G r a d o = Grado_idGrado )
24
Nome
Cognome
+++
| YMVCFGDOLANSQKCXDZJ | BAHQKMOAEBGGFVFVGF |
+++
1
in
row
set
(0.00
sec )
Marinaio_Matricola )
as N_Marinai from
Incarico
where I n c a r i c o . D a t a F i n e I n c a r i c o
i s NULL
Marinaio_Matricola )
la Query non presenta delle subquery annidate, quindi si procede ad analizzare l'execution plan con il comando explain
id :
1.
row
select_type :
table :
index
type :
SIMPLE
Nave
p o s s i b l e _ k e y s : PRIMARY, C o d i c e , P i p p o I n d e x
key : PRIMARY
key_len :
r e f : NULL
rows :
4064
Extra :
Using temporary ;
Using
id :
filesort
2.
row
select_type :
table :
type :
key :
ref
possible_keys :
Nave_Codice
Nave_Codice
key_len :
ref :
SIMPLE
Incarico
s h i p . Nave . C o d i c e
rows :
Extra :
20
set
(0.00
sec )
Quindi si Nota
select
straight_join
count ( d i s t i n c t
NomeVaro , C o d i c e ,
Marinaio_Matricola )
25
as N_Marinai from
desc ;
Incarico
where I n c a r i c o . D a t a F i n e I n c a r i c o
order by count ( d i s t i n c t
desc l i m i t
Marinaio_Matricola )
10;
mysql> s e l e c t / ! s t r a i g h t _ j o i n /
>NomeVaro , C o d i c e , count ( d i s t i n c t M a r i n a i o _ M a t r i c o l a ) as N_Marinai
> I n c a r i c o j o i n Nave on ( I n c a r i c o . Nave_Codice = Nave . C o d i c e )
> where I n c a r i c o . D a t a F i n e I n c a r i c o i s NULL group by Nave . C o d i c e
>order by count ( d i s t i n c t M a r i n a i o _ M a t r i c o l a ) desc l i m i t 1 0 ;
++++
|
NomeVaro
Codice
N_Marinai
from
++++
| FPXGAJXWCNWFVQYY
4850
45
4394
43
| PIDHPDMSHHDT
6480
43
| XSQXJVMC
7570
43
| AXILAOODRPQMXPIBOBWE |
4244
42
FB
6906
42
KNAVSSRZOTPGI
5516
42
6279
42
CJSGKBEDOJ
| BOLXXVWBBYCH
| MWGIHSQFEO
4824
42
5112
42
XHGITZPKCZZYHFHO
++++
10
rows i n
set
mysql> e x p l a i n
(0.48
sec )
select
straight_join
NomeVaro , C o d i c e , count ( d i s t i n c t
Incarico
by count ( d i s t i n c t
1.
0.48
Marinaio_Matricola )
id :
as N_Marinai from
where I n c a r i c o . D a t a F i n e I n c a r i c o
order
Marinaio_Matricola )
row
desc l i m i t
10
\G
select_type :
table :
SIMPLE
Incarico
t y p e : ALL p o s s i b l e _ k e y s :
Nave_Codice
key : NULL
k e y _ l e n : NULL
r e f : NULL
rows :
Extra :
175429
Using where ;
Using temporary ;
id :
2.
row
Using
select_type :
table :
type :
SIMPLE
Nave
eq_ref
p o s s i b l e _ k e y s : PRIMARY, C o d i c e
key : PRIMARY
26
filesort
key_len :
ref :
s h i p . I n c a r i c o . Nave_Codice
rows :
Extra :
2 rows
in
set
(0.00
sec )
distinct
join
Incarico
join
specie
join
Pianeta
Marinaio . Matricola ,
Marinaio
M a r i n a i o . Nome ,
M a r i n a i o . Cognome from
on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
on ( M a r i n a i o . i d S p e c i e = S p e c i e . i d S p e c i e )
on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
Flotta
join
Pianeta
on ( f l o t t a _ i d F l e e t = F l o t t a . i d F l e e t )
a on
f l o t t a . idpianeta = a . idpianeta )
select
distinct
Marinaio . Matricola ,
M a r i n a i o . Nome ,
> I n c a r i c o j o i n M a r i n a i o on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
> j o i n s p e c i e on ( M a r i n a i o . i d S p e c i e = S p e c i e . i d S p e c i e )
> j o i n P i a n e t a on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
> j o i n Nave on ( Nave_Codice = Nave . C o d i c e )
> j o i n F l o t t a on ( f l o t t a _ i d F l e e t = F l o t t a . i d F l e e t )
> j o i n P i a n e t a a on ( f l o t t a . i d p i a n e t a = a . i d p i a n e t a )
> where p i a n e t a . s i s t e m a = "LUWYQNLWCEGOKQWK"
> or a . s i s t e m a = "LUWYQNLWCEGOKQWK" \G
1 . row
id :
select_type :
table :
SIMPLE
Pianeta
t y p e : ALL p o s s i b l e _ k e y s : PRIMARY
key : NULL
k e y _ l e n : NULL
r e f : NULL
rows :
954
Using temporary
Extra :
id :
2.
row
select_type :
table :
type :
key :
rows :
p o s s i b l e _ k e y s : PRIMARY, S p e c i e _ F K I n d e x 1
ref
Specie_FKIndex1
key_len :
ref :
SIMPLE
specie
27
M a r i n a i o . Cognom
Using index
Extra :
id :
3.
row
select_type :
table :
type :
key :
SIMPLE
Marinaio
p o s s i b l e _ k e y s : PRIMARY, Marinaio_FKIndex2
ref
Marinaio_FKIndex2
key_len :
ref :
rows :
20
Extra :
id :
select_type :
table :
type :
key :
row
SIMPLE
Incarico
ref
possible_keys :
I n c a r i c o _ F K I n d e x 1 , Nave_Codice
Incarico_FKIndex1
key_len :
ref :
rows :
Distinct
Extra :
id :
4.
5.
row
select_type :
table :
type :
SIMPLE
Nave
eq_ref
possible_keys :
PRIMARY, Nave_FKIndex1 , C o d i c e , P i p p o I n d e x
key : PRIMARY
key_len :
ref :
s h i p . I n c a r i c o . Nave_Codice
rows :
Distinct
Extra :
id :
6.
row
select_type :
table :
type :
SIMPLE
Flotta
eq_ref
p o s s i b l e _ k e y s : PRIMARY, F l o t t a _ F K I n d e x 1
key : PRIMARY
key_len :
ref :
s h i p . Nave . F l o t t a _ I d F l e e t
rows :
Extra :
Distinct
id :
7.
select_type :
table :
SIMPLE
28
row
type :
p o s s i b l e _ k e y s : PRIMARY
eq_ref
key : PRIMARY
key_len :
ref :
rows :
Extra :
Using where ;
Distinct
7 rows
in
set
(0.00
sec )
solo indice per query, e se non possibile futilizzare un indice per tutte le
condizioni del where allora eettua per una full-table scan, quindi nel caso di
OR nella clausola where spesso conveniente riscrivere la query usando invece
una UNION di due query diverse
select
distinct b . Matricola ,
Incarico
join
join
specie
join
Pianeta
Marinaio
b on
b . Cognome from
b . Nome ,
(b . Matricola = Marinaio_Matricola )
on ( b . i d S p e c i e = S p e c i e . i d S p e c i e )
on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
where p i a n e t a . s i s t e m a = "LUWYQNLWCEGOKQWK"
union
select
distinct
Incarico
join
Marinaio . Matricola ,
Marinaio
M a r i n a i o . Nome ,
M a r i n a i o . Cognome from
on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
Flotta
join
Pianeta
on ( f l o t t a _ i d F l e e t = F l o t t a . i d F l e e t )
a on
f l o t t a . idpianeta = a . idpianeta )
where a . s i s t e m a = "LUWYQNLWCEGOKQWK" ;
mysql> s e l e c t
distinct b . Matricola ,
b . Nome ,
b . Cognome from
> I n c a r i c o j o i n M a r i n a i o b on ( b . M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
> j o i n s p e c i e on ( b . i d S p e c i e = S p e c i e . i d S p e c i e )
> j o i n P i a n e t a on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
> where p i a n e t a . s i s t e m a = "LUWYQNLWCEGOKQWK"
> union
>
s e l e c t d i s t i n c t M a r i n a i o . M a t r i c o l a , M a r i n a i o . Nome , M a r i n a i o . Cognome
>
I n c a r i c o j o i n M a r i n a i o on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
>
j o i n Nave on ( Nave_Codice = Nave . C o d i c e )
>
j o i n F l o t t a on ( f l o t t a _ i d F l e e t = F l o t t a . i d F l e e t )
>
j o i n P i a n e t a a on ( f l o t t a . i d p i a n e t a = a . i d p i a n e t a )
>
where a . s i s t e m a = "LUWYQNLWCEGOKQWK" ;
++++
|
Matricola
Nome
Cognome
|
++++
|
28714
| WTIQTAXJX
| XANUVCZTOYHGJRJGDLVN |
30770
| VEXDTFTLWTLRHKYGP
29
NJCXC
33983
| IHIXPVQABHOEMHH
| MOVUXHYLSMSPYVAZ
222439
| IMEDUFDKEZCWXA
226273
| SDDCDPPV
| EKPLIWUNPUGPQDLUJ
227277
| NJDLNRDMXCEKNAV
|
[ . . . ]
|
ER
|
|
|
|
SLRFDOBN
|
++++
80
rows i n
set
mysql> e x p l a i n
(0.05
sec )
select
distinct b . Matricola ,
b . Nome ,
b . Cognome from
> I n c a r i c o j o i n M a r i n a i o b on ( b . M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
> j o i n s p e c i e on ( b . i d S p e c i e = S p e c i e . i d S p e c i e )
> j o i n P i a n e t a on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
> where p i a n e t a . s i s t e m a = "LUWYQNLWCEGOKQWK"
> union
>
s e l e c t d i s t i n c t M a r i n a i o . M a t r i c o l a , M a r i n a i o . Nome , M a r i n a i o . Cognome
>
I n c a r i c o j o i n M a r i n a i o on ( M a t r i c o l a = M a r i n a i o _ M a t r i c o l a )
>
j o i n Nave on ( Nave_Codice = Nave . C o d i c e )
>
j o i n F l o t t a on ( f l o t t a _ i d F l e e t = F l o t t a . i d F l e e t )
>
j o i n P i a n e t a a on ( f l o t t a . i d p i a n e t a = a . i d p i a n e t a )
>
where a . s i s t e m a = "LUWYQNLWCEGOKQWK" \G
1 . row
id :
s e l e c t _ t y p e : PRIMARY
table :
Pianeta
t y p e : ALL p o s s i b l e _ k e y s : PRIMARY
key : NULL
k e y _ l e n : NULL
r e f : NULL
rows :
954
Using where ;
Extra :
Using temporary
id :
2.
row
s e l e c t _ t y p e : PRIMARY
table :
type :
key :
specie
p o s s i b l e _ k e y s : PRIMARY, S p e c i e _ F K I n d e x 1
ref
Specie_FKIndex1
key_len :
ref :
rows :
Extra :
Using index
id :
3.
s e l e c t _ t y p e : PRIMARY
30
row
table :
type :
key :
Marinaio_FKIndex2
key_len :
ref :
rows :
20
Extra :
id :
p o s s i b l e _ k e y s : PRIMARY, Marinaio_FKIndex2
ref
4.
row
s e l e c t _ t y p e : PRIMARY
table :
type :
key :
Incarico
ref
possible_keys :
Incarico_FKIndex1
Incarico_FKIndex1
key_len :
ref :
ship . b . Matricola
rows :
Using index
Extra :
id :
5.
row
s e l e c t _ t y p e : UNION
table :
key :
Flotta
index
type :
p o s s i b l e _ k e y s : PRIMARY, F l o t t a _ F K I n d e x 1
Flotta_FKIndex1
key_len :
r e f : NULL
rows :
250
Using index ;
Extra :
Using temporary
id :
6.
row
s e l e c t _ t y p e : UNION
table :
type :
a
eq_ref
p o s s i b l e _ k e y s : PRIMARY
key : PRIMARY
key_len :
ref :
rows :
Using where
Extra :
id :
7.
row
s e l e c t _ t y p e : UNION
table :
type :
key :
Nave
Nave_FKIndex1
key_len :
ref :
p o s s i b l e _ k e y s : PRIMARY, Nave_FKIndex1 , C o d i c e , P i p p o I n d e x
ref
4
rows :
Extra :
Using index
31
id :
8.
row
s e l e c t _ t y p e : UNION
table :
type :
key :
Incarico
ref
possible_keys :
I n c a r i c o _ F K I n d e x 1 , Nave_Codice
Nave_Codice
key_len :
ref :
s h i p . Nave . C o d i c e
rows :
20
Extra :
id :
9.
row
s e l e c t _ t y p e : UNION
table :
type :
Marinaio
eq_ref
p o s s i b l e _ k e y s : PRIMARY
key : PRIMARY
key_len :
ref :
ship . I n c a r i c o . Marinaio_Matricola
rows :
Extra :
10.
row
i d : NULL
s e l e c t _ t y p e : UNION RESULT
t a b l e : <u n i o n 1 ,2 >
t y p e : ALL p o s s i b l e _ k e y s : NULL
key : NULL
k e y _ l e n : NULL
r e f : NULL
rows : NULL
Extra :
rows i n
10
set
(0.00
sec )
Select
Incarico . idIncarico
from I n c a r i c o
join
Marinaio
on ( M a r i n a i o . M a t r i c o l a =
I n c a r i c o . Marinaio_matricola
(1.21
sec )
come discusso prima per l'ottimizzazione di 8.14 l'or nella clausola where
rallenta il tempo di esecuzione della query.
La tecnica di ottimizzazione sar la stessa.
32
mysql> S e l e c t
Incarico . idIncarico
> from I n c a r i c o j o i n M a r i n a i o on ( M a r i n a i o . M a t r i c o l a = I n c a r i c o
> where year ( m a r i n a i o . d a t a d i n a s c i t a ) = 2 0 0 0
> union
> S e l e c t I n c a r i c o . i d I n c a r i c o
> from I n c a r i c o j o i n Nave on Nave . c o d i c e = I n c a r i c o . Nave_Codice
> where year ( Nave . d a t a V a r o ) = 2 0 0 0 ;
++
|
idIncarico
. Marinaio_matri
++
|
300015
261263
316363
[ . . . ]
|
289180
412253
330724
++
2254
rows i n
set
(0.13
sec )
d i s t i n c t Nave . NomeVaro
from Nave j o i n
join
Pianeta
Facility
on ( Nave . F a c i l i t y _ i d F a c i l i t y = i d F a c i l i t y )
on ( F a c i l i t y . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
j o i n Armamento on ( Armamento . N a v e _ c o d i c e = n a v e . C o d i c e )
join
Facility
join
Pianeta
as
as
Facility2
pianeta2
on ( Armamento . F a c i l i t y _ i d F a c i l i t y = f a c i l i t y 2 . i d F a c i l
on ( F a c i l i t y 2 . i d P i a n e t a = P i a n e t a 2 . i d P i a n e t a )
where p i a n e t a . A v r g t e m p e r a t u r a > 5 0 or
50;
Select
d i s t i n c t Nave . NomeVaro
Facility
join
Pianeta
as
as
Facility2
pianeta2
on ( Armamento . F a c i l i t y _ i d F a c i l i t y = f a c i l i t y 2 . i d F a c i l
on ( F a c i l i t y 2 . i d P i a n e t a = P i a n e t a 2 . i d P i a n e t a )
where p i a n e t a 2 . a v r g t e m p e r a t u r a < 5 0
union d i s t i n c t
Select
d i s t i n c t Nave . NomeVaro
from Nave j o i n
join
Pianeta
Facility
on ( Nave . F a c i l i t y _ i d F a c i l i t y = i d F a c i l i t y )
on ( F a c i l i t y . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
where p i a n e t a . A v r g t e m p e r a t u r a < 5 0 ;
mysql> e x p l a i n
Select
d i s t i n c t Nave . NomeVaro
33
s e l e c t _ t y p e : PRIMARY
table :
key :
Facility2
index
type :
p o s s i b l e _ k e y s : PRIMARY, F a c i l i t y _ F K I n d e x 1
Facility_FKIndex1
key_len :
r e f : NULL
rows :
2104
Using index ;
Extra :
Using temporary
id :
2.
row
s e l e c t _ t y p e : PRIMARY
table :
type :
pianeta2
eq_ref
p o s s i b l e _ k e y s : PRIMARY
key : PRIMARY
key_len :
ref :
ship . F a c i l i t y 2 . IdPianeta
rows :
Using where
Extra :
id :
3.
row
s e l e c t _ t y p e : PRIMARY
table :
type :
key :
Armamento
ref
possible_keys :
Armamento_FKIndex1 , Armamento_FKIndex3
Armamento_FKIndex3
key_len :
ref :
ship . Facility2 . i d F a c i l i t y
rows :
Extra :
Using where
id :
4.
row
s e l e c t _ t y p e : PRIMARY
table :
type :
Nave
eq_ref
p o s s i b l e _ k e y s : PRIMARY
key : PRIMARY
key_len :
34
. idFa
ref :
s h i p . Armamento . Nave_Codice
rows :
Extra :
id :
5.
row
s e l e c t _ t y p e : UNION
table :
key :
Facility
index
type :
p o s s i b l e _ k e y s : PRIMARY, F a c i l i t y _ F K I n d e x 1
Facility_FKIndex1
key_len :
r e f : NULL
rows :
2104
Using index ;
Extra :
Using temporary
id :
6.
row
s e l e c t _ t y p e : UNION
table :
type :
Pianeta
p o s s i b l e _ k e y s : PRIMARY
eq_ref
key : PRIMARY
key_len :
ref :
ship . F a c i l i t y . IdPianeta
rows :
Using where
Extra :
id :
7.
row
s e l e c t _ t y p e : UNION
table :
type :
key :
Nave
ref
key_len :
ref :
possible_keys :
Nave_FKIndex3
Nave_FKIndex3
4
ship . F a c i l i t y . i d F a c i l i t y
rows :
Extra :
8.
row
i d : NULL
s e l e c t _ t y p e : UNION RESULT
t a b l e : <u n i o n 1 ,2 >
t y p e : ALL p o s s i b l e _ k e y s : NULL
key : NULL
k e y _ l e n : NULL
r e f : NULL
rows : NULL
Extra :
rows i n
set
(0.00
sec )
35
11
Stored Procedure
Questa Stored Procedure Prende come parametro di input la matricola di un
marinaio, e lo promuove automaticamente di un grado nella scala gerarchica cercando automaticamente se c' un grado superiore al grado attualmente ricoperto
dal marinaio. Se il grado non dovesse esistere lo crea e glielo assegna.
delimiter
Create p r o c e d u r e
( in
Promote
Mtr
int )
begin
s e l e c t max ( HScalaComando )
join
Incarico
i n t o @Max from
on ( i n c a r i c o . Grado_idGrado = g r a d o . i d G r a d o )
grado
join
Incarico
join
null ;
on ( i n c a r i c o . Grado_idGrado = g r a d o . i d G r a d o )
grado
gerarchia
is
i n t o @ F a z i o n e from
idFazione
on ( g e r a r c h i a . Grado_idGrado = g r a d o . i d g r a d o )
join
grado
i n t o @Min from
on ( g e r a r c h i a . Grado_idGrado = g r a d o . i d g r a d o )
@min
not n u l l
is
then
select
Grado_idGrado
Gerarchia
join
grado
i n t o @Grado from
on ( g e r a r c h i a . Grado_idGrado = g r a d o . i d g r a d o )
incarico
s e t g r a d o _ i d G r a d o = @grado
where M a r i n a i o _ M a t r i c o l a = mtr and d a t a f i n e i n c a r i c o
is
null ;
else
s e l e c t NomeGrado into@Name from
gerarchia
join
grado
on ( g e r a r c h i a . Grado_idGrado = g r a d o . i d g r a d o )
i n t o Grado ( HscalaComando
, Nomegrado )
values
(@max+1 ,
maggiore " ) ) ;
select
idGrado
insert
into
update
incarico
c o n c a t ( @nome ,
"
Gerarchia
values
( @grado ,
@fazione ) ;
s e t g r a d o _ i d G r a d o = @grado
36
is
null ;
create
procedure
DoomDay ( In
iD
int )
begin
update P i a n e t a
set
isnotdestroyed = false
update S p e c i e
d e l e t e from
set
where P i a n e t a . i d P i a n e t a = iD ;
= true where
isnearextinction
flotta
S p e c i e . i d P i a n e t a = iD ;
where F l o t t a . i d P i a n e t a = iD ;
end ;
}
delimiter
Create p r o c e d u r e
( in
Find
ClassiD
int ,
in
IncaricId
int )
begin
join
join
Mansione
Incarico
on (
on (
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
j o i n Grado on ( i d G r a d o = Grado_idGrado )
Marinaio
join
i n t o @max ;
join
Mansione
Incarico
on (
on (
Marinaio_Matricola = Matricola
M a n s i o n e _ i d I n c a r i c o = Mansione . i d I n c a r i c o
j o i n Grado on ( i d G r a d o = Grado_idGrado )
12
Views
Crea una view che restituisce tutte le navi varate nell'anno corrente
c r e a t e view N a v i _ a t t u a l i
from Nave j o i n
Class
as S e l e c t
Codice ,
NomeVaro ,
on ( Nave . C l a s s = C l a s s . C l a s s )
37
DataVaro ,
Class . Class
Crea una view che restituisce tutti i marinai che hanno pi di 50 anni
M a r i n a i o . Cognome
FROM M a r i n a i o
WHERE DATEDIFF(CURDATE(
, DataDiNascita
/365 > 50
Crea una view che restituisce tutte le Classi a disposizione della otta F
Create VIEW C l a s s i _ d i AS S e l e c t
from C l a s s
C l a s s . NameClass
as C l a s s ,
count ( )
j o i n Nave on ( C l a s s . C l a s s = Nave . C l a s s )
join
Flotta
join
Fazione
on ( Nave . F l o t t a _ i d F l e e t = F l o t t a . i d F l e e t )
on ( F l o t t a . i d F a z i o n e = F a z i o n e . i d F a z i o n e )
where a l l i a n c e n a m e = "JEUNWXGHDECOUWOMY"
Crea una view che restituisce i pianeti che hanno dato vita ad una specie
Create view P i a n e t i _ v i v i AS
Select
P i a n e t a . Nome as
from S p e c i e
join
Planet
Pianeta
on ( S p e c i e . i d P i a n e t a = P i a n e t a . i d P i a n e t a )
group by P i a n e t a . i d P i a n e t a ;
Crea una view che restituisce tutte le navi varate questo anno di una classe a
disposizione della otta F
Create view N a v i _ c o m e _ c l a s s _ a t t u a l i AS
Select
from C l a s s i _ d i
13
join
Navi_attuali
on ( C l a s s e = C l a s s ) ;
Transazioni
Una transazione una serie di azioni che vengono compiute assieme contemporaneamente.
Il meccanismo delle transazioni permette di assicurare il rispetto delle propriet ACID (Atomiicity, Consistency, Isolation, Durability) quando si eettuano
dei commit nel Database.
Le propriet da rispettare sono appunto
Atomicit:
38
as No
Durabilit: Gli eetti di una transazione portata a buon ne sono persistenti nel tempo
Transaction ;
update V e l i v o l o
Set T a c c h e = T a c c h e +1 where
idvelivolo
= @A1 ;
Transaction ;
update Nave s e t
F l o t t a _ i d F l e e t = @B1 where
39
F l o t t a _ i d F l e e t = @A1 ;