【数据库】 postgresql 和 SQL初级使用(TPC-H数据应用)

工     具:postgresql

运行环境:ubantu 14.0

数据来源:TPC-H dbgen

TASK1:

1.下载postgresql(sudo install postgresql 即可),成果如下。

TASK2:

1.按照教程操作,进入dbgen文件夹修改makefile文件。

然后执行make运用TPC-H生成数据。这里可以看http://www.cnblogs.com/joyeecheung/p/3599698.html 的前面5点。

另外,TPC-H的关系图文件在官网上就可以找到:http://www.tpc.org/tpc_documents_current_versions/pdf/tpch2.17.1.pdf

2.将tbl格式文件转换成json格式文件。

1)代码:主要使用c++文件读写来完成,读取指定tbl文件,并按照tpch官

网介绍的数据模型来转换,写json文件,示例为转换orders.tbl文件。

当然这里为了想的快,就直接一个一个表格转换,也可以直接对所有的文件同时进行转换操作。

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
using namespace std;
vector<string> split(string s, string c) {
	string::size_type pos;
	vector<string> result;
	int size = s.size();
	for (int i = 0; i < size; i++) {
		pos = s.find(c, i);
		if(pos < size) {
			result.push_back(s.substr(i, pos-i));
			i = pos + c.size() -1;
		}
	}
	return result;
}

  

int main() {
	string s;
	int i, j;
	ifstream in;
	in.open("orders.tbl");
	ofstream out;
	out.open("orders.json");
	string title[9] = { "\"orderkey\"","\"custkey\"","\"orderstatus\"",
						"\"totalprice\"","\"orderdate\"","\"orderpriority\"",
						"\"clerk\"","\"shippriority\"","\"comment\""};
	if (in.is_open()) {
		for (i = 1; getline(in, s); i++) {
			vector<string> result = split(s, "|");
			/*if (i == 3270184 ){
				cout << "!!!" << s << endl;
				break;
			}*/
			s = "\t{";
			if (result.size() == 9) {
				out << i;
				for (j = 0; j < 8; j++) {
					s = s + title[j] + ":\"" + result[j] + "\",";
				}
				s = s + title[j] + ":\"" + result[j] + "\"}\n";
				out << s;
			}
		}
		out.close();
	}
}

 

2)效果:我的电脑就要崩了.jpg

TASK3:

1.创建数据库和对应的表,并向里面导入转换好的json格式文件。

2.开始查询。

1)开始查询之前先学习SQL查询的知识,尤其是要知道它的选表、拼表原理,比如select、from、where、group by等等的语句的执行顺序,from的原理,否则你开始做题目的时候就要担心你的查询语句是否是你所期望的了,以及相关的聚集函数的用法等等;

2)要弄清楚这个数据库的三个数据实体customer,part,supplier以及他们之间的联系集之间的关系,这样才能使用恰当的方法查询到你想要的查询结果。

Q1:Display the key and quantity of parts which are shipped in March 13th, 1996.

查询语句(SQL):

select data->>‘partkey‘ as part, data->>‘quantity‘ as quantity
from l
where data->>‘shipdate‘ = ‘1996-03-13‘;    

查询结果:

Q2: For each ship mode, ?nd the total quantity of items that are shipped before

查询语句(SQL):

select sum(cast(data->>‘quantity‘ as numeric)) as total, data->>‘shipmode‘ as shipmode
from l
where data->>‘shipdate‘ < ‘1998-12-01‘
group by data->>‘shipmode‘
order by total asc;

查询结果:

Q3:Display the total quantity of parts which are satis?ed the following conditions in LINEITEM: – the ship mode is AIR – the priority of the order that the parts belong to is URGENT

查询语句(SQL):

select sum(cast(data->>‘quantity‘ as numeric)) as total
from l
where data->>‘shipmode‘=‘AIR‘ and data->>‘orderkey‘ in (select data->>‘orderkey‘ from o where data->>‘orderpriority‘=‘1-URGENT‘);

查询结果:

Q4:

查询语句(SQL):

select data->>‘name‘ as name, data->>‘nationkey‘ as nation,
data->>‘regionkey‘ as region
from n
where data->>‘nationkey‘ in (select s.data->>‘nationkey‘ from s, ps where s.data->>‘suppkey‘=ps.data->>‘suppkey‘ and ps.data->>‘partkey‘=‘100‘ and ps.data->>‘partkey‘ < ps.data->>‘suppkey‘);  

查询结果:

Q5:

查询语句(SQL):

select count(distinct data->>‘custkey‘)
from c
where data->>‘custkey‘ in (select o.data->>‘custkey‘
from o, l
where o.data->>‘orderkey‘ = l.data->>‘orderkey‘ and l.data->>‘partkey‘ in (select data->>‘partkey‘
from p
where data->>‘type‘ like ‘%STEEL%‘));

查询结果:

Q6:

查询语句(SQL):

(方法1,效率比较慢):

select data->>‘partkey‘ as key, data->>‘name‘ as name, data->>‘brand‘ as brand,
(select sum(cast(l.data->>‘quantity‘ as numeric)) as total from l
where l.data->>‘shipdate‘ like ‘%1997%‘ and l.data->>‘partkey‘ = p.data->>‘partkey‘
group by l.data->>‘partkey‘)
from p
order by total desc limit 10;

(方法2,效率比较快):

select p.data->>‘partkey‘ as key, p.data->>‘name‘ as name, p.data->>‘brand‘ as brand, s.total
from p, (select l.data->>‘partkey‘ as partkey, sum(cast(l.data->>‘quantity‘ as numeric)) as total
from l
where l.data->>‘shipdate‘ like ‘%1997%‘
group by l.data->>‘partkey‘
order by total desc
limit 10
) as s
where p.data->>‘partkey‘ = s.partkey;

查询结果:

方法1和方法2的主要差别其实就是先选10行再拼表还是先拼表再选行,法2十几秒内就可以出结果,法1需要更长的时间。当然,我其实还有法0,直接将l和p进行拼表然后选取……睡觉前输入查询,睡醒了都没出结果(七八个钟头)= =。

Q7:

查询语句(SQL):

select c.data->>‘custkey‘ as customer, c.data->>‘name‘ as name,
c.data->>‘address‘ as address, c.data->>‘phone‘ as phone,
op.count as count
from c, (select o.data->>‘custkey‘ as cust, count(*) as count
from o
group by o.data->>‘custkey‘
having count(*) >= 10) as op
where c.data->>‘custkey‘ = op.cust;

查询结果:

Q8:

查询语句(SQL):

方法1(由Q6受到启发,降序选第一个即为最大值)

select cast(data->>‘extendedprice‘ as numeric) as maxprice
from l, (select data->>‘orderkey‘ as orderkey from o
where data->>‘orderdate‘ like ‘%1998%‘) as op
where l.data->>‘orderkey‘ = op.orderkey
order by maxprice desc
limit 1;

方法2(正常人的思维,应用sum的聚集函数)

select max(cast(lp.price as numeric)) as maxextendedprice
from (select l.data->>‘extendedprice‘ as price from l where l.data->>‘orderkey‘ in (select o.data->>‘orderkey‘
from o
where o.data->>‘orderdate‘ like ‘%1998%‘)) as lp;

查询结果:

可以发现这两种方法得到的查询结果是一样的~至于效率,直观感觉是差不多的,如果数据库的排序是通过堆排序的话,那确实从算法上来说两种方法的效率是一样的。(特别要注意的是使用排序的时候要先将数据强制转换成numeric类型,否则此时是文本格式,比较的结果就会是9999……)

Q9:

查询语句(SQL):

select sum(cast(l.data->>‘quantity‘ as numeric)) as total, l.data->>‘shipmode‘ as mode
from l
where l.data->>‘orderkey‘ in (select o.data->>‘orderkey‘ from o
where o.data->>‘orderdate‘ like ‘1995-05%‘) and l.data->>‘shipmode‘ <> ‘TRUCK‘ and l.data->>‘shipmode‘ <> ‘RAIL‘
group by l.data->>‘shipmode‘;

查询结果:

心得体会:

1.安装过程完全按照教程来走,没有遇到任何问题。

2.其实这次作业是很简单的,但开始的时候我很盲目地就开始做作业,都没搞清楚原理,遇到什么属性就去转化什么文件再导入进数据库。后来把数据全删掉了,首先先弄明白TPC-H的实体和联系之间的关系,也才能正确理解题意。第二件重要的事情就是学习SQL语句,尤其重点是语句执行的顺序,因为先执行group by、having再执行where还是顺序颠倒,得到的结果是很不一样的。

3.查询的时候我的模式基本上是:满足XX的并且XX的XX的XX……先找主语再找所在的表。

4.SQL查询在数据很大的时候查询反应好慢……然后听同学说建立索引来进行查询,都只是几秒的事情……

时间: 2024-08-05 11:15:10

【数据库】 postgresql 和 SQL初级使用(TPC-H数据应用)的相关文章

PostgreSQL数据库postgresql.conf部分相关参数

listen_addresses:#指定数据库用来监听客户端连接的TCP/IP地址,默认是值是* ,表示数据库在启动以后将在运行数据的机器上的所有的IP地址上监听用户请求,可以写成机器的名字,也可以写成IP地址,不同的值用逗号分开,如果被设成localhost,表示数据库只能接受本地的客户端连接请求,不能接受远程的客户端连接请求 listen_addresses = '0.0.0.0' #监听IPv4的所有IP. port:#指定数据库监听户端连接的TCP端口.默认值是5432 max_conn

seam2.2根据已有数据库(postgresql)生成项目

首先呢,这是我向同哥请教的一个文题,然后同哥把整个过程给我解答了一遍,谢谢同哥的乃森及引针啦---- seam2.2根据已有数据库(postgresql)生成项目 一,建数据库 进入pgAdmin新建一个数据库然后用eclipse的插件ErMaster导出sql或者是自己手写sql新建数据表 ,这里新建了一个名为test的数据库 里面有两个表,member和department,为多对一的关系,注意不要忘了设置主键 二,进入seam目录运行 ./seam setup ./seam create-

易飞报表数据库PostgreSQL改成MSSQL方式

简述步骤 1.在mssql上新增一个数据库,设定如下,编码要选择"chinese_PRC_CI_AL_KS_WS" 2.用sql命令.在report中新增一个View 3.BDE设定.leadertemp50 和 leader一样的设定,但DATABASENAME = report 4.condctors.ini改成报表数据库DBE 相信操作步骤见文档: 主站下载: http://www.qywalk.com/  博客:http://blog.sina.com.cn/qianyuman

MySQL数据库操作【SQL使用】

核心目标:学好增删改查,写啥业务都不怕! 一.理解数据库及其作用 1.数据库的五个基本单位1)数据库服务器2)数据库3)数据表4)数据字段5)数据行 2.详解这五个基本单位1)数据库服务器.是指用来运行数据库服务的一台电脑.在中小型企业通常为一台.在数据存储量计算量很大的时候可以存在多台.多台数据库服务器共同来存储或计算.由于数据安全非常重要,我们经常会对数据库服务器里面的数据进经备份. 2)数据库.一个数据库服务器里面有可以有多个数据库.主要用来分类使用.我们可以建立交通信息数据库.游戏数据库

开发中遇到的问题---【使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据】

问题:使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据: 原因:MyBatis看到 #{}会认为你在给sql中的变量赋值,就像JDBC编程中给问号赋值一样(自动在前后加单引号)也就是说,他把你传入的字符串并没有当做多个值,而是当做一个大的字符串,所以查询不到值 而MyBatis看到${}的时候会直接将之替换成变量的值而不做任何处理: 解决方案:将查询条件中的“#”替换成“$”. <select id="fi

.net(C#)在Access数据库中执行sql脚本

自己写的一个工具类,主要是业务场景的需要. 主要有两个功能: ①执行包含sql语句的字符串 ②执行包含sql语句的文件 调用方式 1 /// <summary> 2 /// 执行sql语句 3 /// </summary> 4 /// <param name="sql">需要执行的sql语句</param> 5 public bool ExecuteSql(string sql, ref string errorMsg) 6 { 7 Se

数据库原理-嵌入式sql

嵌入式SQL是一种将SQL语句直接写入C语言,COBOL,FORTRAN, Ada等编程语言的源代码中的方法.借此方法,可使得应用程序拥有了访问数据以及处理数据的能力. 以下是嵌入式sql基本处理过程: 嵌入式sql语句与主语言之间的通信 sql向主语言传递状态信息,是主语言能控制sql程序流程-sql通信区 主语言向sql提供变量-主变量 sql执行结果交给主语言处理-主变量,游标 sql通信区 SQL语句执行后,系统要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境的各种数据,

JAVA-Unit01: 数据库原理 、 SQL(DDL、DML)

Unit01: 数据库原理 . SQL(DDL.DML) SQL语句是不区分大小写的,但是行业里习惯将关键字与分关键字用大小写岔开以提高可读性. SELECT SYSDATE FROM dual DDL语句 数据定义语言 用于操作数据库对象 数据库对象有:表,视图,索引,序列 创建表: CREATE TABLE employee( id NUMBER(4), name VARCHAR2(20), gender CHAR(1), birth DATE, salary NUMBER(6,2), jo

如何将本地数据库迁移至SQL Azure

Windows Azure的SQL Azure和SQL Server 拥有不同的体系结构,可以说是两个不同的产品.SQL Azure不完全支持或者尚不支持SQL Server的某些功能,这使得我们不能像平常一样使用bak文件还原的方式迁移数据库,也不能使用数据导入导出向导.很多SQL Server的特性在SQL Azure中不被支持. 那我们怎样才能将现有数据库迁移到SQL Azure上呢? 一."将数据库部署到SQL Azure"向导 我最先想到的是这个向导,对数据库右键=>任