PB12%' group by d# having count(student_id) > 100; (5)null空值 关系数据库在满足完整性约束的情况下,支持某个tuple的某个属性为null空值,它有一下特性: 算术运算作用于null得到null 聚合函数忽略聚合属性是null的元组 where子句中用is null断言某个属性是null 涉及null的比较,返回一个unknown unknown可以参与逻辑运算,返回值和其逻辑含义保持一致,如unknown and true = true,而unknown and false = unknown 对于unknown的条件P,DBMS认为它是false的 特别注意,count(*)不会忽略unknown的元组 (6)嵌入式子查询 嵌入式子查询是把select语句筛选出的结果当作中间结果,并在此基础上进一步查询的SQL语句 where attr in (subquery)是最常见的用法,比如在dept表中找出是工科院系的系编号d#,在此基础上再来统计个系人数,有以下SQL语句: select d#, count(student_id) from student where student_id like 'PB12%' and d# in (select d# from dept where type = 'engineering') group by d#;
some和all限定符可以在where从句中配合关系运算符进行筛选,下面是书上最经典的例子: 找出比某些(some)经理工资还高的员工: select ename from emp where salary > some (select salary from emp where e# in (select mgr from dept));
找出比所有(all)经理工资还高的员工: select ename from emp where salary > all (select salary from emp where e# in (select mgr from dept));
除此之外,where从句中还可以用exists和unique做存在性和唯一性测试,例子略,配合not还可表示不存在(not exists)以及不唯一/至少两个(not unique) 注:很多DBMS也支持嵌入式子查询出现在select从句中以及from从句中 4.3 修改操作 (1)delete 删除满足条件的元组: delete from where P;
修改操作的花样不如查询的多,但很多高级查询语法也可以用在修改操作中,如嵌套select的in、比较运用于where子句中等 删除语句会导致数据完整性受到破坏,如删除了jcguo这个学生之后,课程成绩表中照样有jcguo的成绩,这些问题将在完整性约束中阐述 (2)insert 插入一个元组: insert into values (completed attr list of tuple);
or
insert into (some attrs) values (matched partial attr list of tuple);
insert的值也可以来自于潜逃select子查询语句: insert into (some attrs) (select ...);
(3)update 更新操作基本SQL语法为: update set {attr = new attr value}+ where P;
4.4 嵌入式SQL 很多高级语言都支持SQL,多用游标+execute SQL command的接口提供给程序员(见PLSQL一章) 4.5 SQL中的函数 最后,这里简要的复习一下SQL里内置的扩展函数 需要说明的是这些函数基本上都很少用到,因为这些操作大多都交给SQL嵌入的外部高级语言去完成了,这里就列一个表,以供复习查看 (1)字符函数
| 函数名 |
函数说明 |
| lower(attr|string value) |
把属性attr或字符串字面值value转换为小写 |
| upper(attr|string value) |
把属性attr或字符串字面值value转换为大写 |
| initcap(attr|string value) |
把属性attr或字符串字面值value的首字母大写(按句处理) |
| concat(v1,v2) |
连接两个属性attr或字符串字面值value |
| lpad(col|value,n,c) |
左补齐v到n个字符,若c不为空则用c填充否则用空格填充 |
| rpad(col|value,n,c) |
右补齐v到n个字符,若c不为空则用c填充否则用空格填充 |
| substr(col|value,pos,n) |
截取子串,从pos其截取n位 |
| instr(col|value,c,pos,n) |
查找字符出现位置,pos是起始查找位,查找第n个出现的字符c |
| length(col|value) |
求字符串长度 |
(2)数值函数 略 (3)日期函数 略 (4)转换函数 略 注:这一小节感觉不是很有用,就不总结了
|