Vous êtes sur la page 1sur 5

SQL (02)

Sistemas de Bases de Dados Relacionais


Introdução ao SQL

Interrogações diversas sobre a Base de Dados Northwind - Parte II

/*
Introdução ao SQL - Parte II
===========================
Folha de Exercícios
Resolução dos exercícios em SQL Server 2000
*/

-- Indicação da base de dados de trabalho


use northwind

-- Manipulação de Dados

-- Precedência 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 interrogação anterior dada a


-- a precedência 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 códigos 'VINET','CHOPS' ou 'HANAR'
SELECT OrderID, OrderDate, CustomerID
FROM Orders
Where CustomerID IN ('VINET','CHOPS','HANAR')
ORDER BY OrderDate DESC

-- Interrogação 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 "Número de Encomendas"
FROM Orders
Where OrderDate BETWEEN '1996-07-01' AND '1996-08-31'

-- Interrogação "contrária" à anterior. Utilização de NOT BETWEEN.


SELECT COUNT(OrderID) AS "Número de Encomendas"
FROM Orders
Where OrderDate NOT BETWEEN '1996-07-01' AND '1996-08-31'

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 expressões de procura: 'A_a%' ou '%Bo_t%'
-- Demosnstração da utilização de caracteres especiais ("wildcards") - % e _
SELECT CustomerID, CompanyName
FROM Customers
WHERE CompanyName LIKE 'A_a%' OR CompanyName LIKE '%Bo_t%'

-- Nomes de clientes começados por A ou C


SELECT CustomerID, CompanyName
FROM Customers
WHERE CompanyName LIKE '[AC]%'

-- Nomes de clientes não começados por A ou C


SELECT CustomerID, CompanyName
FROM Customers
WHERE CompanyName LIKE '[^AC]%'

-- Utilização 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 -- Junção Interior


-- Quais os nomes dos empregados que recepcionaram encomendas
-- no dia AAAA/MM/DD?
-- Demonstração da utilização de uma equi-junção
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'

-- Demonstração da utilização de uma junção interna


-- Apenas são apresentados os registos que fazem a ligação 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'

-- Interrogação idêntica à anterior, mas agora apresentando uma concatenação de


-- atributos - FU.FirstName + ' ' + FU.LastName

O.Belo, DI, UM, 2003


SELECT EN.EmployeeID, FU.FirstName + ' ' + FU.LastName AS "Nome do Funcionário",
EN.OrderDate
FROM Orders AS EN INNER JOIN Employees AS FU
ON EN.EmployeeID = FU.EmployeeID
WHERE OrderDate = '1996/08/14'

-- OUTER JOIN -- Junção Exterior


-- LEFT OUTER JOIN (LEFT JOIN) -- Junção Exterior à Esquerda
SELECT *
FROM Customers AS CL LEFT OUTER JOIN Orders AS EN
ON EN.CustomerId = CL.CustomerID

-- RIGHT OUTER JOIN (RIGHT JOIN) -- Junção Exterior à Direita


SELECT *
FROM Orders AS EN RIGHT OUTER JOIN Customers AS CL
ON EN.CustomerId = CL.CustomerID

-- FULL OUTER JOIN (FULL JOIN) -- Junção Exterior Completa


SELECT *
FROM Orders AS EN FULL OUTER JOIN Customers AS CL
ON EN.CustomerId = CL.CustomerID

-- SubQueries -- Sub-Interrogações
-- Lista das encomendas anotadas atéaomomento de clientes espanhóis.
-- Utilizando o operador IN
SELECT *
FROM ORDERS
WHERE CustomerId IN
(SELECT CustomerId
FROM Customers
WHERE Country = 'Spain')

-- Qual o produto que tem o preço mais elevado?


SELECT ProductId, ProductName, UnitPrice
FROM Products
Where UnitPrice =
(SELECT max(UnitPrice) FROM Products)

-- ...uma outra solução! utilizando a clausula TOP


SELECT TOP 1 ProductId, ProductName, UnitPrice
FROM Products
ORDER BY UnitPrice DESC

-- EXISTS
-- Apresentar uma lista dos clientes que não têm 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 não são 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

-- Descrição de Dados
-- CREATE: Criação de uma tabela, do seu esquema.
-- Criação de uma nova tabela - "Visits" - para armazenar os registos
-- de visitas feitos a clientes pelos funcionários da Northwind.

CREATE TABLE Visits


(
VisitId smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, -- Chave Primária
VisitDate smalldatetime DEFAULT getdate(), -- Utilização de valores por omissão
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) -- Utilização de restrições
)

--Inserção 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 inserção não será concretizada. Violação de chave estrangeira.


INSERT INTO Visits
(VisitDate,CustomerID,EmployeeID,VisitReason,VisitCost)
Values ('2003/03/03','ERROR',6,'Order Gathering',200)

-- A inserção não será concretizada. Custo inferior ao definido pela restrição


-- 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: Alteração do esquema de uma tabela.


-- Query XX: Adição 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'))

-- Remoção de um atributo (FullDescription) da tabela "Visits"


ALTER TABLE Visits DROP COLUMN FullDescription

-- Adição de um atributo (FullDescription) na tabela "Visits"


ALTER TABLE Visits ADD FullDescription ntext

-- DROP: Remoção de tabelas.


-- Remoção da tabela "Visits" do sistema.
DROP TABLE Visits

-- Criação e Manipulação de vistas - VIEWS


-- Criação 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

-- Utilização da vista criada


SELECT *
FROM dezMelhoresClientes
where CompanyName like 'F%'

-- Remoção da vista do sistema


DROP VIEW dezMelhoresClientes

-- Fim da folha de exercícios de demonstração.


-- O.Belo, DI, UM, 2003

O.Belo, DI, UM, 2003

Vous aimerez peut-être aussi