带表的SQL Access

时间:2012-10-17 21:27:09

标签: sql database database-design

它不会让我上传图片,但列是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的客户的客户名称和地址。我还没有到达这里因为我不确定旧数据模型为什么不好

3 个答案:

答案 0 :(得分: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. 填充客户目录
  3. 然后你就可以开始下订单了。我会假设您有以下客户:

    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);

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

      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,我不是故意做广告,但它可能是一个很好的学习工具。

答案 1 :(得分:1)

首先你需要规范化,周围有很多东西,但大量的教程试图采取一些常识并使其真正模糊

查看列名称,我看到三个表

客户(CustomerID,客户名称,客户地址)

CustomerOrders(OrderID,CustomerID,SellDate,ProductNumber)尽量不要为表和列命名,也不要像Sql关键字那样命名。

产品(ProductNumber,ProductDescription)

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

另一个简单的规则是在你的结构中,如果你有一个以上的客户订单,你将不止一次存储他们的名字和地址,这是浪费,但真正的问题是,如果该客户更改地址?你如何找到要更改的行,你可以做名称=“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中执行它们,当您使用select返回它们时,您将以机器的格式获取它们/ database设置为你的情况似乎是mm / dd / yyyy。问题是我推断出因为我知道一年只有十二个月。 (使我成为高级开发人员的事情之一:)如果您的示例selldate已经是1/5/2012,我已经读过5月1日,因为我配置了英语。不惜一切代价避免这种模棱两可的现象,并定期伤害你。

PS你做到的方式1/15/2012将被视为数学表达式,如1除以15 ......

所以你无法写连接的原因基本上就是你只有一个表。 Join是将一个表连接到另一个表。实际上,它比这更复杂,但这是一个很好的方式,你在学习曲线的过去。

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

要移动数据,假设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我认为

答案 2 :(得分:0)

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

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

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

  • 订单的特征在于唯一的序列号,日期,总数。它指的是客户。
  • 订单行是指产品,其特征在于数量,单价,小计
  • 顾客......

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

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