最近在学习公开课 Introduction to Data Science
第二部分讲到关系数据库与关系代数(Relational Databases,Relational Algebra)
其中讲到了 关系数据库
SQL与RA 的关系
选择selection, 负号σc(R) 表示查询表R中符合条件c的列,
例如 σSalary > 40000 (Employee)
表示 "select * from Employee where Salary > 40000"
投影Projection, 负号Π A1,…,An (R) 表示查询表R中的A1... An列,
例如ΠName,Salary(Employee)
表示“select Name, Salary from Employee;
集合运算,符合R S ,表示R与S做笛卡尔积(R中列与S总的列的所有组合)
例如J X P
表示”select * from J,P; 如果J是一个2行3列的表,P是一个4行5列的表,那么结果是一个2*4行3+5列的表。
连接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
公开课Introduction to Data Science的RDBMS总结
原文地址:http://10315054.blog.51cto.com/10305054/1657686