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

本文介绍了SQL的基础知识,包括如何使用聚合函数进行数据汇总和分组,如何创建和使用子查询,以及如何进行表联结操作。此外还探讨了如何通过SQL实现数据的插入、更新和删除,并讲解了如何创建、更改和删除表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL基础教程

第六章汇总和分组数据

6.1使用聚合函数

MIN(expr) 最小值

MAXexpr)最大值

SUMexpr)值的总和

AUGexpr)值的平均值(算术平均数)

COUNTexprexpr中非空值的个数

COUNTexpr)表或集合的行数


6.2创建聚合表达式

聚合表达式不能出现在WHERE子句里:

SELECT title_id

FROM titles

WHEREsales=MAX(sales);

不能在SELECT中混合使用聚合和非聚合:

SELECTtitle_id,MAX(SALES)

FROM titles;


可在SELECT子句中使用多个聚合:

SELECTMINsales),MAXsales

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;

GROUPWHERE之后,ORDERBY 之前


6.10使用HAVING筛选分组

HAVING子句设置GROUPBY 的条件,类似WHERESELECT结合

HAVINGGROUP之后,ORDER之前

应用顺序:

1.WHERE子句从FROMJOIN子句指定的运算结果筛选行

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使用JOINWHERE创建联结

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;


检索authorspublishers的所有列:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值