Você está na página 1de 12

CAPÍTULO 6: AULA 6

Banco de Dados Relacionais:

Os Bancos de Dados Relacionais possuem vantagens significativas com relação

a outros tipos de armazenamento:

Acesso mais rápido aos dados

Fácil consulta

Mecanismos pré-definidos para acesso concorrente

Acessos aleatórios aos dados

Sistemas de privilégio

TABELAS: São agrupamentos de dados de objetos específicos.

COLUNAS: Tem um nome único, dados diferentes e tipos de dados associados

a cada uma.

LINHAS: São registros que são inseridos na tabelas.

VALORES: São os valores de um registro para um coluna específica.

CHAVES: São os identificadores de um registro. Podemos ter uma chave primária (identificador único) e uma chave estrangeira (identifica o relacionamento entre tabelas).

RELACIONAMENTOS: São as relações existentes entre as tabelas de um banco e são determinados pela chave estrangeira. Podem ser:

1 para 1: Um registro numa tabela possui um único registro associado a ela numa outra tabela e vice-versa.

1 para N: Um registro numa tabela possui um único registro associado a ela numa outra tabela, porém o registro da outra tabela pode conter vários outros associados a ele.

N para N: Um registro numa tabela possui vários registros associados a ela numa outra tabela e vice-versa.

Dicas para a construção de Banco de Dados:

Pense nos objetos do mundo real que você está modelando.

Evitar armazenar dados redundantes.

Cada coluna deve armazenar apenas um valor

Escolha sempre chaves únicas.

Pense nas perguntas que deseja fazer ao BD.

Evite BD com muitos atributos vazios

Criando Banco de dados na Web:

Neste capítulo iremos utilizar como exemplo uma aplicação on-line de uma livraria. Eis o esquema para a aplicação:

Customers(CustomerID, Name, Address, City) Orders(OrderID, CustomerID, Amount, Date) Books(ISBN, Author, Title, Price) Order_items(OrderID, ISBN, Quantity)

Book_Reviews(ISBN, Reviews)

Criando o Banco de Dados

Para criar um banco de dados, faz-se necessário apenas a aplicação de um comando simples no prompt do MySQL. O comando é o CREATE DATABASE passando como parâmetroo nome desejado para o banco. No caso do nosso exemplo, o banco a ser criado é o books.

CREATE DATABASE books;

Usuários e privilégios no MySQL

Um sistema geralmente possui mais de um tipo de usuário no que diz respeito ao acesso

ao banco. Cada tipo possuíra um conjunto diferente de permissões. O usuário root é o

utilizado nas tarefas administrativas do banco, por possuir permissão geral no banco.

O princípio do menor privilégio pode ser aplicado para melhorar a segurança de

qualquer aplicação. Nele, um usuário (ou processo) deve ter o nível mais baixo de privilégio exigido a fim de realizar a tarefa atribuída a ele. Para trabalhar com o controle de permissões de usuários, existem 2 comandos no

MySQL que tratam disso. Os comandos GRANT e REVOKE são utilizados para

fornecer e retirar direitos do usuário em quatro níveis de privilégio:

Global

Banco de Dados

Tabela

Coluna

A forma geral do comando GRANT é:

GRANT privilegios [Colunas] ON item

TO nome_do_usuario [IDENTIFIED BY 'senha']

[WITH GRANT OPTION]

As cláusulas entre cochetes são opcionais.

O

privilégio deve ser uma lista de privilégios separados por vírgulas.

O

marcador colunas serve ara especificar privilégios específicos para colunas.

O

marcador item é o banco de dados ou tabela a que os novos privilégios serão

aplicados. Você pode conceder privilégios em todos os bancos especificando *.* como

o

item. Isso é chamado de concessão de privilégios globais.

O

nome_do_usuario deve ser o nome com o qual você deseja que o usuário efetue um

logon no MySQL. A senha deve ser a senha com a qual você deseja que o usuário efetue

o login.

A expressão WITH GRANT OPTION, se especificada, premite que o usuário

especificado conceda os próprios privilégios. Os privilégios são armazenados em quatro tabelas de sistema, no banco de dados chamado mysql. Essas quatro tabelas são mysql.user, mysql.db, mysql.tables_priv e mysql.collumns_priv e se relacionam diretamente com os quatro níveis de privilégio mencionados antes.

TIPOS DE PRIVILÉGIOS:

Existem 3 tipos de privilégios básicos no MySQL: privilégios adequados para conceder a usuários regulares, privilégios adequados para administradores e dois privilégios especiais. Os privilégios para usuários regulares se relacionam diretamente aos tipos de comandos específicos de SQL e se um usuário tem ou não permissão de executá-los.

Privilégio

Aplica-se a

Descrição

SELECT

Tabelas, colunas

Permite que os usuários selecionem linhas de tabelas.

INSERT

Tabelas, colunas

Permite que os usuários insiram novas linhas em tabelas.

UPDATE

Tabelas, colunas

Permite que os usuários modifiquem valores em linhas existentes de tabela.

DELETE

Tabelas

Permite que os usuários excluam linhas existentes de tabelas

INDEX

Tabelas

Permite que os usuários criem e excluam índices em tabelas

ALTER

Tabelas

Permite que os usuários alterem a estrutura de tabelas existentes.

CREATE

Banco de dados, tabelas

Permite que os usuários criem novos bancos de dados ou tabelas.

DROP

Banco de dados, tabelas

Permite que os usuários excluam bancos de dados ou tabelas

Table 1: Privilégios para usuários

O COMANDO REVOKE:

Este comando é utilizado para revogar os privilégios de um usuário:

REVOKE privilegios[(colunas)] ON item

FROM nome_usuario

Neste momento o banco possui um usuário root sem senha.

Utilizando o Banco de Dados:

A primeira ação necessária ao efetuar logon é especificar qual o banco de dados você quer utilizar:

USE nomedodb;

Criando tabelas de Banco de Dados:

O próximo passo na configuração do banco de dados é realmente criar as tabelas utilizando o comando CREATE TABLE.

CREATE TABLE nomedatabela(colunas);

Para aplicação da livraria temos o seguinte script de criação das tabelas:

CREATE TABLE cutomers

( customerid int unsigned not null auto_increment primary key,

name char(30) not null,

address char(40) not null,

city char(20) not null

);

CREATE TABLE orders

( orderid int unsigned not null auto_increment primary key,

customerid int unsigned not null,

amount float(6,2),

date date not null

);

CREATE TABLE books

( isbn char(13) not null primary key,

author char(30),

title char(60),

price float(4,2)

);

CREATE TABLE order_items

( orderid int unsigned not null,

isbn char(13) not null,

quantity tinyint unsigned,

primary key(orderid,isbn)

);

CREATE TABLE book_reviews

( isbn char(13) not null primary key,

review text

);

SIGNIFICADOS DAS PALAVRAS:

NOT NULL: Significa que todas as linhas na tabela devem ter um valor nesse atributo. AUTO_INCREMENT: Isso significa que se deixarmos aquele camppo em branco ao inserir linhas na tabela, o MySQL automaticamente gerará um valor identificador único. O valor será maior que o valor máximo já existente na coluna. PRIMARY_KEY: Especifica que essa coluna é a chave primária para tabela. As entradas nessa coluna precisam ser únicas. Só pode ser usado quando a tabela possui uma única chave primária. A construção do PRIMARY JEY na tabela ORDER_ITEMS é a alternativa quando se tem mais duma chave primária. UNSIGNED: Significa que um tipo inteiro só pode ter um zero ou valor positivo.

Inserindo dados no Banco de Dados:

A instrução INSERT é utilizada para inserir dados em tabelas do banco. A forma

normal é:

INSERT [INTO] tabela [(coluna1, coluna2, coluna3,

VALUES (valor1, valor2, valor3,

);

)]

Podemos usar como exemplo inserção de um registro na tabela CUSTOMERS:

INSERT INTO customers VALUES (NULL, "Julie Smith", "25 Oak Street", "Airport West");

Neste exemplo não especificamos quais colunas iríamos inserir registros. Isto significa que todas as colunas devem apresentar valores associados. Por isso, tivemos que inserir

o valor NULL para a coluna CUSTOMERID.

Se quisermos especificar quais colunas devem ser inseridas e em qual ordem seguimos

o exemplo abaixo:

INSERT INTO customers (name, city) VALUES ("Melissa Jones", "Nar Nar Goon North");

Vamos agora inserir uma porção de registros no nosso banco:

INSERT INTO customers VALUES (NULL, "Julie Smith", "25 Oak Street", "Airport West"),

(NULL, "Alan Wong", "1/47 Haines Avenue", "Box Hill"),

(NULL, "Michelle Arthur", "357 North Road", "Yarraville");

INSERT INTO orders VALUES

(NULL, 3, 69.98, "2000-04-02"),

(NULL, 1, 49.99, "2000-04-15"),

(NULL, 2, 74.98, "2000-04-19"),

(NULL, 3, 24.99, "2000-05-01");

INSERT INTO books VALUES

("0-672-31697-8", "Michael Morgan", "Java", 34.99),

("0-672-31745-1", "Thomas Down", "Debian", 24.99),

("0-672-31509-2", "Pruit, et al.", "GIMP", 24.99),

("0-672-31769-9", "Thomas Schenk", "OpenLinux", 49.99);

INSERT INTO order_items VALUES

(1, "0-672-31697-8", 2),

(2, "0-672-31769-9", 1),

(3, "0-672-31769-9", 1),

(3, "0-672-31509-2", 1),

(4, "0-672-31745-1", 3);

INSERT INTO book_reviews VALUES

("0-672-31697-8", "O livro é um bom suporte para a tecnologia Java");

Recuperando dados no Banco de Dados:

A instrução SELECT é utilizada para recuperar dados de um banco selecionando linhas

que correspondem ao critério especificado de uma tabela. Há uma grande quantidade de

opções e maneiras diferentes de se fazer uma consulta ao BD.

A forma básica do SELECT é:

SELECT items

FROM tabelas

[

GROUP BY tipo_de_grupo ]

[

HAVING definição_de_where ]

[

ORDER BY tipo_de_pedido ]

[

LIMIT critérios_de_limite ]

Cada consulta será analizada separadamente, mas vale a pena realizar duas consultas simples para verificar o funcionamento do comando. A primeira serão especificadas as colunas que se deseja selecionar e na segunda será utilizado o * que representa que todas as colunas da tabela serão selecionadas.

SELECT name, city FROM customers;

SELECT *

FROM order_items;

Para acessar um subconjunto de linhas em uma tabela, precisamos especificar alguns critérios de seleção usando a cláusula WHERE.

SELECT * FROM orders WHERE customerid = 3;

Neste exemplo, o comano irá selecionar todas as colunas da tabela pedidos onde somente as linhas com um ID de 3.

Existe uma série de operadores de comparação para cláusulas WHERE, confome o especificado na tabela abaixo.

Operador

Nome

Exemplo

 

Descrição

>

Maior que

Amount > 60.00

Testa se o valor é maior que outro

<

Menor que

Amount < 60.00

Testa se o valor é menor que outro

>=

Maior ou igual

Amount>=60.00

Testa se o valor é maior ou igual ao outro.

<-

Menor

ou

Amount <= 60.00

Testa se o valor é menor ou igual ao outro.

igual

!= ou <>

Diferente

Quantify != 0

 

Testa se um valor é diferente do outro.

IS

NOT

 

Address

is

not

Testa se o canpo contém um valor.

NULL

null

Operador

Nome

Exemplo

 

Descrição

 

IS NULL

 

Address is null

Testa

se

o

campo não

contém um

valor.

BETWEEN

 

Amount between 0 and 60.00

Testa se um valor é maior ou igual a um e menor que outro.

IN

 

City

Paulo, “Aracaju”)

(“São

in

um conjunto particular.

Testa

se

valor

está

em

um

NOT IN

 

City not in (“São Paulo, “Aracaju”)

Testa se um valor não conjunto particular.

está em um

LIKE

Correspondên cia de padrão

Name like (“Fred %”)

Verifica se um valor corresponde a um padrão utilizando correspondência de padrão.

RECUPERANDO DADOS DE DIVERSAS TABELAS:

Frequentemente faz-se necessário realizar consultas em várias tabelas ao mesmo tempo. Para tanto, você deve realizar uma operação junção ou JOIN. Isso significa simplesmente unir duas ou mais tabelas para seguir os relacionamentos entre os dados. Existem vários tipos de junções. O primeiro tipo é o INNER JOIN que pode ou não possuir uma construção própria para esta junção. A operação de INNER JOIN significa: “Aceite as tabelas listadas e faça uma tabela grande. A tabela grande deve ter uma linha para cada possível combinação de linhas de cada uma das tabelas listadas, quer isso faça sentido ou não.” No exemplo:

SELECT orders.orderid, orders.amount, orders.date FROM customers, orders

WHERE customers.cname = 'Julie Smith'

AND customers.cutomerid = orders.customerid;

Neste caso, obtemos uma tabela, que tem cada linha da tabela Customers correspondida a cada linha da tabela Orders, independentemente de um cliente particular ter feito um pedido particular.

RECUPERANDO DADOS EM UMA ORDEM PARTICULAR Se quiser exibir linhas recuperadas por uma consulta em uma ordem particular, você pode utilizar a claúsula ORDER BY da instrução SELECT.

SELECT name, address FROM customers

ORDER BY name;

Após o nome da ou das colunas que se deja fazer a ordenação, pode ser indicado se essa ordenção é ascendente (ASC) ou descendente (DESC).

AGRUPANDO E AGREGANDO DADOS:

O MySQL possui um conjunto de funções agregadas que aumenta as possibilidades de

consultas a serem realizadas. Estas funções podem ser aplicadas a uma tabela como a um total ou grupos de dados dentro de uma tabela.

Nome

 

Descrição

AVG(coluna)

Média de valores na coluna especificada.

COUNT(itens)

Se você especificar uma coluna, essa função fornecerá o número de valores não-NULL nessa coluna. Se adicionar a palavra DISTINCT na frente do nome de coluna, você obterá uma contagem de valores distintos somente nessa coluna.

MIN(coluna)

O

valor mínimo na coluna especificada.

MAX(coluna)

O

valor máximo na coluna especificada.

STD(coluna)

Desvio padrão dos valores na coluna especificada.

SUM(coluna)

Soma de valores na coluna especificada.

SELECT avg(amount) FROM orders;

A fim de obter informações mais detalhadas, podemos utilizar a cláusula GROUP BY.

Isso permite visualizar o total médio de pedidos por grupo – por exemplo, por número

de cliente.

SELECT customeridm,avg(amount) FROM orders

GROUP BY customerid;

SELECT customeridm,avg(amount)

FROM orders

GROUP BY customerid

HAVING avg(amount) > 50;

Atualizando registros no Banco de Dados:

A forma normal para alteração de dados usando a instrução UPDATE é:

UPDATE nomedatabela SET coluna1=expressao1, coluna2=expressao2,

[

WHERE condicao]

[

LIMIT numero ]

A idéia básica é atualizar a tabela chamada nomedatabela, configurando cada uma das

colunas chamadas como expressão apropriada. Você pode limitar UPDATE para linhas particulares com uma cláusula WHERE e limitar o número total de linhas para afetar

com uma cláusula LIMIT. EXEMPLOS: 1) Se quisermos aumentar 10% do preço de todos livros:

UPDATE books SET price = price*1.1;

2) Se quisermos alterar uma única linha, por exemplo, atualizar um endereço do cliente:

UPDATE customers SET address = '250 Olsens Road'

WHERE cutomerid = 4;

Excluindo registros do Banco de Dados:

Excluir linhas do banco de dados é muito simples. É só aplicar a instrução DELETE

abaixo:

DELETE FROM tabela

[

WHERE condicao ]

[

LIMIT numero ]

SAIBA MAIS sobre SQL e MySQL: www.ansi.org e www.mysql.com

Prática 1(exercícios)

Crie um BD com nome Clinica;

Crie as seguintes tabelas neste BD, considerando que os atributos sublinhados são chaves primárias e os em itálico são chaves estrangeiras:

Ambulatorios: nroa (int), andar (numeric(3)) (não nulo), capacidade (smallint)

Medicos: codm (int), nome (varchar(40)) (não nulo), idade (smallint) (não nulo), especialidade (char(20)), CPF (numeric(11)) (único), cidade (varchar(30)), nroa (int)

Pacientes: codp (int), nome (varchar(40)) (não nulo), idade (smallint) (não nulo), cidade (char(30)), CPF (numeric(11)) (único), doenca (varchar(40)) (não nulo)

Funcionarios: codf (int), nome (varchar(40)) (não nulo), idade (smallint), CPF (numeric(11)) (único), cidade (varchar(30)), salario (numeric(10)), cargo (varchar(20)) 5. Consultas: codm (int), codp (int), data (date), hora (time);

Crie a coluna nroa (int) na tabela Funcionários;

Crie os seguintes índices:

Médicos: CPF (único), nroa;

Pacientes: doença;

Remover o índice doença em Pacientes;

Remover as colunas cargo e nroa da tabela de Funcionários;

Povoar as tabelas conforme o próximo Slide.

de Funcionários; • Povoar as tabelas conforme o próximo Slide. • Realizar as seguintes atualizações no

Realizar as seguintes atualizações no BD:

O paciente Paulo mudou-se para Ilhota;

A consulta do médico 1 com o paciente 4 passou para às 12:00 horas do dia 4 de Julho de 2006;

A paciente Ana fez aniversário e sua doença agora é câncer;

A consulta do médico Pedro com o paciente Carlos passou para uma hora e meia depois;

O funcionário Carlos deixou a clínica;

As consultas marcadas após as 19 horas foram canceladas;

Os pacientes com câncer ou idade inferior a 10 anos deixaram a clínica;

Os médicos que residem em Baguaçu e Palhoça deixaram a clínica.