Banco de dados AdventureWorks LT: esquema, tabelas e exercícios de SQL
AdventureWorks LT é o banco de exemplo do Microsoft SQL Server de um fabricante de bicicletas: clientes, produtos, categorias de produtos e pedidos. No SQLtest.online você consulta o banco direto no navegador: resolve exercícios com correção automática e executa suas próprias consultas no playground, sem instalar nada.
- 10 tabelas principais
- 847 clientes
- 295 produtos
- 34 exercícios de SQL
O que é o AdventureWorks
AdventureWorks é o banco de exemplo que a Microsoft distribui para o SQL Server e o Azure SQL. Ele descreve a Adventure Works Cycles, uma empresa fictícia que fabrica e vende bicicletas, peças e acessórios.
O site usa o AdventureWorks LT, a edição leve: o mesmo negócio em cerca de dez tabelas em vez de dezenas. É ótimo para praticar T-SQL, incluindo TOP, autojunções na árvore de categorias e relacionamentos de muitos para muitos.
Diagrama ER
O diagrama mostra as tabelas do AdventureWorks e as chaves estrangeiras entre elas. Clique para abrir em tamanho real.
O que há no banco
As tabelas se dividem em três grupos.
Clientes
Customer, Address e a tabela de ligação CustomerAddress, que também guarda o tipo de endereço.
Produtos
Product, ProductCategory (uma árvore: cada categoria pode ter um pai), ProductModel e descrições em vários idiomas.
Vendas
SalesOrderHeader guarda os pedidos e SalesOrderDetail os itens.
Todos os 32 pedidos desta edição têm a data de 1º de junho de 2008. As descrições dos produtos se ligam aos modelos por ProductModelProductDescription, que também guarda o idioma (culture) de cada descrição. As tabelas de serviço BuildVersion, ErrorLog e sysdiagrams não são usadas nos exercícios.
Quantos dados há nas tabelas:
| Tabela | Linhas | Conteúdo |
|---|---|---|
| Customer | 847 | clientes |
| CustomerAddress | 417 | ligações cliente ↔ endereço |
| Address | 450 | endereços |
| SalesOrderHeader | 32 | pedidos |
| SalesOrderDetail | 542 | itens dos pedidos |
| Product | 295 | produtos |
| ProductCategory | 41 | categorias de produtos |
| ProductModel | 128 | modelos de produtos |
| ProductDescription | 762 | descrições de produtos |
| ProductModelProductDescription | 762 | ligações modelo ↔ descrição por idioma |
Estrutura das tabelas
Clique em uma tabela para ver suas colunas, uma linha de exemplo e as chaves.
Lista de tabelas
- AddressIDum identificador único para cada endereço
- AddressLine1a primeira linha do endereço
- AddressLine2a segunda linha do endereço
- Citycidade
- StateProvinceestado ou província
- CountryRegionpaís
- PostalCodecódigo postal
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (AddressID)
| AddressID | AddressLine1 | AddressLine2 | City | StateProvince | CountryRegion | PostalCode | rowguid | ModifiedDate |
|---|---|---|---|---|---|---|---|---|
| 9 | 8713 Yosemite Ct. | null | Bothell | Washington | United States | 98011 | 268AF621-76D7-4C78-9441-144FD139821A | 2006-07-01 00:00:00.000 |
- CustomerIDum identificador único para cada cliente
- NameStyle0 = Os dados em FirstName e LastName são armazenados no estilo ocidental (primeiro nome, sobrenome). 1 = Estilo oriental (sobrenome, primeiro nome). Padrão: 0
- Titletítulo
- FirstNamenome
- MiddleNamenome do meio
- LastNamesobrenome
- Suffixsufixo
- CompanyNamenome da empresa
- SalesPersonvendedor
- EmailAddresse-mail
- Phonenúmero de telefone
- PasswordHashhash da senha
- PasswordSaltsalt
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (CustomerID)
| CustomerID | NameStyle | Title | FirstName | MiddleName | LastName | Suffix | CompanyName | SalesPerson | EmailAddress | Phone | PasswordHash | PasswordSalt | rowguid | ModifiedDate |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0 | Mr. | Orlando | N. | Gee | [null] | A Bike Store | adventure-works\pamela0 | orlando0@adventure-works.com | 245-555-0173 | L/Rlwxzp4w7RWmEgXX+/A7cXaePEPcp+KwQhl2fJL7w= | 1KjXYs4= | 3F5AE95E-B87D-4AED-95B4-C3797AFCB74F | 2005-08-01 00:00:00.000 |
- CustomerIDidentificador do cliente na tabela Customer
- AddressIDidentificador do endereço na tabela Address
- AddressTypetipo de endereço
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (CustomerID, AddressID)
- FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID)
- FOREIGN KEY (AddressID) REFERENCES Address(AddressID)
| CustomerID | AddressID | AddressType | rowguid | ModifiedDate |
|---|---|---|---|---|
| 29485 | 1086 | Main Office | 16765338-DBE4-4421-B5E9-3836B9278E63 | 2007-09-01 00:00:00.000 |
- ProductIDum identificador único para cada produto
- Namenome do produto
- ProductNumbernúmero do artigo
- Colorcor do produto
- StandardCostpreço do produto
- ListPricepreço do produto no catálogo
- Sizetamanho do produto
- Weightpeso do produto
- ProductCategoryIDchave estrangeira que aponta para a tabela ProductCategory - define a categoria do produto
- ProductModelIDchave estrangeira que aponta para a tabela ProductModel - define o modelo do produto
- SellStartDatedata e hora do início das vendas
- SellEndDatedata e hora do fim das vendas
- DiscontinuedDatedata e hora da descontinuação
- ThumbNailPhotominiatura da foto do produto
- ThumbnailPhotoFileNamenome do arquivo da miniatura da foto
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (ProductID, ProductCategoryID, ProductModelID)
- FOREIGN KEY (ProductCategoryID) REFERENCES ProductCategory(ProductCategoryID)
- FOREIGN KEY (ProductModelID) REFERENCES ProductModel(ProductModelID)
| ProductID | Name | ProductNumber | Color | StandardCost | ListPrice | Size | Weight | ProductCategoryID | ProductModelID | SellStartDate | SellEndDate | DiscontinuedDate | ThumbNailPhoto | ThumbnailPhotoFileName | rowguid | ModifiedDate |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 680 | HL Road Frame - Black, 58 | FR-R92B-58 | Black | 1059.3100 | 1431.5000 | 58 | 1016.04 | 18 | 6 | 2002-06-01 00:00:00.000 | [null] | [null] | [binary] | no_image_available_small.gif | 43DD68D6-14A4-461F-9069-55309D90EA7E | 2008-03-11 10:01:36.827 |
- ProductCategoryIDum identificador único para cada categoria de produto
- ParentProductCategoryIDID da categoria de produto pai
- Namenome da categoria de produto
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (ProductCategoryID)
- FOREIGN KEY (ParentProductCategoryID) REFERENCES ProductCategory(ProductCategoryID)
| ProductCategoryID | ParentProductCategoryID | Name | rowguid | ModifiedDate |
|---|---|---|---|---|
| 1 | [null] | Bikes | CFBDA25C-DF71-47A7-B81B-64EE161AA37C | 2002-06-01 00:00:00.000 |
- ProductDescriptionIDum ID único para cada descrição de produto
- Descriptiondescrição do produto
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (ProductDescriptionID)
| ProductDescriptionID | Description | rowguid | ModifiedDate |
|---|---|---|---|
| 4 | Aluminum alloy cups; large diameter spindle. | DFEBA528-DA11-4650-9D86-CAFDA7294EB0 | 2007-06-01 00:00:00.000 |
- ProductModelIDum ID único para cada modelo de produto
- Namenome do modelo de produto
- CatalogDescriptiondescrição em formato XML
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (ProductModelID)
| ProductModelID | Name | CatalogDescription | rowguid | ModifiedDate |
|---|---|---|---|---|
| 1 | Classic Vest | [null] | 29321D47-1E4C-4AAC-887C-19634328C25E | 2007-06-01 00:00:00.000 |
- ProductModelIDidentificador do modelo de produto na tabela ProductModel
- ProductDescriptionIDID da descrição do produto na tabela ProductDescription
- Culturecódigo do idioma no formato ISO
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (ProductModelID, ProductDescriptionID)
- FOREIGN KEY (ProductModelID) REFERENCES ProductModel(ProductModelID)
- FOREIGN KEY (ProductDescriptionID) REFERENCES ProductDescription(ProductDescriptionID)
| ProductModelID | ProductDescriptionID | Culture | rowguid | ModifiedDate |
|---|---|---|---|---|
| 1 | 1199 | en | 4D00B649-027A-4F99-A380-F22A46EC8638 | 2007-06-01 00:00:00.000 |
- SalesOrderIDchave estrangeira referenciando a tabela SalesOrderHeader
- SalesOrderDetailIDum identificador único do registro na tabela
- OrderQtyquantidade
- ProductIDuma chave estrangeira referenciando a tabela Product
- UnitPricepreço por unidade de mercadoria
- UnitPriceDiscountpreço por unidade de produto com desconto
- LineTotalTotal
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (SalesOrderID, SalesOrderDetailID, ProductID)
- FOREIGN KEY (SalesOrderID) REFERENCES SalesOrderHeader(SalesOrderID)
- FOREIGN KEY (ProductID) REFERENCES Product(ProductID)
| SalesOrderID | SalesOrderDetailID | OrderQty | ProductID | UnitPrice | UnitPriceDiscount | LineTotal | rowguid | ModifiedDate |
|---|---|---|---|---|---|---|---|---|
| 71774 | 110562 | 1 | 836 | 356.8980 | .0000 | 356.898000 | E3A1994C-7A68-4CE8-96A3-77FDD3BBD730 | 2008-06-01 00:00:00.000 |
- SalesOrderIDum identificador único do registro na tabela
- RevisionNumbernúmero da revisão
- OrderDatedata e hora da criação do pedido
- DueDatedata e hora do vencimento do pedido
- ShipDatedata e hora do envio do pedido
- Statusstatus do pedido
- OnlineOrderFlagpedido online (sim/não)
- SalesOrderNumbernúmero do pedido
- PurchaseOrderNumbernúmero da compra
- AccountNumbernúmero da conta
- CustomerIDchave estrangeira referenciando a tabela Customer - define o cliente
- ShipToAddressIDchave estrangeira referenciando a tabela Address - define o endereço de entrega
- BillToAddressIDchave estrangeira referenciando a tabela Address - define o endereço de cobrança
- ShipMethodmétodo de entrega
- CreditCardApprovalCodecódigo de aprovação do cartão de crédito
- SubTotalsubtotal
- TaxAmtimpostos
- Freightcusto de entrega
- TotalDuetotal
- Commentcomentário
- rowguidguid
- ModifiedDatedata de criação/atualização
- PRIMARY KEY, btree (SalesOrderID, CustomerID, ShipToAddressID, BillToAddressID)
- FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID)
- FOREIGN KEY (ShipToAddressID) REFERENCES Address(AddressID)
- FOREIGN KEY (BillToAddressID) REFERENCES Address(AddressID)
| SalesOrderID | RevisionNumber | OrderDate | DueDate | ShipDate | Status | OnlineOrderFlag | SalesOrderNumber | PurchaseOrderNumber | AccountNumber | CustomerID | ShipToAddressID | BillToAddressID | ShipMethod | CreditCardApprovalCode | SubTotal | TaxAmt | Freight | TotalDue | Comment | rowguid | ModifiedDate |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 71774 | 2 | 2008-06-01 00:00:00.000 | 2008-06-13 00:00:00.000 | 2008-06-08 00:00:00.000 | 5 | 0 | SO71774 | PO348186287 | 10-4020-000609 | 29847 | 1092 | 1092 | CARGO TRANSPORT 5 | [null] | 880.3484 | 70.4279 | 22.0087 | 972.7850 | [null] | 89E42CDC-8506-48A2-B89B-EB3E64E3554E | 2008-06-08 00:00:00.000 |
Exemplos de consultas
Estas consultas mostram como os dados se relacionam. Copie qualquer uma e execute no playground.
Um cliente e seus endereços: ligação de muitos para muitos por CustomerAddress.
SELECT TOP 3 c.FirstName, c.LastName, ca.AddressType, a.City
FROM Customer c
JOIN CustomerAddress ca ON ca.CustomerID = c.CustomerID
JOIN Address a ON a.AddressID = ca.AddressID
ORDER BY c.CustomerID;
| FirstName | LastName | AddressType | City |
|---|---|---|---|
| Catherine | Abel | Main Office | Van Nuys |
| Kim | Abercrombie | Main Office | Branch |
| Frances | Adams | Main Office | Modesto |
Um pedido e seus itens: do cabeçalho do pedido aos produtos.
SELECT TOP 3 h.SalesOrderID, h.OrderDate, p.Name, d.OrderQty, d.UnitPrice
FROM SalesOrderHeader h
JOIN SalesOrderDetail d ON d.SalesOrderID = h.SalesOrderID
JOIN Product p ON p.ProductID = d.ProductID
ORDER BY h.SalesOrderID, d.SalesOrderDetailID;
| SalesOrderID | OrderDate | Name | OrderQty | UnitPrice |
|---|---|---|---|---|
| 71774 | 2008-06-01 00:00:00.000 | ML Road Frame-W - Yellow, 48 | 1 | 356.8980 |
| 71774 | 2008-06-01 00:00:00.000 | ML Road Frame-W - Yellow, 38 | 1 | 356.8980 |
| 71776 | 2008-06-01 00:00:00.000 | Rear Brakes | 1 | 63.9000 |
Exercícios de SQL por tema
Há 34 exercícios no banco AdventureWorks, de filtros simples a análises de pedidos e produtos. As soluções são verificadas automaticamente em um SQL Server real. O número à direita é a quantidade de exercícios do tema; os pontos coloridos mostram a faixa de dificuldade.
Por onde começar
Os primeiros exercícios do banco AdventureWorks:
- Categorias de produtos
- Lista de produtos
- Lista de produtos filtrados
- Dez produtos mais pesados
- Obter lista de tabelas (SQL Server)
- Encontrar clientes com números pares
- Encontrar clientes por prefixo de telefone
- Encontrar números de telefone duplicados
- Obter lista de clientes únicos
- Emails Duplicados
Todos os exercícios do AdventureWorks →
Perguntas frequentes
Preciso instalar o SQL Server para usar o AdventureWorks?
Não. Os exercícios e o playground do SQLtest.online executam as consultas nos nossos servidores, então basta um navegador. No playground, o AdventureWorks está disponível no SQL Server 2022.
Qual a diferença entre o AdventureWorks LT e o AdventureWorks completo?
O banco completo tem dezenas de tabelas em vários esquemas (Sales, Production, Person e outros). A edição LT mantém o núcleo do negócio, clientes, produtos e pedidos, em cerca de dez tabelas, o que facilita o aprendizado.
Qual dialeto de SQL é usado?
T-SQL, o dialeto do SQL Server. Por exemplo, use TOP ou OFFSET … FETCH em vez de LIMIT.