oracle简单学习总结(四)——高级查询
相关链接:
oracle简单学习总结(一)——sql
http://www.2cto.com/database/201210/159545.html;
oracle简单学习总结(二)——查询
http://www.2cto.com/database/201210/159556.html;
oracle简单学习总结(三)——函数
http://www.2cto.com/database/201210/159561.html
三、外连接
分组函数中SUM和AVG只应用于数值型的列,MAX、MIN和COUNT可以应用于字符、数值和日期类型的列。组函数忽略列的空值。使用GROUP BY 从句可以对数据进行分组。所谓分组,就是按照列的相同内容,将记录划分成组,对组可以应用组函数。如果不使用分组,将对整个表或满足条件的记录应用组函数。在组函数中可使用DISTINCT或ALL关键字。ALL表示对所有非NULL值(可重复)进行运算(COUNT除外)。DISTINCT 表示对每一个非NULL值,如果存在重复值,则组函数只运算一次。如果不指明上述关键字,默认为ALL。
一、多表联合查询
通过连接可以建立多表查询,多表查询的数据可以来自多个表,但是表之间必须有适当的连接条件。。一般N个表进行连接,需要至少N-1个连接条件,才能够正确连接
二、 相等连接
两个表具有相同意义的列,建立相等连接条件。使用相等连接进行两个表的查询时,只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。
2.1 建表:
sql:CREATE TABLE bookInfortable(id int NOT NULL primary key,pidint null,name varchar(50) NULL,publishdate date NOT NULL);
(id,pid对应bookTypetable的id所属类型,name书名,publishdate出版日期)
sql:CREATE TABLEbookTypetable(idint NOT NULL primary key,type varchar(50) NOT NULL,manager varchar(50) NOT NULL,payint NOT NULL);
(id,type类型,manager 管理员,)
sql:CREATE TABLEpayGradeTable(id int NOT NULL primary key,Grade int NOT NULL,LOSAL NUMBER NOT NULL,HISAL NUMBER NOT NULL);
(id,Grade等级,LOSAL最低标准,HISAL 最高标准)
2.2 相等连接
sql:SELECT a.id,a.name,a.publishdate,a.pid,b.id,b.type,b.manager FROMbookinfortable a,booktypetable bWHERE a.pid=b.id;
说明:在FROM从句中依次列出两个表的名称,在表的每个列前需要添加表名,用“.”分隔,表示列属于不同的表。在WHERE条件中要指明进行相等连接的列。如果表名很长,可以为表起一个别名,进行简化,别名跟在表名之后,用空格分隔。(bookinfortable a 指bookinfortable别名 a)
2.3 相等连接附加判断条件
sql:SELECT a.id,a.name,a.publishdate,a.pid,b.id,b.type,b.manager FROMbookinfortable a,booktypetable bWHEREa.pid=b.id and a.name != '读者';
除了显示满足相等连接条件的记录外,还显示那些不满足连接条件的行,不满足连接条件的行将显示在最后。外连操作符为(+),它可以出现在相等连接条件的左侧或右侧。出现在左侧或右侧的含义不同,
sql:SELECT a.id,a.name,a.publishdate,a.pid,b.id,b.type,b.manager FROMbookinfortable a,booktypetable bWHEREa.pid(+)=b.id;
sql:SELECT a.id,a.name,a.publishdate,a.pid,b.id,b.type,b.manager FROMbookinfortable a,booktypetable bWHEREa.pid=b.id(+);
说明:左连接显示后表中不满足连接条件的行;右链接显示前表中不满足连接条件的行
四、不等连接
sql:SELECT b.id, b.type,b.manager,b.pay,p.grade,p.losal,p.hisal FROM booktypetable b,paygradetable pWHERE b.pay BETWEEN p.losal AND p.hisal;
说明:查询管理员的工资所在等级,通过将管理员工资与不同的工资上下限范围相比较,取得工资的等级,并在查询结果中显示出雇员的工资等级。
五、自连接
自连接就是一个表,同本身进行连接。对于自连接可以想像存在两个相同的表(表和表的副本),可以通过不同的别名区别两个相同的表。
5.1建表
sql:CREATE TABLE workertable(idint NOT NULL primary key,name varchar(50) NOT NULL,manageridint NULL);
5.2 显示雇员名称和雇员的经理名称
sql:SELECT worker.id,worker.name||' 的经理是 '||manager.name AS 雇员的经理 FROM workertable worker, workertable manager WHERE worker.managerid = manager.id order by worker.id;
说明:为workertable 表分别起了两个别名worker和manager,可以想像,第一个表是雇员表,第二个表是经理表,因为经理也是雇员。然后通过worker 表的managerid 字段同manager 表的id字段建立连接
六、统计查询
Oracle提供了一些函数来完成统计工作,这些函数称为组函数,组函数不同于前面介绍和使用的函数(单行函数)。组函数可以对分组的数据进行求和、求平均值等运算。组函数只能应用于SELECT子句、HAVING子句或ORDER BY子句中。组函数也可以称为统计函数。
函 数 说 明 AVG 求平均值 COUNT 求计数值,返回非空行数,*表示返回所有行 MAX 求最大值 MIN 求最小值 SUM 求和 STDDEV 求标准偏差,是根据差的平方根得到的 VARIANCE 求统计方差
分组函数中SUM和AVG只应用于数值型的列,MAX、MIN和COUNT可以应用于字符、数值和日期类型的列。组函数忽略列的空值。使用GROUP BY 从句可以对数据进行分组。所谓分组,就是按照列的相同内容,将记录划分成组,对组可以应用组函数。如果不使用分组,将对整个表或满足条件的记录应用组函数。在组函数中可使用DISTINCT或ALL关键字。ALL表示对所有非NULL值(可重复)进行运算(COUNT除外)。DISTINCT 表示对每一个非NULL值,如果存在重复值,则组函数只运算一次。如果不指明上述关键字,默认为ALL。
6.1 COUNT
sql:SELECT COUNT(*) FROM bookinfortable t;
说明:使用组函数COUNT统计记录个数;*代表返回所有行数,否则返回非NULL行数。
说明:使用组函数COUNT统计记录个数;*代表返回所有行数,否则返回非NULL行数。
sql: