exerci cio
TRANSCRIPT
-
1
Lista de Exerccios Inicial
1) Visualizar os databases existentes. SHOW DATABASES; 2) Criar um database chamado "sistema". CREATE DATABASE sistema; 3) Visualizar novamente os databases existentes e definir como padro o database "sistema". SHOW DATABASES; USE sistema; 4) Definir o mecanismo padro como InnoDB (transacional). Este comando funciona somente no MySQL. SET STORAGE_ENGINE=InnoDB; Obs: transacional armazenamento seguro, no precisa de escalonamento, aumenta a performance e multi-utilizadores 5) Criar a tabela "departamento", conforme especificado no diagrama. CREATE TABLE departamento ( id_departamento INTEGER NOT NULL, nome VARCHAR(100) NOT NULL, telefone CHAR(15), PRIMARY KEY (id_departamento) ); 6) Visualizar tabelas existentEs. SHOW TABLES; 7) Visualizar a estrutura da tabela "departamento". DESCRIBE departamento;
8) Criar a tabela "funcionario", conforme especificado no diagrama (sem a chave estrangeira - Foreign Key). CREATE TABLE funcionario (
-
2
id_funcionario INTEGER NOT NULL, nome VARCHAR(100) NOT NULL, id_departamento INTEGER NOT NULL, data_cadastro DATE, PRIMARY KEY (id_funcionario) ); DESCRIBE funcionario;
9) Alterar a tabela criada anteriormente para adicionar a chave estrangeira (para quando se esquece da chave estrangeira). ALTER TABLE funcionario ADD CONSTRAINT departamento_funcionario_fk FOREIGN KEY (id_departamento) REFERENCES departamento (id_departamento) ON DELETE NO ACTION ON UPDATE NO ACTION;
10) Deletar a tabela funcionario. DROP TABLE funcionario; 11) Criar a tabela "funcionario", conforme especificado no diagrama (com a chave estrangeira - Foreign Key). CREATE TABLE funcionario ( id_funcionario INTEGER NOT NULL, nome VARCHAR(100) NOT NULL, id_departamento INTEGER NOT NULL, data_cadastro DATE, PRIMARY KEY (id_funcionario), FOREIGN KEY (id_departamento) REFERENCES departamento (id_departamento) ); DESCRIBE funcionario;
-
3
12) Definir o mecanismo padro para aceitar acentuao na incluso de dados. Isso deve ser feito antes da entrada de dados. Os dados que j foram armazenados no mostrar acentuao. Utilize o comando show variables like "%collation%"; para verificar a situao atual. SET NAMES LATIN1;
Outra soluo: SET NAMES UTF8; Outra soluo: ALTER DATABASE nome_database (ex. sistema) DEFAULT CHARACTER SET UTF8 COLLATE utf8_unicode_ci (ou latin1_swedish_ci); ALTER TABLE nome_tabela (ex. departamento) DEFAULT CHARACTER SET UTF8 COLLATE utf8_unicode_ci (ou latin1_swedish_ci);
Outra soluo: Abrir o arquivo db.opt dentro do diretrio c:/Arquivos de Programas/MySQL Sever 5.5/Data/Performance_schema no bloco de notas e adicionar a linha de comando default-collation=latin1_swedish_ci (como mostra nas figuras abaixo).
-
4
13) Inserindo registros na tabela "departamento" (sem especificao dos campos). INSERT INTO departamento VALUES (100, 'Departamento de Tecnologia', '3333-1111'); INSERT INTO departamento VALUES (200, 'Departamento de Recursos Humanos', NULL);
OBS: para datas
14) Inserindo registro na tabela "departamento" (com especificao dos campos). INSERT INTO departamento (id_departamento, nome) VALUES (300, 'Departamento de Vendas'); INSERT INTO departamento (id_departamento, nome, telefone) VALUES (400, 'Departamento de Marketing', '3333-4444');
-
5
15) Inserir mais 5 registros na tabela departamento. INSERT INTO departamento VALUES (500, 'Departamento de Assistncia Tcnica', '3333-5555'); INSERT INTO departamento VALUES (600, 'Departamento Financeiro', '3333-6666'); INSERT INTO departamento VALUES (700, 'Departamento de Garantia', '3333-7777'); INSERT INTO departamento VALUES (800, 'Departamento de Peas', '3333-8888'); INSERT INTO departamento VALUES (900, 'Departamento de Estoque', '3333-9999'); 16) Visualizar todos os dados da tabela "departamento". SELECT * FROM departamento; 17) Visualizar todos os dados da tabela "departamento" em ordem alfabtica de nome. SELECT * FROM departamento ORDER BY nome;
18) Visualizar os dados da tabela "departamento" em ordem decrescente de nome: SELECT * FROM departamento ORDER BY nome DESC;
19) Visualizar os dados dos departamentos para os quais no foram atribudos telefones. SELECT * FROM departamento WHERE telefone IS NULL; 20) Visualizar os dados dos departamentos que tenham telefones. SELECT * FROM departamento WHERE telefone IS NOT NULL;
-
6
21) Visualizar os dados dos departamentos cujo cdigo seja igual a 300. Perceba que "id_departamento" a chave primria. SELECT * FROM departamento WHERE id_departamento = 300; 22) Visualizar os dados dos departamentos cujo nome comea com a letra "D". SELECT * FROM departamento WHERE nome LIKE 'D%'; 23) Visualizar os dados dos departamentos cujo nome termina com a palavra "Vendas". SELECT * FROM departamento WHERE nome LIKE '%Vendas'; 24) Visualizar os dados dos departamentos cujo nome contenha a palavra "de". SELECT * FROM departamento WHERE nome LIKE '%de%'; 25) Visualizar os dados dos departamentos cujo nome NO contenha a palavra "de". SELECT * FROM departamento WHERE nome NOT LIKE '%de%'; 26) Atualizar (ou modificar) o telefone do departamento cujo cdigo identificador seja igual a 300. UPDATE departamento SET telefone='7777-7777' WHERE id_departamento=300; 27) Apagar departamento cujo cdigo seja igual a 400.
DELETE FROM departamento WHERE id_departamento = 400; 28) Digite o comando para fechar/desconectar do MySQL. QUIT ou \q ou EXIT ou CTRL + C
29) Digite o comando para verificar a verso e data atual. SELECT VERSION(), CURRENT_DATE; ou SELECT NOW(); (mostra data e hora)
30) Digite o comando para verificar o usurio. SELECT USER();
-
7
31) Digite o comando para cancelar outro comando que est no meio do processo de entrada no prompt. \c
-
8
OBSERVAO: Inicio da Aula Para entrar no MySQL Ir no prompt de Comando:
Entrar nos diretrios abaixo: CD \XAMPP\MYSQL\BIN Executar o commando: MYSQL U ROOT Fim da aula Salvar Banco de Dados Ir no Explore do Windows e procurar os diretrios: C:\XAMPP\MYSQL\DATA Selecionar pasta Sistema, menu suspenso EDITAR\COPIAR, selecionar pendrive, menu suspenso EDITAR\COLAR
-
9
Lista de Exerccios 1:
Base de Dados,Tabelas, Crud (Insert, Select, Update e Delete) e Restries
1) Criar a base de dados livraria.
CREATE DATABASE livraria;
Comando Create: Este comando permite a criao de banco de dados e tabelas.
Sintaxe: CREATE DATABASE < nome_db >;
onde: nome_db - indica o nome do Banco de Dados a ser criado.
2) Listar as bases de dados existentes.
SHOW DATABASES;
3) Remover a base de dados livraria.
DROP DATABASE livraria;
4) Criar novamente a base de dados livraria e Selecionar a base de dados livraria.
CREATE DATABASE livraria;
USE livraria;
5) Criar a tabela livro.
CREATE TABLE livro (
Titulo VARCHAR(255),
preco DOUBLE
)
ENGINE=InnoDB;
Sintaxe: CREATE TABLE < nome_tabela >
( nome_atributo1 < tipo > [ NOT NULL ],
nome_atributo2 < tipo > [ NOT NULL ],
......
nome_atributoN < tipo > [ NOT NULL ] ) ;
onde: nome_table - indica o nome da tabela a ser criada.
nome_atributo - indica o nome do campo a ser criado na tabela.
tipo - indica a definio do tipo de atributo ( integer(n), char(n),
real(n,m), date... ).
n- nmero de dgitos ou de caracteres
m- nmero de casas decimais
6) Listar as tabelas existentes.
SHOW TABLES;
7) Remover a tabela livro.
DROP TABLE livro;
Comando Drop: Este comando elimina a definio da tabela, seus dados e referncias.
Sintaxe: DROP TABLE < nome_tabela > ;
8) Criar novamente a tabela livro e Adicionar restries nas colunas que so obrigatrias. No campo ttulo, o
usurio no pode deixar o campo em branco (nulo) e tambm no pode repetir o mesmo ttulo. O campo
preco tambm no pode ser nulo.
CREATE TABLE livros (
titulo VARCHAR(255) NOT NULL UNIQUE,
-
10
preco DOUBLE NOT NULL
)
ENGINE=InnoDB;
9) Alterar (renomear) o nome da tabela de livros para livro.
ALTER TABLE livros RENAME livro;
10) Adicionar a coluna paginas na tabela livro.
ALTER TABLE livro ADD paginas INTEGER;
Comando Alter: Este comando permite inserir/eliminar atributos nas tabelas j existentes.
Sintaxe: ALTER TABLE < nome_tabela > ADD / DROP (
nome_atributo1 < tipo > [ NOT NULL ],
nome_atributoN < tipo > [ NOT NULL ] ) ;
11) Remover a coluna paginas da tabela livro.
ALTER TABLE livro DROP COLUMN paginas;
12) Inserir um registro (dado) na tabela livro.
INSERT INTO livro (titulo, preco) VALUES (Java, 98.75);
Inserir (Insert): INSERT INTO [] [VALUES ]
Possibilita a insero de registros em tabelas sem digitao dos dados.
13) Utilizando a tabela livro, crie uma consulta que mostre todos os registros dos livros cadastrados.
SELECT * FROM livro;
O exemplo utiliza o coringa "*" para selecionar as colunas na ordem em que foram criadas. A instruo
SELECT seleciona um grupo de registros de uma (ou mais) tabela(s). No caso a instruo FROM indica a
necessidade de pesquisar os dados apenas na tabela livro.
14) Alterar (atualizar) o registro (dado) preco de 98.75 para 115.9 do ttulo igual a Java.
UPDATE livro SET preco = 115.9 WHERE titulo = Java;
Atualizar (Update): UPDATE SET = [WHERE ];
15) Alterar o nome do campo de preco para valor.
ALTER TABLE livro CHANGE preco valor DOUBLE NOT NULL;
Alterar: ALTER TABLE CHANGE
;
16) Remover (excluir) o livro com o titulo igual a Java.
DELETE FROM livro WHERE titulo = Java;
Excluir (Delete): DELETE FROM [WHERE ];
17) Abra o editor de texto e digite o cdigo abaixo para criar uma tabela. Depois salve o arquivo com o nome
create-table-editora.sql no diretrio: C:\Program Files\MySQL\MySQL Server 5.5\bin
USE livraria;
CREATE TABLE editora (
id BIGINT NOT NULL AUTO_INCREMENT,
nome VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
-
11
PRIMARY KEY (id)
)
ENGINE=InnoDB;
Em seguida, use o comando source para executar o arquivo que foi criado no prompt do mysql.
SOURCE create-table-editora.sql;
Obs: para saber onde o MySQL grava o banco de dados em seu computador, abra o arquivo my.ini no
bloco de nota que esta dentro do diretrio: C:\Program Files\MySQL\MySQL Server 5.5 e procure a linha
referente ao path conforme mostrado a seguir. Normalmente, o diretrio ProgramData esta como arquivo
oculto.
#Path to the database root
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
O comando EXIT finaliza a sesso do MySQL Ou o comando \QUIT, ou \q ou CTRL + C
O comando SELECT VERSION(); verificar a verso
O comando CURRENT_DATE; verifica a data atual
O comando SELECT NOW(); mostra a data e a hora
O comando SELECT USER(); verifica o usurio
O comando \c limpa (encerra) a linha atual do prompt
18) Abra o editor de texto e digite o cdigo abaixo para adicionar alguns registros na tabela editora. Depois
salve o arquivo com o nome adicionando-registros-editora.sql.
INSERT INTO editora (nome, email) VALUES (Atlas, [email protected]);
INSERT INTO editora (nome, email) VALUES (Personal, [email protected]);
INSERT INTO editora (nome, email) VALUES (Artmed, [email protected]);
Em seguida, use o comando source para executar o arquivo que foi criado no prompt do mysql para
adicionar os registros.
SOURCE adicionando-registros-editora.sql;
19) Selecione (consulte) os registros (dados) das colunas nome e email da tabela editora.
SELECT nome, email FROM editora;
-
12
Lista Exerccios 2:
Consultas (Select, Where, Order By) e Funes de Agrupamento (Group By, Having,
Distinct e Limit)
20) Crie uma tabela Aluno com as colunas nome(VARCHAR(255)), email(VARCHAR(255),
telefone(VARCHAR(10)), altura(DECIMAL(3,2), aprovado(TINYINT(1)).
21) Crie uma tabela Professor com as colunas nome(VARCHAR(255)), email(VARCHAR(255),
telefone(VARCHAR(10)) e altura(DECIMAL(3,2).
22) Inserir alguns dados nas tabelas de Aluno e Professor.
23) Selecione (consulte) todos os registros de vrias tabelas aluno e professor cruzando as informaes.
SELECT * FROM aluno, professor;
24) Quando duas tabelas tem colunas com o mesmo nome, como consultamos eliminando a ambiguidade?
(Utiliza-se o nome das tabelas).
-
13
SELECT aluno.nome, professor.nome FROM aluno, professor;
25) Colocar apelido nas tabelas aluno e professor para facilitar as consultas utilizando o comando AS.
SELECT a.nome AS aluno_nome, p.nome AS professor_nome FROM aluno AS a, professor AS p;
26) Consultar todos os alunos ordenado de forma crescente pela coluna altura.
SELECT * FROM aluno ORDER BY altura;
27) Consultar todos os alunos ordenado de forma crescente pelas colunas altura e nome.
SELECT * FROM aluno ORDER BY altura, nome;
28) Consultar os campos altura e nome de todos os alunos ordenado de forma decrescente na coluna altura
e ordenado de forma crescente na coluna nome.
SELECT altura, nome FROM aluno ORDER BY altura DESC, nome ASC;
-
14
29) Consultas utilizando filtros (WHERE e Operadores de Comparao).
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com altura maior (>) que 1.80.
SELECT * FROM aluno WHERE altura > 1.80;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com altura igual (=) a 1.76.
SELECT * FROM aluno WHERE altura = 1.76;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com altura diferente () de
1.76.
SELECT * FROM aluno WHERE altura 1.76;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com altura diferente (!=) de
1.76.
SELECT * FROM aluno WHERE altura != 1.76;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com altura menor e igual (
-
15
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com altura maior (=) a
1.76.
SELECT * FROM aluno WHERE altura >= 1.76;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com campo aprovado
verdadeiro (IS TRUE).
SELECT * FROM aluno WHERE aprovado IS TRUE;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com campo aprovado que no
seja igual a verdadeiro (IS NOT TRUE).
SELECT * FROM aluno WHERE aprovado IS NOT TRUE;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com campo nome nulo (IS
NULL).
SELECT * FROM aluno WHERE nome IS NULL;
-
16
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com campo nome que no
seja igual a nulo (IS NOT NULL).
SELECT * FROM aluno WHERE nome IS NOT NULL;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com altura entre 1.5 e 1.8
(BETWEEN 1.5 AND 1.8).
SELECT * FROM aluno WHERE altura BETWEEN 1.5 AND 1.8;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no tenho a altura entre
1.5 e 1.8 (NOT BETWEEN 1.5 AND 1.8).
SELECT * FROM aluno WHERE altura NOT BETWEEN 1.5 AND 1.8;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que comeam com o nome
Rafael (LIKE)
SELECT * FROM aluno WHERE nome LIKE Luciene%;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no comecem com o
nome Rafael (NOT LIKE).
SELECT * FROM aluno WHERE nome NOT LIKE Luciene%;
-
17
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos com altura igual a 1.76, 1.87 e
1.28 (IN).
SELECT * FROM aluno WHERE altura IN (1.76, 1.87, 1.28);
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no tenham a altura igual
a 1.76, 1.87 e 1.28 ( NOT IN).
SELECT * FROM aluno WHERE altura NOT IN (1.76, 1.87, 1.28);
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no tenham a altura igual
a 1.5, 1.6, 1.7 e 1.8 (NOT).
SELECT * FROM aluno WHERE NOT altura = 1.76;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no tenham a altura igual
a 1.5, 1.6, 1.7 e 1.8 (!=).
SELECT * FROM aluno WHERE ! altura = 1.76;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no tenham a altura
menor que 1.76 e nome que comea com Lucas (< AND LIKE).
SELECT * FROM aluno WHERE altura < 1.76 AND nome LIKE Lucas%;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no tenham a altura
menor que 1.76 e nome que comea com Lucas (< && LIKE).
SELECT * FROM aluno WHERE altura < 1.76 && nome LIKE Lucas%;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no tenham a altura
menor que 1.76 ou nome que comea com Lucas ou os dois (< OR LIKE).
SELECT * FROM aluno WHERE altura < 1.76 OR nome LIKE Lucas%;
-
18
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no tenham a altura
menor que 1.8 ou nome que comea com Rafael ou os dois (< || LIKE).
SELECT * FROM aluno WHERE altura < 1.8 || nome LIKE Rafael%;
Utilizando a tabela aluno, crie uma consulta que mostre todos os alunos que no tenham a altura
menor que 1.8 e nome no comea com Rafael ou alunos alunos que no tenho a altura menor que 1.8
e nome comea com Rafael (< XOR LIKE).
SELECT * FROM aluno WHERE altura < 1.76 XOR nome LIKE Lucas%;
30) Liste algumas consultas com funes de AGRUPAMENTO.
Utilizando a tabela aluno, crie uma consulta para contabiliza a quantidade de registros.
SELECT COUNT(*) FROM aluno;
Utilizando a tabela aluno, crie uma consulta para calcula a mdia da coluna altura.
SELECT AVG(altura) FROM aluno;
Utilizando a tabela aluno, crie uma consulta para somar os valores da coluna altura.
SELECT SUM(altura) FROM aluno;
Utilizando a tabela aluno, crie uma consulta para calcular o valor mximo da coluna altura.
SELECT MAX(altura) FROM aluno;
Utilizando a tabela aluno, crie uma consulta para calcular o valor mnimo da coluna altura.
SELECT MIN(altura) FROM aluno;
Utilizando a tabela aluno, crie uma consulta para calcular a varincia das alturas dos alunos.
SELECT VARIANCE(altura) FROM aluno;
Utilizando a tabela aluno, crie uma consulta para calcular o desvio padro da coluna altura.
SELECT STD(altura) FROM aluno; ou
SELECT STDDEV(altura) FROM aluno;
Utilizando a tabela aluno, crie uma consulta para calcular a mdia da coluna altura dos alunos onde o
campo aprovado igual a zero.
SELECT AVG(altura) FROM aluno WHERE aprovado = 0;
Utilizando a tabela aluno, crie uma consulta para calcular a varincia das alturas dos alunos com mais
de 1.70.
SELECT VARIANCE(altura) FROM aluno WHERE altura > 1.7;
Utilizando a tabela aluno, crie uma consulta para contabilizar a quatidade de alunos que foro
aprovados e reprovados e contabilizar a quantidade de alunos de cada grupo (aprovado / reprovado) .
SELECT aprovado, COUNT(*) FROM aluno GROUP BY aprovado;
Utilizando a tabela aluno, crie uma consulta para agrupar registros utilizando vrias colunas, por
exemplo, quantos homens e quantas mulheres foram aprovados ou reprovados.
SELECT sexo, aprovado, COUNT(*) FROM aluno GROUP BY sexo, aprovado;
Utilizando a tabela aluno, crie uma consulta para mostrar a soma das aturas agrupadas por sexo e cuja
soma de alturas seja maior que 1.2:
SELECT sexo, SUM(altura) AS 'Soma Altura' FROM aluno GROUP BY sexo HAVING SUM(altura) > 1.2;
Utilizando a tabela aluno, crie uma consulta para mostrar a soma das alturas agrupadas por sexo e
cuja soma de alturas seja maior que 1.2 e nome do aluno comeando pela letra 'L':
SELECT sexo, SUM(altura) AS 'Total' FROM aluno WHERE nome like 'L%' GROUP BY sexo HAVING SUM(altura) > 1.2;
Utilizando a tabela aluno, crie uma consulta para o nmero de alunos aprovados cujos nomes
comeam com a letra A ou terminam com a letra A, mas que no terminam com a letra A. D um apelido
para a coluna de alunos aprovados.
SELECT COUNT(*) AS total_aprovados FROM aluno WHERE aprovado = 1 AND nome LIKE A% XOR
%A GROUP BY aprovado;
Operadores lgicos
Operador Significado
= igual a
-
19
> maior que
>= maior que ou igual a
< menor que
no maior que
not between no entre dois valores informados
not in no existente numa dada lista de valores
not like diferente do padrao de caracteres informado
is not null no um valor nulo
Funes de Caracteres
Lower - fora caracteres maisculos aparecerem em minsculos.
Upper - fora caracteres minsculos aparecerem em maisculos.
Concat(x,y)- concatena a string "x" com a string "y".
Substring(x,y,str)- extrai um substring da string "str", comeando em "x", e termina em "y".
To_Char(num)- converte um valor numrico para uma string de caracteres.
To_Date(char,fmt)- converte uma string caracter em uma data.
^Q - converte data para o formato apresentado.
Funes Agregadas (ou de Agrupamento)
Funo Retorno
avg(n) retorna a mdia aritmtica de um campo numrico. Neste caso, a mdia do valor
n, ignorando nulos
count(expr) retorna a quantidade de registros que combinam com um determinado critrio de
seleo. Neste caso, a quantidade de vezes que o nmero da expr avalia para
algo nao nulo
max(expr) retorna o maior valor de um determinado campo selecionado. Neste caso, o
maior valor da expr
min(expr) retorna o menor valor de um de um determinado campo selecionado. Neste
caso, o menor valor da expr
sum(n) retorna a soma total dos valores numricos. Neste caso, a soma dos valores de
n, ignorando nulos
group by agrupa registros com campos semelhantes
having utilizada em conjunto com Group By. a expresso condicional para campos e
valores agregados, pois a clusula WHERE trabalha somente com valores no
agregados (simples).
-
20
Obs: As funes agregadas executam um clculo em um conjunto de valores e retornam um nico valor. Com exceo de COUNT, as funes agregadas ignoram valores nulos. As funes agregadas normalmente so usadas com a clusula GROUP BY da instruo SELECT.
31) Resultados repetidos de uma consulta podem ser eliminados atravs do comando DISTINCT. Utilizando a
tabela aluno, crie uma consulta para obter uma lista das cidades onde os alunos nasceram.
SELECT DISTINCT(cidade) FROM aluno;
32) A quantidade de resultados de uma consulta pode ser limitado pelo comando LIMIT. Consultar somente os
10 primeiros registros da tabela aluno.
SELECT * FROM aluno LIMIT 10;
33) Utilizando a tabela aluno, crie uma consulta que descarte os 5 primeiros registros da tabela aluno de 10
registros consultados, ou seja, o resultado dessa consulta conter no mximo 10 registros a partir do sexto.
SELECT * FROM aluno LIMIT 5,10;
-
21
Lista Exerccios 3:
Relacionamentos (Unique, Chave primria, Chave estrangeira, One to One, One to Many
ou Many to One, Many to Many)
34) Criar a tabela cliente com as colunas: cdigo (BIGINT) com auto incremento e NOT NULL, nome
(VARCHAR(255)) NOT NULL e cpf VARCHAR(20) com o comando para garantir a unicidade deste campo
(UNIQUE) (no pode inserir 2 clientes com o mesmo cpf ou que um cliente no seja inserido 2 vezes).
CREATE TABLE cliente (
codigo BIGINT NOT NULL AUTO_INCREMENT,
nome VARCHAR(255) NOT NULL,
cpf VARCHAR(20) UNIQUE,
PRIMARY KEY(codigo)
)
ENGINE=InnoDB;
35) Como alterar a tabela cliente se o campo cpf j existe para garantir a unicidade?
ALTER TABLE cliente ADD UNIQUE (cpf);
36) Adicionar os campos: primeiro_nome VARCHAR(255) NOT NULL, sexo VARCHAR(20) NOT NULL na
tabela aluno. Poderamos ter a coluna primeiro_nome definida com a restrio UNIQUE e a coluna sexo
sem a restrio. Ao tentarmos inserir um aluno do sexo masculino com o primeiro_nome Yuki, podemos ter
um problema, pois em alguns pases, o nome Yuki pode ser usado tanto para homens, quanto para
mulheres. Nesse caso, Como definir a restrio UNIQUE em um ndice composto pelas colunas
primeiro_nome e sexo. Insira alguns registros para testar a restrio UNIQUE e observe os resultados.
CREATE TABLE aluno (
primeiro_nome VARCHAR(255) NOT NULL,
sexo VARCHAR(20) NOT NULL,
UNIQUE INDEX (primeiro_nome, sexo)
)
ENGINE=InnoDB;
37) Crie ou Atualize a tabela livros para que ela contenha pelo menos, as colunas ttulo e autor, ambas
VARCHAR(255).
CREATE TABLE livro (
titulo VARCHAR(255) NOT NULL,
autor VARCHAR(255) NOT NULL
)
-
22
ENGINE = InnoDB;
38) Insira alguns valores na tabela livros. Tente inserir valores com ttulos e autores repetidos e observe o
resultado.
39) Remova todos os registros da tabela livros e faa uma alterao na mesma para que no seja permitida a
insero de valores repetidos nas colunas ttulo e autor. Depois disso, tente inserir valores com ttulos e
autores repetidos.
ALTER TABLE livro ADD UNIQUE INDEX(titulo, autor);
40) Criar a tabela cliente com as colunas: id (INT) NOT NULL, nome (VARCHAR(255)), cpf (VARCHAR (20)) e
UNIQUE, e use o campo id como chave primria.
CREATE TABLE cliente(
id INT NOT NULL,
cpf VARCHAR(20) UNIQUE,
nome VARCHAR(255),
PRIMARY KEY (id)
)
ENGINE = InnoDB;
Obs: a chave primria deve conter valores nicos, no nulos e uma tabela pode conter apenas uma coluna
como chave primria. Normalmente utilizado a coluna id para armazenar um cdigo de identificao do
registro dentro de uma tabela.
41) Criar uma tabela usurio para um banco de dados de uma rede social com as colunas: id (INT) NOT
NULL, nome VARCHAR(255), nome_usuario VARCHAR(10), senha VARCHAR(10), email VARCHAR(100),
sexo TINYINT(1), profisso VARCHAR(255), onde_estudou VARCHAR(255), hobbies VARCHAR(255),
gosto_musical VARCHAR(255) e chave primria id.
CREATE TABLE usuario(
id INT NOT NULL,
nome VARCHAR(255),
nome_usuario VARCHAR(10),
senha VARCHAR(10),
email VARCHAR(100),
sexo TINYINT(1),
profisso VARCHAR(255),
onde_estudou VARCHAR(255),
hobbies VARCHAR(255),
gosto_musical VARCHAR(255),
PRIMARY KEY (id)
)
ENGINE = InnoDB;
42) Podemos dividir a tabela de usurio criada anteriormente em duas: uma para as informaes pertinentes a
conta do usurio na rede social e outra para suas informaes pessoais perfil. Assim, definimos um
relacionamento One to One (um para um), no qual 1 usurio esta para 1 perfil assim como 1 perfil esta para
1 usurio. Apague a tabela usurio criada anteriormente e crie uma nova tabela com o relacionamento One
to One onde a chave estrangeira da tabela perfil (id) faz referncia a chave primria (id) definida na tabela
usurio.
CREATE TABLE usuario(
id INT NOT NULL,
nome_usuario VARCHAR(10),
senha VARCHAR(10),
email VARCHAR(100),
-
23
PRIMARY KEY (id)
)
ENGINE = InnoDB;
CREATE TABLE perfil(
id INT NOT NULL,
nome VARCHAR(255),
sexo TINYINT(1),
profissao VARCHAR(255),
onde_estudou VARCHAR(255),
hobbies VARCHAR(255),
gosto_musical VARCHAR(255),
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES usuario(id)
)
ENGINE = InnoDB;
CREATE TABLE `psna`.`user` (
`id_user` INT NOT NULL AUTO_INCREMENT ,
`login` VARCHAR(10) NOT NULL ,
`password` VARCHAR(10) NOT NULL ,
`confirm_password` VARCHAR(10) NOT NULL ,
`email` VARCHAR(50) NOT NULL ,
PRIMARY KEY (`id_user`) ,
UNIQUE INDEX `login_UNIQUE` (`login` ASC) )
DEFAULT CHARACTER SET = utf8;
CREATE TABLE `psna`.`profile` (
`id_profile` INT NOT NULL AUTO_INCREMENT ,
`number_usp` INT(10) NULL ,
`name` VARCHAR(100) NOT NULL ,
`institute` VARCHAR(100) NULL ,
`adress` VARCHAR(200) NULL ,
`phone` VARCHAR(30) NULL ,
`cell_phone` VARCHAR(30) NULL ,
PRIMARY KEY (`id_profile`) ,
CONSTRAINT `fk_user_profile_1`
FOREIGN KEY (`id_profile` )
REFERENCES `psna`.`user` (`id_user` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
DEFAULT CHARACTER SET = utf8;
Obs: a coluna com restrio FOREIGN KEY (Chave estrangeira) faz referncia a uma chave primria
definida em outra tabela. O uso da chave estrangeira traz alguns benefcios como prevenir que uma
operao realizada no banco de dados possa corromper a relao entre duas tabelas ou que dados
invlidos sejam inseridos.
Repare que a chave estrangeira id na tabela perfil far referncia a coluna id da tabela usurio e, por ser
uma chave estrangeira, o MySQL no permitir que um valor invlido (id inexistente de usurio) seja
atribudo a coluna id da tabela perfil. Sem a restrio FOREIGN KEY poderia ser atribudo qualquer nmero
inteiro. Alm disso, se algum tentar remover do banco de dados um usurio que no tenha uma entrada
relacionada a ele na tabela perfil, o MySQL informar que a operao no permitida. Para isso (remover o
usurio), necessrio primeiro remover a tabela perfil porque esta relacionada ao registro da tabela de
usurio.
-
24
43) Insira alguns registros para testar as restries e relacionamentos nas tabelas criadas anteriormente
(usurio e perfil). Observe os resultados.
44) Crie uma tabela livro que contenha apenas as colunas id, isbn e titulo. Caso a tabela j exista, remova e
crie ela novamente.
CREATE TABLE livro (
id INT NOT NULL,
isbn BIGINT,
titulo VARCHAR(255),
PRIMARY KEY (id)
)
ENGINE = InnoDB;
45) Crie tambm uma tabela livro_detalhe que contenha as informaes adicionais dos livros. Faa com que
essa tabela contenha a coluna que ser a chave primria da tabela, assim como uma chave estrangeira para
relacionar esta tabela com a tabela livro.
CREATE TABLE livro_detalhe (
id INT NOT NULL,
ano INT,
edicao INT,
preco DECIMAL (10,2),
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES livro(id)
)
ENGINE = InnoBD;
46) Adicione alguns registros nas tabelas criadas anteriormente para testar as restries e o relacionamento one
to one.
47) Criar a tabela conta com as colunas: id (INT) NOT NULL, numero INT UNIQUE, saldo DECIMAL (14,2),
limite DECIMAL (14,2), chave primria (id) e chave estrangeira (banco_id) REFERENCES banco (id). Neste
exemplo, pode-se entender o funcionamento da chave estrangeira. Para entender o funcionamento do
relacionamento One to Many ou Many to One, crie a tabela banco com as colunas id (INT) NOT NULL,
nome VARCHAR(255), endereco VARCHAR(255) e chave primria id.
CREATE TABLE conta(
id INT NOT NULL,
numero INT UNIQUE,
saldo DECIMAL(14,2),
limite DECIMAL (14,2),
banco_id INT,
PRIMARY KEY (id),
FOREIGN KEY (banco_id) REFERENCES banco(id)
)
ENGINE = InnoDB;
CREATE TABLE banco(
id INT NOT NULL,
nome VARCHAR(255),
endereco VARCHAR(255),
PRIMARY KEY (id),
)
ENGINE = InnoDB;
-
25
Obs: as tabelas banco e conta possuem um relacionamento One to Many, pois um banco pode possuir
diversas (many) contas enquanto que para que uma conta pertence a um nico (one) banco.
48) Insira alguns registros nas tabelas criadas anteriormente para testar as restries e o relacionamento One to
Many ou Many to One. Observe os resultados.
49) Crie ou altere as duas tabelas editora e livro. Crie as colunas e restries necessrias para obter um
relacionamento One to Many entre elas. Dica: uma editora pode publicar diversos livros e um livro s pode
pertencer a apenas uma editora.
CREATE TABLE editora(
id INT NOT NULL,
nome VARCHAR(255),
PRIMARY KEY (id)
)
ENGINE = InnoDB;
CREATE TABLE livro(
id INT NOT NULL,
titulo INT UNIQUE,
autor VARCHAR(255),
preco DECIMAL(14,2),
autor_id INT,
PRIMARY KEY (id),
FOREIGN KEY(autor_id) REFERENCES autor(id)
)
ENGINE = InnoDB;
50) Insira alguns registros nas tabelas criadas anteriormente para testar as restries necessrias para obter um
relacionamento One to Many entre elas. Observe os resultados.
51) Para entender o relacionamento Many to Many (vrios registros de uma tabela podem estar relacionados
com vrios registros de outra tabela) necessrio uma tabela intermediria chamada de tabela de
relacionamento. Essa tabela existe apenas para representar o relacionamento entre duas tabelas. Para isso,
vamos criar uma tabela aluno, uma tabela turma e outra tabela aluno_turma.
CREATE TABLE aluno(
id INT NOT NULL,
nome VARCHAR(255),
email VARCHAR(255),
data_nascimento DATETIME,
PRIMARY KEY (id)
)
ENGINE = InnoDB;
CREATE TABLE turma(
id INT NOT NULL,
inicio DATETIME,
fim DATETIME,
observacoes LONGTEXT,
PRIMARY KEY (id)
)
ENGINE = InnoDB;
Obs: repare que tanto na tabela aluno quanto na tabela turma no se encontra referncia de uma para a
aoutra. O relacionamento definido na tabela aluno_turma a seguir:
-
26
CREATE TABLE aluno_turma(
aluno_id INT NOT NULL,
turma_id INT NOT NULL,
PRIMARY KEY (aluno_id, turma_id),
FOREIGN KEY (aluno_id) REFERENCES aluno(id),
FOREIGN KEY (turma_id) REFERENCES turma(id)
)
ENGINE = InnoDB;
Obs: Definindo as colunas aluno_id e turma_id como chave primria composta garante-se que cada registro
ser nico e no nlo. Alm disso, como ambas as colunas tambm so chaves estrangeiras no ser
possvel inserir um id invlido tanto na coluna aluno_id quanto na coluna turma_id.
52) Insira alguns registros nas tabelas criadas anteriormente para testar as restries necessrias para obter um
relacionamento Many to Many entre elas. Observe os resultados.
53) Crie ou altere duas tabelas: autor e livro. Defina algumas colunas em ambas tendo em mente que um autor
pode escrever diversos livros e um livro pode ser escrito por um ou mais autores.
CREATE TABLE autor(
id INT NOT NULL,
nome VARCHAR(255),
PRIMARY KEY (id)
)
ENGINE = InnoDB;
CREATE TABLE livro(
id INT NOT NULL,
titulo VARCHAR(255),
edicao INT,
preco DECIMAL(10,2),
isbn INT,
PRIMARY KEY (id)
)
ENGINE = InnoDB;
54) Crie uma tabela de relacionamento entre as tabelas autor e livro criadas anteriormente. No se esquea das
restries.
CREATE TABLE autor_liro (
autor_id INT NOT NULL,
livro_id INT NOT NULL,
PRIMARY KEY (autor_id, livro_id),
FOREIGN KEY (autor_id) REFERENCES autor(id),
FOREIGN KEY (livro_id) REFERENCES livro(id)
)
ENGINE = InnoBD;
55) Insira alguns registros nas tabelas criadas anteriormente para testar as restries necessrias para obter um
relacionamento Many to Many entre elas. Observe os resultados.
56) Crie a tabela de socio e dependente conforme o diagrama para representar um relacionamento de
entidade fraca.
CREATE TABLE socio ( id_socio INTEGER NOT NULL,
-
27
nome VARCHAR(100) NOT NULL, data_cadastro DATE NOT NULL, PRIMARY KEY (id_socio) ) ENGINE = InnoBD;
CREATE TABLE dependente ( id_socio INTEGER NOT NULL, sequencia INTEGER NOT NULL, nome VARCHAR(100) NOT NULL, data_cadastro DATE NOT NULL, PRIMARY KEY (id_socio, sequencia), CONSTRAINT socio_dependente_fk FOREIGN KEY (id_socio) REFERENCES socio (id_socio) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = InnoBD;
57) Insira alguns registros nas tabelas criadas anteriormente para testar as restries necessrias de um relacionamento de entidade fraca. Observe os resultados. INSERT INTO socio VALUES (100, 'Ana Lcia Mathias', '2011-08-05'); INSERT INTO socio VALUES (200, 'Beatriz Costa', '2011-08-05'); INSERT INTO socio VALUES (300, 'Carlos Augusto Silva','2011-08-11'); INSERT INTO socio VALUES (400, 'Daniel Oliveira', '2011-08-12'); INSERT INTO socio VALUES (500, 'Everaldo D''vila', '2011-08-12'); INSERT INTO dependente VALUES (100, 1, 'Pedro Lus Mathias', '2011-08-06'); INSERT INTO dependente VALUES (200, 2, 'Maria Isabel Mathias','2011-08-06'); INSERT INTO dependente VALUES (300, 3, 'Luis Pedro Costa', '2011-08-08'); INSERT INTO dependente VALUES (400, 4, 'Maria Jlia Costa', '2011-08-09'); INSERT INTO dependente VALUES (500, 5, 'Ana Alice Costa', '2011-08-10');
58) Visualizando a estrutura de criao da tabela "socio" e dependente. SHOW CREATE TABLE socio; SHOW CREATE TABLE dependente;
59) Visualizando cdigo e nome do scio e seus respectivos dependentes.
SELECT s.id_socio as 'ID do Scio' , s.nome as 'Nome do Scio', d.sequencia as 'Sequncia', d.nome as 'Nome do Dependente' FROM socio s INNER JOIN dependente d ON s.id_socio=d.id_socio ORDER BY s.id_socio, d.sequencia;
-
28
OU SELECT s.id_socio as 'ID do Scio' , s.nome as 'Nome do Scio', d.sequencia as 'Sequencia', d.nome as 'Nome do Dependente' FROM socio s, dependente d WHERE s.id_socio=d.id_socio ORDER BY s.id_socio, d.sequencia;
60) Visualizando cdigo e nome do scio e seus respectivos dependentes. Caso no haja dependente, mostrar o scio tambm.
SELECT s.id_socio as 'ID do Scio' , s.nome as 'Nome do Scio', d.sequencia as 'Sequencia', d.nome as 'Nome do Dependente' FROM socio s LEFT JOIN dependente d ON s.id_socio=d.id_socio ORDER BY s.id_socio, d.sequencia;
61) O que acontece se tentarmos fazer o RIGHT JOIN?
SELECT s.id_socio as 'ID do Scio' , s.nome as 'Nome do Scio', d.sequencia as 'Sequencia', d.nome as 'Nome do Dependente' FROM socio s
-
29
RIGHT JOIN dependente d ON s.id_socio=d.id_socio ORDER BY s.id_socio, d.sequencia;
62) Crie a tabela de funcionario conforme o diagrama para representar um relacionamento de auto
relacionamento. CREATE TABLE funcionario (
cod_funcionario INTEGER NOT NULL, nome VARCHAR(100) NOT NULL, data_cadastro DATE, cod_chefe INTEGER, PRIMARY KEY (cod_funcionario), FOREIGN KEY (cod_chefe) REFERENCES funcionario (cod_funcionario) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE = InnoBD;
63) Insira alguns registros nas tabelas criadas anteriormente para testar as restries necessrias de um relacionamento de entidade fraca. Observe os resultados. INSERT INTO funcionario VALUES (100, 'Paulo Luiz da Silva', '2011-08-10', NULL); INSERT INTO funcionario VALUES (200, 'Maria Cndida da Costa', '2011-08-12', 100); INSERT INTO funcionario VALUES (300, 'Otvio Silveira', '2011-08-12', 100); INSERT INTO funcionario VALUES (400, 'Jlio Matias Dantas', '2011-08-13', NULL); INSERT INTO funcionario VALUES (500, 'Mara Medeiros', '2011-08-14', 200);
64) Visualizando a estrutura de criao da tabela "socio" e dependente. SHOW CREATE TABLE funcionario;
65) Visualizar o cdigo e nome do funcionrio e seu respectivo chefe.
SELECT f.cod_funcionario as 'Cdigo do Funcionrio' , f.nome as 'Nome do Funcionrio', c.cod_funcionario as 'Cdigo do Chefe', c.nome as 'Nome do Chefe' FROM funcionario f INNER JOIN funcionario c ON f.cod_chefe=c.cod_funcionario;
66) Visualizar cdigo e nome do chefe e seus respectivos subordinados.
SELECT c.cod_funcionario as 'Cdigo do Chefe', c.nome as 'Nome do Chefe', f.cod_funcionario as 'Cdigo do Funcionrio' , f.nome as 'Nome do Funcionrio' FROM funcionario f INNER JOIN funcionario c ON f.cod_chefe=c.cod_funcionario ORDER BY c.cod_funcionario;
67) Visualizar cdigo e nome do funcionrio e seu respectivo chefe. Caso no haja chefe, mostr-lo tambm.
SELECT f.cod_funcionario as 'Cdigo do Funcionrio' , f.nome as 'Nome do Funcionrio', c.cod_funcionario as 'Cdigo do Chefe', c.nome as 'Nome do Chefe' FROM
-
30
funcionario f LEFT JOIN funcionario c ON f.cod_chefe=c.cod_funcionario ORDER BY f.cod_funcionario;
-
31
Lista Exerccios 4:
Subqueries, Joins e Unions
68) Criar a tabela nota com as colunas: id (INT) NOT NULL, aluno_id INT, turma_id INT, nota DECIMAL (4,2),
chave primria (id) e chave estrangeira (aluno_id) REFERENCES aluno (id), chave estrangeira (turma_id)
REFERENCES turma (id).
CREATE TABLE nota(
id INT NOT NULL,
aluno_id INT,
turma_id INT,
nota DECIMAL(4,2),
PRIMARY KEY (id),
FOREIGN KEY (aluno_id) REFERENCES aluno(id),
FOREIGN KEY (aluno_id) REFERENCES turma(id)
)
ENGINE = InnoDB;
69) Utilizando a tabela turma, crie uma subquery (uma query interna executada dentro de outra query externa
como: select, insert, update e delete; ou seja, produz um resultado que ser utilizado pela query que a
contm) para saber quais foram os alunos que tiraram uma nota (n1) maior que a mdia das notas de cada
turma.
SELECT *
FROM nota AS n1
WHERE n1.nota > (
SELECT AVG(n2.nota)
FROM nota AS n2
WHERE n2.turma_id = n1.turma_id
);
Obs: repare que na subquery foi utilizado o valor n1.turma proveniente da query externa. Isso mostra que a
subquery dependente da query que a contm e, por isso, a chamamos de subquery correlacionada. Uma
subquery (devido a dependncia de um valor da query externa) pode custar muito processamento, pois cada
registro encontrado pela query externa ir executar a subquery.
70) Utilizando a tabela turma, crie uma subquery com um campo virtual da query externa para obter a maior
nota (n1) de uma determinada turma (turma_id =1).
SELECT n1 *, (
SELECT MAX(n2.nota)
FROM nota AS n2
WHERE n2.turma_id = 1
) AS maior_nota
FROM nota AS n1
WHERE n1.turma_id = 1;
Obs: quando a subquery no depende de nenhum valor da query externa, chamada de subquery
independente (pode ser executada apenas uma vez mesmo que a query externa retorne mais de um
registro).
71) Crie ou altere a tabela livro. A tabela deve conter uma coluna preco que ir armazenar o preo de cada
livro. Crie uma consulta que devolva todas as colunas de todos os livros registrados. Alm das colunas
normais da tabela, crie uma coluna virtual que ir conter a mdia dos preos dos livros.
SELECT l1.*, (
SELECT AVG(l2.preco)
-
32
FROM livro AS l2
) AS media_preco
FROM livro AS l1;
72) Ainda utilizando a tabela livro, crie uma consulta que devolva todas as colunas de todos os livros
registrados cujos preos sejam superiores em relao aos livros mais baratos.
SELECT l1.*
FROM livro AS l1
WHERE li.preco > (
SELECT MIN(l2.preco)
FROM livro AS l2
);
73) Na tabela livro crie uma coluna autor_id caso ela ainda no exista. Tambm crie ou altere a tabela autor
com, pelo menos, as colunas id e nome. Crie uma consulta que devolva todos os livros escritos por autores
cujos nomes comeam com a letra A.
SELECT *
FROM livro
WHERE livro.autor_id IN (
SELECT id
FROM autor
WHERE nome LIKE A%
);
74) No exerccio 40 da rede social, foi criado duas tabelas usurio (com informaes referente a conta do
usurio na rede social) e perfil (com informaes pessoais do mesmo). Foi utilizada uma coluna como
chave primria em cada uma delas. Agora ser utilizado esse relacionamento entre as colunas de tabelas
diferentes em uma nica consulta. Para isso, ser utilizado o comando JOIN para trazer as informaes das
duas tabelas em um nico conjunto de resultados.
SELECT *
FROM usuario AS u
JOIN perfil AS p;
Obs: o resultado obtido no foi o esperado, pois para cada registro da tabela usuario foi feita uma relao
com todos os registros da tabela perfil. Isso ocorreu porque no foi informado qual a coluna que deveria ser
utilizado para definir o relacionamento entre as duas tabelas. Para isso, necessrio utilizar a coluna JOIN
juntamente com a instruo ON.
SELECT *
FROM usuario AS u
JOIN perfil AS p
ON u.id = p.id;
O MySQL oferece outros tipos de joins conforme a lista a seguir:
o JOIN: retorna registros quando existe algum valor na coluna de relacionamento em pelo menos
uma das tabelas.
o LEFT JOIN: retorna registros quando existe algum valor na coluna de relacionamento da tabela
informada a esquerda na consulta.
o RIGHT JOIN: retorna registros quando existe algum valor na coluna de relacionamento da tabela
informada a direita na consulta.
-
33
75) Crie ou altere a tabela livro e faa com que ela contenha a coluna autor_id caso ainda no exista. Tambm
crie ou altere a tabela autor com, pelo menos, as colunas id e nome. Crie uma consulta que devolva todos
os livros escritos por autores cujos nomes comeam com a letra A.
SELECT livro.*
FROM livro
JOIN autor
ON livro.autor_id = autor.id
WHERE autor.nome LIKE A%;
76) Crie uma consulta que gere como resultado uma lista com todos os autores que possuam livros publicados.
Alm disso, o resultado deve conter o nmero do livro que cada autor publicou.
SELECT autor.*, COUNT(livro.id) AS total_livros
FROM autor JOIN livro
ON livro.autor_id = autor.id
GROUP BY autor.id;
77) Refaa o exerccio anterior ordenando decrescentemente o resultado pelo nome do autor.
SELECT * FROM (
SELECT autor.*, COUNT(livro.id) AS total_livros
FROM autor JOIN livro
ON livro.autor_id = autor.id
GROUP BY autor.id
) AS A
ORDER BY A.nome DESC;
78) Quando for necessrio duas ou mais tabelas que sejam unidas aumentando o nmero de registros
utilizado o comando UNION (diferente do JOIN que utiliza duas ou mais tabelas conectando suas colunas ou
criando campos virtuais). Crie uma tabela para a rede social para armazenar usurios administrativos do site
em uma tabela diferente dos usurios normais. Obtenha uma lista com o nome e email de todos os usurios,
inclusive os administrativos utilizando a instruo JOIN.
CREATE TABLE usuario_administrativo (
id INT NOT NULL,
nome_usuario VARCHAR(10),
senha VARCHAR(10),
email VARCHAR(100),
grupo INT,
PRIMARY KEY (id)
)
ENGINE = InnoDB;
SELECT nome_usuario, email
FROM usuario
UNION
SELECT nome_usuario, email
FROM usuario_administrativo;
Obs: No primeiro e Segundo SELECT foi escolhido as colunas para ser mostradas no resultado. A instruo
UNION obriga que cada SELECT retorne o mesmo nmero de colunas. Como a tabela
usuario_administrativo possui uma coluna a mais, se fosse utilizado o caractere * (wildcard) em ambas
colunas, a consulta teria retornado um erro. Por padro, a instruo UNION seleciona registros distintos.
Portanto, caso o usurio administrativo tambm seja um usurio normal da rede social, com nome e email
cadastrados com os mesmos valores nas duas tabelas, a consulta teria retornado apenas o resultado para
esse usurio. Para resultados duplicados, deve-se utilizar a instruo UNION ALL.
-
34
SELECT nome_usuario, email
FROM usurio
UNION ALL
SELECT nome_usuario, email
FROM usuario_administrativo;
79) Utilizando as tabelas usuario e usuario_administrativo do exerccio anterior, crie uma consulta que gere
uma lista com todos os usurios (administrativos e normais). Alm disso, quando um usurio no possuir um
valor na coluna nome_usuario, imprima no seu lugar o email deste usurio.
SELECT nome_usuario, email
FROM usuario
WHERE usuario.nome_usuario, email IS NOT NULL
UNION ALL
SELECT nome_usuario, email
FROM usuario_administrativo
WHERE usuario_administrativo.nome_usuario IS NOT NULL
UNION ALL
SELECT nome_usuario, email
FROM usuario
WHERE usuario.nome_usuario IS NULL
UNION ALL
SELECT email, email
FROM usuario_administrativo
WHERE usuario_administrativo.nome_usuario IS NULL;
-
35
Transaes
Muitas vezes gostaramos que determinado processo, caso fosse abortado por qualquer motivo, pudesse ser
inteiramente cancelado. Imaginemos por exemplo um usurio digitando um pedido. Imaginemos ainda que o
sistema possa reservar cada item solicitado de maneira "on line", ou seja ao mesmo tempo em que estou
digitando a quantidade o sistema j "empenhe" uma quantidade equivalente no estoque. Imaginemos ainda que
o sistema deve cancelar todas as operaes se apenas um dos itens no puder ser atendido. Grande problema,
caso no pudssemos anular todos os processos a partir de determinada condio.
Vamos simular tal ocorrncia com nosso banco de dados EMP. Imaginemos que ao invs de digitarmos
DELETE FROM emp WHERE salario > 5000; tivssemos digitado DELETE FROM emp WHERE salario > 500;
Ao invs de eliminarmos 2 registros, praticamente teramos eliminado o banco de dados todo. Para evitarmos
que um erro de digitao, ou um processo iniciado porm sem condio de ser completado integralmente
comprometa todos nossos dados podemos criar uma transao que nos assegurar que nossos testes sejam
bem sucedidos ou cancelados sem comprometer nossos dados.
begin transaction;
delete from emp where salario > 500;
if SQL_RECORDCOUNT > 20 THEN;
ROLLBACK TRASACTION;
else
COMMIT;
endif;
end transaction;
-
36
Vises
Uma viso consiste basicamente de uma tabela derivada de outras tabelas. Considerando o exemplo
TRABALHO, poderamos criar uma viso baseada na Tabela de Empregados (EMP) e na Tabela de
Departamentos (DEPT) onde tivssemos somente os Nomes dos Funcionrios e os Departamentos nos quais
estes trabalhassem. Teramos algo semelhante como representado a seguir:
CREATE VIEW emp_dep
AS SELECT e.empnome, d.depnome
FROM emp e, dep d
WHERE e.depnume = d.depnume;
Devemos observar que:
1- Uma viso definida sobre uma nica tabela somente ser atualizvel se os atributos da tal viso
contiverem a chave primria de tal tabela.
2- Vises sobre vrias tabelas no so passveis de atualizaes.
3- Vises que se utilizam de funes de agrupamentos, tambm no podero ser atualizadas.
-
37
Relatrios
Comando:
REPORT DISTINCT / UNIQUE
[ atributo(s) ]
REPORTTOP
PAGETOP
TOP
DETAIL
NONE
BOTTOM
PAGEBOTTOM
REPORTBOTTOM
FROM [ tabela(s) ]
[ WHERE clausula-where ]
[ GROUP BY clausula-grupo ]
[ ORDER BY clausula-order by ];
Como exemplo converteremos um simples Select em um Report, temos:
SELECT empnome
FROM emp
WHERE depnume = 1000;
REPORT
DETAIL empnome
WHERE depnume = 1000;
Podemos direcionar a sada de um relatrio tanto para um arquivo como para uma impressora.
Para um arquivo:
REPORT ON relat.dat ...
Para uma impressora:
REPORT ON LP: ...
Agora incrementando um report temos:
REPORT
REPORTTOP COL 10, *** RELATORIO DE FUNCIONARIOS *** ,
TODAY %QDD/MM/YY, SKIP,
COL 10, =================================, SKIP 2
DETAIL COL 10, NOME %C22, SALARIO %FS, ADMISSAO %QDD/MM/YY
REPORTBOTTOM COL 10,
=================================, SKIP,
COL 20, TOTAL:, TOTAL(SALARIO)
FROM emp
ORDER BY nome;
-
38
Onde:
REPORTTOP - O que sera impresso no topo do relatrio.
PAGETOP - Impresso em cada topo de pagina.
TOP - Impresso em cada Topo do Sort-Grupo do relatrio.
DETAIL - O que sera impresso em cada linha.
NONE - Se no tiver resultado o select, no sera impresso o relatrio.
BOTTOM - Impresso em cada Bottom do Sort-Grupo do relatrio
PAGEBOTTOM - O que sera impresso no rodap de cada pagina.
REPORTBOTTOM - O que sera impresso no rodape do relatrio.
Formatos:
%C - caracter
%D - data
y - ano,
n - mes numrico,
a - mes alfanumrico,
d - dia,
j - dia e ano juliano
Exemplo: %Ddd/mm/yy
%I - inteiro
%F - ponto flutuante
%FSZ onde: S - separador de 3 digitos e decimal point
Z - zeros sero suprimidos
%Q - data
%J - Hora
h - hora, m - minutos, s - segundos
%T - hora
E temos as funes: TOTAL, AVERAGE, MAXIMUM, MINIMUM.