Este documento discute SQL e o uso de bancos de dados relacionais. Ele fornece uma introdução aos principais conceitos de SQL como DDL, DML, consultas, funções agregadas e operadores relacionais. Também apresenta exemplos de como criar e manipular tabelas, banco de dados e consultas em SQL.
1. Banco de Dados
SQL
Regis Pires Magalhães
regis@ifpi.edu.br
@regispires
2. SQL
Structured Query Language - SQL
Especificar consultas de forma interativa.
DDL - Data Definition Language
◦ Linguagem de Definição de Dados
DML - Data Manipulation Language
◦ Linguagem de Manipulação de Dados
◦ Usada para especificar consultas e
atualizações
3. DDL permite especificar...
Esquema de relações(tabelas);
Domínio de valores associados a cada
atributo;
Restrições de integridade;
Conjunto de índices a serem mantidos
para cada relação;
Estrutura de armazenamento físico de
cada relação em disco;
Autorização de acesso para cada relação.
4. SGBD – MySQL – Resumo
Estabelecer uma conexão pelo console:
◦ mysql -u usuario -p
-u usuário / -p password (senha)
Criar um banco de dados
◦ create database nome_bd;
Usar um banco de dados como padrão
◦ use nome_bd;
Apagar um banco de dados
◦ drop database nome_bd;
5. SGBD – MySQL – Resumo
Obtendo informações sobre o BD...
◦ Mostrar todos os bancos de dados
show databases;
◦ Mostrar todas as tabelas de um BD
show tables;
◦ Mostrar o comando de criação de um BD
show create database nome_bd;
◦ Mostrar o comando de criação de uma tabela
show create table nome_tabela;
6. MySQL Monitor – Status - s
s
mysql Ver 14.14 Distrib 5.1.61, for debian-linux-gnu (x86_64) using readline 6.2
Connection id: 93
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.1.61-0ubuntu0.11.10.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 1 day 3 hours 15 min 21 sec
Threads: 4 Questions: 2251 Slow queries: 0 Opens: 297 Flush tables: 1
Open tables: 58 Queries per second avg: 0.22
7. Criação de banco de dados
CREATE DATABASE nome_bd
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
Character set – conjunto de símbolos e codificações.
Collation – conjunto de regras para comparação de
caracteres em um conjunto de caracteres.
Exemplos:
◦ CREATE DATABASE locadora;
◦ CREATE DATABASE locadora CHARSET utf8;
◦ CREATE DATABASE locadora DEFAULT CHARACTER
SET utf8 COLLATE utf8_general_ci;
8. MySQL – charset do console
Alterando o charset do MySQL Monitor
para utf8:
◦ set charset utf8;
9. Exclusão de banco de dados
DROP DATABASE nome_bd;
◦ Exemplo:
DROP DATABASE locadora;
12. Alguns tipos de dados (SQL 92)
char(n)
◦ string de caracteres de tamanho fixo n
varchar(n)
◦ string de caracteres de tamanho variável (máximo n)
Integer (int), smallint, tinyint, bigint
decimal(p,d), numeric (p,d)
◦ numérico com p dígitos
◦ Dos p dígitos, d dígitos representam casas decimais
após a vírgula
Real, float - numérico ponto flutuante
date – data
time – hora
datetime, smalldatetime, timestamp – data e hora
13. Restrições (Constraints)
NOT NULL
◦ O atributo deve ser obrigatoriamente preenchido.
DEFAULT
◦ Atribui um valor padrão ao atributo, caso não seja
especificado um valor.
UNIQUE
◦ Garante que o atributo não terá valores repetidos na
tabela.
CHECK
◦ Verifica se o valor inserido é permitido para o
atributo.
14. Restrições (Constraints)
PRIMARY KEY (PK)
◦ Define a chave primária da relação.
FOREIGN KEY (FK)
◦ Implementa o conceito de chave estrangeira e
garante a integridade referencial.
◦ Deve referenciar um campo que possua chave
primária ou uma restrição UNIQUE.
ON DELETE CASCADE – Se a linha da tabela que tem a PK
for apagada, a linha da tabela que tem a FK também será.
ON UPDATE CASCADE – Se a linha da tabela que tem a PK
for modificada, a linha da tabela que tem a FK também será.
15. Criação de tabelas - InnoDB
Para usar recursos como integridade
referencial e transações no MySQL, é
preciso criar tabelas do tipo InnoDB:
◦ CREATE TABLE pessoas (...)
ENGINE=InnoDB;
16. CREATE DATABASE producao default charset utf8;
use producao;
CREATE TABLE diretor(
id int PRIMARY KEY,
nome varchar(50)
) ENGINE=INNODB;
CREATE TABLE filme(
id int PRIMARY KEY,
titulo varchar(50),
id_diretor int,
FOREIGN KEY (id_diretor) REFERENCES diretor(id)
) ENGINE=INNODB;
17. Remoção de tabelas
DROP TABLE nome-tabela [CASCADE |
RESTRICT]
Remove as tuplas da tabela e sua
definição do catálogo
◦ CASCADE remove as restrições do tipo
foreign key tabelas que referenciam a tabela
removida
18. Exercício
Dado o modelo relacional a seguir, definir o esquema
físico do banco de dados usando SQL.
clientes(id: int, nome: varchar(50), cpf: char(11),
data_cadastro:date, cidade: varchar(50), uf: char(2))
categorias(id: int, nome: varchar(20))
classes (id:int, nome: varchar(20), preco: decimal(10,2))
distribuidores (id: int, nome: varchar(50))
filmes (id: int, titulo: varchar(50), id_distribuidor:
int, ano_lancamento: int(4), id_categoria: int,
id_classe: int)
◦ id_distribuidor referencia distribuidores
◦ id_categoria referencia categorias
◦ id_classe referencia classes
locacoes (id: int, id_cliente: int, id_filme: int,
dt_locacao: date, dt_devolucao_prevista: date,
dt_devolucao:date, valor: decimal(10,2)
◦ id_cliente referencia clientes
◦ id_filme referencia filmes
19. Criando a tabela clientes
CREATE TABLE clientes (
id int AUTO_INCREMENT,
cpf char(11),
nome varchar(50),
data_cadastro date,
cidade varchar(40),
uf char(2) DEFAULT 'PI',
PRIMARY KEY (id),
UNIQUE (cpf)
) ENGINE=InnoDB;
20. Inserindo dados na tabela clientes
insert into clientes values (null, '123',
'Regis', '2012-04-11', 'Parnaíba', 'PI');
insert into clientes
(cpf, nome, data_cadastro, cidade) values
('124', 'João', '2012-04-11', 'Parnaíba');
21. CREATE TABLE clientes (
id int PRIMARY KEY
AUTO_INCREMENT,
cpf char(11) UNIQUE,
nome varchar(50),
data_cadastro date,
cidade varchar(40),
uf char(2) DEFAULT 'PI'
) ENGINE=InnoDB;
22. Alteração de tabelas
ALTER TABLE nome-tabela
[ADD nome-coluna tipo de dados]
[DROP nome-coluna ]
[ADD CONSTRAINT nome-restrição]
[DROP CONSTRAINT nome-restrição]
[DROP PRIMARY KEY]
[ repetir ADD ou DROP em qualquer ordem]
23. Consultas
SELECT [ALL | DISTINCT] {* | expr [[AS] c_alias]
{, expr [[AS] c_alias] … }}
FROM nome-tabela [[AS] qualificador]
{, nome-tabela [[AS] qualificador] …}
WHERE predicado
ALL
◦ Retorna todas as tuplas, inclusive repetidas (default)
DISTINCT
◦ Retorna apenas tuplas não repetidas
*
◦ Retorna todos os atributos da(s) tabela(s)
expr
◦ Representa um atributo ou
◦ Expressão matemática envolvendo atributos das tabelas
salario*1.40
24. Consultas
FROM
◦ Representa o produto cartesiano das tabelas
referenciadas
WHERE
◦ Corresponde ao predicado de seleção da álgebra
relacional
ORDER BY coluna-resultado [ASC | DESC]
{, coluna-resultado [ASC | DESC] …}
25. Consultas
Predicados com operações sobre strings
◦ Identificação de padrão
% - Casa com qualquer substring
_ - Casa com qualquer caracter
◦ Operador
like
◦ Exemplos
nome like ‘inf%’
Retorna strings que iniciam pelo substring inf
nome like ‘%si_’
Retorna strings que contenham ‘si’ como substring e
terminem com um caracter qualquer após ‘si’
Listar todos empregados com sobrenome ‘pires’
Select nome from empregados where nome like ‘%pires%’
26. Consultas
Funções Agregadas
◦ Funções embutidas (built-in) aplicadas sobre uma
coleção de valores (colunas) do banco de dados
◦ sum
Retorna o somatório dos valores de uma coleção
◦ avg
Retorna a média dos valores de uma coleção
◦ max
Retorna o maior valor de uma coleção de valores
◦ min
Retorna o menor valor de uma coleção
◦ count
Retorna o número de elementos de uma coleção
◦ Sintaxe
nome-da-função (ALL | DISTINCT nome-coluna) |
count(*)
Não podem ser utilizados na cláusula WHERE
27. Consultas
Agrupando tuplas no SQL
◦ Aplicar funções agregadas a diferentes grupos
de tuplas
◦ Exemplo
Listar a quantidade de empregados por
departamento
◦ Cláusula
GROUP BY
◦ Todas colunas que aparecem na cláusula select
têm que aparecer na cláusula group by
Exceto os argumentos da funções agregadas
28. Consultas
Selecionando grupos
◦ Cláusula having
Filtro de grupos
Consulta com where e having
◦ predicado da cláusula where é avaliado
primeiramente
Tuplas que satisfazem o predicado são agrupadas
pelo group by
◦ Predicado da cláusula having é avaliado
Grupos que satisfazem o predicado aparecem no
resultado
29. Consultas
Checando valores nulos
◦ Predicado IS NULL
◦ Exemplo
select * from Empregado
where dt-nasc is null
30. Consultas
Consultas com o operador de união
◦ UNION
União de duas relações (consultas)
Sem repetições
◦ UNION ALL
União de duas relações
Com repetições
◦ Exemplo
Considere as seguintes relações
Empregado(matr, nome, ender, dt_nasc, cpf, salário,
lotação)
Dependente(nome_dep, data-nasc, matr_resp)
Liste o nome e data de nascimento de todos os
funcionários e dependentes existentes na empresa
select nome,dt_nasc from Empregado UNION
select nome_dep,data_nasc from Dependente
31. Consultas
Consultas com o operador de interseção
◦ INTERSECT
Interseção entre duas relações (consultas)
Sem repetições
◦ INTERSECT ALL
Interseção entre duas relações
Com repetições
Consultas com o operador de diferença
◦ EXCEPT
Diferença entre duas relações (consultas)
Sem repetições
◦ EXCEPT ALL
Diferença entre duas relações (consultas)
Com repetições
32. Consultas
Consulta SQL aninhada (subconsulta)
◦ Consulta SQL especificada dentro de uma
outra consulta SQL
◦ Exemplo
Listar todos os empregados que têm salário maior
que a média salarial da empresa
select e.nome
select e.nome
from Empregado e
from Empregado e
where salário > ((selectavg(salário) from Empregado)
where salário > select avg(salário) fromEmpregado
Empregado)
Empregado
33. Consultas
Consulta SQL aninhada (cont.)
◦ Predicado IN
Verifica a pertinência de elementos em um
conjunto
Exemplo
select nome
from Empregado
where matr in (1,5,8,9)
34. Exercícios
Considere o seguinte esquema de banco
de dados
departamentos(id, nome, endereco, cidade, uf)
empregados(id, matricula, cpf, nome, dt_nasc, endereco,
salario, id_dept)
dependentes(id, nome, dt_nasc, id_empr)
id_dept em empregados referencia id em departamentos.
id_empr em dependentes referencia id em empregados.
◦ Crie as tabelas Departamento e Empregado
utilizando a DDL do SQL.
Alterara tabela empregados para que matricula e cpf
não possam ser duplicados.
35. Exercícios
Criar consultas SQL para:
◦ Listar os funcionários com salário maior que 3000.
◦ Listar funcionários com salários maior que 1000 e
menor que 2000.
◦ Listar nome dos funcionários com o nome de seu
departamento.
◦ Listar nome dos funcionários com o nome de seu
departamento e uma simulação de seu salário com
um aumento de 15%.
◦ Listar empregados ordenados por salário na ordem
decrescente e por nome na ordem crescente.
36. Exercícios
Encontre o número de empregados lotados no departamento de
Informática.
Encontre o montante da folha de pagamento (soma dos salários)
da empresa.
Encontre o salário médio pago pela empresa.
Listar a quantidade de empregados por departamento.
Listar maiores e menores salários de cada departamento.
Listar nome dos departamentos cuja média salarial seja maior que
7000.
Listar todos dependentes com respectivos responsáveis e nome do
departamento de lotação dos responsáveis.
Listar o nome e data de nascimento de todos os funcionários e
dependentes existentes na empresa.
Listar matrícula dos empregados que não possuem dependentes.
Listar matrícula dos empregados que possuem dependentes.
37. Exercícios
Listar nome e média salarial dos departamentos que
possuem mais de 10 empregados lotados.
Listar nome e quantidade de empregados dos
departamentos cuja média salarial é maior que 5000.
Listar o primeiro e segundo maiores salários da
empresa.
Listar nome dos departamentos com média salarial
maior que a média salarial da empresa.
Listar todos os empregados que possuem salário maior
que a média salarial de seus departamentos.
Listar os empregados lotados nos departamentos
localizados no Piauí.
38. Referências
Elsmari, R., Navathe, Shamkant B. “Sistemas de
Banco de Dados”. 6ª Edição, Pearson Brasil, 2011.
Silberschatz, A., Korth, H., Sudarshan, S. “Sistema
de Banco de Dados”. 5ª Edição, Editora Campus,
2006.
Heuser, Carlos Alberto. “Projeto de Banco de
Dados”. 6ª Edição, Editora Bookman, 2009.
Slides Prof. José Maria (UFC).