关系数据库标准语言SQL(2)


数据查询

SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名> [,<表名或视图名>] |(<SELECT语句>)[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY <列名1>  [HAVING <条件表达式>]]
[ORDER BY <列名2>  [ASC|DESC]];
  1. 整个select语句的含义是,根据where子句的条件表达式从from自居指定的基本表、视图或派生表中找出满足条件的元组,再按select子句中的目标列表式选出元组中的属性值形成结果表
  2. 如果有group by子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
  3. 如果有order by子句,则结果表还要按<列名2>的值进行升序或降序排序
1. 单表查询
1. 选择表中的若干列
  • 查询指定列
select Sno,Sname 
from Student;
查询指定列
  • 查询全部列
select * 
from Student;
查询全部列
  • 查询经过计算的值
select Sname,2019-Sage 
from Student;
查询经过计算的值
2. 选择表中的若干元组
  • 消除取值重复的行
seletct Sno 
from SC;
select distinct Sno 
from SC;
image.png
  • 查询满足条件的元组
    通过where子句实现

常用的查询条件

  1. 比较大小
    =, >, <, >=, <=, !=, <>, !>, !<, NOT+以上运算符
  2. 确定范围
    between and, not between and
  3. 确定集合
    in ,not in
  4. 字符匹配
    like, not like
  5. 空值
    is null, is not null
  6. 多重条件(逻辑运算)
    and, or, not
3. ORDER BY子句

用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC),默认为升序(ASC)

select * 
from Student 
order by Sdept,Sage desc;
order by子句
4. 聚焦函数
  • COUNT(*)
    统计元组个数
select count(*) 
from student;
统计元组个数
  • COUNT([DISTINTCT|ALL] <列名>)
    统计一列中值的个数
select count(distinct Sno) 
from SC;
统计一列中值的个数
  • SUM([DISTINTCT|ALL] <列名>)
    计算一列值的总和(此列必须是数值型)
  • AVG([DISTINTCT|ALL] <列名>)
    计算一列值的平均值(此列必须是数值型)
select avg(Grade) 
from SC 
where Cno='1';
计算一列值的平均值
  • MAX([DISTINTCT|ALL] <列名>)
    求一列值中的最大值
  • MIN([DISTINTCT|ALL] <列名>)
    求一列值中的最小值
5. GROUP BY子句

GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。

select Cno,count(Sno) 
from SC 
group by Cno;
求各个课程号及相应的选课人数
select Sno 
from SC group by Sno 
having count(*)>3
查询选修了三门以上课程的学生学号
2. 连接查询
1. 等值与非等值连接查询
[<表名1>.] <列名1> <比较运算符> [<表名2>.] <列名2>
# 比较运算符只要有 =, >, <, >=, <=, !=(或<>)等。

或使用以下形式

[<表名1>.] <列名1> BETWEEN  [<表名2>.] <列名2> AND [<表名2>.] <列名3> 

连接符号为=时,称为等值连接;使用其他运算符为非等值连接。

select Student.*,SC.* 
from Student,SC 
where Student.Sno = SC.Sno;
查询每个学生及其选修请课程的情况
2. 自身连接

连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。

select first.Cno,second.cpno 
from Course first,Course second 
where first.Cpno= second.Cno;
查询每一门课的间接先修课
3. 外连接

通常的连接操作中,只有满足连接条件的元组才能作为结果输出。不满足条件的元组,也就是被舍弃的元组称为悬浮元组。如果想把悬浮元组也保存在结果关系中,而在其他属性上填空值(NULL),这种连接就叫做外连接。
左外连接列出左边关系中所有的元组
右外连接列出右边关系中所有的元组

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student 
left outer join SC on
(Student.Sno=SC.Sno);
左外连接
4. 多表连接

两个以上的表进行连接通常称为多表连接。

3. 嵌套查询
  1. 在SQL语言中,一个select-from-where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询称为嵌套查询。
  2. 上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询。
  3. 子查询的select语句中不能使用order by子句,order by子句只能对最终结果排序。
1. 带有IN谓词的子查询
select Sno,Sname,Sdept
from Student
where Sdept in 
        (select Sdept 
        from Student
        where Sname='liuchen');
带有IN谓词的子查询
2. 带有比较运算符的子查询

比较运算符:<, >, =, <=, >=, !=,<>
可以用in代替=

3. 带有ANY(SOME)或ALL谓词的子查询
>ANY      大于子查询结果中的某个值
>ALL      大于子查询结果中的所有值
<ANY      小于子查询结果中的某个值
<ALL      小于子查询结果中的所有值
>=ANY     大于等于子查询结果中的某个值
>=ALL     大于等于子查询结果中的所有值
<=ANY     小于等于子查询结果中的某个值
<=ALL     小于等于子查询结果中的所有值
=ANY      等于子查询结果中的某个值
=ALL      等于子查询结果中的所有值(通常没有实际意义)
!=(或<>)ANY   不等于子查询结果中的某个值
!=(或<>)ALL   不等于子查询结果中的任何一个值
4. 带有exists谓词的子查询
4. 集合查询

集合操作主要包括并操作UNION,交操作INTERSECT和差操作EXCEPT
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。

5. 基于派生表的查询

子查询不仅可以出现在where语句中,还可以出现在from子句中,这时子查询生成的临时派生表成为主查询的查询对象。


数据更新

1. 插入数据
1. 插入元组
INSERT
INTO <表名>  [(<属性列1> [, <属性列2>] ...)]
VALUES (<常量1> [, <常量2>]...);
2. 插入子查询结果
INSERT
INTO <表名>  [(<属性列1> [, <属性列2>] ...)]
子查询;
2. 修改数据
UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>]... 
[WHERE <条件>] 
1. 修改某一个元组的值
2. 修改多个元组的值
3. 带子查询的修改语句
3. 删除数据
DELETE 
FROM <表名>
[WHERE <条件>] 
1. 删除某一个元组的值
2. 删除多个元组的值
3. 带子查询的删除语句
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342