Você está na página 1de 125

Tutorial MySQL

Tutorial MySQL

Table of Contents
Projeto Linux......................................................1

Tutorial de MySQL.......................................................3

Conectando e desconectando do servidor..................................6

Entrando e perguntando.................................................18

Exemplos de perguntas comuns...........................................22

A fila da coluna com o nmero mximo...................................24

Mximo da coluna: por grupo e por valores..............................29

Usando chaves estrangeiras.............................................34

Pesquisando em duas chaves.............................................36

Criando e usando um banco de dados.....................................40

Selecionando um banco de dados.........................................43

Criando uma tabela.....................................................49

Carregando dados dentro uma tabela.....................................57

i
Tutorial MySQL

Table of Contents
Recuperando informao de uma tabela...................................66

Selecionando colunas particulares......................................71

Classificando filas....................................................76

Clculos de Data.......................................................86

Trabalhando com valores NULOS..........................................89

Unindo Modelo..........................................................99

Contando filas........................................................107

Usando mais que uma tabela............................................118

Usando MySQL em modo lote...........................................title

ii
Tutorial de 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, invoqueo com help:

shell> mysql help

Esta apostila assume que o MySQL est instalado em sua mquina, e que um
servidor de MySQL

Tutorial de MySQL 1
Tutorial MySQL

est disponvel para que possa conectar.

A apostila descreve o processo inteiro de como criar e usar um banco de


dados.

Tutorial de MySQL 2
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

Conectando e desconectando do servidor 3


Tutorial MySQL

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.20alog

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:

Conectando e desconectando do servidor 4


Tutorial MySQL

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

Na maioria dos exemplos nas seguintes sees, assumem que voc est
conectado ao servidor.

Eles indicam isto por: mysql> prompt.

Conectando e desconectando do servidor 5


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.20alog | 19990319 |

Entrando e perguntando 6
Tutorial MySQL

+++

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


pontoevrgula.

(H algumas excees onde um pontoevrgula 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

Entrando e perguntando 7
Tutorial MySQL

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;

Entrando e perguntando 8
Tutorial MySQL

Aqui outra pergunta. Isto demonstra que voc pode usar MySQL como uma
simples calculadora:

mysql> SELECT SIN(PI()/4), (4+1)*5;

+++

| SIN(PI()/4) | (4+1)*5 |

+++

| 0.707107 | 25 |

+++

Os comandos mostrados tm estado relativamente em declaraes de linhas


nicas e curtas.

Voc pode at mesmo entrar com declaraes mltiplas em uma nica linha.

Entrando e perguntando 9
Tutorial MySQL

Somente termine cada uma com um pontoevrgula.

mysql> SELECT VERSION(); SELECT NOW();

++

| version() |

++

| 3.22.20alog |

++

++

| NOW() |

++

| 19990319 00:15:33 |

++

Entrando e perguntando 10
Tutorial MySQL

Um comando dado todo em uma nica linha, assim como comandos compridos
que requerem vrias

linhas, no tem nenhum problema. MySQL determina que sua declarao


termina por um

pontoevrgula, e no, o fim de uma linha de entrada.

Aqui uma simples declarao de linha mltipla:

mysql> SELECT

> USER()

> ,

> CURRENT_DATE;

+++

| USER() | CURRENT_DATE |

+++

| joesmith@localhost | 19990318 |

+++

Entrando e perguntando 11
Tutorial MySQL

Neste exemplo, note como o prompt muda de mysql> para > depois que entra
com a pergunta na

primeira linha de uma linha mltipla. MySQL indica que no tem uma
declarao completa e

est esperando o resto. O prompt seu amigo, porque ele fornece retorno
valioso.

Se voc usa aquele retorno, voc sempre estar atento do que MySQL est
esperando.

Se voc decide no executar mais nenhum comando que est no processo de


entrada, cancele

isto, digitando \c

mysql> SELECT

> USER()

> \c

mysql>

Note tambm aqui, o prompt. Isto muda o retorno para mysql> depois que
voc digita \c,

Entrando e perguntando 12
Tutorial MySQL

MySQL indica o retorno e que est pronto para um novo comando.

A seguinte tabela mostra cada um dos prompts que pode ser visto e resume
que estado

o MySQL est:

Prompt

Significado

mysql>

Pronto para um novo comando

>

Esperando para prxima linha de linha mltipla de comando

'>

Esperando para prxima linha, colecionando um fio que comea com uma
citao nica ("'")

">

Esperando para prxima linha, colecionando um fio que comea com uma
citao duplicada (""")

Entrando e perguntando 13
Tutorial MySQL

Linhas mltiplas de declaraes comuns ocorrem por acaso, quando voc


pretende emitir

um comando em uma nica linha, mas esquece o pontoevrgula. Neste caso,


MySQL espera

para mais entrada:

mysql> SELECT USER()

>

Se isto acontecer (voc pensa que entrou com uma declarao mas a
unicamente

a resposta um > prompt), mas provavelmente, MySQL est esperando o


pontoevrgula.

Entre com um pontoevrgula para completar a declarao, e MySQL


executar:

mysql> SELECT USER()

Entrando e perguntando 14
Tutorial MySQL

> ;

++

| USER() |

++

| joesmith@localhost |

++

O '> e "> prompts ocorrem durante coleo de fio. No MySQL, pode escrever
fios

circundados por um "'" ou """ caracteres (por exemplo, 'hello' ou


"adeus"), e MySQL

deixa que voc entre com os fios que transpem linhas mltiplas. Quando
voc v um '> ou

"> prompt, este meio que tem de entrar com uma linha contendo um fio que
comea com

caracteres: "'" ou "", no tem ainda que entrar com a citao que termina
o fio.

Seria bom se est realmente entrando com uma linha mltipla de fio, mas
como provavelmente

Entrando e perguntando 15
Tutorial MySQL

isso? Mais freqentemente, o '> e "> prompts indicam que voc descuidou
e deixou fora um

caracter de citao. Por exemplo:

mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;

">

Se voc ao entrar com a declarao SELECT, ele acessa, volta e se voc


ficar esperando

o resultado e nada acontecer, ao invs de admirar, note a pista fornecida


pelo "> prompt.

Isto diz que MySQL est esperando ver o final de um fio.

Neste ponto, o que deve ser feito? simples, s cancelar o comando.


Entretanto,

no pode ser somente \c, porque MySQL interpreta isto, como a separao
do fio que est

colecionando. Ao invs, de entrar somente com o fechamento de caracter


(assim MySQL saber que

voc terminou o fio), entre com "\c:

Entrando e perguntando 16
Tutorial MySQL

mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;

"> "\c

mysql>

As mudanas do prompt retornam para mysql>, indicando que MySQL est


pronto para um novo

comando.

Isto importante, para saber o que '> e "> prompts expressam, porque se
voc entrar

incorretamente com um fio, mais alm, voc digita a vontade e parece que
MySQL ignorou,

incluindo uma linha contendo QUIT, isto pode ser completamente confuso,
se voc no sabe

o que necessita para fornecer a citao de trmino antes que possa


cancelar o comando corrente.

Entrando e perguntando 17
Exemplos de perguntas comuns

Aqui segue exemplos de como resolver alguns dos problemas mais comuns do
MySQL.

Algum dos exemplos usam a tabela de compras, coloque os preos de cada


artigo (nmero de item)

de cada negociante. Supondo que cada negociante tem um preo fixo por
artigo, ento

(item, negociante) uma chave primria aos registros.

Voc pode criar a tabela de exemplo como:

CREATE TABLE shop (

article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,

dealer CHAR(20) DEFAULT '' NOT NULL,

price DOUBLE(16,2) DEFAULT '0.00' NOT NULL,

PRIMARY KEY(article, dealer));

Exemplos de perguntas comuns 18


Tutorial MySQL

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 |

Exemplos de perguntas comuns 19


Tutorial MySQL

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

++

Exemplos de perguntas comuns 20


Tutorial MySQL

Exemplos de perguntas comuns 21


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 subquery:

SELECT article, dealer, price

FROM shop

WHERE price=(SELECT MAX(price) FROM shop)

No MySQL (ainda no faz uma subseleo) 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

A fila da coluna com o nmero mximo 22


Tutorial MySQL

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.

A fila da coluna com o nmero mximo 23


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 |

Mximo da coluna: por grupo e por valores 24


Tutorial MySQL

+++

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 subquery:

SELECT article, dealer, price

FROM shop s1

WHERE price=(SELECT MAX(s2.price)

FROM shop s2

WHERE s1.article = s2.article)

Mximo da coluna: por grupo e por valores 25


Tutorial MySQL

No MySQL melhor ser feito em vrios passos:

1. Obtenha a lista de artigo e preo mximo.

2. Para cada artigo obtenha as filas correspondentes que tm o preo


mximo armazenado.

Isto pode ser facilmente feito com uma tabela temporria:

CREATE TEMPORARY TABLE tmp (

article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,

price DOUBLE(16,2) DEFAULT '0.00' NOT NULL);

LOCK TABLES article read;

INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;

Mximo da coluna: por grupo e por valores 26


Tutorial MySQL

SELECT article, dealer, price FROM shop, tmp

WHERE shop.article=tmp.article AND shop.price=tmp.price;

UNLOCK TABLES;

DROP TABLE tmp;

Se voc usar uma tabela TEMPORRIA, voc deve tambm fechar o "tmp"
tabela.

"Isto pode ser feito com uma pergunta nica?"

Sim, mas pode usar um truque ineficiente que chamado de "MAXCONCAT


trick":

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

Mximo da coluna: por grupo e por valores 27


Tutorial MySQL

FROM shop

GROUP BY article;

++++

| article | dealer | price |

++++

| 0001 | B | 3.99 |

| 0002 | A | 10.99 |

| 0003 | C | 1.69 |

| 0004 | D | 19.95 |

++++

Mximo da coluna: por grupo e por valores 28


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.

CREATE TABLE persons (

id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

name CHAR(60) NOT NULL,

PRIMARY KEY (id)

);

Usando chaves estrangeiras 29


Tutorial MySQL

CREATE TABLE shirts (

id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

style ENUM('tshirt', 'polo', 'dress') NOT NULL,

color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,

owner SMALLINT UNSIGNED NOT NULL REFERENCES persons,

PRIMARY KEY (id)

);

INSERT INTO persons VALUES (NULL, 'Antonio Paz');

INSERT INTO shirts VALUES

(NULL, 'polo', 'blue', LAST_INSERT_ID()),

(NULL, 'dress', 'white', LAST_INSERT_ID()),

(NULL, 'tshirt', 'blue', LAST_INSERT_ID());

Usando chaves estrangeiras 30


Tutorial MySQL

INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska');

INSERT INTO shirts VALUES

(NULL, 'dress', 'orange', LAST_INSERT_ID()),

(NULL, 'polo', 'red', LAST_INSERT_ID()),

(NULL, 'dress', 'blue', LAST_INSERT_ID()),

(NULL, 'tshirt', 'white', LAST_INSERT_ID());

SELECT * FROM persons;

+++

| id | name |

+++

| 1 | Antonio Paz |

| 2 | Lilliana Angelovska |

+++

Usando chaves estrangeiras 31


Tutorial MySQL

SELECT * FROM shirts;

+++++

| id | style | color | owner |

+++++

| 1 | polo | blue | 1 |

| 2 | dress | white | 1 |

| 3 | tshirt | blue | 1 |

| 4 | dress | orange | 2 |

| 5 | polo | red | 2 |

| 6 | dress | blue | 2 |

| 7 | tshirt | white | 2 |

+++++

SELECT s.* FROM persons p, shirts s

WHERE p.name LIKE 'Lilliana%'

AND s.owner = p.id

Usando chaves estrangeiras 32


Tutorial MySQL

AND s.color <> 'white';

+++++

| id | style | color | owner |

+++++

| 4 | dress | orange | 2 |

| 5 | polo | red | 2 |

| 6 | dress | blue | 2 |

+++++

Usando chaves estrangeiras 33


Pesquisando em duas chaves

MySQL ainda no faz, pesquisa com duas chaves diferentes combinadas com
OR

(Pesquisando com uma chave OR em diferentes partes bem melhor):

SELECT field1_index, field2_index FROM test_table WHERE field1_index =


'1'

OR field2_index = '1'

No momento, voc pode resolver isto com muita eficincia, usando uma
tabela TEMPORRIA;

Este tipo de otimizao tambm muito boa se voc est usando muitas
perguntas

complicadas onde o servidor do SQL faz as otimizaes no pedido errado.

CREATE TEMPORARY TABLE tmp

Pesquisando em duas chaves 34


Tutorial MySQL

SELECT field1_index, field2_index FROM test_table WHERE field1_index =


'1';

INSERT INTO tmp

SELECT field1_index, field2_index FROM test_table WHERE field2_index =


'1';

SELECT * from tmp;

DROP TABLE tmp;

Acima est o caminho para resolver a pergunta com efeito de unio de duas
perguntas.

Pesquisando em duas chaves 35


Criando e usando um banco de dados

Agora que voc j sabe como entrar com os comandos, isto , como acessar
um banco de dados.

Suponha que voc tenha vrios animais de estimao em sua casa e tem
vontade de

guardar vrios tipos de informaes sobre eles. Voc pode fazer isto,
criando tabelas

para guardar seus dados e carreglas com informaes desejada. Ento


voc pode responder

vrias perguntas de diferentes tipos sobre seus animais recuperando os


dados das tabelas.

Esta seo mostra:

* Como criar um banco de dados

* Como criar uma tabela

* Como carregar dados dentro a tabela

* Como recuperar dados da tabela em vrios caminhos

* Como usar tabelas mltiplas

Criando e usando um banco de dados 36


Tutorial MySQL

A vantagem de um banco de dados simples, pense em situaes do mundo


real em que um banco

de dados pde ser utilizado. Por exemplo, um banco de dados pode ser
utilizado por um

fazendeiro para guardar dados da criao, ou por um mdico para guardar


dados de registros

dos pacientes.

Use a declarao SHOW para descobrir que bancos de dados existem no


servidor:

mysql> SHOW DATABASES;

++

| Database |

++

| mysql |

| test |

| tmp |

Criando e usando um banco de dados 37


Tutorial MySQL

++

A lista de bancos de dados est provavelmente diferente em sua mquina,


mas o MySQL

testa os bancos de dados que esto provavelmente dentro dele. O banco de


dados mysql

requerido porque isto descreve os privilgios de acesso do usurio. O


banco de dados test

freqentemente fornecido como um workspace aos usurios para tentar


coisas fora.

Se o banco de dados de test existe, tenta acessar:

mysql> USE test

Database changed

Note que USE, QUIT, no requerem um pontoevrgula. (Voc pode terminar


tais declaraes

com um pontoevrgula) A declarao USE tambm especial em outro


caminho: isto devese

Criando e usando um banco de dados 38


Tutorial MySQL

a dar em uma nica linha.

Voc pode usar o banco de dados test com os exemplos que seguem, mas se
voc criar algo no

banco de dados, pode ser removido por qualquer um que tenha acesso. Por
esta razo, voc

deveria pedir ao seu administrador do MySQL, permisso para usar um banco


de dados.

Suponha que voc deseja chamar seu menagerie. O administrador necessita


executar um comando:

mysql> GRANT ALL ON menagerie.* TO your_mysql_name;

onde your_mysql_name o nome do usurio do MySQL designado a voc.

Criando e usando um banco de dados 39


Selecionando um banco de dados

Se o administrador criar para voc seu banco de dados com suas


permisses, voc pode

comear a uslo. De outro modo, voc mesmo necessita crilo.

mysql> CREATE DATABASE menagerie;

Sob Unix, nomes de banco de dados so caso sensvel (diferente de


palavras chaves do SQL),

assim voc deve sempre referir para seu banco de dados como menagerie,
no como Menagerie,

MENAGERIE ou alguma outra variante. Isto tambm vale para nomes de


tabela. (Sob o Windows,

esta restrio no aplica, embora voc deva referirse a bancos de dados


e tabelas usando o

mesmo lettercase por toda pergunta dada.)

Criando um banco de dados, voc no o seleciona para uso, deve fazer isto

Selecionando um banco de dados 40


Tutorial MySQL

explicitamente.

Para fazer o menagerie do banco de dados corrente, use este comando:

mysql> USE menagerie

Database changed

Seu banco de dados necessita ser criado uma unicamente vez, mas deve
selecionlo 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

Selecionando um banco de dados 41


Tutorial MySQL

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.

Selecionando um banco de dados 42


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

Criando uma tabela 43


Tutorial MySQL

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,

Criando uma tabela 44


Tutorial MySQL

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

Criando uma tabela 45


Tutorial MySQL

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;

++

Criando uma tabela 46


Tutorial MySQL

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

Criando uma tabela 47


Tutorial MySQL

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

Criando uma tabela 48


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: YYYYMMDD; pode ser


diferente do que

utilizado.)

Nome

Dono

Espcie

Sexo

Nascimento

Morte

Carregando dados dentro uma tabela 49


Tutorial MySQL

Fofo

Harold

gato

19930204

Claws

Gwen

gato

19940317

Buffy

Harold

co

Carregando dados dentro uma tabela 50


Tutorial MySQL

19890513

Presa

Benny

co

19900827

Bowser

Diane

co

19980831

19950729

Chirpy

Gwen

Carregando dados dentro uma tabela 51


Tutorial MySQL

pssaro

19980911

Whistler

Gwen

pssaro

19971209

Magro

Benny

cobra

19960429

Carregando dados dentro uma tabela 52


Tutorial MySQL

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

representlos em seu arquivo de texto, use \N. Por exemplo, o registro


do pssaro:

Whistler

Gwen

Carregando dados dentro uma tabela 53


Tutorial MySQL

Pssaro

\N

19971209

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

Carregando dados dentro uma tabela 54


Tutorial MySQL

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','19990330',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

Carregando dados dentro uma tabela 55


Tutorial MySQL

inserir seus registros inicialmente usando vrias declaraes de INSERT


em vez de

uma nica declarao de LOAD DATA.

Carregando dados dentro uma tabela 56


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

Recuperando informao de uma tabela 57


Tutorial MySQL

filas devem

satisfazer para recuperao qualificada.

Selecionando todos os dados

A forma simples de recuperar tudo de uma tabela SELECT:

mysql> SELECT * FROM pet;

+++++++

| name | owner | species | Sex | birth | death |

Recuperando informao de uma tabela 58


Tutorial MySQL

+++++++

| Fluffy | Harold | cat | f | 19930204 | NULL |

| Claws | Gwen | cat | m | 19940317 | NULL |

| Buffy | Harold | dog | f | 19890513 | NULL |

| Fang | Benny | dog | m | 19900827 | NULL |

| Bowser | Diane | dog | m | 19980831 | 19950729 |

| Chirpy | Gwen | bird | f | 19980911 | NULL |

| Whistler | Gwen | bird | NULL | 19971209 | NULL |

| Slim | Benny | snake | m | 19960429 | NULL |

| Puffball | Diane | hamster | f | 19990330 | NULL |

+++++++

Este comando SELECT til se voc desejar rever sua tabela inteira. Isto
acontece

quando a sada revela um erro em seu arquivo de dados: Bowser parece


nascer depois

Recuperando informao de uma tabela 59


Tutorial MySQL

que ele morreu! Consultando seus papis do pedigree originais, voc


encontra que o

ano de nascimento correto 1989, no 1998.

Existe no mnimo um par de caminhos para fixar:

* Edite o arquivo "pet.txt" para corrigir o erro, ento esvazie a tabela


e recarregue

usando DELETE LOAD DATA:

mysql> DELETE FROM pet;

mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;

Entretanto, se voc fez isto, voc tambm deve dar uma reentrada no
registro do Puffball.

* Fixe unicamente o registro errneo com uma declarao de UPDATE :

mysql> UPDATE pet SET birth = "19890831" WHERE name = "Bowser";

Recuperando informao de uma tabela 60


Tutorial MySQL

Como mostrado acima, isto fcil para recuperar uma tabela inteira.

Selecionando filas particulares

Voc pode selecionar unicamente filas particulares de sua tabela. Por


exemplo, se

voc deseja verificar a mudana que voc fez na data de nascimento do


Bowser, selecione

o registro do Bowser:

mysql> SELECT * FROM pet WHERE name = "Bowser";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Bowser | Diane | dog | m | 19890831 | 19950729 |

Recuperando informao de uma tabela 61


Tutorial MySQL

+++++++

A sada confirma que agora o ano est corretamente registrado como 1989 e
no 1998.

Comparaes de fio so normalmente casos insensveis, assim voc pode


especificar o

nome como "bowser", "BOWSER", etc. A pergunta a mesma.

Voc pode especificar condies em qualquer coluna, no somente no nome.


Por exemplo,

se voc deseja saber que animais nasceram depois 1998, teste a coluna de
nascimento:

mysql> SELECT * FROM pet WHERE birth >= "199811";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Chirpy | Gwen | bird | f | 19980911 | NULL |

| Puffball | Diane | hamster | f | 19990330 | NULL |

Recuperando informao de uma tabela 62


Tutorial MySQL

+++++++

Voc pode combinar condies, por exemplo, para localizar os ces


femininos:

mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Buffy | Harold | dog | f | 19890513 | NULL |

+++++++

A pergunta precedente usa operador lgico AND. Existe tambm o operador


OR:

mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";

+++++++

Recuperando informao de uma tabela 63


Tutorial MySQL

| name | owner | species | sex | birth | death |

+++++++

| Chirpy | Gwen | bird | f | 19980911 | NULL |

| Whistler | Gwen | bird | NULL | 19971209 | NULL |

| Slim | Benny | snake | m | 19960429 | NULL |

+++++++

mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")

> OR (species = "dog" AND sex = "f");

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Claws | Gwen | cat | m | 19940317 | NULL |

| Buffy | Harold | dog | f | 19890513 | NULL |

+++++++

Recuperando informao de uma tabela 64


Tutorial MySQL

AND e OR podem ser misturados. Isto uma boa idia para usar parnteses
para indicar

que condies deveriam ser agrupados:

Recuperando informao de uma tabela 65


Selecionando colunas particulares

Se voc no deseja ver filas inteiras de sua tabela, somente especifique


as colunas

em que est interessado, separadas por vrgulas. Por exemplo, se voc


deseja saber

quando seus animais nasceram, selecionam o nome e colunas de nascimento:

mysql> SELECT name, birth FROM pet;

+++

| name | birth |

+++

| Fluffy | 19930204 |

| Claws | 19940317 |

| Buffy | 19890513 |

| Fang | 19900827 |

| Bowser | 19890831 |

Selecionando colunas particulares 66


Tutorial MySQL

| Chirpy | 19980911 |

| Whistler | 19971209 |

| Slim | 19960429 |

| Puffball | 19990330 |

+++

Para descobrir quem possui animais de estimao, use esta pergunta:

mysql> SELECT owner FROM pet;

++

| owner |

++

| Harold |

| Gwen |

| Harold |

Selecionando colunas particulares 67


Tutorial MySQL

| Benny |

| Diane |

| Gwen |

| Gwen |

| Benny |

| Diane |

++

Entretanto, note que a pergunta simplesmente recupera o campo do dono de


cada registro,

e algum deles aparece mais de uma vez. Para diminuir a sada, recuperar e
registrar

somente uma vez use a palavra chave DISTINCT:

mysql> SELECT DISTINCT owner FROM pet;

++

| owner |

Selecionando colunas particulares 68


Tutorial MySQL

++

| Benny |

| Diane |

| Gwen |

| Harold |

++

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 |

++++

Selecionando colunas particulares 69


Tutorial MySQL

| Fluffy | cat | 19930204 |

| Claws | cat | 19940317 |

| Buffy | dog | 19890513 |

| Fang | dog | 19900827 |

| Bowser | dog | 19890831 |

++++

Selecionando colunas particulares 70


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 | 19890513 |

Classificando filas 71
Tutorial MySQL

| Bowser | 19890831 |

| Fang | 19900827 |

| Fluffy | 19930204 |

| Claws | 19940317 |

| Slim | 19960429 |

| Whistler | 19971209 |

| Chirpy | 19980911 |

| Puffball | 19990330 |

+++

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;

+++

Classificando filas 72
Tutorial MySQL

| name | birth |

+++

| Puffball | 19990330 |

| Chirpy | 19980911 |

| Whistler | 19971209 |

| Slim | 19960429 |

| Claws | 19940317 |

| Fluffy | 19930204 |

| Fang | 19900827 |

| Bowser | 19890831 |

| Buffy | 19890513 |

+++

Voc pode classificar colunas mltiplas. Por exemplo, para classificar


por tipo de

Classificando filas 73
Tutorial MySQL

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 | 19980911 |

| Whistler | bird | 19971209 |

| Claws | cat | 19940317 |

| Fluffy | cat | 19930204 |

| Fang | dog | 19900827 |

| Bowser | dog | 19890831 |

| Buffy | dog | 19890513 |

| Puffball | hamster | 19990330 |

Classificando filas 74
Tutorial MySQL

| Slim | snake | 19960429 |

++++

Note que a palavra chave DESC aplica unicamente coluna (nascimento);


valores de

espcie so classificados por ordem crescente.

Classificando filas 75
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 |

Clculos de Data 76
Tutorial MySQL

| 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

Clculos de Data 77
Tutorial MySQL

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 |

Clculos de Data 78
Tutorial MySQL

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

Clculos de Data 79
Tutorial MySQL

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

Clculos de Data 80
Tutorial MySQL

+++++

| name | birth | death | age |

+++++

| Bowser | 19890831 | 19950729 | 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):

Clculos de Data 81
Tutorial MySQL

mysql> SELECT name, birth, MONTH(birth) FROM pet;

++++

| name | birth | MONTH(birth) |

++++

| Fluffy | 19930204 | 2 |

| Claws | 19940317 | 3 |

| Buffy | 19890513 | 5 |

| Fang | 19900827 | 8 |

| Bowser | 19890831 | 8 |

| Chirpy | 19980911 | 9 |

| Whistler | 19971209 | 12 |

| Slim | 19960429 | 4 |

| Puffball | 19990330 | 3 |

++++

Clculos de Data 82
Tutorial MySQL

Descobrindo animais com aniversrios no prximo ms fcil, tambm.


Suponha o ms

corrente abril. Ento o valor de ms 4 e voc espera animais nascidos


no ms de

maio (ms 5):

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;

+++

| name | birth |

+++

| Buffy | 19890513 |

+++

H uma pequena complicao se o ms corrente dezembro. Voc no faz


somente a soma

do nmero do ms (12) e espera animais produzidos em ms 13, porque no


h tal ms.

Voc espera animais produzidos em janeiro (ms 1).

Clculos de Data 83
Tutorial MySQL

Voc pode at mesmo escrever a pergunta de modo que isto trabalhe com
nenhuma matria

do ms corrente. Aquele caminho que voc no tem que usar um nmero de


ms particular

na pergunta. DATE_ADD() permite voc somar um intervalo do tempo para uma


data dada.

Se voc soma um ms ao valor de NOW(), ento o ms desfazse MONTH(), o


resultado

produzido o ms em que espervamos os aniversrios:

mysql> SELECT name, birth FROM pet

> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));

Um caminho diferente para efetuar a mesma tarefa somar 1 para obter o


prximo ms

depois o ms corrente:

mysql> SELECT name, birth FROM pet

Clculos de Data 84
Tutorial MySQL

> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;

Note que MS volta um nmero entre 1 e 12. e MOD(alguma coisa,12) volta


um nmero

entre 0 e 11. Assim a adio tem que estar depois de MOD() de outra
maneira ns

poderamos ir de Novembro (11) para Janeiro (1).

Clculos de Data 85
Trabalhando com valores NULOS

O valor NULL pode ser surpreendente at voc se acostumar a isto.


Conceitualmente,

valores NULL so valores desconhecidos e isto tratado diferentemente


dos outros valores.

Para testar NULL, voc no pode usar os operadores de comparao de


aritmtica tal

como =, < ou !=. Para demonstrar isto, tenta a seguinte pergunta:

mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;

+++++

| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |

+++++

| NULL | NULL | NULL | NULL |

+++++

Trabalhando com valores NULOS 86


Tutorial MySQL

Claramente voc obtem nenhum resultado significativos destas comparaes.

Use o operadores IS NULL e IS NOT NULL:

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;

+++

| 1 IS NULL | 1 IS NOT NULL |

+++

| 0 | 1 |

+++

No MySQL, 0 so valores falsos e 1 so valores verdadeiros.

Este tratamento especial de NULL por que isto foi necessrio para
determinar

se os animais no estam mortos, usando death IS NOT NULL ao invs de


death != NULL.

Trabalhando com valores NULOS 87


Tutorial MySQL

Trabalhando com valores NULOS 88


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":

Unindo Modelo 89
Tutorial MySQL

mysql> SELECT * FROM pet WHERE name LIKE "b%";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Buffy | Harold | dog | f | 19890513 | NULL |

| Bowser | Diane | dog | m | 19890831 | 19950729 |

+++++++

Para encontrar nomes finalizando com "%fy":

mysql> SELECT * FROM pet WHERE name LIKE "%fy";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Fluffy | Harold | cat | f | 19930204 | NULL |

Unindo Modelo 90
Tutorial MySQL

| Buffy | Harold | dog | f | 19890513 | 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 | 19940317 | NULL |

| Bowser | Diane | dog | m | 19890831 | 19950729 |

| Whistler | Gwen | bird | NULL | 19971209 | NULL |

+++++++

Para encontrar nomes contendo extamente cinco caracteres, usam os


caracteres de modelo "_":

Unindo Modelo 91
Tutorial MySQL

mysql> SELECT * FROM pet WHERE name LIKE "_____";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Claws | Gwen | cat | m | 19940317 | NULL |

| Buffy | Harold | dog | f | 19890513 | 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).

Algumas caractersticas expresses regulares so:

* "." casa qualquer caracter nico.

Unindo Modelo 92
Tutorial MySQL

* Uma classe de caracter "[...]" une qualquer caracter dentro dos


suportes.

Por exemplo, "[abc]" une "a", "b" ou "c". Para especificar uma srie de
caracteres,

usam um trao. "[az]" une qualquer letra minscula, ao passo que "[09]"
une

qualquer dgito.

* "*" une zero ou mais solicitaes. Por exemplo, "x*" une qualquer
nmero de "x"

caracteres, "[09]*" une qualquer nmero de dgitos, e ".*" une qualquer


nmero de algo.

* Expresses Regulares so casos sensveis, mas voc pode usar uma classe
de caracter

para unir ambos lettercases. Por Exemplo, "[aA]" une letra minscula ou
maiscula "a"

e "[azAZ]" une qualquer letra em um caso ou outro.

* O modelo ocorre em qualquer parte na existncia do valor testado (


modelos do SQL

unem unicamente os valores inteiro).

Unindo Modelo 93
Tutorial MySQL

* Para ancorar um modelo de modo que isto deve unir o comeo ou trmino
da existncia

do valor testado, use "^" no comeo ou "$" no final do modelo.

Para trabalho de expresses regulares, as perguntas LIKE e REGEXP podem

ser usadas abaixo:

Para encontrar nomes que comeam com "b", para unir o comeo do nome

use "^" e "[bB]" para unir letra minscula com outra maiscula "b":

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Buffy | Harold | dog | f | 19890513 | NULL |

| Bowser | Diane | dog | m | 19890831 | 19950729 |

+++++++

Unindo Modelo 94
Tutorial MySQL

Para encontrar nomes finalizando com "fy" use e "$" para unir no final do
nome:

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Fluffy | Harold | cat | f | 19930204 | NULL |

| Buffy | Harold | dog | f | 19890513 | NULL |

+++++++

Para encontrar nomes contendo "w" use "[wW]" e para unir letra minscula

com outra maiscula "w":

mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";

Unindo Modelo 95
Tutorial MySQL

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Claws | Gwen | cat | m | 19940317 | NULL |

| Bowser | Diane | dog | m | 19890831 | 19950729 |

| Whistler | Gwen | bird | NULL | 19971209 | NULL |

+++++++

Um modelo de expresso regular ocorre em qualquer parte do valor, isto


no

necessrio uma pergunta prvia para colocar um wildcard no lado um do


outro

para obter a unio do valor inteiro, poderia ser utilizado um modelo do


SQL.

Para encontrar nomes contendo exatamente cinco caracteres, use "^" e "$"
para unir

o comeo e trmino do nome, e cinco expresses de ".":

Unindo Modelo 96
Tutorial MySQL

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Claws | Gwen | cat | m | 19940317 | NULL |

| Buffy | Harold | dog | f | 19890513 | NULL |

+++++++

Voc tambm podia escrever a pergunta prvia usando "{n}":

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";

+++++++

| name | owner | species | sex | birth | death |

+++++++

| Claws | Gwen | cat | m | 19940317 | NULL |

| Buffy | Harold | dog | f | 19890513 | NULL |

Unindo Modelo 97
Tutorial MySQL

+++++++

Unindo Modelo 98
Contando filas

Bancos de Dados so freqentemente utilizados para responder a pergunta,


"quantas vezes

faz um certo tipo de dados ocorrer em uma tabela?" Por exemplo, voc pde
querer

saber quantos animais de estimao voc tem, ou quantos animais de


estimao cada

dono tem, ou voc pde desejar desempenhar vrias espcies de censos em


seus animais.

Contando o nmero total de animais voc faz a mesma pergunta de "quantas


filas

tem na tabela de animal de estimao?" porque h um registro, por cada


animal de estimao.

A funo COUNT() conta o nmero de resultados no NULOS, assim a pergunta


para

contar seus de animais :

mysql> SELECT COUNT(*) FROM pet;

Contando filas 99
Tutorial MySQL

++

| COUNT(*) |

++

| 9 |

++

Mais, voc recuperou os nomes das pessoas que possuam animais de


estimao. Voc

pode usar COUNT() se voc deseja descobrir quantos animais de estimao


cada dono tem:

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;

+++

| owner | COUNT(*) |

+++

| Benny | 2 |

| Diane | 2 |

Contando filas 100


Tutorial MySQL

| Gwen | 3 |

| Harold | 2 |

+++

Note o uso de GROUP BY para agrupar juntamente todos os registros de cada


dono.

Sem isto, voc obtem uma mensagem de erro:

mysql> SELECT owner, COUNT(owner) FROM pet;

ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)

with no GROUP columns is illegal if there is no GROUP BY clause

COUNT() e AGROUP BY so teis para caracterizar seus dados em vrios


caminhos.

Os seguintes exemplos mostram caminhos diferentes para desempenhar


operaes de

censo animais.

Contando filas 101


Tutorial MySQL

Nmero de animais por espcie:

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;

+++

| species | COUNT(*) |

+++

| bird | 2 |

| cat | 2 |

| dog | 3 |

| hamster | 1 |

| snake | 1 |

+++

Nmero de animais por sexo:

Contando filas 102


Tutorial MySQL

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(*) |

Contando filas 103


Tutorial MySQL

++++

| 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"

Contando filas 104


Tutorial MySQL

> 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

Contando filas 105


Tutorial MySQL

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

++++

Contando filas 106


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,

Usando mais que uma tabela 107


Tutorial MySQL

> 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

19950515

litter

4 kittens, 3 fmea, 1 masculino

Buffy

19930623

litter

5 puppies, 2 fmea, 3 masculino

Buffy

19940619

litter

Usando mais que uma tabela 108


Tutorial MySQL

3 puppies, 3 fmea

Chirpy

19990321

vet

necessitado beak endireitado

Magro

19970803

vet

quebrado rib

Bowser

19911012

kennel

Presa

19911012

kennel

Usando mais que uma tabela 109


Tutorial MySQL

Presa

19980828

aniversrio

Deu ele um novo brinquedo mascado

Claws

19980317

aniversrio

Deu ele um novo colarinho de pulga

Whistler

19981209

aniversrio

Primeiro aniversrio

Carregue os registros:

Usando mais que uma tabela 110


Tutorial MySQL

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

Usando mais que uma tabela 111


Tutorial MySQL

> 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

Usando mais que uma tabela 112


Tutorial MySQL

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 unilas. 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";

Usando mais que uma tabela 113


Tutorial MySQL

++++++

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

Usando mais que uma tabela 114


Tutorial MySQL

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():

mysql> SELECT DATABASE();

++

| DATABASE() |

++

| menagerie |

++

Se voc no tem um banco de dados selecionado ainda, o resultado vazio.

Para descobrir que tabelas o banco de dados corrente contem ou quando


voc no est

seguro sobre o nome de uma tabela, use este comando:

Usando mais que uma tabela 115


Tutorial MySQL

mysql> SHOW TABLES;

++

| Tables in menagerie |

++

| event |

| pet |

++

Se voc deseja descobrir sobre a estrutura de uma tabela, o comando


DESCRIBE til;

isto exibe informao sobre cada coluna de uma tabela:

mysql> DESCRIBE pet;

+++++++

| Field | Type | Null | Key | Default | Extra |

+++++++

Usando mais que uma tabela 116


Tutorial MySQL

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

+++++++

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 mais que uma tabela 117


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 < batchfile

Se voc necessita especificar parmetros de conexo na linha de comando,


use:

shell> mysql h host u user p < batchfile

Enter password: ********

Usando MySQL em modo lote 118


Tutorial MySQL

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:

Usando MySQL em modo lote 119


Tutorial MySQL

shell> mysql < batchfile | more

* Voc pode pegar a sada em um arquivo para ser processado:

shell> mysql < batchfile > 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

Usando MySQL em modo lote 120


Tutorial MySQL

++

| species |

++

| bird |

| cat |

| dog |

| hamster |

| snake |

++

Quando vista em modo de lote:

cobra

hamster

co

gato

pssaro

Usando MySQL em modo lote 121


Tutorial MySQL

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

Usando MySQL em modo lote 122

Você também pode gostar