Você está na página 1de 5

/*--------------------------------------------------------

BANCO DE DADOS I
Neste Script serao abordados conceitos de integridade
referencial. No Script anterior foi abordado DDL e DML
basicos.
Por Flavio Ramos
--------------------------------------------------------*/
/*--------------------------------------------------------
Criacao de Banco de Dados
----------------------------------------------------------*/
CREATE DATABASE dbclubes;
/* Selecionar o banco de dados no catalogo */
USE dbclubes;
/* Apagar um Banco de Dados use DROP DATABASE dbclubes */
/*--------------------------------------------------------
Criacao de Tabelas
----------------------------------------------------------*/
/*AUTO_INCREMENT - o campo sera incrementado a cada insercao;
UNIQUE - o campo apesar de nao ser chave nao sera duplicado;
NOT NULL - o campo nao pode ser deixado em branco; */
CREATE TABLE clube (
codigo INT AUTO_INCREMENT,
nome VARCHAR(40) NOT NULL UNIQUE,
uf VARCHAR(2) NOT NULL,
PRIMARY KEY(codigo)
) ENGINE = INNODB;
CREATE TABLE jogador (
codigo INT AUTO_INCREMENT,
nome VARCHAR(40) NOT NULL,
sobrenome VARCHAR(40) NOT NULL,
apelido VARCHAR(20),
datanasc DATE,
PRIMARY KEY(codigo)
) ENGINE = INNODB;
/* Associacao entre as tabelas de clube e jogador
FOREIGN KEY - especifica os campos da chave estrageira de
uma tabela, criando uma integridade referencial;
ON DELETE RESTRICT - a delecao nao eh permitida se houver
registros que dependem da chave. Caso a delecao seja
permitida entao o comando devera ser ON DELETE CASCADE;
Observacao - perceba que mesmo criando a chave primaria
composta, restricao de integridade eh dada pelo FOREIGN KEY;
--------------------------------------------------------*/
CREATE TABLE contrato (
codigoclube INT,
codigojogador INT,
datainicio DATE,
datafim DATE,
salario REAL,
imposto REAL,
PRIMARY KEY(codigoclube, codigojogador, datainicio),
FOREIGN KEY (codigoclube) REFERENCES
clube (codigo) ON DELETE RESTRICT,
FOREIGN KEY (codigojogador) REFERENCES
jogador (codigo) ON DELETE RESTRICT
) ENGINE = INNODB;

/* Povoamento da tabela clube


--------------------------------------------------------*/
INSERT INTO clube (nome, uf) VALUES ('FLAMENGO','RJ');
INSERT INTO clube (nome, uf) VALUES ('SAO PAULO','SP');
INSERT INTO clube (nome, uf) VALUES ('PALMEIRAS','SP');
INSERT INTO clube (nome, uf) VALUES ('GREMIO','RS');
INSERT INTO clube (nome, uf) VALUES ('RIVER','PI');
INSERT INTO clube (nome, uf) VALUES ('FLUMINENSE','RJ');
/* Exemplos de consulta
ORDER BY - ordena as colunas especificadas
A ordenacao pode ser ascendente ou decrescente, sendo a ascendente
o padrao assumido, caso nao se seja especificado
LIKE - faz uma pesquisa em parte do campo
% no inicio - seleciona tudo que termina com o criterio;
% no final - seleciona tudo que comeca com o criterio;
% no inicio e fim - seleciona tudo que contem o criterio.
--------------------------------------------------------*/
SELECT * FROM clube;
/*Povoamento da tabela jogador
--------------------------------------------------------*/
INSERT INTO jogador (nome, sobrenome, apelido, datanasc) VALUES ('MARCELO','LIMA
','MARCELINHO','1985-10-25');
INSERT INTO jogador (nome, sobrenome, apelido, datanasc) VALUES ('JOAO','PEDRO',
'PALHETA','1980-05-01');
INSERT INTO jogador (nome, sobrenome, apelido, datanasc) VALUES ('FREDERICO','NU
NES','FRED','1990-06-11');
INSERT INTO jogador (nome, sobrenome, apelido, datanasc) VALUES ('MARCO','HENRIQ
UE','','1989-12-03');
INSERT INTO jogador (nome, sobrenome, apelido, datanasc) VALUES ('ANTONIO',NULL,
'TONI','1989-07-13');
/*Povoamento da tabela contrato
--------------------------------------------------------*/
INSERT INTO contrato VALUES (1,1,'2009-01-01',NULL,5000.00,5.0);
INSERT INTO contrato VALUES (2,2,'2009-03-12',NULL,25000.00,20.0);
INSERT INTO contrato VALUES (1,3,'2009-03-12',NULL,30000.00,20.0);
/* Operadores de comparacao */
SELECT * FROM contrato WHERE SALARIO = 2000;
SELECT * FROM contrato WHERE SALARIO > 25000;
SELECT * FROM contrato WHERE SALARIO < 20000;
SELECT * FROM contrato WHERE SALARIO <= 20000;
SELECT * FROM contrato WHERE SALARIO >= 25000;
SELECT * FROM contrato WHERE SALARIO <> 25000;
/* Operadores Logicos */
SELECT * FROM contrato WHERE salario > 3000 AND salario < 5000;
SELECT * FROM contrato WHERE salario > 3000 OR salario < 5000;
SELECT * FROM contrato WHERE salario > 3000 AND (NOT imposto <> 5);
SELECT * FROM contrato WHERE salario
BETWEEN 3000 AND 6000;
/* Operacoes aritmeticas */
SELECT nome, salario - ((salario * imposto)/100)
AS 'Salario Liquido'
FROM contrato c, jogador j
WHERE c.codigojogador = j.codigo
ORDER BY 2 DESC
/* Comandos para alterar dados da tabelas */
UPDATE clube SET uf='PI' WHERE codigo = 1;
/* Observacao: se a condicao nao for colocada, todos
os registros sao alterados - MUITO CUIDADO!!! */
UPDATE jogador SET sobrenome='COSTA',apelido='JOCA' WHERE nome='JOAO';
/* Comandos para remover dados da tabela */
DELETE FROM clube WHERE uf = 'SP';
DELETE FROM jogador WHERE codigo = 4;
DELETE FROM jogador WHERE nome LIKE 'MAR%';
/* Observacao: se a condicao nao for colocada, todos
os registros serao deletados - MUITO CUIDADO!!! */
/*--------------------------------------------------------
OPERAÃ OES USANDO CONJUNTOS
----------------------------------------------------------*/
/* Criacao da tabela para teste de UNION, INTERSECT e MINUS
Observacao: O MySQL nao tem os comandos INTERSECT e MINUS */
CREATE TABLE clube2(
codigo INT AUTO_INCREMENT,
nome VARCHAR(50) NOT NULL,
uf VARCHAR(2) NOT NULL,
PRIMARY KEY (codigo)
);
/* Povoamento da tabela clube2 */
INSERT INTO clube2 (nome, uf) VALUES ('PALMEIRAS','SP');
INSERT INTO clube2 (nome, uf) VALUES ('4 DE JULHO','PI');
INSERT INTO clube2 (nome, uf) VALUES ('MOTOCLUBE','MA');
INSERT INTO clube2 (nome, uf) VALUES ('CEARA','CE');
INSERT INTO clube2 (nome, uf) VALUES ('FLUMINENSE','RJ');
INSERT INTO clube2 (nome, uf) VALUES ('VASCO','RJ');
INSERT INTO clube2 (nome, uf) VALUES ('FLAMENGO','RJ');
/* Uniao dos dados da consulta, eliminando dados repetidas */
SELECT nome FROM clube
UNION
SELECT nome FROM clube2
ORDER BY nome
/* Uniao dos dados da consulta, trazendo dados repetidos */
SELECT nome FROM clube
UNION ALL
SELECT nome FROM clube2
ORDER BY nome
/* Intersecao entre tabelas (Equivalente INTERSECT) */
SELECT nome FROM clube WHERE nome IN (SELECT nome FROM clube2);
/* Subtracao entre tabelas (Equivalente MINUS)*/
SELECT nome FROM clube WHERE nome NOT IN (SELECT nome FROM clube2);
/*----------------------------------------------------------
ALTERACAO DA ESTRUTURA DO BANCO DE DADOS - DDL
----------------------------------------------------------*/
/* Comando DDL para descrever a estrutura da tabela */
DESCRIBE jogador;
/* Adicionando colunas */
ALTER TABLE jogador ADD COLUMN endereco VARCHAR(80);
ALTER TABLE jogador ADD COLUMN fone CHAR(15);
/* AFTER - informa que a nova coluna sera inserida depois da especificada */
ALTER TABLE jogador ADD COLUMN email VARCHAR(80) AFTER nome;
/* Removendo colunas */
ALTER TABLE jogador DROP COLUMN email;
/* Alterando uma coluna - tamanho, tipo ou restricao */
ALTER TABLE jogador CHANGE COLUMN fone fone VARCHAR(30);
/* Renomeando uma coluna */
ALTER TABLE jogador CHANGE COLUMN fone telefone VARCHAR(30);
/* Valor inserido automaticamente na criacao do registro em caso de deixado
em branco. Para isso vamos alterar a a estrutura de jogador.
Apos alterar execute um DESCRIBE */
ALTER TABLE jogador ADD COLUMN pais VARCHAR(40) DEFAULT 'BRASIL';
/*Faca um comando de recuperacao para saber a idade de cada
jogador, trazendo o nome do jogador
--------------------------------------------------------*/
SELECT nome, YEAR(SUBTIME(NOW(),datanasc)) FROM jogador;
/*----------------------------------------------------------
INTEGRIDADE REFERENCIAL
----------------------------------------------------------*/
/*Exemplicar a restricao de unicidade de chave primaria */
INSERT INTO contrato VALUES (1,1,'2007-01-01','2019-11-10');
/*Exemplicar a restricao de integridade referencial */
INSERT INTO contrato VALUES (9,10,'2009-01-01',NULL,3000,5);
/*Apagar um registro - observar a integridade referencial
-------------------------------------------------------- */
DELETE FROM jogador WHERE codigo=1
/* Inserir um novo clube
observar a restricao de unicidade de coluna
-------------------------------------------------------- */
INSERT INTO clube (nome, uf) VALUES ('FLAMENGO','RJ');
/*----------------------------------------------------------
MAIS CONSULTAS AO BANCO DE DADOS
----------------------------------------------------------*/
/*Faca um comando de recuperacao para saber qual o jogador
mais velho de todos foi dado um apelido para o campo
calculado, para isso usado o comando AS;
--------------------------------------------------------*/
SELECT nome, MAX(YEAR(SUBTIME(NOW(),datanasc))) AS idade
FROM jogador;
/*Faca um comando de recuperacao para somar todas as idades
--------------------------------------------------------*/
SELECT SUM(YEAR(SUBTIME(NOW(),datanasc))) AS soma_idade
FROM jogador;
/*Recuperar todos os jogadores que nao tem contrato vencido.
Verifique que as relacoes entre as tabelas tem de ser feitas
pelas chaves, por isso a necessidade de conhecer o modelo
logico e ter um DER em maos;
--------------------------------------------------------*/
SELECT j.nome,cb.nome,ct.datafim
FROM jogador j, contrato ct, clube cb
WHERE j.codigo = ct.codigojogador AND
cb.codigo = ct.codigoclube AND
ct.datafim <= NOW()

Você também pode gostar