Baixe o app para aproveitar ainda mais
Prévia do material em texto
Com a SQL podemos utilizar sub-selects, que são “selects dentro de selects”. Considere o exemplo: > select * from municipio; +----+------------+------+ | id | nome | uf | +----+------------+------+ | 1 | São Paulo | SP | | 2 | Osasco | SP | | 3 | Mateiros | TO | | 4 | Salvador | BA | +----+------------+------+ > select * from municipio where uf = 'SP'; +----+------------+------+ | id | nome | uf | +----+------------+------+ | 1 | São Paulo | SP | | 2 | Osasco | SP | Sala de Aula Tutoriais ← OK Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 1 of 15 14/09/2022 20:23 +----+------------+------+ > select count(*) from (select * from municipio where uf = 'SP') as subtab; +----------+ | count(*) | +----------+ | 2 | +----------+ Considere agora a existência da tabela voos, com um voo por registro e com a coluna data, representando a data do voo. Qual dos seguintes comandos exibe corretamente todos os dados dos voos ocorridos na data do voo mais an go registrado? SELECT * FROM voos WHERE data = (SELECT min(data)) as data_mais_antiga; SELECT * FROM voos WHERE data = (SELECT min(data) FROM voos) as data_mais_antiga; SELECT * FROM voos WHERE data = (SELECT min(data)) as data_mais_antiga; SELECT * FROM voos WHERE data = min(data); SELECT min(data) FROM voos; SELECT * FROM voos WHERE min(data); a. Como queremos ver todas as colunas, é necessário o “SELECT *”. Como queremos ver apenas alguns registros (voos mais an gos) é preciso um WHERE limitando isso, impondo uma condição sobre a data. Se já soubéssemos a data poderíamos fazer algo como “WHERE data = ‘2010-01-01’”, mas no caso podemos trocar o literal ‘2010-01-01’ pela expressão que nele resulta: “SELECT min(data) FROM voos”. Considere a seguinte tabela de pratos disponíveis em um restaurante: CREATE TABLE pratos (nome text, pais_origem text, vegetariano boolean, preco float); Considerando essa tabela, assinale a alternativa com o comando que torna possível a execução da seguinte consulta: Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 2 of 15 14/09/2022 20:23 SELECT pais_origem as pais, count(*) as qtd_pratos_vegetarianos FROM pratos_vegetarianos GROUP BY pais_origem; +--------+-------------------------+ | pais | qtd_pratos_vegetarianos | +--------+-------------------------+ | Índia | 10 | | Itália | 7 | | Brasil | 4 | +--------+-------------------------+ CREATE VIEW pratos_vegetarianos AS SELECT nome, pais_origem FROM pratos WHERE vegetariano; CREATE SUBSELECT pratos_vegetarianos AS SELECT nome, pais_origem AS pais FROM pratos WHERE vegetariano; CREATE VIEW pratos_vegetarianos AS SELECT nome, pais_origem FROM pratos WHERE vegetariano; CREATE SUBSELECT pratos_vegetarianos AS SELECT nome, pais_origem FROM pratos WHERE vegetariano; CREATE VIEW pratos_vegetarianos FROM SELECT nome, pais_origem FROM pratos WHERE vegetariano; CREATE VIEW FOR pratos AS SELECT * FROM pratos_vegetarianos WHERE vegetariano; b. Para que a consulta funcione, é preciso criar uma view para a tabela pratos. E a sintaxe para criar uma é CREATE VIEW <nome-da-view> AS <SELECT ...>. Considere a tabela abaixo, denominada tab1 e contendo as colunas col1 e col2. Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 3 of 15 14/09/2022 20:23 10 1 20 2 30 3 Descrição acessível: Tabela com duas colunas: col1 e col2. Conteúdo composto apenas de números. A SQL possui um recurso que possibilita a execução de operações aritméticas entre as colunas, como demonstra a seguinte consulta: > SELECT col1 + col2 as soma FROM tab1; soma 11 22 33 Considere ainda a existência de uma tabela acidentes_aereos, em que cada registro representa um acidente aéreo e que possui as colunas quantidade_passageiros e quantidade_vitimas_fatais. Assinale a alternativa que corretamente consulta a porcentagem de vítimas fatais (em relação ao total de passageiros) de cada acidente na tabela acidentes_aereos. SELECT quantidade_vitimas_fatais / quantidade_passageiros * 100 as porcentagem_sobreviventes FROM acidentes_aereos; (SELECT quantidade_vitimas_fatais FROM acidentes_aereos) / (SELECT quantidade_passageiros FROM acidentes_aereos) * 100; SELECT porcentagem_sobreviventes FROM acidentes_aereos; SELECT IN acidentes_aereos VALUE quantidade_vitimas_fatais / quantidade_passageiros * 100 as porcentagem_sobreviventes; SELECT quantidade_vitimas_fatais FROM quantidade_passageiros * 100 IN acidentes_aereos; Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 4 of 15 14/09/2022 20:23 SELECT quantidade_vitimas_fatais / quantidade_passageiros * 100 as porcentagem_sobreviventes FROM acidentes_aereos; e. Para obter a porcentagem de ví mas é preciso dividir, em cada registro, e quan dade de ví mas pela quan dade de passageiros e mul plicar essa proporção por 100. Considere a seguinte sequência de comandos: > SELECT id, saldo FROM conta_corrente WHERE id in (1324, 7634); id saldo ----- -------- 1324 5000.0 7634 40000.0 > BEGIN; > UPDATE conta_corrente SET saldo = saldo - 100 WHERE id = 1324; > UPDATE conta_corrente SET saldo = saldo + 200 WEHRE id = 7634; > COMMIT; > SELECT id, saldo FROM conta_corrente WHERE id in (1324, 7634); Qual é a saída produzida pelo último comando? … You have an error in your SQL syntax ... id saldo ----- -------- 1324 5100.0 7634 40200.0 id saldo ----- -------- 1324 5000.0 7634 40000.0 id saldo ----- -------- 1324 5100.0 7634 40000.0 … You have an error in your SQL syntax ... ----- -------- 1324 7634 5000.0 40000.0 b. Como há um erro de sintaxe no segundo UPDATE e os Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 5 of 15 14/09/2022 20:23 comandos de UPDATE estão envoltos em uma transação (BEGIN, COMMIT), então nenhum UPDATE será efe vo. Por isso a saída final será igual a saída do primeiro SELECT. Considere um banco de dados com uma tabela voos, contendo a coluna companhia, com a sigla da companhia aérea que operou o voo. Considere também que esse banco possui uma tabela companhias, com um cadastro de todas as companhias aéreas existentes. O que representa a seguinte consulta? SELECT (SELECT count(distinct companhia) FROM voos) / (SELECT count(*) FROM companhias); Considere como dica os seguintes comandos e suas respectivas saídas: > SELECT 4; 4 > SELECT 4/2; 2 A proporção de companhias cadastradas que operaram voos registrados na tabela voos. A quan dade de companhias que operaram voos registrados na tabela voos. A proporção de companhias cadastradas que operaram voos registrados na tabela voos. A quan dade total de companhias cadastradas. Não representa nada, pois seja qual for o conteúdo das tabelas esse comando sempre retorna o número zero. Não representada nada, pois resultará em um erro devido a sintaxe incorreta. Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 6 of 15 14/09/2022 20:23 b. A consulta está dividindo o “count(dis nct companhia) FROM voos” (quan dade de companhias que operaram voos) por “SELECT count(*) FROM companhias” (quan dade de empresas cadastradas). Ou seja, temos a proporção de empresas que operaram voos pelo total de empresas cadastradas. 6.1.2.1 Orientações do usuário final para a segurança de senha Use a opção --password = password ou -ppassword na linha de comando. Por exemplo: shell> mysql -u francis -pfrank db_name Aviso Isso é conveniente, mas inseguro. Em alguns sistemas,sua senha fica visível para programas de status do sistema, como ps, que podem ser invocados por outros usuários para exibir linhas de comando. Os clientes MySQL geralmente substituem o argumento da senha da linha de comandos com zeros durante sua sequência de inicialização. No entanto, ainda há um breve intervalo durante o qual o valor é visível. Além disso, em alguns sistemas, essa estratégia de substituição é ineficaz e a senha permanece visível para o ps. (Os sistemas SystemV Unix e talvez outros estejam sujeitos a esse problema.) Se o seu ambiente operacional estiver configurado para exibir seu comando atual na barra de título da janela do terminal, a senha permanecerá visível enquanto o comando estiver em execução, mesmo se o comando já estiver fora de vista. MYSQL. . 2020. O trecho acima do manual do MySQL explica que um determinado método de login possui um certo risco de segurança. Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 7 of 15 14/09/2022 20:23 Indique qual seria uma alternativa segura ao método discutido. Logar com a opção -p sem passar o parâmetro (senha) no comando, o que fará com que a senha seja lida a par r de um prompt seguro do terminal. Logar com a opção -p sem passar o parâmetro (senha) no comando, o que fará com que a senha seja lida a par r de um prompt seguro do terminal. Logar com a opção -p sem passar o parâmetro (senha) no comando, o que fará com que o usuário anônimo seja u lizado. Logar como o discu do, passando a senha na linha de comando, mas especificando o uso de uma conexão SSL segura entre cliente e banco de dados. Logar como o discu do, passando a senha na linha de comando, mas usando um contêiner Docker. O manual do MySQL está defasado. Na úl ma versão disponível do MySQL, o método discu do é inteiramente seguro. a. Com a senha sendo digitada em modo interativo (com a opção -p), não há como outro programa capturar a senha digitada, a menos que haja algum programa espião que capture as teclas sendo digitadas. Placa do Mercosul: tire suas dúvidas e saiba o que já mudou no projeto. As novas placas no padrão Mercosul finalmente começaram a ser usadas no Brasil – inicialmente no Rio de Janeiro e gradualmente em outros Estados .… Como serão as sequências? Figura - O padrão novo troca o segundo número por uma letra Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 8 of 15 14/09/2022 20:23 Descrição acessível: Figura mostra duas placas de carro. Placa de cima é uma placa cinza (padrão antigo – no topo há a sigla do estado e nome do município) e a placa de baixo é uma placa Mercosul (padrão novo – fundo branco, topo azul, sem sigla do estado, sem nome do município e com bandeira do Brasil). A placa cinza possui numeração PHL4506, enquanto que a placa Mercosul possui a numeração PHL4F06. Os países do Mercosul que adotarem a nova placa, inclusive, poderão estabelecer essa distribuição de maneira distinta. Por exemplo, enquanto na Argentina a sequência tem sido LL NNN LL, no Brasil ela será inicialmente LLL NLNN para automóveis e LLL NN LN para motocicletas. Como ficará a sequência em carros já emplacados? Como a nova placa manterá a quantidade de caracteres, porém com mudanças na sequência de letras e números, quem fizer a troca da placa antiga pela nova em um veículo já registrado verá o segundo número (da esquerda para a direita) ser substituído por uma letra de acordo com a tabela abaixo: Como é Como ficará 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J Com isso, uma placa QUA1960 se transformará em QUA1J60, com o “J” dando lugar ao “9”. (Placa do Mercosul: tire suas dúvidas e saiba o que já mudou. Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 9 of 15 14/09/2022 20:23 . Disponível em: <https://quatrorodas.abril.com.b r/auto-servico/placa-do-mercosul-tire-suas-duvidas-e-saiba-o-q ue-ja-mudou-no-projeto/>. Acesso em: mar. 2020). Considere a notícia acima e a existência de diversos bancos de dados no Brasil que armazenam veículos em seus registros. Considere que cada um desses bancos de dados tenha uma tabela de veículos, cuja chave primária é a placa. Considere ainda que em cada banco de dados há outras tabelas que apontam para a tabela de veículos por meio de chaves estrangeiras. Dadas essas considerações, assinale a alterna va correta. A alteração apenas da chave primária na tabela de veículos não fere a integridade referencial do banco de dados, uma vez que a tabela de veículos permanece consistente. As tabelas de veículos não aceitarão que um dado veículo troque de placa, uma vez que não é possível alterar o valor de uma chave primária. Quando um veículo trocar de placa, basta atualizar diretamente a chave primária na tabela de veículos (as chaves estrangeiras nunca impedirão essa mudança). Essa alteração no “espaço do problema” provocará obrigatoriamente uma necessidade de atualização no sistema para que se u lize algum outro campo como chave primária: talvez o número de chassi ou mesmo um valor sequencial gerado automa camente. Mesmo com essas mudanças, é possível manter a placa como chave primária. Quando um veículo trocar de placa, será preciso atualizar a chave primária na tabela de veículos e atualizar os valores das chaves estrangeiras nas outras tabelas. Como cada uma dessas operações pode violar as restrições do banco de dados, pode ser necessário algum subterfúgio como por exemplo a desabilitação das chaves estrangeiras durante a operação. A alteração apenas da chave primária na tabela de veículos não fere a integridade referencial do banco de dados, uma vez que a tabela de veículos permanece consistente. d. Embora a existência de chaves estrangeiras possa complicar a operação, é possível atualizar chaves primárias. Também é possível configurar as chaves estrangeiras para que sejam atualizadas automa camente (“on update cascade”), mas essa Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 10 of 15 14/09/2022 20:23 opção não é . Analise a seguinte sequência de comandos realizada com o usuário administrador (aquele que possui todos os privilégios sobre a instância do SGBD): CREATE USER 'u1'@'%' IDENTIFIED BY 'senha'; CREATE USER 'u2'@'%' IDENTIFIED BY 'senha'; CREATE USER 'u3'@'%' IDENTIFIED BY 'senha'; CREATE DATABASE db1; USE db1; CREATE TABLE tb1 (id int, x int); CREATE TABLE tb2 (id int, x int); GRANT SELECT ON db1.* TO u1; GRANT SELECT, DELETE ON db1.* TO u2; GRANT UPDATE, INSERT ON db1.tb1 TO u3; CREATE DATABASE db2; USE db2; CREATE TABLE tb1 (id int, x int); CREATE ROLE r1; GRANT ALL ON db2.* TO r1; GRANT r1 TO u3; SET DEFAULT ROLE ALL TO u3; FLUSH PRIVILEGES; Considerando que os comandos apresentados já foram executados (todos com sucesso), associe a lista de comandos à lista de trechos das saídas produzidas por esses comandos. Lista de comandos (o sinal $ indica um comando realizado no sistema operacional e o sinal > indica um comando realizado no MySQL): (I) $ mysql -u u1 db2 -psenha (II) $mysql -u u2 db1 -psenha > DROP tb2; (III) $ mysql -u u3 db1 -psenha > UPDATE tb1 SET x = 2*x WHERE x > 10; Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 11 of 15 14/09/2022 20:23 (IV) $ mysql -u u3 db2 -psenha > UPDATE tb1 SET x = 2*x WHERE x > 10; Lista de trechos das saídas: ( ) SELECT command denied to user ( ) Access denied for user ( ) Query OK ( ) You have an error in your SQL syntax A sequência correta dessa associação é: (III) (I) (IV) (II) (IV) (I) (III) (II) (III) (I) (IV) (II) (IV) (I) (II) (III) (I) (II) (III) (IV) (IV) (III) (II) (I) b. O comando I resultará em acesso negado, pois u1 não tem nenhum privilégio sobre db2. Ocomando II resultará em erro de sintaxe, pois o comando correto seria “DROP TABLE tb2”. O comando III resultará em erro de permissão, pois, apesar de ter direito ao UPDATE, u3 não possui direito de SELECT em db1.tb1, e a condição do WHERE impõe a necessidade de leitura da tabela. Já o comando IV resultará em sucesso, pois u3 recebeu os privilégios de r1, que tem acesso total a db2. Como o MySQL utiliza índices Os índices são usados para rapidamente localizar linhas com valores de coluna específicos. Sem um índice, o MySQL deve começar com a primeira linha e depois ler a tabela inteira para encontrar as linhas relevantes. Quanto maior a tabela, mais isso custa. Se a tabela ver um índice para as colunas em questão, o MySQL poderá determinar rapidamente a posição a ser procurada no meio do arquivo de dados sem precisar examinar todos os dados. Isso é muito mais rápido do Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 12 of 15 14/09/2022 20:23 que ler todas as linhas sequencialmente. (Traduzido da documentação oficial do MySQL. Disponível em: <h p s://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html>. Acesso em: mar. 2020. Sobre índices é correto afirmar que: Considere uma base de dados construída para análises cien ficas que é montada uma vez e depois não é mais atualizada, e que possui muitos dados. Nesse caso compensa construir diversos índices que serão úteis para as consultas dos cien stas, pois mesmo que o tempo de criação dos índices seja grande, a alta velocidade das leituras subsequentes compensará o tempo de criação dos índices. A criação de índices é imprescindível para qualquer tabela do MySQL. Considere um sistema muito acessado por usuários de todo o mundo e uma tabela que armazene os eventos de desses usuários. Nesse caso, a criação de um índice nessa tabela de registro de é conveniente para acelerar o tempo de inserção, provendo uma melhor experiência para o usuário. Índices deixam inserções mais lentas e consomem mais espaço em disco. Por essas razões devem ser usados apenas em tabelas com mais de um milhão de registros. Só nesses casos os custos compensarão os ganhos de velocidade de leitura. Considere uma base de dados construída para análises cien ficas que é montada uma vez e depois não é mais atualizada, e que possui muitos dados. Nesse caso compensa construir diversos índices que serão úteis para as consultas dos cien stas, pois mesmo que o tempo de criação dos índices seja grande, a alta velocidade das leituras subsequentes compensará o tempo de criação dos índices. Os índices são recursos u lizados em bancos de dados an gos. O sistema de o mização de consultas do MySQL ( ) dispensa a u lização de índices em tabelas do MySQL. d. Índices aceleram consultas e são muito u lizados. Um problema muito comum em sistemas lentos é a falta de índices em tabelas Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 13 of 15 14/09/2022 20:23 do banco de dados (seja no MySQL ou em outros SGBDs). Por outro lado, o preço a se pagar é: inserções mais lentas e mais espaço ocupado no disco. Contudo, tabelas muito pequenas podem dispensar índices. Considere a execução de uma sequência de comando, mas com uma parte dos comandos executados em uma sessão, e a outra parte executada em outra sessão. Os comandos estão listados abaixo, de forma que 1> indica o prompt da sessão 1, enquanto 2> indica o prompt da sessão 2. 1> CREATE TABLE pessoa (id int, nome text); 1> INSERT INTO pessoa VALUES (1, 'Fulano'); 1> BEGIN; 1> INSERT INTO pessoa VALUES (2, 'Ciclano'); 2> BEGIN; 2> INSERT INTO pessoa VALUES (3, 'Beltrano'); 2> ROLLBACK; 2> SELECT * FROM pessoa; Assinale a alterna va que indica a saída ob da para a execução do úl mo comando da sequência. +------+--------+ | id | nome | +------+--------+ | 1 | Fulano | +------+--------+ +------+--------+ | id | nome | +------+--------+ | 1 | Fulano | +------+--------+ Empty set +------+---------+ | id | nome | +------+---------+ | 1 | Fulano | | 2 | Ciclano | +------+---------+ Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 14 of 15 14/09/2022 20:23 Quarta-feira, 14 de Setembro de 2022 20h23min28s BRT +------+----------+ | id | nome | +------+----------+ | 1 | Fulano | | 2 | Ciclano | | 3 | Beltrano | +------+----------+ You have an error in your SQL syntax a. “Beltrano” não aparecerá pois foi inserido em uma transação abortada. “Ciclano” não aparecerá pois foi inserido em uma transação que está em outra sessão e que ainda não efetivada. Por fim, “Fulano” aparecerá, pois foi inserido sem o uso de transação. Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.js... 15 of 15 14/09/2022 20:23
Compartilhar