为什么Oracle不允许在WHERE 子句中使用组函数,这是基于什么设计思想或是需求

为什么Oracle不允许在WHERE 子句中使用组函数,这是基于什么设计思想或是需求,第1张

这是由于where子句中是查询条件,而组函数 *** 作的是查询结果,所以组函数在where子句中是不能使用的。oracle有having子句可以解决这个问题,在having子句中可以使用组函数。

MAX()/MIN()是指SQL中的最大/最小值函数

因为聚合函数处理的是数据组,在本例中,MAX函数将整个TEACHER表看成一组

而TNAME、DNAME和TSEX的数据都没有进行任何分组,因此SELECT语句没有逻辑意义

MAX()和MIN()函数不仅可以作用于数值型数据,也可以作用于字符串或是日期时间数据类型的数据。

SQL 如下:

实例MAX()函数用于字符型数据

如下面代码:

SELECT MAX (a) AS MAXNAME

FROM     A

having 你可以认为是聚合函数的 where 部分,

使用聚合函数后,比如 avg(age) ,这是是不允许用where限定 avg(age)的,

而是用having avg(age)>21。

有聚合函数后,关于聚合函数的条件就用having。

最后一段的sql的目的是 选出年龄大于平均年龄的 学生的信息 ,但是是错误语句,少了group by。

我给你推荐一本书吧,叫做,《数据库系统概论》!

对于你所说的问题,我是这样理解的:

SNO可以推导出SDEPT, 有SDEPT可以推导出MN,但是你只有SNO,是无法推导出G的,难道不是吗?推导出G需要有CNAME,可是你却告诉只有SNO,没有选课,所以就无法得到,对应功课的成绩!这个时候,我们就要来讨论primary key,我想你肯定知道主键是什么意思了,因为你已经学到了这里,所以对数据库肯定有一定的了解,好了,不说废话,在F中,SNO不能作为主键,因为只有SNO的话,却无法得到G,(原因,前面已经讲过!),只有SDEPT,就跟更没有办法得到G了,不是吗?只有通过(SNO, CNAME)联合才能得到G,而在这之中,有SNO,所以,通过SNO可以推导出,SDEPT,而通过SDEPT,可以推导出MN,不是吗?所以总结得出,primary key 只能是(SNO , CNAME)。一个表中主键没有值,那是肯定不可以的!所有数据就不可能插于进去!

我是学数据库的,若是有什么疑问,我们可以深入谈论!

对于给你推荐的那本书,是我作为学生时,看的书,里面讲的很好,对于初学者而言,是一本不错的书!能够帮助你你在数据库这条道路上走得更远!祝你好运!

in *** 作符允许我们在 WHERE 子句中规定多个值。

where 字段名 in (值1,值2,值3)

示例: where age in (20,21,25);

age 字段的值 只要是 20或者21或者25 的数据 都满足条件

where not in (值1,值2,值3)</pre>

示例: where age in (20,21,25);

age 字段的值 只要 不是 20或者21或者25 的数据 都满足条件

select

from sc

where score in (70,80,90);

select

from sc

where score not in (70,80,90);

select

from student

where birthday in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');</pre>

select

from student

where birthday not in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');

MySQL中的分页查询, limit 通常放在sql 语句的最末尾

limit 4

查询前4条数据

limit 4,3

从第4条数据之后开始,查询3条数据

也就是 第5,6,7条的数据

limit 4 offset 10;

offset后面的数字是指记录数

从第10条 之后的数据开始 查询4条数据

也就是 第 11,12,13,14条数据

select from student limit 5;

select from student limit 9,6;

select from student limit 6 offset 9;

查询成绩表中 前7条的数据;

select from sc limit 7;

查询成绩表中 第 5到10 条的数据

select from sc limit 4,6;

查询成绩表中 第 3到8 条的数据;

select from sc limit 2 , 6;

如果字段没有要求非空,则字段值 可以为空,就是null值。如果要查询某个 字段 为 null的数据,不能使用 字段名=null,要用 字段名 is null;

where 字段名 is null;

字段名 为空的符合条件

where 字段名 is not null;

字段名 不为空的符合条件

1查询teacher表,给tid 起别名为 教师编号,tname 起别名为 教师姓名

select tid as 教师编号,tname as 教师姓名 from teacher

2查询 sc 表, 给 cid 起别名为 课程编号,sid 起别名为 学生编号, score起别名为分数;

select cid 课程编号 ,sid 学生编号,score 分数 from sc

3查询 course 表,给表起别名为 c,使用 c字段查询 表数据

select c from course as c ;

起别名是为了后续学习多表联查 做铺垫,语法十分简单

比如查询 student 表的 学生姓名 和 生日 的sql语句:

select sname,birthday from student;

给 sname,birthday字段 起别名 ,改为中文

select sname as 姓名,birthday as 生日 from student;

起了别名后,查出来的字段会以别名展示。

as 关键字也可以省略,字段名 和 别名之间 用空格隔开即可

select sname 姓名, birthday 生日 from student;

例子:

select asname, abirthday from student as a;

给表 起别名 同样是 使用 as关键字(可以使用空格隔开代替as关键字), a 就代表 student表,查询字段时,可以 使用 asname 代表 student的sname字段。

给表起别名 通常用在 多表查询,本次使用演示,先熟悉语法。

在某些复杂的场景下,可能需要多条sql 才能查询出想要的数据,把多条sql拼接起来 就是嵌套查询

句式1

select XXX from A表 where xx =/in (select XXX from B表)

句式2

select XXX from (select XXX from XXXX)b

句式3

select XXX from A表 a

join (select XXX from B表)b on axx = bxx

select from sc where sid = (select sid from student where sname = '周梅');

select from sc where sid in (select sid from student where sex='女');

select asname,bscore,cscore from student a

inner join (select sid,score from sc where cid =1) b on asid = bsid

inner join (select sid,score from sc where cid = 2) c on asid = csid

where bscore › cscore;

聚合函数对一组值执行计算,并返回单个值,也被称为组函数。

就是sql提供的一种查询方法,比如查询 最大值,最小值,总数,平均等等。

聚合函数不能写在where的查询条件里面

查询 最小值

select min(字段) from 表;

查询 最大值

select max(字段) from 表;

select max(tid) from teacher;

select min(tid) from teacher;

select max(ascore) ,bcname from sc a

inner join course b on acid=bcid

where asid =(select sid from student where sname='周梅') group by bcname limit 1 ;

查询 该字段的 总数

select sum(字段) from 表

查询 该字段的 平均数

select avg(字段) from 表

select avg(score) from sc;

select avg(sscore) from student a inner join sc s on asid = ssid

where asex ='女';

查询 数据 总条数

count( ) 是查询总共有多少条数据

count(字段) 是查询该字段 不为 null的 总共有多少条数据

例:

select count( ) from 表

去重,查询数据时,相同的数据只展示 一条

语法:

select distinct 字段 from 表;

例:去重查询学生表中的生日字段

select distinct birthday from student;

//希望kutpbpb的回答能对你有所帮助!

//首先说明一下嵌套聚合函数是不支持的!

//下面的SQL查询在SQL Server 2005中可以正确返回运行结果;

//customer代表账户表,Bank代表储蓄所表;

//Cbno代表customer表中的储蓄所编号,Bno代表储蓄所编号;

//City代表储蓄所所属城市,其中bk为返回结果的临时表。

正确代码:

select

from

customer

as

C,Bank

as

B

where

CCbno=BBno

and

BCity

in

(

select

City

from

Bank

group

by

City

having

count(Bno)=(select

min(Nm)

from

(

select

City,count(Bno)

from

Bank

group

by

City

)

as

bk(Cy,Nm)

)

);

聚合函数是对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUP BY子句一同使用,SQL SERVER 中具体有哪些聚合函数呢?我们来一一看一下:

1 AVG 返回指定组中的平均值,空值被忽略。

例:select prd_no,avg(qty) from sales group by prd_no

2 COUNT 返回指定组中项目的数量。

例:select count(prd_no) from sales

3 MAX 返回指定数据的最大值。

例:select prd_no,max(qty) from sales group by prd_no

4 MIN 返回指定数据的最小值。

例:select prd_no,min(qty) from sales group by prd_no

5 SUM 返回指定数据的和,只能用于数字列,空值被忽略。

例:select prd_no,sum(qty) from sales group by prd_no

6 COUNT_BIG 返回指定组中的项目数量,与COUNT函数不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。

例:select count_big(prd_no) from sales

7 GROUPING 产生一个附加的列,当用CUBE或ROLLUP运算符添加行时,输出值为1当所添加的行不是由CUBE或ROLLUP产生时,输出值为0

例:select prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup

8 BINARY_CHECKSUM 返回对表中的行或表达式列表计算的二进制校验值,用于检测表中行的更改。

例:select prd_no,binary_checksum(qty) from sales group by prd_no

9 CHECKSUM_AGG 返回指定数据的校验值,空值被忽略。

例:select prd_no,checksum_agg(binary_checksum()) from sales group by prd_no

10 CHECKSUM 返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引。

11 STDEV 返回给定表达式中所有值的统计标准偏差。

例:select stdev(prd_no) from sales

12 STDEVP 返回给定表达式中的所有值的填充统计标准偏差。

例:select stdevp(prd_no) from sales

13 VAR 返回给定表达式中所有值的统计方差。

例:select var(prd_no) from sales

14 VARP 返回给定表达式中所有值的填充的统计方差。

例:select varp(prd_no) from sales

以上就是关于为什么Oracle不允许在WHERE 子句中使用组函数,这是基于什么设计思想或是需求全部的内容,包括:为什么Oracle不允许在WHERE 子句中使用组函数,这是基于什么设计思想或是需求、数据库查询,关于聚合函数 max()的用法。、数据库having和聚合函数使用方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10642814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存