Slide 1 - Blog da Prof Andrea Garcia

Propaganda
Leandro Lago da Silva
Banco de Dados I
Técnico Integrado em Informática
MySQL e Esquemas
Usando
MySQL Query Browser
MySQL Console
2010
• PARTE I
2
• TIPOS DE DADOS
3
Principais tipos
•
•
•
INT (M) UNSIGNED ZEROFILL
FLOAT (M,D) UNSIGNED ZEROFILL
DOUBLE (M,D) UNSIGNED ZEROFILL
•
•
•
•
•
DECIMAL (M ,D) UNSIGNED ZEROFILL
BLOB (M)
CHAR (M)
VARCHAR (M)
TEXT (M)
•
•
•
•
DATE
DATETIME
TIME
YEAR (2|4)
•
•
ENUM
SET
4
Principais tipos Numéricos
•
INT (M) UNSIGNED ZEROFILL = INTEGER
– Signed: -2.147.483.648 a 2.147.483.647
– Unsigned: 0 a 4.294.967.295.
•
FLOAT (M,D) UNSIGNED ZEROFILL
– Single-precision: 7 casas decimais
• -3.402.823.466E+38
• 3.402.823.466E+38
•
DOUBLE (M,D) UNSIGNED ZEROFILL
– Double-precision: 15 casas decimais
• -1.7976931348623157E+308
• 1.7976931348623157E+308
•
DECIMAL (M ,D) UNSIGNED ZEROFILL
– Double armazenado em caracteres.
– Geralmente usado para valores monetários.
5
Principais tipos Textuais
•
BLOB (M)
– String usado para armazenamento de dados binários.
– 65535 caracteres.
– Case-sensitive: “texto” != “Texto”
•
CHAR (M)
– 255 caracteres
– Preenche espaços vazios com caracter espaço.
– Ex: CHAR(10)  Inserir “John”  “John “
•
VARCHAR (M)
– 255 caracteres
– Não preenche espaços vazios. (+ novo)
•
TEXT (M)
– String usado para armazenamento de dados textuais.
– Non Case-Sensitive: “texto” == “Texto”
6
Principais tipos de Data/Hora
•
DATE
– AAAA-MM-DD
 Exemplo: ‘2009-08-01’
– 1000-01-01 até 9999-12-31
•
DATETIME
– AAAA-MM-DD HH:MM:SS
– Exemplo: ‘2009-08-01 08:25:56’
– 1000-01-01 00:00:00 até 9999-12-31 23:59:59
•
TIME
– HH:MM:SS
 Exemplo: ’08:25:56’
– -838:59:59 até 838:59:59
•
YEAR (2|4)
– AAAA ou AA
– 1901 até 2155
7
Principais Tipos: Listas
•
ENUM
– Define lista de valores.
– Na inserção, campo deve assumir um dos valores.
• TABLE Pessoa (
nome VARCHAR(45) PRIMARY KEY,
sexo ENUM (‘M’, ‘F’)
);
• INSERT INTO Pessoa VALUES (‘Jane Dark’, ‘F’);
•
SET
– Define lista de valores.
– Na inserção, campo pode assumir zero ou mais valores.
• TABLE Filme (
nome VARCHAR(45) PRIMARY KEY,
genero SET (‘ação’, ‘terror’, ‘comédia’, ‘drama’, ‘romance’)
);
• INSERT INTO Pessoa VALUES (‘Resident Evil’, ‘ação, terror’);
8
Características dos tipos
• Algumas convenções no uso dos tipos
–M
• Indica o tamanho do campo
– Número de dígitos/letras
• Exemplo: INT (M), VARCHAR (M)
–D
• Aplicada aos tipos de ponto flutuante
• Indica o número de digitos após o ponto decimal.
Exemplo: FLOAT (M, D)
9
Características dos tipos
• Algumas convenções no uso dos tipos
– ZEROFILL
• Preenche o campo com zeros.
• Exemplo
– INT(6) ZEROFILL
– Inserir 8  000008
– UNSIGNED
• Só aceita valores positivos
– unsigned = sem sinal
• ZEROFILL assume automaticamente UNSIGNED.
10
• MYSQL CONSOLE
11
Para testar os códigos SQL
• Instalar MySQL
• Abrir console do Windows: “cmd.exe”
• Entrar no console do mysql:
– mysql --user=usuario --password=senha
– mysql -u usuario -p senha(abreviado)
– mysql -u usurario
(senha é pedida depois)
• Utilizar os SQL para
–
–
–
–
Criar e visualizar a estrutura de bases de dados
Criar e visualizar a estrutura de bases de tabelas
Inserir, remover e alterar dados nas tabelas.
Realizar consultas nas tabelas (relatórios).
12
Comandos console mysql
• show databases;
mostra bases de dados existentes
• use <nome da base>;
seleciona a base de dados a ser usada
• show tables;
mostra as tabelas contidas na base de dados selecionada
• describe <nome da tabela>;
mostra a estrutura da tabela dada
• source <caminho do arquivo de scripts>;
executa os scripts contidos no arquivo (pode ser “txt”)
13
• MySQL Query Browser
14
MS Query Browser
• Instalado no pacote “Gui Tools”
• Executa:
1 comando SQL (Resultset)
N comandos SQL (Script)
15
DDL (Data Definition Language)
Definindo esquemas (estrutura)
16
CREATE/DROP DATABASE
#cria base de dados
CREATE DATABASE hospital;
CREATE DATABASE `hospital`;
CREATE DATABASE IF NOT EXISTS hospital;
#seleciona base de dados (chamado após CREATE DATABASE)
USE hospital;
#remove base de dados
DROP DATABASE hospital;
DROP DATABASE `hospital`;
DROP DATABASE IF EXISTS hospital;
• No MySQL, cada Base de Dados é uma pasta:
C:\Arquivos de Programas\MySQL\MySQL
Server\data\hospital\
17
CREATE TABLE
CREATE TABLE
pac_rg
nome
idade
cidade
doenca
PRIMARY KEY
);
paciente (
int(10),
#inteiro de 10 dígitos
varchar(45), #string de 45 caracteres
int(10),
varchar(45),
varchar(45),
(pac_rg)
#chave primária (PK)
• No MySQL, cada Tabela é um arquivo:
C:\Arquivos de Programas\MySQL\MySQL
Server\data\hospital\...
18
CREATE/DROP TABLE
#renomeia tabela
RENAME TABLE paciente TO paciente2006;
#cria tabela com cautela
CREATE TABLE IF NOT EXISTS hospital;
#cria tabela com cautela
DROP TABLE IF EXISTS hospital;
OBS: as tabelas sempre devem ser destruídas na
ordem inversa que foram criadas por causa das
dependências de chaves estrangeiras.
19
PRIMARY KEY (PK)
CREATE TABLE telefone (
ddd
varchar(2),
numero
varchar(8),
tipo
int,
PRIMARY KEY (ddd, numero) # PK com N campos
);
CREATE TABLE
id
ddd
numero
tipo
);
paciente (
int PRIMARY KEY # PK com 1 campo
varchar(2),
varchar(8),
int
20
CONSTRAINTS (Restrições)
CREATE TABLE paciente (
pac_rg int(10) unsigned NOT NULL auto_increment,
nome
varchar(45) NOT NULL default ‘n/d’,
idade
int(3) unsigned default 18 zerofill,
cidade varchar(45) NOT NULL default ‘n/d’,
doenca varchar(45) NOT NULL default ‘n/d',
PRIMARY KEY
(pac_rg,nome)
);
•
•
•
•
Unsigned: não possui sinal (números positivos).
NULL: aceita valor null (padrão para todo campo caso deixe vazio).
NOT NULL: não pode ficar (NULL) na inserção do registro
Default: valor padrão, caso não seja especificado valor.
– Usada quando não queremos que null seja o valor padrão do campo.
•
•
•
AUTO_INCREMENT: incrementa em 1 o valor a cada novo registro.
PRIMARY KEY: indica os campos que são chave primária.
ZEROFILL: preenche com zeros à esquerda
21
FOREIGN KEY (FK)
CREATE TABLE transacao ( # tabela 1:1:1
cliente_cod
VARCHAR (20),
# PK FK
conta_cod
VARCHAR (10),
# PK FK
filial_cod
VARCHAR (5),
# FK
data
DATE,
tipo
VARCHAR(2),
valor
DECIMAL(12,2),
primary key (cliente_cod, conta_cod, data),
# FKs de tabelas diferente  declaração separada
FOREIGN KEY (cliente_cod)
REFERENCES cliente (cliente_cod),
FOREIGN KEY (conta_cod)
REFERENCES conta (conta_cod),
FOREIGN KEY (filial_cod)
REFERENCES filial (filial_cod)
);
22
FOREIGN KEY (FK)
CREATE TABLE cliente_tem_telefone (# tabela N:N
cliente_cod
int unsigned not null,
tel_ddd
int(3) zerofill,
tel_num
int(9) zerofill,
primary key (cod),
# FKs da mesma tabela  declaração única
FOREIGN KEY (tel_ddd, tel_num)
REFERENCES telefone (ddd, num)
);
23
TIPOS DE TABELAS
• Principais tipos de tabelas do MySQL
– MyISAM
• Ignora restrições de chaves estrangeiras
• Melhor desempenho
• Sem transação (operação atômica)
– InnoDB
• Verifica restrições de chaves estrangeiras
• Pior desempenho
• Com transação
24
FOREIGN KEY (FK)
CREATE TABLE cliente_tem_telefone (# tabela N:N
cliente_cod
int unsigned not null,
tel_ddd
int(3) zerofill,
tel_num
int(9) zerofill,
primary key (cod),
# FKs da mesma tabela  declaração única
FOREIGN KEY (tel_ddd, tel_num)
REFERENCES telefone (ddd, num)
)
Type=InnoDB;
ou...
Engine=InnoDB;
25
ALTER TABLE
ALTER TABLE tabela
ADD [ COLUMN ] coluna tipo [ restrição_de_coluna [ ... ] ]
ALTER TABLE cliente
ADD cliente_cod int unsigned not null,
ADD tel_ddd
int(3) zerofill,
ADD tel_num
int(9) zerofill
ALTER TABLE tabela
ALTER [ COLUMN ] coluna { SET DEFAULT valor | DROP DEFAULT
}
ALTER TABLE cliente ALTER obs SET default ‘Observações‘
ALTER TABLE cliente ALTER obs DROP default
ALTER TABLE cliente
RENAME obs TO observacao
26
Exercício
Crie e destrua todas as tabelas
• Ambulatorio(numero, andar, capacidade)
• Medico(cod, crm, nome, idade, data_nasc, especialidade, amb_numero)
• Paciente(cod, nome, idade, cidade)
• Consulta(med_cod pac_cod, data, hora, diagnostico)
• Funcionario(cod, nome, idade, cidade, salário, amb_numero)
OBS: a ordem de criação e destruição é importante.
27
DML (Data Manipulation Language)
Inserindo dados (povoamento)
28
INSERT INTO
CREATE TABLE pacientes (
pac_rg
int(10) unsigned NOT NULL auto_increment,
nome
varchar(45) NOT NULL default ‘’,
idade
int(10) unsigned default ‘0’,
cidade
varchar(45) default ‘’,
doenca
varchar(45) NOT NULL default ‘’,
sexo
enum(‘M’,’F’),
PRIMARY KEY (pac_rg,nome)
);
INSERT INTO pacientes
VALUES (12345,‘John Doe’,25,‘Sarandi’,‘Gripe’);
INSERT INTO pacientes (pac_rg, nome, doenca)
VALUES (12345, ‘John Doe’, ‘Gripe);
29
INSERT INTO
• Inserindo várias linhas de uma só vez.
INSERT INTO paciente VALUES
('1', 'Mac', '25', NULL , 'gripe', 'm'),
('2', 'Ana', '24', 'Peromba', 'osmose', ‘f'),
('3', 'Jane', '25', 'Pitomba', 'gripe', ‘f'),
('4', 'Marlos', '20', 'Amebópolis', 'fedor', 'm'),
('5', 'Clark', '27', 'Pequenópolis', 'criptonose', 'm'),
('6', 'Barlos', '34', NULL, 'resfriado', 'm'),
('7', 'Ada', '24', 'Racoon City', 'T-Virus', ‘f'),
('8', 'Clara', '20', 'Campo da Lagoa',‘cotovelose',‘f');
30
SELECT
CREATE TABLE pacientes (
pac_rg
int(10) unsigned NOT NULL auto_increment,
nome
varchar(45) NOT NULL default ‘’,
idade
int(10) unsigned default ‘0’,
cidade
varchar(45) default ‘’,
doenca
varchar(45) NOT NULL default ‘’,
sexo
enum(‘M’,’F’),
PRIMARY KEY (pac_rg,nome)
);
SELECT * FROM pacientes;
SELECT pac_rg, nome, idade FROM pacientes;
31
OBS: Relacionamentos
• Participação total
– FK precisa ser NOT NULL
• Se participação parcial
– FK pode ser NULL
• Os tipos importam no relacinamento
– FK deve ter mesmo tipo e restrições (exceto auto_increment) do
campo correspondente na tabela que cedeu o “impréstimo”.
• A ordem de criação importa:
– Só é possível referenciar tabelas anteriores.
• A ordem de destruição importa:
– Primeiro destruímos as tabelas com dependência.
– Dica: use a ordem inversa da criação das tabelas.
32
OBS: Erros do MySQL
• As mensagens de erro não são claras como em Pascal.
• Erros comuns:
– Erro de sintaxe “SINTAX ERROR...”
• Algo errado na SQL.
– Erro de criação de tabela “CAN’T CREATE...”
• Diferença de tipo entre PK e FK na outra tabela.
– Campo não existe “FIELD DOESN’T EXIST...”
• Campo não definido na SQL da tabela.
• Query Browser:
– Clique 2 vezes sobre o erro para ir à tabela errada.
33
Exercício
Crie e destrua todas as tabelas
• Ambulatorio(numero, andar, capacidade)
• Medico(cod, crm, nome, idade, data_nasc, especialidade, amb_numero)
• Paciente(cod, nome, idade, cidade)
• Consulta(med_cod pac_cod, data, hora, diagnostico)
• Funcionario(cod, nome, idade, cidade, salário, amb_numero)
OBS: a ordem de criação e destruição é importante.
34
• PARTE II
35
TABLE
CREATE DATABASE [IF NOT EXISTS] nome;
DROP DATABASE [IF EXISTS] nome;
CREATE TABLE [IF NOT EXISTS] tabela (
coluna características,
coluna características…);
DROP TABLE [IF EXISTS] tabela;
RENAME TABLE nome TO novo_nome;
36
PK e FK
• PRIMARY KEY(coluna1, coluna2);
• FOREIGN KEY (coluna1, coluna2)
REFERENCES <tabela>(coluna1,coluna2);
ON UPDATE ação
ON DELETE ação,
• Ação
– SET NULL: coloca NULL na FK
– SET DEFAULT: coloca o valor DEFAULT na FK
– CASCADE: passa a frente a operação
– NO ACTION: não altera valor da FK
– RESTRICT: não permite exclusão da PK
37
ALTER TABLE
ALTER TABLE tabela
ADD coluna restrições [FIRST | AFTER coluna]
MODIFY coluna restrições [FIRST | AFTER coluna]
CHANGE coluna novo_nome restrições
[FIRST | AFTER coluna]
RENAME TO novo_nome_tabela
// modifica nome da tabela
DROP coluna
38
ALTER TABLE
ALTER TABLE hospital.paciente
ADD COLUMN telefone VARCHAR(10)
AFTER doenca;
• Adicionando campo telefone
• O campo vai depois do campo doenca.
• Caso não tenhamos usado o comando “use hospital;”, será
preciso indicar a qual base de dados a tabela paciente
pertence, como demonstrado neste exemplo.
39
ALTER TABLE
ALTER TABLE paciente
DROP PRIMARY KEY,
ADD PRIMARY KEY(pac_rg, nome);
• Redefine a chave para os campos pac_rg e nome.
• A SQL primeiro remove (DROP PRIMARY KEY) as chaves e
depois define as novas (ADD PRIMARY KEY).
40
ALTER TABLE
ALTER TABLE paciente
ADD COLUMN cpf VARCHAR(11)AFTER telefone,
DROP PRIMARY KEY,
ADD PRIMARY KEY(pac_rg, nome, cpf);
• Adicionando campo CPF que passa a ser parte da chave primária
da tabela.
• A chave primária é redefinida neste exemplo de SQL.
41
ALTER TABLE
ALTER TABLE hospital.paciente
MODIFY COLUMN idade INTEGER UNSIGNED,
MODIFY COLUMN cidade VARCHAR(45);
• Modificando atributos dos campos ‘idade’ e
‘cidade’.
42
ALTER TABLE
ALTER TABLE cliente
DROP PRIMARY KEY,
DROP FOREIGN KEY (cep, rua, num),
ADD PRIMARY KEY (cpf),
ADD FOREIGN KEY (end_id)
REFERENCES end(id);
ALTER TABLE compra_produto # muda nome da tabela
RENAME TO item_compra;
ALTER TABLE compra_produto # muda nome da coluna
CHANGE codigo cod int unsigned;
43
• PARTE III
44
INSERT INTO
• Inserindo dados de outras tabelas com SELECT
INSERT INTO paciente(nome, idade, cidade, doenca)
SELECT nome, idade, cidade, 'resfriado'
FROM funcionario
WHERE idade > 25;
•
Inserindo na tabela paciente todos os funcionários
com mais de 25 anos.
45
DELETE FROM
• Removendo todos os pacientes.
DELETE FROM pacientes;
• Removendo todos os pacientes com resfriado.
DELETE FROM pacientes
WHERE doenca = ‘resfriado’;
• Removendo todos as consultas após 2005.
DELETE FROM pacientes
WHERE data >= ‘2005-01-01’;
DELETE FROM pacientes
WHERE YEAR(data) >= 2005;
46
DELETE FROM
• Removendo todos as consultas realizadas no intervalo do horário
comercial.
DELETE FROM pacientes
WHERE(hora>=’08:00’ AND hora=<’12:00’) OR
(hora>=’13:00’ AND hora=<’18:00’);
• Removendo todos as consultas realizadas fora do intervalo do
horário comercial.
DELETE FROM pacientes
WHERE NOT ((hora>=’08:00’ AND hora=<’12:00’) OR
(hora>=’13:00’ AND hora=<’18:00’));
47
DELETE FROM
• Removendo todos os pacientes com resfriado de Campo Mourão.
DELETE FROM pacientes
WHERE doenca = ‘resfriado’ AND
cidade = ‘campo mourao’;
• Nas buscas do MySQL não há distinção entre maiúsculas e minúsculas,
assim como ele também desconsidera os acentos.
• Em outros bancos:
DELETE FROM pacientes
WHERE UPPER(doenca) = ‘RESFRIADO’ AND
UPPER(cidade) = ‘CAMPO MOURÃO’;
• Pode-se usar os operadores OR, AND e NOT.
48
UPDATE
UPDATE tabela
SET coluna = valor/expressão
WHERE condição;
UPDATE tabela
SET coluna = CASE
WHEN condição THEN valor/expressão
WHEN condição THEN valor/expressão
WHEN condição THEN valor/expressão
ELSE valor/expressão
END;
49
UPDATE
UPDATE paciente
SET idade = idade * 12;
• Idade passa a ser armazenada em meses.
UPDATE funcionario
SET salario = salario * 1,5
WHERE funcao = ‘telefonista’;
• Aumentando em 50% o salário das telefonistas.
50
UPDATE
• UPDATE paciente
SET plano = ‘infantil’
WHERE year(nasc)>= 1998;
#(2008-10)=1998
• Define plano ‘infantil’ para pacientes de até 10 anos
• UPDATE paciente
SET plano = ‘infantil’
WHERE year(now()) – year(nasc) <= 10;
51
Funções de data/hora 1/2
• YEAR(data)
• DAY(data)
Retorna o ano
Retorna o mês (1-12)
Retorna o dia (1-31)
• HOUR(hora)
• MINUTE(hora)
• SECOND(hora)
Retorna hora (0-23)
Retorna minuto (0-59)
Retorna segundos(0-59)
• MONTH(data)
• OBS:Para testar estas funções use:
SELECT YEAR(‘2008-05-06);
52
Funções de data/hora 2/2
• DAYOFMONTH(data)
Mesmo que DAY(data)
• DAYOFWEEK(data)
Retorna: 1-7 (1=Domingo)
Retorna: 1-366
• DAYOFYEARY(data)
• NOW()
Retorna data + hora atual:
Ex: '2007-12-15 23:50:26'
• OBS:Para testar estas funções use:
SELECT YEAR(‘2008-05-06);
53
UPDATE
UPDATE locacao
SET atraso = TRUE,
debito = (diasLocacao–2) * 3 #R$3,00
WHERE diasLocacao > 2;
• Calculando valor (aproximado) para os clientes que não
devolveram um filme no prazo.
54
UPDATE
• Em duas partes:
UPDATE locacao
SET devendo = TRUE
WHERE diasLocacao > 2;
UPDATE locacao
SET debito = (diasLocacao–2) * 3
WHERE diasLocacao > 2;
55
UPDATE CASE
• Com condicional:
UPDATE funcionarios
SET salario = CASE
WHEN salario <= 1000
THEN salario * 1.20
ELSE salario * 1.10
END;
56
Exemplo
• Vários casos:
UPDATE funcionarios
SET salario = CASE
WHEN salario = 1000 THEN salario * 1.20
WHEN salario = 1500 THEN salario * 1.15
ELSE salario * 1.05
END;
57
58
MySQL
 Instalação
• Instalando MySQL
 Execução
• Auto-Executando como Windows Service
• Executando pelo console
 Utilização
• Usando MySQL shell
• Usando Query Browser
59
 Instalação
• Download
– Site: www.mysql.com
– MySQL Server 5
• Contêm MySQL Console
– MySQL GUI Tools (opcional)
• Documentação (BR e EN)
60
 Instalação
• Modo de instalação
– Instalar como Windows Service
• Carrega automático quando Windows abre
– Deixar para chamar manualmente
• Chamar por console ou Windows Explorer
61
 Execução (console)
• C:\Arquivots de Programas\
MySQL\MySQL Server 5.0\bin\mysqld-nt.exe
62
 Utilização
• Usando MySQL Shell
– Abrir outro console
mysql db_name ou
mysql --user=user_name --password=your_password db_name
63
 Utilização
• Usando Query Browser
64
 Utilização
• Usamos o Query Browser para
– Criar Base
– Criar Tabelas
•
•
•
•
Atributos
Chaves primárias (Primary Keys - PK)
Restrições (constraints)
Chaves estrangeiras (Foreign Keys - FK)
• Povoar banco
• Realizar consultas
65
 MySQL Query Browser
66
Download