Você está na página 1de 25

Introduo

 Originalmente proposta para o System R


desenvolvido nos laboratrios da IBM na dcada
de 70 SEQUEL (Structured English QUEry
Language)
SQL
A Linguagem SQL

 Structured Query Language
 Objeto de um esforo de padronizao
coordenado pelo ANSI/ISO
 SQL-86 (SQL1)
 SQL-92 (SQL2)
 SQL-1999 (SQL3)
 SQL-2003
 SQL-2006
2

Introduo Introduo
 SQL baseada principalmente no clculo  Comparao de conceitos
relacional de tuplas, embora inclua aspectos  Entidade-Relacionamento
de lgebra relacional  Modelo Relacional
 lgebra relacional especifica uma seqncia de
operaes  Linguagem SQL
 Por outro lado, a SQL uma linguagem
declarativa, em que o usurio especifica apenas ER Conceitual Entidade Instncia Atributo
qual resultado deseja, no como obt-lo
 Isso permite que o SQL tenha seu desempenho Relacional Lgico Relao Tupla Atributo
melhorado por estratgias de otimizao de
consultas, transparentes para o usurio, a cargo SQL Fsico Tabela Linha Coluna

do SGBD 3 4
Introduo Definio de Dados em SQL
 SQL = LDD + LMD + LCD  Criao de tabelas
 Principais comandos  Atravs do comando CREATE TABLE
 LDD (Linguagem de Definio de Dados)  Sintaxe geral (pode variar de acordo com SGBD)
 CREATE SCHEMA / TABLE / VIEW  CREATE TABLE <nomeTabela>
DROP SCHEMA / TABLE / VIEW (
ALTER TABLE
<nomeColuna> <tipo> [<restrioAtributo>]
 LMD (Ling. de Manipulao de Dados) [, <nomeColuna> <tipo> [<restrioAtributo>]]
 SELECT, INSERT, UPDATE, DELETE [, restrioTabela // chave primria
 LCD (Linguagem de Controle de Dados) [, restrioTabela]] // chaves estrangeiras
 GRANT, REVOKE )

 Sintaxe pode variar de acordo com SGBD


5 6

Definio de Dados em SQL Definio de Dados em SQL


 Criao de tabelas  Tipos de dados (dependem do SGBD)
 CREATE TABLE EMPREGADO  Numricos
(
 INTEGER, INT, SMALLINT, FLOAT, REAL, DOUBLE PRECISION,
NOME VARCHAR(50) NOT NULL,
DECIMAL(i,j), DEC(i,j), NUMERIC(i,j), NUMBER(i,j)
MATRICULA INT,
ENDERECO VARCHAR(100) NOT NULL,  Strings
DEPTO INT NOT NULL,  CHAR(n), CHARACTER(n), VARCHAR(n), CHAR VARYING(n)
MAT_SUP INT,
 Strings de bits

PRIMARY KEY (MATRICULA),  BIT(n), BIT VARYING(n)
FOREIGN KEY (MAT_SUP) REFERENCES  Data e hora
EMPREGADO (MATRICULA) ON DELETE SET NULL,  DATE, TIME, TIME(i), TIME WITH TIME ZONE, TIMESTAMP,
FOREIGN KEY (DEPTO) REFERENCES TIMESTAMP WITH TIME ZONE, INTERVAL
DEPARTMENTO (CODIGO)
)
7 8
Definio de Dados em SQL Definio de Dados em SQL
 Tipos de dados (MS-SQL Server)  Restries de Atributo
 Inteiros  DEFAULT <valor>
 bigint, int, smallint, tinyint  Pode ser includo na definio de um domnio

 Numricos  NOT NULL


 decimal, numeric, money, smallmoney, float, real  PRIMARY KEY
Chave primria
 Data e Hora 

 datetime, smalldatetime, timestamp  UNIQUE


 Chave candidata
 Texto
 FOREIGN KEY REFERENCES <tabela>(<atributo>)
 char, varchar, text ON DELETE [SET NULL | DEFAULT | CASCADE]
 Outros ON UPDATE [SET NULL | DEFAULT | CASCADE]
 bit, binary, varbinary, uniqueidentifier, image, ...  Chave estrangeira
9 10

Definio de Dados em SQL Definio de Dados em SQL


 Restries de Tabela  Opes de remoo (clusula ON DELETE)
 CONSTRAINT <nome> PRIMARY KEY (<atributo>)  CASCADE (propagao)
 CONSTRAINT <nome> FOREIGN KEY (<atributo>)  SET NULL (substituio por nulos)
REFERENCES <tabela>(<atributo>)
 SET DEFAULT (substituio por um valor
ON DELETE [SET NULL | DEFAULT | CASCADE]
ON UPDATE [SET NULL | DEFAULT | CASCADE]
default)
 CONSTRAINT <nome> UNIQUE (<atributo>)  Opo default: bloqueio (RESTRICT)
 Restries em tuplas  As mesmas opes se aplicam clusula ON
 CHECK (<expresso com atributos da mesma tupla>) UPDATE
 CHECK (sexo = M OR sexo = F)  Entretanto esta clusula NO deve ser utilizada
para se evitar que as chaves primrias sejam
modificadas
11 12
Definio de Dados em SQL Definio de Dados em SQL
 Restries de atributo (MS-SQL Server)  Restries de tabela (MS-SQL Server)
 DEFAULT <valor> [ CONSTRAINT constraint_name ]
 { PRIMARY KEY | UNIQUE }
 [ NULL | NOT NULL ]
[ CLUSTERED | NONCLUSTERED ]
 [ { PRIMARY KEY | UNIQUE } { ( column [ ASC | DESC ] [ ,...n ] ) }
[ CLUSTERED | NONCLUSTERED ] ]  FOREIGN KEY
 [ [ FOREIGN KEY ] [ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column ) ] REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ] [ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ] ] [ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
 CHECK ( logical_expression )
 CHECK ( search_conditions )

13 14

Restries de Integridade
Restries de Unicidade
em SQL
 Restries de unicidade (unique constraints)  Chave primria
 Indicam a chave primria e as chaves alternativas de  PRIMARY KEY (<atributos>)
uma tabela
 Chaves alternativas
 Restries de integridade referencial (referential
constraints)  UNIQUE (<atributos>)
 Especificam as chaves estrangeiras de uma tabela  Exemplo
 Restries de verificao (check constraints)  CREATE TABLE Departamento
 Especificam condies que devem ser satisfeitas por ( ...
coluna/linhas de uma tabela ou entre tabelas PRIMARY KEY (DNUM),
UNIQUE (DNOME),
...)
15 16
Restries de Integridade
Restries de Verificao
Referencial
 FOREIGN KEY (<atributos>) REFERENCES  Podem ser criadas na definio de uma
<tabela> [(<atributos>)] coluna, tabela ou como uma assero
 [ON DELETE cascade | set null | set default] separada (totalidades)
 [ON UPDATE cascade | set null | set default]  Exemplo (coluna)
 Exemplo  CREATE TABLE Tabela
 CREATE TABLE Dependente (
(... A char(1) CHECK (A=Y OR A=N),
FOREIGN KEY (SSN) B char(1)
REFERENCES Empregado )
ON DELETE cascade)
17 18

Restries de Verificao Definio de Dados em SQL


 Outro Exemplo (tabela)
 CREATE TABLE Tabela
(A char(1), B char(1),
CHECK ((A=`Y AND B=`N))
 Mais um (assero)
 CREATE ASSERTION Todo-emp-part-de-projeto
CHECK (NOT EXISTS
(SELECT * FROM Empregado
WHERE SSN NOT IN
(SELECT SSN FROM Trabalha_em)))
19 20
Definio de Dados em SQL Definio de Dados em SQL

21 22

Definio de Dados em SQL Definio de Dados em SQL

23 24
Definio de Dados em SQL Definio de Dados em SQL
 DROP TABLE
 Remover fisicamente uma tabela
 Sintaxe
 DROP TABLE <nomeTabela>
 ALTER TABLE
 Alterar a estrutura de uma tabela,
adicionando, removendo ou alterando colunas
e restries
 Sintaxe
 ALTER TABLE <nomeTabela> <opes>
25 26

Definio de Dados em SQL Manipulao de Dados em SQL


 ALTER TABLE  Comandos da linguagem de manipulao
 ALTER TABLE <nome> ADD <atributo> <tipo> de dados (DML ou LMD)
 No permitido configurar NOT NULL neste caso
 SELECT
 ALTER TABLE <nome> DROP <atributo> [CASCADE |
RESTRICT]  INSERT
 ALTER TABLE <nome> ALTER <atributo>  UPDATE
[SET DEFAULT <valor> | DROP DEFAULT]
 DELETE
 ALTER TABLE <nome> ADD CONSTRAINT
 ALTER TABLE <nome> DROP CONSTRAINT <nome>
[CASCADE | RESTRICT]
 S se a restrio tiver recebido nome no CREATE TABLE

27 28
SELECT SELECT
 Comando bsico para recuperao de  Listar todos os atributos de todos os
informaes de um banco de dados empregados
SELECT *
 Estrutura bsica 

FROM empregado
SELECT <lista de atributos>

 Listar os atributos matrcula e nome de
FROM <lista de tabelas>
todos os empregados do sexo masculino e
WHERE <condio>
do departamento 3 (ordenar por nome)
GROUP BY <atributos>
HAVING <condio de agrupamento>  SELECT matricula, nome
FROM empregado
ORDER BY <atributos>
WHERE sexo=M AND depto=3
 <condio> um predicado booleano ORDER BY nome
29 30

SELECT SELECT
 Alias para tabelas e atributos  Operaes com Strings (% e _)
 Listar o cdigo e o nome de todos os  Comear com Marcelo
departamentos que comeam com V e cujo  Nome LIKE Marcelo%
codigo est entre 10 e 20  Terminar com Silva
 SELECT d.codigo AS depto,  Nome LIKE %Silva
d.nome AS nome_depto
FROM departamento d  Que possui o sobrenome Melo
WHERE d.nome LIKE V%  Nome LIKE %Melo%
AND d.codigo BETWEEN 10 AND 20  Que segue o padro
 Telefone LIKE 88__-__00

31 32
SELECT SELECT
 A SQL no trata tabelas como conjuntos, mas sim  Listar o atributo cidade de todos os
como multiconjuntos empregados que moram em MG
 Linhas duplicadas podem aparecer mais do que uma  SELECT e.cidade
vez numa tabela ou no resultado de uma consulta FROM empregado e
 A eliminao de tuplas duplicadas no realizada WHERE e.uf = MG
automaticamente porque  Listar as cidades distintas de todos os
Custa caro computacionalmente, pois requer ordenao

empregados que moram em MG
 Pode ser do interesse do usurio ver as duplicatas
 SELECT DISTINCT e.cidade
 Pode interferir no resultado de operaes de agregao FROM empregado e
 SELECT DISTINCT / SELECT [ALL] WHERE e.uf = MG
 ALL o default
33 34

SELECT SELECT
 Ordenao  Ordenao
 Clusula ORDER BY  possvel especificar a ordenao a partir de um
atributo que no esteja sendo retornado no SELECT
 ORDER BY <atrib> [DESC | ASC]
[,<atrib> [DESC | ASC]]  Listar o nome do empregado de todos os empregados
em ordem de sexo (Funciona!)
 ASC o default  SELECT nome FROM empregado ORDER BY sexo
 Listar os empregados ordenando por UF  No entanto, isso no se aplica quando se usa a clusula
DISTINCT, isto , usando o DISTINCT, a ordenao
ascendente e salrio descendente obrigatoriamente deve ser a partir de atributos contidos
 SELECT * no SELECT
FROM empregado e  O SELECT abaixo ir produzir um erro!
ORDER BY e.uf ASC, e.salario DESC  SELECT DISTINCT nome FROM empregado
35
ORDER BY sexo 36
SELECT SELECT
 Valores NULOS  Listar os empregados que no possuem
 Quando um valor nulo envolvido em uma supervisores
expresso juntamente com outros valores, o  SELECT *
resultado o valor especial UNKNOWN FROM empregado e
WHERE mat_sup IS NULL
 Listar os departamentos que possuem
gerente
 SELECT *
FROM departamento d
WHERE mat_gerente IS NOT NULL
37 38

SELECT SELECT
 Listar o nome e a matrcula do supervisor  Manipulando mais de uma tabela
de todos os empregados  Produto Cartesiano
 SELECT nome,  Junes (JOINS)
ISNULL(mat_sup,(sem supervisor))
INNER, OUTER (LEFT, RIGHT, FULL)
FROM empregado 

Consultas aninhadas (subqueries)


 Listar o nome do departamento e matrcula 

IN, EXISTS, ALL, ANY


do gerente (exibir 0 se o depto no tiver 

Consulta como tabela


gerente) para todos os departamentos 

 SELECT nome, ISNULL(mat_gerente,0) AS ger  Operaes de conjunto


FROM departamento  UNION, INTERSECT, EXCEPT
 No Oracle, usar a funo NVL!
39 40
SELECT SELECT
 Produto Cartesiano (A x B)  Produto Cartesiano (A x B)
 Combina cada linha de A com cada linha de B, EMPREGADO DEPARTAMENTO
cod nome depto numero nome_depto
gerando A x B linhas 1 Z 3 1 Vendas
2 Joo 1 2 Compras
 Exemplo 3 Maria 3 RH
 SELECT * FROM empregado e, departamento d EMPREGADO x DEPARTAMENTO
cod nome depto numero nome_depto
1 Z 3 1 Vendas
1 Z 3 2 Compras
EMPREGADO DEPARTAMENTO
cod nome depto 1 Z 3 3 RH
numero nome_depto
1 Z 3 2 Joo 1 1 Vendas
1 Vendas 2 Joo 1 2 Compras
2 Joo 1 2 Compras
3 Maria 2 Joo 1 3 RH
3 RH 3 Maria 1 Vendas
3 Maria 2 Compras
3 Maria 3 RH
41 42

SELECT SELECT
 Junes  Junes
 Condio para juno de linhas  Tipos (supondo juno entre tabelas A e B)
 INNER JOIN
 SELECT * FROM empregado e, departamento d  Inclui apenas as linhas de A e B que satisfazem condio de
WHERE e.depto = d.numero juno
 Ir retornar apenas as linhas em destaque!  LEFT OUTER JOIN
EMPREGADO x DEPARTAMENTO  Inclui as linhas de A e B que satisfazem condio de juno e
cod nome depto numero nome_depto as demais linhas de A
1 Z 3 1 Vendas
1 Z 3 2 Compras
 RIGHT OUTER JOIN
1 Z 3 3 RH  Inclui as linhas de A e B que satisfazem condio de juno e
2 Joo 1 1 Vendas as demais linhas de B
2 Joo 1 2 Compras
2 Joo 1 3 RH  FULL OUTER JOIN
3 Maria 1 Vendas  Inclui as linhas de A e B que satisfazem condio de juno e
3 Maria 2 Compras as demais linhas de A e B
3 Maria 3 RH
43 44
SELECT SELECT
 Junes  Junes
 INNER JOIN  LEFT [OUTER] JOIN
 Inclui apenas as linhas de A e B que satisfazem  Inclui as linhas de A e B que satisfazem condio
condio de juno de juno e as demais linhas de A
 SELECT * FROM empregado e INNER JOIN  SELECT * FROM empregado e LEFT JOIN
departamento d ON e.depto = d.numero departamento d ON e.depto = d.numero

EMPREGADO INNER JOIN DEPARTAMENTO EMPREGADO LEFT JOIN DEPARTAMENTO


cod nome depto numero nome_depto cod nome depto numero nome_depto
1 Z 3 3 RH 1 Z 3 3 RH
2 Joo 1 1 Vendas 2 Joo 1 1 Vendas
3 Maria

45 46

SELECT SELECT
 Junes  Junes
 RIGHT [OUTER] JOIN  FULL [OUTER] JOIN
 Inclui as linhas de A e B que satisfazem condio  Inclui as linhas de A e B que satisfazem condio
de juno e as demais linhas de B de juno e as demais linhas de A e B
 SELECT * FROM empregado e RIGHT JOIN  SELECT * FROM empregado e FULL JOIN
departamento d ON e.depto = d.numero departamento d ON e.depto = d.numero

EMPREGADO RIGHT JOIN DEPARTAMENTO EMPREGADO FULL JOIN DEPARTAMENTO


cod nome depto numero nome_depto cod nome depto numero nome_depto
1 Z 3 3 RH 1 Z 3 3 RH
2 Joo 1 1 Vendas 2 Joo 1 1 Vendas
2 Compras 3 Maria
2 Compras
47 48
SELECT SELECT
 Junes  Junes
 Exemplos  Exemplos
 Listar os empregados e os respectivos  Listar os empregados, os respectivos
departamentos departamentos e o gerente do departamento
 SELECT * FROM empregado e  SELECT e.num_matricula, e.nom_empregado,
INNER JOIN departamento d d.nom_depto, ger.nom_empregado
ON e.cod_depto = d.cod_depto FROM empregado e
 Listar os gerentes e o departamento que eles INNER JOIN departamento d
ON e.cod_depto = d.cod_depto
gerenciam INNER JOIN empregado ger
 SELECT e.nom_empregado, d.nom_depto ON d.num_matricula_gerente = ger.num_matricula
FROM empregado e
INNER JOIN departamento d
ON d.num_matricula_gerente = e.num_matricula
49 50

SELECT SELECT
 Junes  Junes
 Filtros em OUTER JOINS  Filtros em OUTER JOINS
 Filtro na clusula ON (condio de juno)  Filtro na clusula WHERE (condio de seleo)
 SELECT d.nom_depto, e.nom_empregado  SELECT d.nom_depto, e.nom_empregado
FROM departamento d FROM departamento d
LEFT JOIN empregado e LEFT JOIN empregado e
ON d.num_matricula_gerente = e.num_matricula ON d.num_matricula_gerente = e.num_matricula
AND e.nom_empregado like 'M% WHERE e.nom_empregado like 'M%
 Este SELECT lista todos os departamentos da tabela de  Este SELECT lista apenas os departamentos da tabela de
departamento e o nome dos gerentes que comeam com departamento cujo nome do gerente que comea com a
a letra M letra M
 Funciona similar ao INNER JOIN

51 52
SELECT SELECT
 Manipulando mais de uma tabela  Consultas aninhadas (subqueries)
 IN, EXISTS, ALL, ANY
 Produto Cartesiano  Verifica se ir exibir uma determinada linha de acordo com o
resultado de uma query aninhada
 Junes (JOINS)  IN
 INNER, OUTER (LEFT, RIGHT, FULL)  Verificar se o valor de uma ou mais colunas esto contidas no
resultado de uma subquery
 Consultas aninhadas (subqueries)  EXISTS
 Verificar se existe pelo menos uma linha retornada pela
 IN, EXISTS, ALL, ANY subquery
 ALL
 Consulta como tabela  Verificar se o valor de uma coluna maior do que todos os
 Consulta como coluna valores retornados por uma subquery
 ANY
 Consulta como filtro  Verificar se o valor de uma coluna maior do que qualquer
valor retornado por uma subquery

53 54

SELECT SELECT
 Consultas aninhadas (subqueries)  Consultas aninhadas (subqueries)
 IN  NOT IN
 Exemplo: Listar os empregados do departamento  Exemplo: Listar os empregados que no so do
de Vendas departamento de Vendas
 Verificar se o departamento de um empregado est  Verificar se o departamento de um empregado no est
contido no resultado de uma consulta que retorna os contido no resultado de uma consulta que retorna os
departamentos cujo nome igual a Vendas departamentos cujo nome igual a Vendas
 SELECT * FROM empregado e  SELECT * FROM empregado e
WHERE e.cod_depto IN WHERE e.cod_depto NOT IN
(SELECT cod_depto FROM departamento (SELECT cod_depto FROM departamento
WHERE nom_depto = Vendas) WHERE nom_depto = Vendas)

55 56
SELECT SELECT
 Consultas aninhadas (subqueries)  Consultas aninhadas (subqueries)
 EXISTS  NOT EXISTS
 Exemplo: Listar os gerentes com pelo menos 1  Exemplo: Listar os empregados que no so
dependente supervisores
 SELECT * FROM empregado e  SELECT e.num_matricula, e.nom_empregado
WHERE EXISTS FROM empregado e
(SELECT 1 FROM dependente dd WHERE NOT EXISTS
WHERE e.num_matricula = dd.num_matricula) (SELECT 1 FROM empregado e1
AND EXISTS WHERE e.num_matricula = e1.num_matricula_supervisor)
(SELECT 1 FROM departamento d
WHERE e.num_matricula = d.num_matricula_gerente)

57 58

SELECT SELECT
 Consultas aninhadas (subqueries)  Consultas aninhadas (subqueries)
 ALL  ANY
 Exemplo: Listar os empregados possuem o salrio  Exemplo: Listar os empregados possuem o salrio
maior do que todos os empregados do departamento maior do que qualquer salrio dos empregados do
com o cdigo 2 departamento com o cdigo 2
 SELECT * FROM empregado e  SELECT * FROM empregado e
WHERE e.val_salario > ALL WHERE e.val_salario > ANY
(SELECT val_salario FROM empregado (SELECT val_salario FROM empregado
WHERE cod_depto = 2) WHERE cod_depto = 2)

59 60
SELECT SELECT
 JOIN x SUBQUERY  Funes agregadas
 Listar o nome dos empregados que tm dependente  COUNT, SUM, MAX, MIN, AVG, ...
 SUBQUERY (IN)
 SELECT e.nom_empregado FROM empregado e  Agrupamento
WHERE e.num_matricula IN
(SELECT num_matricula FROM dependente)  GROUP BY, HAVING
 JOIN
 SELECT e.nom_empregado FROM empregado e
INNER JOIN dependente d
ON e.num_matricula = d.num_matricula
 Qual a diferena?
 Sem JOIN as colunas da tabela dependente no podem ser
exibidas no SELECT
 Com JOIN podem haver nomes duplicados (um nome para cada
dependente do empregado!)
61 62

SELECT SELECT
 Funes agregadas  Funes agregadas
 Calculam um valor escalar a partir de um  COUNT (expresso)
conjunto de linhas  Conta o nmero de linhas de acordo com a
 Funes expresso
 COUNT (expresso)  Exemplo
 Contar o nmero de empregados do departamento de
 SUM (expresso) Vendas
 AVG (expresso) EMPREGADO INNER JOIN DEPARTAMENTO
 MAX (expresso) e.cod e.nome e.salario e.depto d.numero d.nome_depto
1 Z 3.000,00 3 3 RH
 MIN (expresso) 2 Joo 1.500,00 1 1 Vendas 2
3 Maria 800,00 2 2 Compras
 ... 4 Pedro 2.000,00 1 1 Vendas

63 64
SELECT SELECT
 Funes agregadas  Funes agregadas
 COUNT (expresso)  COUNT (expresso)
 Exemplo  Exemplo
 Contar o nmero de empregados do departamento de  Contar o nmero de cdigos de departamentos distintos
Vendas na tabela de empregado
 SELECT COUNT(*)  SELECT COUNT(DISTINCT e.cod_depto)

FROM empregado e FROM empregado e


INNER JOIN departamento d
ON e.cod_depto = d.cod_depto EMPREGADO
AND d.nom_depto = 'vendas' cod nome depto salario
1 Z 3 3.000,00
2 Joo 1 1.500,00
3
3 Maria 2 800,00
4 Pedro 1 2.000,00
65 66

SELECT SELECT
 Funes agregadas  Funes agregadas
 SUM (expresso)  Exemplo
 Soma o valor definido pela expresso  Listar a soma e a mdia dos salrios do
 AVG (expresso) departamento 1; exibir tambm o menor e o maior
salrio
 Calcula a mdia do valor definido pela expresso
 MIN (expresso) EMPREGADO Soma: 4.300,00
cod nome depto salario
 Retorna o menor valor definido pela expresso 1 Z 3 3.000,00 Mdia: 1.433,33
2 Joo 1 1.500,00
 MAX (expresso) 3 Maria 2 800,00 Menor: 800,00
 Retorna o maior valor definido pela expresso 4 Pedro 1 2.000,00
5 Antnio 1 800,00 Maior: 2.000,00

67 68
SELECT SELECT
 Funes agregadas  Funes agregadas
 Exemplo  Outro Exemplo
 Listar a soma e a mdia dos salrios do  Uma empresa quer avaliar para qual valor iria a
departamento 1; exibir tambm o menor e o maior folha de pagamento se aumentasse os salrios do
salrio departamento 1 em 20%. Para isso, listar a soma
 SELECT SUM(e.salario), AVG(e.salario) de 20% de todos os salrios deste departamento
MIN(e.salario), MAX(e.salario)  SELECT SUM(e.salario * 0.2)
FROM empregado e FROM empregado e
WHERE e.depto = 1 WHERE e.depto = 1

69 70

SELECT SELECT
 Agrupamento  Agrupamento
 Geralmente, as funes agregadas so  Geralmente, as funes agregadas so
utilizadas em agrupamentos com GROUP BY utilizadas em conjunto com agrupamentos
 Exemplo  Exemplo
 Listar a mdia e a soma dos salrios por
 Listar a mdia e a soma dos salrios por departamento
departamento  SELECT e.depto,
AVG(e.salario) AS media,
EMPREGADO
cod nome depto salario
SUM(e.salario) AS soma
1 Z 3 3.000,00 depto mdia soma FROM empregado e
2 Joo 1 1.500,00 1 1.433,33 4.300,00 GROUP BY e.depto
2 800,00 800,00
3
4
Maria
Pedro
2
1
800,00
2.000,00 3 3.000,00 3.000,00  Para uma coluna aparecer junto com funes
5 Antnio 1 800,00 agregadas, ela deve estar no GROUP BY!
71 72
SELECT SELECT
 Agrupamento  Filtros de Agrupamento
 Outro Exemplo  Geralmente, podem ser definidos filtros para
 Listar o nmero de empregados por departamento as funes agregadas utilizando-se HAVING
 SELECT e.depto, COUNT(e.cod) AS total  Exemplo
FROM empregado e
GROUP BY e.depto  Listar a mdia e a soma dos salrios por
departamento, quando a soma for > 1.000,00
EMPREGADO EMPREGADO
cod nome depto salario cod nome depto salario
1 Z 3 3.000,00 depto total 1 Z 3 3.000,00
2 Joo 1 1.500,00 1 3 2 Joo 1 1.500,00 depto mdia soma
3 Maria 2 800,00 2 1 3 Maria 2 800,00 1 1.433,33 4.300,00
3 1 4 Pedro 1 2.000,00 3 3.000,00 3.000,00
4 Pedro 1 2.000,00
5 Antnio 1 800,00 5 Antnio 1 800,00
73 74

SELECT SELECT
 Agrupamento  Agrupamento
 Exemplo  Outro Exemplo
 Listar a mdia e a soma dos salrios por  Listar o departamento com mais de 2 empregados
departamento  SELECT d.nome
 SELECT e.depto, FROM empregado e
AVG(e.salario) AS media, INNER JOIN departamento d
SUM(e.salario) AS soma ON e.depto = d.numero
FROM empregado e GROUP BY d.nome
GROUP BY e.depto HAVING COUNT(e.cod) > 2
HAVING SUM(e.salario) > 1000.00  A funo agregada pode aparecer apenas na
 HAVING x WHERE clusula HAVING
 HAVING filtra o resultado de funes agregadas
WHERE filtra linhas de uma tabela
75 76
SELECT SELECT
 Consultas aninhadas (subqueries)  Consultas aninhadas (subqueries)
 Consulta como tabela  Consulta como coluna
 Listar o nome dos empregados com mais de 2  Listar o total de dependentes por empregado
dependentes  SELECT e.nom_empregado,
 SELECT e.nom_empregado, a.total (SELECT COUNT(*)
FROM empregado e FROM dependente d
INNER JOIN WHERE d.num_matricula = e.num_matricula)
(SELECT d.num_matricula, COUNT(*) AS total FROM empregado e
FROM dependente d
GROUP BY d.num_matricula) a
ON e.num_matricula = a.num_matricula  Esta consulta poderia ter sido feita com GROUP BY
WHERE a.total > 2
 Esta consulta poderia ter sido feita com HAVING
77 78

SELECT SELECT
 Consultas aninhadas (subqueries)  Operaes de conjunto
 Consulta como filtro  UNION
 Listar o nome dos empregados com mais de 2  Unio entre os conjuntos A e B inclui os elementos
dependentes de A e B
 SELECT e.nom_empregado  UNION ALL inclui duplicados
FROM empregado e  A e B devem ter a mesma estrutura (nmero de
WHERE
(SELECT COUNT(*) colunas e mesmo tipo de dados)
FROM dependente d
WHERE d.num_matricula = e.num_matricula) > 2
 Esta consulta poderia ter sido feita com HAVING

79 80
SELECT SELECT
 Operaes de conjunto  Operaes de conjunto
 UNION  INTERSECT
 Exemplo  Interseo entre os conjuntos A e B inclui os
 Listar todos os nomes de empregados e dependentes elementos comuns entre A e B
 SELECT e.nom_empregado FROM empregado e  A e B devem ter a mesma estrutura (nmero de
UNION colunas e mesmo tipo de dados)
SELECT d.nom_dependente FROM dependente d
 Listar todos os nomes (incluindo linhas duplicadas) de  Exemplo
empregados e dependentes  Listar os empregados que tm dependentes
 SELECT e.nom_empregado FROM empregado e  SELECT e.num_matricula FROM empregado e

UNION ALL INTERSECT


SELECT d.nom_dependente FROM dependente d SELECT d.num_matricula FROM dependente d

81 82

SELECT INSERT
 Operaes de conjunto  Insero de linhas em uma tabela
 EXCEPT  Sintaxe
 Diferena entre os conjuntos A e B inclui os  INSERT INTO <tabela>
elementos de A que no esto em B VALUES (lista de valores)
 A e B devem ter a mesma estrutura (nmero de  Exemplo
colunas e mesmo tipo de dados)  INSERT INTO EMPREGADO
 Exemplo VALUES (1,Joo,Av Afonso Pena 33,2,1970-02-
 Listar os empregados que no tm dependentes 03, 1500.00,M)
 SELECT e.num_matricula FROM empregado e
 INSERT INTO DEPARTAMENTO
EXCEPT
SELECT d.num_matricula FROM dependente d VALUES (2,Vendas,1)

83 84
INSERT INSERT
 Insero de linhas em uma tabela  Insero de linhas em uma tabela
 Sintaxe  Sintaxe
 INSERT INTO <tabela> (colunas)  INSERT INTO <tabela> [(colunas)]
VALUES (lista) SELECT... FROM... WHERE
 Exemplo  Exemplo
 INSERT INTO EMPREGADO (MAT, NOME, SEXO)  INSERT INTO EMPREGADO2 (MAT, NOME, SEXO)
VALUES (1,Maria,F) SELECT MAT, NOME, SEXO
 INSERT INTO DEPARTAMENTO (COD,NOME) FROM EMPREGADO
VALUES (1,Vendas)  INSERT INTO DEPARTAMENTO
 Colunas no referenciadas devem ser NULL ou SELECT COD, NOME, GERENTE
FROM DEPARTAMENTO_BACKUP
possuir ter DEFAULT ou campo IDENTITY
85 86

DELETE DELETE
 Excluso de linhas de uma tabela  Excluso de linhas de uma tabela
 Sintaxe  Sintaxe
 DELETE FROM <tabela>  DELETE FROM <tabela>
WHERE <condio> WHERE <coluna> [NOT] IN
 Exemplo (SELECT <coluna> FROM ... WHERE ...)
 DELETE FROM EMPREGADO  Exemplo
 DELETE FROM DEPARTAMENTO  DELETE FROM EMPREGADO
WHERE COD = 1 WHERE MAT IN (SELECT MAT FROM DEPENDENTE)
 DELETE FROM EMPREGADO  DELETE FROM DEPARTAMENTO WHERE COD
WHERE UF = MG NOT IN (SELECT DEPTO FROM EMPREGADO)
AND CIDADE = PIRAPORA
87 88
DELETE UPDATE
 Excluso de linhas de uma tabela  Atualizao de valores das colunas
 Sintaxe  Sintaxe
 DELETE <alias>  UPDATE <tabela>
FROM <tabela> JOIN ... SET <coluna>=<valor> [, <coluna>=<valor>]
WHERE <condio> WHERE <condio>
 Exemplo  Exemplo
 Remover todos os empregados que possuem cnjuge  Aumentar em 20% o salrio dos empregados do
cadastrado como dependente departamento 3 e transferi-los para o depto 5
 DELETE E  UPDATE EMPREGADO
FROM EMPREGADO AS E SET DEPTO=5, SALARIO = SALARIO * 1.2
INNER JOIN DEPENDENTE AS D ON E.MAT = D.MAT WHERE DEPTO = 3
WHERE D.PARENTESCO = CONJUGE 89 90

UPDATE UPDATE
 Atualizao de valores das colunas  Atualizao de valores das colunas
 Sintaxe  Sintaxe
 UPDATE <tabela>  UPDATE <alias>
SET <coluna>=<valor> [, <coluna>=<valor>] SET <coluna>=<valor> [, <coluna>=<valor>]
WHERE <atributo> [NOT] IN FROM <tabela> JOIN ...
(SELECT... FROM... WHERE...) WHERE <condio>
 Exemplo  Exemplo
 Reduzir 15% do salrio dos empregados que no  Aumentar 15% para empregados com dependentes
possuem dependentes  UPDATE E
 UPDATE EMPREGADO SET SALARIO = SALARIO * 1.15
SET SALARIO = SALARIO * 0.85 FROM EMPREGADO AS E
WHERE MAT NOT IN INNER JOIN DEPENDENTE AS D
(SELECT MAT FROM DEPENDENTE) ON E.MAT = D.MAT
91 92
UPDATE SELECT INTO
 Atualizao de valores das colunas  Salvar o resultado de um SELECT para uma
 Sintaxe nova tabela
 UPDATE <tabela>  Sintaxe
SET <coluna>=<SELECT...>  SELECT <lista de colunas>
WHERE <condio> INTO <nova tabela>
 Exemplo FROM <tabela> ...
 Atualizar o salrio dos empregados do departamento 5  Exemplo
com o maior salrio do departamento 3  SELECT MAT, NOME
 UPDATE EMPREGADO INTO APENAS_HOMENS
SET SALARIO = (SELECT MAX(SALARIO) FROM FROM EMPREGADO WHERE SEXO = M
EMPREGADO WHERE DEPTO = 3)  SELECT * FROM APENAS_HOMENS
WHERE DEPTO = 5 93 94

Vises Vises
 Viso (view) em SQL uma tabela derivada de  Sintaxe
outras tabelas (definidas no esquema) ou de
outras vises previamente definidas  CREATE VIEW <nome>
AS
 Uma viso pode ser considerada como um tabela
virtual, pois no necessariamente existe SELECT... FROM... WHERE...
fisicamente GROUP BY... HAVING...
 As operaes de atualizao so mais limitadas  Exemplo
 Uma aplicao para as vises disponibilizar  CREATE VIEW VW_SUPERVISORES
consultas utilizadas freqentemente AS SELECT * FROM EMPREGADO
 Vises simplificam a interface com o usurio e WHERE MAT IN
podem ser usadas como mecanismos de (SELECT MAT_SUP FROM EMPREGADO)
segurana
95 96
Vises
 Utilizao
 Acessar a viso por meio do comando SELECT
como se fosse uma tabela comum
 Pode ser usada em JOINS etc.
 Exemplo
 SELECT * FROM VW_SUPERVISORES
 Remoo
 DROP VIEW <nome>
 DROP VIEW VW_SUPERVISORES
97

Você também pode gostar