SQL基础教程
第六章汇总和分组数据
6.1使用聚合函数
MIN(expr) 最小值
MAX(expr)最大值
SUM(expr)值的总和
AUG(expr)值的平均值(算术平均数)
COUNT(expr)expr中非空值的个数
COUNT(expr)表或集合的行数
6.2创建聚合表达式
聚合表达式不能出现在WHERE子句里:
SELECT title_id
FROM titles
WHEREsales=MAX(sales);
不能在SELECT中混合使用聚合和非聚合:
SELECTtitle_id,MAX(SALES)
FROM titles;
可在SELECT子句中使用多个聚合:
SELECTMIN(sales),MAX(sales)
FROM titlesl;
除非对于分组列,可以混合:
SELECTtype,SUM(sales)
FROM titles;
GROUP BY type;
不可嵌套聚合函数
可以在子查询中使用聚合表达式:
SELECTtitle_id,price
FROM titles
WHERE sales=
SELECT MAX(sales)FROM titles;
7.可以在聚合表达式中使用子查询
6.9使用GROUPBY 分组行
SELECT
au_id
COUNT(*) AS“num_books”
FROM title_authors
GROUP BY au_id;
GROUP在WHERE之后,ORDERBY 之前
6.10使用HAVING筛选分组
HAVING子句设置GROUPBY 的条件,类似WHERE与SELECT结合
HAVING在GROUP之后,ORDER之前
应用顺序:
1.WHERE子句从FROM和JOIN子句指定的运算结果筛选行
2.GROUPBY子句对WHERE子句的输出进行分组
3.HAVING子句对分组后的结果筛选行
SELECT
au_id
COUNT(*) AS“num_books”
FROM title.authors
GROUP BY au_id
HAVING COUNT(*)>=3;
第7章联结
联结的类型:
交叉联结crossjoin
自然联结naturaljoin
内联结innerjoin
左外联结leftjoin
右外联结rightouter join
全外联结fullouter join
自联结self-join
7.4使用JOIN或WHERE创建联结
JOIN:
SELECTau_fname,au_lname,a.city
FROM authors a
INNER JOINpublishers p
ON a.city=p.city
WHERE:
SELECTau_fname,au_lname,a.city
FROM authors a,publishers p
WHERE a.city=p.city;
7.5使用CROSSJOIN创建交叉联结
交叉联结返回两个表中行所有可能组合,结果包含第一个表的所有行,第一个表的每一行于第二个表的所有行组合
SELECT
au_id
pub_id
a.state AS“au_state”
p.state AS“pub_state”
FROM authors a
CROSS JOIN publihersp;
WHERE:
SELECT au_id,pub_id,
s.state AS“au_state”,
p.state AS“pub_state”
FROM authorsa,publishers p;
检索authors和publishers的所有列:
SELECT *
FROM authors
CROSS JOINpublishers
WHERE:
SELECT *
FROMauthors,publishers;
7.6使用NATURALJOIN创建自然联结
自然联结是等值联结的一个特例,它比较一个表中的所有的列和其他表中具有相同名称的列的等同性
SELECT
title_id
pob_id,
pub_name
FROM publishers
NATURAL titles;
7.7使用INNERJOIN 创建内联结
使用比较操作符匹配两个表的行(基于每一个表同名列的值)
SELECT
a.au_id,
a.au_fname,
a,au_lanme.
Ta.title_id
FROM JOINtitle_authors ta
ON a.au_id =ta.au_id
ORDER BY au_idASC,ta.title_id ASC
SELECT
a.au_id,
a.au_fname,
a.au_lname,
a.city
a.state
FROM authors a
INNER JOINpublishers p
ON a.city=p.city
AND a.state=p.state
ORDER BY a.au_id;
1.使用OUTERJOIN创建外联结
创建左外联结
SELECT columns
FROM left_table
LEFT []OUTER] JOIN right_table
ON join_conditions
创建全外联结
SELECT columns
FROM left_table
FULL [OUTER] JOINright_table
ON join_conditions
7.9创建自联结
经常被使用在由有反身联系的表中(reflexxiverelationship)(反身联系是指主健/外健同为一个表中的列或列的组合
创建自连结
SELECT columns
FROM table[AS]alias1
INNER JOIN table[AS] alias2
ON join_conditions
第8章子查询
子查询也称作内查询,包含子查询的有语句被称作外查询
关键字IN引出子查询来测试成员资格
SELECT pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHEREtype='biography');
8.4简单子查询(simplesubquery)也叫非相关子查询(noncorrelatedsubquery):指能够独立于外部查询的子查询
相关子查询(correlatedsubquery)无法独立于外部查询,它是依赖于外部查询结果的内部查询
相关子查询提供比简单子查询更有力的数据检索机制
简单查询:
SELECT au_id,city
FROM authors
WHERE city IN
('New York','SanFranciscio');
相关子查询
SELECTcandidate.title_id,
candidate.type,
candidate.salees
FROM titlescandidate
WHERE sales >=
(SELECT AVG (sales)
FROM titles average
WHEREavenge.type=canadidate.type)
语义上的等价并不意味着查询的速度相同
8.10ALL
SELECT tl.type
FROM titles t1
GROUP BY t1.type
HAVING MAX(t1.sales)>= ALL
(SELECT 2.0* AVG(t2.sales)
FROM titles t2
WHEREt1.type=t2.type);
8.11ANY
SELECTau_id,au_lname,au_fname,city
FORM authors
WHERE city=ANY
(SELECT city
FROM publishers);
8.12使用EXISTS检测存在性
SELECT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles t
WHEREt.pub_id=p.pub_id
ANDtype='biography');
以下6个查询语义等价
SELECT DISTINCTa.au_id
FROM authors a
INNER JOINtitle.authors ta
ON a.au_id=ta.au_id;
SELECT DISTINCTa.au_id
FROM authorsa.title_authors ta
WHEREa.au_id=ta.au_id;
SELECT auid
FROM authors a
WHERE au_id IN
(SELECT au_id
FROM title_authors);
SELECT au_id
FROM authors a
WHERE au_id=ANY
(SELECT au_id
FROM title authors)
SELECT au_id
FROM authors a
WHERE EXISTS
(SELECT *
FROM title.authorsta
WHEREaau_id=ta.au_id);
SELECT au_id
FROM authors a
(SELECT COUNT(*)
FROM title_authorsta
WHEREa.au_id=ta.au_id();
第九章集合操作
9.1使用UNION合并行
UNION去重,UNIONALL 不去重
SELECT state FROMauthors
UNION
SELECT state FROMpublishers;
9.2使用INTERSECT查找相同行
SELECT city
FROM authors
INTERSECT
SELECT city
FROM publishers;
9.3使用EXCEPT查找不同行
SELECT city
FROM authors
EXCEPT
SELECT city
FROM publishers;
第10章插入、更新、删除行
10.2使用INSERT插入行
10.3使用UPDATE更新行
UPDATE tables
SET contract=0;
104使用DELETE删除行
DELETE FROMtitle.authors
WHERE title_id IN
(SELECT title_id
FROM titles
WHERE pub_id('P01','P04')));
第11章创建、更改和删除行
11.2约束定义了列允许值的规则,DBMS使用这些规则自动强制性地保证数据库信息的完整性
11.3
使用CREATETABLE创建新表
11.4
使用NOTNULL 禁止空值
11.5
使用DEFAULT确定默认值
11.6
使用PRIMARYKEY指定主键
11.7
使用FOREIGNKEY 指定外键
11.8
使用UNIQUE确保值唯一
11.9
使用CHECK创建检查约束
11.10使用CREATETEMPORARY TABLE创建临时表
11.11
使用CREATETABLE AS 利用已存在表创建新表
CREATE GLOBALTEMPORARY TABLE titles2 AS
SELECTtitle_name,sales
FROM titles
WHERE pub_id='P01';
11.12使用ALTER TABLE修改表
ALTER TABLE authors
ADD email_addressCHAR(25);
11.13
使用DROPTABLE删除表
DROP TABLEroyalitues;
标准的SQL允许指明RESTRICT限制(安全)或CASCADE(级联)(不安全)删除行为