在这里记录一些比较烦人的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);
统计sql
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 | 17000
2009 | 29000
2、数据库设计问题:当数据对象拥有的父子级别关系纵向很长时,比如说公司的组织结构,总公司分为分公司,分公司又有分公司……,这种情况该如何设计表结构
这是以前我去一家公司面试遇到的问题,当时我就想到了继承关系,回答的答案是,设计一个父表,子表关联父表的id,一次这样,然后面试关问我如果这种级别关系有100个,那也就是需要设计一百张表,然后查询某公司的所有子公司和父公司的时候,这100张表都要关联查询,这样做是不是太复杂,效率太慢了,想想确实也是。他让我再想想有没有更好的解决方案。当时我的脑子就蒙的,想来想去都是继承关系。
其实这个问题我在第一家公司就遇到过,而且解决办法还是相对可以,就这样我被淘汰了。下面说说这种解决方案
遇到这种级别继承关系在设计数据库时,千万不要老是思想固化在继承关系上。我们可以采用给机构进行编号,在编号上面体现继承的父子关系,解决方法如下
总公司编号:01
一级分公司两个,分别编号为:01-01,01-02
一级分公司下面的每个分公司又有两个子公司,这四个公司的编号分别为:01-01-01,01-01-02;01-02-01,01-02-02
……
就这样,我们采用编号唯一来确定某个公司,同样我们在知道某个公司的编号时,我们就能知道他所属的级别和他的父公司和子公司,这样查询起来就方便多了,设计时一张表就够了,查询时采用字符串匹配就可以很容易的 找出该公司的父级和子级
3、同一张表中具有相同信息的人
表结构
census(人口调查)
----id 主键,自增
----uid 身份证号码 varchar(18)
----name 名字 varchar(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;
这里重点是having子句的用法
4、
待续……