SQL简介
SQL 类似relational model 已经用了非常久的年份,是一个标准的语言。
是申明性的语言,基于关系代数。
关于SQL术语
SQL语句
下面所有的sql语句基于的relational model都是自学笔记(6)中的大学申请系统
基本select
Table variable
table variable主要影响的是from 语句后面,相当于是对table进行简写,这样可以在where语句中使用。
Union
- 上面的 as name 是为了将attribute的名字统一,否则sql会自行选取一个当作attribute的名字。
- 如果是union 后面加 all ,则结果中会有duplicate存在
intersect
Except
上面的sql语句是从Apply中查询申请cs但是没有申请ee的学生的ID
Subqueries in WHERE clause
这是我感觉有点难度的地方,需要结合实际问题好好体会subquery的用法。
subquery是内嵌的,用的正确恰当会非常powerful!
in操作
比如下面的subquery语句,选出major是cs同学的ID和Name,这样的结果就不会有duplicate
如果用下面的sql查询语句,就可能有重复的value,因为某个学生可能申请了很多学校!
duplicate有时候是很重要的 也很tricky,值得我们引起注意!
下面的这个sql查询语句效果等同于之前用的except例子!
exist
老师上课说exist是查询存在不存在(我怎么感觉和in是一码事情)!
网上查了下
当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用。in 和 exists的区别如下:
1、运用情况不同
sql中in适用于子查询得出的结果集记录较少,主查询中的表较大且又有索引的表,。sql中exist适用于外层的主查询记录较少,子查询中的表大,又有索引的时候。
2、驱动顺序不同
IN是先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。exists是以外层表为驱动表,先被访问。
3、对NULL值处理不同。
IN不对NULL进行处理,exists会对NULL值进行处理。
4、底层原理不同
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
All
all关键词用来查询subquery的条件是否满足在主查询语句下
比如下面的查询语句,用来查出最高gpa学生(返回学生的名字和gpa)
Subqueries in FROM and SELECT clauses
这节课开始有点难度了,需要仔细看老师的例子。下面的查询语句可以转换成
下面这样 将 subquery放在from中!
The JOIN family of operators
inner join
格式如下:
去掉inner后只剩join,效果同 innter join一样。注意如果直接用","相当于是把两个table做一个cross-product,即笛卡尔积。
natural join
natural join 自动会把相同的attribute合并
老师建议用 table join table using(attribute)的形式形成我们所需要的关系
left outer join
指即便左边的table没有对应的tuple,也会加入到我们的结果中
在上面的例子中,即便student中没有申请,也会加入我们的结果list!
right outer join
和left outer join 类似 只不过换了一个边
full outer join
结合了left和right outer join 可以理解为 left outer join Union right outer join