exerci cio

38
1 Lista de Exercícios 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 padrão o database "sistema". SHOW DATABASES; USE sistema; 4) Definir o mecanismo padrão como InnoDB (transacional). Este comando funciona somente no MySQL. SET STORAGE_ENGINE=InnoDB; Obs: transacional armazenamento seguro, não 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 (

Upload: sergiolns

Post on 24-Nov-2015

47 views

Category:

Documents


4 download

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.