Baixe o app para aproveitar ainda mais
Prévia do material em texto
S Q L B Á S I C O – P A R T E 3 Na primeira parte aprendemos: Responder vários tipos de perguntas de negócio Consultas básicas Agregações Operações matemáticas Pesquisas aproximadas Na parte 3 vamos finalmente aprender a fazer consultas em mais de uma tabela Mas antes vamos de conteúdo SALADÃO, com vários comandos e operadores importantes no dia a dia e que não abordamos nas outras duas aulas “Começou de novo??” Não, você não está no vídeo errado Você SEMPRE precisa parar e se questionar o porquê de estar estudando as coisas. A quantidade de materiais, algoritmos e técnicas é tão grande nessa área que nos perdemos facilmente e fazemos cursos “por fazer”: pare com isso Para ser um bom cientista de dados, SQL é uma forma simples e rápida de extrair conhecimento de valor de bases de dados. Bancos de dados relacionais estão por toda a parte e saber consultá-los com destreza* é essencial * Gastei o portuga hein! Vai dizer?! Fazer uma maniçoba deliciosa! (mentira, é que estou com fome) Saber consultar resultados com linhas sem repetições (comando DISTINCT) Fazer filtros de linhas com muitas opções, sem precisar de TRILHÕES DE OR, OR, OR.... (operador IN) Responder nossas perguntas de negócio utilizando mais de uma tabela!! FINALMENTE (junção, comando JOIN) “Esse nerd endoidou, esqueceu que falou disso na outra aula” Padawan, na parte 2 vimos como fazer a contagem de valores não nulos de uma coluna, com o COUNT(DISTINCT coluna_x), lembram? Agora vamos ver o comando DISTINCT para mostrar as linhas sem valores repetidos! nome musica nota estilo The Beatles Get Back 10 Rock The Beatles Something 10 Rock Radiohead Weird Fishes 9.99999 indie rock Radiohead Karma Police 9.99999 indie rock The Cure Mint Car 9.98888 gothic rock The Cure Charlotte Sometimes 9.98888 gothic rock The Cure A Letter To Elise 9.98887 gothic rock SELECT nome, nota, estilo FROM bandas WHERE nota > 9.99 nome nota estilo The Beatles 10 Rock The Beatles 10 Rock Radiohead 9.99999 indie rock Radiohead 9.99999 indie rock SELECT nome, nota, estilo FROM bandas WHERE nota > 9.99 nome nota estilo The Beatles 10 Rock Radiohead 9.99999 indie rock SELECT DISTINCT nome, nota, estilo FROM bandas WHERE nota > 9.99 nome nota estilo The Cure 9.98888 gothic rock The Cure 9.98888 gothic rock The Cure 9.98887 gothic rock SELECT nome, nota, estilo FROM bandas WHERE estilo = ‘gothic rock’ banda nota estilo The Cure 9.98888 gothic rock The Cure 9.98887 gothic rock SELECT DISTINCT banda, nota, estilo FROM bandas WHERE estilo = ‘gothic rock’ -- “Uai, duas linhas?!” -- rá, padawan, e esse 7 diferente do 8?! -- btw, isso é um comentário em vários bancos de dados, -- só usar dois hífens no início (cada banco tem sua sintaxe de comentário) Lembram dos múltiplos filtros? No WHERE podemos incluir vários filtros de linhas, utilizando AND e o OR. Imagine que tenhamos uma tabela de clientes de vários estados id nome cpf idade sexo uf 1 Leoncio 111.111.111-11 21 M GO 2 Mariazinha 333.333.232-22 19 F RJ 3 Joaozinho 843.937.17-53 27 Sim, por favor SP 4 Jack 222.222.222-22 17 M SP 5 Joe 444.444.444-44 16 M DF 6 Joanna 555.555.555-55 22 F CE 7 Josefina 666.666.666-66 56 F AP Se eu quisesse um filtro com para buscar clientes de Goiás, São Paulo e Amapá. Na parte 2 a gente viu que podemos usar o OR, certo? (afinal ninguém mora em 3 lugares ao mesmo tempo) SELECT * FROM clientes WHERE uf = ‘GO’ OR uf = ‘SP’ OR uf = ‘AP’ Pois um jeito menos verborrágico (isso existe?) é utilizando o operador IN. Ele é bem simples de usar e evitar ficar repetindo OR, OR, OR toda hora SELECT * FROM clientes WHERE uf IN (‘GO’, ‘SP’, ‘AP’) Legal que podemos também utilizar a exclusão, ou seja, podemos selecionar todos os clientes que NÃO SÃO de Goiás e nem do Pará (pô, que preconceito é esse, eu adoro pequi e maniçoba*) SELECT * FROM clientes WHERE uf NOT IN (‘GO’, ‘PA’) * É sério, maniçoba é BOM DEMAIS Um comando para todas as tabelas governar, Um comando para encontrá-las, Um comando para todas trazer e na comparação de chaves juntá-las, na Terra de Bancos de Dados, onde os cientistas de dados trabalham (Tolkien goiano) No mundo maravilhoso do Leon, SQL é lindo, fácil e conseguimos responder todas as perguntas de negócio e obter os melhoooooores insights usando uma tabelinha só (relacional hein, galera, olha o respeito) A vida real é DURA e muito dificilmente teremos todas as respostas num lugar só todo bonitinho Aqui surge o grande poder do SQL: a junção de tabelas Ainda no mundo real, as informações normalmente são separadas em tabelas distintas e, quando precisamos de informações demais de uma tabela, precisamos de junções Uma forma comum de organização dos bancos de dados é utilizando as formas normais propostas por Edgard Codd Sem entrar em detalhes enfadonhos (mas importantes hein!), as formas normais tentam evitar repetições desnecessárias (ex: tabela de municípios com códigos, ao invés de sempre escrever “São José do Vale do Rio Preto”*) * Diz o google que é o maior nome de município do Brasil (se você é daí, manda um alô nos comentários :D) Isso faz com que as tabelas sejam “pequenas” em número de colunas e bastante autocontidas. Os relacionamentos com outras tabelas se dá por meio de códigos As tabelas somente com os códigos e descrições são normalmente chamadas de “tabelas de domínio” Exemplo de tabelas de domínio: municípios, ufs, países, produtos, tipos de conta bancária É bastante comum termos que buscar as descrições nas tabelas de domínio e, para isso, precisamos utilizar a junção id nome 1 Leoncio 2 Mariazinha 3 Joaozinho 4 Jack 5 Joe 6 Joanna 7 Juan id nome_produto 1 Pringles 2 Alface 3 Coca cola 4 Ruffles 5 Bolinhas do capeta da Lindt clientes produtos Come só mais uma... Vc tá magrinho, bobo! compras id_cliente id_produto quantidade 1 1 5 1 3 10 1 5 973519459 2 2 15 3 1 2 3 4 3 id nome 1 Leoncio 2 Mariazinha 3 Joaozinho 4 Jack 5 Joe 6 Joanna 7 Juan id nome 1 Pringles 2 Alface 3 Coca cola 4 Ruffles 5 Bolinhas do capeta da Lindt clientes produtos Percebam que agora temos somente a indicação de índices na tabela compras, sem o nome do cliente ou do produto. Para saber o nome de um produto de uma compra, por exemplo, precisamos de DUAS TABELAS: compras e produtos Mais ainda, perceberam que nas duas tabelas teremos identificadores que se relacionam? Na tabela compras temos id_produto que REFERENCIA o id da tabela de produtos. compras id_cliente id_produto quantidade 1 1 5 1 3 10 1 5 973519459 2 2 15 3 1 2 3 4 3 id nome_produto 1 Pringles 2 Alface 3 Coca cola 4 Ruffles 5 Bolinhas do capeta da Lindt produtos compras id_cliente id_produto quantidade 1 1 5 1 3 10 1 5 973519459 2 2 15 3 1 2 3 4 3 id nome_produto 1 Pringles 2 Alface 3 Coca cola 4 Ruffles 5 Bolinhas do capeta da Lindt produtos Os nomes das colunas que se referenciam são diferentes (id_produto em clientes e id em produtos). Por isso é importante saber a correlação SEMÂNTICA entre os ids. Isso porque nem sempre os identificadores terão nomes bonitinhos que nem os que fiz pra vocês Por exemplo, correlacionar id_produto na tabela de compras não tem nada a ver com id do cliente Da mesma forma, temos a referência na tabela compras ao identificador do cliente compras id_cliente id_produto quantidade 1 1 5 1 3 10 1 5 973519459 2 2 15 3 1 2 3 4 3 id nome 1 Leoncio 2 Mariazinha 3 Joaozinho 4 Jack 5 Joe 6 Joanna 7 Juan clientes compras id_cliente id_produto quantidade 1 1 5 1 3 10 1 5 973519459 2 2 15 3 1 2 3 4 3 id nome 1 Leoncio 2 Mariazinha 3 Joaozinho 4 Jack 5 Joe 6 Joanna 7 Juan clientes Agora que entendemos a SEMÂNTICA da junção, vamos ver como fazermos isso usando SQL Vou jogar o comando aqui, mas não se assuste, vamos mostrar passo a passo. Inclusive temos que conhecer um conceito importante antes de entender completamentecomo funciona a junção, e será um diferencial no seu entendimento (quero que me cobrem depois se não facilita o entendimento!!) Vamos ao exemplo: consultar o nome de todos produtos e quantidades em todas as compras registradas SELECT * FROM tabela1 JOIN tabela2 ON tabela1.id_x = tabela2.id_y SELECT * FROM tabela1 JOIN tabela2 ON tabela1.id_x = tabela2.id_y O comando JOIN faz a junção das tabelas 1 e 2, utilizando como critério de junção (ON), o id_x da tabela1 e o id_y da tabela2 Vamos a um exemplo para ficar mais fácil: consultar o nome de todos produtos e quantidades em todas as compras registradas 01 – em que tabelas estão os dados necessários? 02 – você precisa de todas as linhas ou precisa de um filtro? 03 – você precisa de todas as colunas ou somente de algumas? 01 – em que tabelas estão os dados necessários? Tabelas compras e produtos! 02 – você precisa de todas as linhas ou precisa de um filtro? Quero todas as linhas, não tem filtro! 03 – você precisa de todas as colunas ou somente de algumas? Só duas colunas: nome do produto e a quantidade! 01 – em que tabelas estão os dados necessários? SELECT * FROM compras JOIN produtos ON compras.id_produto = produtos.id TABELA 1 TABELA 2 CRITÉRIO DE JUNÇÃO 02 – você precisa de todas as linhas ou precisa de um filtro? SELECT * FROM compras JOIN produtos ON compras.id_produto = produtos.id 03 – você precisa de todas as colunas ou somente de algumas? SELECT produtos.nome, compras.quantidade FROM compras JOIN produtos ON compras.id_produto = produtos.id -- perceba que o nome da coluna tem um prefixo agora! -- como podemos ter colunas de mesmo nome em tabelas diferentes -- é importante sempre indicar a tabela à qual a coluna pertence E se eu quiser agora... o nome dos produtos para cada compra registrada no nome do cliente “Leoncio”??? E AGORA?! E AGORA?! Do tio Leon, deve se lembrar você! Com SELECT * FROM começar você deve! 01 – em que tabelas estão os dados necessários? Tabelas compras, produtos e clientes! 02 – você precisa de todas as linhas ou precisa de um filtro? Somente as compras do cliente “Leoncio”! Tem filtro! 03 – você precisa de todas as colunas ou somente de algumas? Só duas colunas: nome do produto e a quantidade! 01 – em que tabelas estão os dados necessários? SELECT * FROM compras JOIN produtos ON compras.id_produto = produtos.id JOIN clientes ON compras.id_cliente = clientes.id 02 – você precisa de todas as linhas ou precisa de um filtro? SELECT * FROM compras JOIN produtos ON compras.id_produto = produtos.id JOIN clientes ON compras.id_cliente = clientes.id WHERE clientes.nome = “Leoncio” 03 – você precisa de todas as colunas ou somente de algumas? SELECT produtos.nome, compras.quantidade FROM compras JOIN produtos ON compras.id_produto = produtos.id JOIN clientes ON compras.id_cliente = clientes.id WHERE clientes.nome = “Leoncio” ACABOOOOOU!!! (mentira, na parte 4 tem outros tipos de join, mas basta a cada dia o seu mal) Consultar resultados com linhas sem repetições (comando DISTINCT) Fazer filtros de linhas com muitas opções, sem precisar de TRILHÕES DE OR, OR, OR.... (operador IN) Responder nossas perguntas de negócio utilizando mais de uma tabela!! FINALMENTE (junção, comando JOIN) Se inscrever no canal! Ativar o sininho (pra ser alertado da parte 4!!) Baixando os slides no link na descrição! Ambiente SQL • https://www.w3schools.com/ SQL ANSI/ISO • Lista de documentos: https://docs.oracle.com/database/121/SQLRF/ap_standard_sql001.htm#SQLRF55514 • ANSI: https://www.ansi.org/resource-center (Família ANSI/ISO/IEC 9075)
Compartilhar