Escolar Documentos
Profissional Documentos
Cultura Documentos
EXÉRCITO BRASILEIRO
DCT - CITEx
1° CENTRO DE TELEMÁTICA DE ÁREA
(CPD/3 – 1978)
“CENTRO DE TELEMÁTICA LANDELL DE MOURA”
Banco de Dados
MySQL
Maio de 2014
Banco de Dados MySQL 2 de 80
Índice
1. Introdução ao SGDB........................................................................................................................3
1.1. O que é o SGBD?......................................................................................................................3
1.2. Sistema de Processamento de Arquivos....................................................................................3
1.3. Características do SGBD..........................................................................................................5
1.4. Transações.................................................................................................................................6
1.5. Tipos de SGBD.........................................................................................................................7
1.6. Modelo de Dados Relacional....................................................................................................7
2. Projeto de Banco de Dados...............................................................................................................9
2.1. Modelagem de dados ...............................................................................................................9
2.2. Modelo Conceitual..................................................................................................................10
2.2.1. Modelo Entidade e Relacionamento ..............................................................................10
2.3. Modelo Lógico........................................................................................................................18
2.3.1. Transformação do Modelo Conceitual em Modelo Lógico............................................19
2.3.2. Normalização..................................................................................................................22
2.4. Modelo Físico.........................................................................................................................25
3. SGBD MySQL...............................................................................................................................26
3.1. O que é o MySQL?.................................................................................................................26
3.2. As principais características do MySQL ................................................................................26
3.3. Instalação do MySQL no Ubuntu...........................................................................................27
3.4. Conectando o MySQL............................................................................................................28
3.5. Prompt do MySQL..................................................................................................................29
4. Comandos SQL ..............................................................................................................................31
4.1. Introdução...............................................................................................................................31
4.2. Tipos de Comandos.................................................................................................................32
4.3. DDL - Linguagem de Definição de Dados ............................................................................33
4.3.1. Criando um Banco de Dados..........................................................................................33
4.3.2. Excluindo um Banco de Dados.......................................................................................34
4.3.3. Criando Tabelas...............................................................................................................35
4.3.4. Alterando a estrutura da tabela........................................................................................42
4.3.5. Excluindo a tabela...........................................................................................................43
4.4. DML - Linguagem de Manipulação de Dados.......................................................................44
4.4.1. Inserindo dados na tabela................................................................................................44
4.4.2. Selecionando dados na tabela..........................................................................................46
4.4.3. Alterando dados na tabela...............................................................................................58
4.4.4. Excluindo dados na tabela...............................................................................................59
4.4.5. Selecionando informações de tabelas diferentes.............................................................59
4.5. DCL - Linguagem de Controle de Dados...............................................................................62
4.5.1. Níveis de Privilégios.......................................................................................................64
4.5.2. Adicionando Novos Usuários..........................................................................................64
4.5.3. Revogando privilégios....................................................................................................65
4.5.4. Removendo Usuários......................................................................................................65
5. Ferramentas de Administração.......................................................................................................67
5.1. PhpMyAdmin .........................................................................................................................67
5.2. Ferramenta de Backup............................................................................................................78
Conclusão...........................................................................................................................................80
1. Introdução ao SGDB
Nesta lição veremos conceitos introdutórios de banco de dados, sua evolução, tipos de banco
de dados e sua importância no dia a dia.
Ao final desta lição têm alguns exercícios para revisar o conteúdo apresentado. São
exercícios simples, cujo conteúdo é explicado no decorrer das lições.
Estude com calma, preste atenção e reproduza os exemplos mostrados.
Bom estudo!
1.4. Transações
A Transação é um conjunto de procedimentos que é executado em um banco de dados, que
para o usuário é visto como uma única ação. A integridade de uma transação depende de quatro
propriedades, conhecidas como ACID (acrônimo de Atomicidade, Consistência, Isolamento e
Durabilidade).
• Atomicidade: Trata o trabalho como parte indivisível (atômico). A transação deve ter todas
as suas operações executadas em caso de sucesso, ou nenhum resultado de alguma operação
refletido sobre a base de dados em caso de falha.
Exemplo: Em uma transferência de valores entre contas bancárias, é necessário que, da
conta origem seja retirado um valor X e na conta destino seja somado o mesmo valor X. As
duas operações devem ser completadas sem que qualquer erro aconteça, caso contrário todas
as alterações feitas nessa operação de transferência devem ser desfeitas;
• Consistência: A execução de uma transição deve levar o banco de dados de um estado
consistente a um outro estado consistente, ou seja, uma transação deve respeitar as regras de
integridade dos dados (como unicidade de chaves, restrições de integridade lógica, etc...).
Exemplo: Considere um banco de dados que guarde informações de clientes e que use o
CPF como chave primária. Então, qualquer inserção ou alteração no banco de dados não
pode duplicar um CPF (unicidade de chaves) ou colocar um valor de CPF inválido, como o
valor 000.000.000-00 (restrição de integridade lógica).
• Isolamento: Conjunto de técnicas que tentam evitar que transações paralelas interfiram
umas nas outras, fazendo com que o resultado da execução de várias transações em paralelo
tenha o mesmo resultado destas mesmas transações sendo executadas sequencialmente (uma
após a outra).
Exemplo: se duas pessoas, simultaneamente, tentarem sacar R$ 100 reais de uma conta que
tem saldo de R$ 100 reais, apenas uma delas deve conseguir executar a operação.
• Durabilidade: Os efeitos de uma transação em caso de sucesso (commit) devem persistir no
banco de dados mesmo que ocorra uma falha depois. A durabilidade garante que os dados
estarão disponíveis em definitivo.
Exemplo: após realizado um saque em um caixa eletrônico, mesmo ocorrendo um problema
no banco de dados, o saldo da conta deve ser o mesmo de antes de ocorrer o problema.
O SGBD que iremos utilizar neste estudo é o MySQL, que é um exemplo de Banco de
Dados Relacional. Vamos entender como foi o processo de desenvolvimento deste tipo de Bando de
Dados.
Antes de construir o banco de dados é preciso definir que informações serão armazenadas.
Para isso, deve-se elaborar um projeto de banco de dados, onde será definida a estrutura deste
banco. Este será o nosso próximo assunto.
2.2.1.1. Entidade
A Entidade é um objeto no mundo real que pode ser identificado de forma única em relação
aos outros objetos.
Sabendo o que são as entidades, tente identificar quais são as entidades do exemplo a seguir.
Suponha que uma empresa chamada ABC pede para desenvolver um software para gerenciar
seus empregados. Durante a fase de entrevistas, pode-se perguntar o que a empresa deseja
armazenar. Uma possível resposta da empresa será informações sobre empregados e os
departamentos.
EMPREGADO DEPARTAMENTO
2.2.1.2. Atributo
Note que, até o momento, as entidades não guardam informação alguma. Elas apenas
representam um objeto existente no cenário da empresa. Para guardar informação, deve-se definir
os atributos das entidades. Dessa forma, atributos são propriedades particulares que descrevem cada
entidade.
Para entender melhor o que são atributos, vamos voltar ao exemplo da empresa ABC.
Para identificar os atributos de uma entidade, deve-se perguntar ao cliente: que informações
precisam ser guardadas sobre os empregados: Uma possível resposta seria: Código, Nome,
Salário, Data de Admissão e Data de Demissão. Essas informações guardadas pela empresa
sobre os empregados são os atributos da entidade Empregado.
No DER, o Atributo é representado por uma elipse que possui escrito no centro o seu
nome e é ligado à entidade através de uma linha.
A Figura a seguir ilustra um exemplo da entidade Empregado e seus atributos: cod_emp
(código identificador do empregado), nome (nome completo do empregado), salario (salário atual
do empregado), data_admissao (data que o empregado foi admitido na empresa) e data_demissão
(data que o empregado foi demitido, caso não tenha sido, fica sem valor).
cod_emp data_demissao
EMPREGADO
Para representar todas as informações de uma entidade, os atributos são classificados como:
• Atributo simples: são chamados também de atributos atômicos, não são divisíveis. Por
exemplo, a entidade Empregado, tem os seguintes atributos simples: cod_emp, nome e
salario.
numero bairro
rua cep
endereco
EMPREGADO
Nesse caso, um empregado pode ter mais de um telefone, tais como: casa, trabalho, celular etc.
endereco
telefone
EMPREGADO
cod_emp
EMPREGADO
2.2.1.3. Relacionamento
Existem basicamente três tipos de relacionamentos, sendo que os tipos de relacionamentos
determinam como as entidades se relacionam. Cada tipo de relacionamento define uma restrição
diferente para as entidades envolvidas.
O Relacionamento entre entidades em um DER é representado através de um losango
que liga as entidades relacionadas. A Figura a seguir ilustra um exemplo de relacionamento entre as
entidades Empregado e Departamento.
Para identificar como cada entidade se relaciona com as demais, é importante fazer algumas
perguntas ao cliente.
1 1
professor leciona curso
N 1
empregado aloca departamento
Lê-se:
• Um empregado está alocado em UM departamento;
• Um departamento aloca N (vários) empregados.
• muitos-para-muitos (N:N)
O relacionamento muitos-para-muitos é usado quando várias entidades A se relacionam com
várias entidades B. Esse relacionamento é representado pelo sinal: N:N ou N:M.
Por exemplo, um curso pode ter vários alunos e um aluno pode fazer vários cursos. Este é
um relacionamento muitos-para-muitos, porque a entidade curso pode ter vários (M) alunos. Por
outro lado, cada aluno pode fazer vários (N) cursos.
N M
curso matricula aluno
2.2.1.4. Cardinalidade
A cardinalidade é um conceito importante para ajudar a definir o relacionamento, ela define
o número de ocorrências em um relacionamento.
Para determinar a cardinalidade, deve-se fazer algumas perguntas relativas ao
relacionamento em ambas às direções. Por exemplo, dado um relacionamento entre Departamento e
Empregado, pode-se fazer as seguintes perguntas:
Pergunta 1: Um empregado está alocado em quantos departamentos?
Resposta 1: No mínimo em 0 (empregado desligado da empresa) e no máximo em 1.
Pergunta 2: Um departamento aloca quantos empregados?
Resposta 2: No mínimo 1 e no máximo N (muitos).
N 1
empregado aloca departamento
(1:N) (0:1)
Observe que a resposta é dada na forma de “no Mínimo” e “no Máximo”. Por tais termos
serem usados, surgiu o conceito de Cardinalidade Máxima e Cardinalidade Mínima. As
cardinalidades são expressas pela forma (Cardinalidade Mínima : Cardinalidade Máxima).
Exemplo: (1:N) e (1:1).
A cardinalidade máxima indica a quantidade máxima de ocorrências de entidades que
podem estar associadas a uma ocorrência da outra entidade. Dessa forma, duas cardinalidades
máximas são relevantes:
• a cardinalidade máxima 1;
• a cardinalidade máxima “muitos” representada pela letra N.
Como exemplo, a entidade Empregado, que tem cardinalidade máxima 1 no seu relacionamento
com uma ocorrência da entidade Departamento. Ou seja, o empregado só pode estar alocado em no
máximo um departamento. Por outro lado, a entidade Departamento tem cardinalidade máxima de
N. Isto é, um departamento pode alocar um número N infinito de empregados trabalhando nele.
Como exemplo, a entidade Empregado, que tem cardinalidade mínima 1 no seu relacionamento
com uma ocorrência da entidade Departamento. Ou seja, o empregado pode estar alocado a
nenhum departamento (no caso de estar desligado da empresa). Por outro lado, a entidade
Departamento tem cardinalidade mínima de 1. Isto é, um Departamento deve alocar pelo menos
um Empregado.
N 1
empregado aloca departamento
(1:N) (0:1)
A figura a seguir mostra uma tabela Cliente preenchida com valores hipotéticos. Note que as
colunas da tabela representam os atributos, enquanto as linhas (ou registros) representam as tuplas.
Se uma tabela não tiver tuplas, ela estará vazia, ou seja, sem dados.
TUPLA
TABELA
1) Identifique as entidades:
empregado
departamento
1 1
professor leciona curso
N 1
empregado aloca departamento
• Relacionamento N:M - é criada uma nova relação contendo como chaves estrangeiras as
chaves primárias das entidades participantes, mais os atributos do relacionamento. Exemplo:
N M
curso matricula aluno
Existem ainda outras duas estruturas que já podem ser definidas no Modelo Lógico:
• Índice Único: é um índice onde cada valor é diferente dos demais (não permite
duplicidade) e identifica uma única linha na tabela. Pode conter valores NULL.
• Índice Não-Único: é um índice que permite a repetição de valores, são usados com colunas
que são muito usados para operações de busca e ordenação no banco de dados.
Indexar uma tabela, ou seja, definir índices para certas colunas acelera o desempenho do
banco de dados. Porém, determinar as colunas que serão indexadas, nem sempre é uma escolha
óbvia. Mas podemos considerar um candidato a índice, colunas bastante usadas em pesquisas e em
ordenação dos dados.
É claro que o bom senso deve falar mais alto, pois se forem usados índices demais isto
pode ter consequências indesejáveis. Se a aplicação tiver uma intensa inclusão/alteração de dados,
o uso de muitos índices aumenta o tempo de inclusão e atualização no banco de dados, visto que
todos os índices devem ser atualizados. Neste caso, deve-se limitar aos índices que são realmente
necessários.
Com a adição da chave estrangeira na tabela empregado (coluna dep_id) e definindo que as
colunas nome e salario da tabela empregado são índices não-únicos (marcados com • ) e que a
coluna nome da tabela departamento é um índice único (marcado com - ), o Modelo Lógico da
empresa ABC fica:
empregado departamento
cod_dep: número inteiro
cod_emp: número inteiro
- nome: caracteres (máximo 40)
• nome: caracteres (máximo 90)
• salario: número real
data_admissao: data
data_demissao: data
#dep_id: número inteiro
Com o Modelo Lógico construído pode-se implementar o Modelo Físico, que consiste em
criar as tabelas com seus respectivos atributos no banco de dados.
Porém, antes disso, é uma boa prática executar alguns testes para minimizar as chances de
erro. Para isso, é recomendado que se aplique as regras da Normalização.
2.3.2. Normalização
Os BD Relacionais utilizam a normalização de dados para evitar redundâncias e possibilitar
um maior desempenho nas pesquisas. A Normalização é o processo de organização eficiente dos
dados dentro de um banco de dados, cujos objetivos principais são:
• Eliminar dados redundantes, por exemplo, armazenando os mesmos dados em mais de uma
tabela.
• Garantir que as dependências entre os dados façam sentido, armazenando apenas dados
logicamente relacionados em uma tabela.
Existem cinco estágios de normalização: 1º, 2º, 3º, 4º e 5º. Para um banco de dados
encontrar-se em cada um desses estágios ou formas (denominadas formas normais), cada uma das
tabelas deve atender a alguns pré-requisitos. Os pré-requisitos são cumulativos, isto é, para alcançar
a 3ª forma normal (3NF), um banco de dados precisa atender aos pré-requisitos das 1ª e 2ª formas
normais, acrescidos dos requisitos exclusivos da 3NF.
Antes de vermos os requisitos das formas normais é preciso entender o conceito de
dependência funcional.
Observe que existe uma dependência entre os valores dos conjuntos, ou seja, nome está em
função do CPF. Ou seja, tendo o CPF, pode-se encontrar o nome da pessoa correspondente.
Essa dependência é expressa por: CPF → Nome
Leia-se: com um número de CPF é possível encontrar o nome da pessoa, ou o nome depende da
funcionalidade do CPF.
Esta tabela não está na Primeira Forma Normal porque apresenta grupos de repetição
(possibilidade de mais de um telefone por cliente).
Já as tabelas abaixo, Cliente e Telefone, estão na primeira forma normal.
Note que foi necessário dividir a tabela Cliente em duas: Cliente e Telefone.
Esta tabela não está na Segunda Forma Normal porque a coluna produto depende
funcionalmente da coluna n_produto (não chave primária). Portanto para atender a Segunda Forma
Normal, a mesma informação deveria ser dividida em duas tabelas:
Produto
n_produto produto
0045 Caderno
1025 Folhas A4
Venda
n_pedido #n_produto quant valor_unit subtotal
23560 0045 3 R$ 8,99 R$ 26,97
58741 1025 10 R$ 12,99 R$ 129,90
A tabela não está na Terceira Forma Normal porque a coluna subtotal é o resultado da
multiplicação quant X valor_unit, desta forma a coluna subtotal depende de outras colunas não-
chave. Para atender a Terceira Forma Normal, a tabela deve ser implementada da seguinte forma:
Venda
n_pedido #n_produto quant valor_unit
23560 0045 3 R$ 8,99
58741 1025 10 R$ 12,99
Note que a coluna subtotal foi eliminada da tabela, pois aplicando a 3FN, foi considerado
desnecessário armazenar esta informação no banco de dados.
Como vimos anteriormente, o Modelo Físico considera as limitações impostas pelo SGBD,
pois a transformação do Modelo Lógico no Modelo Físico consiste na implementação das tabelas
no SGBD. Para isso, iremos utilizar o SGBD MySQL, que é o assunto da próxima Lição.
3. SGBD MySQL
Nesta lição veremos o que é o SGBD MySQL e como instalá-lo.
Ao final desta lição têm alguns exercícios para revisar o conteúdo apresentado. São
exercícios simples, cujo conteúdo é explicado no decorrer das lições.
Estude com calma, preste atenção e reproduza os exemplos mostrados.
Bom estudo!
• O código do MySQL foi testado com Purify (um detector comercial de falhas de memória) e
também com o Valgrind, uma ferramenta GPL.
• Disponível como versão cliente/servidor ou embutida.
• Álias em tabelas e colunas são disponíveis como definidos no padrão SQL92.
• DELETE, INSERT e UPDATE retornam o número de linhas que foram alteradas (afetadas).
• O comando específico do MySQL, SHOW, pode ser usado para devolver informações sobre
bancos de dados, tabelas e índices.
• Pode-se misturar tabelas de bancos de dados diferentes na mesma pesquisa.
• Um sistema de privilégios e senhas que é muito flexível, seguro e que permite verificação
baseada em estações/máquinas. Senhas são seguras porque todo o tráfico de senhas é
criptografado quando for se conectar ao servidor.
• Lida com bancos de dados enormes. Há quem use o Servidor MySQL com bancos de dados
que contém 50.000.000 registros e usuários que o usam com 60.000 tabelas e
aproximadamente 5.000.000.000 de linhas.
• São permitidos até 32 índices por tabela. Cada índice pode ser composto de 1 a 16 colunas.
O tamanho máximo padrão do índice é de 500 bytes.
• Os clientes podem se conectar ao servidor MySQL usando sockets TCP/IP, em qualquer
plataforma.
• O servidor pode apresentar mensagem de erros aos clientes em várias línguas.
• Suporte total para vários conjuntos de caracteres, que incluem ISO-8859-1 (Latin1) e mais.
• Para obter ajuda no MySQL podem ser chamadas as opções --help ou -?.
A última versão do MySQL-Server, neste exemplo, é a 5.5 . Agora para instalar basta digitar,
no Terminal, o comando:
aptget install mysqlserver
Se a saída for:
mysql start/running, process
Sendo que o parâmetro -h indica que a próxima informação será o nome do computador
onde está instalado o Servidor MySQL.
No exemplo a seguir está uma forma de conexão com o MySQL.
mysql u root p
Enter password: ********
A conexão está sendo feita com o usuário root (Administrador) do MySQL, pois ainda não
existem outros usuários cadastrados.
Ao conectar no Servidor MySQL, o prompt ficará como mostrado a seguir. É nele que serão
digitados os comandos SQL.
mysql>
Neste exemplo, note como o prompt muda de mysql> para -> depois de entrar com a
primeira linha de uma linha múltipla. Assim, o MySQL está indicando que o comando não está
finalizado e aguarda o complemento.
A tabela a seguir mostra os prompt que podem aparecer e resume o estado do MySQL:
Prompt Significado
mysql> Pronto para um novo comando. Este é o prompt que deve estar aparecendo
sempre que for digitar um novo comando.
> Esperando a próxima linha do comando ou o ponto e virgula para execução do
comando. Para cancelar o comando e sair deste prompt, digite \c
'> Esperando a próxima linha, aguardando uma aspa simples. Isto ocorre quando é
aberta uma aspa simples e esta não é fechada. Para sair deste prompt, digite '\c
"> Esperando próxima linha, aguardando uma aspa dupla. Isto ocorre quando é
aberta uma aspa dupla e esta não é fechada. Para sair deste prompt, digite "\c
Utilize as Setas para cima e para baixo do teclado para repetir os comandos digitados. As setas
para direta e para esquerda permitem percorrer pela linha digitada.
Agora que instalamos e sabemos como conectar ao Servidor MySQL, finalmente poderemos
utilizá-lo! Para isso, nosso próximo passo será vermos como utilizar os comandos SQL para criar,
alterar e excluir tabelas, bem como inserir, modificar, selecionar e excluir os dados das tabelas. Este
será o assunto da próxima Lição!
4. Comandos SQL
Nesta lição veremos os principais comandos SQL (Structured Query Language, ou
Linguagem de Consulta Estruturadas).
Ao final desta lição têm alguns exercícios para revisar o conteúdo apresentado. São
exercícios simples, cujo conteúdo é explicado no decorrer das lições.
Estude com calma, preste atenção e reproduza os exemplos mostrados.
Bom estudo!
4.1. Introdução
O SQL (Structured Query Language, ou Linguagem de Consulta Estruturadas) é uma
linguagem que tornou-se um padrão na indústria para Bancos de Dados Relacionais. Ela é bem
diferente das linguagens comuns de programação.
A principal diferença é que o SQL não é uma linguagem procedural, ao contrário da grande
maioria das linguagens de programação. Nela não se especifica como, ou em que ordem, serão
executados os processos que irão fornecer os resultados requeridos.
No SQL, apenas informa-se o que se quer e o sistema de banco de dados é o responsável por
escolher adequadamente os procedimentos a serem executados, de forma que os resultados sejam
obtidos com a maior eficiência possível.
Apesar do SQL ter sido originalmente criado pela IBM, rapidamente surgiram vários
“dialetos” desenvolvidos por outros produtores. A expansão levou à necessidade de ser criado e
adaptado um padrão para a linguagem.
Esta tarefa foi realizada pela American National Standards Institute (ANSI) em 1986 e ISO
(International Organization for Standardization) em 1987, os quais formaram um grupo de trabalho
para continuar o desenvolvimento. Este desenvolvimento ainda acontece com outras novas versões
dos padrões definidos.
Embora padronizado pela ANSI e ISO, o SQL possui muitas variações e extensões
produzidas pelos diferentes fabricantes de SGBD. Normalmente, a linguagem pode ser migrada de
plataforma para plataforma sem mudanças estruturais.
Vale ressaltar que todos os comandos SQL devem ser executados dentro do prompt do
MySQL, ou seja, é preciso executar o comando visto na Lição 3.4. Conectando o MySQL.
Outro detalhe sobre os comandos SQL, é que o comando não é executado pressionando a
tecla ENTER, como os comandos executados no prompt do sistema operacional. Para executar o
comando SQL no prompt do MySQL, é preciso finalizá-lo com o caractere “ ; ”. Com este caractere
o MySQL compreende que o comando precisa ser executado após pressionada a tecla ENTER.
Caso não seja colocado o “ ; ”, o MySQL apenas abrirá uma nova linha no comando SQL.
Como vimos anteriormente, os principais comandos DDL são: CREATE, DROP e ALTER.
Vamos ver cada um deles.
Os nomes de bancos de dados são case sensitive (ao contrário das palavras reservados do SQL).
Portanto, deve-se sempre fazer referência ao banco de dados, neste exemplo, como curso e não
Curso ou outra variação. Isto também vale para nomes de tabelas e das colunas.
Na lista aparece o banco de dados que acabamos de criar: curso. Os outros bancos de dados
são criados durante a instalação do MySQL e são usados pelo sistema para seu funcionamento. O
banco de dados mysql é necessário porque ele descreve privilégios de acessos de usuários. O banco
de dados test é geralmente fornecido como um espaço para que o usuário possa fazer testes.
Note que no comando USE não foi preciso utilizar “ ; ” no final, embora na maioria dos
comandos, o uso seja obrigatório para a sua execução.
O banco de dados necessita ser criado somente uma vez, mas deve-se selecioná-lo para o
uso toda vez que entrar no MySQL.
Uma forma alternativa é selecionar o banco de dados na linha de comando quando inicia o
MySQL. Para isso, especifique o nome do banco depois de qualquer parâmetro de conexão que
deve ser fornecido. Por exemplo:
mysql u root p curso
Enter password:
Note que curso não é a senha de acesso e sim o nome do banco de dados a ser usado.
O nome que o usuário define aos objetos dentro do MySQL, incluindo banco de dados,
tabela, coluna, índice, aliás e outros, são conhecidos como identificadores. Com relação a estes
identificadores, algumas regras devem ser observadas:
• Podem conter letras, dígitos, cifra e sublinhado;
• Podem começar com um dígito, mas não pode ter somente dígitos;
• Não podem terminar com caracteres de espaço;
• Não podem utilizar palavras reservadas do MySQL (Exemplo: nome de comados e funções,
como: table, database, create, insert, delete, where, count, max, etc.).
• Não é recomendado a utilização da caracteres especiais.
• É feita a distinção entre caracteres maiúsculos e minúsculos (case sensitive).
• Tipo de data: usado para armazenar datas, o MySQL não verifica de uma maneira restrita
se uma data é válida ou não. Simplesmente comprova que o mês está compreendido entre 0
e 12 e que o dia está compreendido entre 0 e 31.
Tipos de Dados de Data
Tipo Tamanho ocupado Limites e descrição
Date 8 bytes Data, de 01/01/1001 a 31/12/9999.
O formato é YYYY-MM-DD
DateTime 8 bytes Data e hora, de 01/01/1001 às 00:00:00 a
31/12/9999 às 23:59:59.
O formato é de YYYY-MM-DD HH:MM:SS
TimeStamp 4 bytes Data e hora, de 01/01/1970 ao ano 2037. O
formato é YYYYMMDDHHMMSS
Time 3 bytes Hora, de -838 horas, 59 minutos e 59 segundos.
O formato HH:MM:SS
Year 1 byte Ano, de o ano 1901 ao ano 2155.
O formato é YY ou YYYY
• Chave Estrangeira (ou Foreign Key): é a chave primária de outra tabela que servirá como
elo entre elas. Por exemplo, a coluna dep_id da tabela empregado é a Foreign Key d a
coluna cod_dep da tabela departamento, que por sua vez, é a chave primaria desta tabela.
Para trabalhar com integridade referencial, isto é, para adicionarmos restrições de
integridade (constraints) às chaves estrangeiras, é necessário criar as tabelas como InnoDB. O
InnoDB implementa as restrições de integridade de três formas distintas:
• RESTRICT: se existir um registro filho com diversos registros pais, não é permitido a
exclusão (DELETE) ou alteração (UPDATE) de qualquer um dos registros pais. Esta é a
forma padrão, assumida caso não seja definido nenhum parâmetro.
• CASCADE: se um registro na tabela pai for deletado (atualizado), o InnoDB
automaticamente também exclui (DELETE) ou altera (UPDATE) todos registros na tabela
filha cujos valores de chaves estrangeiras são iguais ao valor da chave referenciada no
registro pai.
• SET NULL: os registros filhos são automaticamente excluídos (DELETE) ou atualizados
(UPDATE) e assim as colunas na chave estrangeira são definidas com o valor NULL.
A criação das tabelas departamento e empregado, mostradas a seguir, ilustram como definir
as restrições de integridade e também a criação de índices.
Não é possível criar a tabela empregado antes da tabela departamento. Isso acontece porque
ainda não podemos relacionar a chave primaria da tabela departamento com a chave
estrangeira da tabela empregado, sendo possível após a criação da tabela departamento.
Portanto, vamos primeiro criar a tabela departamento. Para isso, execute o comando:
mysql> CREATE TABLE departamento(
> cod_dep SMALLINT,
> nome VARCHAR(30) NOT NULL,
> PRIMARY KEY (cod_dep),
> UNIQUE uk_nome_dep (nome) );
Observa-se que a sintaxe do CREATE TABLE é muito simples, sendo necessário apenas
informar o nome da tabela, no caso departamento, as colunas da tabela, os tipos de dados e o tipo
da tabela, podendo este último ser ocultado se for do tipo InnoDB.
Neste exemplo, definimos para a tabela departamento as colunas cod_dep e nome, e os,
respectivos, tipos de dados SMALLINT e VARCHAR(30).
Foi criado um Índice Único chamado uk_nome_dep para a coluna nome, pois esta coluna
pode ser bastante pesquisada e não pode ter valor repetido. É importante saber o nome deste índice
para poder apagá-lo posteriormente.
Agora sim, vamos criar a tabela empregado.
mysql> CREATE TABLE empregado(
> cod_emp INT,
> nome VARCHAR(90) not null,
> salario DECIMAL(10,2),
> data_admissao DATE,
> data_demissao DATE,
> dep_id SMALLINT,
> PRIMARY KEY (cod_emp),
> CONSTRAINT ches_emp FOREIGN KEY (dep_id) REFERENCES
departamento(cod_dep) ON DELETE RESTRICT ON UPDATE CASCADE ,
> INDEX in_nome_emp (nome),
> INDEX in_salario (salario) );
Foram criados dois Índices Não-Único: in_nome_emp, in_salario. O índice in_nome faz
referência ao nome do empregado, que costuma ser bastante consultado e que pode ter o valor
repetido, no caso de dois empregados com o mesmo nome. O índice in_salario faz referência ao
salário do empregado e também pode ter o valor repetido, no caso de empregados com o mesmo
valor de salário.
Note que as colunas cod_dep da tabela departamento e dep_id da tabela empregado
(chave estrangeira da primeira) armazenam dados do mesmo tipo: SMALLINT. Este é um dos pré-
requisitos para a implementação da chave estrangeira.
Para visualizar os nomes das tabelas existentes neste banco de dados, execute o comando:
mysql> SHOW TABLES ;
Para visualizar a estrutura da tabela empregado com mais detalhes, inclusive com os nomes
dos índices/chaves, execute o comando:
mysql> SHOW CREATE TABLE empregado \G
Às vezes, podem aparecer avisos (warning) durante a execução dos comandos no MySQL.
Para visualizar informações sobre estes avisos, execute o comando:
mysql> \W
No esquema acima, foi criada a tabela animal, com a coluna cod_animal, definido como
AUTO_INCREMENT. Note que não é possível utilizar a palavra AUTO_INCREMENT sem
informar que a coluna é PRIMARY KEY. Esta coluna receberá valores automaticamente, sendo
necessário informar apenas a palavra default quando utilizada a instrução INSERT:
mysql> INSERT INTO animal VALUES (default, 'nome_do_animal',
'dono', 'especie', 'm', '2000/02/01', NULL);
Desta forma, toda vez que for inserido um novo registro, o valor da coluna cod_animal
será incrementado automaticamente.
Vamos praticar!
Exercício 1) Criar uma tabela chamada teste, com duas colunas: codigo do tipo INT e nome do
tipo CHAR(20). A coluna codigo é chave primária e a nome é um índice não-único.
Exercício 2) Visualizar as tabelas do banco de dados curso.
Exercício 3) Visualizar a estrutura da tabela teste.
Vamos praticar!
Os principais comandos DML são: INSERT, SELECT, UPDATE e DELETE. Vamos ver
cada um deles.
No comando INSERT, os valores são passados para cada coluna, na ordem em que as
colunas foram listadas na instrução CREATE TABLE. Neste caso, para inserir os dados na tabela
departamento, pode-se executar o comando:
mysql> INSERT INTO departamento VALUES (10,'Vendas'),
(20,'Recursos Humanos'), (30,'Transporte');
Como todas as colunas estão recebendo dados na ordem em que foram criados na tabela,
pode-se executar o comando simplificado:
mysql> INSERT INTO empregado VALUES
> (109,'Alessandro Barbosa', '2344.50' ,'2010/12/01', '', 30);
Se a tabela for criada com uma coluna com AUTO_INCREMENT, no caso o cod_aninal da
tabela animal, pode-se executar o comando SQL:
mysql> INSERT INTO animal (nome, dono, especie, sexo,
aniversario, morte) VALUES
> ('Lulu','João Paulo Oliveira','Cão','M','20000201', NULL);
Desta forma, toda vez que for inserido um novo registro, o valor da coluna cod_animal será
incrementado automaticamente.
Com relação ao dados que são inseridos nas colunas, deve-se observar que:
1) Os números decimais devem ser indicados com ponto (.) e não com vírgula (,).
2) Os dados com caracteres e datas são especificados com aspas.
3) As datas devem ser armazenadas no formato AAAA/MM/DD.
Vamos praticar!
Para selecionar o nome e salário dos empregados do departamento 10 (dep_id = 10) e com
salário maior que 2000, execute o comando:
mysql> SELECT nome, salario FROM empregado
> WHERE dep_id = 10 AND salario > 2000;
Vamos praticar!
Exercício 8) Selecionar todos dados dos empregados que recebem salário entre R$ 3.000,00 e R$
5.000,00.
SELECT * FROM empregado WHERE salario BETWEEN 3000 AND 5000;
Exercício 9) Selecionar o codigo, nome e salario dos dos empregados com código entre 100 e 106.
Exercício 10) Selecione todos dados dos departamentos com código entre 1 e 50.
Exercício 11) Selecionar todos dados dos empregados cujo nome começam com a letra “A”.
SELECT * FROM empregado WHERE nome LIKE 'A%';
O parâmetro LIKE permite o uso do caractere “ % ”, que funciona como coringa. Neste
caso, a condição indica que a palavra precisa iniciar com a letra A e o que vem depois não é
relevante. O coringa pode ser usado também como terminador ou para indicar a presença do
caractere A, por exemplo, independente da sua posição (%A%).
Exercício 12) Selecionar nome e salario dos empregados cujo nome terminam com a letra “o”.
Exercício 13) Selecionar todos dados dos departamentos que tenham as letras “nd” no nome.
Exercício 14) Selecionar todos dados dos empregados que tenham a letra “A” no nome e salário
maior que 2.400.
Exercício 15) Selecionar todos dados dos empregados que trabalham no departamento 10 ou que
estão recebendo um salário maior que 2.300,00.
Por exemplo, para determinar quantos anos cada empregado trabalha na empresa, calcule a
diferença de anos da data atual e da data de admissão. Depois subtraia se o dia/mês da data atual for
anterior ao dia/mês da data de admissão. A consulta a seguir, mostra, para cada empregado não
demitido, a data de admissão, a data atual e a tempo de serviço em anos.
mysql> SELECT nome, data_admissao, data_demissao, CURDATE(),
( YEAR(CURDATE()) YEAR(data_admissao) )
( RIGHT(CURDATE(),5) < RIGHT(data_admissao,5) ) AS Tempo
> FROM empregado WHERE data_demissao = '0000/00/00' ;
A função YEAR() separa a parte do ano de uma data e RIGHT() separa os cinco caracteres
mais a direita que representam a parte da data MM-DD. A expressão completa é um tanto
deselegante, então um apelido (AS Tempo) é usado para exibir uma saída mais apresentável para o
usuário.
Outra consulta pode ser usada para determinar, para os empregados demitidos, quantos anos
de serviço eles tinham quando foram demitidos.
Para determinar quais são os empregados demitidos, confira se data_demissão não é vazia
(data_demissao != '0000/00/00'). Depois, para estes, calcule a diferença entre os valores das colunas
data_demissao e data_admissao:
mysql> SELECT nome, data_admissao, data_demissao,
( YEAR(data_demissao) YEAR(data_admissao) )
( RIGHT(data_demissao,5) < RIGHT(data_admissao,5) )
AS 'Tempo de Serviço'
> FROM empregado WHERE data_demissao != '0000/00/00'
> ORDER BY 'Tempo de Serviço';
Para saber quais empregados completam aniversário de admissão no próximo mês, não é
preciso conhecer o ano e o dia. Pode-se extrair a parte do mês da coluna data_admissao.
O MySQL fornece diversas funções para extrair partes da data, como em YEAR(),
MONTH() e DAYOFMONTH().
MONTH é a função apropriada aqui. Para ver como ela funciona, execute uma consulta que
mostra o mês da admissão dos empregados:
mysql> SELECT nome, data_admissao, MONTH(data_admissao)
FROM empregado ;
Encontrar empregados com aniversário de tempo de serviço no próximo mês também é fácil.
Suponha que o mês atual é abril. Então o valor do mês é 4 e procura-se por empregados admitidos
em Maio (mês 5) assim:
mysql> SELECT nome, data_admissao
> FROM empregado
> WHERE MONTH(data_admissao) = 5 ;
Pode-se também escrever uma consulta para que funcione independente do mês atual.
Assim não precisa usar um número de mês em particular na consulta. A função DATE_ADD()
permite adicionar um intervalo de tempo para uma data fornecida. Se adicionar um mês para o valor
de CURDATE e então extrair a parte do mês com MONTH(), o resultado é o mês no qual estamos
procurando pelos admitidos:
mysql> SELECT nome, data_admissao
> FROM empregado
> WHERE MONTH(data_admissao) =
> MONTH( DATE_ADD(CURDATE(), INTERVAL 1 MONTH) ) ;
Outra maneira para realizar a mesma tarefa é adicionar 1 para obter o mês seguinte ao atual:
mysql> SELECT nome, data_admissao
> FROM empregado
> WHERE MONTH(data_admissao) = MOD( MONTH(CURDATE()), 12 ) + 1 ;
Vamos praticar!
Exercício 1) Selecionar todos dados dos empregados cuja data de admissão seja no ano 2000.
Exercício 2) Selecionar todos dados dos empregados com data de admissão no ano 2000 e código
maior que 100.
Exercício 3) Selecionar todos dados dos empregados com data de admissão no ano 2000 ou
código maior que 106.
Função DISTINCT
A função DISTINCT pode ser utilizada para evitar que valores repetidos sejam visualizados
em uma consulta.
A sintaxe do comando SQL utilizando a função DISTINCT é:
mysql> SELECT DISTINCT(nome_da_coluna) FROM nome_da_tabela ;
Por exemplo, para selecionar os departamentos que têm empregados alocados (sem repetir
os códigos do departamento), utilize o comando SQL a seguir.
mysql> SELECT DISTINCT(dep_id) FROM empregado ;
Função COUNT
A função COUNT executa a contagem de registros de uma tabela.
A sintaxe do comando SQL utilizando a função COUNT é:
mysql> SELECT COUNT(nome_da_coluna) FROM nome_da_tabela
[ WHERE condição ] ;
A função COUNT(*) conta o número de resultados NOT NULL, portanto a consulta SQL
para contar a quantidade de empregados cadastrados nesta tabela é:
mysql> SELECT COUNT(*) FROM empregado ;
É possível utilizar esse comando com o parâmetro WHERE para filtrar os registros. Por
exemplo, para contar quantos empregados recebem salário maior que R$ 3.000,00, o seguinte
comando SQL pode ser utilizado:
mysql> SELECT COUNT(*) FROM empregado WHERE salario > 3000 ;
Função SUM
A função SUM realiza a soma dos valores de uma coluna.
A sintaxe do comando SQL utilizando a função SUM é:
mysql> SELECT SUM(nome_da_coluna) FROM nome_da_tabela
[ WHERE condição ] ;
Por exemplo, para somar o salário de todos os empregados cadastrados, utilize o seguinte
comando SQL.
mysql> SELECT SUM(salario) FROM empregado ;
Ainda é possível filtrar os registros a serem utilizados na soma. Para saber quanto se gasta
com os salários dos empregados que recebem mais de R$ 3.000,00, basta incluir o parâmetro
WHERE e condicionar os registros a serem utilizados na soma, como mostra o comando SQL:
mysql> SELECT SUM(salario) FROM empregado WHERE salario > 3000 ;
Função AVG
A função AVG calcula a média de valores de uma coluna.
A sintaxe do comando SQL utilizando a função AVG é:
mysql> SELECT AVG(nome_da_coluna) FROM nome_da_tabela
[ WHERE condição ] ;
Por exemplo, para saber qual é o salário médio dos empregados cadastrados:
mysql> SELECT AVG(salario) FROM empregado ;
Assim como nas funções anteriores, é possível filtrar os registros que serão utilizados para
calcular o valor médio. Por exemplo, para saber o salário médio dos empregados que recebem mais
de R$ 3.000,00, o seguinte comando SQL pode ser utilizado:
mysql> SELECT AVG(salario) FROM empregado WHERE salario > 3000 ;
Função MAX
A função MAX serve para obter o valor mais alto (máximo) cadastrado em uma coluna.
A sintaxe do comando SQL utilizando a função MAX é:
mysql> SELECT MAX(nome_da_coluna) FROM nome_da_tabela
[ WHERE condição ] ;
Por meio desse comando, é possível obter o maior salário registrado na tabela empregado:
mysql> SELECT MAX(salario) FROM empregado ;
A função MAX pode filtrar os registros a serem utilizados para obtenção do valor máximo.
Por exemplo, mostrar o salário mais alto entre os empregados com salario menor que R$ 3.000,00:
mysql> SELECT MAX(salario) FROM empregado WHERE salario < 3000 ;
Função MIN
A função MIN serve para obter o valor mais baixo (mínimo) cadastrado em uma coluna.
A sintaxe do comando SQL utilizando a função MIN é:
mysql> SELECT MIN(nome_da_coluna) FROM nome_da_tabela
[ WHERE condição ] ;
Por meio desse comando, é possível obter o salário mais baixo registrado na tabela
empregado, como mostra o comando SQL a seguir:
mysql> SELECT MIN(salario) FROM empregado ;
A função MIN pode filtrar os registros a serem utilizados para obtenção do valor mínimo.
Por exemplo, para saber o salário mais baixo entre os empregados que recebem mais de R$
3.000,00, utilize o comando SQL a seguir:
mysql> SELECT MIN(salario) FROM empregado WHERE salario > 3000 ;
Vamos praticar!
Exercício 1) Mostrar todas as datas de demissão dos empregados, sem repetí-las.
Exercício 2) Mostrar quantos empregados pertencem ao departamento 10.
Exercício 3) Mostrar a quantidade de departamentos que têm empregados alocados.
Exercício 4) Mostrar em quantas datas de admissao diferentes os empregados foram contratados.
Exercício 5) Mostrar a soma dos salários dos empregados do departamento 10.
Exercício 6) Mostrar a média dos salários dos empregados do departamento 20.
Exercício 7) Mostrar o menor salário dos empregados do departamento 30.
Exercício 8) Mostrar a maior data_admissao (mais recente) dos empregados do departamento 40.
Por exemplo, como fazer para calcular a média dos salários dos empregados para cada
departamento? Uma forma seria realizar um comando SQL para calcular a média (AVG) dos
salarios para cada departamento. Outra forma, é através de um único comando, automatizar essa
consulta por meio do parâmetro GROUP BY. O comando SQL a seguir mostra esta consulta:
mysql> SELECT dep_id, FORMAT(AVG(salario), 2) FROM empregado
> GROUP BY dep_id ;
Vamos praticar!
Por exemplo, para obter o salário médio dos empregados de cada departamento, mas exibir
apenas os departamentos cujos salários médios sejam menores que R$ 2.500,00:
mysql> SELECT dep_id, AVG(salario) FROM empregado
> GROUP BY dep_id HAVING AVG(salario) < 2500 ;
Outro exemplo, desta vez utilizando também o parâmetro WHERE: encontrar o salário
médio dos empregados dos departamentos 10 e 20, mas exibir apenas os departamentos cujos
salários médios sejam menores que R$ 2.500,00:
mysql> SELECT dep_id, AVG(salario) FROM empregado
> WHERE dep_id = 10 OR dep_id = 20
> GROUP BY dep_id HAVING AVG(salario) < 2500 ;
Vamos praticar!
Exercício 1) Mostrar o número de empregados que foram demitidos em cada data de demissão,
apenas os que realmente foram demitidos.
Exercício 2) Mostrar a quantidade de empregados e a soma do salários dos departamentos, com
excessão dos empregados do departamento 20.
Exercício 3) Mostrar a quantidade de empregados e a soma do salários dos departamentos, que
somam mais de 12.000, com excessão dos empregados do departamento 20.
Exercício 4) Mostrar o código do departamento e a respectiva quantidade de empregados, dos
departamentos que tem 2 ou mais empregados.
Exercício 5) Mostrar o código do departamento e a respectiva quantidade de empregados, dos
departamentos que tem 2 ou mais empregados, sem contar os demitidos.
Caso o comando SQL esteja utilizando outros parâmetro, como WHERE ou GROUP BY,
recomenda-se que o parâmetro ORDER BY seja utilizado por último.
Para exibir, em ordem crescente de nome, a lista dos empregados, o seguinte comando SQL
deve ser utilizado:
mysql> SELECT * FROM empregado
> ORDER BY nome ;
Note que não foi especificado o argumento do parâmetro ORDER BY. Neste caso, a
ordenação é definida como crescente, sendo possível utilizar o argumento ASC para garantir esta
condição.
O parâmetro ORDER BY pode ser utilizado para a ordenação decrescente. O argumento
DESC, exibido no final da sintaxe, possibilita esta forma de ordenação.
O ORDER BY permite também definir mais de uma coluna como critério de ordenação.
Por exemplo, para ordenar o resultado da consulta de forma decrescente de salário e
crescente de nome. O seguinte comando SQL pode ser utilizado:
mysql> SELECT * FROM empregado
> ORDER BY salario DESC , nome ASC;
Note que a expressão DESC é aplicada somente para a coluna salario; ela não afeta a
ordenação da coluna nome. Neste exemplo, quando o salário dos empregados for igual, o segundo
critério de ordenação será utilizado. Caso contrário, o segundo critério de ordenação é ignorado.
Função LIMIT
A partir de uma consulta, é possível visualizar os primeiros N registros retornados, assim
como os últimos N. Esse tipo de operação otimiza recursos para realizar tarefas como mostrar os
cinco empregados que recebem maior salário, bem como, os três com menores salários.
A sintaxe do comando SQL utilizando a função LIMIT é:
mysql> SELECT nome_da_coluna FROM nome_da_tabela LIMIT x,y;
O valor de x na expressão indica quantos registros devem ser ignorados (pulados), e o valor
do y indica quantos devem ser exibidos a partir da posição x.
Por exemplo, para selecionar os três primeiros nomes em ordem alfabética da tabela
empregado, o seguinte comando SQL deverá ser utilizado:
mysql> SELECT nome FROM empregado ORDER BY nome LIMIT 0,3;
No caso da necessidade de obter os últimos três nomes, o argumento DESC deverá ser
utilizado, junto ao parâmetro ORDER BY, para inverter o resultado, como mostra o comando SQL a
seguir:
mysql> SELECT nome FROM empregado ORDER BY nome DESC LIMIT 0,3;
Vamos praticar!
Por exemplo, o comando SQL para aumentar o salário em 10% de todos os empregados é:
mysql> UPDATE empregado
> SET salario = salario + salario * 0.1;
Se fosse para aumentar o salário em 10% apenas para os empregados com salário menor que
R$ 3.000,00, o comando SQL seria:
mysql> UPDATE empregado
> SET salario = salario + salario * 0.1
> WHERE salario <= 3000;
Note que no segundo exemplo, é especificada a condição WHERE. Neste caso, o aumento
será fornecido apenas aos empregados que tiverem a condição do WHERE satisfeita.
Vamos praticar!
Assim como os comandos SELECT e UPDATE, o parâmetro WHERE serve para filtrar os
registros, sendo no caso do DELETE, os que serão excluídos. Não utilizar o WHERE, implica na
remoção de todos os registros da tabela.
Por exemplo, para excluir o registro do empregado, cujo código é 145, o seguinte comando
SQL pode ser utilizado:
mysql> DELETE FROM empregado
> WHERE cod_emp = 145 ;
A execução deste comando deve ser realizada com atenção, pois não é mostrada nenhuma
mensagem de confirmação da sua execução.
Vamos praticar!
Até agora vimos apenas exemplos onde selecionávamos informações de uma única tabela.
Mas às vezes, é preciso mostrar resultados provenientes de duas ou mais tabelas.
Por exemplo, ao mostrar os dados dos empregados, deseja-se que ao invés de exibir o código
do departamento dos empregados, seja exibido o nome do departamento. Porém, esta informação
está armazenada na tabela departamento.
Para selecionar informações de tabelas diferentes, é preciso que elas tenham alguma relação
entre si. As tabelas empregado e departamento possuem este relacionamento, que é implementado
pela chave estrangeira. Vamos ver no exemplo a seguir como é fundamental o uso da chave
estrangeira para selecionar informações de tabelas diferentes.
Vamos praticar!
Exercício 1) Selecionar nome e salario dos empregados e o nome dos respectivos departamentos,
dos empregados que têm salário maior que R$ 5.000,00.
Exercício 2) Selecionar nome, salário dos empregados e o nome dos respectivos departamentos,
dos empregados que não trabalham no departamento 10.
Exercício 3) Selecionar nome, salario dos empregados e o nome dos respectivos departamentos,
dos empregados com salário menor que R$ 4.000,00.
Exercício 4) Selecionar nome, salario dos empregados e o nome dos respectivos departamentos,
dos empregados com data de admissão no ano 2010 e código maior ou igual a 100.
Exercício 6) Mostrar a soma dos salários dos empregados de cada departamento, e o nome do
departamento.
Exercício 7) Mostrar a média dos salários dos empregados de cada departamento, e o nome do
departamento.
Exercício 9) Mostrar o nome dos departamentos cujo soma dos salários dos empregados é acima
de R$ 12.000,00.
Exercício 10) Mostrar o nome dos departamentos cujo soma dos salários dos empregados é acima
de R$ 5.000,00, mas que não sejam do departamento com código 10.
Exercício 11) Mostrar o codigo e nome dos departamentos cuja a soma dos salarios dos
empregados é acima de R$ 6.500,00. Nesta soma, considere apenas os salarios dos empregados
que recebem mais de R$ 3.400,00.
Exercício 12) Mostrar o nome dos empregados e seus respectivos departamentos, ordenando o
resultado em ordem crescente de nome de departamento.
Exercício 13) Mostrar o nome e salario dos empregados e seus respectivos departamentos,
ordenando o resultado em ordem decrescente de salario.
Exercício 14) Mostrar o nome dos empregados e departamentos, em ordem crescente de nome
departamento e decrescente de nome de empregado.
Exercício 15) Mostrar o nome e salario dos empregados e nome dos seus departamento, em ordem
crescente de nome departamento e crescente de salario.
Os principais comandos DCL são: GRANT e REVOKE. Nesta lição veremos uma breve
introdução sobre os comandos GRANT e REVOKE, pois a sintaxe deles é um pouco complicada,
sendo mais fácil utilizar, para estas tarefas, ferramentas gráficas de administração de BD.
Ao executar um comando GRANT para um usuário que não existe, o mesmo será criado.
Caso contrário, o GRANT, adicionará os novos privilégios aos já concedidos anteriormente.
A sintaxe do comando GRANT é:
mysql> GRANT privilégios [ colunas ]
ON item
TO usuario IDENTIFIED BY 'senha_do_usuario'
[ WITH GRANT OPTION ] ;
• privilégios: pode ser uma ou mais das seguintes opções (separadas por vírgula):
PRIVILÉGIO PERMISSÃO OBSERVAÇÃO
SELECT selecionar linhas (registros) aplicado a tabelas e colunas
INSERT inserir linhas aplicado a tabelas e colunas
UPDATE alterar valores em linhas aplicado a tabelas e colunas
DELETE apagar linhas aplicado a tabelas
INDEX criar e excluir índices aplicado a tabelas
alterar tabelas(adicionar colunas,
ALTER renomear colunas ou tabelas, alterar aplicado a tabelas
tipos de dados de colunas)
aplicado a banco de dados e tabelas. Se o
comando GRANT for especificado com um
banco de dados ou tabela em particular, só
CREATE criar banco de dados ou tabela
poderá ser criado esse banco ou tabela, o
que significa que eles terão que ser
excluídos primeiro (DROP)
DROPapagar banco de dados ou tabela aplicado a banco de dados e tabelas
recarregar tabelas grant e revogar
RELOAD deve ser concedido apenas a administradores
privilégios, hosts, logs e tabelas
SHUTDOWN desligar o servidor MySQL deve ser concedido apenas a administradores
visualizar processos do servidor e
PROCESS deve ser concedido apenas a administradores
eliminá-los
ler e transferir dados entre tabelas e
FILE deve ser concedido apenas a administradores
arquivos
ALL tudo deve ser concedido apenas a administradores
isto apenas cria um usuário e o permite
USAGE nada
efetuar o logon, mas não permite nada
• colunas: é opcional e especifica as colunas a que os privilégios se aplicam. Pode ser uma
única coluna ou várias (separadas por vírgula);
• WITH GRANT OPTION: se este parâmetro for especificado, o usuário pode conceder
seus privilégios a outros usuários do MySQL.
Se foi concedido ao usuário privilégios com WITH GRANT OPTION, pode-se revogá-lo
com o comando:
mysql> REVOKE GRANT OPTION
ON item
FROM usuario ;
Podem ser passados outros argumentos ao comando GRANT e REVOKE. Para mais
informações, acesse o site da documentação do MySQL (http://dev.mysql.com/doc/).
• Usuário monty: superusuário completo que pode conectar ao servidor de qualquer lugar,
mas deve utilizar uma senha @123#ABC para fazer isto. Perceba que devemos utilizar o
comando GRANT para monty@localhost e monty@"%". Se não adicionar a entrada com
localhost, a entrada para o usuário anônimo para localhost que é criada por
mysql_install_db, toma precedência quando o usuário conectar-se da máquina local, porque
ele contém um campo host com um valor mais específico e também vem antes na ordenação
da tabela user.
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY
' @123
#ABC' WITH GRANT OPTION ;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@'%' IDENTIFIED BY
' @123
#ABC' WITH GRANT OPTION ;
• Usuario admin: usuário que pode conectar de localhost sem uma senha e que é concedido
os privilégios administrativos reload e process. Isto permite ao usuário a execução dos
comandos mysqladmin reload, mysqladmin refresh, mysqladmin flush-* e mysqladmin
processlist. Nenhum privilégio a nível de bancos de dados é concedido.
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost ;
• Usuario dummy: usuário que pode conectar sem uma senha, mas somente do localhost.
Não são concedidos nenhum privilégio (o tipo de privilégio USAGE permite a criação de
um usuário sem privilégios). Ele tem o efeito de criar todos os privilégios globais com 'N'.
Considera-se que serão concedidos privilégios específicos a conta posteriormente.
mysql> GRANT USAGE ON *.* TO dummy@localhost ;
5. Ferramentas de Administração
Nesta lição veremos como administrar o MySQL utilizando uma ferramenta gráfica.
Ao final desta lição têm alguns exercícios para revisar o conteúdo apresentado. São
exercícios simples, cujo conteúdo é explicado no decorrer das lições.
Estude com calma, preste atenção e reproduza os exemplos mostrados.
Bom estudo!
5.1. PhpMyAdmin
Como visto na lição anterior administrar contas de usuário por linhas de comando é muito
complicado. Para facilitar esta e outras tarefas administrativas existem ferramentas gráficas que
auxiliam na utilização do MySQL.
Entre as várias ferramentas gráficas existentes, podemos citar o PhpMyAdmin. O
PhpMyAdmin é uma ferramenta de uso gráfico simples e prática para auxiliar no gerenciamento e
na administração do servidor e dos bancos de dados do MySQL.
Por meio de uma interface gráfica web, disponibiliza alguns dos recursos mais utilizados do
MySQL, como criação de bancos de dados, criação e manutenção de tabelas e gerenciamento de
processos, de forma rápida e intuitiva para o usuário.
O PhpMyAdmin apenas automatiza algumas das linhas de comandos mais frequentes do
MySQL. Não existe nenhum recurso exclusivo do PhpMyAdmin que não possa ser feito a partir do
terminal do MySQL. Muito pelo contrário, nem tudo que pode ser feito via terminal poderá ser feito
com o uso do PhpMyAdmin.
O grande objetivo do PhpMyAdmin é tornar mais simples e pratica a interação com o
MySQL, utilizando os conceitos de programação gráfica.
Basta responder Sim para as perguntas e pronto. Também será necessário instalar o Apache,
porém esse processo é realizado com a instalação do pacote do PhpMyAdmin.
Caso o servidor esteja na máquina onde está sendo acessado o PhpMyAdmin, basta digitar:
http://localhost/phpmyadmin
Aparecerá uma tela, como a mostrada na figura a seguir, solicitando o Usuário e Senha.
Informe os mesmos usuário e senha utilizados para acesso ao MySQL no terminal. Caso o
MySQL seja recém-instalado, o usuário será root e a senha criada na instalação do MySQL.
Nesta tela têm vários menus, a partir dos quais pode-se configurar as principais funções do
PhpMyAdmin.
Vamos ver os menus com um pouco mais de detalhe.
1 2 3 4 5 6
1
2
Com o banco de dados selecionado é possível renomeá-lo, copiá-lo e apagá-lo. Para isso,
selecione o menu Operações.
2. No campo Criar nova tabela no Banco de Dados curso, digite o nome da tabela a ser
criada e o número de colunas que a tabela terá. Depois clique no botão Executar. Ou clique
no botão Create table localizado no menu esquerdo.
3. Em seguida, aparecerá uma tela onde devem ser preenchidos os nomes das colunas da tabela
e seus respectivos tipos de dados. Lembre-se de informar, no campo Tamanho/Definir, o
número de caracteres para tipos de dados CHAR e VARCHAR. Nesta tela também pode ser
configurado se a coluna será Índice (PRIMARY, UNIQUE, INDEX) e/ou AUTO-
INCREMENT.
4. Depois de preencher as informações solicitadas, clique em Salvar ou Executar.
2. Serão mostradas as colunas da tabela com várias ações que podem ser executadas em cada
uma delas: Alterar (a estrutura da coluna), Eliminar, Adicionar chave primária, etc.
Nesta tela pode-se ainda Adicionar novas colunas (No final da tabela, No início da tabela
ou ainda Depois de uma coluna especificada). Também é possível Criar, Editar ou Eliminar Índices.
Nesta tela também é possível Mover/Copiar a tabela para outro banco de dados. E ainda,
Esvaziar a tabela, mantendo a estrutura da tabela ou Remover a tabela, eliminando a estrutura e
dados.
1. Selecione o banco de dados onde está a tabela que será excluída, selecione o menu
Estrutura e clique na opção Eliminar correspondente à tabela.
2. Selecione a tabela que será excluída, selecione o menu Operações e clique na opção
Remover a tabela (Drop).
Para inserir dados em uma tabela utilizando o PhpMyAdmin, existem várias formas:
1. Selecione o banco de dados onde está a tabela, selecione o menu Estrutura e clique na
opção Inserir correspondente à tabela.
Para selecionar os dados em uma tabela utilizando o PhpMyAdmin, existem várias formas:
1. Selecione o banco de dados onde está a tabela, selecione o menu Estrutura e clique na
opção Visualizar correspondente à tabela.
Existe ainda uma outra forma de selecionar dados em uma ou mais tabelas:
1. Acesse a tela inicial do PhpMyAdmin (clique no link localhost no topo da tela ou no ícone
Principal, no menu esquerdo).
6. Clique em Executar.
2. Selecione o menu Importar, clique no botão Selecionar o arquivo para localizar arquivo e
selecione o Formato do arquivo (preferencialmente o SQL).
Finalizamos esta breve introdução sobre esta ferramenta de administração. Caso queira
encontrar mais informações sobre o PhpMyAdmin pode acessar o site da ferramenta
(http://www.phpmyadmin.net).
Neste caso, será preciso indicar o caminho /<caminho>/backup.sql sempre que for utilizar
este arquivo.
Para gerar o backup do banco curso, sem a opção de criação do banco (-B), compactando o
arquivo de saída no formato gzip, execute no terminal do Linux o comando:
mysqldump u root p curso | gzip 9 > backup.sql.gz
Para criar um novo BD, uma vez que o último backup foi criado sem o banco, execute no
terminal do Linux o comando:
mysqladmin u root p create curso
Para listar os BD do MySQL, sem precisar entrar no sistema, execute no terminal do Linux
o comando:
mysqlshow p
Com estes comandos, é possível fazer backup e até copiar o BD para outro computador.
Conclusão