查询二三事(Chapter 3)
select 子句
格式
select语句的格式如下
SELECT <[DISTINCT] c1,c2,...>
FROM <r1,r2,...>
[WHERE <condition>]
[GROUP BY <c1,c2,...> [HAVING <condition>]]
[ORDER BY <c1 [DESC][,c2[DESC|ASC],...]>]
- select后的东西可以加上+-*/等符号
- 条件可以舍去
- 执行顺序是from,where,select
为from子句中列出的关系产生笛卡儿积
在其结果上应用where语句中所指定的条件
输出select语句中指定的属性或表达式的结果 - order by 默认升序
Natural join
按照相同的属性对应来连接两张表
先列出两个关系模式中的共同属性,然后是表一的独有属性,表二的独有属性
可以用在from子句中
SELECT [DISTINCT] 列名(或表达式)
FROM 表1 NATURAL JOIN 表2
WHERE 条件
如果两张表中不止一个相同的属性,那么natural join只会在所有同名属性都相同的时候才连接
如果不希望要求所有的都相同时才连接,而是以其中一个属性为连接纽带
可以用这样的形式来
表明将表一与表二按照属性来连接
FROM 表1 JOIN 表2 USING 属性1
集合运算
UNION并
可自动去除重复,要保留的话用UNION ALL
INTERSECT交
可自动去除重复,要保留的话用INTERSECT ALL
EXCEPT差
可自动去除重复,要保留的话用EXCEPT ALL
NULL
- 用在where语句中
IS NULL
IS NOT NULL
- 所有含有NULL的运算结果都是NULL
- 所有含有NULL 的比较都返回unknown
- OR,AND,NOT
unknown or true=true
unkonwn or false=unknown
unknown or unknown=unknown
true and unknown=unknown
false and unknown=false
unknown and unknown=unknown
not unknown=unknown
- Aggregate Function会忽略NULL值,除了Count
Aggregate Function
- avg()
- min()
- max()
- count()
- sum()
使用聚合函数的时候,如果select的东西有不是聚合函数的,就用group by子句来整合
select avg(salary), company_name
from works
group by company_name;
返回的是各个公司的平均薪水
特殊子句
Exists 结构
exists结构在作为参数的子查询非空时返回true
关系A包含关系B可以写成
NOT EXISTS (B except A)
即不存在有元素在B中却不在A中,也就是B中的全在A中
select Name As Customers
from Customers
where not exists(select * from Orders where Customers.Id=Orders.CustomerId);
对Customers中的每一个tuple进行检查,如果“not exists”后中的查询语句搜索不出任何东西,那么该tuple中的name选择出来
Unique结构
结构在作为参数的子查询中没有重复结果的时候返回true
SELECT
T.course_id
FROM
course AS T
WHERE
UNIQUE( SELECT
R.couse_id
FROM
section AS R
WHERE
T.course_id = R.course_id);
等效于下面这样的表达
SELECT
T.course_id
FROM
course AS T
WHERE
1 >= (SELECT
COUNT(R.couse_id)
FROM
section AS R
WHERE
T.course_id = R.course_id);
with子句
用于定义临时关系
WITH 新表名 (c1,c2,...) AS(
SELECT 子句
)
like 子句
- 百分号%:匹配任意字符串
- 下划线_:匹配任意一个字符
select Name
from Department
where Building like '%Waston%';
找到building属性含有Waston子串的tuple,返回其Name属性
- like子句中使用escape来定义转义字符
like 'abc\%d%' escape '\'
表明匹配以abc%d开头的字符串
- 可以使用not like搜寻不匹配项
between and
select name
from works
where salary between 9000 and 10000;
等效于
select name
from works
where salary>=9000 and salary<=10000;
All & Some
用于集合的比较
- some 表示子查询中的某一条record
eg. “至少比某一个要大”可用“> some”来表示
SELECT
name
FROM
works
WHERE
salary > SOME (SELECT
salary
FROM
works
WHERE
company = 'xxxx');
表示找出至少比xxxx公司某一个员工工资高的name
- all 表示子查询中的所有record
eg. “大于所有的”可用“> all”来表示
SELECT
name
FROM
works
WHERE
salary > ALL (SELECT
salary
FROM
works
WHERE
company = 'xxxx');
表示找出比xxxx公司所有员工工资都高的name
数据修改,插入,删除
update中的case语句
case
when p1 then r1
when p2 then r2
when p3 then r3
end