数据库系统概论--读书笔记--11 数据库查询

SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…
from <表名或试图名> [,<表名或试图名>…] |(SELECT 语句)[as] <别名>
[where <条件表达>]
[group by <列名1>[having <条件表达式>]]
[order by <列名>[ASC|DESC]]

1.单表查询

1.选择表中若干列

● 指定列查询
● 查询全部列
● 查询经过计算的值(表达式,常量,函数)

2 . 选择表中若干元祖

● 消除取值重复的行 select distinct 列名 from tablename;
● 查询满足条件的元祖 where 子句

LINK 使用
[not] link ‘<匹配字符>’ [escape’<换码字符>’]
匹配字符% _

3 . order by 子句 ASC升序 DESC 排序

4 . 聚集函数
count() sum() AVG() MAX() MIN()
distinct 取消重复值
where 子句不能用聚合函数作为条件表达式
只能用于select 子句 和 Group by 中的having 子句

5 . group by 子句
查询平均成绩大于90分的学生平局成绩

2 . 连接查询

等值连接查询 自然连接查询 非等值连接查询 自身连接查询 外连接查询
复合条件连接查询
1 . 等值与非等值连接查询
[<表名1>.]<列名><比较运算符>[<表名2>]<列名>
比较运算符= <> >= <= != <>
[<表名1>]<列名1>between [<表名2>.]<列名2.> and [<表名3>.]<列名3>

从两个以上表中查询内容:
select Student.,SC.
from Student,SC
where Student.Sno=SC.Sno;
列名唯一时可以省略前缀。
嵌套循环连接算法。

查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。
select Student.Sno,Sname
from Student,SC
where Student.Sno=SC.Sno and
SC.Cno=‘2’ and SC.Grade>90

2 . 自身连接
(表别名)
select F.cno ,S.cno
from C F,C S
where F.cno=S.cno;

3 .外连接
·select *
from Student LEFT outer join SC on (Student.Sno=SC.Sno)

using 去掉结果中的重复值:from Student LEFT outer join SC
using(Sno)

4 . 多表连接

  1. 嵌套查询

select-from-where 一个查询快
将查询块嵌套在另一个查询块的where子句或having 短语的
条件中的查询称为嵌套查询。

1 . 带有in 的子查询
查找小明所在系院的所有学生
select Sno,Sname,Sdept
from student
where Sdept in
(select Sdept
from Student
where Snmae=‘小明’
)

使用自身连接查询
select S1.Sno,S1.Sname,S1.Sdept
from Student S1,Student S2
where S1.Sdept=S2.Sdept and S2.Sname=“小明”

查询选修了课程名为“信息系统”的学生号和姓名
Student 表 Course表 SC表
select Cno from Course where Cname=‘信息系统’
select Sno from SC where SC.Cno = Cno
select Sno,Sname from Student where Student.Sno in Snos

select Sno,Sname
from Student
where Student.Sno in
( select SC.Sno
from SC
where SC.Cno in
(select Course.Cno
from Course
where Cname=‘信息系统’)
)

select Sno,Sname
from Student
where Student.Sno in
( select SC.Sno
from SC ,Course
where SC.Cno =Course.Cno and Cname=‘信息系统’
)
.select Sno,Sname
from Student ,SC,Course
where Student.Sno =SC.Sno and
SC.Cno =Course.Cno and Cname=‘信息系统’

2 . 带有比较运算符的子查询
父查询与子查询之间用比较运算符进行连接,明确查询是单个值时,
可以用运算符。
select Sno,Sname
from Student
where Student.Sno in
( select SC.Sno
from SC
where SC.Cno =
(select Course.Cno
from Course
where Cname=‘信息系统’)
)
查找每个学超过自己选修课程平均成绩的课程号

select Sno,Sno
from SC x
where grade >=(select AVG(grade)
from SC y
where y.Sno=x.Sno);

有父查询比较称 相关查询
执行过程:
1 . 从外层查询中取出SC的一个元祖X,将X的值传递给内层
select AVG(grade)
from SC y
where y.Sno=“值”
2 . 执行内层查询
select Sno,Sno
from SC x
where grade >=88;
3 . 执行外查询得到结果。

内层查询与外层查询有关时,必须反复求值。

4 . 带有ANY(SOME) 或ALL 谓词的子查询。

5 . 带有exists 谓词的子查询

只产生逻辑真假
select Sname
from Student
where exists
(select * from SC
where Sno=Student.Sno and Cno=“1”)
exists 的子查询,其目标列表达式通常都用*
noexists
带有exists 谓词的子查询不能被其他形式的子查询等价代换,但是所有带
IN,比较运算符,ANY ALL 谓词的子查询 都能用exists 代换。

select Sno,Sname,Sdept
from student
where Sdept in
(select Sdept
from Student
where Snmae=‘小明’
)
select Sno,Sname,Sdept
from Student s1
where exists (
select *
from Student s2
where s1.Sdept =s2.Sdept and
s2.Sname=“小明”
)

全称量词转换ALL
所有课程都选修了
等于 没有一门不选修

select Sname
from Student
where not exsits(
select *
from Coures
where no exsits(
select *
from SC
where Sno=Student.Sno
and Coures.Cno=SC.Cno)
)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值