欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

《SQL基础教程》笔记(四)

程序员文章站 2022-05-03 17:55:01
sql基础教程 第六章汇总和分组数据 6.1使用聚合函数 min(expr) 最小值 max(expr)最大值 sum(expr)值的总和 aug(expr)值的平均值(算术平均数) count(e...

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(级联)(不安全)删除行为