Saltar para: Post [1], Comentários [2], Pesquisa e Arquivos [3]

SAPO developers blog

SAPO developers blog

SQL nas entrevistas

Julho 19, 2010

jac

Em Fevereiro colocamos aqui um post com algumas questões de SQL que poderiam ser colocadas numa entrevista.

Vamos tornar a abordar o problema, com a seguinte tabela:

mysql> select * from e;
+-------+-------+
| nome  | valor |
+-------+-------+
| josé  |    20 |
| joão  |    10 |
| rui   |     5 |
| pedro |     3 |
| josé  |     5 |
| pedro |    10 |
| luís  |    25 |
+-------+-------+
7 rows in set (0.00 sec)

 

Algo que costuma ser feito já depois das queries é perguntar aos candidatos quais os tipos de dados das duas colunas.

Para efeitos deste post, vamos assumir uma base de dados MySQL com uma tabela definida da seguinte forma:

create table e (
nome varchar(50),
valor int
) ENGINE=InnoDB;

INSERT INTO e (nome, valor) VALUES
('josé', 20),
('joão', 10),
('rui', 5),
('pedro', 3),
('josé', 5),
('pedro', 10),
('luís', 25)
;

 

Vamos analisar as queries que propusemos no nosso post anterior.

  • Descobrir quanto dinheiro emprestaste no total.

 

mysql> select sum(valor) from e;
+------------+
| sum(valor) |
+------------+
| 78         |
+------------+
1 row in set (0.40 sec)


É das queries mais simples e quase todos os candidatos a escrevem correctamente.

  • Descobrir quanto é que cada pessoa te deve.

 

mysql> select nome, sum(valor) from e group by nome;
+-------+------------+
| nome  | sum(valor) |
+-------+------------+
| joão  |         10 |
| josé  |         25 |
| luís  |         25 |
| pedro |         13 |
| rui   |          5 |
+-------+------------+
5 rows in set (0.04 sec)


Quase todas as pessoas sabem como se faz, mas já se encontra alguns candidatos que trocam a ordem de algumas cláusulas, que se esquecem do group by, etc.

  • Descobrir quais as pessoas a quem emprestaste dinheiro mais que uma vez.

 

mysql> select nome from e group by nome having count(1) > 1;
+-------+
| nome  |
+-------+
| josé  |
| pedro |
+-------+
2 rows in set (0.00 sec)


Neste ponto sim, já começamos a perder muito boa gente.

  • Seleccionar os nomes das pessoas a quem emprestaste dinheiro, numa só linha, separados por vírgula.

 

mysql> select group_concat(distinct nome) from e;
+-----------------------------+
| group_concat(distinct nome) |
+-----------------------------+
| josé,joão,rui,pedro,luís    |
+-----------------------------+
1 row in set (0.00 sec)


Tipicamente já só acerta estas queries quem tem experiência intensiva com bases de dados.

Faz sentido, porque é perfeitamente viável trabalhar com bases de dados sem usar extensivamente tudo o que elas nos oferecem.

Não será de facto por não saber algo deste género que um candidato ficará pelo caminho, mas são perguntas como esta que permitem ir discernindo o tipo de uso que a pessoa dá à base de dados.

Perguntas como esta e não só: perguntas sobre as perguntas.

Numa entrevista não declaramos a base de dados, apenas a desenhamos num quadro ou numa folha de papel.

Depois de termos abordado várias queries, aí sim, abordam-se outras temáticas:

  • que tipos de dados são aqueles?
  • que informação adicionarias à tabela para anotar quem já te tinha pago?
  • como efectuarias essa alteração sem que o sistema deixasse de funcionar temporariamente?
  • o que farias caso um dia as queries nesta tabela se tornassem demasiado lentas?
  • como criarias um índice nesta tabela?
  • etc.


Há sempre mais qualquer coisa que a conversa traz, como por exemplo o entrevistado sugerir que o tipo de dados do valor deveria ser um INT(3)...

1 comentário

Comentar post

Mais sobre mim

Subscrever por e-mail

A subscrição é anónima e gera, no máximo, um e-mail por dia.

Arquivo

  1. 2012
  2. J
  3. F
  4. M
  5. A
  6. M
  7. J
  8. J
  9. A
  10. S
  11. O
  12. N
  13. D
  1. 2011
  2. J
  3. F
  4. M
  5. A
  6. M
  7. J
  8. J
  9. A
  10. S
  11. O
  12. N
  13. D
  1. 2010
  2. J
  3. F
  4. M
  5. A
  6. M
  7. J
  8. J
  9. A
  10. S
  11. O
  12. N
  13. D
  1. 2009
  2. J
  3. F
  4. M
  5. A
  6. M
  7. J
  8. J
  9. A
  10. S
  11. O
  12. N
  13. D