SQL文の関連記録(一)


ここには煩わしいSQL文を記録します。簡単だと思いますが、時々書きにくいです。まだ力が足りないですね。頑張ってください。
 
1、その年以前の販売総額を統計する。
テーブル構造
income
--year:年
--quantity:数量
 
データベーススクリプトを作成
create table income(
    year int not null primary key,
    quantity int not null);
データの挿入
insert into income(year,quantity) values(2005,1000);
insert into income(year,quantity) values(2006,3000);
insert into income(year,quantity) values(2007,5000);
insert into income(year,quantity) values(2008,8000);
insert into income(year,quantity) values(2009,12000);
統計
select year as newyear,(select sum(quantity) from income where year<=newyear) as total from income group by newyear;
結果
newyear  |  totaol
2005        |  1000
2006        |  4000
2007        |  9000
2008        |  1700
2009        |  2900
 
2、データベースの設計問題:データの対象が持つ親子のレベル関係が縦に長い場合、例えば会社の組織構造は本社が支社に分かれて、支社があります。この場合、どうやってテーブル構造を設計しますか?
以前、ある会社に面接に行きましたが、その時、相続関係を考えました。答えたのは、父の時計を設計し、父の時計のidを設計しました。このようにして、面接で私にこのようなレベルの関係が100あったら、つまり100枚の表を設計して、ある会社のすべての子会社と父の会社を調べます。この100枚の表はすべて関連して調べなければならなくて、このようにするのは複雑すぎますか?効率は遅すぎます。彼はもっといい解決策があるかどうか考えさせてくれました。当時は頭がぼうっとしていました。考えてみれば、すべての関係を受け継ぐことです。
実はこの問題は最初の会社で会ったことがあります。解決方法は相対的にいいです。このように私は淘汰されました。この解決策について説明します。
 
このようなレベルの継承関係がデータベースを設計する時に、いつも思想を固めないでください。機関に番号を付けることで、継承された親子関係を番号の上に表すことができます。解決方法は以下の通りです。
本社番号:01
一級支社は二つあります。それぞれの番号は01-01,01-02です。
一級支社の下の各支社には二つの子会社があります。この四つの会社の番号はそれぞれ01-01,01-02です。01-02-01,01-02-02
……
 
このように、私達は番号を採用して唯一ある会社を確定します。同じように、ある会社の番号を知っている時に、彼の所属レベルと彼の親会社と子会社を知ることができます。このように調べてみると便利です。設計時には一枚の表で十分です。検索時に文字列を使ってマッチングすれば、その会社の親会社とサブクラスを見つけやすくなります。
 
3、同じ表に同じ情報を持っている人
テーブル構造
census(人口調査)
----idキー、自己増加
----uid  身分証番号varrhar(18)
----name名前varrhar(50)
データベーススクリプトを作成
CREATE TABLE `census` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `uid` varchar(18) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
);
試験データの挿入
INSERT INTO `census` VALUES ('1', '360735198802052250', 'jeff');
INSERT INTO `census` VALUES ('2', '360735198802052250', 'jack');
INSERT INTO `census` VALUES ('3', '550535198802052250', 'jack');
INSERT INTO `census` VALUES ('4', '550535198802052251', 'lily');
同じ身分の証人を持つ情報を検索します。
select a.* from census a ,(select uid from census group by uid having count(0) > 1) b where a.uid = b.uid;
同じ名前の人の情報を検索します。
select a.* from census a ,(select name from census group by name having count(0) > 1) b where a.name = b.name;
ここのポイントはハヴィングの使い方です。
4、
引き続き……