Caso de Estudo SQL - Tássio Gonçalves · CASO DE ESTUDO: SQL – Introdução através de...
Transcript of Caso de Estudo SQL - Tássio Gonçalves · CASO DE ESTUDO: SQL – Introdução através de...
Caso estudo: SQL
1
CASODEESTUDO:SQL–IntroduçãoatravésdeexemplosJosé Luís Borges
Maio de 2009
Versão 01
Este capítulo apresenta um caso de estudo que consiste na utilização da linguagem SQL para as tarefas de
gestão e manipulação da informação de uma base de dados relacional. A linguagem SQL (Structured
Query Language) estabelece um standard de comunicação com sistemas de gestão de bases de dados,
apresentando a característica de ser independente da ferramenta utilizada para armazenar as tabelas
relacionais. Todas as instruções apresentadas neste capítulo foram testadas no Microsoft Access 2007 e
no MySQL 5.1, duas populares ferramentas para gestão de bases de dados relacionais.
Será utilizado um exemplo baseado no caso de estudo dedicado à modelação conceptual de classes para
ilustrar a utilização da linguagem SQL na criação de tabelas, inserção dos dados, actualização dos dados e
na consulta das tabelas. De referir que não é objectivo do presente capítulo apresentar uma definição da
linguagem SQL mas apenas ilustrar as suas potencialidades através de exemplos de utilização.
Na Secção 1 é apresentado o exemplo que serve de suporte ao capítulo, na Secção 2 é exemplificada a
utilização das instruções de criação, actualização e consulta das tabelas com um pequeno exemplo de
uma tabela. Na Secção 4 ilustra‐se com maior detalhe a instrução de criação de tabelas, na Secção 5 a
instrução para inserção de dados nas tabelas e na Secção 6 a instrução para consulta das tabelas.
Finalmente, na Secção 7 é exemplificado o mecanismo para criação de vistas das tabelas. Em anexo é
disponibilizada uma listagem de todas as instruções para criação das tabelas da base de dados e para a
inserção nas tabelas de todos os registos utilizados nos exemplos.
1. Uma base de dados com informação sobre produção de vinhos
Neste capítulo vamos recorrer a uma base de dados baseada no exemplo utilizado para o estudo de um
modelo conceptual de classes correspondente a um sistema de informação vocacionado para a gestão do
negócio de um produtor de vinhos. A Figura 1 apresenta o diagrama conceptual de classes relativo à base
de dados considerada. De acordo com o diagrama, a empresa possui um conjunto de propriedades
agrícolas, cada uma associada a uma determinada região vinícola. São produzidas diversas marcas de
vinho, sendo cada vinho caracterizado pela sua marca, teor alcoólico, preço, tara das garrafas
comercializadas, número de garrafas produzidas anualmente e número de meses que o vinho passa em
estágio em barricas de madeira. O tipo de vinho permite indicar se um determinado vinho é, por exemplo,
um vinho tinto ou um espumante. Uma marca de vinho pode estar associada a uma, ou em alguns casos,
Caso estudo: SQL
2
a mais de uma propriedade. Temos ainda o conceito de castas que permite indicar qual a percentagem de
cada tipo de uva utilizadas na produção do vinho de cada marca. Uma casta é caracterizada pela sua
designação corrente (por exemplo touriga nacional ou tinta roriz), uma descrição textual das suas
características, a cor (tinta ou branca) e a indicação se é uma casta de baixa, média ou elevada
produtividade (sabe‐se por exemplo que a touriga nacional é uma casta de baixa produtividade enquanto
a tinta roriz é de elevada produtividade.
De referir que à base de dados representada pelo diagrama irão corresponder sete tabelas relacionais,
cinco correspondentes a cada uma das classes e duas correspondes às relações de muitos para muitos.
Figura 1. Diagrama conceptual de classes que representa o sistema de informação utilizado neste caso de estudo
2. Implementações da SQL
A linguagem SQL é reconhecida como o standard para os sistemas de gestão de base de dados. No
entanto, as implementações disponibilizadas pelos sistemas comerciais suportam implementações que
não são completamente compatíveis entre si, levando a que por vezes sejam necessários pequenos
ajustes nas expressões. Neste capítulo vamos utilizar o MySQL para ilustrar o funcionamento das
instruções apresentadas, tendo essas mesmas instruções sido também testadas no Microsoft Access
2007.
MySQL
O MySQL é um sistema de gestão de base de dados em código aberto, sendo actualmente um dos
sistemas mais populares. No endereço http://www.mysql.com/ é possível encontrar versões para
-Designação-Descrição
Região-Nome-Endereço-Telefone-Email-Data Aquisição-Dimensão
Propriedade
* 1
-Designação-Descrição-Cor-Produtividade
Casta
-Marca-Características-Teor alcoólico-Preço referência-Tara-Num. garrafas-Meses estágio
Marca
-Designação-Descrição
Tipo de Vinho
* 1
-%
*
*
*
*
downloa
disponib
A Figura
denomin
de uma n
de dados
devem se
o botão ‘
2.1. M
O Micros
linguage
com a ve
‘Access O
compatib
d gratuito d
iliza, entre o
a 2 apresen
nada ‘schema
nova base de
s pretendida
er inseridas
‘Execute’.
Microsoft
soft Access é
m SQL neste
ersão standa
Options’ ao
bilização com
do sistema d
utras, a ferra
ta a janela
ata’ a indicaç
e dados surg
a pode ser a
na caixa de t
Access
é um sistema
e sistema é
ard. Como il
conjunto de
m o SQL versã
de gestão de
amenta ‘MyS
principal d
ção (a bold)
ge ao clicar c
ctivada atrav
texto localiza
Figura 2. Inte
a de gestão d
importante v
ustrado na
opções rela
ão ANSI 92, F
e base de da
SQL Query Br
o MySQL q
de qual a ba
com o botão
vés de um d
ada por baixo
erface do MySQ
de base de d
verificar se e
Figura 3 (a),
ativos aos ‘O
Figura 3 (b).
ados assim c
rowser 1.2’.
uery browse
ase de dados
direito do ra
duplo clique
o da barra d
QL query browse
dados comer
está activa a
, tal pode se
Object Design
como do pac
er sendo de
s seleccionad
ato na sub‐ja
no seu nom
e menus e e
er
rcial bastante
a opção de c
er verificado
ners’ e activ
Caso est
cote ‘GUI to
e realçar na
da. A opção p
anela ‘shema
me. As instruç
executadas p
e popular. Pa
compatibiliza
acedendo n
ando a opçã
udo: SQL
ols 5.0’ que
a sub‐janela
para criação
ata’ e a base
ções de SQL
ressionando
ara utilizar a
ação do SQL
na janela de
ão relativa à
3
Para exe
seguinte
c
n
n
4
N
E
E
(a)
Figu
ecutar no Ac
s passos:
criar uma bas
no menu de
na janela com
4 (a));
No canto sup
Escrever a in
Executar a in
(a)
ra 3. Configuraç
ccess as inst
se de dados;
‘Create’ sele
m título ‘Sho
perior esquer
strução pret
strução pres
Figura 4.
ção do MS Acce
truções de S
ccionar a op
ow table’ pre
rdo, no menu
endida;
ssionando o b
Janela para de
ess para que est
SQL apresen
ção ‘Query D
essionar ‘clo
u ‘Design’, se
botão ‘Run’.
finição de instr
te seja compatí
ntadas neste
Design’;
se’ sem sele
eleccionar a o
uções em SQL n
(b)
ível com o SQL s
e capítulo é
eccionar nen
opção ‘SQL v
(b)
no MS Access
Caso est
standard
necessário
huma tabela
view’ (ver Fig
udo: SQL
executar os
a (ver Figura
gura 4 (b));
4
Caso estudo: SQL
5
3. Introdução ao essencial do SQL
Nesta secção iremos utilizar uma das tabelas da base de dados para ilustrar os principais conceitos da
linguagem SQL. Nas secções seguintes serão apresentados exemplos mais detalhados de cada um desses
conceitos.
O primeiro passo na gestão de uma base de dados consiste na criação das tabelas que irão conter os
dados. A sintaxe para a instrução de criação de tabelas é a seguinte:
CREATE TABLE nome_tabela(
coluna_1 TIPO_1
…
coluna_2 TIPO_n
PRIMARY KEY(coluna_x,...));
A expressão seguinte permite criar a tabela de regiões. O nome dado à tabela é ‘t_regiao’, sendo esta
composta por três colunas. A coluna ‘regiao_id’ permite guardar valores numéricos to tipo inteiro (INT)
que correspondem ao identificador de cada região. Na definição desta coluna, a cláusula PRIMARY KEY
permite indicar que o atributo ‘regiao_id’ irá funcionar como chave primária da tabela. A coluna
‘designacao_regiao’ permite guardar um texto de, no máximo, quinze caracteres (VARCAHR(15)) que
identifique o nome das regiões. A utilização da cláusula NOT NULL obriga a que a designação da região
não seja deixada em branco e a cláusula UNIQUE permite garantir que não sejam introduzidas duas
regiões com a mesma designação. A coluna ‘descricao’ permite introduzir um texto (TEXT) com uma
descrição das características de cada região. Ao definir a coluna como sendo do tipo TEXT, estamos a
indicar que será permitido introduzir uma sequência de, no máximo, 65,535 caracteres. O tipo de dados
VARCHAR é vocacionado para sequências de caracteres não muito longas e de tamanho variável, por
outro lado, o tipo de dados TEXT é vocacionado para longas sequências de caracteres também de
tamanho variável.
CREATE TABLE t_regiao(
regiao_id INT PRIMARY KEY,
designacao_regiao VARCHAR(15) NOT NULL UNIQUE,
descricao TEXT);
Para inserir dados nas tabelas da base de dados utiliza‐se a instrução INSERT, que tem a sintaxe seguinte:
Caso estudo: SQL
6
INSERT INTO nome_tabela [(coluna_1, coluna_2, …)]
VALUES (valor_coluna_1, valor_coluna_2, …);
A instrução seguinte permite definir a região ‘Douro’ na tabela ‘t_regiao’, sendo atribuído o valor ‘1’ para
o atributo identificador e fornecida uma breve descrição da região:
INSERT INTO t_regiao (regiao_id, designacao_regiao, descricao)
VALUES (1,'Douro', 'A região do Douro localiza-se no Nordeste de Portugal,
rodeada pelas serras do Marão …');
No caso de pretender fornecer valores para todas as colunas da tabela e pela ordem pela qual os
atributos foram definidos aquando da criação da tabela é possível omitir a indicação das colunas
pretendidas. A instrução seguinte ilustra essa possibilidade:
INSERT INTO t_regiao
VALUES (2, 'Alentejo', 'O Alentejo é uma das maiores regiões …');
É no entanto importante referir que tal opção deve ser ponderada cuidadosamente uma vez que
instruções como esta deixam de estar correctas no caso de ser acrescentada ou eliminada uma coluna da
tabela. Por exemplo, se acrescentarmos um atributo à classe Região que indique a área total de vinha
plantada a instrução utilizada para a definição da região do Douro continuará válida desde que o novo
atributo permita valores nulos, enquanto a instrução utilizada para a caracterização da região do Alentejo
resultará num erro de execução.
Para consultar a informação das tabelas utiliza‐se a instrução SELECT. A sintaxe do SELECT é a seguinte:
SELECT coluna_1, …, coluna_n
FROM tabela
[WHERE condição ]
[GROUP BY expressão ]
[HAVING condição ]
[ORDER BY expressão [ ASC | DESC ] ] ;
Por exemplo, podemos obter uma listagem de todas as regiões com a instrução:
SELECT * FROM t_regiao;
O símbolo ‘*’ é um wildcard que corresponde a seleccionar todas as colunas da tabela indicada. A Figura 5
ilustra a execução da query no MySQL query browser.
No caso
ordenado
SELEC
ORDER
A instruç
uma colu
ALTER
A mesma
modifica
Para alte
definir a
UPDAT
De forma
UPDAT
A Figura
propried
Figura 5. A
de pretend
os alfabetica
CT designa
R BY desig
ção ALTER TA
una que repr
R TABLE t_
a instrução p
r uma coluna
erar os valore
dimensão da
TE t_regia
a equivalente
TE t_regia
6 mostra o
ades após a
execução da in
dermos sele
amente pode
acao_regia
gnacao_reg
ABLE permite
resente a dim
_regiao AD
pode ser utili
a, utilizando
es dos regist
a região do D
ao SET dim
e podemos in
ao SET dim
o resultado d
actualização
nstrução que pe
ccionar ape
emos utilizar
ao FROM t_
giao;
e alterar a d
mensão em h
DD dimensa
izada para e
MODIFY em
tos já definid
Douro podem
mensao = 4
nserir a infor
mensao = 2
da instrução
o da informaç
ermite seleccion
nas a desig
a seguinte in
_regiao
definição de
ectares de ca
ao INT;
liminar uma
vez de ADD.
dos podemos
mos utilizar a
40000 WHER
rmação relat
22000 WHER
o que permit
ção sobre a d
nar todas as reg
nação das r
nstrução:
uma tabela.
ada região at
coluna utiliz
.
s utilizar a in
seguinte exp
RE regiao_
iva à dimens
RE regiao_
te a listagem
dimensão das
giões no MySQL
regiões e ap
Por exempl
través da seg
zando DROP
nstrução UPD
pressão:
_id = 1;
são da região
_id = 2;
m de todas
s regiões.
Caso est
L query browser
presentar os
o, podemos
guinte instru
em vez do A
DATE. Por ex
o vinícola do
as colunas d
udo: SQL
r
s resultados
acrescentar
ção:
ADD ou para
emplo, para
Alentejo.
de todas as
7
Figura 6
4. Cria
Nesta se
correspo
tabela co
CREAT
propr
nome
ender
telef
dimen
data_
regia
FOREI
Na criaçã
pode ser
atributo,
KEY(regia
referênc
apenas s
correspo
uma reg
‘data_aq
da propr
6. A execução da
ação de t
ecção serão
ondentes ao
orresponden
TE TABLE t
riedade_id
VARCHAR(5
reco VARCH
fone VARCH
l VARCHAR(
nsao INT,
_aquisicao
ao_id INT,
IGN KEY (r
ão de uma t
r efectuada a
, qual a tab
ao_id) REFER
ia ao atribu
serão admiti
ondente da ta
gião já existe
quisicao’ com
riedade.
a instrução que
tabelas
o apresentad
modelo repr
te à classe P
t_propried
d INT PRIM
50) NOT NU
HAR(50),
HAR(20),
(30),
o DATE,
,
regiao_id)
tabela, a ind
através da clá
bela em qu
RENCES t_re
to com o m
dos na colun
abela ‘t_regi
ente. De rea
mo sendo um
e permite selecc
das as instr
resentado pe
ropriedade:
dade(
MARY KEY,
ULL,
) REFERENC
dicação de q
áusula FORE
ue o mesmo
egiao(marca_
mesmo nome
na ‘regiao_id
iao’ obrigand
alçar ainda a
ma data do ti
cionar todas as região
ruções nece
elo diagrama
CES t_regi
ue um atrib
IGN KEY, um
o é chave p
_id) indica q
e que é cha
d’ da tabela
do, assim, a q
a utilização
po ‘ano/mês
regiões já com
essárias para
da Figura 1.
iao(regiao
uto tem as
a vez que es
primária. Po
que o atribu
ave primária
‘t_proprieda
que uma pro
do tipo de d
s/dia’ e que
o atributo que
a a criação
A instrução
o_id));
característic
sta cláusula p
or exemplo,
uto ‘regiao_i
da tabela ‘
ade’ valores
opriedade só
dados DATE
permite regi
Caso est
define a dimen
das restan
seguinte per
as de chave
permite indic
a expressã
id’ da tabela
‘t_regiao’. D
que constem
ó possa ser d
, que define
istar a data d
udo: SQL
nsão de cada
ntes tabelas
rmite criar a
estrangeira
car, para um
ão FOREIGN
a criada faz
Desta forma,
m na coluna
efinida para
e o atributo
de aquisição
8
Caso estudo: SQL
9
A tabela correspondente à classe Tipo de Vinho pode ser criada com uma instrução equivalente à utilizada
para a criação da tabela de Região. Neste caso, e utilizada a cláusula AUTO_INCREMENT que permite
indicar que à coluna ‘tipo_vinho_id’ seja associado um gerador de números inteiros sequenciais. Desta
forma, de cada vez que um tipo de vinho é inserido na tabela é‐lhe atribuído de forma sequencial um
código identificador único.
CREATE TABLE t_tipo_vinho(
tipo_vinho_id INT PRIMARY KEY AUTO_INCREMENT,
designacao_tipo_vinho VARCHAR(15) NOT NULL UNIQUE,
descricao TEXT);
A instrução seguinte é utilizada para criação da tabela de Marca. De notar a utilização do tipo de dados
FLOAT que permite inserir números não inteiros nas colunas correspondentes. A tabela tem o atributo
‘tipo_vinho_id’ que tem as características de chave estrangeira, fazendo referência à tabela de Tipo de
Vinho.
CREATE TABLE t_marca(
marca_id INT PRIMARY KEY,
marca VARCHAR(50) NOT NULL,
teor FLOAT,
tara FLOAT,
preco FLOAT,
num_garrafas INT,
meses_estagio FLOAT,
caracteristicas TEXT,
tipo_vinho_id INT,
FOREIGN KEY (tipo_vinho_id) REFERENCES t_tipo_vinho(tipo_vinho_id));
A tabela correspondente à associação binária entre as classes Marca e Propriedade necessita de uma
atenção especial uma vez que, dado que a chave primária é composta por mais de um atributo, temos de
utilizar uma sintaxe ligeiramente diferente. Assim, na expressão seguinte temos a instrução PRIMARY
KEY(marca_id, propriedade_id) que define que a chave primária da tabela ‘t_marca_propriedade’ é
composta pelo par de atributos indicado. De referir que cada um dos atributos que compõem a chave
primária tem as características de chave estrangeira, sendo necessário incluir as cláusulas
correspondentes à caracterização de cada um.
Caso estudo: SQL
10
CREATE TABLE t_marca_propriedade(
marca_id INT,
propriedade_id INT,
PRIMARY KEY(marca_id, propriedade_id),
FOREIGN KEY(marca_id) REFERENCES t_marca(marca_id),
FOREIGN KEY(propriedade_id) REFERENCES t_propriedade(propriedade_id));
A instrução seguinte permite criar a tabela que mantém a informação sobre as castas:
CREATE TABLE t_casta(
casta_id INT PRIMARY KEY,
designacao_casta VARCHAR(25) NOT NULL UNIQUE,
cor VARCHAR(6),
produtividade VARCHAR(5),
descricao TEXT);
Uma vez que a cor da casta é um atributo importante que será alvo de pesquisas frequentes vamos criar
um índice associado a esse atributo. Um índice, quando definido para um atributo de uma tabela, permite
melhorar o desempenho das consultas que envolvem esse mesmo atributo. A pesquisa de um valor num
atributo ao qual não está associado um índice obriga a percorrer todas as linhas da tabela à procura desse
mesmo valor, uma vez que não há qualquer informação acerca da linha da tabela em que esse valor pode
ocorrer. Um índice para um atributo numa determinada tabela não é mais do que uma estrutura paralela
à tabela que mantém esse mesmo atributo ordenado. Logo um índice torna um pouco menos eficiente a
inserção e a eliminação de registos, mas torna muito mais eficiente a pesquisa. Na concepção de uma
base de dados devem ser analisados cuidadosamente quais os atributos que, por serem de pesquisa
frequente, podem beneficiar por terem um índice associado. De referir que, a instrução de criação de
tabelas associa à respectiva chave primária um índice para que a pesquisa pelos seus valores seja
eficiente. A instrução seguinte permite criar um índice para o atributo cor da tabela de castas:
CREATE INDEX IDXcor ON t_casta (cor);
A base de dados fica completa com a instrução para a criação da tabela que permite definir quais as
castas utilizadas na produção de uma determinada marca:
Caso estudo: SQL
11
CREATE TABLE t_marca_casta(
marca_id INT,
casta_id INT,
percentagem FLOAT,
PRIMARY KEY(marca_id, casta_id),
FOREIGN KEY(marca_id) REFERENCES t_marca(marca_id),
FOREIGN KEY(casta_id) REFERENCES t_casta(casta_id));
Por último, importa referir que uma tabela pode ser eliminada através da instrução DROP TABLE. A
instrução seguinte permite apagar a tabela de propriedades:
DROP TABLE t_propriedade;
De forma a manter a integridade referencial, uma determinada tabela só pode ser eliminada se não existir
na base de dados nenhuma outra tabela que possua como chave estrangeira a chave primária da tabela
em questão. Assim, a tabela ‘t_propriedade’ só pode ser eliminada se a tabela ‘t_marca_propriedade’ for
previamente eliminada ou se a restrição FOREIGN KEY que faz referência à tabela de propriedades for
previamente removida.
Exercícios
Escreva uma instrução que permita:
1. alterar a tabela de castas de forma a ter um coluna adicional que permita registar as
designações alternativas associadas a cada castas.
2. criar uma tabela para guardar a informação sobre as vinhas. Cada vinha é caracterizada
por uma designação, pela área de plantação, ano de plantação, tipo de solo e altitude
média. Cada vinha está associada a uma propriedade.
3. criar uma tabela para registar o número de pés plantados de cada casta em cada vinha.
5. Inserir e alterar os dados nas tabelas
Nesta secção iremos apresentar alguns exemplos adicionais das instruções de INSERT e UPDATE. Ao
inserir registos numa tabela, é importante ter em especial atenção o preenchimento de atributos que tem
o papel de chave estrangeira. Como foi referido anteriormente, o preenchimento de um registo numa
tabela que possui uma chave estrangeira apenas pode ser efectuado após o preenchimento do registo
que define o conceito correspondente à chave primária que está associada à chave estrangeira em
questão. Por exemplo, a introdução da informação relativa a uma quinta na tabela de propriedades
apenas pode ser efectuada após a região correspondente à propriedade ter sido definida. A instrução
Caso estudo: SQL
12
seguinte permite definir uma propriedade situada na região do Douro, sendo portanto necessário
assegurar que essa mesma região foi previamente definida:
INSERT INTO t_propriedade VALUES (1,'Quinta de Santa Teresa', 'Peso da
Régua', '254 223 344','[email protected]', 60, 1);
A instrução seguinte permite inserir a região da Estremadura sem fornecer mais detalhe além da sua
designação:
INSERT INTO t_regiao VALUES (6,'Estremadura', NULL, NULL);
A instrução anterior é equivalente à instrução seguinte:
INSERT INTO t_regiao (regiao_id, desginacao_regiao)
VALUES (6,'Estremadura');
Para inserir registos em tabelas em que ao atributo chave primária foi associada a cláusula
AUTO_INCREMENT podemos omitir o valor para esse atributo na instrução de INSERT. Por exemplo, na
instrução seguinte é inserido um tipo de vinho sendo ao atributo ‘tipo_vinho_id’ associado o próximo
valor inteiro disponível:
INSERT INTO t_tipo_vinho (designacao_tipo_vinho, descricao)
VALUES ('Tinto', 'produzidos a partir da fermentação de uvas Tintas');
No entanto, tal não impede que o valor para o identificador seja incluído na instrução de insert, tal como
é ilustrado na seguinte instrução:
INSERT INTO t_tipo_vinho
VALUES (3, 'Branco', 'Os vinhos brancos tranquilos são feitos a partir da
fermentação de uvas sem pele.');
A instrução UPDATE permite alterar os valores existentes numa determinada tabela. Por exemplo,
podemos alterar o telefone da propriedade 1 com a seguinte instrução:
UPDATE t_propriedade SET telefone = '259351397'
WHERE propriedade_id = 1;
Podemos acrescentar o indicativo nacional a todos os números de telefones definidos através da seguinte
instrução:
Caso estudo: SQL
13
UPDATE t_propriedade SET telefone = CONCAT("00351 ", telefone)
WHERE telefone IS NOT NULL;
A função CONCAT permite efectuar a concatenação de strings no MySQL sendo que no MS Access a
expressão equivalente toma a seguinte forma “00351 ” + telefone.
Finalmente, a instrução DELETE permite apagar registos de uma tabela. Por exemplo, a instrução seguinte
permite apagar todas as propriedades da região do Douro. É necessário ter em atenção que caso exista
uma Marca associada a uma propriedade situada na região do Douro essa propriedade só poderá ser
apagada depois de eliminada a marca. Dito de outra forma, não é possível apagar um registo de uma
tabela se o atributo que o identifica ocorrer numa outra tabela com o papel de chave estrangeira.
DELETE FROM t_propriedade WHERE regiao_id = 1;
Exercícios
Escreva uma instrução que permita:
1. inserir na tabela de castas a informação relativa à casta ‘Alvarinho’ de cor branca e de
média produtividade.
2. inserir a propriedade ‘Quinta dos Álvaros’, situada em Longos Vales, Monção, adquirida
em ‘2008/02/11’ e incluída na região vinícola de Monção (será também necessário inserir
a informação relativa à região).
3. inserir a marca ‘Alvarinho dos Álvaros’, produzida na ‘Quinta dos Álvaros’, que consiste
num vinho branco, graduação de 13%, com preço de referência 12€, comercializado em
garrafas de 75cl, com uma produção de 50000 garrafas e produzido exclusivamente com
a casta Alvarinho.
4. acrescentar 1 mês ao tempo de estágio dos vinhos que actualmente passam 12 meses em
estágio.
6. Consulta da base de dados
6.1. A instrução de SELECT
A instrução SELECT permite interrogar a base de dados sendo a seguir indicada a sintaxe da mesma:
SELEC
FROM
[WHER
[GROU
[HAVI
[ORDE
Por exem
castas se
SELEC
Se prete
pretendi
SELEC
FROM
Para ord
seleccion
também
SELEC
FROM
ORDER
A cláusu
contrária
CT coluna_
tabela
RE condiçã
UP BY expr
ING condiç
ER BY expr
mplo, a instru
endo o result
CT * FROM
endermos se
das, tal como
CT designa
t_casta;
denar os res
nar as castas
foi alterada.
CT produti
t_casta
R BY produ
la ORDER BY
a ser obtida a
_1, …, col
ão ]
ressão ]
ção ]
ressão [ A
ução seguint
tado da instru
t_casta;
eleccionar a
o no exempl
acao_casta
sultados pod
s ordenadas
.
ividade, d
utividade;
Y, por defeito
através da clá
luna_n
ASC | DESC
te permite se
ução apresen
penas algum
o da instruçã
a, cor, pr
demos fazer
s pelo indica
designacao
;
o, ordena um
áusula (DESC
C ] ] ;
eleccionar to
ntado na figu
mas colunas
ão seguinte:
rodutivida
uso da cláu
ador de prod
o_casta, c
m atributo de
C).
odas as colun
ura:
s da tabela
ade
usula ORDER
dutividade. D
cor,
e forma asce
nas e todos
teremos de
R BY. A inst
De notar qu
endente (ASC
Caso est
os registos d
e enumerar
rução seguin
ue a ordem
C) podendo a
udo: SQL
da tabela de
as colunas
nte permite
das colunas
a ordenação
14
SELEC
FROM
ORDER
Podemos
cláusula
resultado
‘produtiv
SELEC
FROM
WHERE
ORDER
A cláusu
ou difere
marcas c
expressã
SELEC
WHERE
ORDER
A cláusu
ordenaçã
dessa for
A cláusu
seguinte
expressã
15% ou q
CT designa
t_casta
R BY produ
s ainda rest
WHERE. A in
os, primeiro
vidade’ é do
CT designa
t_casta
E produtiv
R BY cor,
la WHERE pe
ente utilizan
com preço s
ão:
CT marca,
E teor <=
R BY preco
la ORDER BY
ão inversa te
rma.
la BETWEEN
ilustra a util
ão será o con
que, alternat
acao_casta
utividade
ringir os res
nstrução seg
o por cor e,
tipo texto, o
acao_casta
vidade = ‘
designaca
ermite conju
ndo os opera
superior a 1
teor, pre
13 AND pr
o DESC, ma
Y, por defeito
emos de utili
permite esp
lização do op
njunto das m
tivamente, cu
a, cor, pr
DESC;
sultados, por
guinte permi
, para cada
critério de s
a, cor, pr
‘alta’
ao_casta;
gar um núm
adores lógic
0€ e com te
eco FROM t
reco > 10
arca;
o, ordena o
zar a cláusul
pecificar um
perador lógic
marcas que c
ustam menos
rodutivida
r exemplo, à
ite seleccion
cor, pela d
selecção tem
rodutivida
ero indeterm
os AND, OR
eor alcoólico
t_marca
atributo ind
a DESC para
intervalo de
co OR juntam
ustam mais
s de 10€.
ade
às castas de
ar as castas
designação d
de ser coloc
ade
minado de co
e NOT. Por
o inferior ou
icado de for
cada um do
valores para
mente com o
de 15€ e po
elevada pro
de produtiv
da casta. Um
cado entre pl
ondições do
r exemplo, p
u igual a 13
rma ascende
os atributos q
a um atributo
operador BE
ossuem um t
Caso est
odutividade
vidade alta e
ma vez que
licas ou aspa
tipo igual, m
podemos se
% utilizando
ente. Se pret
que se preten
o numérico.
ETWEEN. O r
eor alcoólico
udo: SQL
utilizando a
e ordenar os
e o atributo
as.
menor, maior
leccionar as
o a seguinte
tendermos a
nde ordenar
A expressão
resultado da
o entre 14 e
15
SELEC
WHERE
OR pr
ORDER
Podemos
seleccion
com o m
resultado
SELEC
WHERE
Como se
atributo
SELEC
WHERE
Para no
exemplif
porque o
SELEC
FROM
WHERE
É possíve
para uma
CT marca,
E (teor BE
reco < 10
R BY preco
s eliminar re
nar o teor al
mesmo teor a
os obtidos. S
CT DISTINC
E preco >
e pode ver a
seleccionado
CT teor FR
E preco >
resultado re
ficado na inst
o nome prete
CT DISTINC
t_marca
E preco >
el também in
a variável en
teor, pre
ETWEEN 14
o DESC, ma
petições nos
coólico das
alcoólico que
Se utilizarmos
CT teor FR
12;
seguir a me
o.
ROM t_marc
12;
etornado alt
trução segui
endido inclui
CT teor AS
12;
ncluir expres
tre 0 e 1 pod
eco FROM t
AND 15 AN
arca;
s resultados a
marcas cujo
e respeitem
s a cláusula D
ROM t_marc
sma instruçã
ca
terar o nom
nte. No exem
um espaço.
S “teor al
sões na cláu
demos utiliza
t_marca
ND preco >
ao utilizar a
preço é sup
o critério de
DISTINCT tod
ca
ão sem a clá
me de uma c
mplo apresen
lcoólico”
sula de SELE
ar a seguinte
> 15)
cláusula DIST
perior a 12€.
e selecção ir
das essas rep
usula DISTIN
coluna pode
ntado é nece
CT. Por exem
instrução:
TINCT. A Exp
No caso de
remos ter re
etições serão
NCT retorna v
mos utilizar
essária a util
mplo, para co
Caso est
pressão segui
existirem vá
petições des
o eliminadas
valores repe
a cláusula
ização das a
onverter o te
udo: SQL
inte permite
árias marcas
sse teor nos
s.
tidos para o
AS, como é
spas apenas
eor alcoólico
16
SELEC
FROM
WHERE
Se na ex
cabeçalh
utilização
Como vim
tabelas d
pelas sua
não ser c
operado
permite
SELEC
FROM
WHERE
De form
telefone
SELEC
FROM
WHERE
Como vim
(sequênc
natureza
uma vez
identifiqu
seguinte
registo.
CT DISTINC
t_marca
E preco >
xpressão ant
ho a instrução
o.
mos na Secç
determina qu
as caracterís
conhecido na
r IS permite v
identificar as
CT proprie
t_proprie
E regiao_i
ma semelhan
não está def
CT nome, e
t_proprie
E telefone
mos anterio
cia de caract
a, a pesquisa
z que basta
ue o registo
para selecc
CT teor/10
12;
erior não fo
o definida e
ão 2, a utiliz
ue não sejam
sticas poderã
a altura de in
verificar a ex
s propriedad
edade_id,
edade
id IS NULL
te, a instruç
finido:
endereco,
edade
e IS NULL;
rmente para
teres) temos
a de variávei
a existência
o pretendido
ionar o regis
00 AS teor
osse utilizado
no Access o
zação da cláu
m admitidos v
ão ter valore
ntrodução na
xistência de v
es para as qu
nome, reg
L;
ção seguinte
telefone
;
a a definição
s de incluir o
s de texto a
de um espa
o. Por exem
sto correspo
r
o o operado
nome expr1
usula NOT NU
valores nulos
es nulos. Por
a base de dad
valores nulos
uais não está
giao_id
e permite ve
o de uma res
o parâmetro
través da co
aço adiciona
plo, se na t
ndente à Qu
r AS, no My
1000, pelo q
ULL para um
s para esse at
exemplo, o
dos da inform
s numa tabel
á atribuída um
erificar quai
strição quan
de restrição
orrespondên
al entre duas
tabela de pr
uinta dos Mo
ySQL a colun
ue nestes ca
m atributo na
tributo. No e
telefone de
mação relativ
la. Por exem
ma região:
s as proprie
do um atrib
o entre plica
cia exacta é
s palavras p
ropriedades
onges a quer
Caso est
na retornada
asos se recom
instrução de
entanto há at
uma propri
va a essa pro
plo, a seguin
edades para
uto é do tip
as ou aspas.
um problem
ara que a se
utilizarmos
ry não retor
udo: SQL
teria como
menda a sua
e criação de
tributos que
edade pode
opriedade. O
nte instrução
as quais o
po VARCHAR
Dada a sua
ma delicado,
elecção não
a instrução
na qualquer
17
SELEC
Uma aná
foi inadv
permitid
critérios
O opera
exacta. P
Q
U
Para o M
deve ser
caracter
Por exem
seguinte
SELEC
WHERE
Ou selec
SELEC
WHERE
Para sele
instrução
SELEC
WHERE
Ou todas
CT * FROM
álise cuidada
vertidamente
o identificar
de pesquisa
do LIKE per
Para tal são u
Qualquer seq
Um qualquer
MS Access, no
r utilizado o
individual.
mplo, podem
instrução:
CT * FROM
E nome LIK
cionar todas
CT * FROM
E designac
eccionar tod
o:
CT * FROM
E designac
s as castas co
t_proprie
do conteúd
e inserido u
r o registo p
com corresp
mite a pesq
utilizados os d
quência de ze
r caracter ‘_’
o caso de não
caracter ‘*’
mos seleccio
t_proprie
KE 'Quinta
as castas cu
t_casta
cao_casta
as as castas
t_casta
cao_casta
om um ‘f’ na
edade WHER
o da tabela
um espaço a
pretendido. E
pondência ex
quisa de stri
dois seguinte
ero, ou mais,
o ser activad
para uma s
nar todas as
edade
a%';
ja designaçã
LIKE 'Tin
cuja design
LIKE '_i%
designação a
RE nome =
das propried
adicional ent
Este exemplo
xacta para co
ngs através
es wildcards:
, caracteres ‘
a a opção de
sequência de
s propriedad
o começa po
nta%';
ação tem um
%';
através da se
'Quinta d
dades revela
tre ‘dos’ e
o revela a d
olunas do tipo
de padrões,
:
‘%’
e compatibili
e caracteres
des cujo nom
or ‘Tinta’ atra
m ‘i’ na segu
eguinte instr
dos Monges
que na defin
‘Monges’, d
dificuldade a
o VARCHAR.
, em alterna
dade com o
s e o caracte
me começa
avés da instr
unda letra po
ução:
Caso est
s';
nição desta p
aí a express
ssociada à d
ativa à corre
ANSI 92 (ver
er ‘?’ para u
por ‘Quinta’
ução:
odemos usa
udo: SQL
propriedade
são não ter
definição de
espondência
r secção 2.1)
um qualquer
’ através da
r a seguinte
18
SELEC
WHERE
Se for n
preceder
Vamos il
email uti
SELEC
FROM
WHERE
A cláusul
No Acces
seguinte
SELEC
FROM
Exercício
Escreva u
6.2. A
Os sistem
manipula
manuten
têm um
algumas
Por exem
seguinte
CT * FROM
E designac
necessário p
r o wildcard
ustrar esta fu
iliza o caracte
CT proprie
t_proprie
E email LI
la ESCAPE ‘=’
ss bastaria in
que permite
CT proprie
t_proprie
os
uma instruçã
1. selec
2. selec
orde
3. selec
preço
Atributos
mas de gestã
ação dos atri
nção de regis
standard pa
das funciona
mplo, se pr
instrução:
t_casta
cao_casta
rocurar um
com um ca
uncionalidad
er ‘_’, para ta
edade_id,
edade
IKE'%=_%'
’ indica que o
ncluir o carac
e seleccionar
edade_id,
edade WHER
ão que permi
ccionar as cas
ccionar as c
nadas pela s
ccionar as ma
o se situa en
do tipo D
ão de base d
ibutos do tip
stos histórico
ara os difere
alidades disp
retendermos
LIKE '%f%
dos wildcar
aracter que
de através de
al temos que
nome, ema
ESCAPE '=
o caracter ‘=’
cter reservad
r todas as pro
nome, ema
RE nome LI
ita:
stas brancas
castas de a
ua designaçã
arcas de vinh
tre os 10 e o
ATE
e dados ofe
o DATE. A m
os, merecen
entes sistem
ponibilizadas
identificar
%';
rds dentro d
irá forçar a
e um exempl
e utilizar a se
ail
=';
’ será utilizad
do dentro de
opriedades q
ail
IKE'%[_]%'
de alta prod
lta produtiv
ão.
ho tinto com
os 20€.
recem, em g
anipulação d
do por isso
mas de gestã
no MySQL.
as propried
de uma seq
que o wildc
o que preten
guinte sintax
do para anula
parêntesis r
que utilizam o
';
dutividade.
vidade, orde
mais de 10
geral, alguma
de datas é um
uma atenção
ão de bases
dades adquir
quência de c
card seja int
nde seleccion
xe:
ar o contexto
rectos, como
o ‘underscor
enadas por
meses de es
as funcionalid
ma funcional
o especial. A
de dados p
ridas em 20
Caso est
caracteres te
terpretado li
nar as propri
o especial do
é ilustrado n
re’ no seu no
cor e, para
tágio em ma
dades espec
idade impor
As funções d
pelo que irem
002 podemo
udo: SQL
eremos que
iteralmente.
iedades cujo
os wildcards.
na instrução
me:
a cada cor,
adeira e cujo
íficas para a
tante para a
e datas não
mos ilustrar
os utilizar a
19
SELEC
FROM
WHERE
BETWE
Para ide
CURDAT
subtrair
utilizadas
SELEC
DATE_
FROM
WHERE
DATE_
Podemos
propried
SELEC
CURDA
DATED
AS id
FROM
A função
gestão d
DATE qu
Exercício
Escreva u
CT nome, d
t_proprie
E data_aqu
EEN '2002-
ntificar as p
E() que reto
um determin
s para obter
CT nome, d
_SUB(CURDA
t_proprie
E data_aqu
_SUB(CURDA
s utilizar a s
ades:
CT nome, d
ATE() AS h
DIFF(CURDA
dade
t_proprie
o DATADIFF()
de base de d
e incluem inf
os
uma instruçã
1. selec
2. selec
data_aquis
edade
uisicao
-01-01' AN
propriedades
orna a data
nado interva
a data corre
data_aquis
ATE(),INTE
edade
uisicao >
ATE(),INTE
seguinte exp
data_aquis
hoje,
ATE(), dat
edade;
) permite ca
dados dispon
formação so
ão que permi
ccionar as pro
ccionar as pro
sicao
ND '2002-1
adquiridas
corresponde
alo de tempo
spondente a
sicao,
ERVAL 4 YE
ERVAL 4 YE
pressão para
sicao,
ta_aquisic
lcular o núm
nibilizam fun
bre o tempo
ita:
opriedades a
opriedades a
12-31';
nos últimos
ente ao dia
o a uma data
ao dia de hoje
EAR)
EAR) ;
a determinar
cao)/365
mero de dias
ções semelh
o, isto é, tem
adquiridas no
adquiridas no
4 anos prec
de hoje e
a. Na instruçã
e menos um
r há quanto
entre duas d
hantes para
informação
o ano 2000.
os últimos do
cisamos de
a função DA
ão seguinte
intervalo de
s anos foi a
datas. De ref
a manipulaç
do tipo hh:m
ois anos na re
Caso est
duas funçõe
ATE_SUB() q
as funções r
e 4 anos:
adquirido cad
ferir que os
ção de atribu
mm:ss.
egião do Dou
udo: SQL
es. A função
que permite
eferidas são
da uma das
sistemas de
utos do tipo
uro.
20
6.3. J
O coman
cláusula
relaciona
estrange
estrange
explícita
Por exe
correspo
SELEC
FROM
ORDER
A análise
expressã
na tabela
trata do
cada um
operação
de dados
Para obt
que indic
seguinte
SELEC
FROM
WHERE
ORDER
A cláusu
chave pr
uma das
Junção de
ndo SELECT p
FROM a lis
al a ligação d
eiras. No ent
eiras definida
quais as cha
mplo, se p
ondente pode
CT nome, d
t_proprie
R BY nome,
e do resultad
ão associa a c
a ‘t_regiao’.
produto car
ma das tabel
o importante
s.
er a indicaçã
car quais as
expressão:
CT nome, d
t_proprie
E t_propri
R BY nome;
la WHERE in
rimária da ta
tabelas sele
e tabelas
permite junta
sta das tabe
da informaçã
tanto, a ling
as entre as ta
ves estrange
retendermos
emos tentar
designacao
edade, t_r
, designac
do obtido rev
cada proprie
Embora o re
rtesiano ent
as. Embora
e da teoria do
ão de qual a
chaves prim
designacao
edade, t_r
iedade.reg
;
ndica qual a c
bela ‘t_regia
eccionadas, é
ar a informa
las que se
ão entre tab
guagem SQL
abelas selecc
eiras que se p
s selecciona
a seguinte e
o_regiao
regiao
cao_regiao
vela que a ca
dade existen
esultado obt
re os dois co
esta operaç
os conjuntos
designação
mária e estran
o_regiao
regiao
giao_id =
coluna da ta
o’. Quando s
é necessário
ção de mais
pretende ju
elas relacion
por defeito
ionadas na c
pretende util
ar o nome
xpressão:
o;
ada propried
nte na tabela
tido possa pa
onjuntos, se
ção não seja
s que permite
da região a q
ngeira que li
t_regiao.
abela ‘t_prop
se faz referê
indicar o nom
de uma tabe
ntar. De aco
nadas é reali
o não utiliza
cláusula FROM
lizar.
das proprie
dade é atribu
a ‘t_propried
arecer desad
ndo cada co
a frequentem
e a resolução
que pertence
gam as duas
.regiao_id
priedade’ que
ncia a uma c
me tabela a
ela. Para tal,
ordo com o
zada através
a informaç
M sendo nec
edades e a
uída mais de
ade’ cada um
dequado é im
onjunto defin
mente prete
o de interrog
e cada uma
s tabelas, tal
d
e tem inform
coluna cujo n
que pertenc
Caso est
é necessário
s princípios
s das chaves
ção associada
cessário indic
designação
uma região
ma das regiõ
mportante re
nido por o c
endida, trata
gações comp
das propried
como exem
mação corres
nome consta
e o atributo
udo: SQL
o colocar na
do modelo
primárias e
a às chaves
car de forma
o da região
. De facto, a
ões definidas
eferir que se
conteúdo de
‐se de uma
plexas à base
dades temos
mplificado na
spondente à
em mais de
pretendido.
21
A expres
‘t_propri
Se na e
pretendi
duas col
tabelas).
colunas e
a ligação
dois tipo
seguinte
Inner jo
Recapitu
estrange
apenas a
nas duas
atributos
Uma form
SELEC
nome,
FROM
ON t_
t_reg
A análise
região vi
regiões s
Left join
Diz‐se qu
esquerda
da direita
o da exp
são ‘t_propr
iedade’.
expressão an
das, o result
lunas de co
Nesse caso
envolvidas n
o entre as du
os de ligação
s vamos ilust
oin
ulando, a ju
eira da outra
aqueles regis
s tabelas. A e
s de ligação.
ma alternativ
CT proprie
, designac
t_regiao
_proprieda
giao.regia
e dos resulta
inícola. Assim
sem propried
n e Right Joi
ue temos um
a e apenas o
a que não te
ressão abaix
riedade.regia
nterior tivés
tado apresen
nteúdo exac
o estaríamos
a ligação ent
uas tabelas f
o referidos fa
trar os tipos
nção de du
tabela. Diz‐s
stos em que
expressão do
va de especif
edade_id,
cao_regiao
INNER JOI
ade.regiao
ao_id;
dos revela q
m, nos result
dades atribuí
in
ma Letf Join e
s registos co
m um registo
o:
ao_id’ indica
semos coloc
ntaria todas
ctamente igu
s perante a
tre as tabelas
foi efectuada
azem parte
de ligação en
uas tabelas
se que temos
para um dad
exemplo an
ficar uma Inn
t_regiao.
o
IN t_propr
o_id =
ue são retor
tados retorn
ídas.
entre duas ta
orrespondent
o correspond
que estamos
cado o wild
as colunas d
uais (as colu
denominad
s diz‐se que
a através de
de um tipo
ntre tabelas
faz‐se ligand
s um Inner Jo
do valor do a
terior é do t
ner Join é a s
.regiao_id
riedade
rnados todas
ado são omi
abelas quand
tes da tabela
dente na tab
s a fazer refe
dcard ‘*’ em
das duas tab
unas corresp
da Equi‐Join.
estamos per
uma igualda
de ligação d
mais importa
do a chave
oin entre as
tributo de lig
ipo Inner Joi
eguinte:
d,
s as propried
itidas as pro
do são retorn
a da direita, s
bela da esque
erência à colu
m vez do n
belas, dando
pondentes à
Quando nã
rante uma Na
ade entre as
denominado
antes.
primária d
duas tabelas
gação há um
n porque uti
ades para as
priedades se
nados todos
sendo omitid
erda. Um exe
Caso est
una ‘regiao_i
ome das du
origem à oc
à ligação en
ão existe re
atural Join. U
s respectivas
Inner Join. N
e uma tabe
s quando são
m registo corr
liza a igualda
s quais foi at
em região at
os registos d
dos os registo
emplo de um
udo: SQL
id’ da tabela
uas colunas
corrência de
tre as duas
petição das
Uma vez que
colunas, os
Nas secções
ela à chave
o retornados
respondente
ade entre os
ribuída uma
tribuída e as
da tabela da
os da tabela
ma Left Join é
22
SELEC
nome,
FROM
ON t_
t_reg
Como re
relativos
propried
região qu
em que a
A expres
região at
mesma r
SELEC
desig
FROM
ON t_
t_reg
Esta últim
retornad
esquerda
CT proprie
, designac
t_regiao
_proprieda
giao.regia
sultado dest
a cada uma
ade a inform
ue não tem q
as colunas re
ssão seguinte
tribuída. Par
região.
CT proprie
gnacao_reg
t_proprie
_proprieda
giao.regia
ma expressã
dos todos os
a.
edade_id,
cao_regiao
LEFT JOIN
ade.regiao
ao_id;
ta expressão
a das proprie
mação da ta
qualquer pro
elativas às pro
e permite ob
ra as proprie
edade_id,
giao
edade LEFT
ade.regiao
ao_id;
o é equivale
s registos da
t_regiao.
o
N t_propri
o_id =
obtemos um
edade da reg
bela de regi
opriedade atr
opriedades a
bter uma lista
edades com
nome,
T JOIN t_r
o_id =
ente à seguin
a tabela de
.regiao_id
iedade
ma listagem
gião. Para um
ões é repeti
ribuída, é ret
apresentam o
agem de tod
região atribu
regiao
nte Right Joi
direita e ape
d,
de todas as
ma região q
ida para cad
tornada uma
o valor NULL
as as proprie
uída é apres
in. Diz‐se que
enas os regi
regiões, e ca
ue tem asso
da uma das p
a linha com a
L.
edades, mesm
entada a inf
e temos uma
istos corresp
Caso est
aso existam,
ociada mais d
propriedade
a informação
mo as que nã
formação rel
a Right Join
pondentes d
udo: SQL
as atributos
do que uma
s. Para uma
o da região e
ão tem uma
ativa a essa
quando são
da tabela da
23
SELEC
desig
FROM
ON t_
t_reg
Full join
Um Full J
tabela da
igualdad
Assim, co
propried
região at
definida.
nas versõ
SELEC
FROM
ON t_
SELF JOI
No que d
com ela
na mesm
SELEC
FROM
WHERE
AND p
Quando
utilizar a
respectiv
CT proprie
gnacao_reg
t_regiao
_proprieda
giao.regia
n
Join permite
a esquerda,
e.
omo resultad
ades sendo
tribuída e o
. De referir q
ões actuais d
CT *
t_regiao
_proprieda
IN
diz respeito à
própria. No n
ma região, tal
CT p1.nome
t_proprie
E p1.regia
p1.proprie
na cláusula
a cláusula AS
vos atributos
edade_id,
giao
RIGHT JOI
ade.regiao
ao_id;
e obter uma
combinando
do da expre
apresentado
os atributos
que, embora
do MySQL e d
FULL JOIN
ade.regiao
à junção de t
nosso exemp
como é ilust
e, p2.nome
edade AS p
ao_id = p2
edade_id <
FROM se se
S para renom
s. De referir
nome,
IN t_propr
o_id =
listagem de
o os registos
ssão seguint
o com o valo
das propried
faça parte d
do MS ACces
N t_propri
o_id = t_r
tabelas impo
plo, isto será
trado na inst
e, p1.regi
p1, t_prop
2.regiao_i
<> p2.prop
eleccionada
mear as tabe
ainda a inclu
riedade
todos os reg
s para os cas
te obtemos u
or NULL os a
dades para
a definição d
s.
iedade
regiao.reg
orta referir a
útil para det
trução seguin
iao_id
priedade A
id
priedade_i
a mesma ta
elas e evitar
usão da expr
gistos da tab
sos em que o
uma listagem
atributos das
as regiões q
da linguagem
giao_id;
situação em
terminar qua
nte.
AS p2
id;
bela mais do
a ambiguida
ressão ‘p1.pr
bela da direit
os atributos
m de todas a
s regiões pa
que não tem
m SQL, o Full
m que se pret
ais os pares d
o que uma v
ade que deco
ropriedade_i
Caso est
ta e todos os
de ligação s
as regiões e
ra as propri
m qualquer p
Join não est
tende juntar
de propriedad
vez torna‐se
orre das refe
d <> p2.prop
udo: SQL
s registos da
satisfazem a
de todas as
edades sem
propriedade
tá disponível
r uma tabela
des situadas
obrigatório
erências aos
priedade_id’
24
que perm
tabelas.
Este exe
par (A,B)
exemplo
Quinta d
UNION e
O operad
instrução
propried
SELEC
WHERE
UNION
SELEC
WHERE
De referi
operado
nomes in
duplicad
apresent
Exercício
Escreva u
mite elimina
mplo ilustra
) quando o p
, o par (Quin
os Freires). A
e UNION AL
do UNION pe
o permite o
ades da regiã
CT * FROM
E regiao_i
N
CT * FROM
E regiao_i
ir que o mes
r UNION req
ndicados no
os por defei
te duplicados
os
uma instruçã
1. obte
que a
2. selec
perce
Apre
casta
3. selec
perce
Apre
casta
ar do resulta
ainda uma l
ar (B,A) já te
nta dos Freir
Através da si
LL
ermite comb
obter a uniã
ão 2.
t_proprie
id = 2
t_proprie
id = 1;
smo resultad
quer que o n
resultado o
to sendo ne
s.
ão que permi
r uma listage
a mesma ma
ccionar as m
entagem (om
esente o resu
as ordenadas
ccionar as m
entagem (in
esente o resu
as ordenadas
ado os regis
limitação do
enha ocorrido
res, Quinta d
ntaxe do SQL
binar o result
ão do conju
edade
edade
o poderia se
úmero de co
os correspon
cessário util
ita:
em das marc
arca não surg
arcas juntam
mita dos res
ultado orden
s de acordo c
arcas juntam
clua nos res
ultado orden
s de acordo c
stos que faz
SQL, uma v
o. De facto, a
dos Monges)
L não é possí
tado de dua
unto das pr
er obtido com
olunas selecc
ndentes ao p
izar o operad
cas de vinhos
ge nos resulta
mente com a
sultados as
nado pelo no
com a sua im
mente com a
sultados as
nado pelo no
com a sua im
em referênc
ez que não é
a análise dos
) também oc
ível identifica
s instruções
ropriedades
m a expressã
cionado seja
primeiro sele
dor UNION A
s tintos prod
ados mais de
a designação
marcas que
ome da mar
mportância.
a designação
marcas que
ome da mar
mportância.
cia à mesma
é possível fil
s resultados d
corre na form
ar este tipo d
de SELECT.
da região 1
ão WHERE e
o mesmo no
ect. Além di
ALL se se pre
uzidos na reg
e uma vez.
o das castas
não tem as
ca (de forma
o das castas
não tem as
ca (de forma
Caso est
a propriedad
trar a ocorrê
da query rev
ma (Quinta d
de repetições
Por exemplo
1 com o co
o operador l
os dois selec
isso, o oper
etender que
gião do Dour
utilizadas e
s castas desc
a ascendent
utilizadas e
s castas des
a ascendent
udo: SQL
de nas duas
ência de um
vela que, por
dos Monges,
s.
o, a seguinte
onjunto das
lógico OR. O
ts, sendo os
ado elimina
o resultado
ro. Assegure
a respectiva
criminadas).
e) e com as
a respectiva
criminadas).
e) e com as
25
6.4. F
As funçõ
conjunto
por anal
de todos
SELEC
ORDER
Utilizand
SELEC
De forma
SELEC
Podemos
seguinte
4. selec
orde
do D
5. selec
preço
regiã
Funções d
ões de agrega
o de linhas de
isar o conteú
s os preços da
CT marca,
R BY marca
do as funções
CT MAX(pre
a semelhante
CT AVG(pre
s também co
instrução:
ccionar as c
nadas pela s
ouro.
ccionar as ma
o se situa en
ão do Alentej
de agregaç
ação disponi
e uma tabela
údo da tabe
as marcas pr
preco FRO
a;
s de agregaçã
eco) FROM
e podemos c
eco) FROM
onsultar a va
castas de a
sua designaçã
arcas de vinh
ntre os 10 e
jo.
ção
bilizadas na
a. Vamos ilus
la de marcas
roduzidas:
OM t_marca
ão, podemos
t_marca;
calcular o pre
t_marca;
ariabilidade
lta produtiv
ão) que são u
ho tinto com
os 20€ e qu
linguagem S
strar a sua ut
s através de
a
s obter o pre
eço médio da
do preço da
vidade (orde
utilizadas na
mais de 10
ue são produ
SQL permitem
tilidade atrav
uma instruç
ço máximo d
as marcas pro
s marcas pro
enadas por
produção de
meses de es
uzidas em p
m obter um
vés de alguns
ção que perm
de um vinho
oduzidas atra
oduzidas na
Caso est
cor e, para
e vinhos tint
tágio em ma
ropriedades
valor calcula
s exemplos. C
mite obter u
da seguinte
avés da instr
região do D
udo: SQL
a cada cor,
os da região
adeira e cujo
situados na
ado para um
Comecemos
ma listagem
forma:
rução:
Douro com a
26
SELEC
AVG(p
FROM
t_pro
WHERE
t_mar
AND t
t_pro
AND t
AND d
A expres
na região
pela des
registos s
VARIANC
A função
conteúdo
SELEC
FROM
Se quiser
SELEC
A cláusu
cláusula
não tem
tem uma
CT MAX(pre
preco), ST
t_marca,
opriedade,
E t_marca.
rca_propri
t_marca_pr
opriedade.
t_propried
designacao
são retorna
o do Douro.
ignação da r
seleccionado
CE, que perm
o COUNT, pe
o da tabela d
CT proprie
t_proprie
rmos contar
CT COUNT(*
la COUNT(*)
COUNT(nom
um valor n
a região atrib
eco), MIN(
TDDEV(prec
t_marca_p
, t_regiao
.marca_id
iedade.mar
ropriedade
.proprieda
dade.regia
o_regiao =
o preço máx
De referir qu
região. Outra
os, a função S
mite calcular a
ela sua impo
de proprieda
edade_id,
edade;
o número de
*) FROM t_
) conta o núm
me_atributo)
ulo no atribu
buída podem
(preco),
co)
propriedad
o
=
rca_id
e.propried
ade_id
ao_id = t_
= 'Douro';
ximo, mínimo
ue é necessá
as funções ú
SUM, que pe
a variância d
ortância, me
des no que d
regiao_id
e propriedad
_proprieda
mero de linh
permite con
uto indicado
os utilizar a s
de,
dade_id =
_regiao.re
;
o, médio e o
ário consulta
úteis são a fu
ermite somar
e um atribut
erece uma at
diz respeito a
d
des existente
ade;
has que resu
ntar o núme
o. Por exemp
seguinte inst
egiao_id
desvio padrã
ar quatro tab
unção COUN
r os valores d
to numérico.
tenção espe
aos atributos
s podemos u
ltam da sele
ero de linhas
plo, para con
trução:
ão dos preço
belas para po
T, que perm
de um atribu
cial. Vamos
s ‘propriedad
utilizar a segu
ecção especif
s que resulta
ntar o núme
Caso est
s das marcas
oder efectua
mite contar o
uto numérico
começar po
de_id’ e ‘regia
uinte instruçã
ficada. Por o
am da selecç
ro de propri
udo: SQL
s produzidas
r a restrição
o número de
o, e a função
or analisar o
ao_id’.
ão:
outro lado, a
ção mas que
iedades que
27
SELEC
Finalmen
determin
SELEC
FROM
Exercício
Escreva u
6.5. A
Na instru
ou mais d
Anteriorm
pretende
em cada
SELEC
FROM
WHERE
t_mar
ORDER
Como re
correspo
seus preç
CT COUNT(r
nte, a funçã
nar em quant
CT COUNT(D
t_proprie
os
uma instruçã
1. selec
2. calcu
3. calcu
Agrupame
ução de SELE
de uma, colu
mente vimos
emos analisa
uma das pro
CT proprie
t_marca,
E t_marca.
rca_propri
R BY propr
esultado obt
ondente. Ago
ços podemos
regiao_id)
ão COUNT a
tas regiões s
DISTINCT r
edade;
ão que permi
ccionar a dat
ular o número
ular o número
ento de re
ECT, a cláusu
una. Esta cláu
s como dete
r os preços p
opriedades p
edade_id,
t_marca_p
.marca_id
iedade.mar
riedade_id
temos, para
ora, para calc
s utilizar a se
) FROM t_p
admite aind
ão possuídas
regiao_id)
ita:
a de aquisiçã
o de marcas
o de castas u
egistos
la GROUP BY
usula é, em g
erminar o pre
por propried
podemos utili
marca, pr
propriedad
=
rca_id
d;
cada propr
cular o núme
eguinte instru
propriedad
da a utilizaç
s propriedad
)
ão da proprie
produzidas e
utilizadas na
Y permite ag
geral, utilizad
eço máximo
ade. Se prete
izar a seguint
reco
de
riedade, uma
ro de marcas
ução:
de;
ção da cláu
es podemos
edade mais a
em proprieda
produção de
rupar os reg
da conjuntam
dos vinhos
endermos sa
te instrução:
a listagem d
s produzidas
sula DISTINC
utilizar a seg
antiga.
ades situada
e espumante
istos de acor
mente com as
produzidos.
aber os preço
:
das marcas
s em cada pro
Caso est
CT. Por exe
guinte instru
as na região d
s.
rdo com o va
s funções de
Vamos agor
os dos vinhos
produzidas
opriedade e
udo: SQL
emplo, para
ção:
do Alentejo.
alor de uma,
agregação.
a supor que
s produzidos
e do preço
a média dos
28
SELEC
FROM
WHERE
t_mar
GROUP
A análise
propried
preços d
A cláusu
atributos
funções
formado
SELEC
FROM
GROUP
Por outr
instrução
SELEC
Importan
o resulta
valor pre
seleccion
retornad
a cláusu
agregaçã
Por exem
CT proprie
t_marca,
E t_marca.
rca_propri
P BY propr
e dos resulta
ade ocorre a
esses mesmo
ula GROUP B
s indicados n
de agregaçã
s. Vejamos u
CT cor, CO
t_casta
P BY cor;
o lado, para
o:
CT COUNT(c
nte referir qu
ado uma vez
etendido pa
nar para o re
dos. A regra d
la GROUP B
ão.
mplo, podem
edade_id,
t_marca_p
.marca_id
iedade.mar
riedade_id
ados obtidos
apenas uma
os vinhos.
BY actua no
na cláusula
o permitem
um outro exe
OUNT(casta
a calcular o n
casta_id)
ue nesta últi
que, sendo
ara, por exe
esultado o v
definida é, ap
BY atributos
os calcular o
COUNT(*),
propriedad
=
rca_id
d;
s com a últim
vez, juntame
resultado d
de agrupam
calcular o re
emplo que pe
a_id)
número tota
FROM t_ca
ma instrução
retornado u
mplo, a cor
alor de atrib
penas podem
s que conste
o número de
, AVG(prec
de
ma expressã
ente com o n
de um SELEC
ento. Actua
esultado de
ermite calcul
al de castas
asta;
o não podem
uma única lin
. Da mesma
butos que te
mos seleccion
em nessa m
propriedade
co)
ão permite v
número de v
CT agrupand
ndo em con
operações e
lar o número
definidas da
mos seleccion
nha de result
a forma, na
nham um ún
nar para o re
mesma cláus
es por região
verificar que
inhos nela p
o as linhas
njunto com a
efectuadas pa
o de casta de
tabela pode
nar nenhum
tados, seria i
penúltima
nico valor pa
esultado de u
ula ou o re
através da s
Caso est
o identificad
roduzidos e
do seu resu
a clausula CR
ara cada um
cada:
emos utiliza
atributo das
mpossível de
instrução só
ara cada um
uma instrução
esultado de
seguinte instr
udo: SQL
dor de cada
a média dos
ultado pelos
ROUP BY as
m dos grupos
r a seguinte
s castas para
efinir qual o
ó é possível
dos grupos
o que utilize
funções de
rução:
29
SELEC
FROM
GROUP
Se prete
também
para o re
SELEC
COUNT
FROM
WHERE
GROUP
De refer
‘designac
designaç
definir a
SELEC
FROM
WHERE
GROUP
Em geral
incluir co
na desig
atributo
Quando
relativas
seleccion
para defi
Vamos i
propried
de cada p
CT regiao_
t_proprie
P BY regia
endermos in
a tabela de
esultado se o
CT t_propr
T(propried
t_proprie
E t_propri
P BY t_pro
rir que na
cao_regiao’
ção. Como ta
expressão d
CT designa
t_proprie
E t_propri
P BY desig
l, é recomen
omo segundo
gnação o seg
nos resultad
se utiliza a
aos grupo
nadas antes
inir restriçõe
ilustrar a d
ades temos
propriedade
_id, COUNT
edade
ao_id;
cluir no res
e regiões. No
o mesmo for
riedade.re
dade_id)
edade, t_r
iedade.reg
opriedade.
definição da
que obriga
al, se não se
a seguinte fo
acao_regia
edade, t_r
iedade.reg
gnacao_reg
dável agrupa
o critério de
gundo critér
dos da expres
cláusula G
s formados
de serem pr
es para os gru
diferença at
por região, e
.
T(propried
ultado a de
o entanto, a
colocado na
egiao_id,
regiao
giao_id =
.regiao_id
a tabela ‘t_
a que não p
pretendesse
orma:
ao, COUNT(
regiao
giao_id =
giao;
ar os resultad
agrupament
rio não irá a
ssão.
ROUP BY po
. Enquanto
rocessadas p
upos formad
ravés de u
enquanto a in
dade_id)
signação de
apenas pode
cláusula de G
designaca
t_regiao.
d, designa
_regiao’ foi
possam ser i
e incluir o ide
(proprieda
t_regiao.
dos em prim
to a designaç
alterar os gr
odemos util
a cláusula
pela cláusula
os.
m exemplo
nstrução seg
cada uma
emos seleccio
GROUP BY.
ao_regiao,
.regiao_id
acao_regia
utilizada a
inseridas na
entificador d
ade_id)
.regiao_id
eiro lugar pe
ção. No caso
rupos forma
izar a cláusu
WHERE é
de agrupam
. A instruçã
uinte permit
das regiões
onar o atrib
,
d
ao;
cláusula UN
tabela duas
das regiões n
d
elo identifica
o de não sere
ados mas pe
ula HAVING
utilizada pa
mento, a cláu
ão anterior
te ver o nom
Caso est
temos que
uto ‘designa
NIQUE para
s regiões com
no resultado
ador e, caso s
em admitida
ermite a inc
para defini
ara restringi
usula HAVING
permitiu v
e, a região e
udo: SQL
seleccionar
acao_regiao’
o atributo
m a mesma
poderíamos
se pretenda,
s repetições
clusão desse
ir restrições
ir as linhas
G é utilizada
ver quantas
a dimensão
30
SELEC
t_pro
FROM
WHERE
t_reg
Se quiser
de forma
definir o
como ind
SELEC
FROM
WHERE
AND t
GROUP
Se quise
ha temos
SELEC
FROM
WHERE
AND t
GROUP
HAVIN
Nesta ins
de 70 ha
regiões c
Exercício
Escreva u
CT nome, d
opriedade.
t_proprie
E t_propri
giao.regia
rmos contar
ar os grupos
critério rela
dicado na seg
CT designa
t_proprie
E t_propri
t_propried
P BY desig
rmos agora a
s que utilizar
CT designa
t_proprie
E t_propri
t_propried
P BY desig
NG COUNT(p
strução, a clá
a sejam agru
com duas, ou
os
uma instruçã
designacao
.dimensao
edade, t_r
iedade.reg
ao_id;
o número d
s indicar qua
tivo à selecç
guinte instru
acao_regia
edade, t_r
iedade.reg
dade.dimen
gnacao_reg
apenas selec
r a seguinte i
acao_regia
edade, t_r
iedade.reg
dade.dimen
gnacao_reg
propriedad
áusula ‘t_pro
upadas e a c
u mais, propr
ão em SQL qu
o_regiao,
regiao
giao_id =
e propriedad
ais as propri
ção das prop
ção:
ao, COUNT(
regiao
giao_id =
nsao > 70
giao;
ccionar as re
nstrução:
ao, COUNT(
regiao
giao_id =
nsao > 70
giao
de_id) >=
opriedade.di
cláusula ‘ HA
riedades com
ue permita o
des que tem
iedades que
riedades com
(proprieda
t_regiao.
egiões que te
(proprieda
t_regiao.
2;
mensao > 70
AVING COUN
m o tamanho
bter:
mais de 70
devem ser
m o tamanho
ade_id)
.regiao_id
em duas, ou
ade_id)
.regiao_id
0’ faz com qu
T(propriedad
pretendido s
ha em cada
seleccionad
o pretendido
d
mais, propri
d
ue apenas as
de_id) >= 2’
sejam retorn
Caso est
região, temo
as. Para tal,
o na cláusula
iedades com
s propriedade
faz com qu
nadas nos res
udo: SQL
os que antes
, temos que
a WHERE, tal
m mais de 70
es com mais
e apenas as
sultados.
31
6.6. S
Nesta se
subquery
um SELE
expressã
em aten
parêntes
Devemos
partida.
determin
seguinte
SELEC
Por outr
instrução
SELEC
Agora, p
anteriore
1. uma
das m
2. uma
junta
3. uma
junta
resul
4. uma
prop
5. uma
(iden
6. uma
(iden
são p
Subquerie
ecção vamos
y quando tem
CT retorna u
ão que faça r
nção que nu
sis.
s utilizar um
A forma de
nar qual a áre
instrução:
CT MAX(dim
ro lado, pode
o:
CT designa
para determ
es da seguint
listagem da
marcas.
listagem da
amente com
listagem da
amente com
ltados às ma
listagem da
riedade.
listagem d
ntificado pela
listagem d
ntificado pela
produzidas m
es
s ilustrar um
mos uma ins
um conjunto
referência a
uma subque
a subquery q
utilização m
ea de vinha d
mensao) FR
emos determ
acao_regia
minar a desig
te forma:
as marcas jun
as marcas p
o número de
as marcas p
o número d
rcas que util
as regiões e
do número
a sua designa
do número
a sua design
mais de 150 m
m conceito i
strução SELEC
de linhas e
uma tabela
ery a instruç
quando a qu
mais frequen
da região vin
ROM t_regi
minar qual a
ao, dimens
gnação da m
ntamente co
produzidas e
e castas utiliz
produzidas e
de castas ut
izam duas ou
em há pelo
total de g
ação).
total de g
nação) limita
mil garrafas.
mportante n
CT dentro de
colunas em
ou a um valo
ção interior
ery a escrev
nte de subqu
nícola com m
iao;
a dimensão d
sao FROM t
maior região
om o número
em propried
zadas em cad
em propried
ilizadas em
u mais castas
menos uma
arrafas prod
arrafas prod
ndo os resu
no SQL, as
e outra instr
formato de t
or por uma i
tem obriga
er está depe
ueries é na c
maior área de
das diferent
t_regiao;
o vinícola p
o de castas
ades situada
da uma das m
ades situada
cada uma d
s.
a marca ass
duzidas par
duzidas par
ltados aos t
subqueries.
ução SELECT
tabela, pode
instrução de
atoriamente
endente de u
cláusula WH
e plantação d
es regiões v
odemos enc
Caso est
utilizadas em
as na região
marcas.
as na região
as marcas, l
sociada a m
ra cada tipo
ra cada tipo
ipos de vinh
Diz‐se que
T. De facto, u
emos substitu
e SELECT. Imp
de ser colo
um valor des
ERE. Por exe
de vinha pod
vinícolas com
cadear as d
udo: SQL
m cada uma
o do Douro
o do Douro
imitando os
ais de uma
o de vinho
o de vinho
ho dos quais
temos uma
uma vez que
uir qualquer
portante ter
ocada entre
conhecido à
emplo, para
emos usar a
m a seguinte
uas queries
32
SELEC
FROM
(SELE
Note qu
coluna, r
‘=’ a que
efectuad
Neste tip
único (=,
valores (
Vamos il
Podemos
seguinte
SELEC
(SELE
Se quiser
seguinte
SELEC
WHERE
AND c
(SELE
Esta últim
CT designa
t_regiao
ECT MAX(di
e, o atributo
retorna um v
ery interior t
da.
po de querie
, >, <, <=, <=
IN, ANY, ALL
ustrar a utiliz
s selecciona
instrução:
CT marca F
ECT AVG(pr
rmos seleccio
:
CT marca F
E t_marca.
casta_id I
ECT casta_
ma questão p
acao_regia
WHERE dim
imensao) F
o ‘dimensao
valor também
em obrigato
es há um gru
=, <>) e um
, EXISTS). Qu
zação de algu
r as marcas
FROM t_mar
reco) FROM
onar as marc
FROM t_mar
.marca_id
IN
_id FROM t
podia ter sido
ao, dimens
mensao =
FROM t_reg
o’ é do tipo
m numérico,
oriamente de
upo de opera
grupo de op
ualquer dos o
uns destes o
cujo preço
rca WHERE
M t_marca)
cas que usam
rca, t_mar
= t_marca
t_casta WH
o resolvida s
sao
giao);
numérico e
através da f
e retornar um
adores que o
peradores qu
operadores r
peradores.
é superior a
preco >
);
m pelo meno
rca_casta
a_casta.ma
HERE cor =
em recorrer
a query int
unção MAX.
m valor unic
obrigam a qu
ue permite a
eferidos pod
ao preço mé
os uma casta
arca_id
= ‘branca’
às sub‐queri
terior, além
Como estam
o para que a
ue a query in
a comparaçã
de ser preced
édio de toda
branca pode
’);
ies através d
Caso est
de retornar
mos a utilizar
a comparaçã
nterior retor
ão com um c
dido do opera
as as marcas
emos utilizar
a seguinte in
udo: SQL
r uma única
r o operador
ão possa ser
ne um valor
conjunto de
ador NOT.
s através da
r a instrução
nstrução:
33
SELEC
WHERE
AND t
AND c
Para det
correspo
valores q
de subqu
SELEC
FROM
WHERE
t_tip
AND (
(SELE
FROM
A seguin
EXISTS ve
NOT imp
SELEC
WHERE
(SELE
WHERE
De referi
query ex
exterior.
caso exe
Quando
sendo n
correlaci
CT marca F
E t_marca.
t_marca_ca
cor = ‘bra
terminar a m
onde a uma
que é compa
ueries não es
CT marca,
t_marca,
E t_marca.
po_vinho.t
(t_marca.t
ECT tipo_v
t_marca G
nte instrução
erifica se a q
plica que a ex
CT marca F
E NOT EXIS
ECT marca_
E t_marca_
ir que a instr
xterior. Note
Neste tipo d
cutada tanta
a query inte
nestes casos
onada é a qu
FROM t_mar
.marca_id
asta.casta
anca’;
marca de vin
subquery do
arado com o
stão disponív
designaca
t_tipo_vi
.tipo_vinh
tipo_vinho
tipo_vinho
vinho_id,
GROUP BY t
o selecciona
query interio
xpressão seja
FROM t_mar
STS
_id FROM t
_casta.mar
rução anterio
e que na ex
de queries a q
as vezes quan
rior não dep
a query in
uery seguinte
rca, t_mar
= t_marca
a_id = t_c
nho mais car
o tipo multi
par de valo
veis no MS AC
ao_tipo_vi
inho
ho_id =
o_id
o_id, prec
MAX(preco
tipo_vinho
as marcas p
or retorna pe
a válida quan
rca
t_marca_ca
rca_id = t
or é do tipo
pressão WH
query interio
ntas as marca
pende da que
nterior exec
e, que permi
rca_casta,
a_casta.ma
casta.cast
ra de cada t
‐coluna, um
res correspo
CCESS).
inho
co) IN
o)
o_id);
para as qua
elo menos u
ndo a subque
asta
t_marca.ma
query correl
HERE da que
or é executad
as definidas
ery exterior d
cutada uma
te selecciona
, t_casta
arca_id
ta_id
tipo podemo
a vez que t
ondente reto
is não estão
m registo, se
ery não retor
arca_id);
acionada, da
ery interior s
da para cada
na tabela ‘t_
diz‐se que te
única vez.
ar a marca m
os utilizar a
emos na qu
ornado pela q
o identificada
endo que ne
na qualquer
ado que a qu
se faz referê
linha da que
_marca’.
emos uma qu
Um exemp
mais cara:
Caso est
seguinte ins
uery exterior
query interio
as as castas
este caso a u
registo.
uery interior
ência à marc
ery exterior,
uery não‐cor
plo de uma
udo: SQL
strução, que
r um par de
or (este tipo
. A cláusula
utilização do
depende da
ca da query
sendo nesta
relacionada,
query não
34
SELEC
WHERE
Importan
pretende
SELEC
(SELE
(SELE
Vamos a
inferior a
SELEC
WHERE
(SELE
O operad
É ainda p
cujos vin
SELEC
WHERE
GROUP
HAVIN
(SELE
(SELE
FROM
WHERE
GROUP
Na instru
instrução
resultant
CT marca F
E preco =(
nte também
ermos selecc
CT marca F
ECT MAX(pr
ECT MAX(pr
gora ilustrar
ao de todas a
CT marca,
E preco <
ECT preco
dor ‘< ALL’ é
possível colo
hos tem a m
CT proprie
E t_marca.
P BY t_mar
NG AVG(teo
ECT MAX(me
ECT AVG(te
t_marca,
E t_marca.
P BY t_mar
ução anterio
o de SELECT
te desse SELE
FROM t_mar
(SELECT MA
referir que n
cionar a segu
FROM t_mar
reco) FROM
reco) FROM
r o operado
as marcas co
preco FRO
ALL
FROM t_ma
equivalente
car uma sub
mais elevada g
edade_id F
.marca_id
rca_propri
or) =
edia) FROM
eor) AS me
t_marca_p
.marca_id
rca_propri
or é necessá
a substituir
ECT.
rca
AX(preco)
não existe lim
nda marca m
rca WHERE
M t_marca
M t_marca)
ALL com um
m um teor a
OM t_marca
arca WHERE
a definir ‘ < (
bquery na clá
graduação m
FROM t_mar
= t_marca
iedade.pro
M
edia
propriedad
= t_marca
iedade.pro
ário utilizar
r uma referê
FROM t_ma
mite para o n
mais cara pod
preco =
WHERE pre
));
ma instrução
lcoólico de 1
a
E teor = 1
(SELECT MIN
áusula HAVIN
média podem
rca, t_mar
a_propried
opriedade_
de
a_propried
opriedade_
o alias ‘AS
ência a uma
arca);
número de q
demos recorr
eco <
que permite
14%:
14);
N(x)…)’.
NG. Por exem
os utilizar a s
rca_propri
dade.marca
_id
dade.marca
_id) AS ma
marcas’ dad
tabela é ne
queries encad
rer à seguint
e seleccionar
mplo, para se
seguinte exp
iedade
a_id
a_id
arcas);
do que sem
cessário atri
Caso est
deadas. Por
e instrução:
r as marcas c
eleccionar a p
pressão:
pre que se
ibuir um nom
udo: SQL
exemplo, se
cujo preço é
propriedade
utiliza uma
me á tabela
35
Caso estudo: SQL
36
Exercícios
Escreva uma instrução que permita:
1. seleccionar o nome da propriedade mais antiga.
2. obter a marca com teor alcoólico superior a 13.5% que tem maior tempo de estágio em
barricas de madeira.
3. seleccionar a casta utilizada no maior número de vinhos.
4. seleccionar o preço médio das marcas que não tem as castas descriminadas.
5. seleccionar o preço médio das marcas que são produzidas com uvas de apenas uma casta.
7. Criação de vista (views)
No SQL as vistas (views) permitem a criação de uma janela sobre uma tabela ou um conjunto de tabelas.
Esta funcionalidade é importante por permitir filtrar a informação a que cada utilizador pode ter acesso.
Um exemplo da utilidade das vistas será a criação de uma vista com as marcas de uma determinada
propriedade uma vez que possibilita disponibilizar essa informação sem revelar as marcas de outras
propriedades. A instrução seguinte permite criar uma vista com as marcas da Quinta de Santa Teresa:
CREATE VIEW marcas_santa_teresa AS
SELECT t_marca.* FROM t_marca, t_marca_propriedade
WHERE t_marca.marca_id = t_marca_propriedade.marca_id
AND propriedade_id = 1;
É assim possível utilizar a vista criada como uma tabela normal, mas ao mesmo tempo reservando
registos que se consideram confidenciais. As vistas poderão também ser úteis para simplificar o acesso às
tabelas através da omissão de atributos menos importantes ou da criação de uma vista para mascarar o
acesso a várias tabelas através de uma query complexa.
Uma vista pode ser eliminada através de uma instrução como a seguinte:
DROP VIEW marcas_santa_teresa;
Caso estudo: SQL
37
8. ANEXO – script para criação da base de dados
tabela t_regiao
CREATE TABLE t _ reg iao (
reg iao_ id INT PRIMARY KEY,
des ignacao_ reg iao VARCHAR(15 ) NOT NULL UNIQUE,
desc r i cao TEXT) ;
ALTER TABL E t_ reg iao ADD d imensao INT;
INSERT INTO t_ reg iao ( reg iao_ id ,des ignacao_ reg iao ,desc r i cao ) VALUES (1 , 'Dou ro ' , 'A reg ião do Douro loca l iza -se no Nordes te de Por tuga l , rodeada pe las se r ras do Marão e Montemuro . A á rea v i t í co la ocupa ce rca de 40000 hec ta res , apesar da reg ião se p ro longar po r ce rca de 250000 hec ta res . O r i o Douro e os seus a f l uen tes , como por exemplo o Tua e o Corgo , co r rem em va les p ro fundos e a ma io r par te das p lan tações são enca i xadas nas bac ias h id rog rá f i cas dos r i os . ' ) ;
UPDATE t _ reg iao SET d imensao= 40000 WHERE reg iao_ id = 1 ;
INSERT INTO t_ reg iao ( reg iao_ id ,des ignacao_ reg iao ,desc r i cao ,d im ensao) VALUES (2 , 'A len te jo ' , 'O A len te jo é uma das ma io res reg iões v i t i v i n íco las de Po r tuga l , o nde a v is ta se perde em ex tensas p lan íc i es que apenas são in te r romp idas po r pequenos mon tes . Es ta reg ião quen te e seca bene f ic i ou de inúmeros inves t imentos no sec to r v i t i v in í co la que se t raduz iu na p rodução de a lguns dos me lho res v inhos po r tugueses e consequen temente , no reconhec imen to i n ternac iona l dos v i nhos a lente janos . ' , 22000) ;
INSERT INTO t_ reg iao ( reg iao_ id ,des ignacao_ reg iao ,d imensao) VALUES (3 , 'Dão ' ,20000) ;
INSERT INTO t_ reg iao ( reg iao_ id ,des ignacao_ reg iao ,d imensao) VALUES (4 , 'Ba i r rada ' , 10000) ;
INSERT INTO t_ reg iao ( reg iao_ id ,des ignacao_ reg iao , d imensao) VALUES (5 , 'Es t remadura ' , nu l l ) ; (5 , 'Es t remadura ' ,nu l l ) ;
tabela t_propriedade
CREATE TABLE t _p ropr i edade(
p ropr iedade_ id INT PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
endereco VARCHAR(50) ,
te le fone VARCHAR(20 ) ,
ema i l VARCHAR(30) ,
d imensao INT,
da ta_aqu is icao DATE,
reg iao_ id INT ,
FOREIGN KEY ( reg iao_ id ) REFERENCES t _ reg iao( reg iao_ id ) ) ;
INSERT INTO t_p rop r i edade VALUES(1 , 'Qu in ta de San ta Te resa ' , 'Peso da Régua ' , ' 254 223
Caso estudo: SQL
38
344 ' , ' san ta te resa@v inhos .p t ' , 60 , '2000 /01 /12 ' , 1 ) ;
INSERT INTO t_p rop r i edade VALUES(2 , 'Qu in ta da Encos ta ' , 'Car rega l do Sa l ' , ' 232 423 454 ' , ' encos ta@v inhos .p t ' , 120 , '2000/08 /22 ' , 3 ) ;
INSERT INTO t_p rop r i edade VALUES(3 , 'Qu in ta das Espo ras ' , 'Reguengos de Monsaraz ' , ' 266 587 876 ' , ' espo ras@mai l . p t ' , 200 , '2002 /03 /13 ' , 2 ) ;
INSERT INTO t_p rop r i edade VALUES(4 , 'Qu in ta dos Fre i res ' , 'P inhão ' , ' 254 654 777 ' , ' q_ f re i res@mai l . p t ' ,100 , '2004 /06 /17 ' , 1 ) ;
INSERT INTO t_p rop r i edade VALUES(5 , 'Casa da P lan íc ie ' , 'Macedo de Cava le i ros ' , nu l l , ' p l an i c i e@mai l .p t ' , 40 , '2007 /05 /11 ' , nu l l ) ;
INSERT INTO t_p rop r i edade VALUES(6 , 'Qu in ta dos Monges ' , 'P inhão ' , ' 254 777 654 ' , 'mon jes@mai l .p t ' , 133 , '2006 /03 /14 ' ,1 ) ;
INSERT INTO t_p rop r i edade (p ropr i edade_ id ,nome,endereco ,d imensao ,da ta_aqu is i cao, reg iao_ id ) VALUES (7 , 'Casa dos Pessegue i ros ' , 'Co la res ' ,75 , '2008 /11/19 ' ,5 ) ;
INSERT INTO t_p rop r i edade (p ropr i edade_ id ,nome,endereco ,d imensao ,da ta_aqu is i cao, reg iao_ id ) VALUES (8 , 'São Cr i s tóvão ' , 'P inhão ' ,38 , ' 2009 /01 /14 ' , 1 ) ;
tabela t_tipo_vinho
CREATE TABLE t _ t i po_v inho(
t i po_v inho_ id INT PRIMARY KEY AUTO _INCREMENT,
des ignacao_ t i po_v inho VARCHAR(15 ) NOT NULL UNIQUE,
desc r i cao TEXT) ;
INSERT INTO t_ t ipo_v inho (des ignacao_ t ipo_v inho ,desc r i cao ) VALUES ( 'T in to ' , 'P roduz idos a par t i r da fe rmentação de uvas T in tas ' ) ;
INSERT INTO t_ t ipo_v inho (des ignacao_ t ipo_v inho ,desc r i cao ) VALUES ( 'Branco ' , 'Os v inhos b rancos t ranqu i los são fe i tos a pa r t i r da fe rmen tação de uvas sem pe le . ' ) ;
INSERT INTO t_ t ipo_v inho (des ignacao_ t ipo_v inho ,desc r i cao ) VALUES ( 'Rosé ' , ' I nd icação Os v inhos rosés são e labo rados a par t i r de cas tas T in tas e a t ravés de um p rocesso espec ia l de fe rmentação . Após um cur to per íodo de tempo re t i ram-se as pe les das uvas , po is j á fo i t rans fe r i da a lguma co lo ração rosada ao v inho . Depo is segue-se um processo de fe rmen tação semelhan te ao do v inho b ranco ( fe rmentação sem pe les ) . ' ) ;
INSERT INTO t_ t ipo_v inho (des ignacao_ t ipo_v inho ,desc r i cao ) VALUES ( 'Espuman te ' , ' Os v inhos espumantes d is t i nguem-se pe la p resença de d ióx ido de ca rbono p roven ien te da fe rmentação secundár ia , que lhes a t r ibu i a t íp i ca “bo lha ” e espuma. Norma lmen te os v i nhos espumantes têm a sua fase f i na l de fe rmentação em gar ra fa (método c láss i co ou champanhês) . Ex is te a inda o método con t ínuo onde a fe rmentação se e fec tua a t ravés da passagem do v inho por d i fe ren tes tanques (onde o v i nho fe rmen ta e enve lhece ) e o mé todo charmat onde a fe rmen tação se rea l iza numa cuba fechada . ' ) ;
INSERT INTO t_ t ipo_v inho (des ignacao_ t ipo_v inho ,desc r i cao ) VALUES ( 'Generoso ' , ' Os v inhos gene rosos ou l i co rosos resu l tam da ad ição de á lcoo l (á lcoo l pu ro , agua rdente ou b randy ) duran te o p rocesso de fe rmen tação , de modo a suspender o p rocesso de t rans fo rmação dos açúca res em á l coo l . Des te modo, o v i nho f i ca ma is doce e a lcoó l i co do que qua lque r v i nho de mesa ' ) ;
Caso estudo: SQL
39
tabela t_marca
CREATE TABLE t _marca (
marca_ id INT PRIMARY KEY,
marca VARCHAR(50) NOT NULL ,
teor FLOAT,
ta ra FLOAT,
p reco FLOAT,
num_gar ra fas INT,
meses_es tag io FLOAT,
ca rac te r i s t i cas TEXT,
t i po_v inho_ id INT ,
FOREIGN KEY ( t i po_v inho_ id ) REFERENCES t_ t ipo_v inho ( t i po_v inho_ id ) ) ;
INSERT INTO t_marca VALUES(1 , 'Qu in ta das Esporas ' , 13 .0 , 0 .75 ,8 ,60000,10 , 'A roma concent rado , sobressa indo os f ru tos verme lhos maduros . Boa es t ru tu ra com tan inos redondos e f ina l pers is ten te ' , 1 ) ;
INSERT INTO t_marca VALUES(2 , 'Qu in ta das Esporas Rese rva ' , 13 .5 ,0 .75 ,15 ,15000,17 , 'A roma concen t rado , no ta ba l sâmicas de made i ra de ca rva lho , f ru to de f igo maduro e amora . Mui to enco rpado , ca rnudo com tan inos maduros e redondos . ' , 1 ) ;
INSERT INTO t_marca VALUES(3 , 'Qu in ta das Esporas Tour iga Nac ina l ' , 14 .0 ,0 .75,14 ,12500 ,15 , 'Mu i to concen t rado , no ta ba l sâmicas de made i ra de ca rva lho , f ru tos ve rme lhos bem maduros e v io l e ta . Equ i l i b rado com tan inos maduros e redondos . ' , 1 ) ;
INSERT INTO t_marca VALUES(4 , 'Qu in ta da Encos ta - Espuman te ' ,nu l l ,0 .75,7 ,5000 ,0 , 'Cas tas fe rmentadas sepa radamente em cubas de inox com con t ro lo de tempera tu ra . A segunda fe rmen tação fo i e fec tuada em gar ra fa para conserva r o a roma f l o ra l e f ru tado . ' , 4 ) ;
INSERT INTO t_marca VALUES(5 , 'Qu in ta da Encos ta - V inhas Ve lhas ' ,13 .0 ,0 .75 ,30 ,5000,15 , 'Cas tas fe rmentadas sepa radamente em cubas de inox com con t ro lo de tempera tu ra . A segunda fe rmen tação fo i e fec tuada em gar ra fa para conserva r o a roma f l o ra l e f ru tado . ' , 1 ) ;
INSERT INTO t_marca VALUES(6 , 'Espo ras - Reserva ' ,14 .5 ,0 .75 ,12 ,30000 ,12 , 'pe r fumado, suge r indo f ru ta ve rmelha de l i cada e l i ge i ro t oque f lo ra l , bem in tegrado com a made i ra nova . A boca os tenta tex tu ra sedosa , com vár ias camadas de f ru ta sob repos tas , que l he conferem grande r iqueza e comp lex idade. ' ,1 ) ;
INSERT INTO t_marca VALUES(7 , 'Espo ras - T r i ncade i ra ' , 14 .5 ,0 .75 ,10 ,10000 ,6 , ' v i nho mac io , com aroma complexo da cas ta que lhe deu o r i gem e um sabor r i co a f ru tos ve rme lhos . Pa ladar ave ludado e equ i l i b rado com uma es t ru tu ra de tan inos suaves . ' , 1 ) ;
INSERT INTO t_marca VALUES(8 , 'Espo ras - Gar ra fe i ra ' ,14 .5 ,0 .75 ,3 0 ,7000 ,12 , 'V inho de cor i n tensa , a roma f i no com suges tões a f ru ta madura , e no tas de tabaco . Na boca é denso com um toque ba lsâmico . ' , 1 ) ;
INSERT INTO t_marca VALUES(9 , 'Duas Casas ' , 14 .0 ,0 .75,20 ,17500 ,18 , 'Cor in tensa e l impa , com re f l exos ve rmelhos . Aroma f resco e f ru tado , com no tas de cere ja e de ame ixa . Mac io e vo lumoso na boca ap resen tando uma es t ru tu ra ave ludada . ' , 1 ) ;
INSERT INTO t_marca VALUES(10 , 'Duas Casas - Rese rva ' , 14 .0 ,0 .75,40 ,35000,14 , 'Cor densa e b r i l han te , com re f l exos verme lho escu ro . Aroma f lo ra l e de f ru tos s i l ves t res . Boa es t ru tu ra , mac io e com
Caso estudo: SQL
40
f i na l de boca pers is tente . ' ,1 ) ;
INSERT INTO t_marca VALUES(11 , 'Duas Casas - Branco ' ,12 .5 ,0 .75 ,6 ,75000,0 , ' ' , 2 ) ;
INSERT INTO t_marca VALUES(12 , 'B ranco dos Fre i res ' , 11 .5 ,0 .75 ,7 ,30000,2 , ' ' , 2 ) ;
INSERT INTO t_marca VALUES(13 , 'T in to dos Fre i res ' , 12 .5 ,0 .75,9 ,50000 ,6 , ' ' , 1 ) ;
tabela t_casta
CREATE TABLE t _cas ta (
cas ta_ id INT PRIMARY KEY,
des ignacao_cas ta VARCHAR(25 ) NOT NULL UNIQUE,
co r VARCHAR(6) ,
p rodu t i v i dade VARCHAR(5 ) ,
desc r i cao TEXT) ;
CREATE INDEX IDXcor ON t _cas ta (cor ) ;
INSERT INTO t_cas ta VALUES(1 , 'Tou r i ga Nac iona l ' , ' T i n ta ' , 'Ba ixa ' , ' Os bagos têm uma e levada concen t ração de açúca r , co r e a romas. Os v inhos p roduz idos ou m is tu rados com a cas ta Tour i ga Nac iona l são bas tan te equ i l i b rados , a lcoó l icos e com boa capac idade de enve lhec imen to . ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idade) VALUES(2 , 'T in ta ro r i z ' , 'T in ta ' , 'A l ta ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idade) VALUES(3 , 'T in ta bar roca ' , 'T in ta ' , 'Méd ia ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idad e) VALUES(4 , 'T in to Cão ' , 'T in ta ' , 'Ba ixa ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_casta ,co r ,p rodu t i v idade) VALUES(5 , 'Ma lvas ia F ina ' , 'B ranca ' , 'Méd ia ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idade) VALUES(6 , 'Mosca te l ' , 'B ranca ' , 'Méd ia ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idade) VALUES(7 , 'Ve rde lho ' , 'B ranca ' , 'Méd ia ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idade) VALUES(8 , 'Tour iga Franca ' , 'T in ta ' , 'Méd ia ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idad e) VALUES(9 , 'T in ta Amare la ' , 'T in ta ' , 'Ba ixa ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idade) VALUES(10 , 'Sousão ' , 'T in ta ' , 'Méd ia ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idad e) VALUES(11 , 'Mar ia Gomes ' , 'B ranca ' , 'A l t a ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_casta ,co r ,p rodu t i v idade) VALUES(12 , 'A r i n to ' , 'B ranca ' , 'Méd ia ' ) ;
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idade) VALUES(13 , 'Baga ' , ' T i n ta ' , 'A l t a ' ) ;
Caso estudo: SQL
41
INSERT INTO t_cas ta (cas ta_ id ,des ignacao_cas ta ,co r ,p rodu t i v idade) VALUES(14 , 'A l i can te Bousche t ' , 'T in ta ' , 'Méd ia ' ) ;
tabela t_marca_propriedade
CREATE TABLE t _marca_propr iedade(
marca_ id INT,
p ropr iedade_ ID INT,
PRIMARY KEY(marca_ id , p ropr i edade_ id ) ,
FOREIGN KEY(marca_ id ) REFERENCES t_marca (marca_ id ) ,
FOREIGN KEY(prop r i edade_ id ) REFERENCES t_p rop r i edade(prop r i edade_ id ) ) ;
INSERT INTO t_marca_p ropr i edade VALUES(1 ,3 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(2 ,3 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(3 ,3 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(4 ,2 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(5 ,2 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(6 ,3 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(7 ,3 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(8 ,3 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(9 ,1 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(9 ,4 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(10 ,1 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(10 ,4 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(11 ,1 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(11 ,4 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(12 ,4 ) ;
INSERT INTO t_marca_p ropr i edade VALUES(13 ,4 ) ;
tabela t_marca_casta
CREATE TABLE t_marca_cas ta (
marca_ id INT,
cas ta_ id INT ,
pe rcen tagem FLOAT,
PRIMARY KEY(marca_ id , cas ta_ id ) ,
FOREIGN KEY(marca_ id ) REFERENCES t_marca (marca_ id ) ,
FOREIGN KEY(cas ta_ id ) REFERENCES t _cas ta (cas ta_ id ) ) ;
INSERT INTO t_marca_cas ta VALUES (1 ,8 ,0 .2 ) ;
INSERT INTO t_marca_cas ta VALUES (1 ,1 ,0 .3 ) ;
Caso estudo: SQL
42
INSERT INTO t_marca_cas ta VALUES (1 ,2 ,0 .5 ) ;
INSERT INTO t_marca_cas ta VALUES (2 ,8 ,0 .6 ) ;
INSERT INTO t_marca_cas ta VALUES (2 ,1 ,0 .2 ) ;
INSERT INTO t_marca_cas ta VALUES (2 ,2 ,0 .2 ) ;
INSERT INTO t_marca_cas ta VALUES (4 ,11 ,0 .95 ) ;
INSERT INTO t_marca_cas ta VALUES (4 ,12 ,0 .05 ) ;
INSERT INTO t_marca_cas ta VALUES (5 ,13 ,1 ) ;
INSERT INTO t_marca_cas ta VALUES (6 ,2 ,0 .7 ) ;
INSERT INTO t_marca_cas ta VALUES (6 ,9 ,0 .3 ) ;
INSERT INTO t_marca_cas ta VALUES (7 ,9 ,1 ) ;
INSERT INTO t_marca_cas ta VALUES (8 ,2 ,nu l l ) ;
INSERT INTO t_marca_cas ta VALUES (8 ,14 ,nu l l ) ;
INSERT INTO t_marca_cas ta VALUES (9 ,1 ,0 .2 ) ;
INSERT INTO t_marca_cas ta VALUES (9 ,2 ,0 .4 ) ;
INSERT INTO t_marca_cas ta VALUES (9 ,8 ,0 .4 ) ;
INSERT INTO t_marca_cas ta VALUES (10 ,1 ,0 .8 ) ;
INSERT INTO t_marca_cas ta VALUES (10 ,3 ,0 .05 ) ;
INSERT INTO t_marca_cas ta VALUES (10 ,8 ,0 .15 ) ;
INSERT INTO t_marca_cas ta VALUES (11 ,7 ,nu l l ) ;
INSERT INTO t_marca_cas ta VALUES (11 ,12 ,nu l l ) ;