ucb cs186 课程笔记(更新中)
lec2
join: inner join, natural join, outer join
sql 实际执行模型 写起来是 SELECT - FROM - GROUP BY - HAVING - WHERE - DISTINCT - ORDER BY
实际是 FROM(table过滤) - GRUOP BY(行分组) - HAVING(组过滤) - WHERE(行过滤) - DISTINCT(行去重) - SELECT(行内列过滤)
inner join:叉积,对AB所有行组合
SELECT * FROM TABLE1 t1, TABLE2 t2
WHERE t1.id = t2.id
AND ...
-- 等效于
SELECT * FROM
TABLE1 t1 INNER JOIN TABLE2 t2
ON t1.id = t2.id
WHERE ...
-- 下面这种更加清晰一点
-- 等效于
SELECT * FROM
TABLE1 t1 NATURAL JOIN TABLE2 t2
WHERE ...
-- natural join就是在组合的基础上自动用了一个过滤,要求table所有相同名字的列的值都相同
outer join:
Left Outer join:
A LEFT OUTER JOIN B ON cond 如果cond满足的话,得到的是AB的组合(一行有A的列+B的列);如果不满足,得到A的列+空
Right Outer Join 同理
Full Outer Join 同理 例如ON A.id = B.id
如果有A没有对应的B, 那就是是 A + 空
如果有B没有对应的A, 那就是 空 + B
非常好的图

alias
简化 + 看起来更清楚(尤其是self-join)
FROM TABLE1 AS x, TABLE1 AS y
String Comp
LIKE或者正则S.name ~ '^B.*' (等效于S.name LIKE 'B_%')
AND OR 做条件交并
EXCEPT UNION (ALL) INTERSECT做子查询结果集合的交并差
IN EXISTS用于子查询 (NOT IN, NOT EXIST) EXISTS是判空
SELECT S.sname FROM Sailors S WHERE S.sid IN
(SELECT R.sid FROM Reserves R WHERE R.bid=102)
还有ANY ALL
ARGMAX?
SELECT * FROM Sailors S WHERE
S.rating >= ALL
(SELECT S2.rating FROM Sailors S2)
View: Named Queries
CREATE VIEW xxx
AS ...
SELECT * FROM xxx;
cache and reuse
或者
WITH [viewname] AS [statement]创建一个临时view
NULL 参与的运算大多是NULL, 除了IS NULL,False AND NULL这种