Sei sulla pagina 1di 64

SQL (Structured Query Language)

SQL
Linguagem para:
Definio de dados: criao das estruturas
Data Definition Language (DDL)
Manipulao de dados: atualizao e consultas
Data Manipulation Language (DML)
Manipulao de Dados
Define operaes de manipulao de dados:
INSERT
UPDATE
DELETE
SELECT

Possui instrues declarativas:


manipulao de conjuntos
especifica-se o que fazer e no como fazer
Inseres, Alteraes e Excluses
SQL Insert

Insero de dados
INSERT INTO nome_tabela [(lista_atributos)]
VALUES (lista_valores_atributos)
[, (lista_valores_atributos)]

Exemplos
INSERT INTO Ambulatorios VALUES (1, 1, 30)
INSERT INTO Medicos
(codm, nome, idade, especialidade, CPF, cidade)
VALUES (4, Carlos, 28,ortopedia,
11000110000, Joinville);
SQL Insero a partir de outra tabela

Insero de dados
Permite inserir em uma tabela dados de outra tabela
A nova tabela ter os mesmos atributos, com os mesmos
domnios

Exemplos
INSERT into cliente as
SELECT * from funcionario
SQL Update
Alterao de dados
UPDATE nome_tabela
SET nome_atributo_1 = Valor
[{, nome_atributo_n = Valor}]
[WHERE condio]

Exemplos
UPDATE Medico
SET cidade = Florianopolis

UPDATE Ambulatorios
SET capacidade = capacidade + 5, andar = 3
WHERE codigo_area = 2
SQL DML
Excluso de dados
DELETE FROM nome_tabela
[WHERE condio]

Exemplos
DELETE FROM Ambulatorios

DELETE FROM Medicos


WHERE especialidade = cardiologia
or cidade < > Florianopolis
Consultas: SELECT
Estrutura Bsica
Uma consulta em SQL tem a seguinte forma:

select A1, A2, ..., An


from r1, r2, ..., rm
where P

Ai representa um atributo
Ri representa uma tabela
P um predicado

O resultado de uma consulta SQL sempre no formato de


tabela.
Estrutura Bsica: resumindo.
SELECT lista de atributos desejados
FROM uma ou mais tabelas
WHERE com restries sobre atributos

Exemplo: encontre o nome e o salrio dos funcionarios da relao


funcionrio

SELECT nome, salario


FROM funcionario
Distinct
O SQL permite duplicatas em relaes e resultados em consultas

Para eliminar duplatas, usa-se a clusula DISTINCT depois do SELECT

Exemplo: SELECT distinct nome


FROM funcionario
A clusula *
O asterisco na clusula SELECT denota TODOS OS ATRIBUTOS
SELECT *
FROM funcionario

Expresses artitmticas podem ser usadas na clusula SELECT


+, , , /

Exemplo: SELECT nome, salario + 200


FROM funcionario
A clusula FROM
Equivale a operao de Produto Cartesiano da lgebra

Lista as relaes envolvidas na consulta

Exemplo: SELECT
FROM funcionario, departamento
A clusula FROM
Quando mais de uma tabela utilizada necessrio dar um
apelido para elas que deve ser utilizado para diferenciar atributos
iguais (com mesmo nome).

Exemplo: SELECT f.
FROM funcionario f, departamento d
WHERE f.codDepto = d.codDepto
A clusula WHERE
A clusula where especifica as condies que o resultado precisa
satisfazer
Corresponde ao predicado de seleo da lgebra

Exemplo: SELECT nome, salario


FROM funcionario
WHERE salario > 2000

operadores AND, OR e NOT podem ser usados


Exemplo: SELECT nome, salario
FROM funcionario
WHERE salario > 2000 AND idade < 30
Renomeando atributos

Renomeao de atributos
old-name as new-name

Exemplo: SELECT nome as nomeCliente, (salario+200) as comissao


FROM funcionario
Operaes com Strings
O SQL permite comparar strings com o operador like
Pode ser combinado com outros caracteres
% compara substrings

Exemplo I: encontre o nome dos funcionarios cujos nomes
iniciam com Pedro
select nome
from funcionario
where nome like 'Pedro%'
Exemplo II: encontre o nome dos funcionarios cujos nomes
contm Pedro no nome
select nome
from funcionario
where nome like %Pedro%'
Operaes de Conjunto
Envolvem ao menos 2 tabelas
Interseo e Unio: elimina automaticamente
repeties
Relaes precisam ser compatveis (mesmo nmero
de atributos e tipos)
Union ALL e intersects ALL preservam duplicatas
Encontre os clientes que tenham emprstimos e contas (as duas coisas):
(select nome from conta)
intersect
(select nome from emprestimo)
Encontre os clientes que tenham emprstimos e/ou contas (um ou os dois):
(select nome from conta)
union
(select nome from emprestimo)
Ordenando tuplas com Order By
Exemplo: Liste em ordem alfabtica os funcionarios que trabalham no
departamento financeiro sem repetir:
select distinct funcionario.nome
from funcionario, departamento
where funcionario.codDepto=departamento.codDepto
AND departamento.nome=financeiro
order by funcionario.nome

Order by pode ser em ordem descendente


Exemplo: order by nome desc
Funes de Agregao
Realizam uma operao sobre mltiplos
valores de uma coluna da tabela e
retornam um valor:
avg: mdia
min: valor mnimo
max: valor mximo
sum: soma de valores
count: nmero de valores
Funes de Agregao

Exemplos:

Encontre o nmero de tuplas da relao CLIENTE

select count(*)
FROM cliente

Encontre a soma dos salarios dos funcionarios

select SUM(salario)
FROM funcionario
Funes de Agregao e Group By
Encontre o total de funcionarios de cada departamento

select d.nome, count(f.*) as numeroFuncionarios


FROM funcionario f, departamento d
WHERE f.codDepto=d.codDepto
GROUP BY d.nome

Nota: Atributos na clusula SELECT que esto FORA da funo de


agregao precisam aparecer na lista de atributos do GROUP BY
Funes de Agregao e Having
A funo HAVING utilizada para aplicar condies sobre
grupos e no sobre uma nica tupla
Exemplo: Quais so os departamentos onde a soma dos
salrios dos funcionrios ultrapassa 50.000

select d.nome, sum(f.salario)


from funcionario f, departamento d
where f.codDepto=d.codDepto
group by d.nome
having sum (f.salario) > 50.000

Nota: predicados da clusula having so aplicados depois que os grupos


foram gerados, mas a condio do where aplicada antes da formao dos
grupos
Consultas Aninhadas
Uma subconsulta select-from-where est
aninhada dentro de outra consulta
Exemplo: Selecione os clientes que so
funcionrios
select nomeCliente
From cliente
Where nomeCliente in (select nomeFuncionario
from funcionario)
Valores nulos
Consulta sobre valores inexistentes
Exemplo: Encontre os funcionarios que no
possuem carteira de habilitao
select nome
from funcionario
where carteiraHabilitacao is null

OBS: cuidado que valores nulos em


operaes matemticas podem dar
problemas
JOINs
JOINs podem ser usados
para combinar tabelas: A CROSS JOIN B
Existem diversos tipos de Une cada linha de A com
JOINS: cada linha de B.
CROSS JOIN
A NATURAL JOIN B
INNER JOIN
NATURAL JOIN
Une linhas que possuem
valores idnticos em campos
OUTER JOIN
de mesmo nome.
OUTER JOINs retornam
linhas mesmo quando a outra A INNER JOIN B
tabela no possui um registro Retorna pares de linhas
compatvel. satisfazendo uma condio
em comum.
CROSS JOIN

Student SELECT * FROM


ID Name Student CROSS JOIN
123 John Enrolment
124 Mary
125 Mark ID Name ID Code
126 Jane 123 John 123 DBS
124 Mary 123 DBS
Enrolment 125 Mark 123 DBS
ID Code 126 Jane 123 DBS
123 John 124 PRG
123 DBS 124 Mary 124 PRG
124 PRG 125 Mark 124 PRG
124 DBS 126 Jane 124 PRG
126 PRG 123 John 124 DBS
124 Mary 124 DBS
NATURAL JOIN

Student SELECT * FROM


ID Name Student NATURAL JOIN
123 John
Enrolment
124 Mary
125 Mark
126 Jane ID Name Code

Enrolment 123 John DBS


124 Mary PRG
ID Code 124 Mary DBS
123 DBS 126 Jane PRG
124 PRG
124 DBS
126 PRG
CROSS and NATURAL JOIN
SELECT * FROM
A CROSS JOIN B SELECT * FROM
o mesmo que: A NATURAL JOIN B

SELECT * FROM A, B o mesmo que:


SELECT A.col1, A.coln,
Ou seja, produto cartesiano. B.col1,B.coln
FROM A, B
WHERE A.col1 = B.col1
AND A.col2 = B.col2
...AND A.coln = B.col.n
(assumindo que A.col1 e
B.col1 tm nomes iguais. O
mesmo vale para col2,
INNER JOIN
Ou:
INNER JOINs SELECT * FROM
especificam uma condio A INNER JOIN B
que pares de linhas de duas
USING
tabelas devem satisfazer.
(col1, col2,)
SELECT * FROM Escolhe linhas onde as
colunas informadas
A INNER JOIN B possuem valores iguais
ON <condio> (colunas com mesmo
nome).
INNER JOIN

Student SELECT * FROM


ID Name Student INNER JOIN
123 John
Enrolment USING (ID)
124 Mary
125 Mark ID Name ID Code
126 Jane 123 John 123 DBS
Enrolment 124 Mary 124 PRG
124 Mary 124 DBS
ID Code 126 Jane 126 PRG
123 DBS
124 PRG
124 DBS
126 PRG
INNER JOIN
SELECT * FROM Buyer INNER JOIN Property ON Price <= Budget
Buyer
Name Budget
Smith 100,000
Jones 150,000
Green 80,000

Property Name Budget Address Price

Address Price Smith 100,000 15 High St 85,000


Jones 150,000 15 High St 85,000
15 High St 85,000 Jones 150,000 12 Queen St 125,000
12 Queen St 125,000
87 Oak Row 175,000
JOINs vs WHERE Clauses
JOINS no so estritamente JOINS so usados para criar
necessrios pois pode-se consultas mais concisas.
fazer a mesma coisa usando NATURAL JOINs so
somente clusulas WHERE.
muito comuns.
Por que usar JOINS?
Um problema de usar JOINS
que o seu uso e sintaxe
pode variar entre dialetos
diferentes de SQL.
VIEWS (VISES)

Prof. Marcos Alexandruk


VIEWS

Uma viso uma consulta baseada em uma ou mais


tabelas (denominadas tabelas base)

As consultas que acessam vises so realizadas da


mesma maneira que as consultas em tabelas: basta incluir o
nome da viso na clusula WHERE.

possvel realizar operaes DML (INSERT, UPDATE E


DELETE) em tabelas base atravs das vises (a view deve ser
de uma tabela apenas).
VIEWS

Por que utilizar vises?


VIEWS

Vises ajudam a melhorar a segurana no acesso aos dados.


---------------------------------------
TABELA: FUNCIONARIO
---------------------------------------
CODFUN NOME DEPTO SALARIO
---------------------------------------
1001 FULANO ENGENHARIA 5200
1002 BELTRANO MARKETING 3800
1003 CICRANO JURDICO 4600

-----------------------------
VISAO: FUNCIONARIO_VIEW
-----------------------------
CODCLI NOME DEPTO
-----------------------------
1001 FULANO ENGENHARIA
1002 BELTRANO MARKETING
1003 CICRANO JURDICO

Pode-se conceder acesso somente s vises e impedir a realizao de consultas


diretamente nas tabelas.
VIEWS

Vises facilitam a realizao de consultas complexas baseadas em


duas ou mais tabelas.
Podem ser usadas para acelerar certos SQLs. Por exemplo, pode ser
uma alternativa a subconsultas com IN ou EXISTS.
--------------------- ------------------
TABELA: CLIENTE TABELA: PEDIDO
--------------------- ------------------ SELECT C.UF, SUM(P.VALOR)
CODCLI NOME UF NR VALOR CODCLI FROM CLIENTE C
--------------------- ------------------ INNER JOIN PEDIDO P
1001 FULANO SP 1 4800 1002 ON C.CODCLI = P.CODCLI
1002 BELTRANO RJ 2 3600 1003 GROUP BY C.UF;
1003 CICRANO SP 3 5500 1001

--------------------------------
VISAO: CLIENTE_PEDIDO_VIEW
-------------------------------- SELECT UF, SUM(VALOR)
CODCLI NOME UF NR VALOR FROM CLIENTE_PEDIDO_VIEW
-------------------------------- GROUP BY UF;
1001 FULANO SP 1 4800
1002 BELTRANO RJ 2 3600
1003 CICRANO SP 3 5500
VIEWS >>> EXERCCIO 1 <<<

Criar a tabela e a viso conforme exemplo abaixo:


NOTA: Criar a viso com restrio READ ONLY.
---------------------------------------
TABELA: FUNCIONARIO
---------------------------------------
CODFUN NOME DEPTO SALARIO
---------------------------------------
1001 FULANO ENGENHARIA 5200
1002 BELTRANO MARKETING 3800
1003 CICRANO JURDICO 4600

-----------------------------
VISAO: FUNCIONARIO_VIEW
-----------------------------
CODFUN NOME DEPTO
-----------------------------
1001 FULANO ENGENHARIA
1002 BELTRANO MARKETING
1003 CICRANO JURDICO
VIEWS >>> EXERCCIO 1 <<<

Criar a tabela e a viso conforme exemplo abaixo:


NOTA: Criar a viso com restrio READ ONLY.
---------------------------------------
TABELA: FUNCIONARIO
---------------------------------------
CODFUN NOME DEPTO SALARIO
---------------------------------------
1001 FULANO ENGENHARIA 5200
1002 BELTRANO MARKETING 3800
1003 CICRANO JURDICO 4600

-----------------------------
VISAO: FUNCIONARIO_VIEW
----------------------------- CREATE VIEW FUNCIONARIO_VIEW AS
CODFUN NOME DEPTO SELECT CODFUN, NOME, DEPTO
----------------------------- FROM FUNCIONARIO
1001 FULANO ENGENHARIA WITH READ ONLY CONSTRAINT FUNC_READ_ONLY;
1002 BELTRANO MARKETING
1003 CICRANO JURDICO
VIEWS >>> EXERCCIO 2 <<<

Criar as tabelas e a viso conforme exemplo abaixo:


--------------------- ------------------
TABELA: CLIENTE TABELA: PEDIDO
--------------------- ------------------
CODCLI NOME UF NR VALOR CODCLI
--------------------- ------------------
1001 FULANO SP 1 4800 1002
1002 BELTRANO RJ 2 3600 1003
1003 CICRANO SP 3 5500 1001

--------------------------------
VISAO: CLIENTE_PEDIDO_VIEW
--------------------------------
CODCLI NOME UF NR VALOR
--------------------------------
1001 FULANO SP 1 4800
1002 BELTRANO RJ 2 3600
1003 CICRANO SP 3 5500
VIEWS >>> EXERCCIO 2 <<<

Criar as tabelas e a viso conforme exemplo abaixo:


--------------------- ------------------
TABELA: CLIENTE TABELA: PEDIDO
--------------------- ------------------
CODCLI NOME UF NR VALOR CODCLI
--------------------- ------------------
1001 FULANO SP 1 4800 1002
1002 BELTRANO RJ 2 3600 1003
1003 CICRANO SP 3 5500 1001

--------------------------------
VISAO: CLIENTE_PEDIDO_VIEW
-------------------------------- CREATE VIEW CLIENTE_PEDIDO_VIEW AS
CODCLI NOME UF NR VALOR SELECT C.CODCLI, C.NOME, C.UF,
-------------------------------- P.NR, P.VALOR
1001 FULANO SP 1 4800 FROM CLIENTE C
1002 BELTRANO RJ 2 3600 INNER JOIN PEDIDO P
1003 CICRANO SP 3 5500 ON C.CODCLI = P.CODCLI;
INDEXES (NDICES)

Prof. Marcos Alexandruk


INDEXES

ndices permitem acesso mais rpido s linhas de uma


tabela quando se consulta a mesma tabela atravs de uma
ou mais colunas especficas.

Portanto, os ndices criam estruturas de dados internas


ao banco de dados que armazenam os valores das colunas
que esto sendo indexadas juntamente com o RowID fsico
da respectiva linha.
INDEXES

Existem diversos tipos de ndices, especficos para cada


tipo de tabela, mtodo de acesso ou ambiente de aplicao.

Os principais tipos de ndices so:

ndices nicos;
ndices no nicos;
ndices de chave invertida;
ndices baseados em funes;
Etc.
INDEXES

ndices nicos (exclusivos)

Os ndices nicos so os mais comuns do tipo rvore B e so


utilizados principalmente para impor a constraint Primary Key de
uma tabela. Este tipo de ndice garante que no existiro valores
duplicados na coluna ou nas colunas indexadas.
CREATE TABLE nome_da_tabela (
nome_coluna_1 tipo_de_dado(tamanho),
...
CONSTRAINT nome_da_constraint PRIMARY KEY(nome_da_coluna_1)
);

CREATE [UNIQUE] INDEX nome ON tabela(colunas);

CREATE INDEX idx on usuarios (nome);


INDEXES

ndices no nicos (no exclusivos)

Os ndices no nicos, apesar de no imporem exclusividade de


valores, aceleram o acesso aos dados quando a consulta for realizada
utilizando-se como parmetro a coluna ou as colunas indexadas.
Pode-se, por exemplo, criar um ndice deste tipo na coluna NOME de
uma tabela denominada CLIENTE para localizar mais rapidamente os
dados de um cliente a partir de seu nome.
CREATE INDEX nome_do_indice ON nome_da_tabela(nome_da_coluna);
INDEXES

ndices de chave invertida


Todos os bytes no valor de chave so invertidos nos ndices de chave
invertida. Por exemplo, para o nmero de pedido 1234 o ndice de
chave invertida armazenar como 4321. Um de seus principais objetivos
evitar disputas em sistemas multiusurios. Quando muitos usurios
estiverem inserindo simultaneamente linhas com chaves baseadas em
valores que aumentam sequencialmente, todas as suas inseres de
ndice so concentradas na extremidade mais alta do ndice. Optando-
se por ndices de chave invertida, as inseres de chave de ndice
consecutiva so distribudas por todo o intervalo do ndice.
CREATE INDEX nome_do_indice ON nome_da_tabela(nome_da_coluna)
REVERSE;
Quando Criar ndices?
A coluna usada freqentemente nas
clusulas WHERE ou em joins
A coluna contm inmeros valores distintos
A coluna contm muitos NULL
A tabela tem muitas linhas e as consultas
normalmente retornam poucas linhas
Quando no Criar ndices?
A tabela pequena
As colunas no aparecem em condies ou
joins
As consultas retornam muitas linhas
A tabela atualizada muito freqentemente
Triggers
O que ?
um procedimento associado a uma tabela (gatilho);

sempre disparado para responder algum evento

previsto:
Comandos DML (INSERT, REPLACE, DELETE ou UPDATE)
Vrios triggers podem ser criados em um mesmo BD.
Os triggers podem ser disparados antes ou depois de eventos.
Triggers
CREATE TRIGGER `atualizaHistorico` AFTER UPDATE ON `funcionario`
FOR EACH ROW
BEGIN
if(old.status = 'd') then
if(new.statuss = 'a') then
INSERT INTO historicoFuncionario
SET codHistoricoFuncionario = NULL,
codFuncionario = OLD.codFuncionario,
dataAdmissao = NOW(),
dataDemissao = null;
end if;
end if;
if(old.statuss = 'a') then
if(new.statuss = 'd') then
call demiteFuncionario(OLD.codFuncionario);
end if;
end if;
END;
Triggers
CREATE TRIGGER `admiteFuncioanario` AFTER INSERT ON `funcionario`
FOR EACH ROW
BEGIN
INSERT INTO historicoFuncionario SET
codHistoricoFuncionario = NULL,
codFuncionario = new.codFuncionario,
dataAdmissao = NOW(),
dataDemissao = null;
END
Triggers
CREATE TRIGGER `atualizaProdutosVendidos` BEFORE INSERT ON `pedido`
FOR EACH ROW
BEGIN
call updateProduto(new.quantidade,new.codProduto);

set new.valorPedido = (select p.preco


from produto as p
where p.codProduto = new.codProduto) * new.quantidade;
END
Stored Procedure
O que ?
um conjunto de comandos SQL que podem ser armazenados
no servidor.
Os clientes no precisam reenviar os comandos individuais mas
podem fazer referncia s stored procedures (SP).
Podem fornecer um aumento de desempenho:
J que menos informao enviada ao servidor, visto que, os
SPs ficam no prprio servidor.
Em contra partida, pode gerar lentido no banco de dados se
existirem muitos acessos, j que, SPs favorecem o uso de
processos Servidor bound.
Stored Procedure
CREATE PROCEDURE `demiteFuncionario`(IN `codFuncioarioEntrada` INT)
LANGUAGE SQL
NOT DETERMINISTIC (determinstico: no repete para os mesmos parmetros)
CONTAINS SQL
SQL SECURITY DEFINER (verifica permisses antes e depois da transo).
COMMENT ''
BEGIN
update historicoFuncionario set dataDemissao = now() where
codFuncionario = codFuncioarioEntrada;
END
Stored Procedure
CREATE PROCEDURE `updateProduto`(IN `var` INT, IN `codP` INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
UPDATE produto
SET quantidadeEstoque = quantidadeEstoque - var
WHERE codProduto = codP;
END;
Comando Commit
O comando COMMIT usado para confirmar as
alteraes realizadas no banco de dados
Uma vez realizada operaes de incluso, alterao e
excluso, as modificaes no estaro ainda no
Banco de Dados.
Elas so visveis apenas na seo atual.
Para que os comandos acima descritos seja,
definitivamente, concretizados no banco de dados,
necessrio utilizarmos o comando COMMIT.
Comando Rollback
ROLLBACK usado para desfazer alteraes feitas no
banco de dados durante uma transao (seo atual)
Uma vez realizadas operaes de incluso, alterao
e excluso, as modificaes no estaro ainda
efetivas no Banco de Dados.
Elas so visveis apenas na seo atual.
Para que as operaes feitas anteriormente na
mesma seo sejam descartadas ser necessrio
utilizarmos o comando ROLLBACK.
Storage procedure
A utilizao de Stored Procedures uma tcnica eficiente
para executar operaes repetitivas de forma atmica.
Ao invs de digitar os comandos cada vez que
determinada operao necessite ser executada, criamos
uma Stored Procedure e a chamamos.
Em uma Stored Procedure, tambm podemos ter
estruturas de controle e deciso, tpicas das linguagens
de programao.
Em termos de desenvolvimento de aplicaes, tambm
temos vantagens com a utilizao da mesma.
Exerccios
Explique a sintaxe e funcionamento dos
comandos insert, update e delete.
Como funciona o comando create table e
criao de chave primria?
O que uma chave estrangeira?
Qual o comando usado para apagar uma base
de dados inteira?
Quais so e para que servem as clausulas que
podem ser usadas no comando Select?
Exerccios
Criar uma tabela Pessoa com (id_p, nome, idade).
Criar uma tabela Funcionario com (id_p, id_setor).
Criar uma tabela Setor com (id_setor, setor).
Buscar todas as Pessoas que so funcionrios.
Buscar todas as Pessoas que no so funcionrios.
Buscar todas as pessoas e trazer seus dados de
funcionrio quando houver.
Buscar todas as pessoas que so funcionrios
juntamente com os dados de seu setor.
Contar quantos funcionrios trabalham por setor.
Exerccios
Criar o diagrama ER e o banco de dados para a
seguinte especificao:
H uma loja de venda de roupas, e a loja tem nome, cnpj,
e nome e telefone do proprietrio.
H clientes, e cada cliente tem nome, cpf, telefone fixo,
telefone celular, data de cadastro.
H vendas, e cada venda est relacionada a um vendedor
a um cliente especfico. A venda possui itens que
armazenam o valor e quantidade vendidos do produto.
O sistema precisa que armazene informaes de produto
como nome, descrio e tipo.

Potrebbero piacerti anche