查詢二三事(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后的東西可以加上+-*/等符號
- 條件可以舍去
- 執(zhí)行順序是from馋劈,where哩盲,select
為from子句中列出的關(guān)系產(chǎn)生笛卡兒積
在其結(jié)果上應用where語句中所指定的條件
輸出select語句中指定的屬性或表達式的結(jié)果 - order by 默認升序
Natural join
按照相同的屬性對應來連接兩張表
先列出兩個關(guān)系模式中的共同屬性,然后是表一的獨有屬性掠手,表二的獨有屬性
可以用在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的運算結(jié)果都是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()
使用聚合函數(shù)的時候戒良,如果select的東西有不是聚合函數(shù)的,就用group by子句來整合
select avg(salary), company_name
from works
group by company_name;
返回的是各個公司的平均薪水
特殊子句
Exists 結(jié)構(gòu)
exists結(jié)構(gòu)在作為參數(shù)的子查詢非空時返回true
關(guān)系A(chǔ)包含關(guān)系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結(jié)構(gòu)
結(jié)構(gòu)在作為參數(shù)的子查詢中沒有重復結(jié)果的時候返回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子句
用于定義臨時關(guān)系
WITH 新表名 (c1,c2,...) AS(
SELECT 子句
)
like 子句
- 百分號%:匹配任意字符串
- 下劃線_:匹配任意一個字符
select Name
from Department
where Building like '%Waston%';
找到building屬性含有Waston子串的tuple耗拓,返回其Name屬性
- like子句中使用escape來定義轉(zhuǎn)義字符
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
數(shù)據(jù)修改,插入奏司,刪除
update中的case語句
case
when p1 then r1
when p2 then r2
when p3 then r3
end