Olá Pessoal!
Um assunto muito interessante dentro da temática de banco de dados é a linguagem SQL. Neste artigo vamos explicar uma questão que surgiu de uma dúvida de um dos nossos alunos.
A questão vem logo abaixo:
Banca: FGV
Ano: 2022
Órgao: MPE GO – Ministério Público do Estado de Goiás
Cargo: Analista em Informática
Apresente uma sequência de comandos SQL que, quando executados em conjunto, provocam a criação de uma tabela de nome NUMEROS, com 10.000 linhas, com uma coluna única. Essa coluna, intitulada NUMERO, deverá conter números inteiros que se entendam de 1 até 10.000, continuamente, como a seguir.
Figura 1 – Resultado da Questão
Observações.
A solução deve utilizar como base a sintaxe do MySQL, ou do SQL Server;
A escolha da sintaxe deve ser declarada no início da resposta;
É permitido supor que há outras tabelas no banco de dados, denominadas T1, T2 e T3, cada uma com pouco mais de 1.000 linhas, que podem ser usadas nos comandos apenas para leitura;
Não é permitido o uso de cursores, funções externas e comandos de repetição;
Os únicos comandos SQL permitidos são: ALTER TABLE, CREATE TABLE, INSERT, SELECT;
A inclusão manual repetitiva, valor a valor, não é permitida;
Supõe-se que o script seja executado no âmbito de um banco de dados já criado, com as credenciais necessárias para a execução das operações inseridas no script.
Avaliação.
Serão objetos de avaliação:
A sintaxe e a organização do script;
A conformidade com a especificação;
A eficiência da solução. Quanto maior a eficiência, maior a pontuação.
Veja que se trata de uma questão que é necessário conhecimento na álgebra relacional e na operação de produto cartesiano, nesse artigo não vou entrar nesse assunto mas basta assistir as aulas que eu explico com exemplos, no canal do gran você pode procurar uma live do TCE AM que apresento uma questão parecida, veja no link https://www.youtube.com/live/SZzOJOygAy8?feature=share.
O script com a solução eu apresento logo a seguir:
CREATE TABLE T1 (
ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT
);
CREATE TABLE T2 (
ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT
);
INSERT INTO T1 (ID)
SELECT NULL
FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS A
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS B
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS C
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS D
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS E
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS F
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS G
LIMIT 10000;
INSERT INTO T2 (ID)
SELECT NULL
FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS A
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS B
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS C
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS D
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS E
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS F
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS G
LIMIT 10000;
CREATE TABLE NUMEROS (
NUMERO INT NOT NULL
);
INSERT INTO NUMEROS (NUMERO)
SELECT distinct(T1.ID + (T2.ID-1)*1000) AS NUMERO
FROM T1
CROSS JOIN T2
WHERE (T1.ID + (T2.ID-1)*1000) <= 10000;
select * from numeros order by 1 ;
Primeiramente, é criada a tabela T1 com uma coluna chamada ID do tipo INT, que não pode ser nula, e é definida como PRIMARY KEY com a opção AUTO_INCREMENT para gerar valores sequenciais automaticamente.
Utilizamos o comando INSERT INTO para inserir dados na tabela T1.
Utilizamos o comando SELECT para selecionar os valores a serem inseridos na tabela.
Utilizamos o recurso de subconsulta para criar um conjunto de valores de 1 a 4, e então fazemos uma junção CROSS JOIN destes conjuntos para gerar 256 valores (4^4 = 256).
Repetimos a junção CROSS JOIN dos conjuntos de valores mais 4 vezes, totalizando assim 4^8 = 65.536 valores.
Utilizamos a cláusula LIMIT para limitar o número de linhas inseridas na tabela.
Fazemos a mesma coisa pra T2, feito isso temos as tabelas que a questão fala que já existem no banco e podem ser utilizadas.
Seguindo agora explicamos o script com a resolução:
É criada a tabela NUMEROS com uma coluna chamada NUMERO do tipo INT, que não pode ser nula.
Em seguida, utilizamos o comando INSERT INTO para inserir dados na tabela NUMEROS.
Utilizamos o comando SELECT para selecionar os valores a serem inseridos na tabela.
Para gerar uma sequência de números de 1 até 10.000, utilizamos as tabelas T1 e T2 para gerar um conjunto de números de 1 até 1.000, e então multiplicamos o valor da T2 por 1.000 e somamos com o valor da T1 para gerar números de 1 a 10.000.
Por fim, utilizamos uma cláusula WHERE para garantir que somente números menores ou iguais a 10.000 sejam inseridos na tabela NUMEROS.
E o resultado será a tabela, conforme Figura 2 abaixo:
Figura 2 – Resultado SQL
A solução é eficiente, pois utiliza apenas os comandos solicitados, sem a necessidade de loops ou funções externas, e utiliza as tabelas T1 e T2 para gerar a sequência de números.
Veja que é uma questão complexa que dificilmente um aluno com pouca prática de SQL conseguiria resolver, por isso incentivamos nas nossas aulas que se faça exercícios para que na hora da prova se possa resolver esse tipo de questão.
Para Pensar !!!
Um dos problemas para os concurseiros nesse tema é a quantidade de questões existentes, no Gran Cursos Online temos diversas aulas para explicar quando se deve dar atenção a cada uma delas, pois as diversas bancas examinadoras cobram esse assunto de diversas maneiras.
Dessa forma encerro esse artigo com essa breve introdução sobre o assunto !
Até mais !
Referências
DATE, Christopher J. Introdução a sistemas de bancos de dados. Elsevier Brasil, 2004.
ELMASRI, Ramez et al. Fundamentals of database systems. Pearson, 2014.
Professor MSc, Washington Almeida
Doutorando e mestre em Engenharia de Software pelo Centro de Estudos e Sistemas Avançados do Recife – C.E.S.A.R. Atualmente é Analista Judiciário na Justiça Federal (TRF1) e Professor no Gran Cursos Online.
Participe da conversa