• Embed Doc
  • Readcast
  • Collections
  • CommentGo Back
Download
 
O.Belo, DI, UM, 2003
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íciosResolução dos exercícios em SQL Server 2000*/-- Indicação da base de dados de trabalhouse northwind-- Manipulação de Dados-- Precedência de Operadores-- <maior> (,) >>> *,/ >>> +,- >>> NOT >>> AND >>> OR <menor>SELECT *FROM OrdersWHERE CustomerID = 'VINET' ORCustomerID = 'CHOPS' ANDOrderDate = '1996-07-04'-- O resultado é claramente diferente da interrogação anterior dada a-- a precedência de operadores ser contrariada pelos ().SELECT *FROM OrdersWHERE (CustomerID = 'VINET' ORCustomerID = 'CHOPS') ANDOrderDate = '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, CustomerIDFROM OrdersWhere CustomerID IN ('VINET','CHOPS','HANAR')ORDER BY OrderDate DESC-- Interrogação equivalente à anteriorSELECT OrderID, OrderDate, CustomerIDFROM OrdersWhere CustomerID = 'VINET' ORCustomerID = 'CHOPS' ORCustomerID = '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 OrdersWhere 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 OrdersWhere OrderDate NOT BETWEEN '1996-07-01' AND '1996-08-31'
 
SQL (02)
 
O.Belo, DI, UM, 2003
-- Atributos derivadosSELECT *, 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 ProductIdHAVING 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, CompanyNameFROM CustomersWHERE CompanyName LIKE 'A_a%' OR CompanyName LIKE '%Bo_t%'-- Nomes de clientes começados por A ou CSELECT CustomerID, CompanyNameFROM CustomersWHERE CompanyName LIKE '[AC]%'-- Nomes de clientes não começados por A ou CSELECT CustomerID, CompanyNameFROM CustomersWHERE CompanyName LIKE '[^AC]%'-- Utilização do caracter ' dentro de uma string-- Nomes de produtos que contenham a string "n'"SELECT *FROM ProductsWHERE ProductName LIKE '%n''%'-- ESCAPE-- Nomes de fornecedores que contenham a string "100%"SELECT *FROM SuppliersWHERE 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çãoSELECT DISTINCT EN.EmployeeID, FU.FirstName, FU.LastName, EN.OrderDateFROM Orders AS EN, Employees AS FUWHERE 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.OrderDateFROM Orders AS EN INNER JOIN Employees AS FUON EN.EmployeeID = FU.EmployeeIDWHERE 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.OrderDateFROM Orders AS EN INNER JOIN Employees AS FUON EN.EmployeeID = FU.EmployeeIDWHERE OrderDate = '1996/08/14'-- OUTER JOIN -- Junção Exterior-- LEFT OUTER JOIN (LEFT JOIN) -- Junção Exterior à EsquerdaSELECT *FROM Customers AS CL LEFT OUTER JOIN Orders AS ENON EN.CustomerId = CL.CustomerID-- RIGHT OUTER JOIN (RIGHT JOIN) -- Junção Exterior à DireitaSELECT *FROM Orders AS EN RIGHT OUTER JOIN Customers AS CLON EN.CustomerId = CL.CustomerID-- FULL OUTER JOIN (FULL JOIN) -- Junção Exterior CompletaSELECT *FROM Orders AS EN FULL OUTER JOIN Customers AS CLON EN.CustomerId = CL.CustomerID-- SubQueries -- Sub-Interrogações-- Lista das encomendas anotadas atéaomomento de clientes espanhóis.-- Utilizando o operador INSELECT *FROM ORDERSWHERE CustomerId IN(SELECT CustomerIdFROM CustomersWHERE Country = 'Spain')-- Qual o produto que tem o preço mais elevado?SELECT ProductId, ProductName, UnitPriceFROM ProductsWhere UnitPrice =(SELECT max(UnitPrice) FROM Products)-- ...uma outra solução! utilizando a clausula TOPSELECT TOP 1 ProductId, ProductName, UnitPriceFROM ProductsORDER BY UnitPrice DESC-- EXISTS-- Apresentar uma lista dos clientes que não têm encomendas.SELECT CustomerID, CompanyNameFROM Customers AS CLWHERE NOT EXISTS(SELECT CustomerID FROM OrdersWHERE CustomerID = CL.CustomerID)ORDER BY CompanyName-- ANY (e ALL)-- Lista dos Clientes que não são Brasileiros.SELECT Country,CustomerID, CompanyNameFROM Customers AS CLWHERE Country = ANY(SELECT Country FROM CustomersWHERE Country <> 'Brazil')ORDER BY Country, CompanyName-- UNIONSELECT convert(char(5),SupplierID) AS "EID", CompanyName, Country, 'F' AS ETypeFROM Suppliers
of 00

Leave a Comment

You must be to leave a comment.
Submit
Characters: ...
You must be to leave a comment.
Submit
Characters: ...