Você está na página 1de 49

2017

SQL
Structured Query Language
Professora: Kele Belloze
E-mail: kele.belloze@cefet-rj.br

Centro Federal de Educação Tecnológica Celso Suckow da Fonseca


CEFET/RJ
Introdução
• SQL = Structured Query Language (Linguagem Estruturada
para Consultas).
• Criada na década de 1970 pela IBM, sobre o nome de SEQUEL
(Structured English Query Language).
• Passou por várias padronizações (o que contribui para sua
larga aceitação).
• Pode-se usar a SQL diretamente ou dentro de alguma
linguagem de programação (SQL embutida).
Introdução
• Consiste de:
– Uma Linguagem de Definição de Dados (DDL –
Data Definition Language) para a declaração de
esquemas de bancos de dados.
– Uma Linguagem de Manipulação de Dados (DML
– Data Manipulation Language) para modificar e
fazer consultas a instâncias de bancos de dados.
PROJETO DE BANCO DE DADOS
PARA EXEMPLOS DE DDL
Modelo conceitual

5
Modelo relacional
• Cliente(idCliente, nomeCliente)
• TelCliente(idCliente, telefone)
• Pedido(idPedido, dtPedido, motivoCancel, situacao, idCliente,
idMesa)
• ItemConsumo(idItem, nomeItem, precoUnit, descricao,
categoria)
• PedidoItem(idPedido, idItem, quantidade)
• Mesa(idMesa)
• Nota(numeroNota, dataPagamento, idPedido)

6
DDL – LINGUAGEM DE DEFINIÇÃO
DE DADOS
Comandos de Modificação do Esquema (DDL)
• Criar banco de dados (CREATE DATABASE)
– Permite criar um novo banco de dados. O banco de dados
é criado e depois são inseridas as relações (tabelas) que o
compõe.

CREATE DATABASE nome_banco_de_dados;

• Exemplo:

CREATE DATABASE Banco_Restaurante;


Comandos de Modificação do Esquema (DDL)
• Criar relações (CREATE TABLE):
– Permite criar novas relações. As relações são criadas vazias
e depois os dados são inseridos através dos comandos de
manipulação de dados (Insert).

CREATE TABLE nome_tabela


(
nome_atributo1 tipo_de_dado [NULL/NOT NULL],
nome_atributo2 tipo_de_dado [NULL/NOT NULL],

nome_atributon tipo_de_dado [NULL/NOT NULL]
);
Comandos de Modificação do Esquema (DDL)
• Criar relações (CREATE TABLE):
– O nome da tabela é a forma como ela é identificada nos demais comandos da
SQL.
– O nome do atributo é a forma de se identificar o atributo nos demais
comandos da SQL.
– O tipo de dado (em geral vem indicado com o número de caracteres usados
naquele caso) é definido como sendo ao menos:
• INTEGER valores numéricos inteiros (n é o número de dígitos)
• REAL valores numéricos com determinado nº de casas decimais
• CHAR(n) cadeia de caracteres de tamanho fixo (n)
• VARCHAR(n) cadeia de caracteres de tamanho variável (máximo n)
• DATE dez posições. Componentes Dia, Mês e Ano na forma DD-MM-
YYYY
– Todo atributo pode ser indicado como nulo ou não nulo:
• NULL o atributo pode conter o valor nulo
• NOT NULL o atributo não pode conter o valor nulo
Comandos de Modificação do Esquema (DDL)
• Criar relações (CREATE TABLE):
– Exemplo: Considere a criação da relação de
Itens_Consumo da aplicação Restaurante:

CREATE TABLE Itens_Consumo


(
id_item integer NOT NULL,
nome_item varchar(30) NOT NULL,
preco_unit real NOT NULL,
categoria varchar(6) NOT NULL,
descricao varchar(200) NULL
);
Comandos de Modificação do Esquema (DDL)
• Apagar Relações (DROP TABLE)
– Apagar relações significa eliminar da base todos os seus
dados. Portanto, se a relação contiver dados, estes serão
perdidos e a relação deixará de existir até no esquema.
DROP TABLE nome_tabela;

– Exemplo:
DROP TABLE Itens_Consumo;

– OBS.: DROP é mais drástico que DELETE (DML). DELETE


mantém a relação apesar de remover todas as suas tuplas.
– Exemplo:
DELETE FROM Itens_Consumo;
Comandos de Modificação do Esquema (DDL)
• Modificar relações (ALTER TABLE)
– Permite inserir novos atributos no esquema de uma relação já
existente.

ALTER TABLE nome_tabela ADD


(
nome_atributo1 tipo_de_dado [NULL/NOT NULL],

nome_atributon tipo_de_dado [NULL/NOT NULL]
);

– Os novos atributos inseridos na tabela sempre devem ser indicados


como podendo ficar sem um valor (admitem-se valores nulos).
• Isso porque relações já inicializadas terão inicialmente todas as tuplas já
existentes com esses novos atributos nulos.
Comandos de Modificação do Esquema (DDL)
• Modificar relações (ALTER TABLE)
– Exemplo: Considere que na relação Itens_Consumo: Itens_Consumo
(id_item, nome_item, preco_unit, categoria, descricao)

queremos inserir o atributo Info_Nutri (Informação Nutricional):


Itens_Consumo (id_item, nome_item, preco_unit, categoria, descrição,
info_nutri)

ALTER TABLE Itens_Consumo ADD


(
info_nutri varchar(200) NULL
);
Comandos de Modificação do Esquema (DDL)
• Inserir restrições de chave
CHAVE PRIMÁRIA
• A criação da chave primária pode ser feita no momento em que é
criado o esquema da relação.

CREATE TABLE nome_tabela


(
nome_atributo1 tipo_de_dado PRIMARY KEY NOT NULL,
nome_atributo2 tipo_de_dado [NULL/NOT NULL],
...
nome_atributon tipo_de_dado [NULL/NOT NULL],
);
Comandos de Modificação do Esquema (DDL)
• Inserir restrições de chave
– Exemplo:

CREATE TABLE Itens_Consumo


(
id_item integer PRIMARY KEY NOT NULL,
nome_item varchar(30) NOT NULL,
preco_unit real NOT NULL,
categoria varchar(6) NOT NULL,
descricao varchar(200) NULL
);
Comandos de Modificação do Esquema (DDL)
• Inserir restrições de chave
CHAVE PRIMÁRIA
• Uma outra forma é definir a chave primária após a declaração dos
atributos.

CREATE TABLE nome_tabela


(
nome_atributo1 tipo_de_dado [NULL/NOT NULL],
nome_atributo2 tipo_de_dado [NULL/NOT NULL],

nome_atributon tipo_de_dado [NULL/NOT NULL],
PRIMARY KEY (nome_atributo1, nome_atributo2)
);
Comandos de Modificação do Esquema (DDL)
• Inserir restrições de chave
– Exemplo:

CREATE TABLE Itens_Consumo


(
id_item integer NOT NULL,
nome_item varchar(30) NOT NULL,
preco_unit real NOT NULL,
categoria varchar(6) NOT NULL,
descricao varchar(200) NULL,
PRIMARY KEY (id_item)
);
Comandos de Modificação do Esquema (DDL)
• Inserir restrições de chave
CHAVE ESTRANGEIRA
• Semelhante à chave primária, a chave estrangeira também pode
ser inserida no momento de criação da tabela.

CREATE TABLE nome_tabela


(
nome_atributo1 tipo_de_dado [NULL/NOT NULL],
nome_atributo2 tipo_de_dado [NULL/NOT NULL],

nome_atributon tipo_de_dado [NULL/NOT NULL],
PRIMARY KEY (nome_atributo1),
FOREIGN KEY (nome atributo)
REFERENCES nome_outra_tabela (nome_atributo_outra_tabela)
);
Comandos de Modificação do Esquema (DDL)
• Inserir restrições de chave
– Exemplo:

CREATE TABLE Pedido


(
id_pedido integer NOT NULL,
data_pedido date NOT NULL,
motivo_cancel varchar(50) NULL,
id_cliente integer NOT NULL,
nr_mesa integer NOT NULL,
PRIMARY KEY (id_pedido),
FOREIGN KEY (id_cliente) REFERENCES Cliente (id_cliente),
FOREIGN KEY (nr_mesa) REFERENCES Mesa (nr_mesa)
);
Comandos de Modificação do Esquema (DDL)
• Inserir restrições de chave
CHAVE ESTRANGEIRA
• Ou também, fazer o uso do comando ALTER TABLE caso a tabela a
qual será referenciada ainda não foi criada.

ALTER TABLE nome_tabela


ADD FOREIGN KEY(nome_atributo)
REFERENCES nome_outra_tabela (nome_atributo_outra_tabela);
Comandos de Modificação do Esquema (DDL)
• Inserir restrições de chave
– Exemplo:

CREATE TABLE Pedido


(
id_pedido integer NOT NULL,
data_pedido date NOT NULL,
motivo_cancel varchar(50) NULL,
id_cliente integer NOT NULL,
nr_mesa integer NOT NULL,
PRIMARY KEY (id_pedido),
);

ALTER TABLE Pedido


ADD FOREIGN KEY(id_cliente) REFERENCES Cliente (id_cliente);

ALTER TABLE Pedido


ADD FOREIGN KEY(nr_mesa) REFERENCES Mesa (nr_mesa);
DML – LINGUAGEM DE
MANIPULAÇÃO DE DADOS
Comandos de Manipulação de Dados (DML)
• Inserir dados (INSERT)
– O comando INSERT permite inserir dados na tabela já criada.

INSERT INTO nome_tabela (nome_atributo1,..,


nome_atributon) VALUES (valor1, ..., valorn);

– Exemplo: Considere a inserção de duas tuplas na relação


Itens_Consumo (id_item, nome_item, preco_unit, categoria,
descricao).

INSERT INTO Itens_Consumo VALUES(1, ‘Coca-cola’, 2.00, ‘Bebida’, null);


INSERT INTO Itens_Consumo VALUES(2, ‘Arroz’, 3.00, ‘Comida’, null);
Comandos de Manipulação de Dados (DML)
• Inserir dados (INSERT)
– OBS.: No caso do exemplo, os valores são especificados na ordem em
que os atributos correspondentes estão listados no esquema
relacional. Quando não se lembra da ordem dos atributos, estes
devem ser especificados como parte do comando INSERT.

– Exemplo:

INSERT INTO Itens_Consumo (id_item, nome_item, preco_unit, categoria,


descricao) VALUES (1, ‘Coca-cola’, 2.00, ‘Bebida’, null);
Comandos de Manipulação de Dados (DML)
• Alterar dados (UPDATE)
– O comando UPDATE altera ou atualiza os dados já inseridos numa
tabela.

UPDATE nome_tabela SET nome_atributo = novo_valor;

– Exemplo: Considere que todos os itens de consumo do restaurante


tiveram um aumento de 20%.

UPDATE Itens_Consumo SET preço_unit = preço_unit * 1.2;

• Para atualizar mais de um valor, basta separar os atributos


por vírgula.
Comandos de Manipulação de Dados (DML)
• Excluir dados (DELETE)
– O comando DELETE exclui os dados selecionados de uma tabela.

DELETE FROM nome_tabela;

– Exemplo:

DELETE FROM Itens_Consumo;


Consultar Dados (SELECT)
• Consultas básicas
– A estrutura básica de uma expressão da SQL consiste em três
cláusulas:
• select: usado para listar os atributos desejáveis no resultado de um
consulta;
• from: lista as relações a serem examinadas na avaliação da consulta;
• where: envolve atributos das relações que aparecem na cláusula from,
onde algumas condições são determinadas.
– Uma consulta em SQL tem a forma:

SELECT nome_atributo1,..., atributon


FROM nome_tabela
[WHERE condição]
Consultar Dados
• Consultas básicas
– Exemplo:
1) Dê os nomes de todos os itens na relação Itens_Consumo:
SELECT nome_item
FROM Itens_Consumo

Caso queira remover duplicações, utiliza-se o comando distinct.


SELECT DISTINCT nome_item
FROM Itens_Consumo
Consultar Dados
• Consultas básicas
– Exemplo:
2) Selecionar todos os alunos (da relação abaixo) cujos números sejam menores que
3000 (inclusive):

SELECT Nome
FROM Alunos
WHERE Numero <= 3000

– Operadores que podem ser utilizados na cláusula WHERE: =, <>, <, >,
<=, >=, or, and, not.
Consultar Dados
• A lista completa de atributos é representada pelo
caracter *
SELECT *
FROM Alunos
WHERE Numero <= 3000
Consultar Dados
• Uso de múltiplas tabelas
– Exemplo: Selecionar os códigos de disciplinas que possuem alunos matriculados.

SELECT Cod
FROM Alunos, Disciplinas
WHERE Alunos.Numero = Disciplinas.Num
Consultar Dados
• Renomeação de múltiplas tabelas
– O operador ‘.’ (ponto) pode ser utilizado para distinguir atributos de
tabelas diferentes.
SELECT Cod
FROM Alunos A, Disciplinas D
WHERE A.Numero = D.Num

– Quando não houver ambiguidade, a identificação de tabelas é


desnecessária.

SELECT Cod
FROM Alunos, Disciplinas
WHERE Numero = Num
Consultar Dados
• Tuplas duplicadas
– Em geral, tabelas em SQL são coleções (ou seja, podem permitir
duplicações).
– A eliminação de linhas duplicadas de uma tabela pode ser feita pela
utilização da palavra chave distinct após o comando select.

SELECT DISTINCT nome_atributo1,..., nome_atributon


FROM nome_tabela
[WHERE condição]
Consultar Dados
• Operações de conjuntos
SELECT ...<union | intersect | except> [all] SELECT

– Exemplo:

SELECT Nome as NomeSobrenome


FROM Alunos
union
SELECT Sobrenome as NomeSobrenome
FROM Alunos

A palavra ‘all’ indica que se deseja manter linhas duplicadas. Se


não for utilizada, as linhas duplicadas serão eliminadas.
Consultar Dados
• Ordenação
– Pode-se ordenar as linhas de uma tabela com base nos valores dos
seus atributos:

...
order by nome_atributo [asc | desc], ...

– Se o tipo de ordenação (asc, desc) não for especificado, a ordenação


será crescente.
– Exemplo: Selecionar todos os alunos ordenados de forma crescente

SELECT Nome
FROM Alunos
order by Nome
Consultar Dados
• Comparação de cadeias de caracteres
– Igual (=), Diferente (!= ou <>)
– ||: operação de concatenação de duas cadeias de caracteres
– like: operador para a verificação se a cadeia de caracteres obedece a certo
padrão
• Dois símbolos utilizados na construção de padrões (de cadeias de caracteres):
%: representa uma cadeia de caracteres quaisquer
_: representa um caracter

– Exemplo:
(nome like ‘%a_’) é verdadeiro para todos os nomes que possuem o caracter ‘a’ como
segunda letra contada do final para o início.

SELECT Nome
FROM Alunos
WHERE Nome like ‘%a_’
Consultar Dados
• Valores nulos
– Pode-se verificar se o valor de um atributo é nulo (‘is null’) ou não
(‘is not null’):
– Exemplo:

...
WHERE (X is null) and (Y is not null)
...
Consultar Dados
• Funções de agregação
– count (*), count (atributos): conta o número de tuplas (linhas)
– Exemplo:

SELECT count (*)


FROM Alunos as A1, Alunos as A2
WHERE A1.Sobrenome = A2.Sobrenome
and A1.Nome <> A2.Nome
Consultar Dados
• Funções de agregação
– Outras funções incluem:
• sum: total
• max: máximo
• min: mínimo
• avg: média

– Exemplo:
SELECT min(Nota),max(Nota),avg(Nota)
FROM Alunos
Consultar Dados
• Cláusulas de agrupamento
– As linhas de uma tabela podem ser particionadas em grupos de
linhas, onde cada grupo tem todas as suas linhas preenchidas com
um mesmo valor para cada um dos atributos especificados na
cláusula ‘group by’.
– Exemplo:

SELECT Sexo, sum (Numero)


FROM Alunos
group by Sexo
Consultar Dados
• Cláusulas de agrupamento
– A cláusula ‘having’ pode ser acrescentada para excluir os subgrupos
que não satisfazem a certa condição:
– Exemplo:

SELECT Sexo, sum (Numero)


FROM Alunos
group by Sexo
having sum (Numero) < 3000
Consultar Dados
• Consultas aninhadas
– Uma consulta com selects embutidos ou aninhados é chamada de
consulta aninhada.
– Este tipo de consulta pode ser especificada dentro da cláusula where
de uma outra consulta, chamada de consulta externa.

• in, not in: verifica se o argumento se encontra ou não na próxima


consulta.
• exists, not exists: verifica se o seu argumento representa uma tabela
vazia (sem linhas) ou não.
Consultar Dados
• Consultas aninhadas

SELECT Nome
FROM Alunos
WHERE (Nome, Numero) not in
(SELECT Nome, Numero
FROM Alunos
WHERE Numero <> 1235)
Consultar Dados
• Precedência nas avaliações de SELECTS
– Selects aninhados são avaliados antes dos selects externos, a menos
que eles dependam de atributos externos.
– Caso um select aninhado dependa de um atributo externo, ele deve
ser reavaliado para cada instância do atributo externo (exemplo a
seguir):
Consultar Dados
• Precedência nas avaliações de SELECTS
– Exemplo:

SELECT Nome
FROM Alunos as A1
WHERE exists (SELECT *
FROM Alunos as A2
WHERE A1.Numero <> A2.Numero
and A1.Sexo = A2.Sexo)
Exercícios
• Considere o seguinte esquema relacional:
– Fornecedores(fid: integer, fnome: string, end: string)
– Pecas(pid: integer, pnome: string, cor:string)
– Catalogo(fid: integer, pid: integer, preco: real)
• No esquema acima, as chaves estão sublinhadas. A
tabela Catalogo lista o preço praticado pelos
fornecedores para cada peça fornecida.
1. Obtenha o nome dos fornecedores que fornecem alguma
peça vermelha.
2. Obtenha o nome dos fornecedores que fornecem alguma
peça que custe 100 ou 150.
3. Obtenha o fid dos fornecedores que fornecem alguma
peça vermelha ou que custe 150.
Exercícios

4. Obtenha o fid dos fornecedores que fornecem alguma


peça vermelha e alguma peça verde.
5. Obtenha o nome dos fornecedores que fornecem alguma
peça vermelha que tenha preço abaixo de 100.
6. Obtenha o nome das peças que possuem algum
fornecedor.
7. Obtenha o nome dos fornecedores que fornecem todas
as peças.
8. Obtenha o nome das peças que são fornecidas pelo
fornecedor “Sempre Alerta” e não são fornecidas por
nenhum outro fornecedor.
Comandos psql
• \q - sai do psql
• \c [NOME] - conecta a outro banco de dados.
– Por exemplo: \c template0 : conecta ao banco de dados template0;
• \l - lista todos os bancos de dados disponibilizados.
• \d [NOME] - descreve uma tabela, índice, visão ou sequência.
– Por exemplo:
\d tabela : mostra todas as informações sobre as colunas da tabela
'tabela';
• \du - lista todos os usuários cadastrados no servidor;
• \dg - lista todos os grupos cadastrados no servidor;
• \dT - lista todos os tipos de dados.
• \h [NOME] - Mostra a sintaxe do comando SQL.
– Por exemplo: \h SELECT : mostra a sintaxe do comando SELECT;
• \? - lista todos os comandos disponíveis
49