Você está na página 1de 5

O.

Belo, DI, UM, 2003


Sistemas de Bases de Dados Relacionais
Introduo ao SQL

Interrogaes diversas sobre a Base de Dados Northwind - Parte II


/*
Introduo ao SQL - Parte II
===========================
Folha de Exerccios
Resoluo dos exerccios em SQL Server 2000
*/

-- Indicao da base de dados de trabalho
use northwind

-- Manipulao de Dados

-- Precedncia de Operadores
-- <maior> (,) >>> *,/ >>> +,- >>> NOT >>> AND >>> OR <menor>
SELECT *
FROM Orders
WHERE CustomerID = 'VINET' OR
CustomerID = 'CHOPS' AND
OrderDate = '1996-07-04'

-- O resultado claramente diferente da interrogao anterior dada a
-- a precedncia de operadores ser contrariada pelos ().
SELECT *
FROM Orders
WHERE (CustomerID = 'VINET' OR
CustomerID = 'CHOPS') AND
OrderDate = '1996-07-04'

-- IN
-- Apresentar uma lista das encomendas (OrderID, OrderDate)
-- efectuadas pelos clientes com os cdigos 'VINET','CHOPS' ou 'HANAR'
SELECT OrderID, OrderDate, CustomerID
FROM Orders
Where CustomerID IN ('VINET','CHOPS','HANAR')
ORDER BY OrderDate DESC

-- Interrogao equivalente anterior
SELECT OrderID, OrderDate, CustomerID
FROM Orders
Where CustomerID = 'VINET' OR
CustomerID = 'CHOPS' OR
CustomerID = 'HANAR'
ORDER BY OrderDate DESC


-- BETWEEN
-- Quantas encomendas for efectuadas entre os dias
-- '1996-07-01' e '1996-08-31'
SELECT COUNT(OrderID) AS "Nmero de Encomendas"
FROM Orders
Where OrderDate BETWEEN '1996-07-01' AND '1996-08-31'

-- Interrogao "contrria" anterior. Utilizao de NOT BETWEEN.
SELECT COUNT(OrderID) AS "Nmero de Encomendas"
FROM Orders
Where OrderDate NOT BETWEEN '1996-07-01' AND '1996-08-31'

SQL (02)
O.Belo, DI, UM, 2003
-- Atributos derivados
SELECT *, UnitPrice*Quantity AS "Total w/Discount",
UnitPrice*Quantity * (1-Discount) AS "Total"
FROM [Order Details]
Where UnitPrice*Quantity > 100

-- HAVING
-- Esta clausula s pode ser utilizada para actuar sobre resultados
-- de grupos.
SELECT ProductID, sum(UnitPrice*Quantity) AS "Total w/Discount",
sum(UnitPrice*Quantity * (1-Discount)) AS "Total"
FROM [Order Details]
WHERE OrderId IN (10248, 10259, 10285, 10300, 10301, 11000)
GROUP BY ProductId
HAVING sum(UnitPrice*Quantity * (1-Discount)) > 200


-- LIKE
-- Apresentar uma lista (CustomerID, CompanyName) dos clientes
-- cujos nomes respeitem as seguintes expresses de procura: 'A_a%' ou '%Bo_t%'
-- Demosnstrao da utilizao de caracteres especiais ("wildcards") - % e _
SELECT CustomerID, CompanyName
FROM Customers
WHERE CompanyName LIKE 'A_a%' OR CompanyName LIKE '%Bo_t%'

-- Nomes de clientes comeados por A ou C
SELECT CustomerID, CompanyName
FROM Customers
WHERE CompanyName LIKE '[AC]%'

-- Nomes de clientes no comeados por A ou C
SELECT CustomerID, CompanyName
FROM Customers
WHERE CompanyName LIKE '[^AC]%'

-- Utilizao do caracter ' dentro de uma string
-- Nomes de produtos que contenham a string "n'"
SELECT *
FROM Products
WHERE ProductName LIKE '%n''%'


-- ESCAPE
-- Nomes de fornecedores que contenham a string "100%"
SELECT *
FROM Suppliers
WHERE CompanyName LIKE '%100\%%' ESCAPE '\'


-- INNER JOIN -- Juno Interior
-- Quais os nomes dos empregados que recepcionaram encomendas
-- no dia AAAA/MM/DD?
-- Demonstrao da utilizao de uma equi-juno
SELECT DISTINCT EN.EmployeeID, FU.FirstName, FU.LastName, EN.OrderDate
FROM Orders AS EN, Employees AS FU
WHERE EN.EmployeeID = FU.EmployeeID AND OrderDate = '1996/08/14'

-- Demonstrao da utilizao de uma juno interna
-- Apenas so apresentados os registos que fazem a ligao entre as
-- tabelas Orders e Employees.
SELECT EN.EmployeeID, FU.FirstName, FU.LastName, EN.OrderDate
FROM Orders AS EN INNER JOIN Employees AS FU
ON EN.EmployeeID = FU.EmployeeID
WHERE OrderDate = '1996/08/14'

-- Interrogao idntica anterior, mas agora apresentando uma concatenao de
-- atributos - FU.FirstName + ' ' + FU.LastName
O.Belo, DI, UM, 2003
SELECT EN.EmployeeID, FU.FirstName + ' ' + FU.LastName AS "Nome do Funcionrio",
EN.OrderDate
FROM Orders AS EN INNER JOIN Employees AS FU
ON EN.EmployeeID = FU.EmployeeID
WHERE OrderDate = '1996/08/14'


-- OUTER JOIN -- Juno Exterior
-- LEFT OUTER JOIN (LEFT JOIN) -- Juno Exterior Esquerda
SELECT *
FROM Customers AS CL LEFT OUTER JOIN Orders AS EN
ON EN.CustomerId = CL.CustomerID


-- RIGHT OUTER JOIN (RIGHT JOIN) -- Juno Exterior Direita
SELECT *
FROM Orders AS EN RIGHT OUTER JOIN Customers AS CL
ON EN.CustomerId = CL.CustomerID

-- FULL OUTER JOIN (FULL JOIN) -- Juno Exterior Completa
SELECT *
FROM Orders AS EN FULL OUTER JOIN Customers AS CL
ON EN.CustomerId = CL.CustomerID

-- SubQueries -- Sub-Interrogaes
-- Lista das encomendas anotadas ataomomento de clientes espanhis.
-- Utilizando o operador IN
SELECT *
FROM ORDERS
WHERE CustomerId IN
(SELECT CustomerId
FROM Customers
WHERE Country = 'Spain')

-- Qual o produto que tem o preo mais elevado?
SELECT ProductId, ProductName, UnitPrice
FROM Products
Where UnitPrice =
(SELECT max(UnitPrice) FROM Products)

-- ...uma outra soluo! utilizando a clausula TOP
SELECT TOP 1 ProductId, ProductName, UnitPrice
FROM Products
ORDER BY UnitPrice DESC


-- EXISTS
-- Apresentar uma lista dos clientes que no tm encomendas.
SELECT CustomerID, CompanyName
FROM Customers AS CL
WHERE NOT EXISTS
(SELECT CustomerID FROM Orders
WHERE CustomerID = CL.CustomerID)
ORDER BY CompanyName

-- ANY (e ALL)
-- Lista dos Clientes que no so Brasileiros.
SELECT Country,CustomerID, CompanyName
FROM Customers AS CL
WHERE Country = ANY
(SELECT Country FROM Customers
WHERE Country <> 'Brazil')
ORDER BY Country, CompanyName


-- UNION
SELECT convert(char(5),SupplierID) AS "EID", CompanyName, Country, 'F' AS EType
FROM Suppliers
O.Belo, DI, UM, 2003
UNION
SELECT CustomerID, CompanyName, Country, 'C'
FROM Customers
ORDER BY CompanyName


-- Descrio de Dados
-- CREATE: Criao de uma tabela, do seu esquema.
-- Criao de uma nova tabela - "Visits" - para armazenar os registos
-- de visitas feitos a clientes pelos funcionrios da Northwind.

CREATE TABLE Visits
(
VisitId smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, -- Chave Primria
VisitDate smalldatetime DEFAULT getdate(), -- Utilizao de valores por omisso
EmployeeID int NOT NULL REFERENCES Employees (EmployeeId), -- Chave Estrangeira
CustomerID nchar(5) NOT NULL
FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerId), -- Chave
Estrangeira
VisitReason varchar(50) NOT NULL DEFAULT 'Cortesy Visit',
FullDescription ntext,
VisitCost money NOT NULL CHECK (VisitCost >= 100) -- Utilizao de restries
)

--Insero de alguns registos na tabela "Visits"
INSERT INTO Visits
(EmployeeID,CustomerID,VisitReason,FullDescription,VisitCost)
Values (1,'CACTU','Balance Account','Report Generation',150)

INSERT INTO Visits
(VisitDate,CustomerID,EmployeeID,VisitReason,VisitCost)
Values ('2003/04/05','ANTON',6,'Order Gathering',200)

-- A insero no ser concretizada. Violao de chave estrangeira.
INSERT INTO Visits
(VisitDate,CustomerID,EmployeeID,VisitReason,VisitCost)
Values ('2003/03/03','ERROR',6,'Order Gathering',200)

-- A insero no ser concretizada. Custo inferior ao definido pela restrio
-- definida: CHECK (VisitCost >= 100)
INSERT INTO Visits
(EmployeeID,CustomerID,VisitReason,VisitCost)
Values (2,'BERGS','Product Promotion',50)

-- Consulta dos registos de visitas
SELECT *
FROM Visits

-- ALTER: Alterao do esquema de uma tabela.
-- Query XX: Adio de um novo atributo (FinalAppreciation) tabela "Visits"
ALTER TABLE Visits ADD FinalAppreciation CHAR(02)
NOT NULL DEFAULT 'RE'
CONSTRAINT finalAppCheck CHECK (FinalAppreciation IN ('EX','VG','GO','RE','BA'))

-- Remoo de um atributo (FullDescription) da tabela "Visits"
ALTER TABLE Visits DROP COLUMN FullDescription

-- Adio de um atributo (FullDescription) na tabela "Visits"
ALTER TABLE Visits ADD FullDescription ntext

-- DROP: Remoo de tabelas.
-- Remoo da tabela "Visits" do sistema.
DROP TABLE Visits


-- Criao e Manipulao de vistas - VIEWS
-- Criao de vistas

O.Belo, DI, UM, 2003
-- Os dez melhores clientes - os dez que encomendaram mais.
CREATE VIEW dezMelhoresClientes AS
select TOP 10 customers.companyname, sum([order details].quantity * [order
details].unitprice) as "Valor Total p/ Cliente"
from ((orders inner join [order details] on orders.orderid = [order
details].orderid)
inner join products on [order details].productid=products.productid)
inner join customers on orders.customerid=customers.customerid
group by customers.companyname
order by sum([order details].quantity * [order details].unitprice) desc

-- Utilizao da vista criada
SELECT *
FROM dezMelhoresClientes
where CompanyName like 'F%'

-- Remoo da vista do sistema
DROP VIEW dezMelhoresClientes


-- Fim da folha de exerccios de demonstrao.
-- O.Belo, DI, UM, 2003

Você também pode gostar