公开课Introduction to Data Science的RDBMS总结

最近在学习公开课  Introduction to Data Science

第二部分讲到关系数据库与关系代数(Relational Databases,Relational Algebra

其中讲到了 关系数据库


  • SQL与RA 的关系

  1. 选择selection, 负号σc(R)  表示查询表R中符合条件c的列,

    例如 σSalary > 40000 (Employee)

    表示  "select * from Employee where Salary > 40000"   

  2. 投影Projection, 负号Π A1,…,An (R)  表示查询表R中的A1... An列,

    例如ΠName,Salary(Employee)

    表示“select Name, Salary from Employee;

  3. 集合运算,符合R 技术分享 S ,表示R与S做笛卡尔积(R中列与S总的列的所有组合)

    例如J X P 

    表示”select * from J,P;   如果J是一个2行3列的表,P是一个4行5列的表,那么结果是一个2*4行3+5列的表。



  4. 连接Join,  条件连接,左连接,右连接

  •  技术分享4.1   条件连接,符号R θ S, 表示RXS中符合条件θ的 组合,如 "select * from J,P where J.id = p.id" 等同于 select * from J  JOIN P ON  J.id = P.id" ,  注INNER JOIN 同JOIN相同。 

  • 4.2   左外连接R 技术分享 S, 表示列出R中与S中符合条件的组合,如果S中没有对应的项,则其值认为是null,  如”select  * from P LEFT OUTER JOIN  ON P.age = J.age;“  其中 LEFT OUTER JOIN 等同于LEFT JOIN

  • 技术分享4.3  右外链接,与左外链接相反.  


  5.   Union  符号R1∪R2,  表示组合两个表,这两个表必须具有相同的格式, 如select age from P  UNION (select age from J);  如果P中有两列age分别为(1,2), J中有两列age分被为(2,3) 那么结果就是(1,2,3) ,注意这里小区了重复的记录,使用UNION ALL 可以得到(1,2,2,3) 带有重复记录的所有结果。

  6.   intersection 符号R1∩R2,  表示列出R1与R2相同的记录, R1 ∩ R2 = R1 – (R1 – R2)   ,  R1 ∩ R2 = R1 θ R2   条件是记录相同。

  7.   difference 符号R1-R2, 表示列出R1中的在R2中查不到的记录, select * from P where age not in (select age from J); 

 

  SQL优化

   课程中讲到 SQL is what, not how。 意思是SQL 定义了我们需要的结果,而不是如数如何操作的? 实际上DB会在SQL上做一些优化比如 Sqlite 的 The SQLite Query Planner, Mysql 的 优化Optimization , 实际中还是需要手工优化的

  在课后作业similarity matrix 中需要计算两两文档的相似性,实际是一个矩阵的运算。

   1) 代码如下,用时1m22.042s

 

select x.docid,y.docid,sum(x.count*y.count)as count from Frequency x, Frequency y where x.term = y.term and x.docid < y.docid group by x.docid, y.docid  ORDER BY  count  ASC;

   2) 提交答案只需要,结果中的某一个, 用时 1m10.919s, 可以看出这里实际还是计算了所有文档的相似性后截取的,DB并没有优化。

select * from (select x.docid as a ,y.docid as b,sum(x.count*y.count)as count from Frequency x, Frequency y where x.term = y.term and x.docid < y.docid group by x.docid, y.docid  ORDER BY  count  ASC)x where x.a="10080_txt_crude" and x.b="17035_txt_earn";


   3) 手工将上面的where限定语句放入计算过程中, 用时0m0.005s

select * from (select x.docid as a ,y.docid as b,sum(x.count*y.count)as count from Frequency x, Frequency y where x.term = y.term and x.docid < y.docid  and x.docid="10080_txt_crude" and y.docid="17035_txt_earn" group by x.docid, y.docid  ORDER BY  count  ASC)x;

   

   将上面的例子放入mysql 中 SQL 1)的执行,运行了10分钟还没结果!



  课后题答案

   上传到了github

    https://github.com/trumanz/coursera/tree/master/datasci/assignment_Relation_DB



本文出自 “10305054” 博客,请务必保留此出处http://10315054.blog.51cto.com/10305054/1657686

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。