Voltar para a lista de artigos Artigos
12 minutos de leitura

Perguntas (e Respostas) avançadas de Entrevista SQL

Você quer mudar para um trabalho que usa SQL? Você não tem certeza sobre o que esperar durante a entrevista de emprego ou como comparar seus conhecimentos? Este artigo lhe dará uma boa idéia de onde você está.

Se você se sente preso em seu emprego, você não é o único. A divisão moderna do trabalho empurra as pessoas a realizar tarefas muito específicas, esperando que elas não olhem para o que está do outro lado. Os trabalhadores só precisam estar concentrados em suas responsabilidades (muitas vezes repetitivas e enfadonhas) e não devem questionar nada além disso. Muitas vezes pode parecer que você está trabalhando em uma linha de montagem. Sim, uma linha de montagem - mesmo em um escritório agradável com janelas enormes e café e frutas frescas de graça. Mas ainda assim, uma linha de montagem. Ou talvez você só queira fazer seu trabalho mais rápido, não perdendo tempo com o manuseio ineficiente de dados.

Mudar seu trabalho ou melhorar seu desempenho pode aumentar significativamente a sensação de fazer algo útil. Este artigo listará algumas perguntas SQL avançadas que você poderá obter em uma entrevista. E nós também lhe daremos as respostas! Dessa forma, você pode comparar seus conhecimentos atuais e talvez aprender algo novo.

Se você aplica isto ao seu novo ou atual emprego, é com você! Vamos começar nossa 'entrevista de emprego'!

(Você está procurando por perguntas SQL de nível básico? Este artigo é o que você precisa).

10 SQL Avançado Entrevista de emprego Perguntas e Respostas

Pergunta 1: O que é um índice? Quais são os dois principais tipos de índices?

Um índice é uma estrutura em um banco de dados que pode ajudar a recuperar os dados mais rapidamente. Quando você pesquisa os dados da tabela com uma consulta SQL, ele pesquisará a tabela inteira e retornará o resultado. Uma tabela não indexada é chamada de heap. Os dados armazenados em tais tabelas geralmente não são organizados de nenhuma forma em particular. Eles são armazenados na ordem em que foram inseridos. Portanto, a busca de dados pode ser muito lenta e frustrante.

Quando você consulta uma tabela indexada, o banco de dados vai primeiro ao índice e recupera os registros correspondentes diretamente. Os dois principais tipos de índices são:

  • Clustered
  • Não incluído

Um índice agrupado define a ordem exata dos dados armazenados na tabela. Só pode haver um índice agrupado por tabela, já que a tabela só pode ser ordenada de uma forma.

Um índice não agrupado simplesmente aponta para os dados, sendo que a ordem dos dados no índice não é a mesma que a ordem física dos dados reais. Os dados são armazenados em um local, enquanto o índice é armazenado em outro local.

Pergunta 2: Qual é o código para criar um índice?

Agora chegamos a um exemplo prático! Suponhamos que temos a mesa employeeque tem as seguintes colunas:

  • name - O primeiro nome do funcionário.
  • surname - O sobrenome do funcionário.
  • nin - O número de identificação nacional do empregado (por exemplo, número do seguro social).

Sua tarefa é criar um índice agrupado na coluna nin e um índice não agrupado na coluna surname. Como você faz isso?

Para criar o índice agrupado, o código será:

CREATE CLUSTERED INDEX CL_nin
ON employee(nin);

Isto criará o índice agrupado com o nome CL_nin, sobre a tabela employee e a coluna nin.

Para criar o índice não agrupado, o código será: "Para criar o índice não agrupado, o código será:":

CREATE NONCLUSTERED INDEX NCL_surname
ON employee(surname);

Execute este código e você criará um índice não incluído com o nome NCL_surname na coluna sobrenome na tabela. employee.

Importante: Se você não especificar um tipo (agrupado ou não agrupado), você irá criar um índice não agrupado por padrão.

Pergunta 3: Como você adiciona ranking às linhas usando RANK()?

O monitoramento dos números de vendas é essencial para cada empresa. Tomemos o exemplo de um revendedor de automóveis. Pode haver muitos vendedores vendendo carros todos os dias. Imagine que a gerência da concessionária esteja interessada em comparar seus vendedores. Eles querem saber quem está se saindo bem e quem simplesmente fica por perto. Você tem a mesa salespeople com as seguintes informações:

  • first_name - O primeiro nome do funcionário.
  • last_name - O sobrenome do funcionário.
  • cars_sold - O número de carros vendidos por este funcionário.

Como você coloca uma classificação nesta tabela, mostrada abaixo?

first_namelast_namecars_sold
ClarabelleHanmer77
ChristianoOverstall51
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn57
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

O código para este problema é:

SELECT	RANK() OVER(ORDER BY cars_sold DESC) AS rank_sales,
		first_name,
		last_name,
		cars_sold
FROM salespeople;

O código usa a função da janela RANK(). Como nenhuma janela é definida, a função utilizará a tabela inteira. Ela classificará os dados de acordo com a coluna cars_sold e a classificação será adicionada à nova coluna rank_sales. Execute o código e você terá uma boa tabela - o que lhe dará um ponto em sua entrevista!

rank_salesfirst_namelast_namecars_sold
1GlendonKnowlys116
2JolyTschierasche114
3CarlottaDytham106
4ArtemusWoolward100
5EmileeNanetti84
6ClarabelleHanmer77
7RubieDing72
8RainaBedinn57
9ChristianoOverstall51
10WilhelmKopec38

Escrevi um artigo mais detalhado sobre as funções da janela e seu uso (com exemplos) se você quiser cavar mais fundo. Há também o útil LearnSQL.com.br livro de receitas do qual eu roubei este código. Você também pode fazer isso! A seção de livros de receitas é basicamente uma lista de problemas comuns resolvidos com o uso de SQL. Você pode encontrar uma solução muito rapidamente, ler a explicação e obter um trecho de código que você pode usar para resolver suas tarefas.

Pergunta 4: Qual é a diferença entre RANK() e DENSE_RANK()?

A principal diferença é que RANK() dará a todas as linhas com os mesmos valores (no critério de classificação) a mesma classificação. Ele também saltará postos se mais de uma linha tiver o mesmo posto; o número de postos pulados dependerá do número de linhas que compartilham o mesmo valor. Isto cria postos não consecutivos.

Com DENSE_RANK(), as linhas com os mesmos valores também serão classificadas da mesma forma. No entanto, esta função não irá pular nenhuma fileira, portanto, levará a fileiras consecutivas.

Aqui está um exemplo para ajudar a esclarecer a diferença. Vamos modificar a tabela a partir do exemplo anterior. A tabela é parecida com esta:

first_namelast_namecars_sold
ClarabelleHanmer72
ChristianoOverstall84
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn72
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

Se você executar o código a partir do exemplo anterior, RANK() lhe dará este resultado:

rank_salesfirst_namelast_namecars_sold
1GlendonKnowlys116
2JolyTschierasche114
3CarlottaDytham106
4ArtemusWoolward100
5EmileeNanetti84
5ChristianoOverstall84
7ClarabelleHanmer72
7RubieDing72
7RainaBedinn72
10WilhelmKopec38

Você notará que o ranking 5 é atribuído duas vezes, então o ranking pula o 6 e vai diretamente para o 7. O Rank 7 é alocado três vezes, depois do qual o ranking vai diretamente para 10.

Se você quiser ver como DENSE_RANK() classifica as fileiras, execute o seguinte código:

SELECT	RANK() OVER(ORDER BY cars_sold DESC) AS rank_sales,
		DENSE_RANK () OVER (ORDER BY cars_sold DESC) AS dense_rank_sales,
		first_name,
		last_name,
		cars_sold
FROM salespeople;

Ele lhe dará um resultado que se parece com este:

rank_salesdense_rank_salesfirst_namelast_namecars_sold
11GlendonKnowlys116
22JolyTschierasche114
33CarlottaDytham106
44ArtemusWoolward100
55EmileeNanetti84
55ChristianoOverstall84
76ClarabelleHanmer72
76RubieDing72
76RainaBedinn72
107WilhelmKopec38

O conhecimento das funções de janela é essencial para qualquer trabalho que exija conhecimento avançado de SQL. Para praticar mais SQL e ver como as funções de janela podem ajudá-lo, sinta-se à vontade para experimentar o curso LearnSQL.com.br's de Funções de Janela.

Pergunta 5: O que é um auto-incremento?

Qualquer tipo de trabalho com banco de dados exigirá este conhecimento. A auto-incrementação é uma função SQL que cria automática e sequencialmente um número único sempre que um novo registro é adicionado à tabela.

A palavra-chave que lhe dará esta função é AUTO_INCREMENT.

Aqui está o exemplo. O código abaixo irá criar a tabela names com os valores definidos por INSERT INTO:

create table names (
	id INT NOT NULL AUTO_INCREMENT,
	first_name VARCHAR(50),
	last_name VARCHAR(50)
);
INSERT INTO names(first_name, last_name) VALUES ('Kristen', 'Yukhnev');
INSERT INTO names(first_name, last_name) VALUES ('Angelica', 'Hulson');

A tabela terá este aspecto:

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson

Para ver como a função de auto-incremento funciona, adicione um novo registro à tabela acima:

INSERT INTO names (first_name, last_name)
VALUES ('Rosalia', 'O''Towey');

Isto adicionará um novo registro a uma tabela. Selecione todos os dados para ver como a tabela mudou:

SELECT *
FROM names;

Agora a tabela terá o seguinte aspecto:

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson
3RosaliaO'Towey

Quando adicionamos um novo registro à tabela, AUTO_INCREMENT adicionou automaticamente um novo número seqüencial. Como 1 e 2 existiam anteriormente na tabela, com AUTO_INCREMENT o banco de dados sabe que o próximo valor será 3.

Pergunta 6: O que é uma subconsulta?

Uma subconsulta (também chamada de consulta interna ou consulta aninhada) é uma consulta colocada dentro de uma consulta. Ela retorna dados que serão utilizados pela consulta principal. Normalmente, você a encontrará na cláusula WHERE.

Pergunta 7: O que o seguinte código retornará?

O código abaixo é um exemplo de uma subconsulta:

SELECT	first_name,
		last_name,
		cars_sold
FROM cars
WHERE cars_sold >	(SELECT AVG (cars_sold)
					FROM cars);

A execução do código retornará as colunas first_name, last_name, e cars_sold da tabela carsmas somente onde cars_sold é maior do que a média de carros vendidos.

Pergunta 8: Existe uma diferença entre um valor NULL e zero?

Sim! Um valor NULL é a ausência dos dados/informações. Ele tem um caráter quantitativo no sentido de representar a ausência da quantidade. Simplificando, NULL em SQL significa que o valor é desconhecido ou ausente; não sabemos qual é o valor. Por outro lado, zero significa que há um valor que é igual a, bem, zero. Portanto, zero tem um caráter qualitativo.

Pergunta 8: Como você filtraria os dados usando JOIN?

O significado básico por trás do JOIN é que ele retornará dados de uma tabela quando esses dados forem iguais aos dados de uma segunda tabela. Se você combiná-lo com a cláusula WHERE, o JOIN pode ser usado para filtrar dados.

Aqui está um exemplo de outra concessionária de carros. A primeira tabela é chamada carse consiste nos seguintes dados:

  • model_id - O número de identificação do modelo do carro.
  • model_name - O nome desse modelo.
  • brand_id - O ID da marca do carro.
  • brand_name - O nome da marca do carro.
  • year_id - O ano em que o modelo foi produzido. (Utiliza os dados da tabela production_year.)

A segunda tabela é production_yearque contém as seguintes colunas:

  • year_id - Um número de identificação para cada ano.
  • year - O ano real da produção.

O que você faria se lhe pedissem para encontrar todos os modelos que foram produzidos antes de 2016? Aqui está o código:

SELECT	model_name,
		brand_name
FROM	cars JOIN production_year ON cars.year_id = production_year.year_id
WHERE	year_id < 2016;

Deixe-me explicar o código. Ele seleciona a coluna model_name e brand_name a partir da tabela cars. Esta mesa está unida à tabela production_year utilizando a coluna year_id, que é uma conexão entre o cars e o production_year tabelas. Devido à cláusula WHERE, este código devolve apenas os carros que são produzidos antes de 2016, ou seja, WHERE year_id < 2016.

Se você estiver interessado em aprender mais sobre JOINs ou se você quiser praticar o que aprendeu, o LearnSQL.com.br SQL Practice Track pode ajudá-lo com isso.

Pergunta 10: Como você extrairia os últimos quatro caracteres de uma string?

Para fazer isso, você precisaria da função RIGHT().

Por exemplo, há o products tabela, que consiste nos seguintes dados:

  • product - O nome do produto.
  • manufacturer - A empresa que fabrica o produto.

A tabela tem este aspecto:

productmanufacturer
X278 Hammer 2018Sledge Hammer
M+S Tyres Z348 2020Goodtyre
Paint red pearly 9R458PT12 2019PaintItBlack

Você precisa encontrar o ano em que cada produto foi produzido. Mas quem criou o banco de dados fez um péssimo trabalho. Não há coluna com o ano de produção! Não há tais dados disponíveis - exceto como os quatro últimos caracteres do nome do produto. Para extrair o ano desse campo, aqui está o código que você usaria:

SELECT	product,
		manufacturer,
		RIGHT(product,4) AS year_produced
FROM products;

E aqui está o resultado! Simples, certo?

productmanufactureryear_produced
X278 Hammer 2018Sledge Hammer2018
M+S Tyres Z348 2020Goodtyre2020
Paint red pearly 9R458PT12 2019PaintItBlack2019

Deixe-me explicar o que acabamos de fazer. O código, é claro, seleciona as colunas product e manufacturer. Então, usando a função RIGHT(), instruímos a consulta para pegar as cordas no produto da coluna e retornar os últimos quatro caracteres a partir da direita. Colocaremos estes resultados mostrados na nova coluna year_produced.

Pergunta 11: O que é uma visão? Como você cria uma?

Uma view é uma tabela virtual ou uma instrução SQL armazenada que utiliza dados de uma ou mais tabelas existentes. A view é chamada de 'tabela virtual' porque os dados são usados como uma tabela, mas é recuperada sempre que a view é executada. (O resultado de uma visualização não é armazenado como uma tabela).

Digamos que há uma tabela chamada salary que contém as seguintes colunas:

  • first_name - O primeiro nome do funcionário.
  • last_name - O sobrenome do funcionário.
  • salary - O salário do funcionário.
first_namelast_namesalary
MikeHammer2780
JohnJohnson1600
KateWilliams3000

As informações sobre salário dos funcionários não estão disponíveis para todos na empresa. No entanto, nesta empresa todos precisam ter acesso à lista de empregados. Como você permitiria que eles fizessem isso e, ao mesmo tempo, não quebrar nenhuma regra de confidencialidade?

Você não lhes permitiria o acesso a toda a tabela, mas poderia criar uma visão para eles. Dessa forma, eles poderiam sempre acessar os últimos dados sem ver nada confidencial. Veja como fazer isso:

CREATE VIEW		employee_list AS
SELECT		first_name,
			last_name
FROM salary;

A execução deste código criará uma visualização chamada employee_list, que recuperará as informações de first_name e last_name da tabela salary. É simples, não é? Você o cria usando o comando CREATE VIEW, então você apenas escreve uma consulta regular.

OK, mas isto acabou de criar uma visão. Criá-la não recuperou nenhum dado. Então, como você executa a visualização? Você simplesmente finge que é uma tabela regular. O código abaixo irá executar a visualização:

SELECT *
FROM employee_list;

E a tabela resultante está aqui! Lindo! Nenhum salário é mostrado, então você não estragou nada!

first_namelast_name
MikeHammer
JohnJohnson
KateWilliams

Você acha que está pronto para um emprego SQL Avançado?

A extensão do artigo não nos permite cobrir todos os tópicos SQL avançados que você possa encontrar em uma entrevista de emprego. Entretanto, eu tentei lhe dar uma boa visão geral do que você pode esperar ao candidatar-se a um emprego que usa SQL. Este deve ser apenas um lugar para você começar a pesquisar e ver onde seus conhecimentos precisam ser melhorados. Se você estiver interessado em aprender mais, há um curso SQL avançado interativo que você pode usar enquanto se prepara para a entrevista.

Esteja à vontade para comentar na seção de comentários! Compartilhe seus pensamentos e suas experiências em entrevistas!