SQL语句的相关记录(一)

来源:互联网 发布:mysql 表分区查询 编辑:程序博客网 时间:2024/05/21 16:52

 在这里记录一些比较烦人的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、

待续……

 

原创粉丝点击