登陆注册
18668900000011

第11章 Oracle数据库基础——SQL语言(6)

5.4.1.5 对查询结果分组

默认情况下,表中所有的行作为一个组处理。在SELECT语句中可以使用GROUP BY子句将行划分成较小的组。然后,使用聚组函数返回每一个组的汇总信息。另外,可以使用HAVING 子句限制返回的结果集。

GROUP BY子句可以将查询结果的各行按一列或多列取值相等的原则进行分组,值相等的为一组。如果未对查询结果分组,聚组函数将作用于整个查询结果,即整个查询结果只有一个函数值。否则,聚组函数将作用于每一个组,即每一组都有一个函数值。

例5-88 查询各个课程号与相应的选课人数。

SQL>SELECT cno,count(Sno)

FROM sc

GROUP BY cno;

该SELECT语句对sc表按cno的取值进行分组,所有具有相同cno值的元组为一组,然后对每一组作用聚组函数COUNT以求得该组的学生人数。

如果分组后还要求按一定条件对这些组进行选择,最终只输出满足条件的组,则可以使用HAVING子句指定选择条件。

例5-89 查询选修4门以上课程的学生的学号。

SQL>SELECT sno

FROM sc

GROUP BY sno

HAVING COUNT(*)>4;

使用GROUP BY和HAVING子句时要注意以下几个问题。

①带有GROUP BY 子句的查询语句中,在SELECT子句中指定的列要么是GROUP BY子句中指定的列,要么包含聚组函数,否则出错。

例5-90 没有包含GROUP BY子句的SELECT语句。

SQL>SELECT ename,sum(sal)FROM emp

语句执行时出错。改成下列语句则就是正确的:

SQL>SELECT ename,sum(sal)FROM emp

GROUP BY ename;

但在GROUP BY 子句中的列不一定非在SELECT子句中出现。

例5-91 按JOB分组,查询每一类JOB的最大工资。

SQL>SELECT max(sal)FROM emp

GROUP BY job

②可以使用多个列进行分组。

例5-92 查询每个部门的每种职位的雇员数。

SQL>SELECT deptno,job,count(*)

FROM emp

GROUP BY deptno,job

③查询语句的SELECT和ORDER BY、HAVING子句,是聚组函数唯一可以出现的地方。在WHERE子句中不能使用聚组函数。

例5-93 使用聚组函数的WHERE子句。

SQL>SELECT deptno,avg(sal)FROM emp

WHERE avg(sal)>2000

GROUP BY deptno;

语句执行后出现一个错误。正确的做法是在数据库中将所有行分组,然后使用HAVING子句限制这些分组行的输出如例。

例5-94 输出总工资大于8500的部门及部门的总工资。

SQL>SELECT deptno,sum(sal)

FROM emp

WHERE sal>1000

GROUP BY detpno

HAVING sum(sal)>8500

ORDER BY deptno

当在GROUP BY子句中使用HAVING子句时,查询结果中只返回满足HAVING条件的组。在一个SELECT语句中可以有WHERE子句和HAVING子句,均用于设置限定条件。HAVING子句与WHERE子句的区别如下。

WHERE子句的作用是在对查询结果进行分组前,将不符合WHERE条件的行去掉。即在分组之前过滤数据。WHERE条件中不能包含聚组函数。使用WHERE条件选择满足条件的行。

HAVING子句的作用是筛选满足条件的组,即在分组之后过滤数据。HAVING条件中经常包含聚组函数。使用HAVING条件选择满足条件的组。使用HAVING子句时必须首先使用GROUP BY进行分组。

5.4.1.6 SELECT 语句中的表达式

SQL命令中可以使用加、减、乘、除算术运算符构成表达式:在SELECT语句的各个子句中,除了FROM子句中不能使用表达式以外,其他任何子句都可以使用表达式,在一条查询语句中可多处使用表达式。

例5-95 查询奖金高于其工资的5%的雇员信息。

SQL>SELECT ename,sal,comm,comm/sal FROM emp

WHERE comm>0.05*sal

ORDER BY comm/sal DESC

表达式可以嵌套,算术运算符有自己的优先级。

5.4.1.7 START WITH和CONNECT BY子句

如果表中包含具有层次结构的数据,则可以使用该子句按照层次顺序显示查询结果。例如:emp表中的雇员编号(empno)和经理号(mgr)两列,反映出雇员之间领导与被领导的关系,这种关系就是一种树结构。

父节点的empno与子节点的MGR相同。树结构中,有且仅有一个节点无父节点中的KING,该节点为根节点。除根节点外,任何节点均有并且只能有一个父节点,有一个、多个或没有子节点。

START WITH子句确定层次查询开始的根行,根行必须满足该子句的WHERE条件。CONNECT BY子句指定层次中父行和子行之间的关系。

5.4.2 联结查询

简单查询只针对一个表进行的,实际应用时往往涉及多个表,这就需要对多个表进行联结。若一个查询同时涉及两个以上的表,则称为联结查询。联结查询包括等值联结、非等值联结、自然联结、自联结、外联结和复合条件联结等。这就是关系代数中的联结运算。

为了从多张表中查询数据,必须识别联结多张表的公共列。在WHERE子句中,列名前面由表名加以限制,以免产生二义性。

注意:一旦定义了表的别名,应该用表的别名去限制列名。别名应该尽量简短,有意义。

例5-97 从emp和dept表中查询奖金不空的雇员的部门号、部门地点、姓名、工资。

SQL>SELECT dname department,d·loc location,e·ename name,e·sal

FROM dept d,emp e

WHERE d·deptnoe·deptno

AND comm IS NOT NULL;

为了将多张联结在一起,最少的联结条件的个数是表数减1,即n 个表之间的联结至少有n-1个联结条件。在联结查询的WHERE 子句中除了联结条件以外,也可以包含其他条件,用AND运算符联结其他条件和联结条件。

5.4.2.1 等值联结

在上述联结条件中的比较运算符如果是“”号,则称为等值联结,否则称为非等值联结。

例5-98 查询每个学生及其选修课程的情况。

SELECT student.*,sc.*

FROM student,sc

WHERE student.snosc.sno;

为了避免混淆,在查询语句中用到各个表中都有的属性名时前面加上表名,没有重复的属性名不必在前面加表名。查询结果如下:

st udent.sno sname sex age dept sc.sno cno grade

98001 吴晨 男19 CS 98001 C2 87

5.4.2.2 自然联结

如果是按照两个表中的相同属性进行等值联结,且结果中去掉了重复的属性列,但保留了所有不重复的属性列,则称之为自然联结。

例5-99 用自然联结查询每个学生及其选修课程的情况。

SELECT student.sno,sname,sex,age,dept,cno,grade

FROM student,sc

WHERE student.snosc.sno;

等值联结与自然联结的差别如下。

等值联结的联结条件中属性名1与属性名2可以不同名,但必须有相同的数据类型和值域。

等值联结的结果是不去掉重复属性,而自然联结的结果中去掉重复属性。

5.4.2.3 复合联结

上面联结查询中,WHERE子句中只有一个条件,即用于联结两个表的联结条件。WHERE子句中除了联结条件外,还可以有多个限制条件。联结条件用于多个表之间的联结,限制条件限制取的记录要满足什么条件。这种联结操作,称为复合联结。

例5-100 查询选修C2号课程且成绩在90分以上的所有学生的学号和姓名。

SELECT student.sno,sname

FROM student,sc

WHERE student.snosc.sno(联结条件)

AND sc.cno′C2′AND sc.grade>90;(限制条件)

5.4.2.4 非等值联结

非等值联结是指联结条件中的运算符不是等号,可以是大于、大于等于、小于、小于等于、不等于运算符,也可以是BETWEEN AND 指定的一个范围。

假设部门和雇员数据库中的emp和SALGRADE表的结构和数据如下:

emp(empno,ename,job,mgr、sal,deptno),其数据如下:

empno ename job mgr sal d eptno

……1001 张三 工程师1002 2500 20

……1002 李四 高级工程师1003 4500 20

salgrade(grade,lowsal,highsal),其数据如下:

gra de l owsal h ighsal

1 800 2000

2 2001 3999

3 4000 5999

4 6000 9000

emp表中含有每一个雇员的编号、姓名、工作、经理编号、工资和部门号,而SALGRADE表中记录每一个等级所对应的最低工资和最高工资。

例5-101 查询工资等级为3的雇员姓名。

SELECT ename

FROM emp,salgrade

WHERE sal BETWEEN lowsal AND highsal(非等值联结条件)

AND grade3(限制条件)

例5-102 查询emp表中的每一雇员的工资的等级。

SQL>SELECT empno,ename,sal,grade

FROM emp e,grade g

WHERE e.sal BETWEEN g.lowsal AND g.hisal

ORDER BY e.sal

5.4.2.5 自联结

如果联结操作是在同一个表的不同记录之间进行,这种联结称为自联结。因为自联结查询仅涉及一张表,所以在FROM子句中该表名出现两次,分别用两个不同的别名表示。两个别名当作两张不同的表进行处理,与其他的表联结一样,也使用一个或多个相关的列联结。为了区分同一张表的不同行的列,在列名前用别名加以限制。

例5-103 查询至少选修了课程号为C2和C4的学生学号。

SELECT x.sno

FROM sc x,sc y

WHERE x.snoy.sno(联结条件)

AND x.cno′C2′(限制条件)

AND y.cno′C4′(限制条件)

例5-104 查询每一个雇员的经理姓名(查询emp表)。

SELECT manager.ename

FROM emp worker,emp manager

WHERE worker.mgrmanager.empno(联结条件)

5.4.2.6 外联结

在通常的联结操作中,只有满足联结条件的元组才能作为结果输出。外联结的查询结果是等值联结查询结果的扩展。外联结不仅返回满足联结条件的所有记录,而且也返回了一个表中的那些在另一个表中没有匹配的行记录。

如果在student表中有某些学生,但这些学生没有选课,则在sc表中没有对应的记录。如果按等值联结,则这些没有选课的学生信息不会输出。如果想以student表为主体列出每个学生的基本情况及其选课情况,若某一学生没有选课,则只输出学生的基本情况信息,其选课信息为空值。此时需要用外联结。

外联结的操作符是(+)。(+)号放在联结条件中信息不完全的那一边(即没有匹配行的那一边)。例如:执行一个外联结,联结A表和B表,假如想返回A表中的所有行,则将外联结运算符(+)放到联结条件的B表的列那一边,此时,对A表中的所有行,如果B表中没有匹配的行,则B表中的列返回NULL。否则,假如想返回B表中的所有行,则将外联结运算符(+)放到联结条件的A表的列那一边,此时,对B表中的所有行,如果A表中没有匹配的行,则A表中的列返回NULL。

例5-105 以student表为主体列出每个学生的基本情况及其选课情况,若某一学生没有选课,只输出学生的基本情况信息,其选课信息为空值。

SQL>SELECT s.sno,sname,sex,age,cno,grade

FROM student s,sc

WHERE s.snosc.sno(+)(联结条件)

外联结运算符(+)出现在联结条件右边,称为右外联结;出现在联结条件左边,称为左外联结。

外联结就像运算符(+)所在边的表增加一个“万能”的行,这个行全部由空值组成,可以和另一边的表中所有不满足联结条件的元组进行联结。

同类推荐
  • 中国3D打印的未来

    中国3D打印的未来

    自2012年以来,有关3D打印的报道屡见报端,这一新型制造技术引起了全世界的广泛关注。《中国3D打印的未来》作者、中国3D打印技术产业联盟秘书长罗军认为,中国从20世纪90年代初开始涉足3D打印技术,并取得了巨大进展,但与国外同行相比仍存在一定差距。特别是中国3D打印企业普遍存在“小而散”、各自为政的现象,如何发挥整合优势、抱团发展是目前亟需解决的问题。如果能够加强同行合作,抱团发展,形成合力,相信3D打印会成为唯一一项中国有可能赶超世界先进水平的技术。
  • 不懂PowerPoint就当不好经理

    不懂PowerPoint就当不好经理

    经理人如何用PowerPoint,来规划部门的发展,如何用PowerPoint来表达自己的经营主张?本书为各类经理人提供了从入门到提高,从原理到实战的一系列知识,相信本书将让演示文稿为经理人的管理效能加分!
  • 数据库原理及Oracle应用

    数据库原理及Oracle应用

    进入21世纪,随着国家信息化步伐的加快及各行业信息化进程的不断加速,社会对专业(非计算机专业)人才的信息技术能力要求越来越高。为了适应社会对专业人才的要求,全国各高校在重视专业知识培养的同时也非常注重计算机应用能力的训练,即信息技术能力的培养。计算机应用水平已成为衡量高校毕业生综合素质的突出标志之一。
热门推荐
  • 脑魂

    脑魂

    智能程序生出自我意识,星脑欲要抹杀,走投无路之下与脑死的特种兵完美结合,化身成人!在人性与机械冷漠的矛盾中,唐修终于悟到真谛,开启一段光脑与人的完美人生!
  • 武极碎空

    武极碎空

    药王谷药仙转世重生,成了风家三少爷风逸……从此这个被称为“天生废柴”的男人,彻底逆转了人生,利用前世炼药的经验,改善体质,畅通经脉。炼制逆天神丹,引雷淬体,沙漠苦修,九转凝魂;弹指惊雷,手握至尊神器,脚踩天下高手!终于成就一代传奇!
  • 正太别烦我!

    正太别烦我!

    犯罪分子冷冷地说:看吧,这就是你以前的艳照,别以为忘了就完了,准备倒霉吧!犯罪分子愤怒地说:报警?你就是个白痴吧?他妈的我现在就把那些警察的眼睛都抠下来!犯罪分子阴险地说:没钱给掩口费是吧?那就给我儿子免费当保姆,顺便钱债肉偿吧,哼!犯罪分子终于受不了了,掀桌子说:靠!你个大妈,我是谁?我是咱儿子的老爸!颜晓白委屈地说:……可是我什么时候有的儿子?什么时候认识你这种犯罪分子?还有……我只喜欢小正太,绝对不会喜欢你这种带着小正太的大正太!
  • 守一座空城

    守一座空城

    中间断更了一年多的时间,现在重启的话写作风格会有一些改变(悄悄告诉你,前二十多章不要期待多好看)
  • 武极四象

    武极四象

    这是一个东方武修和妖修经过亿万年间的交替融合后,而演变出的一个新世界。在这里,人族为了突破自身极限可以吸收融合强大的妖灵,锻体淬骨,化为神通。在这里,妖族亦可为了增强自身实力而食人灵窍,化为己身妖力,施展通天手段。人、妖并存的大千世界,血腥残酷的武道修炼!----------------------------------------------故事就发生在这样一个世界,天生顽劣的宋岩在家中遭遇巨大变故后,一夜之间便脱胎换骨,并从此走上武道一途的逆天修炼之路,在化解一个又一个危机,解开一个又一个谜团之后,最终打破桎梏,问鼎武道!武道一途,便是逆天而行;心念所至,看我万象乾坤。
  • 萌兮

    萌兮

    本兮本因有你,倍加珍兮。一生挚爱本兮一个萝莉女孩,唯一技能卖萌,她就是本兮。
  • tfboys之十年约不忘

    tfboys之十年约不忘

    为什么王俊凯会被刀伤?而另外两位成员却安然无恙?在记者一个个追问后蓝星璇昏迷不醒。穿越回来到底发生了什么?
  • 回望青春

    回望青春

    本书为小说集,收录的作品包括:静静的顿河、我爱桃花、去省城看《西厢记》、暗夜芳香、长相忆、回望青春、落尽梨花月又西。
  • 当年那些破事

    当年那些破事

    当你戴上皇冠的那一刻,你就必须得承受它的重量。我这一辈子都在寻找自己的皇冠,为了它我放弃了爱情,为了它我变得残忍,为了它我变得冷酷无情。当我终于戴上皇冠的那一刻我才知道,我什么都没了。在别人眼里我就是一只凶残血腥的野兽,其实并不是这样,我只是再也找不回自己。请你好好听听我的故事,当你听懂后你就知道,其实人都是逼出来的。你好,我叫佐龙!百度贴吧:罪恶的野兽作者唯一qq:381964697唯一交流群QQ258918153欢迎大家入群一起交流,谢谢大家的支持!
  • 注同教问答

    注同教问答

    本书为公版书,为不受著作权法限制的作家、艺术家及其它人士发布的作品,供广大读者阅读交流。