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';
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: