1

画像をアップロードできませんが、列は OrderID、CustomerName、CustomerAddress、ProductNumber、SellDate、ProductDescription です。

私はSQLを独学しようとしています。誰かがいくつかのことを特定するのを手伝ってくれませんか?

1) 注文した顧客の名前と住所を取得する SQL ステートメントを書きたい 7.

これは正しいですか?

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

2) 次に、Order テーブルに新しい注文を追加する SQL ステートメントを書きたいと思います。

これは正しいですか?

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

3) このデータ モデルの何が問題で、どのように再設計しますか? ここで本当に助けが必要です。ソートする必要がありますか?新しい高レベルの設計をどのように説明できますか?

4) このデータを古いモデルから新しいモデルに移動するにはどうすればよいですか?

5) 新しいデータ モデルを使用して、注文した顧客の名前と住所を取得する JOIN を作成する必要があります。

4

3 に答える 3

2

まず、次の質問に答える必要があります。

  • 顧客は複数の注文を行うことができますか? 答えが「はい」の場合、顧客カタログをご希望ですか?

このシナリオでは、データベースを正規化する必要があります。まず、データを論理セットに分離する必要があります。この場合、Customers、Products、および Orders... 注文には 1 つ以上の製品が含まれると仮定します。

次に、テーブルを設計します (コードには 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

これは、それを解決する方法にすぎません。

これがお役に立てば幸いです


このモデルに移行する場合は、次の作業を行う必要があります。

  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

現在、注文は 2 段階のプロセスです。最初に注文レコードを作成し、次に注文の詳細を挿入します。

  1. 注文 (顧客 John Doe):insert into tbl_orders values (1, '2012-10-17', 1);

  2. 注文の詳細 (鉛筆 1 本、クリップ 10 個):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 が好きではありません。宣伝するつもりもありませんが、良い学習ツールになるかもしれません。

于 2012-10-17T22:15:06.980 に答える
1

最初に正規化する必要があります。その周りにはたくさんのものがありますが、常識を働かせてそれを本当に曖昧にするチュートリアルがたくさんあります

列名を見ると、3つのテーブルがあります

Customers(CustomerID、CustomerName、CustomerAddress)

CustomerOrders(OrderID、CustomerID、SellDate、ProductNumber)テーブルや列にSQLキーワードと同じ名前を付けないようにしてください。

製品(ProductNumber、ProductDescription)

正規化では、次のようになります。たとえば、OrderIdを使用すると、テーブル内のすべてのレコードを一意に識別できるはずです。テーブルを分割するときに、CustomerIDを追加しました。これは、同じ名前の顧客が複数いる可能性があるためです。

もう1つの簡単なルールは構造にあります。顧客に複数の注文がある場合、名前と住所を複数回保存することになります。これは無駄ですが、本当の問題は、その顧客が住所を変更した場合はどうなるでしょうか。変更する行をどのように見つけますか。Wherename="Fred"およびAddress="Here"を実行できますが、住所がHereのFredという顧客が複数いるかどうかはわかりません。

したがって、最初のクエリは結合になります

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

または、過去の学習結合を今のところスキップしたい場合は、2つのクエリでそれを行うことができます

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テーブルの作成についてはよくわかりませんが、主キーと外部キーの2つを確認する必要があります。これにより、データベースにいくつかのルールを配置できます。CustomerOrdersの主キーを使用すると、同じIDを持つ2つの注文が発生しなくなります。これは悪いことです。

外部キーを使用すると、存在しなかった顧客のCustomerOrderを作成できなくなり、存在しない製品のCustomerOrderを作成できなくなります。

あなたがそのルートをたどり、物を注文するためのアプリケーションを作成しようとしていたと仮定します。

あなたはおそらく顧客を維持するための機能を持っているでしょう。

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

そして1つは製品用です

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のように見える設定。問題は、1年に12か月しかないことを知っているので、私が推測したことです。(私を上級開発者にする理由の1つ:)あなたの例の販売日が2012年1月5日だったとしたら、私は英語用に構成されているので、それを5月1日と読みました。あいまいさは絶対に避けてください。定期的に連絡を取り、あなたを傷つけます。

PSあなたがそれをした方法2012年1月15日は1を15で割ったような数式として扱われます...

したがって、結合を記述できなかった理由は、基本的にテーブルが1つしかないためです。結合とは、あるテーブルを別のテーブルに結合することです。実際にはそれよりも少し複雑ですが、それはあなたが学習曲線にいるところを過ぎた良い方法です。

データの移動に関しては、より早くやり直してください。同じ名前で2つの異なる顧客を作成した可能性は低いですが、データを移動するためのクエリでは、使用できる可能性のあるものを考慮に入れる必要があります。

IdentityCustomerIDが(自動番号)列であると想定してデータを移動するには

何かのようなもの

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 に答える