Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouSophia Mendes Silveira Alterado mais de 8 anos atrás
1
Daniel Paulo dptsalvador@hotmail.com
SQL Módulo I Daniel Paulo
2
Capítulo 7 Consultas com Subqueries São consultas aninhadas em instruções SELECT, INSERT, DELETE ou UPDATE. O limite máximo de aninhamento de uma subquery é de 32 níveis.
3
Capítulo 7 Principais características
As SUBQUERIES podem ser escalares (um valor conforme tipo de dados definido) É possível obter 1 ou mais colunas por SUBQUERY Deve estar entre parênteses Em instruções SELECT, UPDATE, INSERT e DELETE uma SUBQUERY é utilizada nos mesmos locais das expressões Alguns tipos de dados não podem ser utilizados nas lista de seleção: NTEXT, TEXT e IMAGE
4
Capítulo 7 Operadores (=, < , > , < > , > = , <=, !> ou !< ) devem ser associados a SUBQUERY que retornam apenas 1 valor com 1 coluna Para utilização de listas de valores é necessário utilizar IN ou EXISTS A utilização da cláusula ORDER BY só é possível caso a cláusula TOP seja utilizada
5
Capítulo 7 -- Clientes que compraram em Janeiro de 2007
SELECT * FROM CLIENTES WHERE EXISTS (SELECT * FROM PEDIDOS WHERE CODCLI = CLIENTES.CODCLI AND DATA_EMISSAO BETWEEN ' ' AND ' ') -- OU WHERE CODCLI IN (SELECT CODCLI FROM PEDIDOS WHERE DATA_EMISSAO BETWEEN ' ' AND ' ')
6
Capítulo 7 -- Clientes que NÃO compraram em Janeiro de 2007
SELECT * FROM CLIENTES WHERE NOT EXISTS (SELECT * FROM PEDIDOS WHERE CODCLI = CLIENTES.CODCLI AND DATA_EMISSAO BETWEEN ' ' AND ' ') -- OU WHERE CODCLI NOT IN (SELECT CODCLI FROM PEDIDOS WHERE DATA_EMISSAO BETWEEN ' ' AND ' ')
7
Capítulo 7 Subqueries introduzidas com IN e NOT IN
-- Lista de empregados cujo cargo tenha salário inicial -- inferior a 5000 SELECT * FROM EMPREGADOS WHERE COD_CARGO IN ( SELECT COD_CARGO FROM TABELACAR WHERE SALARIO_INIC < 5000)
8
Capítulo 7 SELECT * FROM TABELADEP
--Lista de departamentos onde não existe nenhum funcionário SELECT * FROM TABELADEP WHERE COD_DEPTO NOT IN ( SELECT COD_DEPTO FROM EMPREGADOS WHERE COD_DEPTO IS NOT NULL) --OU SELECT E.CODFUN , E.NOME, E.COD_DEPTO, E.COD_CARGO, D.COD_DEPTO, D.DEPTO FROM EMPREGADOS E RIGHT JOIN TABELADEP D ON E.COD_DEPTO = D.COD_DEPTO WHERE E.COD_DEPTO IS NULL
9
Capítulo 7 SELECT * FROM TABELACAR
-- Lista de cargos em que não existe nenhum funcinário -- cadastrado SELECT * FROM TABELACAR WHERE COD_CARGO NOT IN ( SELECT COD_CARGO FROM EMPREGADOS WHERE COD_CARGO IS NOT NULL) --OU SELECT C.COD_CARGO , C.CARGO FROM EMPREGADOS E RIGHT JOIN TABELACAR C ON E.COD_CARGO = C.COD_CARGO WHERE E.COD_CARGO IS NULL
10
Capítulo 7 Subqueries introduzidas com sinal de =
-- Funcionário(s) que ganha(m) menos SELECT * FROM EMPREGADOS WHERE SALARIO = (SELECT MIN(SALARIO) FROM Empregados) -- o mesmo que SELECT TOP 1 WITH TIES * FROM EMPREGADOS WHERE SALARIO IS NOT NULL ORDER BY SALARIO
11
Capítulo 7 -- Funcionário mais novo na empresa
SELECT * FROM EMPREGADOS WHERE DATA_ADMISSAO = (SELECT MAX(DATA_ADMISSAO) FROM EMPREGADOS) -- O mesmo que SELECT TOP 1 WITH TIES * FROM EMPREGADOS ORDER BY DATA_ADMISSAO DESC
12
Capítulo 7 Subqueries correlacionadas
São aquelas que possuem referência a uma ou mais colunas da query externa -- Grava no campo SALARIO de cada funcionário o -- valor de salário inicial contido na tabela de cargos UPDATE EMPREGADOS SET SALARIO = (SELECT SALARIO_INIC FROM TABELACAR WHERE COD_CARGO = EMPREGADOS.COD_CARGO)
13
Capítulo 7 Subqueries correlacionadas com EXISTS
Ao utilizarmos a cláusula EXISTS não é retornado dados e sim TRUE ou FALSE Antes de EXISTS não deve haver coluna, constante ou expressão Ao utilizar EXISTS, sua lista de seleção será normalmente um asterisco -- Clientes que NÃO compraram em Janeiro de 2007 SELECT * FROM CLIENTES WHERE NOT EXISTS (SELECT * FROM PEDIDOS WHERE CODCLI = CLIENTES.CODCLI AND DATA_EMISSAO BETWEEN ' ' AND ' ')
14
Capítulo 7 Diferenças entre subqueries e associações
Associações são mais rápidas, porém não lidam com lista de valores As subqueries facilitam na visualização e organização da query
15
Capítulo 7 -- Calcula o total vendido por cada vendedor em Janeiro/ e a porcentagem das suas vendas em relação ao total -- vendido no mês SELECT P.CODVEN, V.NOME, SUM(P.VLR_TOTAL) AS TOT_VENDIDO, 100 * SUM(P.VLR_TOTAL) / (SELECT SUM(VLR_TOTAL) FROM PEDIDOS WHERE DATA_EMISSAO BETWEEN ' ' AND ' ') AS PORCENTAGEM FROM PEDIDOS P JOIN VENDEDORES V ON P.CODVEN = V.CODVEN WHERE P.DATA_EMISSAO BETWEEN ' ' AND ' ' GROUP BY P.CODVEN, V.NOME
16
Capítulo 7 Tabelas temporárias São armazenadas no banco tempdb
Utilizar o símbolo # para tabela temporária associadas a conexão atual Quando é utilizado o símbolo ## todos os outros usuários poderão visualizar Tabelas criadas localmente serão excluídas ao encerrar a conexão Tabelas globais serão excluídas quando todo os usuários conectados a elas encerram suas seções Exemplo página 210
17
Capítulo 7 Laboratório página 256 à 263
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.