Banco de Dados I Linguagem de Consulta (parte II) Recuperando Dados de Várias Tabelas (JOINS)
Exemplo - pedido Diagrama Entidade-Relacionamento N Pedido N possui N Produto N faz tira 1 Cliente 1 Vendedor
Exemplo Pedido Diagrama ER N Pedido Pedido N N possui N Produto Produto faz tira 1 Cliente Cliente 1 Vendedor Diagrama de Tabelas Pedido Item_de_Pedido (possui ) (possui ) Produto Cliente Vendedor
Exemplo Pedido PEDIDO PEDIDO Núm_pedido Núm_pedido Prazo_entrega Prazo_entrega Código_cliente Código_cliente Código_vendedor Código_vendedor ITEM_DO_PEDIDO ITEM_DO_PEDIDO Núm_pedido Núm_pedido Código_produto Código_produto Quantidade Quantidade CLIENTE CLIENTE Código_cliente Código_cliente Nome_cliente Nome_cliente Endereço Endereço Cidade Cidade CEP CEP UF UF CGC CGC IE IE VENDEDOR VENDEDOR Código_vendedor Código_vendedor Nome_vendedor Nome_vendedor Faixa_comissão Faixa_comissão Salário_fixo Salário_fixo PRODUTO PRODUTO Código_produto Código_produto Descrição Descrição Unidade Unidade Val_unit Val_unit
SQL:DDL Revisão Linguagem de Definição de Dados:... create, alter, drop Consultando informações: select
Criação e Destruição de Tabelas CREATE TABLE <tabela> (<descrição das colunas>); (<descrição das chaves>); char (n) : cadeia de caracter de tamanho fixo (pode-se usar character - máx n 255) varchar ou varchar2 (n): caracteres de tamanho variável. (pode-se usar smallint: é um inteiro pequeno character varing - máx n 2000). number (p,d): número com máx de 38 caracteres. p é o total incluindo a casa decimal e d é o número de casas decimais. Ex numeric(3,1) 44,5 444,5 e 0,32 float (n): número em ponto flutuante com precisão definida pelo usuário em pelo menos n dígitos. date: tipo calendário contendos século, ano (4 dígitos), mês e dia do mês.+ horas horário, em horas, minutos e segundos. ( 12:00 quando somente data, DD-MON-YY ) long: alfanumérico de tamanho variável. ( 2Giga), um por tabela. Não pode ser usado em consulta raw ou long raw: campo binário de tamanho variável. ( 2000 e 2Giga)
Ex:tabelas ITEM_DO_PEDIDO CREATE TABLE ITEM_DO_PEDIDO (num_pedido smallint not null unique, código_produto smallint not null unique, quantidade number(3), FOREIGN KEY (num_pedido) REFERENCES PEDIDO, FOREIGN KEY (código_produto) REFERENCES PRODUTO); CREATE TABLE ITEM_DO_PEDIDO (num_pedido smallint not null, código_produto smallint not null, quantidade number(3), FOREIGN KEY (num_pedido) REFERENCES PEDIDO, FOREIGN KEY (código_produto) REFERENCES PRODUTO, PRIMARY KEY (num_pedido, código_produto));
Ex:tabelas Vendedor e Produto CREATE TABLE VENDEDOR (código_vendedor smallint not null, nome_vendedor char(20), salário_fixo number(6,2), faixa_comissão char(1), PRIMARY KEY código_vendedor) ( ); CREATE TABLE PRODUTO (código_produto smallint not null, unidade char(3), descrição_produto char(30), val_unit number(10,2), PRIMARY KEY código_produto) ( );
Destruição de Tabelas Forma: DROP TABLE <tabela>; DROP TABLE PEDIDO;
Consultando dados: estrutura Select colunas (projeção π) From tabela Where restrições (linhas seleção δ) Aluno RA Nome Idade tabela 952001 992655 Ana Marcão 19 20 Linha 1 302566 Paulinha 22......... Coluna 1
Extraindo Dados de uma Tabela: Comando SELECT (projeção - π ) A) Selecionando Colunas Especificas da Tabela: Forma: Problema : Select <nome(s) da(s) coluna(s)> from <tabela>; -Listar todos os produtos com respectivas descrições, unidades e valores unitários. SQL: Resultado: Select descrição, unidade, valor_unitário from produto;
Extraindo Dados de uma Tabela: Comando SELECT (projeção - π ) B) Selecionando todas as Colunas da Tabela Forma: Select * from <tabela> ; Problema: - Listar todo o conteúdo de Vendedor SQL: Select * From vendedor ; Código do Vendedor Nome do Vendedor Salário Fixo Faixa de Comissão 209 José 1.800,00 C 111 Carlos 2.490,00 A 11 João 2.780,00 C 240 Antônio 9.500,00 C 720 Felipe 4.600,00 A 213 Jonas 2.300,00 A 101 João 2.650,00 C 310 Josias 870,00 B 250 Maurício 2.930,00 B
Selecionando somente alguns Registros da Tabela: ( seleção - δ) Forma: Onde: Where Select <nomes da(s) coluna(s)> from <tabela> Where <restrições>; <nome da coluna> <operador> <valor> C.1) Operadores Relacionais: =, <> ou!=, <, > >=, <= Observações: quando o atributo é do tipo caracter, o <valor> deve estar entre aspas ( ). Ex: Parafuso. Em SQL existe diferença entre Parafuso e parafuso.
Selecionando somente alguns Registros da Tabela: ( seleção - δ) Problema: - Listar o num_pedido, o código_produto e a quantidade dos itens do pedido com a quantidade igual a 35. SQL: Select num_pedido, código_produto, quantidade from item_do_pedido Where quantidade = 35; Resultado: Número do Código do Quantidade Pedido Produto 121 31 35 138 77 35
Selecionando somente alguns Registros da Tabela: C.2) Operadores Lógicos: AND, OR ; NOT. Uso de ( ) para alterar a precedência : AND > OR Problema : -Listar os produtos que tenham unidade igual a M e valor unitário igual a R$ 1,05 SQL: Select descrição_produto from produto Where unidade = M AND val_unit = 1.05 ; Resultado: DESCRICAO Papel
Selecionando somente alguns Registros da Tabela: Exerc 3: Liste os clientes e seus respectivos endereços que moram em São Paulo OU estejam na faixa de CEP entre '30077000' e '30079000'. SQL: Resultado: Select from Where nome_cliente, endereço cliente (CEP >= 30077000 AND CEP <= 30079000 ) OR cidade = 'São Paulo ; NOME CLIENTE ENDERECO CLIENTE Flávio Av.Pres.Vargas10 Jorge Rua Caiapo13 Maurício Av.Paulista1236 sl 2345 Rodolfo Largo da Lapa 27 sobrado Beth Av. Climério n.45 Lívio Av. Beira Mar n.1256 Renato Rua Meireles n.1231 bl.2 sl.345
Selecionando somente alguns Registros da Tabela: Problema: - Mostrar todos os pedidos que não tenham prazo de entrega igual a 15 dias SQL: Select num_pedido from pedido Where NOT ( prazo_entrega = 15 ); Resultado: NÚMERO DO PEDIDO 121 97 137 148 104 203... 98 91
Selecionando Registros da Tabela: C.3) Operadores Between e NOT Between Where <nome da coluna> BETWEEN <valor1> AND <valor2> Where <nome da coluna> NOT BETWEEN <valor1> AND <valor2> Pesquisa por uma determinada coluna que esteja dentro da faixa de valores Não há necessidade dos operadores >=, <= e AND. Os VALOR1 e VALOR2 têm que ser do mesmo tipo de dado da coluna.
Selecionando Registros da Tabela: C.3) Operadores Between e NOT Between Problema: -Listar o código e a descrição dos produtos que tenham o valor unitário na faixa de R$ 0,32 até R$ 2,00. SQL: Select from código_ produto, descrição_produto produto Where val_unit BETWEEN 0.32 AND 2.00; Resultado: CÓDIGO DO DESCRIÇÃO PRODUTO 25 Queijo 31 Chocolate 78 Vinho 53 Linha 87 Cano 77 Papel
Selecionando Registros da Tabela: C.4) Operadores LIKE e NOT LIKE -Where <nome da coluna> LIKE <valor>; -Where <nome da coluna> NOT LIKE <valor>; LIKE e NOT LIKE só trabalham sobre colunas que sejam do tipo CHAR. Eles têm praticamente o mesmo funcionamento que os operadores =, < >, Podem utilizar os símbolos ( % ) e ( _ ) que podem fazer o papel de "Curinga": % - substitui uma palavra _ - substitui um caractere Ex LAPIS % 'pode enxergar os seguintes registros: LAPIS PRETO, LAPIS CERA', 'LAPIS BORRACHA BROCA N_ pode enxergar os seguintes registros; 'BROCA N1, 'BROCA N9, BROCA N3,
Selecionando Registros da Tabela: C.4) Operadores LIKE e NOT LIKE Exerc 4: - Listar todos os produtos que tenham a sua unidade começando por K. SQL: Select código_produto, descrição_produto from produto Where unidade LIKE 'K_ ; Resultado: CODIGO DO PRODUTO DESCRIÇÃO 25 Queijo
Selecionando Registros da Tabela: C.5) Operadores IN e NOT IN -Where <nome da coluna> IN <valores>; -Where <nome da coluna> NOT IN <valores> ; Pesquisam registros que estão ou não contidos no conjunto de <valores> fornecido. Estes minimizam o uso dos operadores: =, <>, AND e OR.
Selecionando Registros da Tabela: C.5) Operadores IN e NOT IN Problema: - Listar os vendedores que são da faixa de comissão A e B. SQL: Select from Where nome_vendedor vendedor faixa comissão IN ( A, 'B'); Resultado: NOME VENDEDOR Carlos Felipe Jonas Josias Maurício
Selecionando Registros da Tabela: C.6) Operadores IS NULL e IS NOT NULL Problema: - Where<nome da coluna> IS NULL; - Where<nome da coluna> IS NOT NULL; - Mostrar os clientes que não tenham inscrição estadual. SQL: Select * from cliente Where IE IS NULL;
Selecionando Registros da Tabela: D) Ordenando os Dados Selecionados Select<nome da(s) coluna(s)> from <tabela> Where<condição(es)> order by <nome da(s) coluna(s)> ASC / DESC ou order by <número da coluna > ASC (default) / DESC Problema: - Mostrar em ordem alfabética a lista de vendedores e seus respectivos salários fixos. SQL: Select nome_vendedor, salário_fixo from vendedor order by nome_vendedor;
Selecionando Registros da Tabela: E) Realizando CÁLCULOS com Informações Selecionada Problema: - Mostrar o novo salário fixo dos vendedores, de faixa de comissão 'C, calculado com base no reajuste de 75% acrescido de R$ 120,00 de bonificação. Ordenar pelo nome do vendedor. SQL: Select from Where order by nome_vendedor, novo salário = (salário_fixo * 1.75) + 120 vendedor faixa comissão = 'C' nome_vendedor;
Selecionando Registros da Tabela: E) Realizando CÁLCULOS com Informações Selecionada F) Utilizando Funções sobre Conjuntos MAX, MIN SUM, AVG F.1) Buscando Máximos e Mínimos (MAX, MIN) Problema: - Mostrar o menor e o maior salário de vendedor. SQL: Resultado: F.2) Totalizando Colunas (SUM) Select MIN(salário_fixo), MAX(salário_fixo) from vendedor ; MIN(salário fixo) MAX(salário fixo) 870,00 9.500,00 Problema: - Mostrar a quantidade total pedida para o produto 'VINHO' de código '78'. SQL: Select from SUM(quantidade), item_do_pedido Where código_produto = 78 ;
Selecionando Registros da Tabela: E) Realizando CÁLCULOS com Informações Selecionada Problema: - Qual a média dos salários fixos dos vendedores? SQL: Select AVG (salário_fixo), from vendedor; Resultado: AVG(salário_fixo) 3.324,44 F.4) Contando os Registros (COUNT) Problema: - Quantos vendedores ganham acima de R$ 2.500., de salário fixo? SQL: Select COUNT(*), from vendedor Where salário_fixo >2500 ; Resultado: COUNT(*) 5
Selecionando Registros da Tabela: F.5) Utilizando a Cláusula DISTINCT Vários registros dentro de uma tabela podem conter os mesmos valores, com exceção da chave primária. Algumas consultas podem trazer informações erradas. A cláusula DISTINCT, foi criada para não permitir que certas redundâncias, obviamente necessárias, causem problemas. Problema: - Quais as unidades de produtos, diferentes, na tabela produto? SQL: Resultado: Select DISTINCT unidade, from produto; UNIDADE K BAR L M SAC G
Recuperando Dados de Várias Tabelas (JOINS) Trabalhamos até agora com a recuperação de dados sobre apenas uma tabela, no entanto um banco de dados é formado por várias tabelas que se relacionam. Para recuperar informações em de várias tabelas muitas vezes precisamos realizar uma JUNÇÃO (JOIN) entre as tabelas. É esta operação e suas implicações que será abordado nesta momento.
Recuperando Dados de Várias Tabelas (JOINS) O Conceito de Qualificadores de Nome Consiste em identificar as colunas pôr meio do nome das tabela. Qualificador de nome para a coluna descrição da tabela PRODUTO será: PR0DUT0. descrição Os qualificadores de nome são utilizados em uma consulta para efetivar a junção (JOIN) entre tabelas. (nomes de colunas iguais em tabelas diferentes)
Recuperando Dados de Várias Tabelas (JOINS) Juntar a tabela cliente com pedido, identificando os pedidos de cada cliente. CLIENTE CLIENTE Código_cliente Código_cliente Nome_cliente Nome_cliente Endereço Endereço Cidade Cidade CEP CEP UF UF CGC CGC IE IE PEDIDO PEDIDO Núm_pedido Núm_pedido Prazo_entrega Prazo_entrega Código_cliente Código_cliente Código_vendedor Código_vendedor
Recuperando Dados de Várias Tabelas (JOINS) Uma solução é realizar a operação de produto cartesiana entre os dois conjuntos. CLIENTE CLIENTE Código_cliente Código_cliente Nome_cliente Nome_cliente Endereço Endereço Cidade Cidade CEP CEP UF UF CGC CGC IE IE PEDIDO PEDIDO Núm_pedido Núm_pedido Prazo_entrega Prazo_entrega Código_cliente Código_cliente Código_vendedor Código_vendedor c1 c2... cn p1 p2... pn
Recuperando Dados de Várias Tabelas (JOINS) Uma solução é realizar a operação de produto cartesiana entre os dois conjuntos. CLIENTE CLIENTE Código_cliente Código_cliente Nome_cliente Nome_cliente Endereço Endereço Cidade Cidade CEP CEP UF UF CGC CGC IE IE PEDIDO PEDIDO Núm_pedido Núm_pedido Prazo_entrega Prazo_entrega Código_cliente Código_cliente Código_vendedor Código_vendedor SELECT FROM cliente, pedido cliente.codigo_cliente, pedido. codigo_cliente, num_pedido
Recuperando Dados de Várias Tabelas (JOINS) Podemos notar que dessa operação de junção, poucas informações podem ser extraídas. Uma vez que a operação realizada foi a de produto cartesiano, onde é feita a combinação de cada elemento de um conjunto com todos os elementos do outro conjunto. Assim, há a necessidade de qualificar o tipo de junção, para podermos obter algum resultado concreto. NOME CLIENTE PEDIDO.COD_CLIENTE NUMERO PEDIDO Ana 720 97 SELECT cliente.codigo_cliente, pedido. codigo_cliente, num_pedido FROM cliente, pedido Ana 260 111 Ana 870 54 Ana 390 119 Ana 260 103 Ana 830 203 Ana 410 121 Ana 110 104 Ana 180 105 Ana 720 83 Ana 290 108 Ana 410 89 Flávio 720 97 Flávio 260 111
Recuperando Dados de Várias Tabelas (JOINS) Assim, há a necessidade de qualificar o tipo de junção, para podermos obter algum resultado concreto. Equação de JUNÇÃO CLIENTE CLIENTE Código_cliente Código_cliente Nome_cliente Nome_cliente Endereço Endereço Cidade Cidade CEP CEP UF UF CGC CGC IE IE PEDIDO PEDIDO Núm_pedido Núm_pedido Prazo_entrega Prazo_entrega Código_cliente Código_cliente Código_vendedor Código_vendedor c1 c2... cn p1 p2... pn SELECT cliente.codigo_cliente, pedido. codigo_cliente, num_pedido FROM cliente, pedido AND cliente.codigo_cliente =pedido.codigo_cliente
Recuperando Dados de Várias Tabelas (JOINS) Juntar a tabela cliente com pedido, identificando os pedidos de cada cliente. CLIENTE CLIENTE Código_cliente Código_cliente Nome_cliente Nome_cliente Endereço Endereço Cidade Cidade CEP CEP UF UF CGC CGC IE IE PEDIDO PEDIDO Núm_pedido Núm_pedido Prazo_entrega Prazo_entrega Código_cliente Código_cliente Código_vendedor Código_vendedor
Recuperando Dados de Várias Tabelas (JOINS) Juntar a tabela cliente com pedido, identificando os pedidos de cada cliente? CLIENTE CLIENTE Código_cliente PEDIDO Código_cliente PEDIDO Nome_cliente Nome_cliente Endereço Endereço Cidade Núm_pedido Cidade Núm_pedido CEP Prazo_entrega CEP Prazo_entrega UF Código_cliente UF Código_cliente CGC Código_vendedor CGC Código_vendedor IE IE SELECT cliente.codigo_cliente, pedido. codigo_cliente, num_pedido FROM cliente, pedido AND cliente.codigo_cliente=pedido.codigo_cliente NOME CLIENTE PEDIDO.COD_CLIENTE NÚMERPEDIDO Ana 720 97 Ana 720 101 Ana 720 137 Ana 720 148 Flávio 870 189 Jorge 110 104 Maurício 830 203 Rodolfo 410 121 Rodolfo 410 98 Rodolfo 410 127 Beth 20 143 Lívio 180 105 Susana 260 111 Susana 260 103 Susana 260 91 Susana 260 138 Renato 290 108 Sebastião 390 119
Problema: Quais clientes que têm prazo de entrega superior a 15 dias e que pertencem aos estados de São Paulo ( SP ) ou Rio de Janeiro (RJ)?
Problema: Select nome_cliente, UF, prazo_entrega from cliente, pedido Where UF IN ( SP, RJ') AND prazo_entrega > 15 AND cliente.cod_cliente = pedido.cod_cliente; NOME_CLIENTE UF PRAZO_ENTREGA Ana RJ 20 Maurício SP 30 Rodolfo RJ 20 Beth SP 30 Susana RJ 20
Exercício 7: - Mostrar os clientes e seus respectivos prazos de entrega, ordenados do maior para o menor.
ALIASES (sinônimos): Pode-se definir sinônimos, evitando escrever os nomes das tabelas nas qualificações de nome. A definição dos ALIASES é feita na clausula FROM. É utilizada normalmente nas outras clausulas (Where, order by, group by, having, select). Problema: - Apresentar os vendedores, ordenados por nome, que emitiram pedidos com prazos de entrega superiores a 15 dias e que tenham salários fixos igual ou superior a R$ 1.000,00. Select nome_vendedor, prazo_entrega from vendedor V, pedido P Where salário_fixo >= 1000.00 AND prazo_entrega > 15 AND V. cod_vendedor = P. cod_vendedor order by nome_vendedor;
Juntando mais de duas Tabelas Exerc 8: Mostre os clientes (ordenados) que têm prazo de entrega major que 15 dias para o produto QUEIJO e que sejam do Rio de Janeiro.
Exerc 9: Mostre todos os vendedores que venderam chocolate em quantidade superior a 10 Kg.
Exerc 10: Quantos clientes fizeram pedido com o vendedor João?
Problema: Quantos clientes da cidade do Rio de Janeiro, e Niterói tiveram seus pedidos tirados com o vendedor João?
Problema: Quantos clientes da cidade do Rio de Janeiro, e Niterói tiveram seus pedidos tirados com o vendedor João? Select cidade, número = COUNT (nome_cliente) from cliente C, pedido P, vendedor V Where nome_vendedor = 'João' AND CIDADE IN ('Rio de Janeiro', 'Niterói') AND V. cod_vendedor = P. cod_vendedor AND P. cod_cliente = V. cod cliente Group by cidade;
Utilizando Consultas Encadeadas (Subqueries) Subquery é quando o resultado de uma consulta é utilizado por outra consulta, de forma encadeada e contida no mesmo comando SQL. Sua forma geral: SELECT col1, col2 FROM tab1 WHERE col1, col2 IN ( SELECT col1, col2 FROM tab2 WHERE restrição);
Problema: Que produtos participam em qualquer pedido cuja quantidade seja 10?
Problema: Que produtos participam em qualquer pedido cuja quantidade seja 10? Select descrição from produto Where cod_produto IN ( Select cod_produto from item_pedido Where quantidade = 10 );
Exerc 11: Quais vendedores ganharam um salário fixo abaixo da média?
Exerc 12: Quais os produtos que não estão presentes em nenhum pedido? ( código e descrição) Select cód_produto, descrição from produto P Where not exists ( Select * from item_pedido Where cod_produto = P. cod_produto ) ;
Problema: Quais os vendedores que só venderam produtos por grama ('G )? Select DISTINCT cod_vendedor, nome vendedor from vendedor V Where G = ALL ( Select unidade from pedido P, item_pedido I, produto PR Where P. num_pedido = I. num_pedido AND I. cod_produto = PR. cod_produto AND p. cod_vendedor = V. cod vendedor ) ;
Exerc 13: Quais clientes estão presentes em mais de três pedidos?
Exerc 13: Quais clientes estão presentes em mais de três pedidos?
Combinando Resultados de Pesquisas ( UNION) Combina os resultados de duas ou mais colunas feitas sobre tabelas. Devem selecionar o mesmo número de colunas. As colunas selecionadas devem ser do mesmo tipo.
Problema: - Listar os nomes e códigos dos vendedores que têm salário fixo maior que RS 1.000,00 e nomes e códigos de clientes que residem no Rio de Janeiro. Select from Where codigo = cod_cliente, nome = nome_cliente cliente UF = RJ UNION Select cod_vendedor, nome_vendedor from vendedor Where salário_fixo > 1000.00
Adicionando Registro à Tabela Forma: INSERT INTO <nome da tabela> (<nome da(s) coluna(s)>) VALUES (<valores>);
Adicionando Registro à Tabela Adicionar a produto parafuso a tabela produto? Insert into produto values ( 108, 'Parafuso', 'Kg', 1.25 );
Adicionando Registros usando um SELECT Forma: INSERT INTO Problema: Select from <nome da tabela> (<nome da(s) coluna(s)>) <nome da(s) coluna(s)> <nome da tabela> Where <condição>; - Cadastrar como cliente os vendedores que emitiram mais de 50 pedidos. Usar para código de cliente o mesmo código de vendedor Insert into Cliente (cod_cliente, nome cliente) Select cod_vendedor, nome_vendedor, COUNT(*) from vendedor V, pedido p Where V. cod_vendedor = P. cod_vendedor having count ( * ) > 50 ;
Atualizando um Registro Forma: UPDATE <nome da tabela> Problema: Set <nome da(s) Coluna(s) > = valor Where <condição>; - Alterar o valor unitário do produto 'parafuso' de R$ 1.25 para R$ 1.62. update produto set val_unit = 1.62 Where descrição = 'Parafuso' ;
Problema: Pr- Atualizar o salário fixo de todos os vendedores em 27% mais uma bonificação de R$ 100,00. update vendedor set salário_fixo = (salario_fixo * 1.27) + 100.00;
Problema: - Acrescentar 2,5% ao preço unitário dos produtos que estejam abaixo da média dos preços, para aqueles comprados a Quilo. update produto set val_unit = val_unit * 1.025 Where val_unit < ( Select AVG ( val_unit ) from produto Where unidade = Kg ) ;
Apagando Registros da Tabela Forma: DELETE FROM <nome da tabela> WHERE <condição>;
Apagando Registros da Tabela Problema: - Apagar todos os vendedores com faixa de comissão nula. DELETE FROM vendedor Where faixa_ comissão IS NULL ;
Problema: Apagar todos os registros de pedidos realizados por vendedores fantasmas (operação caça-fantasma). DELETE FROM pedido P Where not exists ( Select cod_vendedor from vendedor ; Where cod_vendedor = P. cod_vendedor )