Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Linguagem SQL
2
Introdução SQL (Structured Query Language): desenvolvida pela IBM (70) como parte do sistema System R. A SQL foi inicialmente chamada de SEQUEL É a linguagem de consulta padrão para os SGBDR's Já existem padrões propostos: ANSI-SQL(SQL-89), SQL-92 e padrões mais recentes: SQL:1999 e SQL:2003.
3
Introdução O padrão SQL define precisamente uma interface para a definição de tabelas, para as operações sobre as mesmas (seleção, projeção, junção, e outras) e para a definição de regras de integridade de bancos de dados.
4
Introdução Categorias
DDL: Linguagem de Definição de Dados. Usada para definir os esquemas, atributos, visões, regras de integridade, índices, etc. DML: Linguagem de Manipulação de Dados. Usada para se ter acesso aos dados armazenados no BD. DCL: Linguagem de controle dos dados. Usada para garantir ou negar o acesso aos dados.
5
Banco WorldJanu
6
Modelo Relacional Banco (codigo, nome, endereco)
Agencia_Bancaria (numagencia, banco_fk, endereco) Conta (numconta, saldo, tipo, numagencia_fk, banco_fk) Emprestimo (numempr, valor, tipo, numagencia_fk, banco_fk) Cliente (codigo, nome, telefone, endereco) Conta_cliente (cliente_fk, conta_fk) Emprestimo_cliente (cliente_fk, conta_fk)
7
DDL
8
DDL Os comandos SQL para definição de dados são:
CREATE: criação de novas estruturas DROP: remoção de estruturas ALTER: alteração de estruturas
9
CREATE TABLE - DDL CREATE TABLE: especifica uma nova tabela (relação), dando o seu nome e especificando as colunas(atributos) (cada uma com seu nome, tipo e restrições) Sintaxe: CREATE TABLE nome_tabela (coluna tipo_dado)
10
CREATE TABLE - DDL create table banco ( codigo int, nome varchar(50),
endereco varchar(100))
11
Interbase - Tipos de dados
Tipos em SQL:1999 Numéricos exatos: INTEGER (INT) e SMALLINT para representar inteiros NUMERIC(p,s): tem uma precisão e uma escala(número de dígitos na parte fracionária). A escala não pode ser maior que a precisão. Muito usado para representar dinheiro DECIMAL: também tem precisão e escala. A precisão é fornecida pela implementação (SGBD). Numéricos aproximados: REAL: ponto flutuante de precisão simples DOUBLE: ponto flutuante com precisão dupla FLOAT(p): permite especificar a precisão que se quer. Usado para tranportar (portability) aplicações
12
Interbase - Tipos de dados
Tipos em SQL:1999 Character CHARACTER(x) (CHAR): representa um string de tamanho x. Se x for omitido então é equivalente a CHAR(1). Se um string a ser armazenado é menor do que x, então o restante é preenchido com brancos. VARCHAR(N): representa um string de tamanho x. Armazena exatamente o tamanho do string (tam <= x) sem preencher o resto com brancos. Neste caso x é obrigatório. OBS.: Existem os National character data types: NCHAR, NVARCHAR, NCLOB que permitem implementar internacionalização
13
Interbase - Tipos de dados
Tipos em SQL:1999 Binary Strings (BLOB) BINARY LARGE OBJECT (BLOB): para armazenar grande quantidades de bytes como fotos, vídeo, áudio, gráficos, mapas, etc.
14
Interbase - Tipos de dados
Tipos em SQL:1999 DATETIMES DATE: armazena ano (4 digitos), mês (2 digitos) e dia(2 digitos). TIME: armazena hora(2digitos), minuto(2 digitos) e segundo(2digitos, podendo ter frações 0 a ) TIMESTAMP: DATE + TIME
15
Interbase - Tipos de dados
Tipos em SQL:1999 Intervals Um intervalo é a diferença entre duas datas e tempos. Intervalos do tipo year-month ou day-time. Year-month interval: contém apenas um valor de ano, ou de mês ou ambos. YEAR(p), MONTH(p), INTERVAL YEAR TO MONTH(p) Day-Time interval: contém apenas um dia, uma hora, um minuto e/ou um segundo. INTERVAL DAY(p), INTERVAL DAY TO HOUR, INTERVAL DAY(6) TO MINUTE, INTERVAL SECOND(7), etc. Booleans: lógica de três valores (TRUE, FALSE e UNKNOWN)
16
DROP TABLE - DDL DROP TABLE: remove uma tabela-base do BD. Remove tanto os dados quanto a definição da tabela Sintaxe: DROP TABLE <nomeTabela> Ex.: DROP TABLE Peca
17
Restrições - DDL
18
Not null - DDL create table banco (
Algumas restrições NOT NULL: Uma restrição de não-nulo simplesmente especifica que uma coluna não pode conter o valor nulo. create table banco ( codigo int not null, nome varchar(50) not null, endereco varchar(100))
19
Default - DDL - DDL Algumas restrições CREATE TABLE "CLIENTE" (
DEFAULT: indica um valor padrão para a coluna CREATE TABLE "CLIENTE" ( "CPF" INTEGER NOT NULL, "NOME" VARCHAR(50), "TELEFONE" VARCHAR(13), "ENDERECO" VARCHAR(50) default 'Januaria' );
20
ALTER TABLE - DDL Com o comando Alter Table podemos:
Incluir / Alterar / Excluir coluna Incluir / Excluir restrições
21
ALTER TABLE - DDL Incluir uma coluna Excluir uma coluna
ALTER TABLE banco ADD estado varchar(40) Excluir uma coluna ALTER TABLE banco DROP estado Alterar o tipo do campo ALTER TABLE banco ALTER nome TYPE varchar(60)
22
ALTER TABLE - DDL Adicionar a restrição default
ALTER TABLE banco ALTER endereco SET DEFAULT ‘Januaria’ Excluir a restrição default ALTER endereco DROP DEFAULT
23
UNIQUE - DDL Algumas restrições CREATE TABLE BANCO(
UNIQUE: indica que o atributo tem valor único na tabela. Qualquer tentativa de se introduzir uma linha na tabela contendo um valor igual ao do atributo será rejeitada. Serve para indicar chaves secundárias. Nomear as restrições (CONSTRAINTS) Deve ser definido primeiramente como NOT NULL CREATE TABLE BANCO( CODIGO INT NOT NULL CONSTRAINT U_BANCOCODIGO UNIQUE, NOME VARCHAR (40), ENDERECO VARCHAR(40))
24
ALTER TABLE - DDL Adicionar uma restrição Unique Remover uma restrição
ALTER TABLE banco ADD CONSTRAINT u_bu UNIQUE(nome) Remover uma restrição ALTER TABLE banco DROP CONSTRAINT u_bu
25
Check - DDL Algumas restrições create table conta (
CHECK: Permite especificar que os valores de uma determinada coluna devem estar de acordo com uma expressão arbitrária. create table conta ( numconta int not null unique, saldo numeric constraint ch_saldo check(saldo>1000), tipo int, num_agencia int, cod_banco int)
26
ALTER TABLE - DDL Adicionar restrição Check
ALTER TABLE conta ADD CONSTRAINT c_saldo CHECK (saldo>1000)
27
ALTER TABLE - DDL Remover constraint
ALTER TABLE BANCO DROP CONSTRAINT U_BU
28
Primary key - DDL Primary key: Indica que a coluna pode ser utilizado como identificador único para as linhas da tabela. Pode ser composta por um ou dois campos. Deve ser definida como not null. create table banco ( codigo int primary key, nome varchar (40), endereco varchar (60)) create table agencia_bancaria ( numagencia int, codbanco int, endereco varchar(50), primary key(numagencia,codbanco))
29
ALTER TABLE - DDL Adicionar Chave Primária
alter table agencia_bancaria add primary key (codbanco,numagencia)
30
Foreign key - DDL Foreign key: Especifica que o valor da coluna deve corresponder a algum valor que existe em uma linha de outra tabela. Mantém a integridade referencial entre as tabelas relacionadas. create table agencia_bancaria ( numagencia int not null, codbanco int references banco, endereco varchar(40), primary key(numagencia, codbanco))
31
ALTER TABLE - DDL Adicionar chave estrangeira
alter table conta add foreign key (cod_banco,num_agencia) references agencia_bancaria
32
Recomendação É recomendado definir constraints e nomeá-las para que o sistema não crie nomes automáticos que geralmente não são ilegíveis.
33
FOREIGN KEY - DDL Uma cláusula FOREIGN KEY inclui regras de remoção/atualização: FOREIGN KEY (coluna) REFERENCES tabela [ON DELETE {RESTRICT|CASCADE|SET NULL| SET DEFAULT}] [ON UPDATE {RESTRICT|CASCADE|SET NULL| SET DEFAULT}] Supondo que T2 tem uma chave estrangeira para T1, vejamos as cláusulas ON DELETE e ON UPDATE
34
FOREIGN KEY - DDL ON DELETE:
RESTRICT: (default) significa que uma tentativa de se remover uma linha de T1 falhará se alguma linha em T2 combina com a chave CASCADE: remoção de uma linha de T1 implica em remoção de todas as linhas de T2 que combina com a chave de T1 SET NULL: remoção de T1 implica em colocar NULL em todos os atributos da chave estrangeira de cada linha de T2 que combina. SET DEFAULT: remoção de linha em T1 implica em colocar valores DEFAULT nos atributos da chave estrangeira de cada linha de T2 que combina.
35
FOREIGN KEY - DDL ON UPDATE:
RESTRICT: (default) update de um atributo de T1 falha se existem linhas em T2 combinando CASCADE: update de atributo em T1 implica que linhas que combinam em T2 também serão atualizadas SET NULL: update de T1 implica que valores da chave estrangeira em T2 nas linhas que combinam são postos par NULL. SET DEFAULT: update de T1 implica que valores da chave estrangeira de T2 nas linhas que combinam terão valores default aplicados.
36
FOREIGN KEY - DDL As restrições de integridade podem ter um nome e serem especificadas com a cláusula CONSTRAINT. Isto permite que possamos no futuro eliminar (DROP) ou alterar (ALTER) o constraint.
37
DML
38
DML Linguagem de manipulação dos dados INSERT: inserção de registros
DELETE: deleção de registros UPDATE: atualização de registros SELECT: seleção de registros
39
INSERT - DML Ao ser criada a tabela não contém nenhum dado. Os dados são inseridos uma linha por vez. Os valores dos dados são colocados na mesma ordem que as colunas aparecem na tabela, separados por vírgula. INSERT INTO banco VALUES (1,’Banco 1’,’End 1‘) Quando não se sabe a ordem das colunas: INSER INTO banco (nome, endereco, codigo) VALUES (‘Banco 1’, ‘End 1’, 1)
40
UPDATE - DML O comando UPDATE
Modifica o valor de atributos de uma ou mais tuplas. Sintaxe: UPDATE tabela SET lista_atributos com atribuições de valores [WHERE condição] Obs.: omitir a cláusula WHERE implica que o UPDATE deve ser aplicado a todas as tuplas da relação
41
DELETE - DML O comando DELETE Remove tuplas de uma relação
Sintaxe: DELETE FROM tabela [WHERE condição] Obs.: Se omitirmos a cláusula WHERE, então o DELETE deve ser aplicado a todas as tuplas da relação. Porém, a relação permanece no BD como uma relação vazia.
42
DML
43
DML Esquemas do BD Empresa:
Empregado(matricula, nome, endereco, salario, supervisor, depto) Departamento(coddep, nome, gerente, dataini) Projeto(codproj, nome, local, depart) Alocacao(matric,codigop, horas)
44
SELECT O comando Select:
A forma básica do comando Select é: SELECT <lista atributos> FROM <lista tabelas> WHERE <condição>
45
SELECT Obtenha todos os nomes dos empregados Obtenha o salário de José
Select nome from Empregado Obtenha o salário de José Select salario From Empregado Where nome = ‘José’ Obs.: Podemos renomear o nome da coluna no resultado select salario as SalarioJose from empregado where nome = ‘José’
46
SELECT Obs2: Podemos usar colunas como expressões
select mat as matricula, salario, 0.15 * salario as IR from empregado Podemos inserir constantes na cláusula select se necessário select nome, ‘marajá’ as Marajá where salario > ,00
47
SELECT Selecione todos os atributos de todos os empregados do departamento Pesquisa Select * From Empregado Where depto = ‘Pesquisa’
48
SELECT Obter os nomes dos empregados e o nome do departamento que ele trabalha Obter os nomes dos departamentos Obter os nomes dos projetos e o local de realização
49
SELECT Obter os nomes dos projetos e o nome dos departamentos que o controlam Obter o nome do gerente de cada departamento, com o nome do departamento
50
SELECT Selecione o nome e o endereço de todos os empregados que trabalham no departamento de produção Select e.nome, e.endereco From empregado e join departamento d Where d.nome = ‘Produção’
51
SELECT Obter o nome do empregado, nome do projeto e as horas trabalhadas
52
SELECT Para cada projeto em ‘Fortaleza’, liste o código do projeto, o departamento que controla o projeto e o nome do gerente com endereço e salário Select p.codigo, d.nome, e.nome, e.endereco, e.salario From Projeto p join Departamento d on p.depart = d.codigo join Empregado e on d.gerente = e.matricula Where p.local = ‘Fortaleza’
53
SELECT Para cada empregado, recupere seu nome e o nome do seu supervisor Select e.nome, s.nome From Empregado e join Empregado s on e.matricula = s.supervisor
54
SELECT Selecione todos os atributos de todos os empregados do departamento Administração Select e.* from Empregado e join Departamento d on e.depto = d.codigo Where d.nome = ‘Administração’
55
SELECT - DISTINCT Algumas vezes surgem duplicatas como resposta a uma query. Podemos eliminá-las usando o comando DISTINCT na cláusula SELECT Selecione os diferentes salários pagos pela empresa aos empregados Select distinct salario From empregado
56
SELECT – ORDER BY Ordenação
O operador ORDER BY permite ordenar o resultado de uma query por um ou mais atributos. Obter uma lista de empregados e seus respectivos departamentos, listando ordenado pelo nome do departamento SELECT d.nome, e.nome FROM departamento d join empregado e On d.codigo = e.depto ORDER BY d.nome, e.nome
57
SELECT – ORDER BY Ordenação Ex. ORDER BY d.nome DESC, e.nome ASC
A ordem default é ascendente (ASC) caso queiramos ordem decrescente usamos DESC Ex. ORDER BY d.nome DESC, e.nome ASC
58
SELECT Selecione os nomes dos empregados que ganham mais de 1000 e menos de reais
59
SELECT - BETWEEN BETWEEN:
Sintaxe: expressão [NOT] BETWEEN expressão AND expressão Ex.: y BETWEEN x AND Z equivale a x <= y <= z Selecione os nomes dos empregados que ganham mais de 1000 e menos de reais SELECT nome FROM Empregado WHERE salario BETWEEN 1000 AND 10000
60
SELECT Obter os nomes de empregados cujos endereços estão em Natal, RN
61
SELECT - LIKE LIKE: Permite comparações de substrings. Usa dois caracteres reservados ‘%’ (substitui um número arbitrário de caracteres) e ‘_‘ (substitui um único caracter). Obter os nomes de empregados cujos endereços estão em Natal, RN SELECT nome FROM empregado WHERE endereco LIKE ‘%Natal%’
62
SQL Funções Agregadas
63
Funções agregadas SQL fornece 5 funções embutidas:
COUNT: retorna o número de tuplas ou valores especificados numa query SUM: retorna a soma os valores de uma coluna AVG: retorna a média dos valores de uma coluna MAX: retorna o maior valor de uma coluna MIN: identifica o menor valor de uma coluna Estas funções só podem ser usadas numa cláusula select ou numa cláusula HAVING (a ser vista depois)
64
Funções agregadas Encontre o total de salários, o maior salário, o menor salário e a média salarial da relação empregados SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario) FROM Empregado Encontre o maior e menor salário do departamento de Produção SELECT MAX(salario), MIN(salario) FROM Empregado e join Departamento d on e.depto = d.codigo WHERE d.nome = ‘Produção’
65
Funções agregadas Obtenha o número de empregados da empresa
SELECT COUNT(*) FROM empregado Obter o número de salários distintos do departamento de Pesquisa SELECT COUNT(DISTINCT salario) FROM empregado e join departamento d on e.depto=d.codigo WHERE d.nome = ‘Pesquisa’ O que aconteceria se escrevêssemos COUNT(salario) ao invés de COUNT(DISTINCT salario))?
66
GROUP BY, HAVING Cláusula GROUP BY, HAVING
Usadas para lidar com grupos. Para cada departamento, obter o código do departamento, o número de empregados e a média salarial SELECT depto, COUNT(*), AVG(salario) FROM Empregado GROUP BY depto as tuplas de empregados são separadas em grupos (departamento) e as funções COUNT e AVG são aplicadas a cada grupo separadamente.
67
GROUP BY, HAVING Para cada projeto, obter o código do projeto, seu nome e o número de empregados que trabalham naquele projeto SELECT codigop, nome, COUNT(*) FROM Projeto p join Alocacao a On p.codigo = a.projeto GROUP BY p.codproj, p.nome o agrupamento e as funções são aplicadas após a junção.
68
HAVING HAVING usada em conjunto com GROUP BY para permitir a inclusão de condições nos grupos Para cada projeto que possui mais de 2 empregados trabalhando, obter o código do projeto, nome do projeto e número de empregados que trabalha neste projeto SELECT p.codproj, p.nome, COUNT(*) FROM Projeto p join Alocacao a ON p.codigo = a.projeto GROUP BY codigop, nome HAVING COUNT(*) > 2 Uma query é avaliada primeiro aplicando a cláusula WHERE e depois GROUP BY HAVING
69
JUNÇÕES
70
Junções O padrão SQL:1999 (e o 92) especifica vários tipos de junções:
Clássica (tabelas separadas por vírgulas como vimos) cross-joins natural joins conditions joins column name join outer joins (left, right, ou full)
71
Condition Join Exemplos: Condition Join
usa a cláusula ON para especificar a condição de junção Select * from T1 JOIN T2 ON T1.C1 = T2.C1 é equivalente a: select * from T1, T2 where T1.C1 = T2.C1
73
Junções Exemplos: Left Outer Join
Select * from T1 left outer join T2 on T1.C1 = T2.C3 T1 T Junção left outer de T1 com T2
76
Junções Exemplos: Right Outer Join
Select * from T1 right outer join T2 on T1.C1 = T2.C3 T1 T Junção right outer de T1 com T2
77
Junções Exemplos: Full Outer Join
Select * from T1 full outer join T2 on T1.C1 = T2.C3 T1 T Junção full outer de T1 com T2
80
Subconsultas (consultas aninhadas)
81
Subconsultas São comandos SELECT aninhados em outros comandos SELECT, INSERT, UPDATE ou DELETE ou outras subconsultas Podem ser utilizadas Retornando valores únicos e testando-os com operadores de comparação Como listas de linhas, através dos operadores IN, ANY, SOME ou ALL e EXISTS
82
Subconsultas Coloque as subconsultas entre parenteses
Elas devem ficar a direita dos operadores Não use ORDER BY em uma subconsulta
83
Operadores de comparação
SELECT descricao , preco FROM comida WHERE preco < ( SELECT AVG(preco) FROM comida)
84
Operadores de comparação
Select prod.titulo From produtos prod Where prod.preco > (select prod1.preco From produtos prod1 Where prod1.cod_produto = 142);
85
Operadores de comparação
Select prod.titulo From produtos prod Where prod.importado = ‘N’ and prod.preco > (select max(prod1.preco) From produtos prod1 Where prod1.importado = ‘S’);
86
Operadores de comparação
Select prod.ano_lancamento, avg(prod.preco) from produtos prod group by prod.ano_lancamento having avg(prod.preco) > (select avg(prod1.preco) from produtos prod1 where prod1.ano_lancamento = trunc(sysdate,'yyyy'));
87
Exemplo Script cerveja CREATE TABLE cerveja ( CREATE TABLE frequenta (
nome VARCHAR(45), fabricante VARCHAR(45), PRIMARY KEY (nome) PRIMARY KEY (pessoa, bar) ); CREATE TABLE bebe ( ALTER TABLE bebe ADD CONSTRAINT bebe_cerveja_fk FOREIGN KEY (cerveja) REFERENCES cerveja(nome); pessoa VARCHAR(45), cerveja VARCHAR(45), PRIMARY KEY (pessoa, cerveja) ALTER TABLE vende ADD CONSTRAINT vende_cerveja_fk FOREIGN KEY (cerveja) REFERENCES cerveja(nome); CREATE TABLE vende ( bar VARCHAR(45), preco NUMERIC(4,2), PRIMARY KEY (bar, cerveja)
88
INSERT INTO cerveja VALUES ('Antarctica Original', 'Ambev'); INSERT INTO cerveja VALUES ('Bohemia Weiss', 'Ambev'); INSERT INTO cerveja VALUES ('Brahma Extra', 'Ambev'); INSERT INTO cerveja VALUES ('Skol', 'Ambev'); INSERT INTO cerveja VALUES ('Budweiser', 'Ambev'); INSERT INTO cerveja VALUES ('Eisenbahn Dunkel', 'Sudbrack'); INSERT INTO cerveja VALUES ('Colonia Pilsen', 'Colonia'); INSERT INTO cerveja VALUES ('Nova Schin Pilsen', 'Schincariol'); INSERT INTO cerveja VALUES ('Primus', 'Schincariol'); INSERT INTO bebe VALUES ('Fulano','Brahma Extra'); INSERT INTO bebe VALUES ('Joao','Skol'); INSERT INTO bebe VALUES ('Joao','Brahma Extra'); INSERT INTO bebe VALUES ('Joao','Primus'); INSERT INTO bebe VALUES ('Joao','Nova Schin Pilsen'); INSERT INTO bebe VALUES ('Amadeu','Eisenbahn Dunkel'); INSERT INTO bebe VALUES ('Joana','Budweiser'); INSERT INTO bebe VALUES ('Timoteo','Antarctica Original'); INSERT INTO vende VALUES ('Bar BQ', 'Nova Schin Pilsen', 1.00); INSERT INTO vende VALUES ('Bar BQ', 'Skol', 2.00); INSERT INTO vende VALUES ('Bar BQ', 'Colonia Pilsen', 1.50); INSERT INTO vende VALUES ('Bar BQ', 'Budweiser', 2.00); INSERT INTO vende VALUES ('Bar BQ', 'Brahma Extra', 2.00); INSERT INTO vende VALUES ('Bar X', 'Primus', 1.50); INSERT INTO frequenta VALUES ('Fulano','Bar BQ'); INSERT INTO frequenta VALUES ('Joao','Bar Bada'); INSERT INTO frequenta VALUES ('Amadeu','Bar X'); INSERT INTO frequenta VALUES ('Joana','Bar BQ');
89
Exemplo Encontrar cervejas vendidas abaixo do preço médio.
select cerveja from vende where preco < (select avg(preco) from vende)
90
Exemplo Encontrar as cervejas vendidas pelo mais baixo preço.
select cerveja from vende where preco = (select min(preco) from vende)
91
Operador IN Retorna as linhas iguais a qualquer linha da subconsulta
Podemos usar NOT IN Equivalente a =ANY O operador IN aceita a comparação simultânea de mais de uma coluna
92
Operador IN Select ped.num_pedido From pedidos ped
Where ped.cod_cliente in (select adm.cod_administrador From administradores adm);
93
Operador IN select ped.num_pedido from pedidos ped
where (ped.cod_cliente, ped.cod_endereco) in (select end.cod_cliente, end.cod_endereco from enderecos where end.cod_cidade = 20);
94
Operadores ANY e SOME Compara um valor com cada linha da subconsulta, utilizando um operador de comparação ANY e SOME são sinonimos select prod.titulo from produtos prod where prod.importado = 'N' and prod.preco > ANY (select prod1.preco from produtos prod1 where prod1.importado = 'S');
95
Operador ALL Compara um valor com todas as linhas da subconsulta, utilizando um operador select prod.titulo from produtos prod where prod.importado = 'N' and prod.preco > ALL (select prod1.preco from produtos prod1 where prod1.importado = 'S');
96
Is null Podemos verificar valores nulos através de IS NULL e IS NOT NULL: Selecione os nomes de todos os empregados que não têm supervisores SELECT nome FROM empregado WHERE supervisor IS NULL
97
Exemplo Encontrar nomes de cervejas que nenhuma pessoa bebe.
select nome from cerveja where nome not in (select cerveja from bebe)
98
Exemplo Encontrar pessoas que bebem cerveja mas não freqüentam bares.
select pessoa from bebe where pessoa not in (select pessoa from frequenta)
99
Exemplo Encontrar bares que vendem pelo menos uma cerveja que 'Fulano' bebe. select distinct bar from vende where cerveja = any(select cerveja from bebe where pessoa = 'Fulano')
100
Exemplo Encontrar nomes de fabricantes de cada cerveja que 'Fulano' bebe. select fabricante from cerveja where nome in (select cerveja from bebe where pessoa='Joao')
101
Exemplo Encontrar cervejas que são o único produto de seu fabricante.
select nome from cerveja where fabricante in ( select fabricante from cerveja group by fabricante having count(*)=1)
102
Exemplo Encontrar bares que sao frequentados por Fulano OU que vendem cerveja a menos de R$ 2,00. select bar from frequenta where pessoa = 'Fulano' or bar in (select bar from vende where preco <2)
103
Exemplo Encontrar pessoas e cervejas tal que: a pessoa bebe a cerveja E a pessoa freqüenta um bar que vende a cerveja. select pessoa, cerveja from bebe where pessoa in ( select pessoa from frequenta where bar in ( select bar from vende where vende.cerveja = bebe.cerveja))
104
Exemplo Encontrar cervejas do fabricante 'Ambev' que NÃO são vendidas no bar 'Bar BQ'. select nome from cerveja where fabricante = 'Ambev' and nome not in (select cerveja from vende where bar='Bar BQ')
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.