它不会让我上传图片,但列是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的客户的客户名称和地址。我还没有到达这里因为我不确定旧数据模型为什么不好
答案 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_orders
与tbl_customers
相关...您的客户数据必须先插入tbl_customers
才能下订单。tbl_products
这只是解决问题的一种方法。
希望这有助于你
现在,如果你想转移到这个模型,你还有一些工作要做:
insert into tbl_products values (1,'productA'), (2, 'productB'), ...
然后你就可以开始下订单了。我会假设您有以下客户:
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
现在,下订单分为两步:首先,创建订单记录,然后插入订单详情:
订单(客户John Doe):insert into tbl_orders values (1, '2012-10-17', 1);
订单详情(一支铅笔,十个回形针):insert into tbl_orders_products values (1, 1, 1000, 1), (2, 1, 2000, 10);
现在,要为订单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)
一个简单的提示。在建模数据解决方案时,尝试写下描述场景的简单句子。例如(好吧,它只是一个基本的):
这里,名词描述了你的场景的实体。然后,对于每个实体,尝试描述其属性:
等等。 好吧,在你的模型中,你大致必须为每个实体创建一个表。表字段取自每个实体的属性。对于每个字段记忆来定义正确的数据类型。
好的,这不是建模教程,但它是一个起点,只是为了解决方案。