Apostila Mysql
Apostila Mysql
Esta apostila fornece uma introduo ao MySQL por mostrar ao usurio como criar
e gerenciar um banco de dados. MySQL um programa interativo que permite voc conectar
com um servidor de MySQL, perguntar e ver os resultados. Tambm veremos MySQL utilizado
em modo de lote: voc coloca suas perguntas em um arquivo de antemo, e MySQL executa os
contedos do arquivo. Ambos os caminhos de usar o MySQL so descritos aqui.
Para ver uma lista de opes fornecidas por MySQL, invoque-o com -help:
shell> mysql --help
Esta apostila assume que o MySQL est instalado em sua mquina, e que um servidor de
MySQL
est disponvel para que possa conectar.
A apostila descreve o processo inteiro de como criar e usar um banco de dados.
Conectando e desconectando do servidor
Para conectar ao servidor, voc usualmente necessitar fornecer um usurio ao MySQL e,
mais provavelmente, uma senha. Se o servidor continua numa mquina que no tem onde se
registrar, tambm necessitar especificar um hostname. Sabendo os parmetros prprios,
voc poder se conectar:
shell> mysql -h host -u user -p
Enter password: ********
O ******** representa sua senha; entre com a senha quando MySQL exibir Enter
password: prompt.
Se daquela estao, voc deveria ver alguma informao de introduo seguida
por uma mysql> prompt:
shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 459 to server version: 3.22.20a-log
Tipo "help" para ajuda.
mysql>
O prompt diz que voc est pronto para entrar com os comandos.
Algumas instalaes do MySQL permite aos usurios conectar com o servidor e continuar
como anfitrio local. Se isto o caso em sua mquina, voc deveria ser capaz de
conectar com o servidor ao invocar o MySQL sem quaisquer opes:
shell> mysql
Depois que est conectado, voc pode desconectar a qualquer momento, s digitar QUIT
no mysql> prompt:
mysql> QUIT
Bye
Voc tambm pode desconectar por control-D.
Na maioria dos exemplos nas seguintes sees, assumem que voc est conectado ao servidor.
Eles indicam isto por: mysql> prompt.
Entrando e perguntando
Neste ponto, mais importante descobrir como emitir perguntas do que criar tabelas,
carregar e recuperar dados. Esta seo descreve os princpios bsicos de como entrar
com os comandos, usando vrias perguntas. Voc pode experimentar familiarizando com os
trabalhos do MySQL.
Aqui um comando simples que pergunta ao servidor o nmero de sua verso e a data
corrente.
mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| version() | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19 |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>
Esta pergunta ilustra vrias coisas sobre MySQL:
* Um comando normalmente consiste de uma declarao do SQL seguida por um ponto-evrgula.
(H algumas excees onde um ponto-e-vrgula no so necessrio.
QUIT, mencionado anteriormente, um deles.)
* Quando voc emite um comando, MySQL envia ao servidor para execuo e exibe os
resultados,
ento exibe mysql>, para indicar que est pronto para outro comando.
* MySQL exibe a sada da pergunta como uma tabela (filas e colunas).
A primeira fila contem rtulos s colunas. As demais filas so os resultados da pergunta.
Normalmente, os rtulos da coluna so os nomes das colunas que traz das tabelas do banco
de dados. Se voc est recuperando o valor de uma expresso, em vez de uma coluna de
tabela,
MySQL rotula a coluna usando a expresso que foi usada.
* MySQL mostra quantas filas foram exibidas, e quanto tempo a pergunta levou para ser
executada, dando uma idia rude de performance do servidor. Esses valores so imprecisos
porque eles representam tempo de relgio de parede (no CPU ou tempo de mquina),
e porque eles so afetados por certos tipos de fatores. Palavras chaves podem ser inseridas
em qualquer caixa de entrada . As seguintes perguntas so equivalente:
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
Aqui outra pergunta. Isto demonstra que voc pode usar MySQL como uma simples
calculadora:
dealer CHAR(20)
DEFAULT ''
NOT NULL,
price DOUBLE(16,2)
DEFAULT '0.00' NOT NULL,
PRIMARY KEY(article, dealer));
INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
(3,'D',1.25),(4,'D',19.95);
Assim os dados de exemplo estaro:
SELECT * FROM shop
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | A
| 3.45 |
| 0001 | B
| 3.99 |
| 0002 | A
| 10.99 |
| 0003 | B
| 1.45 |
| 0003 | C
| 1.69 |
| 0003 | D
| 1.25 |
| 0004 | D
| 19.95 |
+---------+--------+-------+
O valor mximo de uma coluna
"Qual o artigo que tem o preo mais alto?"
SELECT MAX(article) AS article FROM shop
+---------+
| article |
+---------+
|
4|
+---------+
A fila da coluna com o nmero mximo
"Encontre o nmero do negociantes, e avalie quem tem o artigo mais caro."
No ANSI SQL isto facilmente feito com um sub-query:
SELECT article, dealer, price
FROM shop
WHERE price=(SELECT MAX(price) FROM shop)
No MySQL (ainda no faz uma sub-seleo) somente faz isto em dois passos:
1. Obtem o valor mximo e avalia a tabela com uma declarao SELECT.
2. Usando este valor compila a pergunta real:
SELECT article, dealer, price
FROM shop
WHERE price=19.95
Outra soluo est em classificar todas filas decrescentes por preo e unicamente obter
uma fila usando o MySQL clusula de LIMIT:
SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1
Note: Se h vrios artigos caros, a soluo de LIMIT mostra unicamente um deles.
Mximo da coluna: por grupo e por valores
"Qual o preo mais alto por artigo?"
SELECT article, MAX(price) AS price
FROM shop
GROUP BY article
+---------+-------+
| article | price |
+---------+-------+
| 0001 | 3.99 |
| 0002 | 10.99 |
| 0003 | 1.69 |
| 0004 | 19.95 |
+---------+-------+
As filas com grupos de campos de valor mximo
"Para cada artigo, encontre o(s) negociante(s) com o preo mais caro."
No ANSI SQL, pode fazer isto com um sub-query:
SELECT article,
SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
0.00+LEFT(
MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
FROM shop
GROUP BY article;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | B
| 3.99 |
| 0002 | A
| 10.99 |
| 0003 | C
| 1.69 |
| 0004 | D
| 19.95 |
+---------+--------+-------+
Usando chaves estrangeiras
Voc no necessita de chaves estrangeiras para unir 2 tabelas.
O MySQL no faz a checagem de certificar que as chaves da tabela so referncias e isto
no feito automaticamente apagando as filas da tabela com uma definio de chave
estrangeira. Se voc usa as chaves normais, ele trabalhar perfeitamente.
Seu banco de dados necessita ser criado uma unicamente vez, mas deve selecion-lo o
uso a cada vez que comear uma sesso do MySQL. Voc pode fazer isto ao usar uma
declarao
de USE como mostrada acima. Alternativamente, voc pode selecionar o banco de dados
na linha de comando, quando voc invocar MySQL. Somente vai especificar seu nome depois
de quaisquer parmetros de conexo que poder ser necessrio fornecer. Por exemplo:
shell> mysql -h host -u user -p menagerie
Enter password: ********
Note que menagerie no sua senha no comando. Se voc deseja fornecer sua senha na
linha de comando depois da opo -p, voc deve fazer no intervindo espao (e.g., como
-pmypassword, no como -p mypassword). Entretanto, colocar sua senha na linha de comando
no
recomendada, porque impede aes que expe a outros usurios registrados em sua
mquina.
Criando uma tabela
Criar um banco de dados a parte mais fcil, mas neste ponto ele est vazio,
com SHOW TABLES mostrar:
mysql> SHOW TABLES;
Empty set (0.00 sec)
A parte mais dura decidir que estrutura o seu banco de dados dever ter: que tabelas
voc necessitar, e que colunas deve ter em cada uma delas.
Voc desejar uma tabela que contm um registro para cada um de seus animais de
estimao.
Isto pode ser chamado de tabela de animal de estimao, e isto deveria conter, no mnimo,
o nome de cada animal. O nome por si mesmo no est muito interessante, a tabela deveria
conter outra informao. Por exemplo, se mais de uma pessoa em sua famlia tem animais de
estimao, voc pde desejar listar o dono de cada animal. Pode registrar alguma informao
bsica, tal como, espcie e sexo.
Como sobre idade? interessante, mas isto, no uma boa coisa para armazenar em um
banco
de dados. Ao invs da idade, ser melhor armazenar um valor fixo, como a data de nascimento.
Ento, sempre que voc necessitar da idade, voc pode calcular isto como a diferena entre
a data corrente e a data de nascimento. MySQL fornece funes aritmtica de data.
Armazenando a data de nascimento em vez da idade teremos outras vantagens:
* Voc pode usar o banco de dados para tarefas, tal como gerar lembretes para os prximos
aniversrios do animal de estimao. (Se voc pensa que este tipo de pergunta tola, note
que a mesma pergunta que pde ser feia, no contexto de um banco de dados de negcios,
identifica clientes que fazem aniversrio.)
* Voc pode calcular a idade em relao a datas que no so corrente. Por exemplo,
se voc armazena data da morte, voc pode facilmente calcular a idade que animal de
estimao estava, quando morreu.
Voc pode provavelmente pensar de outros tipos de informao que poderia ser til na
tabela do animal de estimao, mas so suficientes agora: nome, dono, espcie, sexo,
nascimento e morte.
Use a declarao CREATE TABLE para especificar o layout de sua tabela:
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
VARCHAR uma boa escolha ao nome, dono e de espcie porque os valores da coluna variam
em comprimento. Os comprimentos daquelas colunas no so do mesmo tamanho. Voc pode
escolher qualquer comprimento de 1 at 255, qualquer que parea razovel. (Se fez uma
escolha pobre e mais tarde voc necessita um campo mais longo, MySQL fornece uma
declarao
de ALTER TABLE .)
O sexo do animal pode ser representado com uma variedade de caminhos, por exemplo,
"m" e "f", ou talvez "masculino" e "feminino". simples s usar os caracteres nicos
"m" e "f".
O uso de dados tipo data para ao nascimento e morte honestamente umaescolha bvia.
Agora que voc criou uma tabela, SHOW TABLE deveria produzir alguma sada:
mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| pet
|
+---------------------+
Para verificar que sua tabela foi criada no caminho que voc criou, use a declarao
DESCRIBE:
mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type
| Null | Key | Default | Extra
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES |
| NULL |
| owner | varchar(20) | YES |
| NULL |
| species | varchar(20) | YES |
| NULL |
| sex
| char(1)
| YES |
| NULL |
|
| birth | date
| YES |
| NULL |
|
| death | date
| YES |
| NULL |
|
+---------+-------------+------+-----+---------+-------+
|
|
|
|
Voc pode usar DESCRIBE a qualquer hora, por exemplo, se voc esquecer os nomes das
colunas em sua tabela.
Carregando dados dentro uma tabela
Depois de ter criado sua tabela, voc necessita inserir os dados. As declaraes: LOAD
DATA e INSERT so teis.
Suponha que os registros do animal de estimao podem ser descritos como mostrados a
baixo.
(Observe que MySQL espera datas em formato: YYYY-MM-DD; pode ser diferente do que
utilizado.)
Nome
Dono
Espcie
Sexo
Nascimento
Morte
Fofo
Harold
gato
f
1993-02-04
Claws
Gwen
gato
m
1994-03-17
Buffy
Harold
co
f
1989-05-13
Presa
Benny
co
m
1990-08-27
Bowser
Diane
co
m
1998-08-31
1995-07-29
Chirpy
Gwen
pssaro
f
1998-09-11
Whistler
Gwen
pssaro
1997-12-09
Magro
Benny
cobra
m
1996-04-29
Se voc est comeando com uma tabela vazia, um caminho fcil para preencher criar
um arquivo de texto contendo uma fila para cada um de seus animais, ento carregue os
contedo do arquivo dentro da tabela com uma declarao nica.
Voc pode criar um arquivo de texto "pet.txt" contendo um registro por linha, com
valores separados por tabulaes, conforme as colunas foram listadas na declarao de
CREATE TABLE. Para valores desconhecidos (tal como sexos desconhecidos, ou datas
de morte para animais que esto ainda vivos), voc pode usar valores NULL. Para
represent-los em seu arquivo de texto, use \N. Por exemplo, o registro do pssaro:
Whistler
Gwen
Pssaro
\N
1997-12-09
\N
Para carregar o arquivo de texto "pet.txt" dentro da tabela de animal de estimao,
use este comando:
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
Voc pode especificar o separador de valor da coluna e a terminao da linha
explicitamente na declarao de LOAD DATA, se voc desejar, mas os defaults so tabulaes
e mudana de linha. Essas declaraes so suficientes para ler o arquivo "pet.txt"
propriamente.
Cada vez que voc desejar inseir um novo registro, a declarao INSERT til.
Em seu formulrio, voc fornece valores para cada coluna, na forma em que as colunas
foram listadas na declarao de CREATE TABLE. Suponha Diane obtem um novo hamster
especificado Puffball. Voc podia inserir um novo registro usando uma declarao INSERT:
mysql> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Note que o fio e valores de data so especificados como citados. Com INSERT, voc
tambm pode inserir NULL para representar um valor desconhecido. Voc no usa \N,
confome faz com LOAD DATA.
Deste exemplo, voc deveria ser capaz de ver que pode ser muito mais trabalhoso
inserir seus registros inicialmente usando vrias declaraes de INSERT em vez de
uma nica declarao de LOAD DATA.
Recuperando informao de uma tabela
A declarao SELECT utilizada para puxar informao de uma tabela. O formulrio
geral da declarao :
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy
what_to_select indica o que voc deseja ver. Isto pode ser uma lista de colunas, ou
* para para indicar todas colunas.
which_table indica a tabela de que voc deseja recuperar os dados. A clusula WHERE
opcional.
Se for apresentado, conditions_to_satisfy especifica as condies que as filas devem
satisfazer para recuperao qualificada.
Selecionando todos os dados
A forma simples de recuperar tudo de uma tabela SELECT:
Voc pode usar a clusula WHERE para combinar a seleo da fila com seleo da coluna.
Por exemplo, para obter datas de nascimento de ces e gatos unicamente:
mysql> SELECT name, species, birth FROM pet
-> WHERE species = "dog" OR species = "cat";
+--------+---------+------------+
| name | species | birth
|
+--------+---------+------------+
| Fluffy | cat
| 1993-02-04 |
| Claws | cat
| 1994-03-17 |
| Buffy | dog
| 1989-05-13 |
| Fang | dog
| 1990-08-27 |
| Bowser | dog
| 1989-08-31 |
+--------+---------+------------+
Classificando filas
Voc pode notar nos exemplos, que as filas de resultado so exibidas sem nenhum
modo particular. Entretanto, isto mais fcil examinar a sada da pergunta quando
as filas so classificadas em algum caminho significativo. Para classificar um resultado,
use ORDER BY.
Aqui so os aniversrios dos animais, classificados por data:
mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name
| birth
|
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang
| 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim
| 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
Para classificar um pedido em ordem decrescente, use a palavra chave DESC com o nome
da coluna:
mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name
| birth
|
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim
| 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang
| 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+
Voc pode classificar colunas mltiplas. Por exemplo, para classificar por tipo de
animal e por data de nascimento, o tipo de animal deve ser classificado pelo o
mais jovem, use a seguinte query:
mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
+----------+---------+------------+
| name
| species | birth
|
+----------+---------+------------+
| Chirpy | bird | 1998-09-11 |
| Whistler | bird | 1997-12-09 |
| Claws | cat
| 1994-03-17 |
| Fluffy | cat
| 1993-02-04 |
| Fang
| dog
| 1990-08-27 |
| Bowser | dog
| 1989-08-31 |
| Buffy | dog
| 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim
| snake | 1996-04-29 |
+----------+---------+------------+
Note que a palavra chave DESC aplica unicamente coluna (nascimento); valores de
espcie so classificados por ordem crescente.
Clculos de Data
MySQL fornece vrias funes que pode fazer clculos em datas, por exemplo, para
calcular idades ou extrair partes das datas.
Para determinar quantos anos tem seus animais de estimao, ele pega a diferena entre
a data de nascimento e a data corrente. Converte as duas datas para dias, tomam a
diferena, e divide por 365 (o nmero de dias em um ano):
mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 FROM pet;
+----------+-------------------------------------+
| name
| (TO_DAYS(NOW())-TO_DAYS(birth))/365 |
+----------+-------------------------------------+
| Fluffy |
6.15 |
| Claws |
5.04 |
| Buffy |
9.88 |
| Fang
|
8.59 |
| Bowser |
9.58 |
| Chirpy |
0.55 |
| Whistler |
1.30 |
| Slim
|
2.92 |
| Puffball |
0.00 |
+----------+-------------------------------------+
H algumas coisas que podem ser melhoradas. Primeiro, o resultado pode ser examinado
mais facilmente se as filas que forem apresentadas em alguma ordem. Segundo, o
ttulo da coluna de idade no est significativo.
O primeiro problema pode ser tratado por inserindo a clusula ORDER BY ao nome,
para classificar a sada por nome. Para lidar com o ttulo da coluna, fornece um
nome coluna de modo que um rtulo diferente aparea na sada (isto chamado de apelido
da coluna):
mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
-> FROM pet ORDER BY name;
+----------+------+
| name
| age |
+----------+------+
| Bowser | 9.58 |
| Buffy | 9.88 |
| Chirpy | 0.55 |
| Claws | 5.04 |
| Fang
| 8.59 |
| Fluffy | 6.15 |
| Puffball | 0.00 |
| Slim
| 2.92 |
| Whistler | 1.30 |
+----------+------+
Para classificar a sada por idade em vez de nome, somente use a clusula ORDER BY:
mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
-> FROM pet ORDER BY age;
+----------+------+
| name
| age |
+----------+------+
| Puffball | 0.00 |
| Chirpy | 0.55 |
| Whistler | 1.30 |
| Slim
| 2.92 |
| Claws | 5.04 |
| Fluffy | 6.15 |
| Fang
| 8.59 |
| Bowser | 9.58 |
| Buffy | 9.88 |
+----------+------+
Uma pergunta parecida pode ser utilizada para determinar a idade dos animais
quando morreram. Voc determina os animais que j morreram, checa, no importando se
o valor de morte NULL e para valores no NULOS, computam a diferena entre valores
de morte e valores de nascimento:
mysql> SELECT name, birth, death, (TO_DAYS(death)-TO_DAYS(birth))/365 AS age
-> FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name | birth
| death
| age |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5.91 |
+--------+------------+------------+------+
A pergunta usa morte IS NOT NULL em vez de morte != NULL porque NULL um valor
especial.
Se voc deseja saber que animais tm aniversrios no prximo ms? Para este tipo de
clculo, ano e dia so irrelevantes, voc simplesmente deseja extrair o ms da
coluna de nascimento. MySQL fornece vrias funes do extrao de partes da data,
tal como YEAR(), MONTH() and DAYOFMONTH(). MONTH() a funo apropriada aqui. Para
ver
como isto trabalha, faz uma pergunta simples que exibe o valor de ambos data de
nascimento e ms(nascimento):
mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name
| birth
| MONTH(birth) |
+----------+------------+--------------+
| Fluffy | 1993-02-04 |
2|
| Claws | 1994-03-17 |
3|
| Buffy | 1989-05-13 |
5|
| Fang
| 1990-08-27 |
8|
| Bowser | 1989-08-31 |
8|
| Chirpy | 1998-09-11 |
9|
| Whistler | 1997-12-09 |
12 |
| Slim
| 1996-04-29 |
4|
| Puffball | 1999-03-30 |
3|
+----------+------------+--------------+
Unindo Modelo
MySQL fornece um modelo do SQL padronizado unindo assim um formulrio de modelo
baseado em expresses regulares parecidas com aquelas utilizadas por utilitrios de
Unix tal como vi, grep e sed.
Modelo do SQL permite voc usar "_" para unir qualquer caracter nico, e "%" para unir
um nmero arbitrrio de caracteres (incluindo zero caracteres). No MySQL, modelos
do SQL so caso insensvel por default. Alguns exemplos so mostrados baixo. Note
que voc no usa = ou != quando voc usa modelos do SQL; use o GOSTADO DE ou NO
operadores de comparao IGUAIS ao invs.
Para encontrar nomes comeam com "b":
mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth
| death
|
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog
| f | 1989-05-13 | NULL
|
| Bowser | Diane | dog
| m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
Para encontrar nomes finalizando com "%fy":
mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth
| death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat
| f | 1993-02-04 | NULL |
| Buffy | Harold | dog
| f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Para encontrar nomes contendo uns "w":
mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name
| owner | species | sex | birth
| death
|
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat
| m | 1994-03-17 | NULL
|
| Bowser | Diane | dog
| m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL
|
+----------+-------+---------+------+------------+------------+
Para encontrar nomes contendo extamente cinco caracteres, usam os caracteres de modelo
"_":
mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth
| death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat
| m | 1994-03-17 | NULL |
| Buffy | Harold | dog
| f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
O outro tipo de modelo fornecido por MySQL usa expresses regulares. Quando voc
testa este tipo de modelo, usa os operadores REGEXP e NOT REGEXP (ou RLIKE e NOT
RLIKE,
que so sinnimos).
| bird |
2|
| cat
|
2|
| dog
|
3|
| hamster |
1|
| snake |
1|
+---------+----------+
Nmero de animais por sexo:
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex | COUNT(*) |
+------+----------+
| NULL |
1|
|f |
4|
|m |
4|
+------+----------+
(Nesta sada, NULL indica "sexo desconhecido.")
Nmero de animais por combinao de espcie e sexo:
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | NULL |
1|
| bird | f |
1|
| cat
|f |
1|
| cat
|m |
1|
| dog
|f |
1|
| dog
|m |
2|
| hamster | f |
1|
| snake | m |
1|
+---------+------+----------+
Para uma tabela inteira voc usa COUNT(). Por exemplo, a pergunta prvia, quando
desempenhada somente nos ces e gatos:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE species = "dog" OR species = "cat"
-> GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| cat
|f |
1|
| cat
|m |
1|
| dog
|f |
1|
| dog
|m |
2|
+---------+------+----------+
Ou, se voc desejar o nmero de animais por sexo, que contenha valores conhecidos para
o sexo dos animais:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE sex IS NOT NULL
-> GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | f |
1|
| cat
|f |
1|
| cat
|m |
1|
| dog
|f |
1|
| dog
|m |
2|
| hamster | f |
1|
| snake | m |
1|
+---------+------+----------+
Usando mais que uma tabela
A tabela de animal de estimao guarda informaes dos animais de estimao que voc
tem. Se voc deseja registrar outra informao sobre eles, tal como eventos em suas
vidas, visitas ao veterinrio, voc necessita de outra tabela.
* Isto necessita conter o animal de estimao assim voc sabe que evento cada animal
participou.
* Isto necessita uma data assim voc sabe quando o evento ocorreu.
* Isto necessita um campo para descrever o evento.
* Se voc deseja ser capaz de classificar por cada evento.
Dado essas consideraes, crie a tabela com a declarao CREATE TABLE:
mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
-> type VARCHAR(15), remark VARCHAR(255));
Como com a tabela do animal de estimao, mais fcil carregar os registros iniciais
do que criar um arquivo de texto com tabulao delimitado, contendo a informao:
Fofo
1995-05-15
litter
4 kittens, 3 fmea, 1 masculino
Buffy
1993-06-23
litter
5 puppies, 2 fmea, 3 masculino
Buffy
1994-06-19
litter
3 puppies, 3 fmea
Chirpy
1999-03-21
vet
necessitado beak endireitado
Magro
1997-08-03
vet
quebrado rib
Bowser
1991-10-12
kennel
Presa
1991-10-12
kennel
Presa
1998-08-28
aniversrio
Deu ele um novo brinquedo mascado
Claws
1998-03-17
aniversrio
Deu ele um novo colarinho de pulga
Whistler
1998-12-09
aniversrio
Primeiro aniversrio
Carregue os registros:
mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;
Baseado no que voc j aprendeu nas perguntas, continuando na tabela de animal de
estimao, agora voc capaz de desempenhar recuperaes nos registros da tabela de
evento; os princpios so os mesmos. Mas quando a tabela de evento por si mesmo
insuficiente para responder as perguntas voc pde perguntar?
Suponha que deseja descobrir as idades de cada animal de estimao quando eles tiveram
suas crias. A tabela de evento indica quando isto ocorreu, mas para calcular a idade
da me, voc necessita a data de nascimento que est armazenado na tabela de animal de
estimao, voc necessita de ambas tabelas:
mysql> SELECT pet.name, (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, remark
-> FROM pet, event
-> WHERE pet.name = event.name AND type = "litter";
+--------+------+-----------------------------+
| name | age | remark
|
+--------+------+-----------------------------+
| Fluffy | 2.27 | 4 kittens, 3 female, 1 male |
| Buffy | 4.12 | 5 puppies, 2 female, 3 male |
| Buffy | 5.10 | 3 puppies, 3 female
|
+--------+------+-----------------------------+
H vrias coisas para notar sobre esta pergunta:
* A clusula FROM lista duas tabelas porque a pergunta necessita puxar informao de ambas.
* Quando combina informao de tabelas mltiplas, voc necessita registrar em uma
tabela que pode ser a unio do outro registro. Isto fcil porque ambos tem uma
coluna de nome. A clusula WHERE pergunta para as duas tabelas os valores do nome.
* A coluna de nome ocorre em ambas tabelas, voc deve ser especfico sobre que tabela
voc est se referindo coluna.
Voc tem duas tabelas diferentes para uni-las. s vezes isto til para unir
uma tabela para si mesmo, se voc deseja comparar registros em uma tabela com
outros registros naquela mesma tabela. Por exemplo, para encontrar o sexo
entre seus animais de estimao, voc pode unir a tabela de animal de estimao
com si mesmo para juntar os masculinos e as fmeas da mesma espcie:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
-> FROM pet AS p1, pet AS p2
-> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";
+--------+------+--------+------+---------+
| name | sex | name | sex | species |
+--------+------+--------+------+---------+
| Fluffy | f | Claws | m | cat
|
| Buffy | f | Fang | m | dog
|
| Buffy | f | Bowser | m | dog
|
+--------+------+--------+------+---------+
Obtendo informao sobre bancos de dados e tabelas
Se voc esquecer o nome de um banco de dados ou tabela, ou a estrutura de uma tabela
(como suas colunas so chamadas). MySQL resolve este problema atravs de vrias
declaraes que fornecem informao sobre os bancos de dados e tabelas.
Voc j viu SHOW DATABASES, que lista os bancos de dados administrados pelo servidor.
Para descobrir qual o banco de dados corrente foi selecionado, usa a funo DATABASES():
|
|
|
|
Field indica o nome de coluna, Type o tipo de dados, Null indica que no importa se
a coluna pode conter valores NULOS, Key indica que no importa se a coluna ordenada
e Default especifica valor de default da coluna.
Se ordenou uma tabela, SHOW INDEX FROM tbl_name produzimos informao sobre elas.
Usando MySQL em modo lote
Voc e o MySQL utilizaram entrar com as perguntas e ver os resultados. Voc tambm
pode tambm executar MySQL em modo lote. Para fazer isto, coloque os comandos que
voc deseja num arquivo, ento pea ao MySQL para ler a entrada do arquivo:
shell> mysql < batch-file
Se voc necessita especificar parmetros de conexo na linha de comando, use:
shell> mysql -h host -u user -p < batch-file
Enter password: ********
Quando usa este caminho no MySQL, voc est criando um arquivo de escrita, e o executa.
Por que usar uma escrita? Aqui so umas das poucas razes:
* Se voc corre um repeatedly de pergunta, fazendo isto numa escrita permite a voc
evitar o retyping a cada tempo que voc executar.
* Voc pode gerar novas perguntas de arquivos existentes que so parecidos, copiando
e editando arquivos de escrita.
* Modo Lote pode tambm ser til enquanto voc est desenvolvendo uma pergunta,
particularmente por comandos de linha mltiplas ou declaraes mltiplas de seqncias
de comandos.
* Se voc tem uma pergunta que produz uma sada, voc pode fazer que a sada ocorra
atravs de um pager:
shell> mysql < batch-file | more
* Voc pode pegar a sada em um arquivo para ser processado:
shell> mysql < batch-file > mysql.out
* Voc pode distribuir sua escrita para outras pessoas.
* Algumas situaes no levam em conta o uso interativo, por exemplo, quando voc faz
uma pergunta de um trabalho. Neste caso, voc deve usar modo lote.
O formato da sada de default diferente (mais conciso) quando voc pergunta ao MySQL
em modo de lote, usa isto interativamente. Por exemplo, a sada de espcie
+---------+
| species |
+---------+
| bird |
| cat
|
| dog
|
| hamster |
| snake |
+---------+
Quando vista em modo de lote:
cobra
hamster
co
gato
pssaro
espcie
Se voc deseja obter a sada interativa formatada em modo lote, use mysql -t. Para ecoar
sada os comandos que so executados, usam mysql -vvv.
Apostila de MySQL
1
3