Students to Business – 2011/1 Fase 2 Área de Banco de Dados Transact SQL : Consultando o Banco de Dados Agenda • Listando dados com TOP n • Usando funções agregadas • Noções básicas sobre a cláusula GROUP BY • Gerando valores agregados em conjuntos de resultados • Usando as cláusulas COMPUTE e COMPUTE BY • Hands On: Comandos de DML Avançados • Laboratório: Consultando o ambiente AERO Listando os primeiros n valores com TOP n • Lista apenas os n primeiros registros de um conjunto de resultados • Especifica o intervalo de valores na cláusula ORDER BY • Retorna correspondências se WITH TIES for usada Exemplo 1 USE northwind SELECT TOP 5 orderid, productid, quantity FROM [order details] ORDER BY quantity DESC GO Exemplo 2 USE northwind SELECT TOP 5 WITH TIES orderid, productid, quantity FROM [order details] ORDER BY quantity DESC GO Usando funções agregadas Funções agregadas Descrição AVG Média de valores em uma expressão numérica COUNT Número de valores em uma expressão COUNT (*) Número de registros selecionados MAX Maior valor da expressão MIN Menor valor da expressão SUM Valores totais em uma expressão numérica STDEV Desvio padrão de todos os valores STDEVP Desvio padrão da população VAR Variância estatística de todos os valores VARP Variância estatística de todos os valores da população Usando funções agregadas com valores nulos • A maioria das funções agregadas ignora valores nulos • A função COUNT (*) conta todos os registros com valores nulos USE northwind SELECT COUNT (*) FROM employees GO Exemplo 1 USE northwind SELECT COUNT(reportsto) FROM employees GO Exemplo 2 Noções básicas sobre a cláusula GROUP BY • Usando a cláusula GROUP BY • Usando a cláusula GROUP BY com a cláusula HAVING Usando a cláusula GROUP BY USE northwind SELECT productid, orderid ,quantity FROM orderhist GO productid orderid USE northwind SELECT productid ,SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid GO quantity 1 1 5 1 1 10 2 1 10 2 2 25 3 1 15 3 2 30 productid Apenas os registros que satisfazem às condições da cláusula WHERE serão agrupados total_quantity 1 15 2 35 3 45 productid 2 total_quantity 35 USE northwind SELECT productid ,SUM(quantity) AS total_quantity FROM orderhist WHERE productid = 2 GROUP BY productid GO Usando a cláusula GROUP BY com a cláusula HAVING USE northwind SELECT productid, orderid ,quantity FROM orderhist GO productid orderid quantity USE northwind SELECT productid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid HAVING SUM(quantity)>=30 GO 1 1 5 1 1 10 2 1 10 2 35 2 2 25 3 45 3 1 15 3 2 30 productid total_quantity Gerando valores agregados em conjuntos de resultados • Usando a cláusula GROUP BY com o operador ROLLUP • Usando a cláusula GROUP BY com o operador CUBE • Usando a função GROUPING Usando a cláusula GROUP BY com o operador ROLLUP USE northwind SELECT productid, orderid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid, orderid WITH ROLLUP ORDER BY productid, orderid GO productid orderid total_quantity Descrição NULL NULL 95 1 NULL 15 1 1 5 1 2 10 2 NULL 35 2 1 10 2 2 25 Valores de detalhe de productid 2, orderid 1 3 NULL 45 Resume apenas os registros de productid 3 3 1 15 Valores de detalhe de productid 3, orderid 1 3 2 30 Valores de detalhe de productid 3, orderid 2 Total geral Resume apenas os registros de productid 1 Valores de detalhe de productid 1, orderid 1 Valores de detalhe de productid 1, orderid 2 Resume apenas os registros de productid 2 Usando a cláusula GROUP BY com o operador CUBE USE northwind SELECT productid, orderid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid, orderid WITH CUBE ORDER BY productid, orderid GO productid orderid total_quantity Descrição NULL NULL 95 Total geral NULL 1 30 Resume todos os registros de orderid 1 O operador CUBE NULL produz dois 1 valores de 1 resumo a mais que o operador 1 ROLLUP 2 2 65 Resume todos os registros de orderid 2 NULL 15 Resume apenas os registros de productid 1 1 5 Valores de detalhe de productid 1, orderid 1 2 10 Valores de detalhe de productid 1, orderid 2 NULL 35 Resume apenas os registros de productid 2 2 1 10 Valores de detalhe de productid 2, orderid 1 2 2 25 Valores de detalhe de productid 2, orderid 2 3 NULL 45 Resume apenas os registros de productid 3 3 1 15 Valores de detalhe de productid 3, orderid 1 3 2 30 Valores de detalhe de productid 3, orderid 2 Usando a função GROUPING USE northwind SELECT productid, GROUPING (productid) ,orderid, GROUPING (orderid) ,SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid, orderid WITH CUBE ORDER BY productid, orderid GO productid 1 representa os valores de resumo na coluna anterior 0 representa os valores de detalhe na na coluna anterior NULL NULL NULL 1 1 1 2 2 2 3 3 3 orderid 1 1 1 0 0 0 0 0 0 0 0 0 NULL 1 2 NULL 1 2 NULL 1 2 NULL 1 2 total_quantity 1 0 0 1 0 0 1 0 0 1 0 0 95 30 65 15 5 10 35 10 25 45 15 30 Usando as cláusulas COMPUTE e COMPUTE BY COMPUTE COMPUTE BY USE northwind SELECT productid, orderid ,quantity FROM orderhist ORDER BY productid, orderid COMPUTE SUM(quantity) GO USE northwind SELECT productid, orderid, quantity FROM orderhist ORDER BY productid, orderid COMPUTE SUM(quantity) BY productid COMPUTE SUM(quantity) GO productid orderid quantity productid orderid quantity 1 1 5 1 1 5 1 2 10 1 2 10 2 1 10 2 1 10 2 2 25 2 2 25 3 1 15 3 2 30 3 1 15 95 3 2 30 sum sum sum 15 35 sum 45 sum 95 Usando operadores lógicos Exemplo 1 USE northwind SELECT productid, productname, supplierid, unitprice FROM products WHERE (productname LIKE 'T%' OR productid = 46) AND (unitprice > 16.00) GO productid 14 29 62 productname Tofu Thüringer Rostbratwurst Tarte au sucre supplierid 6 12 29 unitprice 23.25 123.79 49.3 Recuperando um intervalo de valores USE northwind SELECT productname, unitprice FROM products WHERE unitprice BETWEEN 10 AND 20 GO productname Chai Chang Aniseed Syrup Genen Shouyu Pavlova Sir Rodney’s Scones … unitprice 18 19 10 15.5 17.45 10 … Exemplo 1 Usando uma lista de valores como critérios de pesquisa Exemplo 1 USE northwind SELECT companyname, country FROM suppliers WHERE country IN ('Japan', 'Italy') GO companyname Tokyo Traders Mayumi’s Formaggi Fortini s.r.l. Pasta Buttini s.r.l. country Japan Japan Italy Italy Recuperando valores Nulos USE northwind SELECT companyname, fax FROM suppliers WHERE fax IS NULL GO companyname Exotic Liquids New Orleans Cajun Delights Tokyo Traders Cooperativa de Quesos ‘Las Cabras’ … fax NULL NULL NULL NULL … Formatando conjuntos de resultados • • • • Classificando dados Ocultando registros duplicados Alterando nomes de colunas Usando literais Classificando dados Exemplo 1 USE northwind SELECT productid, productname, categoryid, unitprice FROM products ORDER BY categoryid, unitprice DESC GO productid 38 43 2 … 63 8 61 … productname Cote de Blaye Ipoh Coffee Chang … Vegie-spread Northwoods Cranberry Sauce Sirop d'érable … categoryid 1 1 1 … 2 2 2 … unitprice 263.5000 46.0000 19.0000 … 43.9000 40.0000 28.5000 … Ocultando registros duplicados Exemplo 1 USE northwind SELECT DISTINCT country FROM suppliers ORDER BY country GO country Australia Brazil Canada Denmark Finland France Germany Italy Japan Netherlands Norway Singapore Spain Sweden UK USA Alterando nomes de colunas USE northwind SELECT firstname AS First, lastname AS Last ,employeeid AS 'Employee ID:' FROM employees GO First Nancy Andrew Janet Margaret Steven Michael Robert Laura Anne Last Davolio Fuller Leverling Peacock Buchanan Suyama King Callahan Dodsworth Employee ID: 1 2 3 4 5 6 7 8 9 Usando literais USE northwind SELECT firstname, lastname, 'Identification number:', employeeid FROM employees GO firstname Nancy Andrew Janet Margaret Steven Michael Robert Laura Anne lastname Davolio Fuller Leverling Peacock Buchanan Suyama King Callahan Dodsworth employeeid Identification Number: 1 Identification Number: 2 Identification Number: 3 Identification Number: 4 Identification Number: 5 Identification Number: 6 Identification Number: 7 Identification Number: 8 Identification Number: 9 Visão geral • Usando aliases para nomes de tabelas • Combinando dados de várias tabelas • Combinando vários conjuntos de resultados Usando aliases para nomes de tabelas • Exemplo 1 (sem nome de alias) USE joindb SELECT buyer_name, sales.buyer_id, qty FROM buyers INNER JOIN sales ON buyers.buyer_id = sales.buyer_id GO • Exemplo 2 (com nome de alias) USE joindb SELECT buyer_name, s.buyer_id, qty FROM buyers AS b INNER JOIN sales AS s ON b.buyer_id = s.buyer_id GO Combinando dados de várias tabelas • • • • • • Introdução às associações Usando associações internas Usando associações externas Usando associações cruzadas Associando mais de duas tabelas Associando uma tabela a si mesma Introdução às associações • Selecionar colunas específicas a partir de várias tabelas – A palavra-chave JOIN especifica quais tabelas serão associadas e como associálas – A palavra-chave ON especifica as colunas que as tabelas têm em comum • Consultar duas ou mais tabelas para produzir um conjunto de resultados – Usar chaves primárias e externas como condições de associação USE joindb SELECT buyer_name, sales.buyer_id, qty FROM buyers INNER JOIN sales Exemplo 1 ON buyers.buyer_id = sales.buyer_id GO sales buyers buyer_name buyer_id prod_id buyer_id Adam Barr Sean Chai Eva Corets 1 2 3 Erin O’Melia 4 Resultado buyer_name buyer_id qty Adam Barr 1 15 Adam Barr 1 5 Erin O’Melia 4 37 Eva Corets 3 11 Erin O’Melia 4 1003 qty 1 1 4 3 2 3 1 5 15 5 37 11 4 2 1003 USE joindb SELECT buyer_name, sales.buyer_id, qty FROM buyers Exemplo 1 LEFT OUTER JOIN sales ON buyers.buyer_id = sales.buyer_id GO buyers sales buyer_id buyer_id prod_id qty Adam Barr 1 1 2 15 Sean Chai 2 1 3 5 Eva Corets 3 4 1 37 Erin O’Melia 4 3 5 11 4 2 1003 buyer_name Resultado buyer_name buyer_id qty Adam Barr 1 15 Adam Barr 1 5 Erin O’Melia 4 37 Eva Corets 3 11 Erin O’Melia 4 1003 NULL NULL Sean Chai USE joindb SELECT buyer_name, qty FROM buyers CROSS JOIN sales GO buyers buyer_id buyer_name 1 Adam Barr Exemplo 1 sales buyer_id prod_id Resultado qty buyer_name qty 1 2 15 Adam Barr 15 2 Sean Chai 1 3 5 Adam Barr 5 3 Eva Corets 4 1 37 Adam Barr 37 4 Erin O’Melia 3 5 11 Adam Barr 11 4 2 1003 Adam Barr 1003 Sean Chai Sean Chai 15 5 Sean Chai 37 Sean Chai 11 Sean Chai Eva Corets ... 1003 15 ... Associando mais de duas tabelas USE joindb SELECT buyer_name, prod_name, qty FROM buyers INNER JOIN sales ON buyers.buyer_id = sales.buyer_id INNER JOIN produce ON sales.prod_id = produce.prod_id GO buyers sales buyer_id prod_id qty buyer_id buyer_name 1 2 15 1 Adam Barr 1 3 5 2 Sean Chai 3 1 37 3 Eva Corets 4 5 11 4 Erin O’Melia 2 2 1003 Resultado buyer_name prod_name qty Erin O’Melia Apples 37 Adam Barr Pears 15 Erin O’Melia Pears 1003 Adam Barr Oranges 5 Eva Corets Peaches 11 Exemplo 1 produce prod_id prod_name 1 Apples 2 Pears 3 Oranges 4 Bananas 5 Peaches Associando uma tabela a si mesma USE joindb SELECT a.buyer_id AS buyer1, a.prod_id ,b.buyer_id AS buyer2 FROM sales AS a INNER JOIN sales AS b ON a.prod_id = b.prod_id WHERE a.buyer_id > b.buyer_id GO sales a sales b buyer_id prod_id 1 1 4 3 2 3 1 4 Exemplo 3 5 2 qty buyer_id prod_id 15 5 37 11 1 1 4 3 2 3 1 1003 4 Resultado buyer1 prod_id buyer2 4 2 1 5 2 qty 15 5 37 11 1003 Combinando vários conjuntos de resultados • Usar o operador UNION para criar um único conjunto de resultados de várias consultas • As consultas precisam de: – Tipos de dados semelhantes – Número de colunas idêntico – Ordem de colunas idêntica na lista de seleções USE northwind SELECT (firstname + ' ' + lastname) AS name ,city, postalcode FROM employees UNION SELECT companyname, city, postalcode FROM customers GO Hands on: Comandos de seleção Avançados • Acompanhe junto com o seu instrutor os comandos nos detalhes deste slide. Execute o código e verifique alguns dos principais comandos de seleção do SQL Server. • Você acompanhará consultas básicas e avanças. • Após, nos demais slides você encontrará detalhes sobre cada comando. Laboratório: Considerando a Base de Dados AERO, construa queries para responder as seguintes perguntas 1) O nome de todos os pilotos da varig. 2) O nome de todos os pilotos, junto com seu salário e gratificação. 3) O nome da cidade e país de destino do vôo RG230. 4) A companhia dos vôos escalados para 1-Maio-2003. 5) O código de todos os vôos, nome dos pilotos escalados para os mesmos, e respectivos tipos de avião e companhia. 6) O código de todos os vôos que iniciam por RG ou VS, junto com a respectiva companhia. 7) O código de todos os vôos para a Alemanha ou Itália, com as respectivas data e hora de saída. 8) O nome de todos os aeroportos onde a varig opera. 9) O salário do piloto mais bem pago da varig. 10) O menor, maior, e média dos salários dos pilotos de companhias brasileiras. 11) O número de aeroportos no Brasil. 12) O número de diferentes vôos que a varig oferece para São Paulo. 13) Para cada companhia, o menor, maior salário, bem como a média. 14) Para cada cidade do Brasil, o número de aeroportos que possui. 15) Para cada dia e hora, o número de vôos que partem pela manhã. 16) As companhias que pagam como salário mais alto a seus pilotos menos que 2.000. 17) As companhias brasileiras que possuem pelo menos 2 pilotos. 18) As companhias que só usam um tipo de avião. 19) O código dos pilotos cujos vôos escalados sempre tem a mesma destinação. 20) O nome do país que é destino apenas de vôos para os quais sempre o mesmo piloto é escalado. 21) O nome das companhias que voam de MD11. 22) O nome das companhias que não voam de MD11. 23) Nome dos pilotos que voam de MD11 ou de 737. 24) Nome dos pilotos que voam de MD11 e de 737. 25) Nome das companhias que empregam pelo menos dois pilotos. 26) Nome dos pilotos que trabalham para companhias que empregam pelo menos dois pilotos. 27) Nome dos pilotos que ganham menos que a média salarial. 28) Selecione todas as companhia brasileiras onde a media salarial é maior que 3000. 29) Selecione o piloto com maior salario da varig. 30) Selecione o piloto com maior salario de cada companhia.