Gerenciando banco de dados com MySQL (parte 2)

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.

[ Hits: 156.471 ]

Por: Jefferson Estanislau da Silva em 11/01/2004


Visualizando dados de maneira mais organizada



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
  1. Uma cláusula WHERE pode combinar vários operadores AND e OR.
  2. O operador AND tem maior precedência que o operador OR.
  3. Os operadores de comparação tem maior precedência que os conectivos AND e OR.
  4. Todos os operadores de comparação tem a mesma precedência.
  5. Operadores de igual precedência são calculados da esquerda para a direita.
  6. 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');
Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Restrições de integridade
   3. Visualizando dados de maneira mais organizada
   4. Uso de funções
   5. Subqueries
   6. Segurança no acesso aos dados
   7. A tabela user
   8. A tabela db
   9. O comando flush privileges
   10. Conclusão
Outros artigos deste autor

Entendendo a estrutura do Linux

Configurando o IDS - Snort / Honeypot (parte 2)

História do GNU/Linux: 1965 assim tudo começou!

Gerenciando banco de dados com MySQL (Parte 1)

Software Livre - GNU x LPG e o Governo x Economia (parte 2)

Leitura recomendada

Configurando Apache + MySQL + PHP no Slackware

Store Procedures com Transaction no MySQL

Sincronização segura entre bancos de dados MySQL utilizando SJA

Slackware + MariaDB (MySQL): importando e exportando arquivos TXT

A função DATE_FORMAT() do MySQL

  
Comentários
[1] Comentário enviado por hotforms em 22/02/2004 - 10:07h

Estou utilizando o codigo abaixo, aguem saberia me dizer como faço para ele funcionar, eu quero que ele me de to tatal dos valores do campo 'ordem'.

<? $soma = mysql_query("SELECT SUM($ordem) FROM menu_admin");?>
<?echo "Total $soma; "?>;

[2] Comentário enviado por mmoscz em 14/05/2004 - 11:10h

<? $query = mysql_query("SELECT SUM(ordem) as soma FROM menu_admin");?>
<?php $tupla = mssql_fetch_array($query); ?>
<?php $soma = $tupla["soma"]; ?>
<?echo "Total $soma" ; ?>

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

[3] Comentário enviado por removido em 13/01/2005 - 15:57h

Muito bom o artigo!!
Se for possível, dê sequência a ele!
;-)
EJ

[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 ???

Grato.

[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...

blz!!!

[6] Comentário enviado por ft_xavier em 17/02/2005 - 17:25h

Ok amigo,

Mas foi exatamente isso que eu fiz, mas mesmo assim, ele continua vendo as demais db's, soh que naum tem acesso de rw nelas...

Grato pela ajuda...

[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...

[]'s

[9] Comentário enviado por rafael_simao em 26/10/2005 - 15:17h

Artigo de excelente qualidade !

[10] Comentário enviado por f4br1c10 em 26/01/2006 - 11:24h

o Artigo parte 01 e o parte 02... Show!

:)

[11] Comentário enviado por poulghet em 26/12/2006 - 19:07h

Valeu gostei muito dos dois (Parte 1 e 2)

[12] Comentário enviado por worm em 10/09/2007 - 14:46h

As 2 partes do artigo estão ótimas cara, cairam como uma luva pra mim! show!! Agora são referência pra mim pro MySQL

[13] Comentário enviado por megatron_rj em 19/07/2008 - 03:18h

Otimo artigo,
Realmente estou no aguardo das continuações, se é que elas acontecerão!!!
Grande abraço,

[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

e me retorna perfeito, e no mysql5 da erro.



[15] Comentário enviado por ramontcruz em 05/11/2009 - 19:08h

virou minha referencia!!
um abraço!!!

[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


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts