1

它不会让我上传图片,但列是 OrderID、CustomerName、CustomerAddress、ProductNumber、SellDate、ProductDescription

我正在尝试自学 SQL。有人可以帮我确定一些事情吗?

1) 我想写一个 SQL 语句来检索下订单的客户的客户姓名和地址 7。

这是正确的吗?

Select CustomerName, Address
From Order 
Where OrderID = ‘7’

2)接下来我想写一个SQL语句,将一个新的订单添加到Order表中。

这是正确的吗?

INSERT INTO order(OrderID, CustomerName, CustomerAddress, ProductNumber, SellDate, ProductDescription) 
VALUES (8, 'Ben C', '12 Kents Road', 01/15/2012, Clay :)); 

3) 这个数据模型有什么问题,你将如何重新设计它?我在这里真的需要帮助。需要排序吗?我如何描述一个新的高级设计?

4) 我如何将这些数据从旧模型移动到新模型?

5)使用新的数据模型,我需要编写一个 JOIN 来检索下订单的客户的客户姓名和地址 7. 我还没有到这里,因为我不确定为什么旧的数据模型不好。

4

3 回答 3

2

首先,你需要回答一个问题:

  • 客户可以下多个订单吗?如果您的回答是“是”,您想要一份客户目录吗?

在这种情况下,您需要规范化您的数据库。首先,您需要将数据分成逻辑集;在这种情况下,客户、产品和订单......我假设一个订单可以有一个或多个产品。

然后,设计你的表(我将使用 MySQL 风格的代码):

您的客户目录:

create table tbl_customers (
    customerId int not null primary key,
    customerName varchar(100),
    customerAdress varchar(200)
);

您的产品目录:

create table tbl_products (
    productNumber int not null primary key,
    productName varchar(100),
);

您的订单目录:

create table tbl_orders (
    orderId int not null primary key,
    orderDate date,
    customerId int unsigned not null
);

对于每个订单,您需要知道您将订购的产品的“单位”数量:

create table tbl_orders_products (
    orderProductId int not null primary key,
    orderId int not null,
    productNumber int not null,
    units int,
);

在此之后,您将使用您的数据填充您的表,然后您可以执行任何适合您的查询。

几点注意事项:

  • tbl_orderstbl_customers……您的客户的数据必须tbl_customers在他可以下订单之前插入。
  • 在插入订单详细信息之前,您需要创建订单
  • 在您插入订单的详细信息之前,您需要填写tbl_products

这只是解决它的一种方法。

希望这可以帮助你


现在,如果你想迁移到这个模型,你需要做一些工作:

  1. 填充您的产品目录:insert into tbl_products values (1,'productA'), (2, 'productB'), ...
  2. 填充您的客户目录

然后您就可以开始下订单了。我假设您有以下客户:

customerId | customerName | customerAdress
---------------------------------------------
         1 | John Doe     | 31 elm street
         2 | Jane Doe     | 1223 park street

...和产品:

productNumber | productName
------------------------------
         1000 | Pencil
         2000 | Paper clip
         3000 | Bottled water

现在,下订单是一个两步过程:首先,创建订单记录,然后插入订单详细信息:

  1. 订单(客户 John Doe):insert into tbl_orders values (1, '2012-10-17', 1);

  2. 订单详情(一支铅笔,十个回形针):insert into tbl_orders_products values (1, 1, 1000, 1), (2, 1, 2000, 10);

现在,要选择订单七的客户(如您的问题中所述),您可以使用以下查询:

select c.*
from tbl_customers as c
inner join tbl_orders as o on c.customerId = o.customerId
where o.orderId = 7;

这只是一个起点。您应该寻找好书或在线教程(w3 教程可以是一个很好的在线“起点”)。

虽然我不太喜欢MS Access,但它是一个学习sql基础的好程序,而且有很多书籍和学习资源。注意:我不喜欢 Access,也不是要宣传它,但它可能是一个很好的学习工具。

于 2012-10-17T22:15:06.980 回答
1

首先你需要规范化,这方面有很多东西,但是大量的教程试图采取一些常识并让它变得非常模糊

看着你的列名,我看到三个表

客户(客户 ID、客户名称、客户地址)

CustomerOrders(OrderID, CustomerID, SellDate, ProductNumber) 尽量不要将您的表和列命名为 Sql 关键字之类的相同名称。

产品(ProductNumber, ProductDescription)

规范化表示,您应该能够唯一标识表中的任何记录,您可以使用 OrderId。当我拆分表格时,我添加了 CustomerID,因为您可能有多个同名客户。

另一个简单的规则是在您的结构中,如果您有多个客户订单,您将多次存储他们的姓名和地址,这是一种浪费,但真正的问题是,如果该客户更改地址怎么办?如何找到要更改的行,您可以执行 Where name = "Fred" 和 Address = "Here",但您不知道是否有多个客户名为 Fred,地址为 Here。

所以你的第一个查询将是一个连接

Select Customers.CustomerName,Customers.CustomerAddress From Customers
Inner join CustomerOrders On Customers.CustomerID = CustomerOrders.CustomerID
Where CustomerOrders.OrderID = 7

或者,如果您现在想跳过过去的学习连接,您可以使用两个查询来完成

Select CustomerID From CustomerOrders Where OrderID = 7

然后

Select CustomerName,CustomerAddress From Customers Where CustomerID = ?

您应该使用连接,但您可能会发现子查询更容易让您了解情况。您可以同时执行这两个查询

Select CustomerID From CustomerOrders 
Where CustomerID In (Select CustomerID From CustomerOrders Where OrderID = 7)

不知道您对 sql 表创建的了解有多远,但主键和外键是要查看的两件事。这将使您可以在数据库中放置一些规则。CustomerOrders 上的主键将阻止您拥有两个具有相同 ID 的订单,这很糟糕。

外键会阻止您为不存在的客户创建 CustomerOrder,并阻止您为不存在的产品创建产品。

假设您沿着这条路线走,并且您正在寻找编写一个应用程序来订购东西。

您可能具有维护客户的功能,该功能会向他们添加类似的内容

Insert Into Customers(CustomerID,CustomerName,CustomerAddress) Values(1,'Fred Bloggs','England')

还有一个产品

Insert Into Products(ProductNumber,ProductDescription) Values(1,'A thingamabob')

然后你会选择一个客户,所以你有它的 id,选择一个产品,所以你有它的编号,所以你不需要弄乱 CustomerName、CustomerAddress 或 ProductDescription

Insert Into CustomerOrders(OrderID,CustomerID,ProductNumber,SellDate) Values(1,1,1,'20121017')

请注意日期格式,如果您要将日期作为字符串传递给 sql,(另一个主题)在 YYYYMMDD 中执行它们,当您通过选择将它们取出时,您将以机器/数据库的格式获取它们设置在您的情况下似乎是 mm/dd/yyyy。问题是我推断出这是因为我知道一年只有十二个月。(使我成为高级开发人员的原因之一 :) 如果您的示例销售日期是 2012 年 1 月 5 日,我会读到 5 月 1 日,因为我已配置为英语。不惜一切代价避免这种歧义,它会定期影响你并伤害你。

PS 你在 2012 年 1 月 15 日所做的方式将被视为数学表达式,如 1 除以 15 ...

所以你不能写一个连接的原因基本上是你只有一个表。加入是将一个表连接到另一个表。好吧,实际上它比这要复杂一些,但这是超越学习曲线的好方法。

至于移动数据,我应该更快地重新开始。您不太可能创建了两个具有相同名称的不同客户,但移动数据的查询必须考虑到您可能拥有的情况。

要移动数据,假设 CustomerID 是Identity(自动编号)列

就像是

Insert into Customers(CustomerName,CustomerAddress)
Select Distinct CustomerName,CustomerAddress From [Order]

会为客户做这项工作。

那么对于产品

Insert into Products(ProductDescription)
Select Distinct ProductDescription From [Order]

然后

Insert into CustomerOrders(OrderID,CustomerID,ProductNumber,SellDate)
Select old.OrderID,c.CustomerID,p.ProductNumber,old.SellDate
From [Order] old
Inner Join Products p On p.ProductDesription = old.ProductDescription
Inner Join Customers c On c.CustomerName = old.CustomerName And c.CustomerAddress = old.CustomerAddress

我认为可能会做 CustomerOrders

于 2012-10-17T22:49:40.800 回答
0

一个简单的提示。在对数据解决方案进行建模时,尝试写下描述场景的简单句子。例如(好吧,这只是一个基本的):

  • 一个订单由许多订单行组成
  • 订单行是指产品
  • 一个客户创建许多订单

在这里,名词描述了场景的实体。然后,对于每个实体,尝试描述其属性:

  • 订单的特点是唯一的序列号、日期、总数。它指的是客户。
  • 订单行是指产品,以数量、单价、小计为特征
  • 一个客户....

一个等等。好吧,在您的模型中,您大致必须为每个实体创建一个表。表字段取自每个实体的属性。对于每个字段,请记住定义正确的数据类型。

好的,这不是一个建模教程,但它是一个起点,只是为了接近解决方案。

于 2012-10-17T22:26:59.070 回答