Escolar Documentos
Profissional Documentos
Cultura Documentos
Outros exemplos de SGBDs: Sybase, Firebird, MariaDB, Microsoft Access, IBM DB2, etc.
Em nossos estudos, utilizaremos o MySQL, mais especificamente, o MySQL
Workbench, uma ferramenta visual para criação de bancos de dados que integra ambiente de
desenvolvimento SQL, modelagem, criação, manutenção e administração de banco de dados.
Ele está disponível nas versões “Community” e “Standard”, e pode ser baixado através do
caminho https://dev.mysql.com/downloads/file/?id=486089.
Iniciando o MySQL Workbench
Para criarmos nosso modelo físico, usaremos o MySQL Workbench. Ao acessá-lo, a
primeira coisa que precisamos fazer é nos conectarmos ao servidor do MySQL instalado. Este
servidor pode estar localizado na própria máquina ou em um computador remoto. O
instalador que vem do site através do link descrito anteriormente nos provê, além do
Workbench, uma instância local do MySQL.
O que é SQL?
Devido à necessidade de armazenar as informações geradas pelos programas de
computadores, o armazenamento e a recuperação das informações passaram a desempenhar
um papel fundamental na informática. Em junho de 1970, E. F. Codd, membro do Laboratório
de Pesquisa da IBM em San Jose, na Califórnia, publicou um trabalho no jornal Association of
Computer Machinery. Nesse trabalho, Codd estabeleceu princípios sobre gerência de banco de
dados, denominando-os com o termo relacional. Essa foi a base utilizada na criação e uma
linguagem-padrão para manipular informações em bancos de dados relacionais. E essa
linguagem é a SQL (Structured Query Language).
Inicialmente chamada de SEQUEL (Structured English Query Language), a linguagem
SQL foi concebida e desenvolvida pela IBM, utilizando os conceitos de Codd. Em 1979, a
Relational Software Inc., hoje Oracle Corporation, lançou a primeira versão comercial da
linguagem SQL. Atualmente, a SQL pode ser considerada um padrão para manipulação de
dados em banco de dados. Duas entidades, a ANSI (American National Standards Institute) e a
ISO (International Standards Organization), vêm ao longo do tempo padronizando a linguagem
SQL.
Essa linguagem é dividida em quatro partes:
• DDL (Data Definition Language – Linguagem de Definição de Dados): divisão que
permite a criação dos componentes do BD.
• DML (Data Manipulation Language – Linguagem de Manipulação de Dados):
divisão que permite a manipulação (inserção, exclusão, alteração) dos dados.
• DQL (Data Query Language – Linguagem de Consulta de Dados): divisão que
permite a extração/consulta dos dados existentes em um BD.
• DCL (Data Control Language – Linguagem de Controle de Dados): divisão que
controla a segurança do BD.
R1 – Entidade:
Cursos(cod_curso, nome_curso)
Turmas(cod_turma, nome_turma, periodo_turma)
Alunos(cod_aluno, nome_aluno, sexo_aluno, end_aluno, datanasc_aluno)
Materias(cod_materia, nome_materia, qtde_aulas_semanal)
Professores(cod_prof, nome_prof, sexo_prof, salario_prof, end_prof, datanasc_prof)
R2 – Entidade Fraca: Não se aplica
R3 – Generalização/Especialização: Não se aplica
R4 – Relacionamento 1:1: Não se aplica
R5 – Relacionamento 1:N:
Turmas(cod_turma, nome_turma, periodo_turma, “cod_curso”)
cod_curso referencia Cursos
Alunos(cod_aluno, nome_aluno, sexo_aluno, end_aluno, datanasc_aluno, “cod_turma”)
cod_turma referencia Turmas
R6 – Relacionamento N:N:
Alunos_Materias(“cod_materia”, “cod_aluno”, num_trimestre, nota, qtde_faltas)
cod_materia referencia Materias
cod_aluno referencia Alunos
Cursos_Materias(“cod_curso”, “cod_materia”)
cod_curso referencia Cursos
cod_materia referencia Materias
Cursos(cod_curso, nome_curso)
Turmas(cod_turma, nome_turma, periodo_turma, “cod_curso”)
cod_curso referencia Cursos
Alunos(cod_aluno, nome_aluno, sexo_aluno, end_aluno, datanasc_aluno, “cod_turma”)
cod_turma referencia Turmas
Materias(cod_materia, nome_materia, qtde_aulas_semanal)
Professores(cod_prof, nome_prof, sexo_prof, salario_prof, end_prof, datanasc_prof)
Alunos_Materias(“cod_materia”, “cod_aluno”, num_trimestre, nota, qtde_faltas)
cod_materia referencia Materias
cod_aluno referencia Alunos
Cursos_Materias(“cod_curso”, “cod_materia”)
cod_curso referencia Cursos
cod_materia referencia Materias
Professores_Materias_Turmas(“cod_materia”, “cod_prof”, “cod_turma”)
cod_materia referencia Materias
cod_prof referencia Professores
cod_turma referencia Turmas
Por exemplo:
Para excluirmos um banco de dados, usamos o comando drop database (ou drop
schema). Sintaxe do comando:
Por exemplo:
Usando nosso modelo lógico criado anteriormente, vamos definir o banco de dados
agora. Para isso, vamos chama-lo de escola. Portanto, o comando para criar o BD fica:
use escola;
Argumento Descrição
<nome_da_tabela> Define o nome da tabela. Deve ser um nome único para o
usuário. Não pode coincidir com o nome de outros objetos do
banco de dados de um mesmo usuário.
<nome_da_coluna> Nome da coluna. Esse nome deve ser único e exclusivo na tabela.
<tipo_de_dado> Tipo de dado que o campo aceita (inteiros, caracteres, datas, etc.)
Abordaremos mais sobre os tipos de dados abaixo.
<constraint_da_coluna> Regras agregadas à coluna
<constraint_da_tabela Regras agregadas à tabela. Falaremos mais sobre as constraints
abaixo.
Tipos de Dados
Ao ser criada a tabela, é necessário criar a estrutura da mesma, ou seja, definir quais
campos existirão. Para executar tal tarefa faz-se necessário uma análise minuciosa dos
detalhes para qual será utilizado o banco de dados, pois estes deverão ser os dados
preenchidos pelo usuário ao utilizá-lo. Deve ser considerado nesta análise o tamanho que será
utilizado para cada campo, para que não ocorra desperdício de espaço no computador.
Ao se definir um campo é necessário informar qual o tipo de dado será digitado. As
tabelas a seguir têm os tipos de dados usados no MySQL:
TIPOS NUMÉRICOS
Tamanho
Tipo Uso Atributo
Mínimo Máximo
Um inteiro Signed -128 127
TINYINT muito
Unsigned 0 255
pequeno
Um inteiro Signed –32768 32767
SMALLINT
pequeno Unsigned 0 65535
Um inteiro Signed –8388608 8388607
de
MEDIUMINT
tamanho Unsigned 0 16777215
mediano
Um inteiro Signed –2147483648 2147483647
INT or de
INTEGER tamanho Unsigned 0 4294967295
normal
Um inteiro –
de Signed 92233720368547758 9223372036854775807
BIGINT
tamanho 08
grande Unsigned 0 18446744073709551615
Um –3.402823466E+38 –1.175494351E-38, 0
Signed
pequeno 1.175494351E-38 3.402823466E+38
número de
FLOAT Não pode ser unsigned
ponto
OBS Se o número de decimais não for especificado ou
flutuante
for <= 24 será de precisão simples
(precisão
simples)
Um -
-2.2250738585072014E-
número de 1.7976931348623157E
308, 0
ponto Signed +308
DOUBLE,
flutuante 2.2250738585072014E- 1.7976931348623157E+
DOUBLE
de 308 308
PRECISION,
tamanho
REAL Não pode ser unsigned
normal
OBS Se o número de decimais não for especificado ou
(precisão
for 25 <= Decimals <= 53 será de precisão dupla
dupla)
Se comporta como um campo CHAR:
“descompactado” significa que o número é
armazenado como uma string, usando um
caractere para cada dígito do valor. O ponto
decimal e, para números negativos, o sinal ‘-’ não
Um Signed é contado. Se o decimal for 0, os valores não terão
número de ponto decimal ou parte fracionária.
DECIMAL, ponto O alcance máximo de valores decimais é o mesmo
NUMERIC flutuante que para o DOUBLE, mas a faixa atual para um
descompac campo DECIMAL dado pode ser limitado pela
tado. escolha de comprimento e decimais.
Não pode ser unsigned
Se Decimais é deixado de fora ele é definido como
OBS 0. Se o comprimento é deixado de fora ele é
definido como 10. Note que no MySQL 3,22 o
comprimento inclui o sinal eo ponto decimal
CAMPOS DE DATAS
Tamanho
Tipo Uso
Mínimo Máximo
‘1000-01-01’ ‘9999-12-31’
DATE Datas
Obs: Formato - ‘YYYY-MM-DD’
Data e ‘1000-01-01 00:00:00’ ‘9999-12-31 23:59:59’
DATETIME
horário Obs: Formato - ‘YYYY-MM-DD HH:MM:SS’
‘1970-01-01 00:00:00’ aproximadamente 2037
Obs: Formato - YYYYMMDDHHMMSS, YYMMDDHHMMSS,
YYYYMMDD ou YYMMDD, dependendo se M é 14 (ausente), 12, 8
TIMESTAMP Timestamp ou 6, podendo ser strings ou números.
Este tipo é recomendável para instruções de INSERT ou UPDATE
pois é automaticamente marcado com os valores da operação
mais recente quando não informado.
‘-838:59:59’ ‘838:59:59’
TIME Horários
Obs: formato - ‘HH:MM:SS’, podem ser strings ou números
Anos com 2 1901 2155 e 0000
ou 4 1970 2069
YEAR digitos. O
Obs: Formato - YYYY
padrão é 4
podem ser strings ou números.
digitos
CAMPOS TEXTO
Tamanho
Tipo Uso
Mínimo Máximo
1 255 caracteres
String de tamanho fixo. Espaços excessivos são removidos quando o
Sempre é completada com valor é trazido.Os valores são ordenados e
CHAR
espaços a direita até o comparados ignorando caixas altas e baixas de
tamanho definido acordo com a codificação padrão, a menos que
seja fornecido uma chave binária.
1 255 caracteres
Os valores são ordenados e comparados
ignorando caixas altas e baixas de acordo com a
VARCHAR String de tamanho variável
codificação padrão, a menos que seja fornecido
uma chave binária.Nota: Espaços execessivos
são removidos quando o valor é inserido.
TINYTEXT 0 255 (2^8 – 1) caracteres
Cadastro de texto livre, 65535 (2^16 – 1)
TEXT 0
com grande quantidade de caracteres
caracteres, como uma 16777215 (2^24 – 1)
MEDIUMTEXT 0
notícia um uma descrição caracteres
de um produto. 4294967295 (2^32 – 1)
LONGTEXT 0
caracteres
DADOS BINÁRIOS
Tamanho
Tipo
Mínimo Máximo
TINYBLOB 0 255 (2^8 – 1) caracteres
65535 (2^16 – 1)
BLOB 0
caracteres
16777215 (2^24 – 1)
MEDIUMBLOB 0
caracteres
4294967295 (2^32 – 1)
LONGBLOB 0
caracteres
LISTAS
Tamanho
Tipo Uso
Mínimo Máximo
String que pode conter apenas um
ENUM Enumeração 65535 valores distintos.
valor ou zero
String que pode conter zero ou
SET Lista 64 itens
mais valores
Constraints (Regras ou Restrições)
As constraints são as regras ou restrições que podemos aplicar a uma coluna ou a uma
tabela. Analisaremos algumas a seguir.
Primary Key
Foreign Key
Exemplo:
create table alunos_materias(
cod_aluno int not null,
cod_materia int not null,
media float,
qtde_faltas tinyint,
primary key (cod_aluno, cod_materia),
foreign key (cod_aluno) references alunos(cod_aluno),
foreign key (cod_materia) references materias(cod_materia));
Default, Unique, Not Null, Check e Auto_increment
Default: Usado para definir um conteúdo padrão para uma coluna da tabela, sempre
que uma nova linha for incluída.
Unique: Indica que não pode ocorrer repetição do conteúdo da coluna.
Not Null: Indica que o conteúdo de uma coluna não pode ser nulo.
Check: verifica se um campo atende a uma condição.
Auto_increment: permite que um campo único seja incrementado automaticamente
quando um novo registro é inserido na tabela. Normalmente usado com chave primária.
Voltando ao nosso cenário da escola, temos definido no modelo lógico oito tabelas
para serem criadas. Observe novamente o modelo lógico:
Cursos(cod_curso, nome_curso)
Turmas(cod_turma, nome_turma, periodo_turma, “cod_curso”)
cod_curso referencia Cursos
Alunos(cod_aluno, nome_aluno, sexo_aluno, end_aluno, datanasc_aluno, “cod_turma”)
cod_turma referencia Turmas
Materias(cod_materia, nome_materia, qtde_aulas_semanal)
Professores(cod_prof, nome_prof, sexo_prof, salario_prof, end_prof, datanasc_prof)
Alunos_Materias(“cod_materia”, “cod_aluno”, num_trimestre, nota, qtde_faltas)
cod_materia referencia Materias
cod_aluno referencia Alunos
Cursos_Materias(“cod_curso”, “cod_materia”)
cod_curso referencia Cursos
cod_materia referencia Materias
Professores_Materias_Turmas(“cod_materia”, “cod_prof”, “cod_turma”)
cod_materia referencia Materias
cod_prof referencia Professores
cod_turma referencia Turmas
Analisando os campos acima, antes de criarmos as tabelas, precisamos ter uma ideia
dos tipos de dados que aplicaremos e as restrições que serão aplicadas aos campos e tabelas.
Vamos organizar isso:
• Os campos de código, referentes às chaves primárias das tabelas, ficam melhor
organizados e com melhor desempenho se os definirmos como integer. Além
disso, estes campos de código atuarão como chaves estrangeiras.
• Nome_curso, nome_turma, periodo_turma, nome_aluno, sexo_aluno, end_aluno,
nome_materia, nome_prof, sexo_prof, end_prof são campos que trabalharão com
texto. Como não sabemos a quantidade de caracteres que será digitada, o ideal é
trabalhar com o tipo varchar. Nos campos de sexo, se quisermos reduzir o espaço
de armazenamento, podemos usar o tipo char com 1 caractere, e podemos
cadastrar os valor ‘M’ para mulheres e ‘H’ para homens.
• Datanasc_aluno, datanasc_prof devem ser do tipo date.
• Qtde_aulas_semanal, num_trimestre, qtde_faltas são referentes a números.
Podemos trabalhar com integer para eles.
• Nota e salario_prof são referentes a valores decimais, portanto, podemos usar o
tipo float.
• Todos os campos são obrigatórios, e devem ter a constraint not null associada.
Portanto:
Tabela Campo Tipo de dado Constraint
cod_curso int Not null, primary key
Cursos
nome_curso varchar(50) Not null
cod_turma int Not null, primary key
nome_turma varchar(10) Not null
Turmas
periodo_turma varchar(10) Not null
cod_curso int Not null, foreign key
cod_aluno int Not null, primary key
nome_aluno varchar(50) Not null
sexo_aluno char(1) Not null
Alunos
end_aluno varchar(50) Not null
datanasc_aluno date Not null
cod_turma int Not null, foreign key
cod_materia int Not null, primary key
Materias nome_materia varchar(50) Not null
qtde_aulas_semanal int Not null
cod_prof int Not null, primary key
nome_prof varchar(50) Not null
sexo_prof char(1) Not null
Professores
salario_prof float Not null
end_prof varchar(50) Not null
datanasc_prof date Not null
cod_materia int Not null, primary key, foreign
key
cod_aluno int Not null, primary key, foreign
Alunos_Materias key
num_trimestre int Not null
nota float Not null
qtde_faltas int Not null
cod_curso int Not null, primary key, foreign
key
Cursos_Materias
cod_materia int Not null, primary key, foreign
key
cod_prof int Not null, primary key, foreign
key
Professores_Materias cod_materia int Not null, primary key, foreign
_Turmas key
cod_turma int Not null, primary key, foreign
key
Programando as tabelas agora, teremos:
-- cria o banco
create database escola;
Observações:
• Podemos fazer comentários no código SQL, assim como fazemos em programação.
Para fazer um comentário de linha única, usamos -- e para fazermos comentários
de múltiplas linhas, iniciamos o comentário com /* e terminamos com */. O uso de
comentários é uma boa prática em códigos extensos ou complexos, onde podemos
fazer anotações de coisas que podem ser esquecidas ou que podem nos ajudar na
hora de fazer alguma análise.
• Chaves primárias compostas só podem ser criadas como constraints de tabela.
• O campo que atuará como chave estrangeira deve estar entre parênteses na linha
da declaração da constraint da foreign key.
• Cuidado com a abertura e fechamento de parênteses na hora de fazer os
comandos, e também tome cuidado para não esquecer das vírgulas para separar
um campo de outro, e do ponto e vírgula para terminar o comando de criação da
tabela.
• Para ver as tabelas criadas em um determinado banco, use o comando show
tables.
Exemplo:
Sintaxe:
Exemplo:
Sintaxe:
Exemplo:
Sintaxe:
Exemplo:
Sintaxe:
Exemplo:
Sintaxe:
Renomear colunas
Sintaxe:
Exemplo:
alter table alunos_materias change nota nota_tri int unsigned not null;
Nota: unsigned é uma constraint usada para permitir somente valores positivos em
uma coluna do banco. Signed permite valores negativos (e é o padrão).
Renomear tabelas
Sintaxe:
Exemplo:
Exemplo:
Exemplo:
Trabalho
Usando como base o modelo lógico corrigido da empresa que vocês criaram
anteriormente, faça a codificação para criar o banco de dados e as tabelas utilizando o MySQL.
Vocês deverão entregar o script .sql (o arquivo que fazemos no Workbench) com o código
pronto. Data da entrega: 07/08, via e-mail (yuri.almeida@docente.fieb.edu.br)
Crie todas as tabelas, com todos os campos e chaves necessárias. Consulte este
material para verificar eventuais regras ou tipos de campos que vocês desejem colocar. Na
hora de criar as tabelas, analise cada campo e pense no tipo de dado mais adequado e nas
regras que devem ser associadas a ele (ex: not null, unique, auto_increment, etc.).