caso de estudo sql -...

42
Caso estudo: SQL 1 CASO DE ESTUDO: SQL – Introdução através de exemplos José 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 ilustrase 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,

Upload: vunga

Post on 01-May-2018

219 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    Caso estudo: SQL 

 

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, 

Page 2: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    Caso estudo: SQL 

 

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

-%

*

*

*

*

Page 3: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 à 

Page 4: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

 

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)); 

Page 5: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    Caso estudo: SQL 

 

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: 

Page 6: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    Caso estudo: SQL 

 

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. 

Page 7: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

s  resultados 

acrescentar 

ção: 

ADD ou para 

emplo, para 

Alentejo. 

de  todas  as 

 

Page 8: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

Figura 6

4. Cria

Nesta  se

correspo

tabela co

CREAT

propr

nome

ender

telef

email

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 

Page 9: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    Caso estudo: SQL 

 

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. 

Page 10: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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: 

Page 11: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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 

Page 12: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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: 

Page 13: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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: 

Page 14: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 15: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 16: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 17: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 18: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 19: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 20: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 21: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 22: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 23: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 24: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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

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 

Page 25: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 26: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 27: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 28: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 29: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 30: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 31: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 32: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 33: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 34: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 35: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

 

 

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 

Page 36: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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;

   

Page 37: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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

Page 38: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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 ' ) ;

Page 39: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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

Page 40: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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 ' ) ;

Page 41: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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 ) ;

Page 42: Caso de Estudo SQL - tassiogoncalves.com.brtassiogoncalves.com.br/wp-content/uploads/2016/11/Apostila-Inicio... · no MySQL 5.1, duas populares ferramentas para gestão de bases de

    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 ) ;