Paulinha Winter

Cheat Sheet MySQL

11agosto

Cheat Sheet nada mais são do que referências de acesso rápido, traduzindo,  são folhas de cola.  O propósito delas são listar os comandos mais utilizados e esquecidos. Elas não são completas, normalmente seu conteúdo cabe em uma folha A4, ideal para colar na mesa, parede, cpu ou algum lugar que você possa consultar rapidamente.

Abaixo o Cheat Sheet MySQL, que baixei do site Added Bytes.

Download

Leia também:

Cheat Sheet PHP

Saibaki Imbituba

2julho

Esse é um post um pouco fora dos assuntos que normalmente escrevo. Mas acho que vale a pena divulgar um bom trabalho que está se iniciando.

Segundo meu amigo Guilherme Pinter, hoje podemos encontrar em poucas horas mais informações do que nossos antepassados encontrariam durante toda a vida. O problema da falta de informação virou um problema de relevância.

É com esse intuito que ele e mais dois amigos criaram um projeto para disponibilizar informações relevantes a respeito da cidade de Imbituba/SC.

Para quem não conhece a cidade vale a pena acessar o site http://www.saibaki.com.br conferir os eventos nacionais e internacionais de surf, conhecer as musas que  desfilam pelas areais das belas praias de Imbituba e inteirar-se da programação da cidade.

Praia Ribanceira

Entendendo Outer Joins SQL - Parte 4 - Várias Tabelas

23junho

Percebi que vários usuários ficaram com dúvida em relação ao uso dos comandos Outer Joins com mais de duas tabelas.

O funcionamento é o mesmo. O cruzamento será feito na seqüência em que você lista as tabelas na sua consulta.

Usarei o mesmo modelo adotado nos posts anteriores sobre o mesmo assunto.

empresas
programadores_linguagens
programador
linguagens

Vamos ao exemplo:

Problema: Quero um relatório que me retorne o nome programadores, nome da empresa que trabalha e as linguagens que programa.

Consulta:

SELECT p.nome, e.nome, l.nome
FROM

programadores p
INNER JOIN empresas e ON p.id_empresa = e.id_empresa
INNER JOIN programadores_linguagens pl ON pl.id_programador = p.id_programador
INNER JOIN linguagens l ON l.id_linguagens = pl.id_linguagens

Entendendo a consulta:

Como eu quero os programadores e o nome da empresa em que trabalha fiz uma junção entre as duas tabelas:

> programadores p INNER JOIN empresas e ON p.id_empresa = e.id_empresa

Em seguida, fiz uma junção para saber quais a linguagens que o programador está vinculado:

> INNER JOIN programadores_linguagens pl ON pl.id_programador = p.id_programador

Finalmente, como preciso do nome das linguagens de programação, vinculei também a tabela linguagens:

> INNER JOIN linguagens l ON l.id_linguagens = pl.id_linguagens

Resultado:

nome

nome

nome

Paulinha Empresa 1 ASP
Paulinha Empresa 1 PHP
Pedro Empresa 2 Java
Márcia Empresa 3 Ruby
Márcia Empresa 3 .NET
Filipi Empresa 4 .NET

Repare que os programadores Gabriel e Pinter não aparecem no resultado, isso acontece por que, ao fazer a junção com a tabela programadores_linguagens eu utilizei a junção INNER JOIN, neste caso, faço com que o programador obrigatoriamente esteja relacionado à pelo menos uma linguagem de programação.

Como resolver? Simples basta trocar o INNER JOIN por LEFT JOIN, ou seja, estou dizendo que quero todos os programadores independente se eles estão ou não relacionados a uma linguagem de programação

Mas o que irá aparecer no campo nome da programação no resultado da consulta? O retorno será NULL.

Veja:

SELECT p.nome, e.nome, l.nome
FROM
programadores p
INNER JOIN empresas e ON p.id_empresa = e.id_empresa
LEFT JOIN programadores_linguagens pl ON pl.id_programador = p.id_programador
LEFT JOIN linguagens l ON l.id_linguagens = pl.id_linguagens

Resultado:

nome

nome

nome

Paulinha Empresa 1 ASP
Paulinha Empresa 1 PHP
Pedro Empresa 2 Java
Márcia Empresa 3 Ruby
Márcia Empresa 3 .NET
Filipi Empresa 4 .NET
Pinter Empresa 4 NULL
Gabriel Empresa 1 NULL

Em ambos os resultados, eu (Paulinha) fui listada duas vezes, isso ocorre por que eu estou vinculada a duas linguagens de programação. É possível eliminar essa repetição usando os comandos GROUP BY e GROUP_CONCAT.

SELECT p.nome, e.nome,GROUP_CONCAT(l.nome)
FROM
programadores p
INNER JOIN empresas e ON p.id_empresa = e.id_empresa
LEFT JOIN
programadores_linguagens pl ON pl.id_programador = p.id_programador
LEFT JOIN linguagens l ON l.id_linguagens = pl.id_linguagens
GROUP BY p.id_programador

nome

nome

GROUP_CONCAT(l.nome)

Paulinha Empresa 1 ASP,PHP
Pedro Empresa 2 Java
Márcia Empresa 3 Ruby,.NET
Filipi Empresa 4 .NET
Pinter Empresa 4 NULL
Gabriel Empresa 1 NUL


Leia também:

Entendendo Outer Joins SQL - Parte 1 (Produto Cartesiano)

Funções de comparação MySQL

9junho

GREATEST e LEAST

Ambos servem para comparar argumentos fornecidos. GREATEST retorna o maior valor e o LEAST o menor. Esse comando não está restrito a números, ele pode comparar strings também, neste caso ele considera a ordem alfabética.

Ex.:
SELECT LEAST(”Paula”, “Amanda”);
> Amanda

SELECT GREATEST(50,42,365,198,10,5);
> 365


IF, IFNULL e ISNULL

O IF recebe três argumentos. O primeiro é a condição, o segundo é o valor de retorno caso essa condição seja verdadeira e o terceiro é o retorno caso a condição não seja atendida.

IF(condição/comparação, retorno_verdadeiro, retorno_falso/else)
IF(expr1, expr2, expr3)

Ex.:
SELECT IF(10>5, “Maior”, “Menor”);
> Maior

IFNULL recebe dois argumentos, o primeiro é o campo testado e o segundo é o retorno caso a condição seja verdadeira, caso negativo ele retorna o valor do campo testado.

Ex.:
SELECT IFNULL(10, “NULL”);
> 10

ISNULL recebe o campo que será testado como argumento. Irá retornar 1 (verdadeiro) se o campo for NULL e 0 (false) se não for.

Obs.: O operador “= “não funciona para esse tipo de teste, o valor retornado sempre será falso.

Ex.:
SELECT ISNULL(NULL);
> 1


INTERVAL

Esse comando utiliza busca binária, que o torna mais rápido. Por isso, a sequência de valores passados pra ele deve ser em ordem crescente. O primeiro parâmetro (n) passado deve ser o valor a ser testado, logo a pós deve-se passar a sequência de intervalos(n1,n2…).

O retorno acontece da seguinte maneira:

0 – para n<n1
1 – para n<n2 e assim por diante…
-1 – se n for NULL

Ex.:
SELECT INTERVAL(9,1,5,10,20);
> 2

SELECT INTERVAL(NULL,1,5,10,20);
> -1


STRCMP

Essa função serve para comparar dois parâmetros passados, verificando se são iguais, 1º menor que o 2º ou ao contrário.

O retorno acorre da seguinte forma:

0 – se os parâmetros forem iguais
1 – se 1º > 2º

-1 – se 1º < 2º

Ex.:
SELECT STRCMP(’oi’,'olá’);
> -1 (menor)

SELECT STRCMP(’olá’, ‘oi’);
> 1 (maior)

SELECT STRCMP(’oi’, ‘oi’);
> 0 (igual)

 

Leia também:

Função Case Mysql

Categorias: MySQL, SQL | 4 Comentários »

Função Case Mysql

27maio

Assim como a função CASE é necessária quando estamos programando, ela também é muito útil em consultas SQL.

Temos duas sintaxes para a função:

Sintaxe 1 - compara a expressão especificada (valor) com um conjunto de expressões (WHEN) e retorna o valor especificado (THEN). Se nenhuma comparação for válida ele retorna o valor especificado determinado pelo ELSE. Não é obrigatória a utilização do ELSE, caso ele não seja especificado e não seja encontrada nenhuma correspondência entre os valores o retorno será NULL.

CASE valor
WHEN comparação THEN retorno (repetir para cada comparação)
[ELSE retorno]
END

Ex.:
SELECT
CASE contrato
WHEN 1 THENCLT
WHEN 2 THENPJ
ELSEInválido
END;
FROM programadores p;

Sintaxe 2 – Determina seu retorno utilizado expressões booleanas. A primeira condição verdadeira determina o resultado. Caso nenhuma condição seja atendida, o retorno vem do ELSE e se ele não for especificado o resultado é NULL.

Ex.:
CASE
WHEN condition THEN retorno (repetir para cada condição)
[ELSE retorno]
END

Ex.:
SELECT id_programador,
CASE
WHEN salario <= 1000 THENAumento 10%
WHEN salario >1000 AND salario < 5000 THENAumento 5%
ELSEAumento 2%
END
FROM programadores p;

A utilização de ambas as sintaxes não estão restritas apenas ao SELECT. Segue abaixo, a aplicação da segunda sintaxe na atualização do salário do programadores.

UPDATE
programadores
SET
salario = salario +
CASE
WHEN
salario <= 1000 THEN ((salario*10)/100)
WHEN salario >1000 AND salario < 5000 THEN ((salario*5)/100)
ELSE ((salario*2)/100)
END;

Leia também:

Entendendo Outer Joins SQL - Parte 1 (Produto Cartesiano)

Entendendo Outer Joins SQL - Parte 2 (Conexões Internas - INNER JOIN)

Entendendo Outer Joins SQL - Parte 3 (Conexões Externas LEFT, RIGHT JOIN)

Categorias: MySQL, SQL | 5 Comentários »

Entendendo Outer Joins SQL - Parte 1 (Produto Cartesiano)

29abril

Participo de algumas listas de discussão sobre PHP e percebi que muitos desenvolvedores têm dúvidas a respeito de comandos SQL, não sabem ou não utilizam de forma correta os outer joins.

Por isso, decidi fazer um post sobre esse assunto explicando como utilizar o left outer join, right outer join, natural join, cross join ou inner join (mais utilizado).

Para que servem os outer joins?

Servem para fazer as junções entre duas ou mais tabelas, cruzando informações, combinando registros, testando desigualdades.

Por que cruzar dados?

Quando pensamos em armazenamento de dados, não podemos sair criando tabelas sem uma avaliação e sem a criação de um modelo ER (Entidade Relacionamento), e uma das vantagens de pensar no modelo é evitar a repetição de dados. E como fazer isso? Distribuindo-os em mais de uma tabela de forma que possamos categorizar as repetições.

Se você olhar o modelo abaixo, existe uma tabela de programadores e uma de empresas, note que as duas estão relacionadas. Guardo na tabela programadores somente um código que identifica a empresa em que o programador trabalha. Fiz isso em virtude da possibilidade de ter vários programadores relacionados a mesma empresa, assim evito ter que escrever várias vezes o nome da empresa (texto ocupa mais espaço que número) e evito que a mesma empresa seja escrita de maneiras diferentes, dificultando assim, por exemplo, uma busca. Porém, agora para recuperar esses dados será necessário utilizar junções.

modelo

empresas
programadores_linguagens
programador
linguagens

Cruzando Dados

1 - Produto Cartesiano

Esse não é bem um tipo de junção, é conhecido como conexão cruzada, ou seja, resulta no cruzamento de cada linha de uma tabela com todas as linhas de outra tabela.

SELECT p.nome, l.nome FROM programadores p CROSS JOIN linguagens l;

cross

O resultado desta consulta gera 36 linhas de combinações. Obs.: Esse tipo de junção não é muito utilizado.

Para obter o mesmo resultado podemos utilizar outras duas sintaxes: retirar o CROSS JOIN e inserir uma vírgula (,) ou usar o INNER JOIN sem a condição de comparação (ON). O resultado será o mesmo.

SELECT p.nome, l.nome FROM programadores p, linguagens l;

SELECT p.nome, l.nome FROM programadores p INNER JOIN linguagens l;

Leia também:

Entendendo Outer Joins SQL - Parte 2 (Conexões Internas - INNER JOIN)

Entendendo Outer Joins SQL - Parte 3 (Conexões Externas LEFT, RIGHT JOIN)

Entendendo Outer Joins SQL - Parte 2 (Conexões Internas - INNER JOIN)

29abril

2 - Conexões Internas

A conexão interna inicialmente faz a mesma coisa que a conexão cruzada, porém aplica restrições que podem ser de igualdade ou desigualdade, isso faz com que algumas linhas sejam eliminadas do resultado.

Vamos lá então, quem faz parte das conexões internas? INNER JOIN, NATURAL JOIN e STRAIGHT_JOIN.

Obs.: O modelo de dados utilizado neste post encontra-se em Entendendo Outer Joins SQL - Parte 1 (Produto Cartesiano)

Digamos que eu necessite fazer uma busca de todos os programadores e suas respectivas empresas, como resolvo?

SELECT * FROM programadores p INNER JOIN empresas e ON e.id_empresa = p.id_empresa;

Na consulta acima, fiz uma junção entre as duas tabelas que guardam as informações que preciso e fiz uma restrição (ON) comparando a chave da empresa existente nas duas tabelas.

A figura abaixo mostra o comportamento do banco, o qual relaciona cada linha de uma tabela com todos os registros da outra tabela, trazendo como resultado somente as linhas onde a chave da empresa é idêntica (linhas em vermelho).

inner_comofunciona

Essa restrição (ON) não impede que eu utilize as outras opções da sintaxe do SELECT, por exemplo, o WHERE. Inclusive eu obteria o mesmo resultado com a consulta abaixo:

SELECT * FROM programadores p, empresas e WHERE e.id_empresa = p.id_empresa;

Vamos para uma segunda situação, na qual preciso de uma lista com todos os programadores que programam em pelo menos uma linguagem e saber quais são estas. Como mostra o modelo, temos um relacionamento n:m que originou a tabela programadores_linguagens, como resolvo?

SELECT p.nome, l.nome
FROM programadores p
INNER JOIN
programadores_linguagens pl
ON pl.id_programador = p.id_programador
INNER JOIN linguagens l
ON
l.id_linguagens = pl.id_linguagens;

inner2

Repare que os programadores Pinter e Gabriel não apareceram no resultado da consulta, isso porque ambos não estão relacionados à nenhuma linguagem de programação. Mas, e se fosse necessário a presença deles na listagem? Você resolveria utilizando conexões externas (item 3).

O NATURAL JOIN e o STRAIGHT_JOIN fazem exatamente a mesma coisa que o INNER JOIN em questão de resultado, porém com suas particularidades:

NATURAL JOIN: com ele você não precisa identificar quais colunas serão comparadas, pois ele fará a comparação entre campos com mesmo nome.

SELECT * FROM programadores NATURAL JOIN empresas;

STRAIGHT_JOIN: faz com que a tabela a esquerda seja lida primeiro, isso é utilizado quando o otimizador do JOIN coloca as tabelas em ordem errada. Isto é muito pouco utilizado.

SELECT * FROM programadores p STRAIGHT_JOIN empresas e ON e.id_empresa = p.id_empresa;

Obs.:
1
Posso substituir o ON por USING quando o nome nas duas tabelas for idêntico.

Ex.: SELECT * FROM programadores p INNER JOIN empresas e USING(id_empresa);

2 – O uso do INNER é opcional.

Ex.: SELECT * FROM programadores p JOIN empresas e USING (id_empresa);

Leia também:

Entendendo Outer Joins SQL - Parte 1 (Produto Cartesiano)

Entendendo Outer Joins SQL - Parte 3 (Conexões Externas LEFT, RIGHT JOIN)

Entendendo Outer Joins SQL - Parte 3 (Conexões Externas LEFT, RIGHT JOIN)

29abril

3 - Conexões Externas

As conexões externas servem para efetuar junções entre tabelas sem que necessariamente exista entre elas uma combinação exata. O LEFT e o RIGHT OUTER JOIN são os componentes desse tipo de conexão. Não é obrigado o uso do termo OUTER, se você encontrar apenas LEFT JOIN, por exemplo, funcionará da mesma maneira.

O OUTER JOIN pode ser utilizado quando você quiser retornar uma lista de todos os programadores, mesmo que estes não estejam relacionados a nenhuma linguagem de programação. A diferença do LEFT para o RIGHT está apenas na identificação de qual tabela da junção irá retornar todos os dados. O mais comum é o LEFT, pois normalmente colocamos a tabela mais importante primeiro. Inclusive a ordem das tabelas e das cláusulas de restrições na consulta, em alguns bancos, altera o desempenho.

Obs.: O modelo de dados utilizado neste post encontra-se em Entendendo Outer Joins SQL - Parte 1 (Produto Cartesiano)

No exemplo abaixo quero uma lista com todos os programadores e suas empresas independente se eles estão relacionados a uma empresa ou não.

SELECT * FROM programadores p LEFT JOIN empresas e ON e.id_empresa = p.id_empresa;

Já neste exemplo, eu quero a lista de todas as empresas e seus programadores, independente se a empresa tem ou não programadores.

SELECT * FROM programadores p RIGHT JOIN empresas e ON e.id_empresa = p.id_empresa;

O banco vai relacionar cada linha de uma tabela com todas as linhas da outra tabela, trazendo as linhas que atendem a comparação existente na consulta (ON) e para as empresas que não tem nem um programador ele irá preencher com NULL os campos, como é o caso da “Empresa 5”.

right

Leia também:

Entendendo Outer Joins SQL - Parte 1 (Produto Cartesiano)

Entendendo Outer Joins SQL - Parte 2 (Conexões Internas - INNER JOIN)

14º Encontro de Design e Tecnologia – EDTED

20abril

Dia 23 de maio 2009 irá acontecer o EDTED em Florianópolis, este que é considerado o maior encontro de internet do Brasil.

A programação está dividida em três espaços: Espaço Design, Espaço Tecnologia e Espaço Oficinas.

O evento irá acontecer em outras 7 cidades:

Curitiba - 06 de junho de 2009
Porto Alegre - 25 de julho de 2009
Brasília - 29 de agosto de 2009
Belo Horizonte - 26 de setembro de 2009
Salvador - 24 de outubro de 2009
Recife - 14 de novembro de 2009
Rio de Janeiro - 28 de março de 2009

Se você quer ganhar um desconto na inscrição, acesse o blog do Tossulino.

Chamada de Trabalhos 9° ERGODESIGN E 9°USIHC

13abril

Entre os dias 14 e 17 de setembro ocorrerá o 9º ERGODESIGN (Congresso Internacional de Ergonomia e Usabilidade de Interfaces Humano Tecnologia: Produto, Informações, Ambiente Construído e Transporte) e USIHC (Congresso Internacional de Ergonomia e Usabilidade e Design de Interfaces e Interação Humano- Computador) em Curitiba.

Aos interessados em submeter artigos o prazo é até dia 30/04/2009.

Para mais informações:
http://www.ergodesign.ufpr.br/
Fone: (41) 3361-5238 / 3360-3703
E-mail: lucia.demec@ufpr.br

« Anteriores