Exercícios 1 Exercícios 1. Crie um Banco de Dados Chamado: Exercicio+SeuNome 2. Crie uma tabela chamada CLIENTE, contendo os seguintes campos: Campo Tipo Tamanho Permissão PK Cod_cli Numeric 8,0 Not null Primary Key Nome Varchar 60 Null Telefone Varchar 20 Null CREATE TABLE cliente ( cod_cli numeric (8,0) not null PRIMARY KEY, nome varchar (60) null, telefone varchar (20) null ) 2 1
Exercícios 3. Insira os seguintes registros na tabela CLIENTES: Código Nome Telefone 1001 João 445-0988 1002 Alberto 465-9887 1003 Maria 789-9877 1004 Sonia INSERT cliente (cod_cli, nome, telefone) values (1001,'João','445-0988') INSERT cliente (cod_cli, nome, telefone) values (1002,'Alberto','465-9887') INSERT cliente (cod_cli, nome, telefone) values (1003,Maria', 789-9877') INSERT cliente (cod_cli, nome) values (1004, Sonia ) 3 Exercícios 4. Selecione o nome e o telefone de todos os clientes: SELECT nome, telefone FROM cliente 4 2
Exercícios 5. Altere todos os telefones para 000-1111: UPDATE cliente SET telefone = 000-1111 5 Exercícios 6. Altere todos os telefones para os números existentes anteriormente. Código Nome Telefone 1001 João 445-0988 1002 Alberto 465-9887 1003 Maria 789-9877 1004 Sonia UPDATE cliente SET telefone = 445-0988 WHERE cod_cli=1001 UPDATE cliente SET telefone = 465-9887 WHERE cod_cli=1002 UPDATE cliente SET telefone = 789-9877 WHERE cod_cli=1003 6 3
Exercícios 7. Apague o registro do cliente cujo código é 1004 DELETE cliente WHERE cod_cli = 1004 8. Selecione o código e o nome de todos os clientes, mas apresentando a seguinte frase: O código do +nome+ é +cod_cli. Não deixar espaço em branco entre os elementos que compõem a string. SELECT O codigo do + RTRIM (nome)+ é + RTRIM (STR(cod_cli) FROM cliente 9. Apresentar as mesmas informações do exercício anterior, ordenando agora em ordem alfabética de nome. SELECT O codigo do + RTRIM (nome)+ é + RTRIM (STR(cod_cli) FROM cliente ORDER BY nome 7 Exercícios 10. Crie uma tabela chamada CIDADE com os seguintes campos: Campo Tipo Tamanho Permissão PK Cod_cid Numeric 8,0 Not null Primary Key Nome_cid Varchar 45 Null UF Char 2 Null CREATE TABLE cidade ( cod_cid numeric (8,0) not null PRIMARY KEY, nome_cid varchar (45) null, uf char (2) null ) 8 4
Exercícios 11. Inclua os seguintes registros na tabela CIDADE Cod_cid Nome_cid UF 1 Campinas SP 2 Itu SP 3 Cabo Frio RJ 4 Niteroi RJ 5 Belo Horizonte MG 6 Uberaba MG INSERT cidade (cod_cid, nome_cid, UF) values (1, Campinas', SP') INSERT cidade (cod_cid, nome_cid, UF) values (2, Itu, SP') INSERT cidade (cod_cid, nome_cid, UF) values (3, Cabo Frio, RJ ) INSERT cidade (cod_cid, nome_cid, UF) values (4, Niteroi, RJ ) INSERT cidade (cod_cid, nome_cid, UF) values (5, Belo Horizonte, MG ) INSERT cidade (cod_cid, nome_cid, UF) values (4, Uberaba, MG ) 9 Exercícios 12. Selecione os nomes das cidades que pertençam ao estado de São Paulo e Rio de Janeiro (usar o campo UF para comparações). SELECT nome_cid FROM cidade WHERE uf = SP AND uf = RH 13. Selecione os nomes das cidades que pertençam ao estado de São Paulo e Rio de Janeiro (agora usando a cláusula IN). SELECT nome_cid FROM cidade WHERE uf IN ( SP, RJ ) 13. Selecione os nomes das cidades que contenham a letra T em qualquer lugar. SELECT nome_cid FROM cidade WHERE nome_cid LIKE %t% 10 5
Exercícios 12. Selecione os nomes dos clientes que tem o telefone que começa com o número 4. SELECT nome FROM cliente WHERE telefone LIKE 4% 11 Seleção de Dados (DQL Data Query Language) -Cláusulas INNER JOIN - 12 6
Table ALIAS: Permite atribuir um apelido para uma tabela dentro de um SELECT Facilita a identificação dos atributos em queries com mais de uma tabela Apelidos serão usados como prefixos Se não forem dados apelidos, os próprios nomes das tabelas poderão ser usados Exemplo: SELECT F.NOME_FUNC, C.NOME_CID FROM FUNCIONARIO F, CIDADE C WHERE F.NATURALIDADE = C.CODIGO 13 Exemplo: A) Altere a tabela CLIENTE utilizando o DESIGN TABLE do MS SQL Server, e acrescente o campo COD_CID, do tipo Numérico (8,0). B) Em seguida realize um UPDATE nos campos COD_CID da tabela CLIENTE, incluindo para cada registro um código de cidade diferente, existente na tabela CIDADE. TABELA CLIENTE Código Nome_cli Telefone Cod_cid 1001 João 445-0988 1 1002 Alberto 465-9887 2 1003 Maria 789-9877 3 1004 Sonia 4 TABELA CIDADE Cod_cid Nome_cid UF 1 Campinas SP 2 Itu SP 3 Cabo Frio RJ 4 Niteroi RJ 5 Belo Horizonte MG 6 Uberaba MG 14 7
Resposta das atualizações solicitadas anteriormente: UPDATE cliente SET cod_cid = 1 WHERE cod_cli = 1001 UPDATE cliente SET cod_cid = 2 WHERE cod_cli = 1002 UPDATE cliente SET cod_cid = 3 WHERE cod_cli = 1003 UPDATE cliente SET cod_cid = 4 WHERE cod_cli = 1004 15 C) Agora vamos selecionar os nomes dos clientes com suas respectivas cidades, utilizando o ALIAS junto com o comando SELECT: TABELA CLIENTE Código Nome_cli Telefone Cod_cid 1001 João 445-0988 1 1002 Alberto 465-9887 2 1003 Maria 789-9877 3 1004 Sonia 4 FK Cod_cid Nome_cid UF PK TABELA CIDADE 1 Campinas SP 2 Itu SP 3 Cabo Frio RJ 4 Niteroi RJ 5 Belo Horizonte MG 6 Uberaba MG SELECT CLI.Nome_cli, CID.Nome_cid FROM CLIENTE CLI, CIDADE CID WHERE CLI.Cod_cid = CID.Cod_cid 16 8
Usando o comando JOIN 17 Correlacionando Dados Implementando Junções (Joins): Junta informações de duas tabelas ao mesmo tempo, usando uma coluna de conexão em cada tabela Pode ser criado usando a seguinte sintaxe do SQL Server: SQL Server Syntax SELECT table_name.column_name, table_name.column_name [,table_name.column_name...] FROM {table_name, table_name } WHERE table_name.col_name join_operator table_name.col_name 18 9
SELECT razao_social, nome FROM cliente INNER JOIN cidade ON cliente.cidade=cidade.codigo Cliente CLIENTE razao_social cidade REFINACOES DE MILHO BRASIL LTD 11 RHODIA - STER FILMES LTDA 34 MOINHO RECIFE S/A 41 INOB IND. NORDESTINA DE BRONZE 5 ACUMULADORES PRESTOLITE LTDA 37 16* RCMEC-REGIMENTO DE CAVALAR 5 Resultado BENTONISA-BETONITA DO NORDESTE 17 razao_social EDINHO DE MANGABEIRA 17 A. FIGUEIREDO MOVEIS ESQUADRIA 17 IMENSA REDIMIX 17 Cidade CIDADE codigo nome uf pais 1 SOBRAL CE BR 2 COELHO NETO MA BR 3 ALHANDRA PB BR 4 ARARUNA PB BR 5 BAYEUX PB BR 6 CAAPORA PB BR 7 CABEDELO PB BR nome 8 CAJA PB BR REFINACOES DE MILHO BRASIL LTD ESPIRITO SANTO RHODIA - STER FILMES LTDA DALLAS MOINHO RECIFE S/A SAO PAULO INOB IND. NORDESTINA DE BRONZE BAYEUX ACUMULADORES PRESTOLITE LTDA NATAL 16* RCMEC-REGIMENTO DE CAVALAR BAYEUX BENTONISA-BETONITA DO NORDESTE PEDRAS DE FOGO EDINHO DE MANGABEIRA PEDRAS DE FOGO A. FIGUEIREDO MOVEIS ESQUADRIA PEDRAS DE FOGO Inner Join (ANSI) 19 Pedido codigo cliente 1 1 2 1 3 1 4 2 5 5 6 5 7 5 8 5 Cidade Cidade codigo nome 1 SOBRAL 2 COELHO NETO 3 ALHANDRA 4 ARARUNA 5 BAYEUX Joins com mais de duas tabelas select ped.codigo, cli.razao_social, cid.nome from pedido ped inner join cliente cli on ped.cliente = cli.codigo inner join cidade cid on cli.cidade = cid.codigo Cliente codigo razao_social cidade 1 REFINACOES DE MILHO BRASIL LTD 11 2 RHODIA - STER FILMES LTDA 34 3 MOINHO RECIFE S/A 41 4 INOB IND. NORDESTINA DE BRONZE 5 5 ACUMULADORES PRESTOLITE LTDA 37 6 16* RCMEC-REGIMENTO DE CAVALAR 5 Resultado codigo razao_social nome 1 REFINACOES DE MILHO BRASIL LTD ESPIRITO SANTO 2 REFINACOES DE MILHO BRASIL LTD ESPIRITO SANTO 4 RHODIA - STER FILMES LTDA DALLAS 15 RHODIA - STER FILMES LTDA DALLAS 5 ACUMULADORES PRESTOLITE LTDA NATAL 8 ACUMULADORES PRESTOLITE LTDA NATAL 24 EDINHO DE MANGABEIRA PEDRAS DE FOGO 25 EDINHO DE MANGABEIRA PEDRAS DE FOGO 9 ENCOR - FABRICA DE ENGRENAGENS SAO PAULO 20 10
Self Joins: Self Joins Correlacionam linhas de uma tabela com outras linhas da mesma tabela. Por envolver um join de uma tabela com ela mesma, você deve informar dois table aliases (ou apelidos). Apelidos permitirão a você identificar as duas tabelas com prefixos. 21 select setor = a.nome, superior = b.nome from setor a inner join setor b on a.superior = b.codigo Setor Setor(A) codigo nome superior 1 PRESIDENCIA 1 2 FABRICACAO MECANICA 8 3 ADMINISTRACAO 1 4 RECURSOS HUMANOS 1 5 COMPRAS 3 6 MARKETING 1 7 MANUTENCAO 8 PRODUCAO 1 9 EXPEDICAO 8 10 VENDAS 6 11 ATENDIMENTO A CLIENTES Resultado 6 setor PRESIDENCIA FABRICACAO MECANICA ADMINISTRACAO RECURSOS HUMANOS COMPRAS MARKETING PRODUCAO EXPEDICAO VENDAS ATENDIMENTO A CLIENTES Exemplo Setor(B) codigo nome superior 1 PRESIDENCIA 1 2 FABRICACAO MECANICA 8 3 ADMINISTRACAO 1 4 RECURSOS HUMANOS 1 5 COMPRAS 3 6 MARKETING 1 7 MANUTENCAO 8 PRODUCAO 1 9 EXPEDICAO 8 10 VENDAS 6 superior 11 ATENDIMENTO A CLIENTES 6 PRESIDENCIA PRODUCAO PRESIDENCIA PRESIDENCIA ADMINISTRACAO PRESIDENCIA PRESIDENCIA PRODUCAO MARKETING MARKETING 22 11
Executando comandos SELECT aninhados: A query mais interna (Subquery) é avaliada primeiro; A query mais externa depende da avaliação da Subquery; As subqueries devem estar entre parêntesis. Subqueries Operam Usando: Listas introduzidas com IN ou com um operador de comparação junto com ANY ou ALL Testes de existência são feitos com EXISTS where X IN ( select Y...) verdadeiro se existe algum Y tal que X = Y where X < ANY ( select Y...) verdadeiro se existe algum Y tal que X < Y where X < ALL ( select Y...) verdadeiro se para todo Y, X < Y where EXISTS ( select Y...) verdadeiro se número de linhas > 0 23 Exemplos: Obter detalhes completos de todos os funcionários cujos departamentos estejam localizados em Natal SELECT * FROM funcionarios WHERE cod_depto IN (SELECT cod_depto FROM Departamento WHERE Local = Natal ) Selecionar todos os projetos que não possuem empregados alocados SELECT Nome FROM Projeto WHERE Cod_Proj <> All (SELECT Cod_proj FROM Alocacao) Selecionar todos os projetos que possuem empregados alocados SELECT Nome FROM Projeto WHERE Cod_Proj = any (SELECT Cod_proj FROM Alocacao ) 24 12
Subqueries: A Subquery interna referencia atributos da Query externa A Subquery é executada para cada linha da query externa 25 Subquery no WHERE: A Subquery é executada para cada linha da query externa Exemplo: Mostre os funcionários que fizeram algum pedido maior do que seu próprio salário SELECT CODIGO, NOME FROM FUNCIONARIO F WHERE EXISTS ( SELECT * FROM PEDIDO WHERE TOTAL > F.SALARIO AND VENDEDOR = F.CODIGO ) 26 13
SELECT INTO: SELECT INTO cria uma nova tabela baseado no resultado de uma Query A tabela fica criada permanentemente, caso seu nome não inicie com # Nome iniciando com # indica tabela que apenas o criador enxerga Nome iniciando com ## indica tabela que todos enxergam Colunas da nova tabela são baseadas no resultado da query Colunas devem ter um título válido para nome de atributo EXEMPLO: Incluir todas as matriculas dos empregados na tabela temporária Matriculas SELECT Mat_Emp into #Matriculas FROM EMPREGADO 27 OPERADOR UNION: Cria um único conjunto de resultados para múltiplas queries Exemplo Simples Exemplo complexo SELECT * FROM nota_fiscal UNION SELECT * FROM old_nota_fiscal SELECT p.nome, i.quant FROM itens_pedido i INNER JOIN produto p on p.codigo=i.produto UNION SELECT nome, não vendido FROM produto WHERE codigo NOT IN (SELECT produto FROM itens_pedido) 28 14