Aprenda MySQL

  • Página Inicial
  • Contato!
  • Tudo sobre MySQL Parte 1!
  • Tudo sobre MySQL Parte 2!
  • Tudo sobre MySQL Parte 3!
  • Tudo sobre MySQL Parte 4!
  • Tudo sobre MySQL Parte 5!
  • Tudo sobre MySQL Parte 6!
  • Tudo sobre MySQL Parte 7!
  • Tudo sobre MySQL Parte 3

    Select - Parte 2

    Vamos selecionar os cadastros, com um filtro pro nome do curso, por exemplo:

    
    select * from cursos
    where nome = 'PHP';
    
    

    Para pesquisar da mesma forma, mas apenas com determinada letra, use o comando like (parecido) no lugar do igual, e o % após ou antes da letra, por exemplo:

    
    select * from cursos
    where nome like 'P%';
    
    

    PS: Por significar "parecido", o operador like não diferencia maiúsculas e minúsculas (alguns bancos com o PostgreSQL diferencia, e para não diferenciar ele utiliza ilike). E sim, ele é um operador, assim como o between e o in, no SQL tem operadores com nomes literais.

    O % é como um coringa, que pode significar de zero a infinitos caracteres. No código acima apareceria cursos com apenas o nome "P", se existisse. Mas se o % tiver depois da letra, ele só valerá como curinga após a letra, para ser usado para anteriores, ele deverá vir antes (e no meio, a letra deverá ter antes e depois). Por exemplo:

    
    select * from cursos
    where nome like '%a';
    
    

    Um exemplo no qual o "A" pode ter qualquer coisa no começo, meio e fim:

    
    select * from cursos
    where nome like '%a%';
    
    

    Também podemos usar o operador not junto com o like para não selecionar determinada letra:

    
    select * from cursos
    where nome not like '%a%';
    
    

    PS: As letras acentuadas são consideradas, desde que o banco tenha sido configurado corretamente em UTF8. No exemplo tivemos apenas uma letra, mas vale pra qualquer palavra ou fragmento. O not pode ser usado em outros casos, como os operadores and e or.

    Vamos fazer um teste errado em POO para testar:

    
    update cursos set nome = 'PáOO' where idcurso = '9';
    
    

    Agora vamos testar novamente a pesquisa do A, da mesma forma acima, depois usaremos o update novamente para corrigir o erro de "POO".

    Vamos colocar o % no meio do PHP, assim:

    
    select * from cursos
    where nome like 'PH%P';
    
    

    No caso acima, retorna PHP (que não tem nada entre PH e P), mas pode retornar por exemplo, Photoshop (que tem várias letras entre eles).

    Para pegar os resultados PHP4, PHP7 e Photoshop5, coloque apenas um % no final, assim:

    
    select * from cursos
    where nome like 'PH%P%';
    
    

    Para exigir algum caractere obrigatório, use o _ no lugar do %, da mesma forma, assim:

    
    select * from cursos
    where nome like 'PH%P_';
    
    

    Nesse caso, selecionará apenas o que tiver um caractere depois (não mais nem menos do que isso).

    Também podemos usar o underline e o porcento juntos, assim:

    
    select * from gafanhotos
    where nome like '%_silva';
    
    

    Temos também o distinct no MySQL, para mostrar todas as ocorrências que tem no banco, mas sem repetição, caso tenha mais de uma no mesmo, por exemplo:

    
    select distinct nacionalidade from gafanhotos
    order by nacionalidade;
    
    

    O union serve para unir mais de um comando select numa só execução:

    
    select * from cursos union select 1, 2, 3, 4, 5, 6;
    
    

    PS: O union não retorna valores repetidos, caso existam, porque ele já executa automaticamente o distinct, então não inclua ele em outros comandos.

    O union tem uma variação, a union all, a diferença é que esse retorna valores repetidos, caso existam:

    
    select * from cursos union all select 1, 2, 3, 4, 5, 6;
    
    

    Também podemos fazer as agregações, para mostrar quantos cadastros numa linha tem (e não quais) com o comando count, assim:

    
    select count(*) from cursos;
    
    

    Podemos usar outros parâmetros nele, assim:

    
    select count(*) from cursos where carga > 45;
    
    

    Também podemos contar usando o nome do campo, por exemplo:

    
    select count(nome) from cursos;
    
    

    Outra função de agregação muito usada é o max, para saber o maior valor, assim:

    
    select max(carga) from cursos;
    
    

    Da mesma forma, podemos usar mais parâmetros, assim:

    
    select nome, max(totaulas) from cursos
    where ano = '2016';
    
    

    Podemos também saber o menor valor, da mesma forma, com o min:

    
    select nome, min(totaulas) from cursos;
    
    

    Mas tem um detalhe, ele só escolherá o primeiro, caso tenham o mesmo valor.

    Temos também o sum, que soma o total de todos os valores, por exemplo:

    
    select sum(totaulas) from cursos
    where ano = '2016';
    
    

    E da mesma forma, podemos tirar a média (somar os valores e dividir pela quantidade de registros) com o avg:

    
    select avg(totaulas) from cursos
    where ano = '2016';
    
    

    Select - Parte 3

    Como vimos na aula anterior, o distinct só mostra os valores uma vez, independente da quantidade que tenha nos registros.

    Se quisermos agrupar os valores, mostrando todos os registros com valores iguais agrupados, usaremos o comando group by, dessa forma:

    
    select carga from cursos
    group by carga; 
    
    

    Dessa forma acima, dará um resultado aparentemente parecido com o distinct, mas não significa que seja.

    Para contar a quantidade de registros agrupados, usamos o count(). Em outras palavras, o distinct não mostra quantidade, o group mostra, mas só com o parâmetro count, assim:

    
    select carga, count(nome) from cursos
    group by carga;
    
    

    Outro exemplo, mais organizado:

    
    select totaulas, count(*) from cursos
    group by totaulas
    order by totaulas;
    
    

    Se quiser ver alguma coisa, use o comando select assim:

    
    select * from cursos where totaulas = 12;
    
    

    Outro exemplo:

    
    select * from cursos where totaulas > 20;
    
    

    Ou assim:

    
    select carga, count(nome) from cursos where totaulas = 30
    group by carga;
    
    

    Podemos usar tambpem o parâmetro having, usado com operadores, para agrupar somente alguns registros, assim:

    
    select ano, count(*) from cursos
    group by ano
    having count(ano) >= 5
    order by count(*);
    
    

    Outro exemplo mais complexo:

    
    select ano, count(*) from cursos
    where totaulas > 30
    group by ano
    having ano > 2013
    order by count(*) desc;
    
    

    Também podemos colocar select dentro dos parêntese em alguns casos.

    Um exemplo para mostrar apenas os cursos acima da média de aulas dos cursos:

    
    select carga, count(*) from cursos
    where ano > 2015
    group by carga
    having carga > (select avg(carga) from cursos);
    
    

    Nesse caso acima, o select dentro dos parênteses é para mostrar o valor da média sempre atualizado.

    Existem também as regexp no SQL, que são as expressões regulares usadas em strings, veja algumas (todas usadas dentro das aspas):

    Padrão Significado
    […] Qualquer caracter único no intervalo ou conjunto especificado ([a-h]; [aeiou])
    [^…] Qualquer caracter único que não esteja no intervalo ou conjunto especificado ([^a-h]; [^aeiou])
    ^ Início da string (fora dos colchetes); Negação (dentro dos colchetes)
    $ Fim da string
    a|b|c Alternação (a ou b ou c) (caractere pipe – |)
    * Zero ou mais ocorrências do elemento precedente
    + Uma ou mais ocorrências do elemento precedente
    {n} N instâncias do elemento precedente
    {m,n} De M até N instâncias do elemento precedente

    Inclusive, podemos utilizar formatações nas datas, dessa forma:

    
    -- Ele exibirá a data no formato especifico:
    select nome, date_format(nascimento, '%d/%m/%Y') from gafanhotos;
    
    

    PS: A função date_format também pode ser usada em inserts, assim:

    
    -- A data será salva no formato YYYY-MM-DD normalmente no banco, independente da formatação:
    insert into gafanhotos
    (nome, profissao, nascimento, sexo, peso, altura, nacionalidade)
    values
    ('Solange Neves', 'Secretária',  str_to_date('15/12/1981', '%d/%m/%Y'), 'F', '69.4', '1.72', 'Argentina');
    
    

    Basicamente, as regras são as mesmas de outra linguagens, usando %d/%m/%Y para dia, mês e ano. Usamos %H:%M:%S para hora, minuto e segundo. %w é usado para dia da semana.

    Exercícios para treinar o MySQL: