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