Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila de SQL (USP)
Apostila de SQL (USP)
CREATE TABLE
O comando CREATE TABLE cria a tabela solicitada e obedece seguinte forma:
CREATE TABLE <tabela>
(<descrio das colunas>),
(<descrio das chaves)
onde:
<tabela> - o nome da nova tabela a ser criada
<descrio das colunas> - uma lista de colunas (campos) e seus respectivos tipos
de dados. (smallint, char, money, varchar, integer, decimal, float, real, date, time, logical)
<descrio das chaves> - a lista de colunas que so tratadas como chave
estrangeira.
Alguns campos podem receber o valor NULL (nulo) e o campo definido como chave
primria, alm de no poder receber NULL, deve ser um campo UNIQUE (sem repeties
chave primria). Para o banco de dados estudado anteriormente temos os seguintes
comandos:
CREATE TABLE CLIENTE (
CODIGO_CLIENTE SMALLINT NOT NULL UNIQUE,
NOME_CLIENTE CHAR(20),
ENDERECO CHAR(30),
CIDADE CHAR(15),
CEP CHAR(8),
UF CHAR(2),
CGC CHAR(20),
IE CHAR(20),
PRIMARY KEY (CODIGO_CLIENTE)
)
CREATE TABLE PEDIDO (
NUM_PEDIDO INT NOT NULL UNIQUE,
PRAZO_ENTREGA SMALLINT NOT NULL,
CODIGO_CLIENTE SMALLINT NOT NULL,
CODIGO_VENDEDOR SMALLINT NOT NULL,
PRIMARY KEY (NUM_PEDIDO),
FOREIGN KEY (CODIGO_CLIENTE) REFERENCES CLIENTE,
FOREIGN KEY (CODIGO_VENDEDOR) REFERENCES VENDEDOR
)
CREATE TABLE ITEM_DO_PEDIDO (
NUM_PEDIDO INT NOT NULL UNIQUE,
CODIGO_PRODUTO SMALLINT NOT NULL UNIQUE,
QUANTIDADE DECIMAL,
FOREIGN KEY (NUM_PEDIDO) REFERENCES PEDIDO,
FOREIGN KEY (CODIGO_PRODUTO) REFERENCES PRODUTO,
PRIMARY KEY (NUM_PEDIDO,CODIGO_PRODUTO)
)
2
CREATE TABLE VENDEDOR (
CODIGO_VENDEDOR SMALLINT NOT NULL UNIQUE,
NOME_VENDEDOR CHAR(20),
SALARIO_FIXO MONEY,
FAIXA_COMISSAO CHAR(1),
PRIMARY KEY (CODIGO_VENDEDOR)
)
CREATE TABLE PRODUTO (
CODIGO_PRODUTO SMALLINT NOT NULL UNIQUE,
UNIDADE CHAR(3),
DESCRICAO_PRODUTO CHAR(30),
VAL_UNIT MONEY,
PRIMARY KEY (CODIGO_PRODUTO)
)
DROP TABLE
Para eliminar uma tabela criada utilizado o comando DROP:
DROP TABLE <tabela>
ATUALIZANDO UM REGISTRO
UPDATE <tabela>
SET <nome da(s) coluna(s)> = VALOR
WHERE <CONDICOES>
P. Acrescentar 2,5% ao preo unitrio dos produtos que estejam abaixo da mdia dos
preos, para os aqueles comprados a quilo.
R. UPDATE PRODUTO SET VAL_UNIT = VAL_UNIT * 1.025 WHERE VAL_UNIT < (SELECT
AVG(VAL_UNIT) FROM PRODUTO WHERE UNIDADE = KG)
SELECT
3
Uma das operaes mais comuns, realizadas sobre um banco de dados a de examinar
(selecionar) as informaes armazenadas. Neste item iremos mostrar vrias situaes de
utilizao do comando SELECT.
Selecionando colunas especficas da tabela:
SELECT <NOME(S) DA(S) COLUNA(S)> FROM <TABELA>
P. Listar os produtos que tenham unidade igual a M e valor unitrio igual a R$ 1,05
R. SELECT DESCRICAO_PRODUTO FROM PRODUTO WHERE UNIDADE = M AND VAL_UNIT
= 1.05
4
P. Listar todos os pedidos que no tenham prazo de entrega igual a 15 dias
R. SELECT NUM_PEDIDO FROM PEDIDO WHERE NOT (PRAZO_ENTREGA = 15)
P. Listar o cdigo e a descrio dos produtos que tenham o valor unitrio na faixa de R$
0,32 at R$ 2,00
R. SELECT CODIGO_PRODUTO,
VAL_UNIT BETWEEN 0.32 AND 2.00
DESCRICAO_PRODUTO
FROM
PRODUTO
WHERE
Os operadores LIKE e NOT LIKE s trabalham sobre colunas que sejam do tipo CHAR.
Eles tm praticamente o mesmo funcionamento que os operadores = e <>, porm o poder
desses operadores est na utilizao dos smbolos (%) e (_) que podem fazer o papel de
curinga.
% - substitui um conjunto de letras
_ - substitui um caractere
DESCRICAO_PRODUTO
FROM
PRODUTO
WHERE
VENDEDOR
WHERE
NOME_VENDEDOR
FROM
Quando se realiza uma seleo, os dados recuperados no esto ordenados. O SQL prev a
clusula ORDER BY para realizar uma ordenao dos dados selecionados.
SELECT <NOME(S) DA(S) COLUNA(S)> FROM <TABELA>
WHERE <RESTRIES>
ORDER BY <NOME DA(S) COLUNA(S)> ASC |
ORDER BY <NMERO DA(S) COLUNA(S)> DESC
A informao <nmero da coluna> se refere posio relativa das colunas quando for
apresentado o resultado da consulta, e no posio na tabela original, contada da esquerda
para a direita. As palavras ASC e DESC significam respectivamente, ascendente e
descendente. A forma ascendente de ordenao assumida como padro.
P. Mostrar em ordem alfabtica a lista de vendedores e seus respectivos salrios fixos
R. SELECT NOME_VENDEDOR,
NOME_VENDEDOR
SALARIO_FIXO
FROM
VENDEDOR
ORDER
BY
P. Listar os nomes, cidades e estados de todos os clientes, ordenados por estado e cidade
de forma descendente
5
R. SELECT NOME_CLIENTE, CIDADE, UF FROM CLIENTE ORDER BY UF DESC, CIDADE
DESC
P. Listar a descrio e o valor unitrio de todos os produtos que tenham a unidade KG,
em ordem crescente de valor unitrio
R. SELECT DESCRICAO, VAL_UNIT FROM PRODUTO WHERE UNIDADE = KG ORDER BY 2
ASC
6
P. Quais so as unidades de produtos, diferentes, na tabela produto?
R. SELECT DISTINCT UNIDADE FROM PRODUTO
7
RECUPERANDO DADOS DE VRIAS TABELAS (JOINS)
At agora viemos trabalhando com a recuperao de dados sobre uma nica tabela, mas o
conceito de banco de dados rene, evidentemente, vrias tabelas diferentes. Para que
possamos recuperar informaes de um banco de dados temos, muitas vezes, a necessidade
de acessar simultaneamente vrias tabelas. Algumas dessas consultas necessitam realizar
uma juno (JOIN) entre tabelas, para desta poder extrair as informaes necessrias para a
consulta formulada.
Temos o qualificador de nome qie consiste no nome da tabela seguido de um ponto e o
nome da coluna na tabela, por exemplo: o qualificador de nome para a coluna
DESCRICAO_PRODUTO da tabela PRODUTO ser PRODUTO.DESCRICAO_PRODUTO
Os qualificadores de nome so utilizados em uma consulta para efetivar a juno (JOIN)
entre tabelas.
P. Juntar a tabela cliente com pedido.
R. SELECT NOME_CLIENTE, PEDIDO.CODIGO_CLIENTE, NUM_PEDIDO FROM CLIENTE,
PEDIDO
Podemos observar que desta juno, poucas informaes podem ser extradas. Devemos
ento qualificar o tipo de juno, para podermos obter algum resultado concreto.
P. Que clientes fizeram os pedidos? Listar pelo nome dos clientes.
R. SELECT NOME_CLIENTE, PEDIDO.CODIGO_CLIENTE, NUM_PEDIDO FROM CLIENTE,
PEDIDO WHERE CLIENTE.CODIGO_CLIENTE = PEDIDO.CODIGO_CLIENTE
8
P. Apresentar os vendedores (ordenados) que emitiram pedidos com prazos de entrega
superiores a 15 dias e que tenham salrios fixos igual ou superiores a R$ 1.000,00.
P. Mostre os clientes (ordenados) que tm prazo de entrega maior que 15 dias para o
produto QUEIJO e que sejam do Rio de Janeiro.
P. Quantos clientes da cidade do Rio de Janeiro, e Niteri tiveram os seus pedidos tirados
com o vendedor Joo?
9
P. Quais clientes esto presentes em mais de trs pedidos?
UTILIZANDO VIEWS
As tabelas criadas em um banco de dados relacional tm existncia fsica dentro do sistema
de computao. Muitas vezes necessrio criar tabelas que no ocupem espao fsico, mas
que possam ser utilizadas como tabelas normais. Essas so chamadas de VIEWS (Tabelas
Virtuais).
CREATE VIEW <NOME DA VIEW>
(<nome da(s) coluna(s)>) AS
SELECT <nome da(s) coluna(s)> FROM <tabela>
WHERE <RESTRIES>
As VIEWS so utilizadas para se ter uma particular viso de uma tabela, para que no seja
necessria a utilizao do conjunto como um todo.
P. Criar uma VIEW que contenha s os produtos pedidos a metro.
R. CREATE VIEW PR_METRO (COD_PR_METRO, DESCRICAO, UNIDADE) AS SELECT
CODIGO_PRODUTO, DESCRICAO_PRODUTO, UNIDADE FROM PRODUTO WHERE UNIDADE
= M
P. Criar uma VIEW contendo o cdigo do vendedor, o seu nome e o seu salrio fixo com
R$ 100.00 de bnus.
10
P. Criar uma VIEW contendo os vendedores, seus pedidos efetuados e os respectivos
produtos.
As VIEWS criadas passam a existir no banco de dados como se fossem tabelas reais. As
VIEWS so volteis, desaparecendo no final da sesso de trabalho. Depois de criadas elas
podem ser utilizadas em todas as funes de programao da linguagem SQL (listar,
inserir, modificar, apagar, etc.).
P. Mostrar os vendedores que possuem salrio fixo superior a R$ 1.000,00 aps o bnus
de R$ 100,00.
11
TRABALHANDO COM NDICES
ndice uma estrutura que permite rpido acesso s linhas de uma tabela, baseados nos
valores de uma ou mais colunas. O ndice simplesmente uma outra tabela no banco de
dados, na qual esto armazenados valores e ponteiros, arrumados de forma ascendente ou
descendente. Atravs dos ponteiros se localiza em qual linha o valor desejado est
armazenado. As tabelas de ndice so utilizadas internamente, ficando transparente ao
usurio a sua utilizao.
Cada ndice aplicado a uma tabela, especificando uma ou mais colunas desta tabela.
CREATE [UNIQUE] INDEX <nome do ndice>
ON <tabela> (<coluna(s)>
A clusula UNIQUE opcional e define que para aquela coluna no existiro valores
duplicados, ou seja, todos os dados armazenados na coluna sero nicos. A juno do
ndice UNIQUE e da especificao NOT NULL para uma coluna a chave primria da
tabela.
A criao dos ndices depende muito do projeto do banco de dados e das necessidades de
pesquisa formuladas pelos usurios do banco de dados. Os ndices esto muito ligados s
necessidades de velocidade na recuperao da informao, e na execuo rpida de uma
operao de JOIN.
P. Criar a tabela de ndices chamada NOME_PRO
DESCRICAO_PRODUTO da tabela PRODUTO.
baseada
no
campo
P. Criar o ndice nico para a tabela cliente baseada no cdigo do cliente, no podendo
haver duplicidade de informao armazenada.
12
MAIS EXERCCIOS COM JOINS
Temos trs tipos de JOINS:
INNER JOINS: inclui apenas as linhas que satisfazem as condies de JOIN;
CROSS JOINS: inclui todas as combinaes de todas as linhas entre as duas
tabelas;
OUTER JOINS: inclui as linhas que satisfazem a condio de JOIN de uma tabela e
as linhas remanescentes de uma das duas tabelas que participam do JOIN.
O INNER JOIN conecta as duas tabelas em uma terceira tabela que inclui apenas as linhas
que satisfazem a condio de JOIN. Os dois tipos comuns de INNER JOIN so equijoin e
join natural.
Equijoin um join no qual os valores das colunas que esto sendo comparados so iguais.
Um equijoin produz uma coluna redundante porque a coluna de conexo exibida duas
vezes.
O join natural um pelo qual os valores que esto sendo comparados so iguais para uma
ou mais tabelas, mas a coluna de conexo exibida apenas uma vez. O join natural elimina
a coluna redundante no conjunto de resultados.
O CROSS JOIN produz um resultado que inclui todas as combinaes de todas as linhas
entre as tabelas que participam do join. Por exemplo, se existirem 8 linhas em uma tabela e
9 linhas em outra tabela, os resultados incluem 72 colunas. Um resultado deste tipo
geralmente intil.
O OUTER JOIN permite que voc restrinja uma tabela enquanto, no restrinjimos as linhas
da outra tabela. Isto ltil quando se deseja verificar onde chaves primrias e chaves
secundrias esto fora de sincronismo, ou possuem membros rfos. Um OUTER JOIN s
pode ser realizado entre duas tabelas. O ANSI SQL inclui estes trs tipos de OUTER JOIN:
LEFT OUTER JOIN que inclui todas as linhas da tabela que est esquerda na
expresso;
RIGHT OUTER JOIN que inclui todas as linhas da tabela que est direita na
expresso;
FULL OUTER JOIN que inclui todas as linhas que no se casam tanto da tabela
direita quanto da tabela esquerda.
Existem duas possveis sintaxes para representar o JOIN entre tabelas: sintaxe ANSI JOIN
e sintaxe SQL Server join.
P. Realize o OUTER JOIN entre as tabelas de item de pedido e de produto.
R. SELECT I.NUM_PEDIDO, P.DESCRICAO_PRODUTO FROM ITEM_DO_PEDIDO I, PRODUTO
P WHERE I.CODIGO_PRODUTO =* P.CODIGO.PRODUTO
No caso acima estamos representando a sintaxe do SQL Server join.
13
Uma outra classe de JOINS so os SELF JOINS que correlacionam as linhas de uma tabela
com as linhas da mesma tabela. Um SELF JOIN utilizado quando estamos interessados
em comparar a mesma informao. Por exemplo:
P. Listar os clientes que esto na mesma cidade aos pares.
R. SELECT C1.NOME_CLIENTE, C2.NOME_CLIENTE FROM CLIENTE C1, CLIENTE C2
WHERE C1.CIDADE = C2.CIDADE
14
SUBQUERY CORRELACIONADA
A maioria das subqueries anteriores eram executadas apenas uma vez, e substituindo-se o
valor resultante na clusula WHERE da query externa. A subquery correlacionada uma na
qual a clusula WHERE referencia a tabela na clusula FROM da clusula da query
externa. Isto significa que a subquery executada repetidamente, uma para cada linha que
possa ser selecionada pela query externa.
P. Listar os produtos e suas quantidades mximas presentes nos pedidos.
R. SELECT DISTINCT I.CODIGO_PRODUTO, I.QUANTIDADE FROM ITEM_DO_PEDIDO I
WHERE QUANTIDADE = (SELECT MAX(QUANTIDADE) FROM ITEM_DO_PEDIDO WHERE
CODIGO_PRODUTO = I.CODIGO_PRODUTO)
15
TRABALHANDO COM TRIGGERS
O TRIGGER um tipo especial de Procedimento que acionado quando alguma
modificao realizada na tabela utilizando-se dos comandos INSERT, UPDATE ou
DELETE.
Para o exemplo de TRIGGERS vamos definir uma nova tabela, cpia de produtos. Que
conter o histrico das modificaes feitas na tabela de produtos.
CREATE TABLE PRODUTO_COPY (
PRODUTO_ID SMALLINT IDENTITY,
CODIGO_OP CHAR(1),
CODIGO_PRODUTO SMALLINT,
DESCRICAO_PRODUTO CHAR(30),
UNIDADE CHAR(3),
VAL_UNIT MONEY NULL,
PRIMARY KEY (PRODUTO_ID)
)
16
TRABALHANDO COM STORED PROCEDURES
As STORED PROCEDURES so criadas utilizando a clusula CREATE PROCEDURE. A
clusula CREATE PROCEDURE no poder ser executada em combinao com outras
clusulas SQL em um nico comando.
Criando uma STORED PROCEDURE:
CREATE PROCEDURE COUNT_PEDIDOS
AS
SELECT COUNT(*) FROM PEDIDO
A segunda STORED PROCEDURE utiliza uma clusula SELECT para atribuir um valor
varivel @SAIDA. Estas duas STORED PROCEDURES so equivalentes. Sendo que a
execuo de cada uma delas feita de modo distinto, respectivamente:
EXEC COUNT_PEDIDOS_VEN 11
17
Uma outra STORED PROCEDURE, neste caso para calcular o produto entre dois nmeros
inteiros est definida abaixo:
CREATE PROCEDURE MATHTUTOR
@M1 SMALLINT,
@M2 SMALLINT,
@RESULT SMALLINT OUTPUT
AS
SELECT @RESULT = @M1 * @M2
DECLARE @GUESS SMALLINT
SELECT @GUESS = 50
EXECUTE MATHTUTOR 5, 6, @GUESS OUTPUT
SELECT 'THE RESULT IS: ', @GUESS
Neste caso estaremos executando a STORED PROCEDURE para calcular o produto entre 5
e 6. Primeiro armazenamos um valor incorreto na varivel @GUESS para verificarmos que
ser substitudo pelo resultado correto durante o acionamento da STORED PROCEDURE
MATHTUTOR. Se a palavra OUTPUT no estiver presente no acionamento da STORE
PROCEDURE, ela ainda ser executada mas o valor da varivel @GUESS no ser
modificado.
alternativa;
18
SELECT * FROM PRODUTO
DECLARE @NEXT CHAR(30)
SELECT @NEXT = ' '
WHILE @NEXT IS NOT NULL
BEGIN
SELECT @NEXT = MIN(NAME)
FROM SYSOBJECTS
WHERE TYPE = 'U' AND NAME > @NEXT
EXEC SP_SPACEUSED @NEXT
END
Nesta programa estamos utilizando uma tabela do sistema de nome SYSOBJECTS (tabela
que associa um record para cada tabela, view, stored procedure, triggers, etc... existentes na
base de dados), e estamos executando uma STORED PROCEDURE do sistema
SP_SPACEUSED que reporta quanto de espao a tabela est utilizando.
A expresso CASE permite que definamos um valor para cada expresso. Um CASE
equivalente a vrios IFs.
SELECT NOME_VENDEDOR, CATEGORIA = CASE FAIXA_COMISSAO
WHEN 'A' THEN 'FAIXA SUPERIOR'
WHEN 'B' THEN 'FAIXA INTERMEDIARIA'
WHEN 'C' THEN 'FAIXA INFERIOR'
ELSE 'FAIXA NAO CADASTRADA'
END FROM VENDEDOR