Consulta sobre múltiplas relações

Documentos relacionados
BCD29008 Banco de Dados

Projeto de Banco de Dados

SQL Linguagem de Manipulação de Dados SQL DML SQL DML. Exemplo Modelo Relacional. Exemplo ME-R SQL DML CONTINUAÇÃO...

IMPLEMENTAÇÃO DE BANCO DE DADOS

MODELAGEM DE DADOS - INTRODUÇÃO AO SQL: DML. Prof. Angelo Augusto Frozza, M.Sc.

ANÁLISE E PROJETO DE BANCO DE DADOS

Banco de Dados I. Aula 16 - Prof. Bruno Moreno 04/11/2011

Banco de Dados II. Aula Prof. Diemesleno Souza Carvalho

Banco de Dados 1 2º Semestre

Rápida revisão do Modelo Relacional

- SQL Linguagem de Manipulação de Dados

BCD29008 Banco de dados

SUBCONSULTAS E TIPOS DE JUNÇÃO. Banco de Dados Profa. Ana Paula Wauke

Projeto de Banco de Dados

Ordenação de tuplos order by

Álgebra Relacional e SQL

Aula 10 BD 1 SQL Parte 2. Profa. Elaine Faria UFU

SQL (Tópicos) Structured Query Language

Aula 11 SBD SQL Parte 3. Profa. Elaine Faria UFU

PCS3413. Engenharia de So-ware e Banco de Dados. Aula 17. Escola Politécnica da Universidade de São Paulo

Sumário SELECT + FROM

Banco de Dados I. Prof. Diego Buchinger. Profa. Rebeca Schroeder Freitas Prof. Fabiano Baldo.

Linguagem SQL. ENG1518 Sistemas de Informação Gerenciais Prof. Marcos Villas

saída durante o runtime Usando Functions de uma Única Linha para Personalizar Relatórios Mostrar as diferenças entre as functions SQL de uma única

SQL - Perguntas. André Restivo. Faculdade de Engenharia da Universidade do Porto. February 24, 2012

SQL-99: Esquema de BD EMPRESA

Exercício Aula Passada. SQL Linguagem de Manipulação de Dados. Exercício Aula Passada. Exercício Aula Passada. Exercício Aula Passada

Roteiro. SQL Linguagem de Manipulação de Dados. Exercício Aula Passada. Exercício Aula Passada. Exercício Aula Passada. Exercício Aula Passada

SQL Linguagem de Manipulação de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Apresentação Modelo e SQL. André Luiz Montevecchi

ORACLE 11 G INTRODUÇÃO AO ORACLE, SQL,PL/SQL

Sintaxe do comando SELECT

ÁLGEBRA E CÁLCULO RELACIONAL

SQL CREATE DATABASE. MySQL, SQL Server, Access, Oracle, Sybase, DB2, e outras base de dados utilizam o SQL.

BCD29008 Banco de dados

A cláusula order by permite ordenar tuplos exemplo: listar por ordem alfabética os nomes dos clientes com empréstimo na agência de Perryridge

Bases de Dados. Junção de relações. Junção de relações

Exame de Recurso de Base de Dados Universidade do Algarve 03/Fev/2005, (duração: 2 horas)

Bases de Dados 2005/2006. Aula 5

Ex.: INSERT INTO tmpautor (CDAUTOR, NMAUTOR) VALUES (1, Renato Araújo )

UNIVERSIDADE FEDERAL DA GRANDE DOURADOS PRÓ-REITORIA DE GRADUAÇÃO PROGRAD FACULDADE DE CIÊNCIAS EXATAS E TECNOLOGIA CURSO DE SISTEMAS DE INFORMAÇÃO

Prof. Fabiano Taguchi

Introdução ao PostgreSQL

- Um "query block" permite a implementação das operações de selecção, projecção e junção da álgebra relacional.

SQL. Prof. Msc Denival A. dos Santos

Consultas SQL. Andre Noel

Álgebra Relacional e Cálculo Relacional

SISTEMAS DE BANCO DE DADOS. Prof. Adriano Pereira Maranhão

Marcelo Henrique dos Santos

SQL DML. SQL Linguagem de Manipulação de Dados SELECT SELECT SELECT SELECT

Comandos de Manipulação

GES013 - Sistema de Banco de Dados SQL/DML no PostgreSQL Parte 3 Tabelas de Junção e Funções de Agregação

Oracle Database 10g: Fundamentos de SQL e PL/SQL

SQL. SQL (Structured Query Language) Comando CREATE TABLE. SQL é uma linguagem de consulta que possibilita:

Professor Eros Moura, DSc

Utilizando o Postgres - comandos SQL para a manipulação de dados

MODELAGEM DE DADOS -INTRODUÇÃO AO SQL: DML. Prof. Angelo Augusto Frozza, M.Sc.

Fundamentos de Bancos de Dados Prova 2

Sistemas de Informação e Bases de Dados 2012/2013. Linguagem SQL

Definida pelo American National Standard Institute (ANSI) em 1986

Álgebra Relacional e SQL operações de interesse

1. Assinale as afirmações que são verdadeiras e as que são falsas, corrigindo-as:

SQL. Subqueries. Cristina C. Vieira Departamento de Engenharia Eletrónica e Informática

Bases de Dados. Álgebra Relacional II Junções, agregações, vistas. P. Serendero,

1. SQL Instrumental Select Delete Update Insert Group by Having Unnion All...

Banco de Dados. Marcio de Carvalho Victorino Exercícios SQL

Linguagem de pesquisa declarativa para banco de dados relacional; 1ª Versão - Desenvolvida pela IBM no laboratório de pesquisa de San José;

SQL. Agregações e agrupamentos. Cristina C. Vieira Departamento de Engenharia Eletrónica e Informática

Banco de Dados Notas de Aula Consultas em SQL Prof. Dr. Daniel A. Furtado

Transformação ER para modelo relacional

Material Teórico. Cláusula GROUP BY e HAVING. Responsável pelo Conteúdo: Prof. Ms. Alexander Gobbato Albuquerque

TLBD II. Continuação

IF685 Gerenciamento de Dados e Informação - Prof. Robson Fidalgo 1

BCD29008 Banco de dados

Oracle Database: Fundamentos de SQL e PL/SQL

Introdução ao Banco de Dados. Banco de Dados

SQL Básica DML. Prof. Marcos A. Schreiner. 22 de outubro de Curso de Licenciatura em Computação

Banco de Dados. SQL Structured Query Language

Manipulando a base de dados

Subconsulta na Cláusula FROM

BCD29008 Banco de dados

As Instruções DML. As Instruções de manipulação de dados(dml) em SQL são representados por: Modificam o estado do banco de dados:

Linguagem de Definição de Dados Estrutura básica Operações com conjuntos Funções de agregação Valores nulos Subconsultas embebidas Relações derivadas

SQL PostgreSQL. I Criação de Tabelas. Disciplina: SCC0241 Bases de Dados Professor: Eduardo Hruschka Estagiária PAE: Dayse de Almeida

Álgebra Relacional. Conjunto de operações que usa uma ou duas relações como entrada e gera uma relação de saída. Operações básicas:

SQL S Q L. Introdução. Enfoques de SQL. SQL - Origem/Histórico. Usos de SQL. SQL - Vantagens. Banco de Dados. Fernando Fonseca Ana Carolina

SQL DML. Frederico D. Bortoloti

Banco de Dados II. Aula do dia 10/03. Revisão. SQL Estudado até o dia 03/03/2011

Prof.: Clayton Maciel Costa

Laboratório de Banco de Dados II Aula 04. Prof. Érick de Souza Carvalho

Escola Secundária de Albufeira. Comandos MySQL. (Páginas Web Dinâmicas: PHP e MySQL) Carlos Nunes

FEAP - Faculdade de Estudos Avançados do Pará PROFª LENA VEIGA PROJETOS DE BANCO DE DADOS UNIDADE V- SQL

Linguagem de Definição de Dados Estrutura básica Operações com conjuntos Funções de agregação Valores nulos Subconsultas embebidas Relações derivadas

BASES DE DADOS I LTSI/2. Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2010/2011

BDII SQL Junção Revisão 8

Transcrição:

Consulta sobre múltiplas relações BCD29008 Engenharia de Telecomunicações Prof. Emerson Ribeiro de Mello http://docente.ifsc.edu.br/mello/bcd 25 DE ABRIL DE 2019

Esquema usado nos próximos exemplos 1/36

Operações com conjuntos Operador UNION (SELECT... ) UNION (SELECT...) Listar o ID de todos os clientes que possuam um empréstimo, uma conta ou ambos 2/36

Operações com conjuntos Operador UNION (SELECT... ) UNION (SELECT...) Listar o ID de todos os clientes que possuam um empréstimo, uma conta ou ambos (SELECT idpessoa FROM Correntista) UNION (SELECT idpessoa FROM Mutuario) 2/36

Operações com conjuntos Operador INTERSECT (MySQL não possui esse operador) (SELECT... ) INTERSECT (SELECT...) Listar o ID de todos os clientes que são correntistas e que possuam um empréstimo 3/36

Operações com conjuntos Operador INTERSECT (MySQL não possui esse operador) (SELECT... ) INTERSECT (SELECT...) Listar o ID de todos os clientes que são correntistas e que possuam um empréstimo (SELECT idpessoa FROM Correntista) INTERSECT (SELECT idpessoa FROM Mutuario) 3/36

Operações com conjuntos Operador EXCEPT (MySQL não possui esse operador) (SELECT... ) EXCEPT (SELECT...) Listar o ID de todos os clientes que são correntistas e que não possuam um empréstimo 4/36

Operações com conjuntos Operador EXCEPT (MySQL não possui esse operador) (SELECT... ) EXCEPT (SELECT...) Listar o ID de todos os clientes que são correntistas e que não possuam um empréstimo (SELECT idpessoa FROM Correntista) EXCEPT (SELECT idpessoa FROM Mutuario) 4/36

Operações com conjuntos O comportamento padrão do operador UNION é de remover tuplas duplicadas da relação resultante Operador ALL permite tuplas duplicadas na relação resultante (SELECT idpessoa FROM Correntista) UNION ALL (SELECT idpessoa FROM Mutuario) Operador IN permite verificar se o valor de um atributo está contido em um conjunto SELECT idagencia, nome FROM Agencia WHERE cidade IN ('S~ao José', 'Florianópolis'); Poderia ser usado para ter o comportamento o INTERSECT. (veja subconsultas aninhadas) Operador EXISTS poderia ser usado para ter o comportamento do EXCEPT 5/36

Valores nullos (NULL) Valor do atributo é desconhecido ou ainda não existe Listar os empréstimos que tenham nulo no atributo valor SELECT idemprestimo FROM Emprestimo WHERE valor IS NULL Resultado de operações aritméticas com nulo sempre será nulo SELECT 5 + NULL; -- retorna NULL Operações de agregação (i.e. SUM, COUNT) ignoram nulos Com exceção do COUNT(*) -- total de linhas cujo valor no atributo cidade n~ao seja NULO SELECT COUNT(cidade) FROM Agencia; -- total de linhas da relaç~ao SELECT COUNT(*) FROM Agencia; 6/36

Valores nullos (NULL) Operadores lógicos Qualquer comparação com valores nulos sempre resultará em nulo SELECT (123 < NULL); SELECT (NULL = NULL); SELECT (NULL <> NULL); Operador lógico OR SELECT (NULL OR TRUE); -- TRUE SELECT (NULL OR FALSE); -- NULL SELECT (NULL OR NULL); -- NULL Operador lógico AND SELECT (NULL AND TRUE); -- NULL SELECT (NULL AND FALSE); -- FALSE SELECT (NULL AND NULL); -- NULL Operador lógico NOT SELECT (NOT NULL); -- NULL 7/36

Esquema usado nos próximos exemplos 8/36

Consulta sobre múltiplas relações +---------------+-----------+-------------+----------------+ idfuncionario Nome Sobrenome iddepartamento +---------------+-----------+-------------+----------------+ 123 Julio Silva 1 326 Jo~ao Silveira 2 331 George de la Rocha 3 332 José Oliveira 1 +---------------+-----------+-------------+----------------+ +----------------+---------------------------+-------------+ iddepartamento dnome Orcamento +----------------+---------------------------+-------------+ 1 Financeiro 15000 2 TI 60000 3 Gest~ao de Pessoas 150000 +----------------+---------------------------+-------------+ Como obter o nome e sobrenome de todos os funcionários, juntamente com os nomes dos departamentos onde estão lotados? 9/36

Consulta sobre múltiplas relações SELECT Nome, Sobrenome, dnome FROM Funcionario, Departamento; +-----------+-------------+----------------------------+ Nome Sobrenome dnome +-----------+-------------+----------------------------+ Julio Silva Financeiro Julio Silva TI Julio Silva Gest~ao de Pessoas Arnaldo Coelho Financeiro... for each tupla t 1 in relaç~ao r 1 for each tupla t 2 in relaç~ao r 2... for each tupla t m in relaç~ao r m Concatene t 1, t 2,..., t m em uma única tupla t Adicione t à relaç~ao resultante 10/36

Condições de junção: NATURAL JOIN SELECT Nome, Sobrenome, dnome FROM Funcionario NATURAL JOIN Departamento; +-----------+-------------+--------------------+ Nome Sobrenome dnome +-----------+-------------+--------------------+ Julio Silva Financeiro Arnaldo Coelho Financeiro George de la Rocha Gest~ao de Pessoas... Requer uma coluna com nome comum em todas as relações No exemplo, as relações Funcionário e Departamento possuem uma coluna chamada iddepartamento Combina todas as tuplas que possuem valores iguais na coluna de nome comum 11/36

Condições de junção: INNER JOIN - (ou simplesmente JOIN) Retorna registros que possuam valores correspondentes em ambas tabelas SELECT colunas FROM tabela1 INNER JOIN tabela2 ON tabela1.colunaa = tabela2.colunab; -- Exemplo SELECT f.nome, d.dnome FROM Funcionario f INNER JOIN Departamento d ON f.iddepartamento = d.iddepartamento 12/36

Condições de junção: INNER JOIN Retorna a coluna iddepartamento uma única vez SELECT * FROM Funcionario NATURAL JOIN Departamento; Retorna a coluna iddepartamento duas vezes, uma de cada relação SELECT * FROM Funcionario f INNER JOIN Departamento d ON f.iddepartamento = d.iddepartamento Semelhante ao INNER JOIN, retorna a coluna iddepartamento duas vezes SELECT * FROM Funcionario, Departamento WHERE Funcionario.idDepartamento = Departamento.idDepartamento; 13/36

Usar ON ou WHERE nas consultas com múltiplas relações? Em junções internas, pode-se usar a condição ON ou WHERE Na cláusula FROM, a vírgula (,) seria equivalente ao JOIN SELECT f.nome, d.dnome FROM Funcionario f, Departamento d WHERE f.iddepartamento = d.iddepartamento; SELECT f.nome, d.dnome FROM Funcionario f JOIN Departamento d ON f.iddepartamento = d.iddepartamento 14/36

Usar ON ou WHERE nas consultas com múltiplas relações? Em junções internas, pode-se usar a condição ON ou WHERE Na cláusula FROM, a vírgula (,) seria equivalente ao JOIN SELECT f.nome, d.dnome FROM Funcionario f, Departamento d WHERE f.iddepartamento = d.iddepartamento; SELECT f.nome, d.dnome FROM Funcionario f JOIN Departamento d ON f.iddepartamento = d.iddepartamento Contudo, a consulta SQL pode ser mais legível se usar ON como condição de junção e as demais condições na cláusula WHERE SELECT f.nome, d.dnome FROM Funcionario f JOIN Departamento d ON f.iddepartamento = d.iddepartamento WHERE Orcamento > 13500; Como reescrever a instrução acima usando somente WHERE? 14/36

Usar ON ou WHERE nas consultas com múltiplas relações? Em junções internas, pode-se usar a condição ON ou WHERE Na cláusula FROM, a vírgula (,) seria equivalente ao JOIN SELECT f.nome, d.dnome FROM Funcionario f, Departamento d WHERE f.iddepartamento = d.iddepartamento; SELECT f.nome, d.dnome FROM Funcionario f JOIN Departamento d ON f.iddepartamento = d.iddepartamento Contudo, a consulta SQL pode ser mais legível se usar ON como condição de junção e as demais condições na cláusula WHERE SELECT f.nome, d.dnome FROM Funcionario f JOIN Departamento d ON f.iddepartamento = d.iddepartamento WHERE Orcamento > 13500; Em junções externas, condições ON se comportam de maneira diferente das condições com WHERE 14/36

Junções externas (outer join) Com a junção natural não serão exibidas todas as duplas de Departamento que não tiverem um Funcionário associado SELECT * FROM Departamento NATURAL JOIN Funcionario; 15/36

Junções externas (outer join) Com a junção natural não serão exibidas todas as duplas de Departamento que não tiverem um Funcionário associado SELECT * FROM Departamento NATURAL JOIN Funcionario; Junções externas Preserva as tuplas que seriam perdidas em um junção, criando na relação resultante tuplas que contêm valores nulos 15/36

Junções externas (outer join) Com a junção natural não serão exibidas todas as duplas de Departamento que não tiverem um Funcionário associado SELECT * FROM Departamento NATURAL JOIN Funcionario; Junções externas Preserva as tuplas que seriam perdidas em um junção, criando na relação resultante tuplas que contêm valores nulos Left outer join preserva somente as tuplas da relação à esquerda Right outer join preserva somente as tuplas da relação à direita Full outer join preserva as tuplas das duas relações 15/36

Condições de junção: LEFT JOIN Retorna todas as tuplas da relação à esquerda, mesmo aquelas que não possuam correspondentes na tabela à direita SELECT colunas FROM tabela1 LEFT JOIN tabela2 ON tabela1.colunaa = tabela2.colunab; -- Exemplo SELECT * FROM Departamento d LEFT JOIN Funcionario f ON d.iddepartamento = f.iddepartamento; SELECT * FROM Departamento NATURAL LEFT JOIN Funcionario; 16/36

Condições de junção: RIGHT JOIN Retorna todas as tuplas da relação à direita, mesmo aquelas que não possuam correspondentes na tabela à esquerda SELECT colunas FROM tabela1 RIGHT JOIN tabela2 ON tabela1.colunaa = tabela2.colunab; -- Exemplo SELECT * FROM Departamento d RIGHT JOIN Funcionario f ON d.iddepartamento = f.iddepartamento; SELECT * FROM Departamento NATURAL RIGHT OUTER JOIN Funcionario; 17/36

Condições de junção: FULL OUTER JOIN Retorna todas as tuplas de ambas tabelas, mesmo se não houver correspondência de valores SELECT colunas FROM tabela1 FULL OUTER JOIN tabela2 ON tabela1.colunaa = tabela2.colunab; -- Exemplo SELECT * FROM Departamento d NATURAL FULL OUTER JOIN Funcionario f; MySQL não implementa FULL JOIN 18/36

Exercícios

Relações do lab02: Funcionário e Departamento 1 Liste todos os dados de todos os funcionários, inclusive todos os dados de seus departamentos 2 Liste o nome do funcionário e o nome do departamento onde cada funcionário está lotado 3 Liste o nome e sobrenome de todos os funcionários que estejam lotados em departamentos com orçamento maior que 60.000, 00 4 Liste os nomes de todos os departamentos que possuam mais de dois funcionários 19/36

Relações do lab02: Funcionário e Departamento 1 Liste todos os dados de todos os funcionários, inclusive todos os dados de seus departamentos SELECT F.*, D.* FROM Funcionario F INNER JOIN Departamento D ON F.idDepartamento = D.idDepartamento; 2 Liste o nome do funcionário e o nome do departamento onde cada funcionário está lotado 3 Liste o nome e sobrenome de todos os funcionários que estejam lotados em departamentos com orçamento maior que 60.000, 00 4 Liste os nomes de todos os departamentos que possuam mais de dois funcionários 19/36

Relações do lab02: Funcionário e Departamento 1 Liste todos os dados de todos os funcionários, inclusive todos os dados de seus departamentos 2 Liste o nome do funcionário e o nome do departamento onde cada funcionário está lotado SELECT F.Nome, D.dNome FROM Funcionario F INNER JOIN Departamento D ON F.idDepartamento = D.idDepartamento; 3 Liste o nome e sobrenome de todos os funcionários que estejam lotados em departamentos com orçamento maior que 60.000, 00 4 Liste os nomes de todos os departamentos que possuam mais de dois funcionários 19/36

Relações do lab02: Funcionário e Departamento 1 Liste todos os dados de todos os funcionários, inclusive todos os dados de seus departamentos 2 Liste o nome do funcionário e o nome do departamento onde cada funcionário está lotado 3 Liste o nome e sobrenome de todos os funcionários que estejam lotados em departamentos com orçamento maior que 60.000, 00 SELECT F.Nome, F.Sobrenome FROM Funcionario F INNER JOIN Departamento D ON F.idDepartamento = D.idDepartamento WHERE D.Orcamento > 60000; 4 Liste os nomes de todos os departamentos que possuam mais de dois funcionários 19/36

Relações do lab02: Funcionário e Departamento 1 Liste todos os dados de todos os funcionários, inclusive todos os dados de seus departamentos 2 Liste o nome do funcionário e o nome do departamento onde cada funcionário está lotado 3 Liste o nome e sobrenome de todos os funcionários que estejam lotados em departamentos com orçamento maior que 60.000, 00 4 Liste os nomes de todos os departamentos que possuam mais de dois funcionários SELECT D.dNome FROM Funcionario F INNER JOIN Departamento D ON D.idDepartamento = F.idDepartamento GROUP BY D.dNome HAVING COUNT(*) > 2; 19/36

Subconsultas aninhadas

Subconsultas aninhadas Trata-se de de uma consulta aninhada a uma instrução SELECT, INSERT, UPDATE ou DELETE A tupla resultante é então usada pela instrução onde essa está aninhada Geralmente é usada em operações com conjuntos Para verificar se uma tupla pertence ao conjunto, para comparar conjuntos e verificar a cardinalidade de conjuntos 20/36

Subconsultas aninhadas Trata-se de de uma consulta aninhada a uma instrução SELECT, INSERT, UPDATE ou DELETE A tupla resultante é então usada pela instrução onde essa está aninhada Geralmente é usada em operações com conjuntos Para verificar se uma tupla pertence ao conjunto, para comparar conjuntos e verificar a cardinalidade de conjuntos Listar o nome e orçamento do departamento que possui o maior orçamento SELECT Nome, Orcamento FROM Departamento WHERE Orcamento = (SELECT MAX(Orcamento) FROM Departamento); 20/36

Subconsultas aninhadas Aluno(idAluno, nome, codigocurso) Curso(idCurso, cnome) Na tabela Aluno, atualizar todas tuplas com valor = 2 no atributo codigocurso para o código que está associado ao curso chamado Engenharia de Telecomunicações na tabela Curso UPDATE Aluno SET codigocurso = (SELECT idcurso FROM Curso WHERE cnome = 'Engenharia de Telecomunicaç~oes') WHERE codigocurso = 2; 21/36

Subconsultas Diferentes consultas SQL podem apresentar o mesmo resultado Liste o nome de todos os funcionários de todos os departamentos que possuam orçamento maior que 5.000 Fazendo uso de INNER JOIN Fazendo uso de subconsultas (operador IN) 22/36

Subconsultas Diferentes consultas SQL podem apresentar o mesmo resultado Liste o nome de todos os funcionários de todos os departamentos que possuam orçamento maior que 5.000 Fazendo uso de INNER JOIN SELECT f.nome FROM Funcionario f INNER JOIN Departamento d ON f.iddepartamento = d.departamento WHERE d.orcamento > 5000; Fazendo uso de subconsultas (operador IN) 22/36

Subconsultas Diferentes consultas SQL podem apresentar o mesmo resultado Liste o nome de todos os funcionários de todos os departamentos que possuam orçamento maior que 5.000 Fazendo uso de INNER JOIN SELECT f.nome FROM Funcionario f INNER JOIN Departamento d ON f.iddepartamento = d.departamento WHERE d.orcamento > 5000; Fazendo uso de subconsultas (operador IN) SELECT Nome FROM Funcionario WHERE iddepartamento IN (SELECT iddepartamento FROM Departamento WHERE Orcamento > 5000); 22/36

Esquema usado nos próximos exemplos 23/36

Subconsultas Exemplos com operador IN Listar o ID de todos os clientes que possuam uma conta e um empréstimo Listar o ID de todos os clientes que possuam um empréstimo, mas que não possuam uma conta 24/36

Subconsultas Exemplos com operador IN Listar o ID de todos os clientes que possuam uma conta e um empréstimo SELECT DISTINCT idpessoa FROM Mutuario WHERE idpessoa IN (SELECT idpessoa FROM Correntista) Listar o ID de todos os clientes que possuam um empréstimo, mas que não possuam uma conta 24/36

Subconsultas Exemplos com operador IN Listar o ID de todos os clientes que possuam uma conta e um empréstimo SELECT DISTINCT idpessoa FROM Mutuario WHERE idpessoa IN (SELECT idpessoa FROM Correntista) Listar o ID de todos os clientes que possuam um empréstimo, mas que não possuam uma conta SELECT DISTINCT idpessoa FROM Mutuario WHERE idpessoa NOT IN (SELECT idpessoa FROM Correntista) 24/36

Subconsultas Exercícios com operador IN Liste o CPF dos presidentes das empresas que fabricam produtos nos estados de SP e SC Produto(idProduto, idempresa, uffabrica) Empresa(idEmpresa, cpfpresidente) 25/36

Subconsultas Exercícios com operador IN Liste o CPF dos presidentes das empresas que fabricam produtos nos estados de SP e SC Produto(idProduto, idempresa, uffabrica) Empresa(idEmpresa, cpfpresidente) SELECT DISTINCT cpfpresidente FROM Empresa e WHERE e.idempresa IN (SELECT idempresa FROM Produto WHERE UFFabrica = 'SP') AND e.idempresa IN (SELECT idempresa FROM Produto WHERE UFFabrica = 'SC') 25/36

Subconsultas Exercícios com operador IN Liste o nome de todas as disciplinas ministradas no segundo semestre de 2014 e no primeiro semestre de 2017 Disciplina(idDisc, nome, ano, semestre) 26/36

Subconsultas Exercícios com operador IN Liste o nome de todas as disciplinas ministradas no segundo semestre de 2014 e no primeiro semestre de 2017 Disciplina(idDisc, nome, ano, semestre) SELECT DISTINCT nome FROM Disciplina WHERE semestre = 2 AND ano = 2014 AND nome IN (SELECT nome FROM Disciplina WHERE semestre = 1 AND ano = 2017) 26/36

Subconsultas: Exemplo com cláusula FROM Soma dos valores médios de empréstimos realizados por cada agência 27/36

Subconsultas: Exemplo com cláusula FROM Soma dos valores médios de empréstimos realizados por cada agência -- Obtendo o valor médio agrupado por ag^encia SELECT AVG(valor) AS valormedio FROM Emprestimo GROUP BY idagencia; +------------+ valormedio +------------+ 750 1000 3000 +------------+ 27/36

Subconsultas: Exemplo com cláusula FROM Soma dos valores médios de empréstimos realizados por cada agência -- Obtendo o valor médio agrupado por ag^encia SELECT AVG(valor) AS valormedio FROM Emprestimo GROUP BY idagencia; +------------+ valormedio +------------+ 750 1000 3000 +------------+ SELECT SUM(AVG(valor)) AS valormedio FROM Emprestimo GROUP BY idagencia; -- instruç~ao inválida! 27/36

Subconsultas: Exemplo com cláusula FROM Soma dos valores médios de empréstimos realizados por cada agência -- Obtendo o valor médio agrupado por ag^encia SELECT AVG(valor) AS valormedio FROM Emprestimo GROUP BY idagencia; +------------+ valormedio +------------+ 750 1000 3000 +------------+ SELECT SUM(AVG(valor)) AS valormedio FROM Emprestimo GROUP BY idagencia; -- instruç~ao inválida! SELECT SUM(valorMedio) FROM (SELECT AVG(valor) AS valormedio FROM Emprestimo GROUP BY idagencia) AS Resultado; 27/36

Subconsultas Operações com conjuntos Pelo menos um (SOME) > some, < some, >= some, <= some, = some, <> some Que todos (ALL) > all, < all, >= all, <= all, = all, <> all 28/36

Subconsultas Operações com conjuntos Pelo menos um (SOME) > some, < some, >= some, <= some, = some, <> some Que todos (ALL) > all, < all, >= all, <= all, = all, <> all Listar nome, cargo e salário dos funcionários cujo salário seja maior que o salário de pelo menos um Analista Funcionario(idFuncionario, nome, cargo, salario) -- SELECT nome, cargo, salário FROM Funcionario WHERE salario > SOME (SELECT salario FROM Funcionario WHERE cargo = 'Analista'); 28/36

Subconsultas Operações com conjuntos Pelo menos um (SOME) > some, < some, >= some, <= some, = some, <> some Que todos (ALL) > all, < all, >= all, <= all, = all, <> all Listar nome, cargo e salário dos funcionários cujo salário seja maior do que o salário de todos os Analistas Funcionario(idFuncionario, nome, cargo, salario) -- SELECT nome, cargo, salário FROM Funcionario WHERE salario > ALL (SELECT salario FROM Funcionario WHERE cargo = 'Analista'); 28/36

Subconsultas Operações com conjuntos: cláusula SOME 1 5 8 1 5 1 5 1 5 (5 < SOME) = 5 < que alguma tupla na relação? TRUE! (5 < SOME) = FALSE! (5 = SOME) = TRUE! (5 <> SOME) = TRUE!, pois 1 5 29/36

Subconsultas Operações com conjuntos: cláusula SOME 1 5 8 1 5 1 5 1 5 (5 < SOME) = 5 < que alguma tupla na relação? TRUE! (5 < SOME) = FALSE! (5 = SOME) = TRUE! (5 <> SOME) = TRUE!, pois 1 5 (= SOME) IN (<> SOME) NOT IN 29/36

Subconsultas Operações com conjuntos: cláusula ALL 1 5 8 1 6 1 5 1 6 (5 < ALL) = FALSE! (5 < ALL) = FALSE! (5 = ALL) = FALSE! (5 <> ALL) = TRUE! 30/36

Subconsultas Operações com conjuntos: cláusula ALL 1 5 8 1 6 1 5 1 6 (5 < ALL) = FALSE! (5 < ALL) = FALSE! (5 = ALL) = FALSE! (5 <> ALL) = TRUE! (<> ALL) NOT IN (= ALL) IN 30/36

Subconsultas: Teste de relação vazia EXISTS Retorna TRUE se a relação resultante da subconsulta for, FALSE caso contrário 31/36

Subconsultas: Teste de relação vazia EXISTS Retorna TRUE se a relação resultante da subconsulta for, FALSE caso contrário Liste o nome de todos as disciplinas ministradas no segundo semestre de 2014 e no primeiro semestre de 2017 Disciplina(nome, ano, semestre) SELECT DISTINCT nome FROM Disciplina WHERE semestre = 2 AND ano = 2014 AND EXISTS (SELECT nome FROM Disciplina WHERE semestre = 1 AND ano = 2017) 31/36

Subconsultas MySQL não possui INTERSECT e EXCEPT Listar o ID de todos os clientes que são correntistas e que possuam um empréstimo (SELECT idpessoa FROM Correntista) INTERSECT (SELECT idpessoa FROM Mutuario) SELECT idpessoa FROM Correntista c WHERE EXISTS (SELECT idpessoa FROM Mutuario m WHERE c.idpessoa = m.idpessoa); Listar o ID de todos os clientes que são correntistas e que não possuam um empréstimo (SELECT idpessoa FROM Correntista) EXCEPT (SELECT idpessoa FROM Mutuario) SELECT idpessoa FROM Correntista c WHERE NOT EXISTS (SELECT idpessoa FROM Mutuario m WHERE c.idpessoa = m.idpessoa); 32/36

Subconsulta escalar vs GROUP BY Subconsulta escalar retorna uma única tupla com um único atributo Liste o total em R$ das vendas de cada produto Vendas(Produto, qtde, preco) SELECT A.Produto, (SELECT SUM(B.qtde * B.preco) FROM Vendas B WHERE A.Produto = B.Produto) AS TotalVendas FROM Vendas A Mesma consulta, porém fazendo uso de GROUP BY SELECT Produto, SUM(qtde * preco) AS TotalVendas FROM Vendas GROUP BY Produto 33/36

Exemplos com DELETE e múltiplas relações

Apagando linhas de uma ou mais tabelas Aluno(idAluno, nome, curso) curso referencia Curso Disciplina(idDisc, nome, curso) curso referencia Curso Curso(idCurso, nome) Apagando todas as linhas da tabela Curso cujo código do curso seja igual a 123 DELETE FROM Curso WHERE curso = 123; Apagando todas as linhas das tabelas Curso, Disciplina e Aluno cujo código do curso seja igual a 123 DELETE Curso, Disciplina, Aluno FROM Curso INNER JOIN Disciplina INNER JOIN Aluno WHERE Curso.idCurso = 123 AND Curso.idCurso = Disciplina.curso AND Curso.idCurso = Aluno.curso; 34/36

Exemplos com INNER JOIN e subconsulta Aluno(idAluno, nome, curso) curso referencia Curso Curso(idCurso, nome) Exemplo com INNER JOIN DELETE Aluno FROM Aluno INNER JOIN Curso ON Aluno.curso = Curso.idCurso WHERE Curso.Nome = 'Curso XYZ'; Exemplo com subconsulta DELETE Aluno FROM Aluno WHERE Aluno.curso IN (SELECT idcurso FROM Curso WHERE Curso.Nome = 'Curso XYZ'); 35/36

Aulas baseadas em HENRY F.; SUDARSHAN SILBERSCHATZ, ABRAHAM; KORTH. SISTEMAS DE BANCO DE DADOS. 6a. Edição - Editora Campus, 2012 SULLIVAN, D. G. COMPUTER SCIENCE HARVARD UNIVERSITY 36/36