Beruflich Dokumente
Kultur Dokumente
WebSQL
Metodologia de Ensino
Curso centrado em aulas prticas utilizando um ambiente desenvolvido para Web, com
um interpretador inteligente de comandos; o processo de avaliao inteligente e semiautomtico; os mdulos so essencialmente de laboratrio, aps alguns conceitos e
exemplos o aluno convidado a fazer exerccios de fixao tericos e prticos.
CARGA HORRIA: 30 Horas
Habilidades e competncias:
Conhecer a sintaxe e a semntica da linguagem SQL;
Conhecer as diferentes formas de uso da SQL: embutida em programas ou na
console de um cliente; em linhas de comandos ou em scripts;
Conhecer um esquema de Banco de Dados relacional: como um conjunto de
tabelas relacional atravs de chaves primrias e estrangeiras;
Diferenciar as principais operaes da lgebra relacional: projeo, seleo e
juno; saber utiliz-las em consultas;
Saber resolver problemas de armazenamento e consulta de dados em Banco de
dados relacionais atravs da linguagem de consulta SQL:
1. Saber criar um banco;
2. Saber Incluir, Alterar e Excluir dados;
3. Dominar a escrita de consultas em SQL;
4. Usar operaes de seleo, projeo e juno;
5. Usar operaes de agrupamento;
WebSQL
WebSQL
5.3.1
Sub-consulta para correlacionar dados ---------------------------------------------------- 63
5.3.2
Usando as clusulas EXISTS e NOT EXISTS. ------------------------------------------ 63
5.3.3
Usando ALL, SOME, ANY ----------------------------------------------------------------- 64
5.4
Exerccios: ----------------------------------------------------------------------------------------------- 65
WebSQL
WebSQL
Por outro lado neste BD vemos tambm uma inconsistncia nos dados: O
professor da turma C de Natao o Silva que tambm aluno da mesma turma,
conforme os dados da tabela Participante. Num BD deve-se desenvolver o projeto e as
aplicaes de forma que as inconsistncias nos dados sejam minimizadas.
Pessoa
Turma
cdpessoa nome
fone
Participante
cdturma nome
profe
pessoa
turma
Obilac 260088
Volei
Silva
282677
Karate
Cabral 260088
Natao 2
Lobato 174590
Mateus
Linha
(Tupla)
Coluna
(atributo)
cdpesssoa
1
2
3
4
5
nome
Obilac
Silva
Cabral
Lobato
Mateus
fone
260088
252677
260088
174590
NULL
Na definio de uma tabela, cada linha formada por uma lista ordenada de
colunas (cdpessoa, nome, fone) (1, Obilac, 252677). As linhas no so ordenadas entre
si; existe uma clusula na SQL que permite definir a ordem das linhas para apresentao
em relatrios.
Uma coluna (nome) assume um valor atmico de um dos tipos de dados
(tambm chamados de domnios de dados), por exemplo, numeric, char. Valores das
colunas podem ser vazios (NULL) em certos casos.
As tabelas esto interligadas atravs de relacionamentos. Por exemplo, as trs
tabelas acima esto interligadas: fazendo pessoa(cdpessoa) = participante(pesssoa) a
tabela pessoa esta ligada a tabela Participante; e fazendo turma(cdturma) =
participante(turma) a tabela turma est ligada a tabela participante. Alm disso a tabela
turma tambm est ligada a tabela pessoa: turma(profe) = pessoa(cdpessoa).
Um BD definido por um esquema relacional (que apresentado mais
adiante), que define as tabelas e os relacionamentos entre as tabelas. O esquema do BD
resultado de uma atividade chamada Projeto lgico do BD.
Segue um exemplo de consulta SQL mostrando os valores da tabela pessoa em
ordem alfabtica crescente.
WebSQL
nome
fone
Cabral
260088
Lobato
174590
Mateus
Obilac
260088
Silva
282677
5 row(s)
WebSQL
Toda chave primria possui a clusula not null, dizendo que o valor no pode ser
nulo. Outras colunas podem ter esta clusula que verificada automaticamente pelo
gerenciador do BD. No script abaixo (2) mostra-se como os dados so inseridos nas
tabelas pessoa, turma e participante. Este um exemplo de um script de carga de um
BD.
/*pessoa*/
insert into pessoa (cdpessoa, nome, fone) values (2, 'Silva', '282677');
insert into pessoa (cdpessoa, nome, fone) values (3, 'Cabral', '260088');
insert into pessoa (cdpessoa, nome, fone) values (4, 'Lobato', '174590');
insert into pessoa (cdpessoa, nome, fone) values (1, 'OBilac', '260088');
/*turma*/
insert into turma (cdturma, nome, profe) values ('A', 'Volei', 4);
insert into turma (cdturma, nome, profe) values ('C', 'Natao', 2);
insert into turma (cdturma, nome, profe) values ('B', 'Karate', 4);
/*participante*/
insert into participante (pessoa, turma) values (1, 'A');
insert into participante (pessoa, turma) values (1, 'B');
insert into participante (pessoa, turma) values (1, 'C');
insert into participante (pessoa, turma) values (2, 'C');
insert into participante (pessoa, turma) values (3, 'A');
Script 2: Carga do BD
WebSQL
WebSQL
restrio de null: toda coluna com a clusula not null deve ter um valor vlido.
10
WebSQL
A Figura 5 ilustra a conexo dos clientes com o servidor de BD, SGBD. Uma
vez que o cliente se conectou ao banco de dados (mais especificamente o engenho do
11
WebSQL
BD), as instrues SQL podem ser executadas e os resultados sero retornados. Esta
conexo pode ser feita por diferentes APIs, por exemplo, via ODBC ou conexo nativa
na linguagem. Em algumas APIs a SQL compilado no cliente em outras no servidos.
Em ambos os casos o plano das consultas executado no servidor. A figura ilustra
que temos o SGBD mais as tabelas num grande disco, mas na verdade existe uma
mquina servidora com boa configurao e um bom nmero de discos (HDs) (para ser
RAID deve ser pelo menos 5, os melhores so SCSI) para suportar as tabelas do banco
de dados, de modo robusto. Um servidor robusto permite a troca de HDs com a mquina
operando; um bom servidor opera por anos a fio sem ser desligado.
12
WebSQL
13
WebSQL
WebSQL
14
Operaes
+, - (unrio),
identity, negation
*, /, %
+, - (binrio)
comparao
comparao
NOT
negao lgica
AND
conjuno
OR
disjuno
Quadro 3 Precedncia dos operadores, diminuindo de cima para baixo.
15
WebSQL
(R1) (R2)
Atribuio
:=
Var := R
Quadro 5 Operao, Operador e Sintaxe
WebSQL
16
/* Projeo */
select nome from pessoa;
cdpessoa Nome
Nome
Fone
Lobato 174590
Obilac
1 row(s)
Silva
Cabral
Lobato
Mateus
5 row(s)
Fone
174590
1 row(s)
nome
fone
cdturma
nome
profe
Obilac
260088
Volei
Obilac
260088
Karate
Obilac
260088
Natao
Silva
282677
Volei
Silva
282677
Karate
WebSQL
17
Silva
282677
Natao
Cabral
260088
Volei
Cabral
260088
Karate
Cabral
260088
Natao
Lobato
174590
Volei
Lobato
174590
Karate
Lobato
174590
Natao
Mateus
Volei
Mateus
Karate
Mateus
Natao
2
15 row(s)
nome
fone
cdturma
nome
profe
Lobato
174590
Volei
Lobato
174590
Karate
Silva
282677
Natao
2
3 row(s)
Turma
B
3 row(s)
WebSQL
18
Turma
A
2 row(s)
Turma
A
1 row(s)
1.8.4 Diviso
A Diviso um exemplo de operao no primitiva que produz como resultado
a projeo de todos os elementos da primeira relao que se relacionam com todos os
elementos da segunda relao. Como no um operador primitivo o seu resultado pode
ser obtido a partir da combinao dos outros operadores.
Cursou
DisciplinaEng
Cursou DisciplinaEng
Estudante Disciplina
Disciplina
Estudante
Fredi
EngenhariaSoftI
EngenhariaSoftI
Fredi
Fredi
EngenhariaSoftII
EngenhariaSoftII
Sara
Fredi
CompiladoresI
Eugenio
EngenhariaSoftI
Eugenio
CompiladoresI
Sara
EngenhariaSoftI
Sara
EngenhariaSoftII
1.9 Questes
Questo 1. O que uma chave primria de uma tabela? (10/20 palavras).
Questo 2. O que uma chave estrangeira de uma tabela? (10/20 palavras).
Questo 3. Fale sobre um esquema de um banco de dados? (20/30 palavras).
Questo 4. Porque importante seguir o padro ANSI, na codificao de consultas
SQL? (20/30 palavras).
Questes 5
a. Em Tabela x Relao: Uma coluna equivale a uma tupla. ( F/V)
19
WebSQL
a.
b.
c.
d.
e.
0e1
1e0
1e1
0e0
1e2
20
WebSQL
WebSQL
21
Obilac 260088
cdturma nome
profe
select * from
participante
pessoa
turma
A
Volei
Silva
282677
Karate
Cabral 260088
Natao 2
Lobato 174590
3 row(s)
Mateus
5 row(s)
5 row(s)
O select * from pessoa, mostra todas as colunas da tabela; para fazer uma
projeo, isto , mostrar s algumas, basta listar os nomes das colunas na ordem
desejada, como segue.
WebSQL
22
fone
Obilac
260088
Silva
282677
Cabral
260088
Lobato
174590
Mateus
5 row(s)
Figura 15: Exemplo de consulta SQL listando o nome e fone de todas as pessoas(projeo)
cdpessoa
Obilac
Silva
Cabral
Lobato
Mateus
5
5 row(s)
Figura 16: Exemplo de consulta SQL listando o nome e cdigo da tabela pessoa
Codigo
Obilac
Silva
Cabral
Lobato
Mateus
5
5 row(s)
Figura 17: Exemplo de consulta SQL listando o nome e cdigo da tabela pessoa usando alias
Podemos tambm usar uma string com espaos em branco no cabealho das
colunas, como segue:
Select nome as 'Nome Pessoa', cdpessoa as Codigo from pessoa
Nome Pessoa
Codigo
Obilac
...
...
5 row(s)
Figura 18: Exemplo de consulta SQL listando o nome e cdigo das pessoas renomeando as colunas
WebSQL
23
No padro ANSI a concatenao de string tambm feita pelo operador ||. Toda
consulta com concat pode ser escrita com || e vice-versa.
sql>
sql>
sql>
sql>
Select
Select
Select
Select
sql> Select concat(nome, ' tem o cdigo ', cdpessoa) as 'Lista com cdigos' from pessoa
sql> Select (nome || ' tem o cdigo '|| cdpessoa) as 'Lista com cdigos' from pessoa
nome
fone
cdturma
nome
Profe
Obilac
260088
Volei
Obilac
260088
Karate
Obilac
260088
Natao
...
...
...
...
...
..
Lobato
174590
Natao
Mateus
Volei
Mateus
Karate
Mateus
Natao
2
15 row(s)
WebSQL
24
nome
Fone
cdturma
nome
profe
Lobato
174590
Volei
Lobato
174590
Karate
Silva
282677
Natao
2
3 row(s)
Figura 21: Exemplo de consulta SQL usando produto cartesiano com juno
PROF
Volei
Lobato
Karate
Lobato
Natao
Silva
3 row(s)
PROF
Volei
Lobato
Karate
Lobato
Natao
Silva
3 row(s)
t.nome
t.nome
t.nome
t.nome
WebSQL
25
Como vemos a consulta traz trs vezes Obilac. Logo, ele participa de trs
turmas. Para retornar o valor 3, basta utilizar count(*), como ser visto mais adiante.
Com um comando Select distinct... elimina-se as linhas repetidas (ou duplicadas), como
segue:
select distinct nome from pessoa, participante where cdpessoa=pessoa
and cdpessoa=1
Nome
Obilac
1 row(s)
Agora, foi adicionada uma restrio para selecionar s as linhas do professor Lobato.
select t.nome as TURMA, p.nome AS PROF
from pessoa p, turma t
where p.cdpessoa=t.profe and p.nome=Lobato
WebSQL
26
Note que aqui j estamos utilizando um operador lgico (and) e dois operadores
relacionais (=). O exemplo abaixo usa tambm um operador aritmtico e o parntese,
para selecionar todos os valores de cdpessoa maiores que 1 e menores que 4.
select t.nome as TURMA, p.nome AS PROF from pessoa p, turma t
where p.cdpessoa=t.profe and (p.cdpessoa>1 or p.cdpessoa<3+1)
TURMA
PROF
Natao
Silva
Volei
Lobato
Karate
Lobato
3 row(s)
Nome
Obilac
Silva
Cabral
Lobato
Mateus
5 row(s)
Na consulta abaixo se ordena pelo fone e dentro do mesmo fone (260088) pelo
nome, mostrando que o order by pode ser por vrias colunas. As colunas no select no
precisam estar na mesma ordem que as colunas do order by.
Select fone, nome, cdpessoa from pessoa order by fone, nome desc
fone
nome
Cdpessoa
Mateus
174590
Lobato
260088
Obilac
260088
Cabral
282677
Silva
2
5 row(s)
WebSQL
27
Operaes
Resultado
+, - (unrio),
identidade, negao
numrico
*, /, %, mod
numrico
+, - (binrio), || (ANSI)
adio, subtrao,
concatenao
numrico ou
string
comparao
lgico
comparao
lgico
NOT !
negao lgica
lgico
AND
conjuno
lgico
OR
disjuno
lgico
Quadro 6 Operadores aritmticos e lgicas, operaes e resultado.
Este quadro faz um resumo dos principais operadores da SQL, mas existem
vrios outros que so detalhados em um mdulo especifico que trata s sobre
operadores e funes.
2.3.1 Expresses
Uma expresso uma combinao de smbolos e operadores que so avaliados
como um valor nico. Elas podem ser simples, como uma constante (numrica ou
string), uma coluna ou uma varivel; ou podem ser complexas, criadas conectando-se
uma ou mais expresses simples com operadores. Utilizando a tabela acima sabemos
como parentizar uma expresso, por exemplo:
Expresso
Com parnteses
valor + 0.1 * taxa
(valor + (0.1 * taxa))
val >= 10 OR val <=10 and sal+10 < 24 (val >= 10) OR ((val <=10) and ((sal+10) < 24))
Quadro 7 Exemplo de expresses SQL
28
WebSQL
select
select
select
select
WebSQL
29
Usa-se IS NULL e IS NOT NULL para testar campos com valores vazios. Na
criao de uma tabela devemos dizer se no queremos valores null numa coluna.
select * from pessoa where fone is null
cdpessoa
nome
Mateus
Fone
1 row(s)
Retorna
Qualquer seqncia iniciando com a letra a;
Todos os nomes que contm as letras AB;
Comea b seguida uma letra seguida de a;
Que tenha underline na palavra;
Todos os nomes terminados com as letras een;
Todos os nomes com 3 letras terminados em ex;
Todos os nomes iniciados com as letras C ou K;
Todos os nomes de quatro letras terminados com as letras
ing e iniciados com uma letra s no intervalo de S a V;
like M[^c]%
Todos os nomes iniciados com a letra M que no
contenham a letra c na segunda posio;
Quadro 9 Combinao da condio LIKE com caracteres curingas
nome
Fone
Cabral
260088
Mateus
2 row(s)
WebSQL
30
nome
Fone
Silva
282677
Lobato
174590
2 row(s)
nome
Fone
Silva
282677
1 row(s)
2.4 Exerccios
Na soluo dos exerccios de SQL considere o BD com as tabelas: pessoa, turma
e participante.
31
WebSQL
Discursivas:
1. O que uma operao de juno, como feita com o SQL (20/30 palavras)?
2. O que uma operao de produto cartesiano, como feito em SQL (20/30 palavras)?
3. O que retorna na consulta: Select * from pessoa where nome like _a% (10/20 palavras)?
Sejam as consultas:
a) select * from pessoa, turma
b) select distinct nome from pessoa, participante where cdpessoa=pessoa and cdpessoa=1
c) select nome as 'Nome Pessoa', cdpessoa as Codigo from pessoa
d) select * from pessoa where fone is null
e) select nome from turma where cdturma = 'A' or cdturma = 'B' or cdturma = 'C'
WebSQL
32
3.1
Create Database
tables;
table status;
create database NOMEBD;
columns from cliente;
triggers;
show columns from cliente
Field
Type
nomecliente
varchar(50)
NO
cidade
varchar(20)
NO
tipoindustria
char(1)
NO
Extra
PRI
3 row(s)
cliente
MyIS
AM
Comment
2006-10latin1_swedis
25
h_ci
18:31:17
Dependent Inno
e
DB
Depto
Inno
DB
2006-11latin1_swedis
20
InnoDB free: 4096 kB
h_ci
12:18:34
Emp
Inno
DB
2006-11latin1_swedis
20
InnoDB free: 4096 kB
h_ci
12:18:34
Participa Inno
nte
DB
MyIS
AM
2006-10latin1_swedis
25
h_ci
18:31:17
pedido
WebSQL
33
pessoa
Inno
DB
2006-11latin1_swedis
20
InnoDB free: 4096 kB
h_ci
12:18:34
pessoa1
Inno
DB
2006-11latin1_swedis
23
InnoDB free: 4096 kB
h_ci
11:15:52
Turma
Inno
DB
vendedor
MyIS
AM
2006-10latin1_swedis
25
h_ci
18:31:17
Figura 36: Exemplo de consulta SQL a todas as tabelas de determinado banco de dados
Figura 37: Exemplo de comando SQL que visualiza as permisses dos usurios
3.2
Create/drop table
No mdulo I vimos um script para criar as tabelas Pessoa, Turma e Participante.
Pessoa
Turma
cdpessoa nome
fone
Participante
cdturma nome
profe
pessoa
turma
Obilac 260088
Volei
Silva
282677
Karate
Cabral 260088
Natao 2
Lobato 174590
Mateus
WebSQL
34
Este esquema serve de base para projetarmos uma consulta SQL que retorna
todos os dados do banco interligando as tabelas de forma adequada. Toda consulta sobre
estas 3 tabelas, em principio, um caso mais especfico desta consulta geral.
select cdturma, t.nome nmturma, profe, pr.nome prof, pessoa aluno,
al.nome aluno, al.fone cdpessoa
from turma t, participante p, pessoa pr, pessoa al
where t.cdturma=p.turma and p.pessoa=al.cdpessoa and
pr.cdpessoa=t.profe
cdturma
Nmturma
profe
prof
aluno
aluno
cdpessoa
Volei
Lobato
Obilac
260088
Volei
Lobato
Cabral
260088
Karate
Lobato
Obilac
260088
Natao
Silva
Obilac
260088
Natao
Silva
Silva
282677
5 row(s)
35
WebSQL
fone varchar(10),
primary key (cdpessoa));
create table turma
(cdturma character(1) not null,
nome varchar(10),
profe integer,
primary key (cdturma));
create table participante
(pessoa integer not null,
turma character(1) not null,
primary key (pessoa, turma));
alter table turma add foreign key (profe) references pessoa (cdpessoa);
alter table participante add foreign key (pessoa) references pessoa
(cdpessoa);
alter table participante add foreign key (turma) references turma
(cdturma);
Toda chave primria possui a clusula not null, dizendo que o valor no pode
ser nulo. Outras colunas pode ter esta clusula que verificada automaticamente pelo
gerenciador do BD.
No final do script 6 temos trs comandos para criar os relacionamentos (chaves
estrangeiras) com o comando alter table add foreing key. So trs chaves: duas
referenciando a tabela Pessoa e uma referenciando para a tabela Turma.
O script 7 d a carga dos dados iniciais na tabela usando o comando insert into.
Este um exemplo de um script de carga de um BD.
/*pessoa*/
delete from pessoa;
insert into pessoa (cdpessoa, nome, fone)values (2, 'Silva', '282677');
insert into pessoa (cdpessoa, nome, fone)values (3, 'Cabral', '260088');
insert into pessoa (cdpessoa, nome, fone)values (4, 'Lobato', '174590');
insert into pessoa (cdpessoa, nome, fone)values (1, 'OBilac',
'260088');
/*turma*/
delete from turma;
insert into turma (cdturma, nome, profe)values ('A', 'Volei', 4);
insert into turma (cdturma, nome, profe)values ('C', 'Natao', 2);
insert into turma (cdturma, nome, profe)values ('B', 'Karate', 4);
/*participante*/
delete from participante;
insert into participante (pessoa, turma)values (1, 'A');
insert into participante (pessoa, turma)values (1, 'B');
insert into participante (pessoa, turma)values (1, 'C');
insert into participante (pessoa, turma)values (2, 'C');
insert into participante (pessoa, turma)values (3, 'A');
Script 7 Carga do BD
WebSQL
36
O show create table mostra o comando que foi utilizado para criar a tabela.
show create table pessoa
Table
Create Table
3.3
Insert/update/delete
37
WebSQL
3.4
Create view
Podemos salvar o resultado de uma consulta como uma viso. Este recurso til
quando, por exemplo, temos uma tabela com o salrio do funcionrio e queremos que
um usurio veja tudo menos a coluna do salrio.
sql> create view prof_pessoa (turma_nome, cdpessoa)
as select turma.nome, pessoa.nome
from turma, pessoa where profe = cdpessoa;
sql> select turma_nome from prof_turma;
3.5
WebSQL
38
nome
fone
salario
chefe
depto
OBilac
2688
20000
Silva
2677
30000
Cabral
1088
22000
Lobato
4590
28000
Maria
2690
25000
Antune
2698
26000
10
Petter
2645
22000
7 row(s)
select * from depto
cddepto Nome
C
responsavel
Computao 8
Sede
Seguranca
select * from
dependente
cdemp
cddep
nome
Jose
Ana
2 row(s)
3 row(s)
WebSQL
39
RESP
CHEFE
EMP
Computao
Maria
Lobato
Maria
Computao
Maria
Maria
Antune
Computao
Maria
Maria
Petter
Sede
Silva
Silva
Lobato
Seguranca
Cabral
Cabral
OBilac
Seguranca
Cabral
Silva
Cabral
6 row(s)
Abaixo apresentamos um script para criar estas duas tabelas emp e depto.
Inicialmente criamos somente estas duas, pois, elas tm relacionamentos circulares o
que dificulta ou impossibilita a incluso dos dados. Desafio: rode o script abaixo e tente
fazer alguma incluso de dado, tipo insert into emp (cdemp, nome, fone, salario, depto)
values (2, 'Silva', '2677', 30000, 'H'); insert into depto (cddepto, nome, responsavel)
values ('H', 'Sede', 2);
create table emp
(cdemp integer not null,
nome varchar(6),
fone varchar(10),
salario integer,
chefe integer,
depto character(1),
primary key (cdemp));
create table depto
(cddepto character(1) not null,
nome varchar(12),
responsavel integer,
primary key (cddepto));
alter table emp add constraint emp_to_chefe foreign key (chefe)
references emp (cdemp);
alter table emp add constraint emp_to_dept foreign key (depto)
references depto (cddepto);
alter table depto add constraint depto_to_responsavel foreign key
(responsavel) references emp (cdemp);
WebSQL
40
depto)
depto)
depto)
depto)
depto)
insert into depto (cddepto, nome, responsavel) values ('H', 'Sede', 2);
insert into depto (cddepto, nome, responsavel) values ('S', 'Seguranca', 3);
insert into depto (cddepto, nome, responsavel) values ('C', 'Computao', 8);
/* reativa as restries de chave */
alter table emp add constraint emp_to_chefe foreign key (chefe) references
emp(cdemp);
alter table emp add constraint emp_to_dept foreign key (depto) references
depto (cddepto);
alter table depto add constraint depto_to_responsavel foreign key
(responsavel) references emp (cdemp);
3.6
Transaes
41
WebSQL
3.7
pessoa;
SET nome = upper(nome);
pessoa;
pessoa;
Create index
Suponha que queremos executar a consulta select * from pessoa2 where nome='M%'
limit 3. Como podemos otimiz-la? Vendo que queremos pesquisar um nome, um ndice
em ordem alfabtica pode otimizar a consulta. Portanto cria-se o ndice idxnome com
este propsito. Como saber se ele ser utilizado? Basta executar o EXPLAIN sobre a
WebSQL
42
consulta antes e depois de criar o ndice. Como vemos abaixo, antes de se criar o plano
no considera nenhuma chave; porm aps a criao do ndice a chave nome
considerada. Na primeira consulta o nmero estimado de linhas a serem examinadas
toda a tabela (6 rows) enquanto que aps a criao do ndice apenas uma linha que
ser examinada. Suponha que esta tabela tenha 100 mil linhas ento a otimizao seria
muito grande.
explain select * from pessoa2 where nome='M%' limit 3
create index idxnome on pessoa2 (nome);
explain select * from pessoa2 where nome='M%' limit 3
Plano
antes
de criar
o ndice
SIMPLE
pessoa2 ALL
Using
where
1 row(s)
Plano
aps
criar o
ndice
SIMPLE
pessoa2 ref
nome
key_len ref
nome 9
rows Extra
const 1
Using
where
1 row(s)
A SQL pode tirar proveito dos ndices em vrias situaes: para ordenar as
linhas (ORDER BY); para executar operadores relacionais tais como = > < ; para
encontrar os valores max() e min(), etc. A consulta que segue otimizada se for criado
um indice na coluna last_name.
WHERE last_name >= 'Mac' AND last_name < 'Mad'
Sejam as duas consultas abaixo. A segunda pode fazer uso do ndice enquanto
que a primeira no. Logo, devemos evitar o uso de curinga no inicio de um like, como
na primeira, pois forar uma pesquisa/varredura de toda a tabela.
WHERE col_name LIKE '%string%'
WHERE last_name LIKE 'Mac%'
43
WebSQL
Por fim, todos os sistemas possuem comandos especficos para dar dicas para a
consulta ser corretamente otimizada, por exemplo, no MySQL existe a opo
STRAIGHT_JOIN, FORCE INDEX, USE INDEX ou IGNORE INDEX que guia
manualmente a estratgia de execuo da consulta.
Para uma maior compreenso deste tpico o leitor deve consultar livros sobre
organizao de arquivos e estruturas de dados para estudar tpicos relacionados com
ndices e ordenao, tais como: rvore B+ (btree), ndices do tipo hashing, etc.
3.8
WebSQL
44
Um exemplo completo:
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)) TYPE=INNODB;
CREATE TABLE customer (id INT NOT NULL,
PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
INDEX (product_category, product_id),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id)
ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (customer_id),
FOREIGN KEY (customer_id)
REFERENCES customer(id)) TYPE=INNODB;
Pode-se adicionar novas restries de chaves estrangeiras para a uma tabela mas
primeiro deve-se criar os ndices necessrios.
ALTER TABLE seunomedetabela
ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES anothertablename(...)
[on_delete_and_on_update_actions]
ALTER TABLE suatabela DROP FOREIGN KEY id_chave_estrangeira_gerada_internamente
Create Table
45
WebSQL
WebSQL
46
4 Mdulo IV GROUP BY
Nesta seo so abordados assuntos relativos as consultas agregadas. O objetivo
aprender a criar consultas agregadas resumindo os dados da tabela.
Algumas sees deste captulo utilizam a sintaxe do MySQL. Outros Sistemas
possuem construes equivalentes: para isso deve-se consultar a documentao
pertinente.
Descrio
Mdia de valores em uma expresso numrica
Nmero de linhas que satisfazem a expr
Numero de linhas da consulta
Maior valor da expr
Menor valor da expr
Soma dos valores da expr
Seguem alguns exemplos destes operadores sobre todas as linhas de uma tabela.
Count(*) contabiliza tambm linhas com campos nulos, porm quando aplicamos sobre
uma coluna apenas, e.g., count(fone), os valores nulos no so contados. Podemos
tambm contar os valores distintos com a clusula DISTINCT.
select * from pessoa
cdpessoa
nome
fone
Obilac
260088
Silva
282677
Cabral
260088
Lobato
174590
Mateus
5 row(s)
WebSQL
47
1 row(s)
O tipo de dados de uma coluna determina as funes que podem ser usadas.
SUM s pode ser usada com valores numricos. MAX e MIN podem tambm para
valores literais.
select * from emp
cdemp
nome
fone
salario
chefe
depto
OBilac
2688
20000
Silva
2677
30000
Cabral
1088
22000
Lobato
4590
28000
Maria
2690
25000
Antune
2698
26000
10
Petter
2645
22000
C
7 row(s)
Seguem alguns exemplos para serem praticados. Note que podemos contar
tambm s linhas que possuem alguma coluna com valor nulo.
sql> select count(*) from pessoa where fone is null -> 1
select
select
select
select
WebSQL
48
nome
Mateus
fone
1 row(s)
avg(salario)
30000.0000
25000.0000
WebSQL
49
20000.0000
25000.0000
24000.0000
5 row(s)
O group by muito til para se fazer relatrio com totalizaes de grupos como
segue. Note que podemos ter tambm a clusula where para impor restries nas linhas.
select chefe, sum(salario) from emp
where chefe is not null group by chefe
chefe
sum(salario)
50000
20000
25000
48000
4 row(s)
sum(salario)
50000
48000
2 row(s)
O uso da clusula HAVING sem a clusula GROUP BY no faz sentido; podese fazer referencia a qualquer uma das colunas exibidas na lista de seleo.
select chefe, sum(salario) from emp
where chefe is not null
group by chefe having chefe>5 and sum(salario)>25000
chefe
sum(salario)
48000
WebSQL
50
1 row(s)
count(*)
emp-lista
Lobato, Silva
OBilac, Cabral
3 row(s)
GROUP_CONCAT(expr)
51
WebSQL
a sintaxe:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {inteiro_sem_sinal | nome_coluna | formula} [ASC | DESC]
[,col ...]]
[SEPARATOR valor_str])
mysql> SELECT chefe,count(*), GROUP_CONCAT(DISTINCT nome ORDER BY
chefe DESC SEPARATOR , ) as subordinados FROM emp GROUP BY chefe
having count(*)>1
mysql> SELECT nome_estudante,
GROUP_CONCAT(note_teste)
FROM estudante
GROUP BY nome_estudante;
mysql> SELECT nome_estudante,
GROUP_CONCAT(DISTINCT nota_teste
ORDER BY nota_teste DESC SEPARATOR " ")
FROM estudante
GROUP BY nome_estudante;
4.4 Exerccios
Questes Falso/verdadeiro:
1. Count(*) tambm conta os nulos .
2. Count(campo) tambm conta os nulos.
3. Count(distinct campo) tambm conta os nulos.
4. A clusula having est associada clusula select.
5. A clusula having est associada clusula group by.
6. As funes de agregao s podem ser utilizadas com a clusula group by.
7. A funo de agregao sum pode ser utilizada para dados alfanumricos
Questes discursivas:
8. Para que serve a opo GROUP_CONCAT()? (30 palavras)
9. Fale sobre as clusulas: select, where, group by, having? (30 palavras)
10. Quais so as funes de agregao ou agrupamento? (10 palavras).
11. Qual o resultado desta consulta, explique com palavras (20 palavras)? (para cada
uma)
a) select avg(salario) from emp;
b) select chefe, avg(salario) from emp group by chefe;
c) select chefe, sum(salario) from emp group by chefe;
d) select depto, avg(salario) from emp group by depto;
e) select depto, count(*) from emp group by depto;
f) select depto, avg(salario) from emp where salario > 20000 group by depto;
g) select depto, avg(salario) from emp group by depto having avg(salario) > 22000;
h) select depto, avg(salario) from emp where salario > 20000 group by depto having avg(salario) >
22000;
Questes de SQL:
12. Mostre o nome do professor, o nome da turma e o nro de alunos da turma (em
trs colunas).
52
WebSQL
53
WebSQL
5 Mdulo V Sub-consultas
Nesta sesso so abordados vrios assuntos relativos a consultas mais
complexas, as quais usam todo o poder expressivo da SQL.
nmaluno
Obilac
Obilac
Obilac
Silva
Cabral
5 row(s)
O outro tipo de juno acontece com o join explcito, que segue a sintaxe: from
que pode ligar duas ou mais tabelas. A
palavra inner opcional. O inner join quando liga duas tabelas pela condio de
igualdade entre duas (ou mais) colunas tambm chamado de join natural ou equi-join.
A condio de igualdade atende a grande maioria das consultas, mas pode ser tambm
uma condio de desigualdade (!=, < , <=, >, >=). Se for uma desigualdade j no
mais chamado equi-join.
A palavra inner usada para diferenciar o inner do outer, como exemplificado
em duas consulta abaixo:
inner join s retornam as linhas com a condio vlida (uma espcie de
interseo);
outer join retornada todas as linhas de pelo menos uma das tabelas envolvidas
(uma especie de unio esquerda ou unio direita).
TAB1 [inner] join TAB2 on TAB1.col=TAB2.col
Nmaluno
Obilac
Obilac
Obilac
Silva
Cabral
5 row(s)
54
WebSQL
nmaluno
Obilac
Obilac
Obilac
Silva
Cabral
Lobato
Mateus
7 row(s)
O mesmo efeito da consulta acima pode ser conseguido com left outer join,
trocando-se as tabelas pessoa e participante:
sql> select a.turma turma, b.nome nmaluno
from pessoa b left outer join participante a on a.pessoa = b.cdpessoa
Pode-se combinar o efeito do left e do right join num comando com a palavra
full outer join, como no exemplo:
sql> select a.turma turma, b.nome nmaluno
from participante a full outer join pessoa b on a.pessoa = b.cdpessoa
Por fim, segue um exemplo para inner join com >. O problema com as junes
no equi-join descobrir o que significa a consulta: primeiro feito um produto
cartesiano; depois, sobre todas as linhas do resultado verificada a condio do join; se
for verdadeira a linha retornada.
select a.turma turma, b.nome nmaluno
from pessoa b join participante a on a.pessoa > b.cdpessoa
turma
Nmaluno
Obilac
Obilac
Silva
55
WebSQL
3 row(s)
Nmaluno
Obilac
Obilac
Silva
Cabral
Lobato
Mateus
6 row(s)
Sobre join tambm temos vrias sintaxes alternativas. Por exemplo, as trs
consultas que seguem trazem o mesmo resultado; na segunda usamos alias de tabelas e
inner join implcito; na terceira o inner join explcito. Alm disso as palavras inner so
opcionais.
sql> select turma.nome nmturma from turma, participante, pessoa
where cdturma = turma and pessoa = cdpessoa and pessoa.nome =\'OBilac\'
sql> select A.nome nmturma from turma A, participante B, pessoa C
where A.cdturma = B.turma and B.pessoa = C.cdpessoa and C.nome ='OBilac';
sql> select A.nome nmturma
from turma A inner join participante B on A.cdturma = B.turma
inner join pessoa C on B.pessoa = C.cdpessoa
where C.nome =\'OBilac\'
56
WebSQL
WebSQL
57
profe
Aluno
Volei
Lobato
Obilac
Volei
Lobato
Cabral
Karate
Lobato
Obilac
Natao
Silva
Obilac
Natao
Silva
Silva
5 row(s)
*
*
*
*
from
from
from
from
dependente
dependente
dependente
dependente
d
d
d
d
5.2 Subconsultas
5.2.1 Union
A SQL uma linguagem bastante flexvel e poderosa. Podemos usar subconsulta em diferentes situaes, um primeiro exemplo do uso do union. Para o union
as tabelas resultantes de cada sub-consulta devem ser compatveis de unio (isto , ter
os mesmos tipos de dados em cada coluna e na mesma ordem). Segue um exemplo.
(select * from pessoa where cdpessoa > 3)
union
(select * from pessoa where cdpessoa <= 3)
cdpessoa
nome
fone
Lobato
174590
Mateus
Obilac
260088
Silva
282677
WebSQL
58
Cabral
260088
5 row(s)
59
WebSQL
EMP
Cabral
OBilac
Lobato
Maria
Maria
Antune
Maria
Petter
Silva
Cabral
Silva
Lobato
6 row(s)
WebSQL
60
nome
fone
salario
chefe
depto
OBilac
2688
20000
Silva
2677
30000
Cabral
1088
22000
Lobato
4590
28000
Maria
2690
25000
Antune
2698
26000
10
Petter
2645
22000
C
7 row(s)
cdemp
cddep
nome
Computao 8
Jose
Sede
Ana
Seguranca
2 row(s)
3 row(s)
Note que, a tabela emp(regado) acima pode ser vista como: (responsvel, chefe ou
empregado). Pense numa especializao: um empregado pode ser um responsvel pelo
departamento ou pode ser tambm um chefe. Num depto podem ter vrios chefes.
Portanto, fica mais fcil trabalhar com trs alias: (r, c, e), respectivamente. Note
tambm que, para cada relacionamento devemos ter a sua expresso na clusula where.
Select d.nome DEPTO, r.nome RESP, c.nome CHEFE, e.nome EMP
from emp e, emp c, emp r, depto d
where e.chefe=c.cdemp and d.responsavel=r.cdemp and e.depto=d.cddepto
order by d.nome, r.nome, c.nome
DEPTO
RESP
CHEFE
EMP
Computao
Maria
Lobato
Maria
Computao
Maria
Maria
Antune
Computao
Maria
Maria
Petter
Sede
Silva
Silva
Lobato
Seguranca
Cabral
Cabral
OBilac
Seguranca
Cabral
Silva
Cabral
6 row(s)
Nesta tabela podemos responder: Mostre quantos chefes tem em cada depto,
mostre com o nome do departamento! s tirar as tabelas que no so usadas:
responsvel e chefe (pois no precisa saber o nome do chefe).
WebSQL
61
count(e.chefe)
Computao
Sede
Seguranca
2
3 row(s)
count(chefe)
3 row(s)
count(chefe)
Computao
Sede
Seguranca
2
3 row(s)
Continuando nesta linha podemos responder: Qual depto com mais chefes?
fcil ver que Computao. Mas como fazer com o SQL. Acima mostramos como
contar com group by. Agora selecionamos o mximo daquela contagem.
Depois temos que selecionar o cdigo do depto usando group by e having
count() igual ao valor mximo j encontrado.
Select Max(s) from
(select depto d, count(cdemp) s from emp group by depto ) tab
Max(s)
3
1 row(s)
WebSQL
62
cidade
tipoindustria
Abernathy Construction
Willow
Manchester Lumber
Manchester
Tri-City Builders
Memphis
Amalgamated Housing
Memphis
2
4 row(s)
cidade
tipoindustria count(A.nomecliente)
Tri-City
Builders
Memphis
WebSQL
63
Abernathy
Construction
Willow
Manchester
Lumber
Manchester F
1
3 row(s)
WebSQL
64
cdturma
profe
cdprof
aluno
cdal
Volei
Lobato
Obilac
Volei
Lobato
Cabral
Karate
Lobato
Obilac
Natao
Silva
Obilac
Natao
Silva
Silva
2
5 row(s)
Queremos listar todos os alunos que no tem aula com o professor Lobato (4).
Seleciona-se as turmas dele via uma sub-consulta e depois usa-se o <> ALL para
mostrar o cdigo dos alunos.
sql> select T.cdturma from turma T where T.profe = 4
-> A B
sql> select P.pessoa from participante P
where P.turma <> all (select T.cdturma from turma T where T.profe = 4 ) -> 1 2
IN um alias para = ANY. Prefira sempre usar a palavra chave IN. Segue um
exemplo com duas consultas equivalentes:
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN
(SELECT s1 FROM t2);
65
WebSQL
A palavra SOME um alias para ANY. Assim, ANY lido como ALGUM.
Seja t1=(10) e t2=(21,14,7). A consulta abaixo verdadeira.
Agora seja t2=(20,10). A consulta abaixo falsa.
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 > SOME (SELECT s1 FROM t2);
5.4 Exerccios:
Discursivas:
1. O que um equi-join? (20 palavras)
2. Sejam duas tabelas relacionadas pela ligao entre chave primria e estrangeira.
O que traz um join natural? (20 palavras)
3. Sejam duas tabelas relacionadas pela ligao entre chave primria e estrangeira.
O que traz um outer join? (20 palavras)
4. Na hora de se escrever uma consulta com algum tipo de join, para que serve o
modelo de dados? (30 palavras)
5. O que so duas tabelas compatveis de unio? (20 palavras)
6. O que um self-join? (20 palavras)
F/V:
7. O inner join s retornam as linhas com a condio vlida (uma espcie de
interseo).
8. O outer join s retornam as linhas com a condio vlida (uma espcie de
interseo).
9. O outer join retornada todas as linhas de pelo menos uma das tabelas envolvidas
(uma especie de unio esquerda ou unio direita).
10. O inner join retornada todas as linhas de pelo menos uma das tabelas envolvidas
(uma especie de unio esquerda ou unio direita).
11. O full outer join equivalente a um left join mais um right join.
12. O full outer join equivalente a um join natural.
13. O join natural equivalente ao inner join.
14. possvel escrever um outer join implcito.
15. O cross join igual a um equi-join.
16. O cros join igual a um produto carteziano.
17. IN equivalente a = SOME.
18. IN equivalente a = ANY.
19. SOME alias de ANY.
20. NOT IN equivalente a <> ALL.
SQL:
21. Usando um join natural implcito mostre todos os professores com suas turma?
22. Usando um join natural explcito mostre todos os alunos com suas turmas?
23. Mostre os professores de cada aluno, s para alunos onde o cdpessoa > profe.
24. Mostre o nome da turma, do professor e a lista de alunos na mesma linha (use
group_concat)?
66
WebSQL