有的时候需要在不同的数据库实例之间做集合操作,这就无法直接使用SQL语句的join,left join了。相同类型的数据库之间虽然也有类似于DBLINK和FEDERATED之类的东西,但一来这些东西不同的数据库之间是不能通用的,还有就是这些都要在数据库服务端上操作的,即使是dba要走这么一个申请流程也是非常麻烦的。所以就想自己写几个常用的:

inner_join:内连接操作,t1 join t2 on t1.col=t2.col,返回连接字段相等的行,方式包括下面的外连接用的都是最简单的nested loop join。

left_join:左连接操作,t1 left join t2 on t1.col=t2.col,返回左边所有的行以及右表中连接字段相等的行,注意的是右边没有的要以NULL填充。

right_join:右连接操作,t1 right join t2 on t1.col=t2.col,和左连接一样,就是左右的位置换了一下。

union_all:两个集合合并。

union:和union_all一样,就是要除去重复的。

代码如下:

  1. #!/usr/local/bin/python
  2. # -*- coding: utf8 -*-
  3.  
  4. '''
  5. Created on 2016年5月23日
  6.  
  7. @author: PaoloLiu
  8. '''
  9.  
  10. class sql_merge(object):
  11. '''
  12. classdocs
  13. '''
  14.  
  15. def __init__(self):
  16. '''
  17. Constructor
  18. '''
  19.  
  20. def inner_join(self, left_table, right_table, left_join_col, right_join_col):
  21.  
  22. pass
  23.  
  24. new_result = []
  25.  
  26. for left_row in left_table:
  27. for right_row in right_table:
  28.  
  29. if left_row[left_join_col] == right_row[right_join_col]:
  30. new_row = left_row + right_row
  31. new_result.append(new_row)
  32.  
  33. return new_result
  34.  
  35. def left_join(self, left_table, right_table, left_join_col, right_join_col):
  36.  
  37. pass
  38.  
  39. new_result = []
  40.  
  41. addnull = None
  42.  
  43. if len(right_table) > 0:
  44. for i in range (1, len(right_table[0])):
  45. addnull = (addnull, None)
  46.  
  47. for left_row in left_table:
  48.  
  49. n = 0
  50.  
  51. for right_row in right_table:
  52.  
  53. if left_row[left_join_col] == right_row[right_join_col]:
  54. new_row = left_row + right_row
  55. new_result.append(new_row)
  56. else:
  57. n = n + 1
  58.  
  59. if n == len(right_table):
  60. new_result.append(left_row + addnull)
  61. else:
  62. new_result = left_table
  63.  
  64. return new_result
  65.  
  66. def right_join(self, left_table, right_table, left_join_col, right_join_col):
  67. return self.left_join(right_table, left_table, right_join_col, left_join_col)
  68.  
  69. def union_all(self, left_table, right_table):
  70. return left_table + right_table
  71.  
  72. def union(self, left_table, right_table):
  73. result = self.union_all(left_table, right_table)
  74.  
  75. new_result = []
  76.  
  77. for row in result:
  78. if row not in new_result:
  79. new_result.append(row)
  80.  
  81. return new_result
  82.  
  83. def order_asc(self, result, col):
  84. result.sort(key=lambda x:x[col])
  85. return result
  86.  
  87. def order_desc(self, result, col):
  88. result.sort(key=lambda x:x[col], reverse=True)
  89. return result
  90.  
  91. def test():
  92. pass
  93.  
  94. left_result = [(1, "aaa"), (2, "bbb"), (3, "ccc"), (6, None), (1, "")]
  95. right_result = [(1, ""), (2, ""), (4, ""), (5, "abc")]
  96. print "left_result=" + str(left_result)
  97. print "right_result=" + str(right_result)
  98. print "=========================================================="
  99.  
  100. sqlmerge = sql_merge()
  101.  
  102. print "inner_join=" + str(sqlmerge.inner_join(left_result, right_result, 0, 0))
  103. print "left_join=" + str(sqlmerge.left_join(left_result, right_result, 0, 0))
  104. print "right_join=" + str(sqlmerge.right_join(left_result, right_result, 0, 0))
  105. print "union_all=" + str(sqlmerge.union_all(left_result, right_result))
  106. print "union=" + str(sqlmerge.union(left_result, right_result))
  107. print "order_asc=" + str(sqlmerge.order_asc(left_result, 0))
  108. print "order_desc=" + str(sqlmerge.order_desc(left_result, 0))
  109.  
  110. if __name__ == "__main__":
  111. test()

测试记录运行结果:

  1. left_result=[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (6, None), (1, '')]
  2. right_result=[(1, ''), (2, ''), (4, ''), (5, 'abc')]
  3. ==========================================================
  4. inner_join=[(1, 'aaa', 1, ''), (2, 'bbb', 2, ''), (1, '', 1, '')]
  5. left_join=[(1, 'aaa', 1, ''), (2, 'bbb', 2, ''), (3, 'ccc', None, None), (6, None, None, None), (1, '', 1, '')]
  6. right_join=[(1, '', 1, 'aaa'), (1, '', 1, ''), (2, '', 2, 'bbb'), (4, '', None, None), (5, 'abc', None, None)]
  7. union_all=[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (6, None), (1, ''), (1, ''), (2, ''), (4, ''), (5, 'abc')]
  8. union=[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (6, None), (1, ''), (2, ''), (4, ''), (5, 'abc')]
  9. order_asc=[(1, 'aaa'), (1, ''), (2, 'bbb'), (3, 'ccc'), (6, None)]
  10. order_desc=[(6, None), (3, 'ccc'), (2, 'bbb'), (1, 'aaa'), (1, '')]

最后貼一张我认为最能说明SQL JOIN关系的图。还有要注意的是not in子查询是可以用左边从上往下第二个left join所代替的。

用python(2.7)自定义实现SQL的集合操作的更多相关文章

  1. sql的集合操作

    原文转自:http://blog.csdn.net/qsyzb/article/details/12560917 SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作. ...

  2. Python 列表、元组、字典及集合操作详解

    一.列表 列表是Python中最基本的数据结构,是最常用的Python数据类型,列表的数据项不需要具有相同的类型 列表是一种有序的集合,可以随时添加和删除其中的元素 列表的索引从0开始 1.创建列表 ...

  3. python笔记04-----字典、元组、集合操作

    1.字典 是一种key-value的数据类型,使用就像字典 无序的因为无下标 创建一个字典: info = {     'stu1':'qq',     'stu2':'ww',     'stu3' ...

  4. Python学习—数据库篇之SQL补充

    一.SQL注入问题 在使用pymysql进行信息查询时,推荐使用传参的方式,禁止使用字符串拼接方式,因为字符串拼接往往会带来sql注入的问题 # -*- coding:utf-8 -*- # auth ...

  5. Python开发【第一篇】Python基础之自定义模块和内置模块

    为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...

  6. Python预编译语句防止SQL注入

    这个月太忙,最近不太太平,我的愿望是世界和平! ================================== 今天也在找python的预编译,早上写的sql是拼接来构成的.于是找了2篇文章,还 ...

  7. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  8. python之django直接执行sql语句

    python之django直接执行sql语句 sql = 'select * from stu' info = 模型类.objects.raw(sql)

  9. python之MySQL学习——防止SQL注入

    python之MySQL学习——防止SQL注入 学习了:https://www.cnblogs.com/xiaomingzaixian/p/7126840.html https://www.cnblo ...

随机推荐

  1. C#第七节课

    for嵌套 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System ...

  2. swift-UITextfield控件的基本属性设置

    //1.初始化UITextField let userName=UITextField(frame: CGRectMake(0, 100, 100, 100)); //2.将文本框userName添加 ...

  3. Es6获取数据

    $(function(){ $.ajax({ //请求方式 type:"GET", //文件位置 url:"js/data.json", //返回数据格式为js ...

  4. Mysql入门详解

    目录 数据库之Mysql 一 .简单了解数据库 二.Mysql的使用 三.多表查询 数据库之Mysql 本篇文章为观看某教学视频后所作个人总结 一 .简单了解数据库 1.1常见关系型数据库 mysql ...

  5. lua返回页面时中文乱码

    1.在nginx.conf文件中的server标签里添加charset utf-8; 2.查看lua文件编码是否为utf-8

  6. sqlalchemy带条件查询相关应用

    sqlalchemy带条件查询 filter_by与filter filter_by 与filter的区别: 1. filter_by只能取值= filter可以==,!=,>=,<=等多 ...

  7. EurekaLog是什么鬼?

    D的all工程文件打开后,莫名其妙就处于等待打开状态.因为最后一次调整是安装了RO9.0.所以一直怀疑是RO的原因.再加上win7授权问题,安装RO一直不顺当.所以折腾的时间最多. 其他把RO全部卸载 ...

  8. Java基础学习总结(39)——Log4j 1使用教程

    1. 配置文件 Log4J配置文件的基本格式如下: #配置根Logger log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderN ...

  9. firefox历史版本下载地址

    http://ftp.mozilla.org/pub/firefox/releases/

  10. mysql绑定多个ip地址

    http://jpuyy.com/2013/07/mysql-bind-multi-address.html mysql绑定多个ip地址 发表于2013 年 7 月 1 日 my.cnf中有选项bin ...