Você está na página 1de 121

Introdução ao SQL

Prof. Claudio Azevedo Passos


Modelo Relacional

• O Modelo Relacional prevê, desde sua concepção, a


existência de uma linguagem baseada em caracteres
que suporte a definição do esquema físico (tabelas,
restrições, etc.), e sua manipulação (inserção, consulta,
atualização e remoção)
SQL (Structured Query Language)

E. F. Codd: “A Relational Model of Data for Large


Shared Data Banks”, junho 1970

Definição de um modelo que propõe uma nova


estrutura de armazenamento em banco de dados

Modelo Relacional

file: teorica_8.ppt Banco deDados I - Silvia Soares 3


SQL (Structured Query Language)
IBM: linguagem SEQUEL (Structured English Query
Language)
Ferramenta de acesso ao modelo proposto por CODD
evolução
SQL (linguagem padrão para Banco de Dados Relacional)
1986 : American National Standards Institute (ANSI) e
International Standards Organization (ISO)

Padrão SQL (SQL 86)


IBM: padrão próprio (System Application Architecture
Database Interface – SAA SQL) em 1987
4
SQL (Structured Query Language)

SQL

SELECT GRANT
CREATE Segurança
UPDATE REVOKE
ALTER
DELETE COMMIT
DROP Controle
INSERT ROLLBACK
SAVEPOINT transações
DML DDL
SET TRANSACTION
Com COMMIT CONTROL
“embutido”
5
SQL (Structured Query Language)
Propósito: interface para um banco de dados relacional
(Oracle, DB2, SQL Server, Sybase, ...)

A linguagem SQL tem diversas partes:


 Linguagem de definição de dados: DDL – comandos para a
definição de esquemas de relações, exclusão de relações, criação
de índices e modificação nos esquemas de relações
 Linguagem interativa de manipulação de dados: DML –
linguagem de consulta baseada na álgebra e no cálculo relacional
de tuplas. Engloba comandos para inserção, exclusão e modificação
de tuplas no BD
 Incorporação DML (embedded DML): para aplicação em
linguagens de programação (C, PL/I, COBOL, PHP, VB,...)
6
SQL (Structured Query Language)

 Definição de visões: a SQL DDL possui comandos para definição


de visões
 Autorização: a SQL DDL possui comandos para especificação de
direitos de acesso a relações e visões
 Integridade: a SQL DDL possui comandos para especificação de
regras de integridade que os dados que serão armazenados no BD
devem satisfazer
 Controle de transações: a SQL DCL possui comandos para
especificação de iniciação e finalização de transações. Algumas
implementações permitem explicitar bloqueios de dados para
controle de concorrência.

7
SQL (Comandos da DDL)

Comando Create
Este comando permite a criação de tabelas no banco de dados ou
mesmo de sua criação.

Sintaxe:
CREATE DATABASE < nome_db >;

onde:
nome_db - indica o nome do Banco de Dados a ser criado.
SQL (Comandos da DDL)
• CREATE TABLE é o comando usado para criação da
tabela e deve ser seguida pelo nome que daremos à
tabela. Dentro do comando, devemos definir os nomes dos
campos de acordo com a conveniência do banco de
dados, e determinar o tipo de dado que poderá ser
incluído neste campo.

• PRIMARY KEY define a chave primária da tabela, isto é,


o campo que serve como chave da tabela e que não pode
ser repetido.

• NOT NULL é usado quando desejamos que um campo


seja de preenchimento obrigatório.
SQL (Comandos da DDL)
Comando Create table
Sintaxe:
CREATE TABLE < nome_tabela >
( nome_atributo1 < tipo > [ NOT NULL ],
nome_atributo2 < tipo > [ NOT NULL ],
......
nome_atributoN < tipo > [ NOT NULL ] )
PRIMARY KEY(nome_atributo_x,...) ;

onde:
nome_table - indica o nome da tabela a ser criada.
nome_atributo - indica o nome do campo a ser criado na tabela.
tipo - indica a definição do tipo de atributo ( integer(n), char(n),
real(n,m), date... ).
n- número de dígitos ou de caracteres
m- número de casas decimais
SQL (Comandos da DDL)

Comando Create table


Exemplo

CREATE TABLE clima ( CREATE TABLE cidades (


cidade varchar(80), nome varchar(80),
temp_min int, localizacao point
temp_max int, );
Precipitacao real,
data date
);
Tipos de dados

• O SQL não diferencia letras maiúsculas e minúsculas nas palavras


e nos identificadores, a não ser quando os identificadores estão
entre aspas (") para preservar letras maiúsculas e minúsculas (o
que não foi feito acima).

• O PostgreSQL suporta os tipos SQL usuais int, smallint, real,


double precision, char(N), varchar(N), date, time, timestamp e
interval, assim bem como outros tipos de utilidade geral e um
abrangente conjunto de tipos geométricos.
Tipos de dados
• Bigint - inteiro de oito bytes com sinal
• Bigserial - inteiro de oito bytes com auto-incremento
• bit [ (n) ] cadeia de bits de comprimento fixo
• bit varying [ (n) ] - cadeia de bits de comprimento variável
• Boolean - booleano lógico (verdade/falso)
• box - caixa retangular no plano
• bytea - dados binários ("matriz de bytes")
• character varying [ (n) ] varchar [ (n) ]cadeia de caracteres de comprimento
variável
• character [ (n) ] char [ (n) ] cadeia de caracteres de comprimento fixo
• cidr endereço de rede IPv4 ou IPv6
• circle círculo no plano
• date data de calendário (ano, mês,dia)
• double precision - número de ponto flutuante de precisão dupla
Tipos de dados
• inet endereço de hospedeiro IPv4 ou IPv6
• Integer inteiro de quatro bytes com sinal
• interval [ (p) ] espaço de tempo
• line linha infinita no plano
• lseg segmento de linha no plano
• macaddr endereço MAC
• money quantia monetária
• numeric [ (p, s) ] decimal [ (p, s) ] numérico exato com precisão
selecionável
• path caminho geométrico no plano
• point ponto geométrico no plano
• polygon caminho geométrico fechado no plano
• Real - float de 4 bytes número de ponto flutuante de precisão simples
• Smallint - inteiro de dois bytes com sinal
• Serial inteiro de quatro bytes com auto-incremento
• text cadeia de caracteres de comprimento variável
Tipos de dados

• time [ (p) ] [ without time zone ] hora do dia


• time [ (p) ] with time zone hora do dia, incluindo a zona
horária
• timestamp [ (p) ] [ without time zone ] data e hora
• timestamp [ (p) ] with time zone data e hora, incluindo a
zona horária
Create Table

• Exemplo:
Como exemplo do uso do comando CREATE TABLE,
imaginemos a necessidade de uma tabela que deva
possuir os dados dos clientes de uma loja.

CREATE TABLE Cliente (


Codigo INT NOT NULL,
Nome VARCHAR (60) NOT NULL,
Data_Nascimento DATE,
Telefone CHAR (8),
PRIMARY KEY (Codigo)
);
Create table
• Neste comando, criamos uma tabela chamada Cliente. Esta tabela contém quatro
campos:
O primeiro campo é o Código do cliente. Este campo será utilizado como chave primária de
forma que não poderá se repetir nunca. Desta forma o campo deve ser sempre preenchido
(NOT NULL), é numérico do tipo inteiro (INT).

O campo Nome é do tipo VARCHAR (60), ou seja aceita dados alfa-numéricos com até 60
caracteres. No entanto se um nome for inserido com menos de 60 caracteres, o número de
bytes consumidos pelo campo será de acordo com o nome inserido.

O campo de Data_Nascimento é do tipo DATE, ou seja, uma data, que no entanto não de
preenchimento obrigatório (por isto não foi declarado o NOT NULL).

O campo Telefone foi determinado como sendo alfa-numérico com oito caracteres definidos,
e mesmo que sejam utilizados menos caracteres, o número de bytes consumidos serão
sempre os mesmos independente dos dados. Isto é útil para dados alfanuméricos que não
variam de tamanho, como o caso de UF no Brasil, cuja abreviação sempre são de dois
caracteres.

A instrução PRIMARY KEY define qual dos campos será a chave primária e não pode ser
repetido, sendo o diferenciador entre os diversos clientes que sejam inseridos nesta tabela.
SQL - Visões
• As visões permitem encapsular os detalhes da estrutura das
tabelas, que podem mudar na medida em que os aplicativos
evoluem, atrás de interfaces consistentes.

• As visões podem ser utilizadas em praticamente todos os lugares


em que uma tabela pode ser utilizada. Construir visões baseadas
em visões não é raro.

Sintaxe

• CREATE VIEW minha_visao AS


SELECT cidade, temp_min, temp_max, prcp, data, localizacao FROM
clima, cidades
WHERE cidade = nome;

• SELECT * FROM minha_visao;


REGRAS DE INTEGRIDADE

• Ao criarmos uma tabela dentro de um banco de dados


devemos ter em mente as Regras de Integridade, que
garantam a consistência, integridade e não redundância
dos dados. Entre estas regras podemos englobar as
chaves primárias, checagem e chave estrangeira.
Restrições de Integridade
Integridade de Entidade
• Toda a tabela deve possuir, obrigatoriamente, uma
coluna (ou uma composição de colunas) cujo valor é
único para todas as instâncias  CHAVE PRIMÁRIA
(PK)
• As chaves primárias funcionam como os campos que
diferenciam os dados uns dos outros, e que não podem
ser repetidos de nenhuma forma.
• Eventualmente, outras colunas além da chave primária
podem ser únicas  CHAVE ALTERNATIVA (AK)
Restrições de Integridade
Integridade de Domínio
• Cada coluna da tabela tem seus valores
restringidos por
– tipos de dados: definem o domínio de uma coluna
– cod_cliente NUMBER ( 6 )
– username VARCHAR2 ( 20 )
• Restrições a valores nulos: definem se as
colunas serão obrigatórias ou opcionais
– email VARCHAR2 ( 40 ) NOT NULL
– ddd NUMBER ( 3 )
Restrições de Integridade
Integridade de Domínio
– valores padrão: define um valor padrão a ser
associado a uma coluna se não for fornecido
valor (ou for explicitamente fornecido um
valor NULL) para esta durante a inserção

importado CHAR ( 1 ) DEFAULT 'N' NOT NULL

– A definição de valores padrões é particularmente


importante para colunas NOT NULL
Restrições de Integridade
Integridade de Domínio
– restrições de validação: restringem os
valores que podem ser atribuídos a uma
coluna
CONSTRAINT CHK_PROD_IMPORTADO CHECK
(importado in ('S','N'))
– tipos definidos pelo usuário: tipo de dado
construído a partir de tipos pré-definidos,
contendo restrição a valores nulos, regras
de validação e um valor padrão
• Não disponível em todos os SGBDs
Restrições de Integridade
Integridade Referencial
• As restrições de integridade referencial
garantem a consistência dos relacionamentos
entre as tabelas
<<Table>>
cidades
cod_cidade : NUMBER(4, 0)
nome : VARCHAR2(40) <<Table>>
uf : CHAR(2) <<Non-Identifying>> estados
uf : CHAR(2)
<<PK>> PK_CIDADES() 0..*
1 nome : VARCHAR2(20)
<<FK>> FK_EST_CID() regiao : CHAR(2)

<<PK>> PK_ESTADOS()
Restrições de Integridade
Integridade Referencial
• A chave estrangeira é uma cláusula que deve
ser incluída quando possuímos mais de duas
tabelas em um banco de dados.
• Através da chave estrangeira estabelecemos as
relações entre duas ou mais tabelas. A chave
estrangeira desta forma referencia o campo que
é chave primária de outra tabela.

FOREIGN KEY (Campo1, Campo2, Campo3 ...)


REFERENCES Nome_Tabela2 (Nome_Chave);
Restrições de Integridade
Integridade Referencial
• No exemplo, a definição da restrição de
integridade referencial seria criada como segue

CONSTRAINT FK_EST_CID FOREIGN KEY (uf) REFERENCES


estados (uf)

• Esta restrição estabelece uma relação entre o


atributo uf da tabela CIDADES e a chave
primária da tabela ESTADOS
SQL – Chave Estrangeiras (Exemplo)
• CREATE TABLE cidades (
cidade varchar(80) primary key,
localizacao point
);

• CREATE TABLE clima (


cidade varchar(80) references cidades,
temp_min int,
temp_max int,
prcp real,
data date
);
SQL – Chave Estrangeiras
• Agora ao se tentar inserir um registro
INSERT INTO clima VALUES (’Berkeley’, 45, 53, 0.0, ’1994-11-28’);

• O que acontece :
ERROR: <unnamed> referential integrity violation - key referenced
from clima not found in cidades

O comportamento das chaves estrangeiras pode receber um ajuste


fino na aplicação. Não iremos além deste exemplo simples neste
tutorial, mas consulte o Guia do Usuário do PostgreSQL para obter
mais informações.
Usar corretamente as chaves estrangeiras com certeza vai melhorar a
qualidade dos seus aplicativos de banco de dados, portanto
encorajamos muito que este tópico seja aprendido.
Restrições de Integridade
Integridade Referencial
• O SGBD deve prover mecanismos para
assegurar que a restrição de integridade seja
respeitada, ou seja, uma linha violando a
restrição de integridade referencial não poderá
existir;
• Estes mecanismos prevêem a execução de uma
ação em resposta a uma atualização, a fim de
manter a integridade referencial.
Restrições de Integridade
Integridade Referencial
• Existem diferentes ações possíveis para evitar
que uma operação de atualização viole as
restrições de integridade referencial
– RESTRICT: impede a execução da operação
Inserir uma Sala situada em um Prédio não
existente
– CASCADE: propaga a operação para respeitar as
restrições de integridade referencial
Remover uma Disciplina do Currículo, removendo
todos os Pré-requisitos associados a esta
Restrições de Integridade
Integridade Referencial
– SET NULL: assegura as restrições de integridade
referencial associando um valor NULL à chave
estrangeira que poderia violá-las
Remover um Professor, fazendo com que a coluna
matricula_professor em DISCIPLINAS_TURMAS
fosse atualizada para NULL em todas as disciplinas
que atua
 NULL não é considerado um valor, portanto, não
fere as restrições de integridade referencial
– SET DEFAULT: semelhante à ação de SET NULL,
mas associa um valor padrão à chave estrangeira
Definindo Valores Padrão
• Pode ser definido um valor padrão para uma
coluna (literais, expressões ou funções)
• Se não for definido um valor, será utilizado o
padrão
– create table pedidos (
num_pedido number ( 7 ),
cod_cliente number ( 6 ) not null,
cod_endereco number ( 2 ) not null,
data_emissao date not null default
sysdate,
constraint pk_pedidos primary key
(num_pedido));
Utilizando Valores Padrão
– insert into pedidos (num_pedido,
cod_cliente, cod_endereco)
values (17645, 540, 290);
• Foi omitida a coluna data_emissão, logo,
será utilizado o valor padrão
– insert into pedidos (num_pedido,
cod_cliente, cod_endereco,
data_emissao)
values (17645, 540, 290, NULL);
• Foi explicitamente definido NULL
Restrições de Integridade
Integridade Definida pelo Usuário
• O Projetista do Banco de Dados pode definir
restrições de integridade complexas, utilizando,
por exemplo, o conceito de triggers
• Triggers são porções de código ativadas após
certos eventos (inserção, atualização ou
exclusão de linhas da tabela)
Resumindo, temos : Restrições de
Integridade de Tabelas
– CONSTRAINT nome_da_restrição
PRIMARY KEY (colunas)
– CONSTRAINT nome_da_restrição
FOREIGN KEY (colunas) REFERENCES
nome_da_tabela_pai [ON DELETE
CASCADE]
– CONSTRAINT nome_da_restrição
UNIQUE (colunas)
– CONSTRAINT nome_da_restrição CHECK
(expressao)
Restrições de Integridade de
Colunas
– CONSTRAINT nome_da_restrição NOT NULL
– CONSTRAINT nome_da_restrição PRIMARY KEY
– CONSTRAINT nome_da_restrição REFERENCES
nome_da_tabela_pai [ON DELETE CASCADE]
– CONSTRAINT nome_da_restrição UNIQUE
– CONSTRAINT nome_da_restrição CHECK
(expressao)
Exemplo- Restrições de Integridade nas
Tabelas e nas Colunas
create table usuarios (
cod_usuario number ( 6 ),
nome varchar2 ( 100 )
constraint nn_usu_nome not null,
cpf char ( 11 )
constraint nn_usu_cpf not null,
email varchar2 ( 40 )
constraint nn_usu_email not null,
username varchar2 ( 20 )
constraint nn_usu_username not null,
password varchar2 ( 20 )
constraint nn_usu_password_not null,
constraint pk_usuarios primary key (cod_usuario),
constraint ak_usu_cpf unique (cpf),
constraint ak_usu_username unique (username));
Exemplo- Restrições de Integridade nas
Tabelas e nas Colunas
create table produtos (
cod_produto number ( 5 ) not null,
titulo varchar2 ( 200 ) not null,
ano_lancamento date not null,
importado char ( 1 ) not null,
preco number ( 10, 2 ) not null,
prazo_entrega number ( 3 ) not null,
constraint pk_produtos
primary key (cod_produto),
constraint chk_prod_importado
check (importado in (‘S',‘N'))
);
Exemplo- Restrições de Integridade nas
Tabelas e nas Colunas
create table administradores (
cod_administrador number ( 6 ),
nivel_privilegio number ( 1 ) not null,
constraint pk_administradores primary key
(cod_administrador),
constraint fk_usu_adm foreign key
(cod_administrador) references usuarios
(cod_usuario)
);
SQL (Comandos da DDL)
• DROP TABLE — remove uma tabela

• DROP TABLE nome [, ...] [ CASCADE | RESTRICT ]

onde
NOME
O nome (opcionalmente qualificado pelo esquema) da tabela a ser removida.
CASCADE
Remove automaticamente os objetos dependentes da tabela (como visões).
RESTRICT
Recusa remover a tabela se existirem objetos dependentes. Este é o padrão.

Saídas
DROP TABLE
Mensagem retornada se a execução do comando for bem-sucedida.
ERROR: table "nome" does not exist
Se a tabela especificada não existe no banco de dados.
SQL (Comandos da DDL) – Alter Table
• Descrição
O comando ALTER TABLE altera a definição de uma tabela
existente. Existem várias formas alternativas:

• ADD COLUMN Esta forma adiciona uma nova coluna à tabela


usando a mesma sintaxe do comando CREATE TABLE.

• DROP COLUMN Esta forma remove uma coluna da tabela. Os


índices e as restrições da tabela que referenciam a coluna também
serão automaticamente excluídos. É necessário especificar
CASCADE se algum objeto fora da tabela depender da coluna
como, por exemplo, referências de chaves estrangeiras ou visões.

• SET/DROP DEFAULT Estas formas definem ou removem o valor


padrão para a coluna. O valor padrão somente é aplicado nos
próximos comandos INSERT; as linhas existentes na tabela não
são modificadas. Valores padrão também podem ser criados para
visões e, neste caso, são inseridos pelo comando INSERT na visão
antes da regra ON INSERT da visão ser aplicada.
SQL (Comandos da DDL) – Alter Table
• SET/DROP NOT NULL Estas formas mudam se a coluna está
marcada para permitir valores nulos ou para rejeitar valores nulos. A
forma SET NOT NULL somente pode ser utilizada quando não
existem valores nulos na coluna.

• SET STATISTICS Esta forma define o valor usado para a coleta de


estatísticas por coluna para as próximas operações de ANALYZE.
O valor pode ser definido no intervalo de 0 a 1000; como alternativa,
pode ser definido como -1 para utilizar o valor padrão do sistema
para as estatísticas.

• SET STORAGE Esta forma define o modo de armazenamento para


a coluna.

• RENAME A forma RENAME muda o nome de uma tabela (de um


índice, de uma seqüência ou de uma visão), ou o nome de uma
coluna da tabela. Não ocasiona efeito sobre os dados
armazenados.
SQL (Comandos da DDL) – Alter Table
• DROP CONSTRAINT Esta forma remove restrições de
tabela. Atualmente, as restrições de tabela não
necessitam ter nomes únicos e, portanto, pode haver
mais de uma restrição correspondendo ao nome
especificado. Todas estas restrições serão removidas.

• OWNER Esta forma muda o dono da tabela, índice,


seqüência ou visão como sendo o usuário especificado.
É necessário ser o dono da tabela para executar o
comando ALTER TABLE, exceto para a forma ALTER
TABLE OWNER que somente pode ser executada por
um superusuário.
SQL (Comandos da DDL)
• ALTER TABLE — Sintaxe
ALTER TABLE [ ONLY ] tabela [ * ]
ADD [ COLUMN ] column tipo [ restrição_de_coluna [ ... ] ]
ALTER TABLE [ ONLY ] tabela [ * ]
DROP [ COLUMN ] coluna [ RESTRICT | CASCADE ]
ALTER TABLE [ ONLY ] tabela [ * ]
ALTER [ COLUMN ] coluna { SET DEFAULT valor | DROP DEFAULT }
ALTER TABLE [ ONLY ] tabela [ * ]
ALTER [ COLUMN ] coluna { SET | DROP } NOT NULL
ALTER TABLE [ ONLY ] tabela [ * ]
ALTER [ COLUMN ] coluna SET STATISTICS inteiro
ALTER TABLE [ ONLY ] tabela [ * ]
ALTER [ COLUMN ] coluna SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER TABLE [ ONLY ] tabela [ * ]
RENAME [ COLUMN ] coluna TO novo_nome_da_coluna
ALTER TABLE tabela
RENAME TO novo_nome_da_tabela
ALTER TABLE [ ONLY ] tabela [ * ]
ADD definição_de_restrição_de_tabela
ALTER TABLE [ ONLY ] tabela [ * ]
DROP CONSTRAINT nome_da_restrição [ RESTRICT | CASCADE ]
ALTER TABLE tabela
OWNER TO novo_dono
SQL (Comandos da DML)
• SELECT (DISTINCT) (*, COLUNA (SINÔNIMO), ...)
FROM tabela
WHERE condição ou condições
ORDER BY (coluna, expressão) (ASC/DESC)

• Exemplo :
SELECT registro, nome, cpf FROM cadastro;
SQL (Comandos da DML)
• Note aqueles nomes de colunas estão separados por
uma vírgula.
• Ele possibilita selecionar todas as colunas da tabela,
especificando um * (asterisco) depois do SELECT
palavra comando.

• SELECT * FROM CADASTRO;


SQL (Comandos da DML)
• Outros itens da clausula SELECT

– É possível incluir outros itens na clausula SELECT.


– Expressões Aritméticas.

– Colunas sinônimas

– Concatenação de colunas

– Literais
SQL (Comandos da DML)

• Expressões
Aritméticas Operadores Descrições

• Uma expressão é a + Adição


combinação de um ou mais
valores, operadores, e funções - Subtração
os quais avaliam para um
valor. * Multiplicação

• Expressões Aritméticas
podem conter nome de / Divisão

colunas, valores numéricos


constantes e operadores
aritméticos Ex. : SELECT nome, SAL*12
FROM cadastro;
SQL (Comandos da DML)

• Colunas Sinônimas
• Quando mostramos o resultado de uma pesquisa, o PgAdmin
normalmente usa o nome as colunas selecionadas como cabeçalho.
Em alguns exemplos ele pode ser sem sentido. Você pode modificar
o cabeçalho de uma coluna usando sinônimos(alias).

• Uma coluna sinônima é um cabeçalho de coluna alternativo na saída.


Especifique o sinônimo (alias) depois da coluna na lista do SELECT.
O cabeçalho sinônimo padrão será fornecido sem espaços em
branco, amenos que o sinônimo esteja dentro de aspas duplos (“ “).

• Exemplo :
select registro, nome, datanasc “data de nascimento” from cadastro
SQL (Comandos da DML)

• O Operador de Concatenação
O Operador de Concatenação (||) permite que as colunas
sejam juntadas com outras colunas, expressões aritméticas
ou valores constantes para criar uma expressão
alfanumérica. Colunas ficam lado a lado com operadores
para formarem uma única coluna.

• Exemplo :
SELECT registro||nome FROM cadastro;
SQL (Comandos da DML)

• Literais
• Um literal são um ou mais caracteres, expressões, números incluídos
na lista do SELECT o qual não é um nome de coluna ou de um
sinônimo
• Um literal na lista do SELECT terá uma saída para cada linha
retornada. Literais de livre formatos de textos podem ser incluídos no
resultado da pesquisa, e são tratados como uma coluna na lista do
SELECT.
•Datas e caracteres alfanuméricos devem ser colocados entre aspas
simples(‘); números não precisam de aspas simples.
• As declarações seguintes contém literais selecionados com
concatenação e colunas sinônimas.

Exemplo : select registro||’-’||nome from cadastro


SQL (Comandos da DML)
• Prevenindo a Seleção de Linhas Duplicadas
A menos que você indique de outra maneira, SQL*Plus mostrará os
resultados da pesquisa sem eliminar as duplicações.
Para listar todos os números de departamentos da tabela EMP, faça:
• Exemplo :
SELECT DEPTBASE FROM CADASTRO;

• A clausula DISTINCT
Para eliminar valores duplicados no resultado, incluímos o DISTINCT
qualificador no comando SELECT.

Para eliminar os valores Duplicados mostrados no exemplo anterior, faça:


Exemplo :
SELECT DEPTBASE FROM CADASTRO;
SQL (Comandos da DML)
• A clausula ORDER BY
• Normalmente a ordem das linhas retornadas de uma pesquisa é
indefinida. A clausula ORDER BY pode ser usada para ordenar as
linhas. Se usado, o ORDER BY precisa sempre ser a última clausula da
declaração SELECT.
Para ordenar pelo nome, faça:

• Exemplo :
SELECT nome, deptobase FROM cadastro
ORDER BY nome;

SELECT nome, deptobase FROM cadastro


ORDER BY 1;
SQL (Comandos da DML)
• Ordenação por várias colunas.
• É possível na clausula ORDER BY usar mais de uma coluna. O limite
de colunas é de fato o número de colunas da tabela. Na clausula
ORDER BY especifica-se as colunas pelo que as linhas serão
ordenadas, separando as por vírgula. Se algumas ou todas são
invertidas especifique DESC depois de alguma ou cada uma das
colunas

• Exemplo :

SELECT DEPTBASE, NOME FROM CADASTRO


ORDER BY DEPTBASE, NOME DESC;
SQL (Comandos da DML)
• A Clausula WHERE
A clausula WHERE corresponde aos Operadores de Restrições da
Álgebra Relacional.
Ele contém condições nas quais a linha precisa se encontrar em
ordem para ser mostrada.

Estrutura da seleção com restrições.


SELECT coluna(s)
FROM tabela(s)
WHERE certa condição a ser encontrada
SQL (Comandos da DML)
A clausula WHERE pode comparar valores em uma coluna, valores
literais, expressões aritméticas ou funções. A clausula WHERE
conta com três elementos.
1- Um nome de coluna
2- Um operador de comparação
3- Um nome de coluna, um constante, ou lista de valores.
Operadores de Comparação são usados na clausula WHERE e
podem ser divididos em duas categorias, Lógicos e SQL.
Operadores Lógicos
Esses operadores lógicos testam as seguintes condições:
Operador Significado

= igual a

> maior que

>= maior e igual a

< menor que

<= menor e igual a


SQL (Comandos da DML)
• Para
listar os nomes e departamentos de todos os
empregados do departamento 1402

• SELECT nome, deptobase FROM cadastro


WHERE deptbase=1402;

• Para encontrar todos os nomes de departamentos com


número de departamento maior que 1500, faça

SELECT nome, deptobase FROM cadastro


WHERE deptbase > 1500;
SQL (Comandos da DML)
Comparando uma coluna com outra coluna na mesma linha:
Você pode comparar uma coluna com outra coluna na mesma linha, da
mesma forma com um valor constante.

Por exemplo, suponhamos que você quer encontrar os empregados os


quais a comissão está maior que seu salário, faça:

SELECT nome FROM cadastro


WHERE Com >= Sal;
SQL (Comandos da DML)
• Operadores SQL
Existem quatro operadores SQL os quais opera, com todos tipos de
dados:
Operador Significado

BETWEEN ... AND ... Entre dois valores (inclusive)

IN(Lista) compara uma lista de valores

LIKE Compara um parâmetro alfanumérico

IS NULL é um valor nulo


SQL (Comandos da DML)
• O Operador BETWEEN

Testa para um faixa de valores, e inclusive do menor a maior faixa.


Suponhamos que nós quisemos ver aqueles empregados nascidos
depois de 1960

SELECT nome, datanasc from cadastro


WHERE datanasc BETWEEN '1960-01-01' AND '2007-01-31';
SQL (Comandos da DML)
• O Operador IN
Testa os valores especificados em uma lista.
Para encontrar empregados que esteja um dos três departamentos,
faça:

SELECT nome, deptobase FROM cadastro


WHERE deptobase IN (1402,1502,1503)
SQL (Comandos da DML)
• O Operador LIKE

Algumas vezes você precisa procurar valores que você não conhece
exatamente Usando o operador LIKE é possível selecionar linhas
combinando parâmetros alfanuméricos. Dois símbolos podem ser
usados para construir uma linha de procura.

Símbolo Representa
% Várias seqüência de zero ou mais
caracteres

_ um número desejado de
caracteres
SQL (Comandos da DML)
• O Operador LIKE

Para listar todos os empregados os quais o nome começa com a letra


S, faça:

SELECT nome FROM cadastro


WHERE nome LIKE 'S%';

Eles podem ser usados para encontrar um determinado número de


caracteres.
Por exemplo para listar todos empregados que tenham exatamente
quatro caracteres de tamanho do nome.

SELECT NOME FROM CADASTRO


WHERE NOME LIKE '____'
SQL (Comandos da DML)
• Operador IS NULL
Unicamente encontrar todos os empregados que não tenham telefone,
você testará um valor nulo:

SELECT nome FROM cadastro WHERE telefoneres IS NULL;


SQL (Comandos da DML)
• Expressões Negativas
Os operadores seguintes são testes de negação:

Operador Descrição
!= não igual para (VAX,UNIX,PC)
^= não igual para (IBM)
<> não igual para (todos sistemas
operacionais)
NOT COLUNA_NOME= não igual que

NOT COLUNA_NOME> não maior que


SQL (Comandos da DML)
• Operadores SQL

Operador Descrição
NOT BETWEEN tudo que estiver fora da faixa
NOT IN tudo que não estiver na lista
NOT LIKE tudo que não conter a linha de caracteres
IS NOT NULL tudo que não for nulo

Para encontrar aqueles empregados cujo os nomes não comecem


com a letra M, faça:

SELECT NOME, DEPTOBASE FROM CADASTRO


WHERE NOME NOT LIKE 'M%';
SQL (Comandos da DML)
Você pode combinar AND e OR na mesma expressão lógica.
Quando AND e OR aparecer na mesma clausula WHERE,
todos os ANDs serão feitos primeiros e então todos os Ors
serão feitos.

Se AND não interfere sobre o OR a seguinte declaração SQL


retornará todos os gerentes com salário acima de 1500, e
todos os vendedores.

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO


FROM EMP WHERE SAL > 1500
AND JOB = 'MANAGER‘ OR JOB = 'SALESMAN'
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela

Ligações (Joins)

• Uma ligação é usada quando a pesquisa SQL requer dados


de mais de uma tabela do Banco de Dados.

• Linhas em uma tabela devem ser ligadas a outras linhas de


acordo com o valor comum existente na coluna
correspondente.

Existem dois tipos principais de condições de ligações:


1. Equi-join
2. Non-equi-join
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela

Equi-Join
• Na ordem para descobrir, manualmente, qual
departamento vários empregados estão, nós
comparamos a coluna DEPTOBASE da tabela
CADASTRO com a mesmo valor de DEPTOBASE na
tabela DEPT.
• O relacionamento entre a tabela EMP e a DEPT é um
equi-join, em que o valor da coluna DEPTNO seja igual
para ambas as tabelas( o = operador de comparação é
usado).
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela

Uma condição de ligação é especificada na clausula


WHERE:

SELECT coluna(s)
FROM tabela(s)
WHERE condição de ligação

Para ligar as duas tabelas CADASTRO e DEPTO, faça:


SELECT CADASTRO.NOME, DEPTO.NOME
FROM CADASTRO, DEPTO
WHERE CADASTRO.DEPTOBASE = DEPTO.CODIGO;
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela

Usando Tabelas com Sinônimos

• Pode ser tedioso repetir o nome inteiro de um tabela em uma coluna.


Nomes temporários (ou sinônimos) podem ser usados na clausula
FROM. Estes nomes temporários valem unicamente para a declaração
de SELECT corrente. Tabelas sinônimas devem então ser declaradas na
clausula SELECT. Isso agiliza a pesquisa em que a declaração contém
muitas informações.

• Tabelas Sinônimas estão sendo usadas na seguinte declaração:

SELECT C.NOME, D.NOME


FROM CADASTRO C, DEPTO D
WHERE C.DEPTOBASE = D.CODIGO
ORDER BY D.CODIGO
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela

Nom-Equi-Join
• O relacionamento entre as tabelas CADASTRO e SALFAIXA
é um nom-equi-join, em que a coluna na CADASTRO
corresponde direto a uma coluna na SALFAIXA. O
relacionamento é obtido usando um outro operador que o
igual(=).
• Para avaliar um grau do salário de um empregado é
necessário que o salário esteja entre o menor e maior faixa
de salário.

• O operador BETWEEN é usado para construir a condição,


faça:
SELECT C.NOME, C.SAL, S.FAIXA
FROM CADASTRO C, SALFAIXA S
WHERE C.SAL BETWEEN S.LOSAL AND S.HISAL;
SQL (Comandos da DML)
Extraindo Dados de Mais de uma Tabela

1. Mostra todos os nomes dos empregados e o nome de


seus departamentos em ordem de nome de
departamento
2. Mostrar o nome de todos os empregados, nome e
número do departamento
3. Mostrar o nome e departamento dos empregados que
nasceram antes de 1966.
4. Mostrar todos os alunos do curso de cinema (225)
5. Mostrar matricula, nome, curso e disciplina dos alunos do
curso de filosofia que já cursaram a disciplina FIL311.
SQL (Comandos da DML)

Funções de Grupo
• Funções de grupo operam sobre conjuntos de linhas.
Elas retornam resultados baseados sobre um grupo de
linhas, antes que um resultado por linha tenha retornado
como uma função de linha única.

Group by
• Como padrão todas as linhas de um tabela são trilhadas
como um grupo. A clausula GROUP BY da declaração do
SELECT é usada para dividir as linhas em menores
grupos.
SQL (Comandos da DML)
Função Valor Retornado
AVG([DINSTINCT/ALL]n) Valor médio de n, ignorando os valores
nulos.
COUNT([DINSTINCT/ALL]expr*) Contador

* conta todas as linhas selecionadas,


incluindo duplicadas e linhas nulas

MAX([DISTINCT/ALL]expr) valor máximo da expressão

MIN([DISTINCT/ALL]expr) valor mínimo da expressão

STDDEV([DISTINCT/ALL]n) Desvio padrão de n, ignorando valores


nulos.
SUM([DISTINCT/ALL]n) Valor soma de n, ignorando valores
nulos.
VARIANCE([DISTINCT/ALL],n) variação de n, ignorando valores nulos.
SQL (Comandos da DML)
Todas as funções do slide anterior operam sobre um número
de linhas (por exemplo, uma tabela inteira) e são portanto
funções de GRUPO.

• DISTINCT faz uma função de grupo considerar valores não


duplicados;

• ALL considera todos os valores sua declaração não é


necessária.

•Todas as funções de grupo exceto o COUNT(*) ignoram os


valores nulos
SQL (Comandos da DML)
Funções de Grupo
• AVG
Para calcular a média das GQs dos alunos
do curso 047 :

SELECT AVG(gq1+gq2+gq3) FROM srhac01;


SELECT AVG(sal) FROM cadastro;
SQL (Comandos da DML)
Funções de Grupo
MIN
Uma função de grupo pode ser usada para subconjunto de
linhas de uma tabela usando a clausula WHERE.
Para encontrar o funcionário mais velho da UGF, do
deptobase 1711 faça:

• SELECT MIN(datanasc) FROM


CADASTRO WHERE deptobase = ‘1711';
SQL (Comandos da DML)
Funções de Grupo
COUNT
Para encontrar o número de empregados do
departamento 1711, faça:

SELECT COUNT(*) FROM CADASTRO


WHERE DEPTOBASE = 1711;

Nota: A função COUNT usada dessa forma COUNT(1)


tem o mesmo resultado que a acima e é mais rápida.
SQL (Comandos da DML)
Funções de Grupo
A clausula GROUP BY
•A clausula GROUP BY pode ser usada para dividir as
linhas de uma tabela em um menor grupo. Funções de
grupo devem ser usadas para resumir informações por
cada grupo.

Para mostrar os funcionários mais velhos por


departamento, faça:
• SELECT deptobase, min(datanasc) FROM cadastro
GROUP BY deptobase;
SQL (Comandos da DML)
Funções de Grupo
Excluindo linhas quando estiver Usando o GROUP BY
Linhas devem ser excluídas com a clausula WHERE, antes
da divisão por grupos.

Para mostrar o funcionário mais velho por deptobase


excluindo o deptobase 1711, faça:

SELECT deptobase, min(datanasc)


FROM cadastro
WHERE deptobase <> ‘1711‘
GROUP BY deptobase;
SQL (Comandos da DML)
Funções de Grupo
Grupos dentro de Grupos

Nós podemos então usar a clausula GROUP BY para


prover resultados para grupos dentro de grupos.

Mostre o funcionário mais novo por cada função


dentro de um departamento, faça:

SELECT deptobase, funcao, max(datanasc) FROM


cadastro GROUP BY deptobase, funcao;
SQL (Comandos da DML)
Funções de Grupo
Funções de Grupo e Resultados Individuais
A seguinte declaração SQL retorna a maior idade
para cada grupo. O resultado não é significativo
porque o deptobase não é mostrado no resultado.
• SELECT MIN(datanasc) FROM cadastro
GROUP BY deptobase;

Mostrando o Departamento
• SELECT MIN(datanasc),deptobase FROM
cadastro GROUP BY deptobase;
SQL (Comandos da DML)
Funções de Grupo
Suponha na mente a seguinte regra quando
usar funções de grupo:

Se você inclui uma função de grupo no


comando SELECT, você não deve selecionar
resultados que não estejam declarados no
GROUP BY.
SQL (Comandos da DML)
Funções de Grupo
Por exemplo:
SELECT DEPTOBASE, MIN(DATANASC)
FROM CADASTRO;
•ERROR: column "cadastro.deptobase" must
appear in the GROUP BY clause or be used in
an aggregate function.
O comando é inválido porque DEPTOBASE tem
um valor para cada linha da tabela, enquanto
MIN(DATANASC) tem um valor para tabela inteira.
SQL (Comandos da DML)
Funções de Grupo
Para corrigir o erro, nós devemos
agrupar o item individual:

SELECT DEPTOBASE, MIN(DATANASC)


FROM CADASTRO
GROUP BY DEPTOBASE;
SQL (Comandos da DML)
Funções de Grupo
A clausula HAVING
Use a clausula HAVING se você quiser especificar
o qual grupo será mostrado.

Para mostrar todos os departamentos que tiverem


mais de três empregados, faça:
SELECT DEPTOBASE FROM CADASTRO
GROUP BY DEPTNO
HAVING COUNT(1) > 3;
SQL (Comandos da DML)
Funções de Grupo
Para mostrar só os departamentos, onde
existe funcionários nascidos antes de
1930-01-01, faça:

SELECT deptobase, datanasc FROM cadastro


GROUP BY deptobase, datanasc
having min(datanasc)<='1930-01-01'
SQL (Comandos da DML)
Funções de Grupo
A clausula WHERE não pode ser usada para restringir
itens de grupo.
A seguinte declaração da clausula WHERE é errada.

SELECT deptobase, datanasc FROM cadastro


GROUP BY deptobase, datanasc
WHERE min(datanasc)<='1930-01-01'

Você pode unicamente usar WHERE para restringir


linhas individuais. Para restringir colunas de grupos
usa-se a clausula HAVING.
SQL (Comandos da DML)
Funções de Grupo
Nota:
Você pode excluir todos os “gerentes”
usando a clausula WHERE quando
estiver agrupando por cargo.

SELECT funcao FROM cadastro


WHERE funcao <> ‘035013'
GROUP BY funcao;
SQL (Comandos da DML)
Funções de Grupo
Exercícios
1. Encontrar o funcionário mais antigo
2. Encontrar o funcionário mais antigo e o mais novo
3. Listar o mais novo e o mais velho funcionário por
cargo
4. Encontrar quantos funcionários lecionam
5. Mostre o departamento e a sua descrição que
tiverem mais de 40 empregados
6. Cheque se todos os números de funcionários são
únicos
SQL (Comandos da DML)
INSERT
insert into nomedatabela
(campo 1,...,campo n)
Values (valor 1,...,valor n)

Exemplo 1:
INSERT INTO alunovestibular
(matricula,notaobjetiva,notaredacao,classificacao)
VALUES (‘20061000001’,’20’,’2.5’,1);
SQL (Comandos da DML)
INSERT
insert into nomedatabela
(campo 1,...,campo n)
Values (valor 1,...,valor n)

Exemplo 2:
INSERT INTO alunovestibular
VALUES (‘20061000001’,’20’,’2.5’,1);
SQL (Comandos da DML)
UPDATE
UPDATE nomedatabela
SET campo 1 = valor 1,..., campo n = valor n

Exemplo :
"UPDATE alunovestibular
SET notaobjetiva=’20’,
notaredacao=‘3.5’,
classificacao=‘2'
WHERE matricula='".$matricula."'";
SQL (Comandos da DML)
DELETE
DELETE FROM nomedatabela
WHERE <CONDIÇÃO>

Exemplo : ?
SQL (Comandos da DML)
Sub-Pesquisas
• Pesquisas contendo na clausula WHERE ou HAVING de
outra declaração SQL

• Uma sub-pesquisa é uma declaração SELECT que é


aninhada com outra declaração SELECT e a qual retorna
resultados intermediários.

• Por exemplo:
SELECT coluna1, coluna2, ...
FROM tabela
WHERE coluna = (SELECT coluna
FROM tabela
WHERE condição)
SQL (Comandos da DML)
Sub-Pesquisas
• A sub-pesquisa é geralmente referida como SUB-SELECT
ou SELECT interno;

• Geralmenteexecuta primeiro e a saída é usada para


completar a condição da pesquisa principal ou outra
pesquisa.
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
• Para encontrar o empregado que ganha o
mínimo salário na companhia (o mínimo
salário é uma quantidade desconhecida),
dois passos devem ser seguidos:

1. Encontrar o salário mínimo:


SELECT MIN(salario) FROM cadastro;
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
• 2. Encontrar o empregado que ganha o
salário mínimo:

SELECT nome, salario FROM cadastro


WHERE salario = (menor salário o qual é
desconhecido)
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
• Nós podemos combinar os dois comandos
como uma sub-pesquisa aninhada:

SELECT nome, salario FROM cadastro


WHERE salario = SELECT MIN(salario)
FROM cadastro;
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
• Como são processadas as Sub-pesquisas
Aninhadas?
• Uma declaração SELECT pode ser considerada
como uma pesquisa em bloco. O exemplo
anterior consiste de duas pesquisas em bloco - a
principal pesquisa e a pesquisa interna.
• A interna declaração SELECT é executada
primeiro, produzindo um resultado : 800. A
principal pesquisa em bloco está então
processando e usa o valor retornado pela
pesquisa interna para completar a condição
procurada.
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
• Na essência, a principal pesquisa finaliza-se
olhando como isso:
SELECT nome, salario FROM cadastro
WHERE salario = 800;

• No exemplo acima, o 800 é um valor único. A


sub-pesquisa que retorna o valor 800 é
chamada de sub-pesquisa de linha única.
Quando uma sub-pesquisa retorna uma única
linha: uma linha ou operador lógico deve ser
usado. Por exemplo: =, <, >, <=, etc.
SQL (Comandos da DML)
Sub-Pesquisas de Linha Única
• Para encontrar todos os empregados que trabalham no
mesmo departamento do Camarão nós fazemos:

SELECT nome, deptobase


FROM cadastro
WHERE deptobase = (SELECT deptobase
FROM cadastro
WHERE nome = ‘Camarão');

A pesquisa interna retorna o departamento do


Camarão, o qual é usado na condição WHERE da
pesquisa principal
SQL (Comandos da DML)
Sub-Pesquisas que Retorna mais de Uma Linha

• A seguinte pesquisa atende para


encontrar os empregados que ganham o
menor salário nos departamentos.

SELECT nome, salario, deptobase


FROM cadastro
WHERE salario IN (SELECT MIN(salario)
FROM cadastro
GROUP BY deptobase);
SQL (Comandos da DML)
Sub-Pesquisas que Retorna mais de Uma Linha

Note que a pesquisa interna tem a clausula


GROUP BY. Isso significa que ele pode retornar
mais que um valor.

Nós precisamos para usar múltiplas linhas de um


operador de comparação. Neste caso o operador
IN deve ser usado porque específica uma lista de
valores
SQL (Comandos da DML)
Sub-Pesquisas que Retorna mais de Uma Linha

• Comparando mais de um valor

A seguinte pesquisa encontrará aqueles empregados que


ganham o menor salário no seu respectivo departamento:

A seguinte pesquisa encontrará aqueles empregados que


ganham o menor salário no seu respectivo departamento:

SELECT nome, salario, deptobase FROM cadastro


WHERE (salario,deptobase) IN (SELECT MIN(salario), deptobase
FROM cadastro
GROUP BY deptobase);
SQL (Comandos da DML)
Sub-Pesquisas que Retorna mais de Uma Linha

• Erros Encontrados
Quando uma sub-pesquisa retorna mais que uma linha e
um operador de linha única é usado, a seguinte mensagem
de erro:
SELECT nome, salario, deptobase
FROM cadastro
WHERE salario = (SELECT MIN(salario)
FROM cadastro
GROUP BY deptobase);

ERROR -> more than one row returned by a subquery used as an


expression
SQL (Comandos da DML)
Operadores ANY ou ALL
• Os operadores ANY ou ALL devem ser usados para sub-
pesquisas que retornam mais de uma linha. Eles são
usados na clausula WHERE ou HAVING em conjunto com
os operadores lógicos. (=,<>, <, >, >=, <=).
• ANY compara um valor para cada valor retornado em uma
sub-pesquisa.
Para mostrar os empregados que ganham mais que o
menor salário no departamento 3003, faça:

SELECT nome, salario, funcao, deptobase FROM cadastro


WHERE salario >ANY (SELECT DISTINCT salario
FROM cadastro WHERE deptobase = 3003)
ORDER BY salario DESC;
SQL (Comandos da DML)
Operadores ANY ou ALL

• O menor salário do departamento 3003 é 500. A principal


pesquisa tem que retornar os empregados que ganham o
salário maior que o menor salário no departamento 3003.

• ‘< ANY’ é equivalente ao IN.

• Quando usamos ANY, a palavra chave DISTINCT é usada


para prevenir a seleção de linhas ocupadas.
SQL (Comandos da DML)
Operadores ANY ou ALL
• ALL compara um valor com todos os valores retornados em uma sub-
pesquisa
• A seguinte pesquisa encontra os empregados que ganham mais que
todos os empregados no departamento 3003.

SELECT nome, salario, funcao, deptobase


FROM cadastro
WHERE salario>ALL (SELECT DISTINCT salario
FROM cadastro
WHERE deptobase = 3003)
ORDER BY salario DESC;

O maior salário no departamento 3003 é 6500, a pesquisa tem que


retornar aqueles empregados que ganham mais que 6500. Existe
salário maior que o maior do departamento 3003.

O operador NOT podem ser usado com IN, ANY ou ALL.


SQL (Comandos da DML)
Operadores Exists
• O operador EXISTS é freqüentemente usado com Sub-pesquisas
correlatas. Ele testa quando um valor existe. (NOT EXISTS garante que
não existe). Se o valor existir será retornado Verdadeiro, se não existir
será retornado Falso.

• Para encontrar os empregados que tem no mínimo uma pessoa


subordinada a ele, faça:
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP E
WHERE EXISTS (SELECT EMPNO
FROM EMP
WHERE EMP.MGR = E.EMPNO)
ORDER BY EMPNO;
SQL (Comandos da DML)
Operadores Exists
• Encontrar os empregados que o departamento não é o da tabela DEPT:

SELECT, ENAME, DEPTNO


FROM EMP
WHERE NOT EXISTS (SELECT DEPTNO
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO);

• Outro caminho para encontrar o departamento que não tem nenhum


empregado é:

SELECT DEPTNO, DNAME


FROM DEPT D
WHERE NOT EXISTS (SELECT 'X'
FROM EMP E
WHERE E.DEPTNO = D.DEPTNO);

• Note que o SELECT interno não precisa retornar um valor específico,


unicamente um literal para ser selecionado.
SQL (Comandos da DML)
Clausula HAVING com Sub-pesquisas aninhadas
• Lembre-se que WHERE refere-se para linha única e
HAVING a grupos de linhas especificadas na clausula
GROUP BY.
• Por exemplo, para mostrar os departamentos que tenham
a média salarial maior que a do departamento 3003, faça:

SELECT deptobase, AVG(salario) FROM cadastro


HAVING AVG(salario) > (SELECT AVG(salario)
FROM cadastro
WHERE deptobase = 3003)
GROUP BY deptobase;
SQL (Comandos da DML)
Clausula HAVING com Sub-pesquisas aninhadas
Para construir uma pesquisa que encontre a função com
maior média salarial, faça:

SELECT funcao, AVG(salario)


FROM cadastro
GROUP BY funcao
HAVING AVG(salario) = (SELECT MAX(AVG(salario))
FROM cadastro
GROUP BY funcao);
SQL (Comandos da DML)
Sub-pesquisas aninhadas
Sub-pesquisas devem ser aninhadas (usadas com outras
sub-pesquisas):
• Mostrar o nome, cargo e admissão para os empregados
cuja o salário seja maior que o maior salário do
departamento ‘NUCLEO DE TEC DA INFORMACAO ’.

SELECT nome, funcao, dataadmissao, salario FROM cadastro


WHERE salario > (SELECT MAX(salario) FROM cadastro
WHERE deptobase = (SELECT deptobase FROM deptofunc
WHERE descricao = ' NUCLEO DE TEC DA
INFORMACAO '));
SQL (Comandos da DML)
• Performance depende do uso dos índices, o número de
linhas retornadas pela pesquisa, o tamanho da tabela e se
tabelas temporárias são requeridas para avaliar resultados
temporários.
• As tabelas temporárias geradas pelo SGBD não são
indexadas, e essa pode levar para o degradamento na
performance para sub-pesquisas usando IN, ANY e ALL.
SQL (Comandos da DML)
Sub-pesquisas aninhadas

Exercícios
1. Encontrar os empregados que ganham o maior salário em cada
função e ordenar o salário da forma descendente
2. Encontrar os empregados que ganham o mínimo salário para sua
função. Mostrar o resultado em ordem ascendente de salário.
3. Encontrar o mais recente admitido empregado em cada
departamento. Ordenado por admissão.
4. Mostre o nome, salário e departamento para qualquer empregado
que ganhe um salário maior que a média para seu departamento.
Ordenar pelo número de departamento.
5. Lista todos os departamentos onde não existem empregados.
(Usando dessa vez um sub-pesquisa).
SQL (Comandos da DCL)
Comandos da DCL
• GRANT
• GRANT — concede privilégios de acesso
• Sinopse
• GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES |
TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] nome_da_tabela [, ...]
TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
• GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE nome_bd [, ...]
TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
• GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON FUNCTION nome_da_função ([tipo, ...]) [, ...]
TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
• GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE nome_da_linguagem [, ...]
TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
• GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA nome_do_esquema [, ...]
TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...]
SQL (Comandos da DML)
Comandos da DDL
• O comando GRANT concede privilégios específicos sobre um
objeto (tabela, visão, seqüência, banco de dados, função,
linguagem procedural ou esquema) para um ou mais usuários ou
grupos de usuários.

• Estes privilégios são adicionados aos já concedidos, caso existam.

• Exemplos:
1. GRANT SELECT ON minha_tabela TO PUBLIC;
2. GRANT SELECT,UPDATE,INSERT ON minha_tabela TO GROUP
todos;
SQL (Comandos da DML)
Comandos da DDL
Exemplos :
Conceder, para todos os usuários, o privilégio de inserir na
tabela filmes:
• GRANT INSERT ON filmes TO PUBLIC;

Conceder todos os privilégios na visão tipos para o usuário


manuel:
• GRANT ALL PRIVILEGES ON tipos TO manuel;
SQL (Comandos da DML)
Comandos da DDL
• O comando REVOKE é utilizado para revogar privilégios
de acesso.

Exemplos :
• Revogar o privilégio de inserção na tabela filmes concedido
para todos os usuários:
REVOKE INSERT ON filmes FROM PUBLIC;

• Revogar todos os privilégios concedidos ao usuário manuel


relativos à visão vis_tipos:
REVOKE ALL PRIVILEGES ON vis_tipos FROM manuel;

Você também pode gostar