Nesta segunda parte do artigo irei demonstrar outros comandos SQL, além de mostrar como manter a integridade em suas tabelas e como tornar o seu banco de dados mais seguro.
Como já vimos, o comando SELECT é o responsável por fazer a exibição
dos dados registrados em nossas tabelas, veremos agora como utilizar
uma melhor aplicação deste recurso.
Evitando a exibição de linhas duplicadas
Para que isso não ocorra, é necessário a indicação da palavra
DISTINCT imediatamente após o comando SELECT:
mysql> SELECT DISTINCT cidade FROM alunos;
Ordenando os dados
Já vimos anteriormente que para isto é necessário usar a
cláusula ORDER BY. Por default está cláusula ordena os dados em
ASCENDING (crescente), mas se você necessitar visualizar os dados
na ordem decrescente, utilize as siglas DESC após a cláusula:
mysql> SELECT nome FROM alunos ORDER BY nome DESC;
Utilizando alias (apelidos)
Existem duas maneiras de se utilizar os Alias (apelidos) em
uma cláusula do MySQL, são elas: apelido para o nome exibido no
título da coluna de uma tabela e apelido para simplificar um
nome de tabela que será constantemente utilizado em uma cláusula
SELECT.
Exemplos 1: apelido para o título
mysql> SELECT nome FROM ALUNOS;
+-------------------------------+
| nome |
+-------------------------------+
| Jefferson Estanislau da Silva |
| Leila Maria Muniz da Silva |
| Victor Estanislau da Silva |
+-------------------------------+
// observe que é apresentado o nome real da coluna.
mysql> SELECT nome AS INSCRITOS FROM ALUNOS;
+-------------------------------+
| INSCRITOS |
+-------------------------------+
| Jefferson Estanislau da Silva |
| Leila Maria Muniz da Silva |
| Victor Estanislau da Silva |
+-------------------------------+
//observe que o nome real foi substituido pelo apelido Inscritos.
Exemplo 2: apelido para uma tabela constante em uma cláusula:
mysql> SELECT ALUNOS.nome, CURSOS.nomecurso FROM ALUNOS, CURSOS
-> where ALUNOS.codcurso = CURSOS.codcurso
-> and ALUNOS.cidade='Nova Friburgo';
// observe que o nome das tabelas ALUNOS e CURSO são repetidos constantemente dentro desta cláusula.
mysql> SELECT A.nome, C.nomecurso FROM ALUNOS AS A, CURSOS AS C
-> where A.codcurso = C.codcurso
-> and A.cidade='Nova Friburgo';
// observe que foi utilizado o apelido A para AlUNOS e C para CURSOS, simplificando assim o código.
// As duas formas apresentam este resultado:
+-------------------------------+--------------------+
| nome | nomecurso |
+-------------------------------+--------------------+
| Jefferson Estanislau da Silva | Ensino Medio |
| Leila Maria Muniz da Silva | Ensino Medio |
| Victor Estanislau da Silva | Ensino Fundamental |
+-------------------------------+--------------------+
Utilizando condições
Já vimos que para que se faça o uso de condições deve se usar o
comando WHERE. Veremos agora várias formas de se aplicar estas
condições.
NOTA: é possível utilizar operadores de comparação lógica, estes
estão divididos em duas classes:
Operadores de linha Única
= igual a
! diferente de
> maior que
>= maior ou igual a
< menor que
<= menor ou igual a
mysql> SELECT nome FROM alunos WHERE matricula='300';
Operadores de várias linhas
AND e
OR ou
NOT não
mysql> SELECT nome FROM aluno WHERE cidade='Salvador' AND matricula='300';
mysql> SELECT nome FROM aluno WHERE cidade='Salvador' OR matricula='300';
Precedência de operadores
Uma cláusula WHERE pode combinar vários operadores AND e OR.
O operador AND tem maior precedência que o operador OR.
Os operadores de comparação tem maior precedência que os conectivos AND e OR.
Todos os operadores de comparação tem a mesma precedência.
Operadores de igual precedência são calculados da esquerda para a direita.
A precedência de operadores pode ser cancelada através de parênteses:
mysql> SELECT nome FROM alunos WHERE matricula > '100' AND
(cidade = 'Nova Friburgo' OR codcurso='01');
Operador LIKE
Busca valores alfanuméricos incompletos a partir de um ou mais
caracteres:
% - corresponde a uma seqüência qualquer de 0 ou mais caracteres.
"_" - corresponde a qualquer caracter.
mysql> SELECT nome FROM alunos WHERE nome LIKE 'J%';
// lista todos os nomes que comecem com J
mysql> SELECT nome FROM alunos where nome LIKE '_________';
// lista todos os nomes que possuem exatamente 9 caracteres.
Operador BETWEEN
Busca valores entre uma faixa especificada:
mysql> SELECT nome FROM alunos WHERE matricula BETWEEN '100' AND '300';
Operador IN
Utiliza-se o operador IN para testar valores em uma lista específica:
mysql> SELECT nome FROM alunos WHERE codcurso IN ('01', '02');
Veja q troquei o retorno da query
removi o $ do campo order
fiz com q o retorno da função sum, seja armazenado um um alias chamado soma
com o fetch_array, peguei as colunas q vem da query
o comando fetch cria um array e mandei o valor da coluna para
a variavel $soma
[4] Comentário enviado por ft_xavier em 17/02/2005 - 11:43h
Pessoal,
Segui os passos desse excelente artigo sobre manipulacao do mysql para criar uma databse, usuario e definir o acesso dele a somente essa database criada. Só que porem, ele ainda continua a ver as demais e ter acesso a elas. Como posso fazer pra resolver isso ???
[5] Comentário enviado por jeffestanislau em 17/02/2005 - 15:14h
ft_xavier,
Você me enviou este comentário estando na página 7, tabela user, aqui você cria o usuário para acessar o mysql como um todo...
Se quer prender o usuário em uma única tabela, você também deve criar o usuário na tbela DB, descrevendo seu nome de acesso e a tabela ao qual ele pode acessar...
[7] Comentário enviado por kl31n em 09/03/2005 - 00:15h
Ok......legal o artigo....
mas gostaria de saber tipo.....
se existem StoredProcedures no MySql
ou como o MySql trata as operações
para fazer com que realmente aconteça
o Client-Server
tipo...o sistema manda as informações e
o BG eh que grava elas e se vira com tudo.......
[8] Comentário enviado por Hernando em 03/05/2005 - 11:01h
Mais uma vez gostaria de agradece-lo pela presteza nos artigos... e acredito que assim esteje concluido o mini manual ajudando a todos que queiram ingressar no mundo do MySQL... Queria dar a dica que abra um novo artigo dizendo sobre injeção de sql para que todos que sigam esse artigo possam se previnir antes de serem prejudicados pois a má estruturação pode causar grandes danos...
[14] Comentário enviado por adilsom em 19/05/2009 - 18:59h
ola, estou com um problema, tenho um sisetma que foi feito pra mysql4, e agora preciso fazer funcionar com mysql5.
So que em uma pagina da este erro
"
Database error: Invalid SQL: SELECT SUBSTR(t1.starttime,1,10) AS day, sum(t1.sessiontime) AS calltime, sum(t1.sessionbill) AS cost, count(*) as nbcall,sum(t1.buyratecost) FROM call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19') GROUP BY SUBSTR(t1.starttime,1,10) ORDER BY day
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19') GROU' at line 1)
Database error: Invalid SQL: SELECT count(*) FROM call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19')
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19')' at line 1)
Database error: next_record called with no query pending.
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19')' at line 1)
"
Detalhe, no phpmyadmin com mysql4 faço esta busca:
SELECT substr(t1.starttime,1,10) AS day, sum(t1.sessiontime) AS calltime, sum(t1.sessionbill) AS cost, count(*) as nbcall,sum(t1.buyratecost)FROM call t1 WHERE UNIX_TIMESTAMP(t1.starttime) >= UNIX_TIMESTAMP('2009-05-19') GROUP BY SUBSTR(t1.starttime,1,10) ORDER BY day
[16] Comentário enviado por henbran em 14/12/2009 - 14:48h
Boa tarde ...!!!!
GOSTARIA DE SABER SE ALGUÉM PODERIA ME ORIENTAR SOBRE O USO DO JOIN EM 1 CONSULTA SQL.
Tenho uma tabela de maquinas e outras de uso_maquinas. Preciso de uma consulta sql que busque na tabela maquina, todas as maquinas que não estão em uso. É 1 projeto de telecentro comunitário. Trabalho com PHP, MySql/postgre (uso recursos PDO).
Olhem por favor a string de consulta:
SELECT maquina.id_maquina, maquina.num_maq
FROM maquina
RIGHT JOIN
(usotelecentro RIGHT JOIN maquina ON maquina.id_maquina = usotelecentro.id_maquina)
ON usotelecentro.dt_utc >='2009-12-14'
WHERE maquina.id_tele_centro = 2
1º) campos a retornar os dados
2º) tabela de maquinas
3º) inicio da instrução JOIN
4º) primeira condição JOIN {se houver alguma máquina do telecentro em questão, em uso, ....}
5º) segunda condição JOIN {..., verificar se é da data atual}
6º) condição WHERE
Temos 2 tabelas, uma é a tabela fato (dados fixos) e a outra é a tabela tempo (dados inseridos conforme o uso). Usa-se o computador por 1 hora ou + e quando abre a tela para verificar quais computadores estão livres, referentes a esse telecentro, identificar se já/ou não está preenchido o campo hora_fim_de_uso.
É um projeto da prefeitura de Guarulhos - SP da qual sou programador PHP a 6 meses.
Obrigado