Bom percebi que muitas pessoas tem dificuldades com linguagem SQL um pouquinho mais avançada. Vou ensinar duas técnicas que eu usei recentemente e que acredito serem bem úteis. Uma é bem simples mas muita não usa por pensar que é complicado.
Quando desenvolvemos um banco de dados é importante que as checagens que garantem a integridade do banco, não sejam feitas apenas na interface (software), pois outra aplicação, ou outra interface pode ser feita e não respeitar as regras do banco. Por isso é importante que algumas verificações sejam feitas no banco. Um exemplo interessante são os índices únicos.
Um índice único (UNIQUE) é um atribuído a um campo, ou um conjunto de campos, de uma tabela que não pode possuir valor repetido. Por exemplo se eu tenho uma tabela PESSOAS com um campo NOME, posso desejar que o banco de dados não aceite duas pessoas de nome igual. Para isso executaríamos o seguinte comando.
ALTER TABLE pessoas ADD UNIQUE INDEX(nome);
Esse comando obviamente só funciona se a tabela já existe.
Podemos ver um problema aí, pois o se existirem duas pessoas com o mesmo nome, apenas uma delas poderá ser cadastrada no sistema. Então é importante estarmos atentos à real aplicação do sistema.
Poderíamos remover nosso índice com
ALTER TABLE pessoas DROP INDEX (nome);
Uma situação que não permite erros é o cadastro de cidades por UF. Vamos supor que temos uma tabela ESTADO com apenas um campo UF que possui as siglas dos estados brasileiros. Temos também uma tabela CIDADE que possui os campos COD_CIDADE, NOME e ESTADO_UF, onde este último é uma chave estrangeira para a tabela ESTADO.
Essa situação é interessante, pois podemos e temos cidades com o mesmo nome, mas não no mesmo estado, logo o índice único deve ser composto pela UF e o nome da cidade. Isso pode ser feito com o comando abaixo:
ALTER TABLE cidade ADD UNIQUE INDEX(estado_UF, nome);
Outra dica, um pouco mais complicada. Quem já precisou fazer um SELECT e no resultado subtrair os resultados de um outro SELECT. Por exemplo tenho um sistema de avaliação de cursos. Quero apresentar ao usuário os cursos que ele pode avaliar. Normalmente fazemos um SELECT que irá apresentar todos os cursos que o usuário assistiu. Vamos chamar esse select de SELECT QueryA e SELECT QueryB é o comando que mostra os cursos que o usuário já avaliou. Então nosso desejo seria fazer um
SELECT ( QueryA - QueryB );
Um comando NÃO ACEITO pelo MySQL. Descobri que muita gente faz isso de formas realmente complicadas, por isso vou apresentar uma solução BEM simples.
SELECT DISTINCT QueryA not in (QueryB);
Agora basta substituir QueryA e QueryB pelas instruções que você já testou e funcionam separadamente. Óbvio que é necessário que os resultados de SELECT QueryA e SELECT QueryB possuam campos e elementos em comum para que o comando seja eficaz.
Nenhum comentário:
Postar um comentário