3.4其他基本操作
3.4.1重命名
1. 需要重命名属性的场景:
a) 两个关系中包含同名属性
b) Select 子句中包含数学表达式
c) 就是想换个名字
2. 重命名的语法: old-name as new-name
3. as可以出现在select和from子句中。不过在以前的SQL中没有as这个关键字。在Oracle的from 子句中就不允许使用as,则在select子句中则可用可不用。
4. 将as用于重命名关系十分有用。第一,可通过重命名用短的别名替换长名称
5. 另一个重要的理由:我们必须通过重命名一个关系才能比较同一个关系中的元组。
6. 如果要求一个关系与其自身的笛卡尔积,不通过重命名的话,根本无法区分两个元组。
7. 假设我们要找出生物系所有不拿最低工资(工资至少比另外一个人高)的老师的名字,可以使用下面的SQL
8. selectdistinct T.name
from instructoras T,instructor asS
where T.salary> S.salary and S.dept name= ’Biology’;
9. 在上面的例子中,如果我们使用instructor.salary的话根本无法区分到底哪个要比哪个的工资高。
10. 关系的别名在SQL标准中被称作correlation name,又称table alias, or acorrelation variable, or atuplevariable.
3.4.2字符串操作
1. 字符串用单引号括起来。字符串里面的单引号用两个连续的单引号表示。
2. SQL标准要求字符串比较时区分大小写,但是MySQL SqlServer没有这样做。不过可以在数据库一级或者进行单个操作时进行设置。
3. 模式匹配:%匹配0或多个字符,_匹配1个字符
4. 模式匹配如果要把匹配符“%”以及“_”也包括进去的话必须使用转义字符(Escape Character)
a) like ’ab\%cd%’escape ’\’能匹配所有以ab%cd开头的字符串
b) like ’ab\\cd%’escape ’\’能匹配所有以ab\cd开头的字符串
5. not like可搜索不匹配项。某些数据库提供不区分大小写进行匹配的Like操作。
3.4.3在Select子句中指定属性
6. *——asterisk symbol,表示所有属性
3.4.4 排序
7. order by 默认升序(asc),降序使用desc
8. 可以某个字段升序,另一个字段降序
9. order by salarydesc,name asc;
3.4.5Where子句中的谓词
10. between … and… 取的是完全闭区间。
11. 在SQL中可用(v1, v2, . . ., vn)的形式来表示一个元组。元组之间可以进行大、小于、相等等比较。
12. (a1,a2)<=(b1,b2)与a 1 <=b1and a2 <=b2等价,
13. (instructor.ID,dept name)= (teaches.ID, ’Biology’)与instructor.ID=teaches.IDand dept name= ’Biology’等价
3.5集合操作
14. union、intersect、except 三个操作的含义与数学上的并、交、差是一样的。
3.5.1 Union
15. union是集合操作,默认会去重,select则不会。
16. 如果不想去重则应该用union all
3.5.2intersect
17. intersect 也会去重,对应的也有intersectall版本。
3.5.3except
18. except 、except all
3.6 Null
19. 在数学计算、比较、集合操作中遇到null值时需要特殊处理
20. 数学表达式中如果有null值,则该表达式的值也为null
21. 比较操作中遇到null值的话要麻烦一些。
22. 考虑1< null ,因为不知道1的确切值,所以该表达式不为真,但也不为假,不然not(1<null)就应当为真了。因此,SQL认为所有包含null的比较的结果都为unknown——也就是说有null的比较的结果还是null?——这跟判断是否is null是不一样的。
23. true and unknown = unknown
24. false and unknown = false
25. not unknown = unknown
26. 如果一个元组代入Where的谓词中的计算结果是false或者unknown则这个元组不会被加入结果集中。
27. 当在select distinct 、集合操作中要对两个元组进行比较判断它们是否相等时如果对应的属性处都为null则视为相等。也即:(’A’,null)和(’A’,null)是相等的而不是unknown