Вы находитесь на странице: 1из 31

/* A05 */

/* Modelagem basica */

CLIENTE

NOME CARACTER(30)
CPF NUMERICO(11)
EMAIL CARACTER(30)
TELEFONE CARACTER(30)
SEXO CARACTER(1)
ENDERECO CARACTER(100)

/*PROCESSOS DE MODELAGEM */

/* ADM DE DADOS */

MODELAGEM CONCEITUAL - RASCUNHO 01

MODELAGEM LOGICA - PROGRAMAS COMO BRMODELO

/* AD - DBA */

MODELAGEM FISICA - SCRIPT DO BANCO

/*MODELO FISICO */

/* CRIANDO UM BANCO */

CREATE DATABASE PROJETO;

/* CONECTANDO */

USE PROJETO;

/* CRIANDO A TABELA */

CREATE TABLE CLIENTE(


NOME VARCHAR(30),
SEXO CHAR(1),
EMAIL VARCHAR(30),
CPF INT(11),
TELEFONE VARCHAR(30),
ENDERECO VARCHAR(100)
);

/*VERIFICANDO AS TABELAS */

SHOW TABLES;

/* DESCREVENDO TABELAS */

DESC CLIENTE;

/* A 06 */

/*Tipos de dados */
Todos os banos de dados possuem tipos que devem ser atribuidos aos dados de uma
tabela.
Para caracteres literais, temos char e varchar, para números temos int e float,
para
objetos como fotos e documentos, temos o blob, para textos extensos, temos o text.
A disciplina de banco de dados é tão fantástica que ao entendermos o porque das
coisas,
podemos iniciar já em modo avançado e um bom exemplo disso são os tipos. Há uma
profissão
dentro da área que é a do analista de performance ou tuning, esse profissional é
responsável
por analisar o banco de dados e deixá-lo mais rápido. Parece algo avançado, e é!
Porém,
com alguas atitudes simples, podemos deixar o banco sem a necessidade de atuação
desse profissional.

Cada caracter no banco de dados, vale 1 byte. Sendo assim, se eu entro com o dado
JOÃO,
estou entrando com 4 bytes no meu banco. E o que isso tem a ver com a tiagem de
tabelas?

O banco de dados funciona como um download de dados da internet. Se baixamos um


arquivo de 1 giga,
temos um temo maior que o download de 50 megas, considerando a mesma velocidade de
conexão.

Ao tiparmos uma tabela de modo errado ou displicente, vamos aumentar a quantidade


de dados que
será baixada do banco de dados, prolongando assim o tempo de resposta.

Uma comparacao bem didatica é o tipo char e varchar


A palavra var, vem de variant, em ingles, ou seja, que é dinâmica. Logo, vimos que
1 caracter
é igual a 1 byte. Vejamos então a tipagem

varchar(10)
char(10)

entrando a palavra joao

total de bytes varchar(10) = 4 bytes


toal de bytes cahr(10) = 10 bytes

isso ocorre pois o char não varia. Os caracteres restantes serao preenchidos com
espaço.
eles nao ficam vazios. Enquanto que no varchar, o tipo varia conforme o dado.
Entao utilizo sempre o varchar? Não. O charé ligeiramente mais performatico, por
nao
ter que gastar tempo variando de tamanho. Entao a regra é utilizar sempre o char
quando
sabemos que o numero de caracteres naquela coluna nao vai variar nunca. Por
exemplo,
unidade federativa, com dois digitos, sexo com um digito e assim por diante. Vista
a diferença
que podemos fazer com uma tipagem correta de tabelas, na próxima aula detalharemos
os tipos do mysql
e nos modulos específicos de cada banco, você entenderá os tipos correspondentes no
sql server
e no oracle, que mudam muito pouco.
/* A 08 - Inserindo dados e valores nulos */

use projeto;

/* Mostrando as tabelas */
show tables

/* exibindo a estrutura de uma tabela */


desc cliente;

/* FORMA 01 - EXCLUINDO AS COLUNAS */

INSERT INTO CLIENTE VALUES('JOAO','M','JOAO@GMAIL.COM',988638273,'22923110','MAIA


LACERDA - ESTACIO - RIO DE JANEIRO - RJ');

INSERT INTO CLIENTE


VALUES('CELIA','F','CELIA@GMAIL.COM',541521456,'25078869','RIACHUELO - CENTRO - RIO
DE JANEIRO - RJ');

INSERT INTO CLIENTE VALUES('JORGE','M',NULL,885755896,'58748895','OSCAR CURY - BOM


RETIRO - PATOS DE MINAS - MG');

/* FORMA 02 - COLOCANDO AS COLUNAS */

INSERT INTO CLIENTE(NOME,SEXO,ENDERECO,TELEFONE,CPF) VALUES('LILIAN','F','SENADOR


SOARES - TIJUCA - RIO DE JANEIRO - RJ','947785696',887774856);

/* FORMA 03 - INSERT COMPACTO - SOMENTE MYSQL */

INSERT INTO CLIENTE VALUES('ANA','F','ANA@GLOBO.COM',85548962,'548556985','PRES


ANTONIO CARLOS - CENTRO - SAO PAULO - SP'),

('CARLA','F','CARLA@TERATI.COM.BR',7745828,'66587458','SAMUEL SILVA - CENTRO - BELO


HORIZONTE - MG');

/* A009 - O COMANDO SELECT */

SELECT NOW();

SELECT 'FELIPE MAFRA';

SELECT 'BANCO DE DADOS';

/* ALIAS DE COLUNAS */

SELECT 'FELIPE MAFRA' AS PROFESSOR;

SELECT NOME, SEXO, EMAIL FROM CLIENTE;

SELECT NOME, SEXO, EMAIL, ENDERECO FROM CLIENTE;

SELECT ENDERECO, SEXO, EMAIL FROM CLIENTE;

/* APENAS PARA FINS ACADEMICOS */

SELECT * FROM CLIENTE;


/* A10 - FILTRANDO DADOS COM WHERE E LIKE */

SELECT NOME, TELEFONE FROM CLIENTE;

/* FILTRANDO */

SELECT NOME, SEXO FROM CLIENTE


WHERE SEXO = 'M';

SELECT NOME, ENDERECO FROM CLIENTE


WHERE SEXO = 'M';

SELECT NOME, ENDERECO FROM CLIENTE


WHERE SEXO = 'F';

SELECT NOME, SEXO FROM CLIENTE


WHERE ENDERECO = 'RJ';

/* UTILIZANDO O LIKE */

SELECT NOME, SEXO FROM CLIENTE


WHERE ENDERECO LIKE 'RJ';

/* CARACTER CORINGA % */

SELECT NOME, SEXO FROM CLIENTE


WHERE ENDERECO LIKE '%RJ';

SELECT NOME, SEXO, ENDERECO FROM CLIENTE


WHERE ENDERECO LIKE '%RJ';

SELECT NOME, SEXO, ENDERECO FROM CLIENTE


WHERE ENDERECO LIKE '%CENTRO%';

/* A11 - OPERADORES LOGICOS */

/* OR - OU */

SELECT NOME, SEXO, ENDERECO FROM CLIENTE


WHERE
SEXO = 'M' OR ENDERECO LIKE '%RJ';

SELECT NOME, SEXO, ENDERECO FROM CLIENTE


WHERE
SEXO = 'F' OR ENDERECO LIKE '%ESTACIO';

/* AND - E */

SELECT NOME, SEXO, ENDERECO FROM CLIENTE


WHERE
SEXO = 'M' AND ENDERECO LIKE '%RJ';

SELECT NOME, SEXO, ENDERECO FROM CLIENTE


WHERE
SEXO = 'F' AND ENDERECO LIKE '%ESTACIO';

/* COUNT(*), GROUP BY, PERFORMANCE COM OPERADORES


LOGICOS */
/* CONTANDO OS REGISTROS DE UMA TABELA */

SELECT COUNT(*) FROM CLIENTE;

SELECT COUNT(*) AS "QUANTIDADE DE REG TAB CLIENTE"


FROM CLIENTE;

/* OPERADOR GROUP BY */

SELECT SEXO, COUNT(*) AS "QUANTIDADE"


FROM CLIENTE
GROUP BY SEXO;

/* PERFORMANCE EM OPERADORES LOGICOS */

/* 1 MILHAO DE REGISTROS

PARA CONTAR
SELECT COUNT(*) FROM CLIENTE;

SELECT SEXO, COUNT(*) FROM CLIENTE


GROUP BY SEXO;

SELECT CIDADE, COUNT(*) FROM CLIENTE


GROUP BY CIDADE;

CONDICAO
SEXO = F
CIDADE = RIO DE JANEIRO

SITUACAO - TRATANDO COM OU / OR


70% MULHERES = SEXO = F
30% MORA NO RIO DE JANEIRO

SELECT NOME, SEXO, ENDERECO


FROM CLIENTE
WHERE SEXO = 'F'
OR CIDADE = 'RIO DE JANEIRO';

SITUACAO - TRATANDO COM E / AND


70% MULHERES = SEXO = F
30% MORA NO RIO DE JANEIRO

SELECT NOME, SEXO, ENDERECO


FROM CLIENTE
WHERE CIDADE = 'RIO DE JANEIRO'
AND SEXO = 'F';

/* A13 - FILTRANDO VALORES NULOS */

SELECT NOME, SEXO, ENDERECO


FROM CLIENTE
WHERE EMAIL = NULL;

SELECT NOME, SEXO, ENDERECO


FROM CLIENTE
WHERE EMAIL IS NULL;

SELECT NOME, SEXO, ENDERECO


FROM CLIENTE
WHERE EMAIL IS NOT NULL;

/* A14 - UTILIZANDO O UPDATE PARA ATUALIZAR VALORES */

SELECT NOME, EMAIL


FROM CLIENTE;

UPDATE CLIENTE
SET EMAIL = 'LILIAN@HOTMAIL.COM';

/* UTILIZAR O UPDATE SEMPRE ACOMPANHADO


DA CLAUSULA WHERE */

UPDATE CLIENTE
SET EMAIL = 'JOAO@HOTMAIL.COM'
WHERE NOME = 'JOAO';

UPDATE CLIENTE
SET EMAIL = 'JORGE@GMAIL.COM'
WHERE NOME = 'JORGE';

UPDATE CLIENTE
SET EMAIL = 'ANA@GMAIL.COM'
WHERE NOME = 'ANA';

UPDATE CLIENTE
SET EMAIL = 'CARLA@TERRA.COM.BR'
WHERE NOME = 'CARLA';

/*A15 - DELETANDO REGISTROS COM A CLAUSULA DELETE */

DELETE FROM CLIENTE; -- NUNCA FAÇAM

SELECT COUNT(*) FROM CLIENTE;

DELETE FROM CLIENTE


WHERE NOME = 'ANA';

SELECT COUNT(*) FROM CLIENTE;

/* A16 - ENTRANDO COM MAIS TELEFONES */

UPDATE CLIENTE
SET TELEFONE = '97865434'
WHERE NOME = 'JOAO';

UPDATE CLIENTE
SET TELEFONE = '22923110 - 97865434'
WHERE NOME = 'JOAO';

SELECT ENDERECO, COUNT(*) AS "QUANTIDADE"


FROM CLIENTE
GROUP BY ENDERECO;

/* A17 - HISTORIA DA MODELAGEM */

DECADA DE 70, EUA - CRISE DO SOFTWARE


FOI A CRISE QUE ATINGIU NAO SOMENTE A AREA DE TECNOLOGIA
MAS TAMBÉM TODAS AS EMPRESAS QUE UTILIZAVAM DE SISTEMAS
TECNOLOGICOS PARA CONTROLAR SEUS NEGOCIOS.

NAQUELA EPOCA, PROGRAMAR ERA UM PROCESSO ARTESANAL.


BASTAVA OLHAR O CODIGO QUE VOCE SABERIA QUEM O
ESCREVEU, TAO POUCOS ERAM OS PROGRAMADORES EACHTAO ARCAICO ERAM
OS METODOS DE PROGRAMACAO. EM UM PRIMEIRO MOMENTO,
OS PROFISSIONAIS DE TI VIRAM A NECESSIDADE DE SE PROGRAMAR
E INICIARAM SUA CAMINHADA, CONSTRUINDO SISTEMAS QUE ATENDIAM
NUM PRIMEIRO MOMENTO, MAS DEPOIS TRAZIAM INFORMACOES ERRADAS,
PROVOCANDO A FALENCIA DE DIVERSAS EMPRESAS. LEMBRE-SE: INFORMACOES
ERRADAS PODEM LEVAR A SUA EMPRESA A FALENCIA, E FOI ISSO QUE ACONTECEU.
ISSO OCORRIA POIS OS PROFISSIONAIS SABIAM PROGRAMAR MAS ENTENDIAM APENAS
DO NEGOCIO DAS EMPRESAS DAS QUAIS FAZIAM PARTE. SER TER O KNOW HOW
DOS DEMAIS NEGOCIOS, OS PROGRAMADORES PROGRAMAVAM VOLTADOS PARA OS
PROCEDIMENTOS, E ESSE FOI UM ERRO MORTAL.

PETER CHEN, VENDO TODO ESSE CENARIO AFIRMOU: NAO PODEMOS CRIAR BANCOS
DE DADOS VOLTADOS PARA PROCEDIMENTOS EMPRESARIAIS, POIS OS PROCEDIMENTOS
SOFREM INTERFERENCIAS EXTERNAS E PODEM SER ALTERADOS. A UNICA COISA
QUE NAO SOFRE ALTERACAO SAO OS DADOS.

POR EXEMPLO, ARMAZENAMOS NO BANCO A VENDA DE JANEIRO, FEVEREIRO E MARCO


O TOTAL DAS VENDAS E O IMPOSTO PAGO AO GOVERNO.
FAZEMOS ISSO DURANTE MUITO TEMPO. DE UMA HORA PRA OUTRA O GOVERNO
MUDA A ALIQUOTA DO IMPOSTO. COMO FARÁ SENTIDO OS PAGAMENTOS ARMAZENADOS
ANTERIORMENTE? AQUI NOTA-SE QUE ARMAZENAMOS DADOS E ARMAZENAMOS
INFORMACOES CORRESPONDENTES AOS PROCEDIMENTOS EXTERNOS. DEVEMOS
APENAS ARMAZENAR OS DADOS, POIS ELES SAO SUFICIENTES PARA GERAR
A INFORMACAO.

MODELAR É UMA ARTE, ALGO QUE SE APRENDE COM A PRATICA. E VOCES PODEM
SE PERGUNTAR: MAS SE É ALGO QUE SE APRENDE COM A PRATICA, COMO QUEM
ESTA COMEÇANDO, APRENDE?

ASSIM COMO PETER CHEN CRIOU O MODELO DE ENTIDADE E RELACIONAMENTO, O MER,


FORAM CRIADAS FORMAS NORMAIS, QUE SAO DIRETRIZES PARA APLICAR EM
MODELAGEM DE AMBIENTES OLTP OU AMBIENTES TRANSACIONAIS DE BANCOS
DE DADOS.

HOJE TEMOS MAIS DO QUE 3 FORMAS NORMAIS, MAS AO NORMALIZARMOS UM


BANCO ATE A SUA TERCEIRA FORMA, É O SUFICIENTE PARA TER UM
TRABALHO LIMPO E LIVRE DE ERROS. VEREMOS AS TRES FORMAS NORMAIS,
UMA A UMA, DETALHADAMENTE NAS PROXIMAS AULAS.

/* A18 */

INSERT INTO CLIENTE


VALUES('CELIA','F','CELIA@GMAIL.COM',541521456,'58749965','RIACHUELO - CENTRO - RIO
DE JANEIRO - RJ');

SELECT SEXO, COUNT(*) AS QUANTIDADE


FROM CLIENTE
GROUP BY SEXO;

/* 1a FORMA NORMAL */

/* 1 - TODO CAMPO VETORIZADO SE TORNARA


OUTRA TABELA

[AZUL,AMARELO,VERDE,LARANJA] - ELEMENTOS DE UM MESMO TIPO


[KA,FIT,FIESTA,CIVIC,UNO] - VETOR DE CARROS

2 - TODO CAMPO MULTIVALORADO SE TORNARÁ


OUTRA TABELA. UM CAMPO DIVISIVEL.

3 - TODA TABELA NECESSITA DE PELO MENOS


UM CAMPO QUE IDENTIFIQUE TODO O RESGISTRO
COMO SENDO ÚNICO - É O QUE CHAMAMOS DE CHAVE PRIMÁRIA
OU PRIMARY KEY*/

/* A19 - CADINALIDADE */

/* QUEM DEFINE A CARDINALIDADE É A REGRA DE NEGOCIOS */

/* PRIMEIRO ALGARISMO - OBRIGATORIEDADE


0 - NAO OBRIGATORIO
1 - OBRIGATORIO

SEGUNDO ALGARISMO - CARDINALIDADE


1 - MAXIMO DE UM
N - MAIS DE UM
*/

/* MODELAGEM DE CLIENTE */

CREATE DATABASE COMERCIO;

USE COMERCIO;

CREATE TABLE CLIENTE(


IDCLIENTE INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30) NOT NULL,
SEXO ENUM('M','F') NOT NULL,
EMAIL VARCHAR(50) UNIQUE,
CPF VARCHAR(15) UNIQUE
);

CREATE TABLE TELEFONE(


IDTELEFONE INT PRIMARY KEY AUTO_INCREMENT,
TIPO ENUM('COM','RES','CEL'),
NUMERO VARCHAR(10),
ID_CLIENTE INT,
FOREIGN KEY(ID_CLIENTE)
REFERENCES CLIENTE(IDCLIENTE)
);

CREATE TABLE ENDERECO(


IDENDERECO INT PRIMARY KEY AUTO_INCREMENT,
RUA VARCHAR(30) NOT NULL,
BAIRRO VARCHAR(30) NOT NULL,
CIDADE VARCHAR(30) NOT NULL,
ESTADO CHAR(2) NOT NULL,
ID_CLIENTE INT UNIQUE,
FOREIGN KEY(ID_CLIENTE)
REFERENCES CLIENTE(IDCLIENTE)
);
/* FOREIGN KEY - CHAVE ESTRANGEIRA - FK */

/* É A CHAVE PRIMARIA DE UMA TABELA, QUE VAI ATE


OUTRA TABELA FAZER REFERENCIA */

/* EM RELACIONAMENTOS 1 X 1 A CHAVE ESTRANGEIRA


FICA NA TABELA MAIS FRACA */

/* EM RELACIONAMENTOS 1 X N, A CHAVEE
ESTRANGEIRA FICARA SEMPRE NA TABELA N */

/* A20 */

INSERT INTO CLIENTE VALUES(NULL,'JOAO','M','JOAO@IG.COM','98547-6');


INSERT INTO CLIENTE VALUES(NULL,'CARLOS','M','CARLOS@TERA.COM','86664-7');
INSERT INTO CLIENTE VALUES(NULL,'ANA','F','ANA@GLOBO.COM','75658-5');
INSERT INTO CLIENTE VALUES(NULL,'JORGE','M','JORGE@IG.COM','88657-5');
INSERT INTO CLIENTE VALUES(NULL,'CLARA','M',NULL,'99754-7');
INSERT INTO CLIENTE VALUES(NULL,'CELIA','F','JOAO@TERRA.COM','77558-5');

SELECT * FROM CLIENTE;

/* INSERINDO UM REGISTRO ERRADO */

INSERT INTO CLIENTE VALUES(NULL,'ANTONIO','M','JOAO@IG.COM');

/*CORRIGINDO*/

INSERT INTO CLIENTE VALUES(NULL,'ANTONIO','M',NULL,'78558-6');


INSERT INTO CLIENTE VALUES(NULL,'JOAO','M',NULL,'86695-6');

/* ENDERECO */

INSERT INTO ENDERECO VALUES(NULL,'RUA A','CENTRO','B. HORIZONTE','MG',4);


INSERT INTO ENDERECO VALUES(NULL,'RUA B','CENTRO','RIO DE JANEIRO','RJ',1);
INSERT INTO ENDERECO VALUES(NULL,'RUA C','JARDINS','SAO PAULO','SP',3);
INSERT INTO ENDERECO VALUES(NULL,'RUA B','ESTACIO','RIO DE JANEIRO','RJ',8);
INSERT INTO ENDERECO VALUES(NULL,'RUA Z','CRUZEIRO','B. HORIZONTE','MG',2);
INSERT INTO ENDERECO VALUES(NULL,'RUA X','FLAMENGO','RIO DE JANEIRO','RJ',7);
INSERT INTO ENDERECO VALUES(NULL,'RUA Z','CRUZEIRO','B. HORIZONTE','MG',5);
INSERT INTO ENDERECO VALUES(NULL,'RUA X','CENTRO','NITERÓI','RJ',6);

INSERT INTO ENDERECO VALUES(NULL,'RUA U','CENTRO','NITERÓI','RJ',1000);

SELECT * FROM ENDERECO;

/* TELEFONE */

INSERT INTO TELEFONE VALUES(NULL,'CEL','9955331',1);


INSERT INTO TELEFONE VALUES(NULL,'COM','6574565',3);
INSERT INTO TELEFONE VALUES(NULL,'CEL','8864566',2);
INSERT INTO TELEFONE VALUES(NULL,'CEL','5557798',7);
INSERT INTO TELEFONE VALUES(NULL,'COM','6765768',1);
INSERT INTO TELEFONE VALUES(NULL,'RES','5676765',6);
INSERT INTO TELEFONE VALUES(NULL,'CEL','5765547',1);
INSERT INTO TELEFONE VALUES(NULL,'CEL','8865645',7);
INSERT INTO TELEFONE VALUES(NULL,'RES','7555446',7);
INSERT INTO TELEFONE VALUES(NULL,'CEL','5788654',3);
INSERT INTO TELEFONE VALUES(NULL,'CEL','7865644',6);
INSERT INTO TELEFONE VALUES(NULL,'RES','5754644',6);

SELECT * FROM CLIENTE;


SELECT * FROM ENDERECO;
SELECT * FROM TELEFONE;

/* A 21 */

/* SELECAO, PROJECAO E JUNCAO */

/* PROJECAO - TUDO QUE QUEREMOS PROJETAR NA TELA */

SELECT NOW() AS "DATA";

SELECT NOME, NOW() AS "DATA" /* PROJECAO */


FROM CLIENTE;

/* SELECAO - TEORIA DOS CONJUNTOS - WHERE É A CLAUSULA DE SELECAO */

SELECT NOME, SEXO


FROM CLIENTE;

SELECT NOME, SEXO


FROM CLIENTE
WHERE SEXO = 'M'; /* SELECAO */

UPDATE CLIENTE
SET SEXO = 'F'
WHERE IDCLIENTE = 5; /*SELECAO */

/* JUNCAO */

/* NOME, SEXO, BAIRRO, CIDADE, DATA */

SELECT NOME, SEXO, BAIRRO, CIDADE, NOW() AS "DATA"


FROM CLIENTE, ENDERECO
WHERE IDCLIENTE = ID_CLIENTE; /* SELECAO - NAO FAÇAM ISSO */

SELECT NOME, SEXO, BAIRRO, CIDADE, NOW() AS "DATA"


FROM CLIENTE, ENDERECO
WHERE IDCLIENTE = ID_CLIENTE
AND BAIRRO = 'CENTRO';

/* JOIN - JUNCAO */

SELECT NOME, SEXO, BAIRRO, CIDADE /* PROJECAO */


FROM CLIENTE
INNER JOIN ENDERECO /*JUNCAO */
ON IDCLIENTE = ID_CLIENTE
WHERE BAIRRO = 'CENTRO'; /* SELECAO */

SELECT CLIENTE.NOME, CLIENTE.SEXO,


ENDERECO.BAIRRO, ENDERECO.CIDADE,
TELEFONE.TIPO, TELEFONE.NUMERO
FROM CLIENTE
INNER JOIN ENDERECO
ON CLIENTE.IDCLIENTE = ENDERECO.ID_CLIENTE
INNER JOIN TELEFONE
ON CLIENTE.IDCLIENTE = TELEFONE.ID_CLIENTE;

SELECT C.NOME, C.SEXO,


E.BAIRRO, E.CIDADE,
T.TIPO, T.NUMERO
FROM CLIENTE C
INNER JOIN ENDERECO E
ON C.IDCLIENTE = E.ID_CLIENTE
INNER JOIN TELEFONE T
ON C.IDCLIENTE = T.ID_CLIENTE;

SELECT C.NOME, C.SEXO,


E.BAIRRO, E.CIDADE,
T.TIPO, T.NUMERO
FROM CLIENTE C
INNER JOIN ENDERECO E
ON C.IDCLIENTE = E.ID_CLIENTE
INNER JOIN TELEFONE T
ON C.IDCLIENTE = T.ID_CLIENTE
WHERE SEXO = 'M';

/* A23 Queries - SELECAO - PROJECAO E JUNCAO */

/* PARA UMA CAMPANHA DE MARKETING, O SETOR SOLICITOU UM


RELATÓRIO COM O NOME, EMAIL E TELEFONE CELULAR
DOS CLIENTES QUE MORAM NO ESTADO DO RIO DE JANEIRO
VOCÊ TERÁ QUE PASSAR A QUERY PARA GERAR O RELATORIO PARA
O PROGRAMADOR */

SELECT C.NOME,C.EMAIL,T.NUMERO
FROM CLIENTE C
INNER JOIN TELEFONE T
ON C.IDCLIENTE = T.ID_CLIENTE
INNER JOIN ENDERECO E
ON C.IDCLIENTE = E.ID_CLIENTE
WHERE TIPO = 'CEL' AND ESTADO = 'RJ';

+---------+----------------+---------+
| NOME | EMAIL | NUMERO |
+---------+----------------+---------+
| JOAO | JOAO@IG.COM | 9955331 |
| JOAO | JOAO@IG.COM | 5765547 |
| ANTONIO | NULL | 5557798 |
| ANTONIO | NULL | 8865645 |
| CELIA | JOAO@TERRA.COM | 7865644 |
+---------+----------------+---------+

/* PARA UMA CAMPANHA DE PRODUTOS DE BELEZA, O COMERCIAL SOLICITOU UM


RELATÓRIO COM O NOME, EMAIL E TELEFONE CELULAR
DAS MULHERES QUE MORAM NO ESTADO DE SÃO PAULO
VOCÊ TERÁ QUE PASSAR A QUERY PARA GERAR O RELATORIO PARA
O PROGRAMADOR */

SELECT NOME, EMAIL, NUMERO


FROM CLIENTE
INNER JOIN TELEFONE T
ON IDCLIENTE = T.ID_CLIENTE
INNER JOIN ENDERECO E
ON IDCLIENTE = E.ID_CLIENTE
WHERE SEXO = 'F' AND TIPO = 'CEL' AND ESTADO = 'SP';

+------+---------------+---------+
| NOME | EMAIL | NUMERO |
+------+---------------+---------+
| ANA | ANA@GLOBO.COM | 5788654 |
+------+---------------+---------+

/* IFNULL */

SELECT C.NOME AS "CLIENTE",


IFNULL(C.EMAIL,'SEM EMAIL') AS "EMAIL",
T.NUMERO AS "CELULAR"
FROM CLIENTE C
INNER JOIN TELEFONE T
ON C.IDCLIENTE = T.ID_CLIENTE
INNER JOIN ENDERECO E
ON C.IDCLIENTE = E.ID_CLIENTE
WHERE TIPO = 'CEL' AND ESTADO = 'RJ';

+---------+----------------+---------+
| NOME | EMAIL | NUMERO |
+---------+----------------+---------+
| JOAO | JOAO@IG.COM | 9955331 |
| JOAO | JOAO@IG.COM | 5765547 |
| ANTONIO | SEM EMAIL | 5557798 |
| ANTONIO | SEM EMAIL | 8865645 |
| CELIA | JOAO@TERRA.COM | 7865644 |
+---------+----------------+---------+

/* A24 - VIEWS OU VISOES */

SELECT C.NOME,C.SEXO,
IFNULL(C.EMAIL,'SEM EMAIL') AS "E-MAIL",
T.TIPO,
T.NUMERO,
E.BAIRRO,
E.CIDADE,
E.ESTADO
FROM CLIENTE C
INNER JOIN TELEFONE T
ON C.IDCLIENTE = T.ID_CLIENTE
INNER JOIN ENDERECO E
ON C.IDCLIENTE = E.ID_CLIENTE;

/* CRIANDO A VIEW */

CREATE VIEW RELATORIO AS


SELECT C.NOME,C.SEXO,
IFNULL(C.EMAIL,'SEM EMAIL') AS "E-MAIL",
T.TIPO,
T.NUMERO,
E.BAIRRO,
E.CIDADE,
E.ESTADO
FROM CLIENTE C
INNER JOIN TELEFONE T
ON C.IDCLIENTE = T.ID_CLIENTE
INNER JOIN ENDERECO E
ON C.IDCLIENTE = E.ID_CLIENTE;

SELECT * FROM RELATORIO;

SELECT * FROM RELATORIO


WHERE SEXO = 'F';

SHOW TABLES;
+--------------------+
| Tables_in_comercio |
+--------------------+
| cliente |
| endereco |
| relatorio |
| telefone |
+--------------------+

/* APAGANDO UMA VIEW */

DROP VIEW RELATORIO;

CREATE VIEW V_RELATORIO AS


SELECT C.NOME,C.SEXO,
IFNULL(C.EMAIL,'SEM EMAIL') AS "E-MAIL",
T.TIPO,
T.NUMERO,
E.BAIRRO,
E.CIDADE,
E.ESTADO
FROM CLIENTE C
INNER JOIN TELEFONE T
ON C.IDCLIENTE = T.ID_CLIENTE
INNER JOIN ENDERECO E
ON C.IDCLIENTE = E.ID_CLIENTE;

SELECT NOME, SEXO, CIDADE


FROM V_RELATORIO;

+---------+------+----------------+
| NOME | SEXO | CIDADE |
+---------+------+----------------+
| JOAO | M | RIO DE JANEIRO |
| JOAO | M | RIO DE JANEIRO |
| JOAO | M | RIO DE JANEIRO |
| CARLOS | M | B. HORIZONTE |
| ANA | F | SAO PAULO |
| ANA | F | SAO PAULO |
| CELIA | F | NITERÓI |
| CELIA | F | NITERÓI |
| CELIA | F | NITERÓI |
| ANTONIO | M | RIO DE JANEIRO |
| ANTONIO | M | RIO DE JANEIRO |
| ANTONIO | M | RIO DE JANEIRO |
+---------+------+----------------+

DELETE FROM V_RELATORIO


WHERE NOME = 'JOAO';
Can not delete from join view 'comercio.v_relatorio'

INSERT INTO V_RELATORIO VALUES


('ROMARIO','M',NULL,'RES','99723882','BARRA','RIO DE JANEIRO','RJ');

Can not insert into join view 'comercio.v_relatorio' without fields list

/* A 25 - ORDER BY */

SELECT NOME, SEXO, CPF, CIDADE


FROM CLIENTE
INNER JOIN ENDERECO
ON IDCLIENTE = ID_CLIENTE;

SELECT NOME, SEXO, CPF, CIDADE


FROM CLIENTE
INNER JOIN ENDERECO
ON IDCLIENTE = ID_CLIENTE
ORDER BY NOME;

SELECT NOME, SEXO, CPF, CIDADE


FROM CLIENTE
INNER JOIN ENDERECO
ON IDCLIENTE = ID_CLIENTE
ORDER BY NOME, CPF ASC;

SELECT NOME, SEXO, CPF, CIDADE


FROM CLIENTE
INNER JOIN ENDERECO
ON IDCLIENTE = ID_CLIENTE
ORDER BY 4;

/* A26 - DELIMITADOR E ESTADO DE SERVIDOR */

SELECT * FROM V_RELATORIO

SELECT * FROM V_RELATORIO;

SELECT 'FELIPE', 'MAFRA';

DELIMITER $

SELECT * FROM V_RELATORIO;

STATUS

DELIMITER#
DELIMITER #

/* A27 PROCEDURES */

/* SEMPRE */

DELIMITER $

CREATE PROCEDURE NOME()


BEGIN
ACAO;
END
$

SELECT 10 + 10 AS "CONTA"$

CREATE PROCEDURE CONTA()


BEGIN
SELECT 10 + 10 AS "CONTA";
END
$

/* CHAMANDO A PROCEDURE */

CALL CONTA()$

DELIMITER ;

CALL CONTA();

/*PROCEDURES COM PARAMETROS */

DROP PROCEDURE CONTA;

DELIMITER $

CREATE PROCEDURE CONTA(NUMERO1 INT, NUMERO2 INT)


BEGIN
SELECT NUMERO1 + NUMERO2 AS "CONTA";
END
$

DELIMITER ;

CALL CONTA(100,78);
CALL CONTA(47456,346435);
CALL CONTA(64577,85546);

/* A28 - PROCEDURES COM TABELAS */

CREATE TABLE CURSOS(


IDCURSO INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30) NOT NULL,
HORAS INT(3) NOT NULL,
VALOR FLOAT(10,2) NOT NULL
);

INSERT INTO CURSOS VALUES(NULL,'BANCO DE DADOS FUNDAMENTAL',25,200.00);

SELECT * FROM CURSOS;

/* DELIMITADOR */

DELIMITER #

CREATE PROCEDURE CAD_CURSO(P_NOME VARCHAR(30),P_HORAS INT(3),P_PRECO FLOAT(10,2))


BEGIN
INSERT INTO CURSOS VALUES(NULL,P_NOME,P_HORAS,P_PRECO);
END
#
DELIMITER ;

STATUS

CALL CAD_CURSO('BI SQL SERVER',35,200.00);

SELECT * FROM CURSOS;

DELIMITER #

CREATE PROCEDURE SEL_CURSO()


BEGIN
SELECT IDCURSO, NOME, HORAS, VALOR
FROM CURSOS;
END
#

DELIMITER ;

CALL SEL_CURSO();

/* A29 FUNCOES DE AGREGACAO NUMERICAS */

CREATE TABLE VENDEDORES(


IDVENDEDOR INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30),
SEXO CHAR(1),
JANEIRO FLOAT(10,2),
FEVEREIRO FLOAT(10,2),
MARCO FLOAT(10,2)
);

INSERT INTO VENDEDORES VALUES(NULL,'CARLOS','M',76234.78,88346.87,5756.90);


INSERT INTO VENDEDORES VALUES(NULL,'MARIA','F',5865.78,6768.87,4467.90);
INSERT INTO VENDEDORES VALUES(NULL,'ANTONIO','M',78769.78,6685.87,6664.90);
INSERT INTO VENDEDORES VALUES(NULL,'CLARA','F',5779.78,446886.87,8965.90);
INSERT INTO VENDEDORES VALUES(NULL,'ANDERSON','M',676545.78,77544.87,578665.90);
INSERT INTO VENDEDORES VALUES(NULL,'IVONE','F',57789.78,44774.87,68665.90);
INSERT INTO VENDEDORES VALUES(NULL,'JOAO','M',4785.78,66478.87,6887.90);
INSERT INTO VENDEDORES VALUES(NULL,'CELIA','F',89667.78,57654.87,5755.90);

/* MAX - TRAZ O VALOR MAXIMO DE UMA COLUNA */

SELECT MAX(FEVEREIRO) AS MAIOR_FEV


FROM VENDEDORES;

/* MIN - TRAZ O VALOR MINIMO DE UMA COLUNA */

SELECT MIN(FEVEREIRO) AS MENOR_FEV


FROM VENDEDORES;

/* AVG - TRAZ O VALOR MEDIO DE UMA COLUNA */

SELECT AVG(FEVEREIRO) AS MEDIA_FEV


FROM VENDEDORES;

/* VARIAS FUNCOES */
SELECT MAX(JANEIRO) AS MAX_JAN,
MIN(JANEIRO) AS MIN_JAN,
AVG(JANEIRO) AS MEDIA_JAN
FROM VENDEDORES;

/*TRUNCATE */

SELECT MAX(JANEIRO) AS MAX_JAN,


MIN(JANEIRO) AS MIN_JAN,
TRUNCATE(AVG(JANEIRO),2) AS MEDIA_JAN
FROM VENDEDORES;

/* A30 - AGREGANDO COM SUM() */

SELECT SUM(JANEIRO) AS TOTAL_JAN


FROM VENDEDORES;

SELECT SUM(JANEIRO) AS TOTAL_JAN,


SUM(FEVEREIRO) AS TOTAL_FEV,
SUM(MARCO) AS TOTAL_MAR
FROM VENDEDORES;

/* VENDAS POR SEXO */

SELECT SEXO, SUM(MARCO) AS TOTAL_MARCO


FROM VENDEDORES
GROUP BY SEXO;

/* A 31 - SUBQUERIES

VENDEDOR QUE VENDEU MENOS EM MARCO


E O SEU NOME

NOME E O VALOR QUE VENDEU MAIS EM MARCO

QUEM VENDEU MAIS QUE O VALOR MEDIO DE FEV


*/

SELECT NOME, MIN(MARCO) AS MIN_MARCO


FROM VENDEDORES;

SELECT * FROM VENDEDORES;

SELECT MIN(MARCO) FROM VENDEDORES;

SELECT NOME, MARCO FROM VENDEDORES


WHERE MARCO = (SELECT MIN(MARCO) FROM VENDEDORES);

SELECT NOME, MARCO FROM VENDEDORES


WHERE MARCO = (SELECT MAX(FEVEREIRO) FROM VENDEDORES);

SELECT NOME, MARCO FROM VENDEDORES


WHERE MARCO > (SELECT AVG(MARCO) FROM VENDEDORES);

SELECT NOME, FEVEREIRO FROM VENDEDORES


WHERE FEVEREIRO > (SELECT AVG(FEVEREIRO) FROM VENDEDORES);

SELECT AVG(FEVEREIRO) FROM VENDEDORES;


SELECT NOME, FEVEREIRO FROM VENDEDORES
WHERE FEVEREIRO < (SELECT AVG(FEVEREIRO) FROM VENDEDORES);

/* A32 - OPERACOES EM LINHA */

SELECT * FROM VENDEDORES;

SELECT NOME,
JANEIRO,
FEVEREIRO,
MARCO,
(JANEIRO+FEVEREIRO+MARCO) AS "TOTAL",
TRUNCATE((JANEIRO+FEVEREIRO+MARCO)/3,2) AS "MEDIA"
FROM VENDEDORES;

/* APLICANDO UM % */

SELECT NOME,
JANEIRO,
FEVEREIRO,
MARCO,
(JANEIRO+FEVEREIRO+MARCO) AS "TOTAL",
(JANEIRO+FEVEREIRO+MARCO) * .25 AS "DESCONTO",
TRUNCATE((JANEIRO+FEVEREIRO+MARCO)/3,2) AS "MEDIA"
FROM VENDEDORES;

/* A33 - ALTERANDO TABELAS */

CREATE TABLE TABELA(


COLUNA1 VARCHAR(30),
COLUNA2 VARCHAR(30),
COLUNA3 VARCHAR(30)
);

CREATE TABLE TABELA(


COLUNA1 INT PRIMARY KEY AUTO_INCREMENT
);

--ADICIONANDO UMA PK
ALTER TABLE TABELA
ADD PRIMARY KEY (COLUNA1);

--ADICIONANDO COLUNA SEM POSICAO. ULTIMA POSICAO


ALTER TABLE TABELA
ADD COLUNA varchar(30);

ALTER TABLE TABELA


ADD COLUNA100 INT;

--ADICIONANDO UMA COLUNA COM POSICAO


ALTER TABLE TABELA
ADD COLUMN COLUNA4 VARCHAR(30) NOT NULL UNIQUE
AFTER COLUNA3;

--MODIFICANDO O TIPO DE UM CAMPO


ALTER TABLE TABELA
MODIFY COLUNA2 DATE NOT NULL;
--RENOMEANDO O NOME DA TABELA
ALTER TABLE TABELA
RENAME PESSOA;

CREATE TABLE TIME(


IDTIME INT PRIMARY KEY AUTO_INCREMENT,
TIME VARCHAR(30),
ID_PESSOA VARCHAR(30)
);

--Foreign key
ALTER TABLE TIME
ADD FOREIGN KEY(ID_PESSOA)
REFERENCES PESSOA(COLUNA1);

/* VERIFICAR AS CHAVES */
SHOW CREATE TABLE TIME;

/* A34 - ORGANIZACAO DE CHAVES - CONSTRAINT (REGRA) */

CREATE TABLE JOGADOR(


IDJOGADOR INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30)
);

CREATE TABLE TIMES(


IDTIME INT PRIMARY KEY AUTO_INCREMENT,
NOMETIME VARCHAR(30),
ID_JOGADOR INT,
FOREIGN KEY(ID_JOGADOR)
REFERENCES JOGADOR(IDJOGADOR)
);

INSERT INTO JOGADOR VALUES(NULL,'GUERRERO');


INSERT INTO TIMES VALUES(NULL,'FLAMENGO',1);

SHOW CREATE TABLE JOGADOR;


SHOW CREATE TABLE TIMES;

/* A35 - ORGANIZANDO CHAVES


*/

SHOW TABLES;

DROP TABLE ENDERECO;


DROP TABLE TELEFONE;
DROP TABLE CLIENTE;

CREATE TABLE CLIENTE(


IDCLIENTE INT,
NOME VARCHAR(30) NOT NULL
);

CREATE TABLE TELEFONE(


IDTELEFONE INT,
TIPO CHAR(3) NOT NULL,
NUMERO VARCHAR(10) NOT NULL,
ID_CLIENTE INT
);
ALTER TABLE CLIENTE ADD CONSTRAINT PK_CLIENTE
PRIMARY KEY(IDCLIENTE);

ALTER TABLE TELEFONE ADD CONSTRAINT FK_CLIENTE_TELEFONE


FOREIGN KEY(ID_CLIENTE) REFERENCES CLIENTE(IDCLIENTE);

SHOW CREATE TABLE TELEFONE;

/* DICIONARIO DE DADOS */

SHOW DATABASES;

USE INFORMATION_SCHEMA;

STATUS

SHOW TABLES;

DESC TABLE_CONSTRAINTS;

SELECT CONSTRAINT_SCHEMA AS "BANCO",


TABLE_NAME AS "TABELA",
CONSTRAINT_NAME AS "NOME REGRA",
CONSTRAINT_TYPE AS "TIPO"
FROM TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = 'COMERCIO';

/* APAGANDO CONSTRAINTS */

USE COMERCIO;

ALTER TABLE TELEFONE


DROP FOREIGN KEY FK_CLIENTE_TELEFONE;

ALTER TABLE TELEFONE ADD CONSTRAINT FK_CLIENTE_TELEFONE


FOREIGN KEY(ID_CLIENTE) REFERENCES CLIENTE(IDCLIENTE);

/*36 E ACOES DE CONSTRAINTS */

SHOW TABLES;

INSERT INTO CLIENTE VALUES(1,'RICARDO');


INSERT INTO CLIENTE VALUES(2,'CLARA');
INSERT INTO CLIENTE VALUES(3,'JULIO');
INSERT INTO CLIENTE VALUES(4,'ANA');

INSERT INTO TELEFONE VALUES(10,'CEL','37834334',2);


INSERT INTO TELEFONE VALUES(20,'RES','67465656',2);
INSERT INTO TELEFONE VALUES(30,'CEL','88665645',1);
INSERT INTO TELEFONE VALUES(40,'RES','77543546',3);
INSERT INTO TELEFONE VALUES(50,'COM','75454675',1);
INSERT INTO TELEFONE VALUES(60,'CEL','76765455',4);

SELECT NOME, TIPO, NUMERO


FROM CLIENTE
INNER JOIN TELEFONE
ON IDCLIENTE = ID_CLIENTE;
/*ERRO DE REFERENCIA */
DELETE FROM CLIENTE WHERE IDCLIENTE = 1;

/*CORRIGIR ERRO*/
DELETE FROM TELEFONE
WHERE ID_CLIENTE = 1;
DELETE FROM CLIENTE WHERE IDCLIENTE = 1;

/* APAGANDO A FOREIGN KEY */

ALTER TABLE TELEFONE DROP FOREIGN KEY FK_CLIENTE_TELEFONE;

/*RECRIANDO A FK */

ALTER TABLE TELEFONE ADD CONSTRAINT FK_CLIENTE_TELEFONE


FOREIGN KEY(ID_CLIENTE) REFERENCES CLIENTE(IDCLIENTE)
ON DELETE CASCADE;

SELECT NOME, TIPO, NUMERO


FROM CLIENTE
INNER JOIN TELEFONE
ON IDCLIENTE = ID_CLIENTE;

DELETE FROM CLIENTE WHERE IDCLIENTE = 2;

ALTER TABLE TELEFONE DROP FOREIGN KEY FK_CLIENTE_TELEFONE;

ALTER TABLE TELEFONE ADD CONSTRAINT FK_CLIENTE_TELEFONE


FOREIGN KEY(ID_CLIENTE) REFERENCES CLIENTE(IDCLIENTE)
ON DELETE SET NULL;

SELECT NOME, TIPO, NUMERO


FROM CLIENTE
INNER JOIN TELEFONE
ON IDCLIENTE = ID_CLIENTE;

SELECT * FROM CLIENTE;

DELETE FROM CLIENTE WHERE IDCLIENTE = 3;

SELECT * FROM TELEFONE;

/* SET NULL - DELETE CASCADE */

/*A37 CORRECAO EX 01 */

CREATE DATABASE PROJETO;

USE PROJETO;

/* A38 MODELO FISICO */

CREATE DATABASE OFICINA;

USE OFICINA;

CREATE TABLE CLIENTE(


IDCLIENTE INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30) NOT NULL,
SEXO ENUM('M','F') NOT NULL,
ID_CARRO INT UNIQUE
);

CREATE TABLE TELEFONE(


IDTELEFONE INT PRIMARY KEY AUTO_INCREMENT,
TIPO ENUM('CEL','RES','COM') NOT NULL,
NUMERO VARCHAR(30) NOT NULL,
ID_CLIENTE INT
);

CREATE TABLE MARCA(


IDMARCA INT PRIMARY KEY AUTO_INCREMENT,
MARCA VARCHAR(30) UNIQUE
);

CREATE TABLE CARRO(


IDCARRO INT PRIMARY KEY AUTO_INCREMENT,
MODELO VARCHAR(30) NOT NULL,
PLACA VARCHAR(30) NOT NULL UNIQUE,
ID_MARCA INT
);

CREATE TABLE COR(


IDCOR INT PRIMARY KEY AUTO_INCREMENT,
COR VARCHAR(30) UNIQUE
);

CREATE TABLE CARRO_COR(


ID_CARRO INT,
ID_COR INT,
PRIMARY KEY(ID_CARRO,ID_COR)
);

/* CONSTRAINTS */

ALTER TABLE TELEFONE


ADD CONSTRAINT FK_TELEFONE_CLIENTE
FOREIGN KEY(ID_CLIENTE)
REFERENCES CLIENTE(IDCLIENTE);

ALTER TABLE CLIENTE


ADD CONSTRAINT FK_CLIENTE_CARRO
FOREIGN KEY(ID_CARRO)
REFERENCES CARRO(IDCARRO);

ALTER TABLE CARRO


ADD CONSTRAINT FK_CARRO_MARCA
FOREIGN KEY(ID_MARCA)
REFERENCES MARCA(IDMARCA);

ALTER TABLE CARRO_COR


ADD CONSTRAINT FK_COR
FOREIGN KEY(ID_COR)
REFERENCES COR(IDCOR);
ALTER TABLE CARRO_COR
ADD CONSTRAINT FK_CARRO
FOREIGN KEY(ID_CARRO)
REFERENCES CARRO(IDCARRO);

/* PREENCHER O BANCO COM NO MINIMO 10 CLIENTES */

INSERT INTO CARRO VALUES(NULL,'')

/* A 39 ENTENDENDO TRIGGERS */

/* ESTRUTURA DE UMA TRIGGER */

CREATE TRIGGER NOME


BEFORE/AFTER INSERT/DELETE/UPDATE ON TABELA
FOR EACH ROW (PARA CADA LINHA)
BEGIN -> INICIO

QUALQUER COMANDO SQL

END -> FIM

CREATE DATABASE AULA40;

USE AULA40;

CREATE TABLE USUARIO(


IDUSUARIO INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30),
LOGIN VARCHAR(30),
SENHA VARCHAR(100)
);

CREATE TABLE BKP_USUARIO(


IDBACKUP INT PRIMARY KEY AUTO_INCREMENT,
IDUSUARIO INT,
NOME VARCHAR(30),
LOGIN VARCHAR(30)
);

/* CRIANDO A TRIGGER */

DELIMITER $

CREATE TRIGGER BACKUP_USER


BEFORE DELETE ON USUARIO
FOR EACH ROW
BEGIN

INSERT INTO BKP_USUARIO VALUES


(NULL,OLD.IDUSUARIO,OLD.NOME,OLD.LOGIN);
END
$

INSERT INTO USUARIO VALUES(NULL,'ANDRADE','ANDRADE2009','HEXACAMPEAO');

SELECT * FROM USUARIO;


DELETE FROM USUARIO WHERE IDUSUARIO = 1;

/* A 41 - COMUNICACAO ENTRE BANCOS */

CREATE DATABASE LOJA;

USE LOJA;

CREATE TABLE PRODUTO(


IDPRODUTO INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30),
VALOR FLOAT(10,2)
);

STATUS

CREATE DATABASE BACKUP;

USE BACKUP;

CREATE TABLE BKP_PRODUTO(


IDBKP INT PRIMARY KEY AUTO_INCREMENT,
IDPRODUTO INT,
NOME VARCHAR(30),
VALOR FLOAT(10,2)
);

USE LOJA;

STATUS

INSERT INTO BACKUP.BKP_PRODUTO VALUES(NULL,1000,'TESTE',0.0);

SELECT * FROM BACKUP.BKP_PRODUTO;

DELIMITER $

CREATE TRIGGER BACKUP_PRODUT


BEFORE INSERT ON PRODUTO
FOR EACH ROW
BEGIN

INSERT INTO BACKUP.BKP_PRODUTO VALUES(NULL,NEW.IDPRODUTO,


NEW.NOME,NEW.VALOR);

END
$

DELIMITER ;

INSERT INTO PRODUTO VALUES(NULL,'LIVRO MODELAGEM',50.00);


INSERT INTO PRODUTO VALUES(NULL,'LIVRO BI',80.00);
INSERT INTO PRODUTO VALUES(NULL,'LIVRO ORACLE',70.00);
INSERT INTO PRODUTO VALUES(NULL,'LIVRO SQL SERVER',100.00);

SELECT * FROM PRODUTO;

SELECT * FROM BACKUP.BKP_PRODUTO;


DELIMITER $

CREATE TRIGGER BACKUP_PRODUTO_DEL


BEFORE DELETE ON PRODUTO
FOR EACH ROW
BEGIN

INSERT INTO BACKUP.BKP_PRODUTO VALUES(NULL,OLD.IDPRODUTO,


OLD.NOME,OLD.VALOR);

END
$

DELIMITER ;

DELETE FROM PRODUTO WHERE IDPRODUTO = 2;

DROP TRIGGER BACKUP_PRODUT;

DELIMITER $

CREATE TRIGGER BACKUP_PRODUTO


AFTER INSERT ON PRODUTO
FOR EACH ROW
BEGIN

INSERT INTO BACKUP.BKP_PRODUTO VALUES(NULL,NEW.IDPRODUTO,


NEW.NOME,NEW.VALOR);

END
$

DELIMITER ;

INSERT INTO PRODUTO VALUES(NULL,'LIVRO C#',100.00);

SELECT * FROM PRODUTO;


SELECT * FROM BACKUP.BKP_PRODUTO;

ALTER TABLE BACKUP.BKP_PRODUTO


ADD EVENTO CHAR(1);

DROP TRIGGER BACKUP_PRODUTO_DEL;

DELIMITER $

CREATE TRIGGER BACKUP_PRODUTO_DEL


BEFORE DELETE ON PRODUTO
FOR EACH ROW
BEGIN

INSERT INTO BACKUP.BKP_PRODUTO VALUES(NULL,OLD.IDPRODUTO,


OLD.NOME,OLD.VALOR,'D');

END
$

DELIMITER ;
DELETE FROM PRODUTO WHERE IDPRODUTO = 4;

SELECT * FROM BACKUP.BKP_PRODUTO;

/* A 43 - TRIGGER DE AUDITORIA */

DELIMITER ;

DROP DATABASE LOJA;

DROP DATABASE BACKUP;

CREATE DATABASE LOJA;

USE LOJA;

CREATE TABLE PRODUTO(


IDPRODUTO INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30),
VALOR FLOAT(10,2)
);

INSERT INTO PRODUTO VALUES(NULL,'LIVRO MODELAGEM',50.00);


INSERT INTO PRODUTO VALUES(NULL,'LIVRO BI',80.00);
INSERT INTO PRODUTO VALUES(NULL,'LIVRO ORACLE',70.00);
INSERT INTO PRODUTO VALUES(NULL,'LIVRO SQL SERVER',100.00);

/*QUANDO*/
SELECT NOW();
/*QUEM*/
SELECT CURRENT_USER();

CREATE DATABASE BACKUP;

USE BACKUP;

CREATE TABLE BKP_PRODUTO(


IDBACKUP INT PRIMARY KEY AUTO_INCREMENT,
IDPRODUTO INT,
NOME VARCHAR(30),
VALOR_ORIGINAL FLOAT(10,2),
VALOR_ALTERADO FLOAT(10,2),
DATA DATETIME,
USUARIO VARCHAR(30),
EVENTO CHAR(1)

);

USE LOJA;

SELECT * FROM PRODUTO;

DELIMITER $

CREATE TRIGGER AUDIT_PROD


AFTER UPDATE ON PRODUTO
FOR EACH ROW
BEGIN
INSERT INTO BACKUP.BKP_PRODUTO VALUES(NULL,OLD.IDPRODUTO,OLD.NOME,
OLD.VALOR,NEW.VALOR,NOW(),CURRENT_USER(),'U');

END
$

DELIMITER ;

UPDATE PRODUTO SET VALOR = 110.00


WHERE IDPRODUTO = 4;

SELECT * FROM PRODUTO;

SELECT * FROM BACKUP.BKP_PRODUTO;

/* A44 - AUTORELACIONAMENTO */

CREATE TABLE CURSOS(


IDCURSO INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30),
HORAS INT,
VALOR FLOAT(10,2),
ID_PREREQ INT
);

ALTER TABLE CURSOS ADD CONSTRAINT FK_PREREQ


FOREIGN KEY(ID_PREREQ) REFERENCES CURSOS(IDCURSO);

INSERT INTO CURSOS VALUES(NULL,'BD RELACIONAL',20,400.00,NULL);


INSERT INTO CURSOS VALUES(NULL,'BUSINESS INTELLIGENCE',40,800.00,1);
INSERT INTO CURSOS VALUES(NULL,'RELATORIOS AVANCADOS',20,600.00,2);
INSERT INTO CURSOS VALUES(NULL,'LOGICA PROGRAM',20,400.00,NULL);
INSERT INTO CURSOS VALUES(NULL,'RUBY',30,500.00,4);

SELECT * FROM CURSOS;

SELECT NOME, VALOR, HORAS, IFNULL(ID_PREREQ,"SEM REQ") REQUISITO


FROM CURSOS;

/* NOME, VALOR, HORAS E O NOME DO PRE REQUISITO DO CURSO */

SELECT
C.NOME AS CURSO,
C.VALOR AS VALOR,
C.HORAS AS CARGA,
IFNULL(P.NOME, "---") AS PREREQ
FROM CURSOS C LEFT JOIN CURSOS P
ON P.IDCURSO = C.ID_PREREQ;

/* A 45 - CURSORES */

CREATE DATABASE CURSORES;


USE CURSORES;

CREATE TABLE VENDEDORES(


IDVENDEDOR INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(50),
JAN INT,
FEV INT,
MAR INT
);

INSERT INTO VENDEDORES VALUES(NULL,'MAFRA',32432,242334,574545);


INSERT INTO VENDEDORES VALUES(NULL,'CLARA',65465,65443,653454);
INSERT INTO VENDEDORES VALUES(NULL,'JOAO',12432,65356,8756);
INSERT INTO VENDEDORES VALUES(NULL,'LILIAN',4567,9676,8765);
INSERT INTO VENDEDORES VALUES(NULL,'ANTONIO',3467,68756,99765);
INSERT INTO VENDEDORES VALUES(NULL,'GLORIA',54786,76889,7098);

SELECT * FROM VENDEDORES;

SELECT NOME, (JAN+FEV+MAR) AS TOTAL FROM VENDEDORES;


SELECT NOME, (JAN+FEV+MAR) AS TOTAL, (JAN+FEV+MAR)/3 AS MEDIA FROM VENDEDORES;

CREATE TABLE VEND_TOTAL(


NOME VARCHAR(50),
JAN INT,
FEV INT,
MAR INT,
TOTAL INT,
MEDIA INT
);

DELIMITER $

CREATE PROCEDURE INSEREDADOS()


BEGIN
DECLARE FIM INT DEFAULT 0;
DECLARE VAR1, VAR2, VAR3, VTOTAL, VMEDIA INT;
DECLARE VNOME VARCHAR(50);

DECLARE REG CURSOR FOR(


SELECT NOME, JAN, FEV, MAR FROM VENDEDORES
);

DECLARE CONTINUE HANDLER FOR NOT FOUND SET FIM = 1;

OPEN REG;

REPEAT

FETCH REG INTO VNOME, VAR1, VAR2, VAR3;


IF NOT FIM THEN

SET VTOTAL = VAR1 + VAR2 + VAR3;


SET VMEDIA = VTOTAL / 3;

INSERT INTO VEND_TOTAL


VALUES(VNOME,VAR1,VAR2,VAR3,VTOTAL,VMEDIA);

END IF;

UNTIL FIM END REPEAT;

CLOSE REG;
END
$

SELECT * FROM VENDEDORES;


SELECT * FROM VEND_TOTAL;

DELIMITER ;

CALL INSEREDADOS();

INSERT INTO VENDEDORES VALUES(NULL,'LETICIA',656,3546,234545);


INSERT INTO VENDEDORES VALUES(NULL,'CELIA',6766,56556,65454);

SELECT * FROM VENDEDORES;


SELECT * FROM VEND_TOTAL;

DELETE FROM VEND_TOTAL;

CALL INSEREDADOS();

/* A 46 TRIGGERS COM VARIAVEIS */

DELIMITER $

CREATE TRIGGER CADTOTAL


BEFORE INSERT ON VENDEDORES
FOR EACH ROW
BEGIN
DECLARE VTOTAL, VMEDIA INT;

SET VTOTAL := NEW.JAN + NEW.FEV + NEW.MAR;


SET VMEDIA := (NEW.JAN + NEW.FEV + NEW.MAR)/3;

INSERT INTO VEND_TOTAL


VALUES(NEW.NOME,NEW.JAN,NEW.FEV,NEW.MAR,VTOTAL,VMEDIA);

END
$

DELIMITER ;

INSERT INTO VENDEDORES VALUES(NULL,'JULIO',9999,9999,9999);

SELECT * FROM VENDEDORES;


SELECT * FROM VEND_TOTAL;

/* A47 SEGUNDA E TERCEIRAS FORMAS NORMAIS */

/*
PRIMEIRA FN

ATOMICIDADE - UM CAMPO NAO PODE SER DIVISIVEL


UM CAMPO NAO PODE SER VETORIZADO
PK CHAVE PRIMARIA

*/

CREATE DATABASE CONSULTORIO;

CREATE TABLE PACIENTE(


IDPACIENTE INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30),
SEXO CHAR(1),
EMAIL VARCHAR(30),
NASCIMENTO DATE
);

CREATE TABLE MEDICO(


IDMEDICO INT PRIMARY KEY IDENTITY,
NOME VARCHAR(30),
SEXO CAHR(1),
ESPECIALIDADE VARCHAR(30),
FUNCIONARIO ENUM('S','N')
);

CREATE TABLE HOSPITAL(


IDHOSPITAL INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(30),
BAIRRO VARCHAR(30),
CIDADE VARCHAR(30),
ESTADO CHAR(2)
);

CREATE TABLE CONSULTA(


IDCONSULTA INT PRIMARY KEY AUTO_INCREMENT,
ID_PACIENTE INT,
ID_MEDICO INT,
ID_HOSPITAL INT,
DATA DATETIME,
DIAGNOSTICO VARCHAR(50)
);

CREATE TABLE INTERNACAO(


IDINTERNACAO INT PRIMARY KEY AUTO_INCREMENT,
ENTRADA DATETIME,
QUARTO INT,
SAIDA DATETIME,
OBSERVACOES VARCHAR(50),
ID_CONSULTA INT UNIQUE
);