Buscar

AULA 4 UPDATE DELETE

Prévia do material em texto

1 
 
 
AULA – UPDATE – DELETE 
 
VAMOS REVISAR OS COMANDOS: 
 
1)O COMANDO UPDATE PRESENTA A SEGUINTE SINTAXE: 
 
UPDATE <TABELA> 
SET <ATRIBUTO 1> = <VALOR 1>, 
 <ATRIBUTO 2> = <VALOR 2>, 
 <ATRIBUTO N> = <VALOR N> 
WHERE (CONDIÇÃO OU CONDIÇÕES) 
 
NUNCA ESQUEÇA QUE SE NÃO INFORMAR CONDIÇÃO NO COMANDO UPDATE ELE 
ALTERARÁ TODOS OS DADOS DA TABELA E PARA VOLTAR ATRÁS SOMENTE COM 
BACKUP, CASO TENHA, SENÃO TERÁ QUE REFAZER A TABELA TODA. 
 
 
1.1)SE A ALTERAÇÃO SERÁ FEITA PARA TODOS OS REGISTROS (TUPLAS) DA 
TABELA USAMOS O COMANDO SEM A CLÁUSULA WHERE 
 
EXEMPLO: AUMENTO DE 10% PARA OS FUNCIONÁRIOS 
 
UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.1 
 
1.2)SE PRECISARMOS DE CONDIÇÕES PARA A ALTERAÇÃO VAMOS USAR A CLÁUSULA 
WHERE COM JÁ FIZEMOS COM O COMANDO SELECT 
 
EXEMPLO: AUMENTO DE 15% PARA OS HOMENS E 20 PARA AS MULHERES 
 
UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.15 WHERE SEXO = 'M' 
 
UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.2 WHERE SEXO = 'F' 
 
1.3)QUANDO TEMOS QUE FAZER A ATUALIZAÇÃO DE UM ÚNICO REGISTRO TEMOS 
QUE UTILIZAR O ATRIBUTO QUE GARANTE A NÃO DUPLICIDADE DE DADOS, OU 
SEJA A CHAVE PRIMÁRIA (PK-PRIMARY KEY), NO NOSSO CASO O ATRIBUTO 
FUNCIONARIOID 
 
EXEMPLO: FOI SOLICITADA A ALTERAÇÃO DE DADOS DA FUNCIONÁRIA ANA, QUE 
TEM FUNCIONARIOID = 1, ASSIM TEMOS O COMANDO ABAIXO: 
 
UPDATE FUNCIONARIO 
SET SALARIO = 19000, 
ENDERECO = 'AV BRASIL, 232' 
BAIRRO = 'JARDIM EUROPA' 
CEP = '04520032' 
WHERE FUNCIONARIOID = 1 
 
VALE SALIENTAR QUE É UM ÚNICO SET PARA TODO O COMANDO, ASSIM COM SÓ 
TEMOS UM ORDER BY PARA CADA SELECT. 
 
 
2)O COMANDO DELETE PRESENTA A SEGUINTE SINTAXE: 
 
DELETE <TABELA> 
WHERE (CONDIÇÃO OU CONDIÇÕES) 
 
NUNCA ESQUEÇA QUE SE NÃO INFORMAR CONDIÇÃO NO COMANDO DELETE ELE 
APAGARÁ TODOS OS DADOS DA TABELA E PARA VOLTAR ATRÁS SOMENTE COM 
BACKUP, CASO TENHA, SENÃO TERÁ QUE REFAZER A TABELA TODA. 
2 
 
 
2.1)SE A EXCLUSÃO SERÁ FEITA PARA TODOS OS REGISTROS (TUPLAS) DA 
TABELA USAMOS O COMANDO SEM A CLÁUSULA WHERE 
 
EXEMPLO: EXCLUSÃO DE TODOS OS FUNCIONÁRIOS 
 
DELETE FUNCIONARIO 
 
2.2)SE PRECISARMOS DE CONDIÇÕES PARA A EXCLUSÃO VAMOS USAR A CLÁUSULA 
WHERE COM JÁ FIZEMOS COM O COMANDO SELECT 
 
EXEMPLO: EXCLUIR OS HOMENS E/OU AS MULHERES 
 
DELETE FUNCIONARIO WHERE SEXO = 'M' 
 
DELETE FUNCIONARIO WHERE SEXO = 'F' 
 
2.3)QUANDO TEMOS QUE EXCLUIR UM ÚNICO REGISTRO TEMOS QUE UTILIZAR O 
ATRIBUTO QUE GARANTE A NÃO DUPLICIDADE DE DADOS, OU SEJA A CHAVE 
PRIMÁRIA (PK-PRIMARY KEY), NO NOSSO CASO O ATRIBUTO FUNCIONARIOID 
 
EXEMPLO: FOI SOLICITADA A EXCLUSÃO DE DADOS DO FUNCIONÁRIO LUCIANO 
ARAÚJO, QUE TEM FUNCIONARIOID = 2, ASSIM TEMOS O COMANDO ABAIXO: 
 
DELETE FUNCIONARIO WHERE FUNCIONARIOID = 2 
 
3)TEMOS TAMBÉM OS SEGUINTES COMANDOS PARA EXCLUSÃO DE DADOS: 
 
ANTES PORÉM VALE SALIENTAR QUE QUANDO USAMOS O COMANDO DELETE SEM A 
CLÁUSULA WHERE ELE EXCLUIRÁ TODOS OS REGISTROS DA TABELA MAS A 
NUMERAÇÃO DA CHAVE PRIMÁRIA CONTINUARÁ, OU SEJA, EM NOSSA TABELA TEMOS 
10 FUNCIONÁRIOS E SE APÓS <DELETE FUNCIONARIO> FIZERMOS UM INSERT INTO 
FUNCIONARIO, O VALOR DA CHAVE PRIMÁRIA, FUNCIONARIOID, SERÁ 11. 
 
3.1)COMANDO TRUNCATE TABLE 
 
TRUNCATE TABLE <TABELA> 
 
O COMANDO TRUNCATE TABLE ELEMINA OS DADOS COMO O COMANDO DELETE, E 
TAMBÉM REINICIA A CONTAGEM DA CHAVE PRIMÁRIA, NO MESMO CASO ACIMA, 
APÓS <TRUNCATE TABLE FUNCIONARIO> FIZERMOS UM INSERT INTO FUNCIONARIO, 
O VALOR DA CHAVE PRIMÁRIA, FUNCIONARIOID, SERÁ 1 NOVAMENTE. 
 
3.2)COMANDO DROP TABLE 
 
DROP TABLE <TABELA> 
 
JÁ ESTE COMANDO ALÉM DE ELIMINAR OS DADOS TAMBÉM ELIMINA DA TABELA DO 
BANCO DE DADOS. MUITA ATENÇÃO PARA USÁ-LO. 
 
4)TRANSAÇÃO – TRANSACTION 
 
TEMOS UM RECURSO DE SEGURANÇA PARA NOSSAS ATIVIDADE EM SQL, AS 
TRANSACTIONs, COM ELA PODEMOS RETORNAR A UM PONTO DE ORIGEM SEM PERDER 
OU ALTERAR OS DADOS INICIAIS. 
 
4.1)COMANDO BEGIN TRAN 
 
BEGIN TRAN 
 
INICIA A TRANSAÇÃO E A PARTIR DESTE MOMENTO TODOS OS COMANDOS FEITOS 
NA SEQUÊNCIA PODERÃO SER DEFEITOS OU EFETIVADOS: 
3 
 
 
EXEMPLO: VAMOS DAR AUMENTO DE 10% PARA OS HOMENS, 20% PARA AS MULHERES 
E EXCLUIR OS DADOS DOS FUNCINÁRIOS QUE FORMAM ADMITIDOS EM 2000. 
 
COMO NÃO TEMOS CERTEZA QUE SE ESSE PEDIDO SERÁ OFICIALIZADOS, PARA 
NOSSA SEGURANÇA VAMOS UTILIZAR OS COMANDOS ABAIXO: 
 
NUNCA ESQUEÇA DE FAZER O COMANDO BEGIN TRAN ANTES DOS COMANDOS QUE 
PODEM SER DESFEITOS, SENÃO NÃO TERÁ COMO DESFAZER TAIS COMANDOS. 
 
 
BEGIN TRAN 
UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.1 WHERE SEXO = 'M' 
UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.2 WHERE SEXO = 'F' 
DELETE FUNCIONARIO WHERE YEAR(DATA_ADMISSAO) = 2000 
 
4.2)COMANDO ROLLBACK TRAN 
 
CASO PERCEBEMOS QUE HOUVE ALGUM ERRO EM NOSSAS CONDIÇÕES OU QUE NOS 
FOI PEDIDO PARA DESFAZER(MOS) A(S) OPERACÃO(ÕES), DESDE DE TENHAMOS 
FEITO O BEGIN TRAN, USAMOS O COMANDO ROLLBACK TRAN (VOLTAR ATRÁS). 
 
ROLLBACK TRAN 
 
FEITO ISSO OS DADOS OS ANTES DOS UPDATEs E DELETE SERÃO MANTIDOS 
 
4.3)COMANDO COMMIT TRAN 
 
SE TUDO ESTIVER CORRETO PODEMOS ENTÃO EFETIVAR A TRANSAÇÃO COM O 
COMANDO COMMIT TRAN (EFETIVAR A TRANSAÇÃO). 
 
COMMIT TRAN 
 
COM ISSO OS DADOS SERÃO ALTERADOS E EXCLUÍDOS. 
 
EXEMPLO DENTRO DE UMA PROCEDURE 
 
CREATE PROCEURE SP_EXCLUIR 
@PRODUTOID INT 
AS 
DECLARE @ERRO INT 
SET @ERRO=0 
 
BEGIN TRANSACTION 
 
DELETE PRODUTO WHERE PRODUTOID = @PRODUTOID 
 
SET @ERRO = @@ERROR 
 
IF @ERRO <> 0 
 BEGIN 
 ROLLBACK TRANSACTION 
 SELECT @ERRO,'OCORREU UM ERRO NA PROCEDURE: SP...' 
 END 
ELSE 
 BEGIN 
 COMMIT TRANSACTION 
 SELECT @ERRO,'SEM ERROS NA PROCEDURE' 
 END 
 
MODELO FÍSICO PARA NOSSA AULA 
4 
 
 
 
 
 
I – COMANDO 
SELECT <LISTA DE ATRIBUTOS> 
FROM <TABELA(S)> 
WHERE <CONDIÇÃO(ÕES)> 
ORDER BY <ATRIBUTO> ASC/DESC 
 
USANDO O COMANDO SELECT PRECISAMOS LISTAR OS SALÁRIOS DAS FUNCIONÁRIAS 
COM 15% DE AUMENTE E 10% PARA OS FUNCIONÁRIOS. 
 
INICIALMENTE CRIAMOS OS SELECT PARA CADA CASO: 
 
SELECT FUNCIONARIO,SALARIO,SALARIO * 1.15 AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = 'F' 
 
SELECT FUNCIONARIO,SALARIO,SALARIO * 1.10 AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = 'M' 
 
ABAIXO TEMOS OS RECORDSETs GERADOS PELAS QUERIES ACIMA: 
 
FUNCIONARIO SALARIO AUMENTO 
------------------------------------- --------------------------------------- ---------- 
ANA MARIA SOARES 17000.00 19550.0000 
VICTÓRIA MAGALHÃES 7000.00 8050.0000 
GLORIA MARIA DE SOUZA 4000.00 4600.0000 
BEATRIZ DE OLIVEIRA 2800.00 3220.0000 
MARIA APARECIDA DE JESUS 4500.00 5175.0000 
 
(5 row(s) affected) 
 
FUNCIONARIO SALARIO AUMENTO 
-------------------------------------- --------------------------------------- --------- 
LUCIANO DE ARAÚJO 8000.00 8800.0000 
CARLOS ROBERTO SILVA 5000.00 5500.0000 
FERNANDO GOMES 3500.00 3850.0000 
EDUARDO DA LUZ 1900.00 2090.0000 
VICENTE JOSE DOS SANTOS 5000.00 5500.0000(5 row(s) affected) 
 
 
PODEMOS USAR VARIÁVEIS DE MEMÓRIA PARA SUBSTITUIR O SEXO PESQUISADO E 
O VALOR DO ÍNDICE A SER UTILIZADO, CONFORME ABAIXO: 
5 
 
 
 
--DECLARAÇÃO DE VARIÁVIES USANDO O COMANDO DECLARE 
DECLARE @SEXO CHAR(1) 
DECLARE @INDICE NUMERIC(18,2) 
 
--APÓS O DECLARE SER EXECUTADO AS VARIÁVEIS EXISTEM, MAS TÊM VALOR 
IGUAL A NULL 
--PARA ATRIBUIR VALORES ÀS VARIÁVEIS DE MEMÓRIA 
--USAMOS O COMANDO SET 
SET @SEXO = 'F' 
SET @INDICE = 1.15 
 
--ASSIM PODEMOS SUBSTITUIR DADOS PELAS VARIÁVEIS DE MEMÓRIA JÁ 
DEFINIDAS 
SELECT FUNCIONARIO,SALARIO,SALARIO * @INDICE AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = @SEXO 
 
SELECT FUNCIONARIO,SALARIO,SALARIO * @INDICE AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = @SEXO 
 
 
SELECT FUNCIONARIO,SALARIO,SALARIO * 1.15 AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = 'F' 
 
SELECT FUNCIONARIO,SALARIO,SALARIO * 1.10 AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = 'M' 
 
PROCESSANDO ESTE SCRIPT OS RESULTADO É IDÊNTICO AO ANTERIOR, MAS JÁ 
ESTAMOS USANDO AS VARIÁVEIS DE MEMÓRIA. 
 
FUNCIONARIO SALARIO AUMENTO 
------------------------------------- --------------------------------------- ---------- 
ANA MARIA SOARES 17000.00 19550.0000 
VICTÓRIA MAGALHÃES 7000.00 8050.0000 
GLORIA MARIA DE SOUZA 4000.00 4600.0000 
BEATRIZ DE OLIVEIRA 2800.00 3220.0000 
MARIA APARECIDA DE JESUS 4500.00 5175.0000 
 
(5 row(s) affected) 
 
FUNCIONARIO SALARIO AUMENTO 
-------------------------------------- --------------------------------------- --------- 
LUCIANO DE ARAÚJO 8000.00 8800.0000 
CARLOS ROBERTO SILVA 5000.00 5500.0000 
FERNANDO GOMES 3500.00 3850.0000 
EDUARDO DA LUZ 1900.00 2090.0000 
VICENTE JOSE DOS SANTOS 5000.00 5500.0000 
 
(5 row(s) affected) 
 
 
COMO PRECISAMOS SEPARAR UMA LISTA PARA AS FUNCIONÁRIAS E OUTRA PARA OS 
FUNCIONÁRIOS, PODEMOS USAR O COMANDO IF COMO OPÇÃO. 
 
--DECLARAÇÃO DE VARIÁVIES USANDO O COMANDO DECLARE 
DECLARE @SEXO CHAR(1) 
DECLARE @INDICE NUMERIC(18,2) 
 
--APÓS O DECLARE SER EXECUTADO AS VARIÁVEIS EXISTEM, MAS TÊM VALOR 
IGUAL A NULL 
--PARA ATRIBUIR VALORES ÀS VARIÁVEIS DE MEMÓRIA 
--USAMOS O COMANDO SET 
SET @SEXO = 'F' 
SET @INDICE = 1.15 
 
6 
 
 
--ASSIM PODEMOS SUBSTITUIR DADOS PELAS VARIÁVEIS DE MEMÓRIA JÁ 
DEFINIDAS 
 
--AQUI COLOCAMOS A REGRA ESTABELECIDA, USANDO O COMANDO IF 
IF @SEXO = 'F' 
 SELECT FUNCIONARIO,SALARIO,SALARIO * @INDICE AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = @SEXO 
 
--A OUTRA CONDIÇÃO, POSTERIORMENTE USAREMOS O ELSE DO COMANDO IF 
IF @SEXO = 'M' 
 SELECT FUNCIONARIO,SALARIO,SALARIO * @INDICE AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = @SEXO 
 
 
PROCESSANDO O SCRIPT ACIMA TEMOS ABAIXO O RECORDSET, SOMENTE COM OS 
DADOS DAS FUNCIONÁRIAS POIS ESTABELECEMOS PARA A VARIÁVEL @SEXO O 
VALOR 'F'. 
 
 
FUNCIONARIO SALARIO AUMENTO 
------------------------------------- --------------------------------------- ---------- 
ANA MARIA SOARES 17000.00 19550.0000 
VICTÓRIA MAGALHÃES 7000.00 8050.0000 
GLORIA MARIA DE SOUZA 4000.00 4600.0000 
BEATRIZ DE OLIVEIRA 2800.00 3220.0000 
MARIA APARECIDA DE JESUS 4500.00 5175.0000 
 
(5 row(s) affected) 
 
 
SE PRECISARMOS LISTA OS FUNCIONÁRIOS TEMOS QUE MUDAR O VALOR DA 
VARIÁVEL @SEXO PARA 'M', COM ISSO TEMOS UM NOVO RECORSET, CONFORME 
ABAIXO: 
 
FUNCIONARIO SALARIO AUMENTO 
-------------------------------------- --------------------------------------- --------- 
LUCIANO DE ARAÚJO 8000.00 8800.0000 
CARLOS ROBERTO SILVA 5000.00 5500.0000 
FERNANDO GOMES 3500.00 3850.0000 
EDUARDO DA LUZ 1900.00 2090.0000 
VICENTE JOSE DOS SANTOS 5000.00 5500.0000 
 
(5 row(s) affected) 
 
FINALMENTE PODEMOS CRIAR UMA STORED PROCEDURE PARA SER PROCESSADA E 
EXIBIR O RECORDSET DESEJADO, ASSIM PODEMOS TRANSFORMAR AS VARIÁVEL 
@SEXO E @INDICE EM PARÂMETROS, E COM ISSO NÃO SERÁ NECESSÁRIO A CADA 
PESQUISA TROCAR OS VALORES DAS VARIÁVEIS, POIS ESTES SERÃO INFORMADOS 
NA CHAMADA DA STORED PROCEDURE. 
 
 
 
CREATE PROCEDURE SP_PESQUISA_FUNCIONARIO_AUMENTO_SALARIAL 
--OS PARAMÊTROS DEVEM SER INFORMADOS ANTES DA CLÁUSULA 'AS' 
--POIS DEPOIS SERÃO ENTIDADAS COMO VARIÁVEIS DE MEMÓRIA 
-- 
@SEXO CHAR(1), 
@INDICE NUMERIC(18,2) 
 
--AS VARIÁVEIS DEIXAM DE APARECER AQUI POIS SE TRANSFORMARAM EM 
PARÂMETROS CONFORME ACIMA 
--ANTES DA CLÁUSULA AS É PARÂMETRO, SEM USAR O COMANDO DECLARE, DEPOIS 
É VARIÁVEL DE MEMÓRIA COM A UTILIZAÇÃO DO COMANDO DECLARE 
 
AS 
7 
 
 
 
--AQUI COLOCAMOS A REGRA ESTABELECIDA, USANDO O COMANDO IF 
IF @SEXO = 'F' 
 SELECT FUNCIONARIO,SALARIO,SALARIO * @INDICE AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = @SEXO 
 
--A OUTRA CONDIÇÃO, POSTERIORMENTE USAREMOS O ELSE DO COMANDO IF 
IF @SEXO = 'M' 
 SELECT FUNCIONARIO,SALARIO,SALARIO * @INDICE AS 'AUMENTO' FROM 
FUNCIONARIO WHERE SEXO = @SEXO 
 
 
PROCESSANDO O SCRIPT ACIMA A STORED PROCEDURE 
SP_PESQUISA_FUNCIONARIO_AUMENTO_SALARIAL FOI CRIADA, E PARA PROCESSÁ-
LA TEMOS QUE INFORMAR OS PARÂMETROS SEXO E ÍNDICE (NESTA ORDEM POIS 
SÃO POSICIONAIS, OU SEJA, PRIMEIRO O SEXO E DEPOIS O ÍNDICE, POIS 
CRIAMOS NESSA ORDEM) 
 
 
SP_PESQUISA_FUNCIONARIO_AUMENTO_SALARIAL 'F',1.15 
 
FUNCIONARIO SALARIO AUMENTO 
------------------------------------- --------------------------------------- ---------- 
ANA MARIA SOARES 17000.00 19550.0000 
VICTÓRIA MAGALHÃES 7000.00 8050.0000 
GLORIA MARIA DE SOUZA 4000.00 4600.0000 
BEATRIZ DE OLIVEIRA 2800.00 3220.0000 
MARIA APARECIDA DE JESUS 4500.00 5175.0000 
 
(5 row(s) affected) 
 
 
SP_PESQUISA_FUNCIONARIO_AUMENTO_SALARIAL 'M',1.10 
 
FUNCIONARIO SALARIO AUMENTO 
-------------------------------------- --------------------------------------- --------- 
LUCIANO DE ARAÚJO 8000.00 8800.0000 
CARLOS ROBERTO SILVA 5000.00 5500.0000 
FERNANDO GOMES 3500.00 3850.0000 
EDUARDO DA LUZ 1900.002090.0000 
VICENTE JOSE DOS SANTOS 5000.00 5500.0000 
 
(5 row(s) affected) 
 
 
II – SUBQUERIES 
 
ANTERIORMENTE PARA SABEMOS QUAIS SÃO AS CIDADES QUE PERTENCEM AOS 
ESTADOS CUJA A UF É SP OU RJ, UTILIZAMOS AS DUAS QUERIES ABAIXO. 
 
SENDO A PRIMEIRA PARA SABER QUAL(AIS) AS CHAVE(S) PRIMÁRIA(S) DA 
TABELA ESTADO (ESTADOID – PK) PARA EM SEGUIDA FAZERMOS A PESQUISA NA 
TABELA CIDADE USANDO O CHAVE ESTRANGEIRA (ESTADOID - FK). 
 
ASSIM TEMOS AS QUERIES ABAIXO COM OS RECORDSET GERADOS: 
 
SELECT * FROM ESTADO WHERE UF = 'SP' OR UF = 'RJ' 
SELECT * FROM CIDADE WHERE ESTADOID IN (1,2) 
 
ESTADOID ESTADO UF 
----------- -------------------------------------------------- ---- 
1 SÃO PAULO SP 
2 RIO DE JANEIRO RJ 
 
(2 row(s) affected) 
 
CIDADEID CIDADE ESTADOID 
8 
 
 
----------- ------------------------------------------------------------ ----------- 
1 SÃO PAULO 1 
2 RIO DE JANEIRO 2 
 
(2 row(s) affected) 
 
 
A SUBQUERY É UMA QUERY QUE VAI PASSAR VALORES PARA OUTRA QUERY SER 
PROCESSADA, NESTE CASO PARA QUE A QUERY DE PESQUISA DE CIDADES 
 
( SELECT * FROM CIDADE WHERE ESTADOID IN (1,2) ) 
 
SEJA PROCESSADA TEMOS QUE INICIALMENTE PROCESSAR A QUERY DE ESTADOS 
COM UF IGUAL A 'SP' OU UF = 'RJ', MAS SÓ PRECISAMOS DOS DADOS DA CHAVE 
PRIMÁRIA POIS É COM ELA QUE VAMOS PODE ESCREVER O SCRIPT DA PESQUISA 
USANDO SUBQUERY. 
 
TEMOS ENTÃO A PESQUISA DE ESTADO, MAS SÓ TRAZENDO A CHAVE PRIMÁRIA 
ESTADOIF, CONFORME ABAIXO: 
 
SELECT ESTADOID FROM ESTADO WHERE UF = 'SP' OR UF = 'RJ' 
 
ESTADOID 
----------- 
1 
2 
 
(2 row(s) affected) 
 
PERCEBEMOS QUE O RESULTADO DESTA QUERY É EXATAMENTE O QUE PRECISAMOS 
PARA QUE A QUERY DE PESQUISA DE CIDADE POSSA SER PROCESSADA, ASSIM A 
QUERY DE CIDADE UTILIZA A SUBQUERY DE ESTADO PARA SER PROCESSADA, 
CONFORME ABAIXO: 
 
 
ONDE INICIALMENTE TEMOS A REGRA ABAIXO 
 
SELECT * FROM CIDADE WHERE ESTADOID IN (1,2) 
 
USANDO O CONCEITO DE SUBQUERY TEMOS O SEGUINTE SCRIPT 
 
SELECT * FROM CIDADE 
WHERE ESTADOID 
IN (SELECT ESTADOID FROM ESTADO WHERE UF = 'SP' OR UF = 'RJ') 
 
CIDADEID CIDADE ESTADOID 
----------- ------------------------------------------------------------ ----------- 
1 SÃO PAULO 1 
2 RIO DE JANEIRO 2 
 
(2 row(s) affected 
 
AGORA AO INVÉS DE TERMOS 2 QUERIES PARA ESSE PROCESSAMENTO, PASSAMOS A 
TER 1 ÚNICA. 
 
PODEMOS TER VÁRIOS NÍVEIS DE SUBQUERIES, OU SEJA, PARA SABERMOS QUAIS 
OS FUNCIONÁRIOS QUE MORAM NOS ESTADOS INFORMADO ACIMA, TEMOS QUE 
ACRESCENTAR OUTRA QUERY COM A TABELA DE FUNCIONÁRIO, CONFORME ABAIXO: 
 
SELECT FUNCIONARIO,SALARIO FROM FUNCIONARIO 
WHERE 
CIDADEID IN (SELECT CIDADEID FROM CIDADE 
 WHERE ESTADOID IN (SELECT ESTADOID FROM ESTADO WHERE UF = 
 'SP' OR UF = 'RJ')) 
 
 
9 
 
 
FUNCIONARIO SALARIO 
-------------------------------------------------------------------------------- ------- 
ANA MARIA SOARES 7000.00 
LUCIANO DE ARAÚJO 8000.00 
 
(2 row(s) affected) 
 
VALE SALIENTAR QUE A SUBQUERY RECEBE COMO PARÂMETRO A CHAVE PRIMÁRIA, 
POR ISSO PERCEBA A POSIÇÃO DE CIDADEID E ESTADOID NAS QUERY ACIMA. 
 
AINDA PODEMOS FAZER A PESQUISA INCLUINDO O DEPARTAMENTO PODENDO SER 
DIRETORIA OU ENFERMARIA 
 
 
SELECT FUNCIONARIO,SALARIO FROM FUNCIONARIO 
WHERE 
CIDADEID IN (SELECT CIDADEID FROM CIDADE 
 WHERE ESTADOID IN (SELECT ESTADOID FROM ESTADO WHERE UF = 
 SP' OR UF = 'RJ')) 
 
OR DEPARTAMENTOID IN 
 (SELECT DEPARTAMENTOID FROM DEPARTAMENTO WHERE DEPARTAMENTO IN 
 ('DIRETORIA','ENFERMARIA')) 
 
 
FUNCIONARIO SALARIO 
------------------------------------------------------------------------------- -------- 
ANA MARIA SOARES 17000.00 
LUCIANO DE ARAÚJO 8000.00 
VICENTE JOSE DOS SANTOS 5000.00 
 
(3 row(s) affected) 
 
 
 
REFERÊNCIAS 
 
ELMASRI, Ramez; NAVATHE, Shamkant. B. Sistemas de Banco de Dados. 6ª 
Edição. São Paulo: Pearson, 2011. 
 
GUIMARÃES, Célio Cardoso. Fundamentos de Banco de Dados: Modelagem, 
Projeto e SQL. 1ª Edição. Campinas SP: Unicamp, 2008. 
 
 
--- 
-- 
SELECT MAX(SALARIO) AS 'MAX',MIN(SALARIO) 
AS 'MIN' FROM FUNCIONARIO 
-- 
DECLARE @MAX NUMERIC(18,2),@MIN 
NUMERIC(18,2) 
SELECT 
@MAX=MAX(SALARIO),@MIN=MIN(SALARIO) FROM 
FUNCIONARIO 
SELECT @MAX AS 'MAX',@MIN AS 'MIN' 
10 
 
 
SELECT NM_FUNCIONARIO,SALARIO,@MAX - 
SALARIO,SALARIO - @MIN FROM FUNCIONARIO 
-- 
SELECT NM_FUNCIONARIO,SALARIO,(SELECT 
MAX(SALARIO) FROM FUNCIONARIO)- SALARIO, 
SALARIO - (SELECT MIN(SALARIO) FROM 
FUNCIONARIO) 
FROM FUNCIONARIO-- 
CREATE PROCEDURE SP_CID_EST 
@UF CHAR(2) 
AS 
DECLARE @ESTADOID INT,@NM_ESTADO CHAR(50) 
SELECT 
@ESTADOID=ESTADOID,@NM_ESTADO=NM_ESTADO 
FROM ESTADO WHERE UF=@UF 
 
SELECT NM_CIDADE,@NM_ESTADO AS 'NOME 
ESTADO',@UF AS 'UF' 
FROM CIDADE 
WHERE ESTADOID=@ESTADOID 
ORDER BY NM_CIDADE 
-- 
CREATE PROCEDURE SP_CID_UF 
@UF CHAR(2) 
AS 
DECLARE @ESTADOID INT 
SELECT @ESTADOID=ESTADOID 
FROM ESTADO WHERE UF=@UF 
-- 
SELECT NM_CIDADE,(SELECT NM_ESTADO FROM 
ESTADO WHERE UF=@UF) AS 'NOME ESTADO',@UF 
AS 'UF' 
FROM CIDADE 
WHERE ESTADOID=@ESTADOID 
ORDER BY NM_CIDADE 
 
11 
 
 
--SUBQUERY 
SELECT * FROM ESTADO WHERE UF='SP' 
SELECT * FROM CIDADE WHERE ESTADOID=1 
-- 
SELECT ESTADOID FROM ESTADO WHERE UF='SP' 
SELECT * FROM CIDADE WHERE ESTADOID=1 
-- 
SELECT ESTADOID FROM ESTADO WHERE UF='SP' 
SELECT * FROM CIDADE WHERE ESTADOID IN 
(SELECT ESTADOID FROM ESTADO WHERE 
UF='SP') 
-- 
SELECT *,(SELECT NM_ESTADO FROM ESTADO 
WHERE UF='SP') AS 'NOME ESTADO' 
FROM CIDADE WHERE ESTADOID IN (SELECT 
ESTADOID FROM ESTADO WHERE UF='SP') 
-- 
CREATE PROCEDURE SP_ESTADO_SUB 
@UF CHAR(2) 
AS 
SELECT NM_CIDADE,@UF AS 'UF',(SELECT 
NM_ESTADO FROM ESTADO WHERE UF=@UF) AS 
'NOME ESTADO' 
FROM CIDADE WHERE ESTADOID IN (SELECT 
ESTADOID FROM ESTADO WHERE UF=@UF) 
ORDER BY NM_CIDADE

Continue navegando