文档库 最新最全的文档下载
当前位置:文档库 › 分组及聚集函数的使用(全部-20140411)

分组及聚集函数的使用(全部-20140411)

分组及聚集函数的使用(全部-20140411)
分组及聚集函数的使用(全部-20140411)

聚集函数只能出现在2个位置

(1)select与from之间;

(2)having子句后面。

(1)统计“会计学院”的学生人数。

SELECT count(*) as 会计学院学生人数FROM student where 所属院系="会计学院"; SELECT count(学号) as 会计学院学生人数FROM student where 所属院系="会计学院"; SELECT count(姓名) as 会计学院学生人数FROM student where 所属院系="会计学院"; (2)统计每个学院的学生人数。

SELECT count(*) as 学生人数FROM student group by 所属院系;

SELECT 所属院系,count(*) as 学生人数FROM student group by 所属院系;

(3)统计至少有5个学生所在学院的学生人数。

SELECT 所属院系,count(*) as 学生人数FROM student group by 所属院系having count(*)>=5;

(4)查找每门课成绩都在80分(含80分)以上学生的学号、姓名和所属院系。

select 学号,姓名,所属院系from student where 学号in (select 学号from grade group by 学号having min(成绩)>=80)

(结果为:王海、李军、周洲、陈明毅)

将成绩为空的记录抛除:

方法一:

select 学号,姓名,所属院系from student where 学号in (select 学号from grade group by 学号having min(成绩)>=80) and 学号not in (select 学号from grade where 成绩is null ) (结果为:王海、李军)

方法二:

select 学号,姓名,所属院系from student where 学号not in (select 学号from grade where 成绩<80 ) and 学号not in (select 学号from grade where 成绩is null ) and 学号in (select 学号from grade)

找错:

(1)select 学号,姓名,所属院系from student where 学号not in (select 学号from grade where 成绩<80 group by 学号having count(*)=0)

子查询的结果为空,原因是什么?

(搜出“成绩<80”的之后,对找出的结果进行分组,不可能count(*)=0 ,注意执行顺序)

(5)查找每门课成绩都在80分(含80分)至90分(含90分)之间学生的学号、姓名和所属院系。

select 学号,姓名,所属院系from student where 学号in (select 学号from grade group by 学号having min(成绩)>=80 and max(成绩)<=90)地

找错(查找成绩都在……之间的课程信息,有点问题)

A. select * from course where 课程编号in (select 课程编号from grade,schedule where grade.

课程ID=schedule.课程ID group by 课程ID having min(成绩)>=80 and max(成绩)>=90)

B. select * from course where 课程编号in (select 课程编号from grade,schedule where grade.课程ID=schedule.课程ID group by grade.课程ID having min(成绩)>=80 and max(成绩)>=90)

select course.* from course,schedule where course.课程编号=schedule.课程编号in (select grade.课程ID from grade,schedule where grade.课程ID=schedule.课程ID group by grade.课程ID having min(成绩)>=70 and max(成绩)>=98)

第5节-分组函数

分组函数 分组函数作用于一组数据,并对一组数据返回一个值。 一.组函数(返回一个值)组函数忽略空值。 -max(最大值),min(最小值), 任意数据类型的数据 avg(平均值),sum(求和):要求数值型数据 count(计数)任意数据类型的数据不为空的记录总数 ?如何显示所有员工中最高工资和最低工资 select max(sal),min(sal) from 表名称; ?显示所有员工的平均工资和工资总和 select avg(sal),sum(sal) from表名称; NVL函数使分组函数无法忽略空值。 例:selectavg(NVL(commission_pct, 0)) from employees DISTINCT 关键字 COUNT(DISTINCT expr)返回expr非空且不重复的记录总数 例:SELECT COUNT(DISTINCT department_id)from employees; 二.使用GROUP BY 子句对数据分组 可以使用GROUP BY子句将表中的数据分成若干组(明确:WHERE一定放在FROM后面) 在SELECT 列表中所有未包含在组函数中的列都应该包含在GROUP BY 子句中。例:select department_id, AVG(salary) from employees GROUP BY department_id

包含在GROUP BY 子句中的列不一定要包含在SELECT 列表中例:SELECT AVG(salary) FROM employees GROUP BY department_id ; 在GROUP BY子句中包含多个列 例:SELECT department_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id 非法使用组函数 查询相应的列,只要不是组函数的列,都应该出现在group by中。例(错):select department_id,sum(salary) From employees: 例(对):select department_id,sum(salary) From employees: Group by department_id; 例(对):select ,sum(salary) From employees: Group by department_id; 不能在WHERE 子句中使用组函数。 可以在HAVING 子句中使用组函数。 例(错):求出各部门平均工资大于6000的部门,以及其平均工资SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 6000 GROUP BY department_id 例(对):求出各部门平均工资大于6000的部门,以及其平均工资SELECT department_id, AVG(salary) FROM employees

Oracle中分析函数用法小结

Oracle中分析函数用法小结 一.分析函数适用场景: ○1需要对同样的数据进行不同级别的聚合操作 ○2需要在表内将多条数据和同一条数据进行多次的比较 ○3需要在排序完的结果集上进行额外的过滤操作 二.分析函数语法: FUNCTION_NAME(,...) OVER () 例: sum(sal) over (partition by deptno order by ename) new_alias sum就是函数名 (sal)是分析函数的参数,每个函数有0~3个参数,参数可以是表达式,例如:sum(sal+comm) over 是一个关键字,用于标识分析函数,否则查询分析器不能区别sum()聚集函数和sum()分析函数 partition by deptno 是可选的分区子句,如果不存在任何分区子句,则全部的结果集可看作一个单一的大区 order by ename 是可选的order by 子句,有些函数需要它,有些则不需要.依靠已排序数据的那些函数,如:用于访问结果集中前一行和后一行的LAG和LEAD,必须使用,其它函数,如AVG,则不需要.在使用了任何排序的开窗函数时,该子句是强制性的,它指定了在计算分析函数时一组内的数据是如何排序的. 1)FUNCTION子句 ORACLE提供了26个分析函数,按功能分5类 分析函数分类 等级(ranking)函数:用于寻找前N种查询 开窗(windowing)函数:用于计算不同的累计,如SUM,COUNT,AVG,MIN,MAX等,作用于数据的一个窗口上 例: sum(t.sal) over (order by t.deptno,t.ename) running_total, sum(t.sal) over (partition by t.deptno order by t.ename) department_total 制表(reporting)函数:与开窗函数同名,作用于一个分区或一组上的所有列 例: sum(t.sal) over () running_total2, sum(t.sal) over (partition by t.deptno) department_total2 制表函数与开窗函数的关键不同之处在于OVER语句上缺少一个ORDER BY子句! LAG,LEAD函数:这类函数允许在结果集中向前或向后检索值,为了避免数据的自连接,它们是非常有用的. VAR_POP,VAR_SAMP,STDEV_POPE及线性的衰减函数:计算任何未排序分区的统计值 2)PARTITION子句 按照表达式分区(就是分组),如果省略了分区子句,则全部的结果集被看作是一个单一的组 3)ORDER BY子句

(完整版)复变函数试题库

《复变函数论》试题库 梅一A111 《复变函数》考试试题(一) 1、 =-?=-1||0 0)(z z n z z dz __________.(n 为自然数) 2. =+z z 2 2cos sin _________. 3.函数z sin 的周期为___________. 4.设 11 )(2+= z z f ,则)(z f 的孤立奇点有__________. 5.幂级数 n n nz ∞ =∑的收敛半径为__________. 6.若函数f(z)在整个平面上处处解析,则称它是__________. 7.若ξ=∞→n n z lim ,则=+++∞→n z z z n n ...lim 21______________. 8.= )0,(Re n z z e s ________,其中n 为自然数. 9. z z sin 的孤立奇点为________ . 10.若0z 是 )(z f 的极点,则___ )(lim 0 =→z f z z . 三.计算题(40分): 1. 设 )2)(1(1 )(--= z z z f ,求)(z f 在} 1||0:{<<=z z D 内的罗朗展式. 2. .cos 1 1||?=z dz z 3. 设 ? -++=C d z z f λ λλλ1 73)(2,其中 }3|:|{==z z C ,试求).1('i f + 4. 求复数 11 +-= z z w 的实部与虚部. 四. 证明题.(20分) 1. 函数 )(z f 在区域D 内解析. 证明:如果|)(|z f 在D 内为常数, 那么它在 D 内为常数. 2. 试证 : ()f z = 在割去线段0Re 1z ≤≤的z 平面内能分出两 个单值解析分支, 并求出支割线0Re 1z ≤≤上岸取正值的那支在1z =-的值.

函数教材分析解读

《函数》教材分析 1、哪儿发生变化,哪没变?从教材内容,(或添加、删减),内容 没变,但是呈现方式发生改变,体现的理念变化,为什么这么 变?实际上是要学有用的数学,身边的数学,应用数学,学是 为了用,设计思想,体现的理念。做数学,让学生参与。 2、新教材的重点和难点要分析出来,要将知识串起来。 3、变化的内容引起呈现方式的变化,技术所起的作用。技术的使用,引起学习方式的改变,怎么用?明确指出需要用技术的地方,形与数要结合。使用技术到非用不可,举例说明。重点! “函数是描述客观世界变化规律的重要数学模型。高中阶段用集合与对应的语言刻画函数,函数的思想方法将贯穿高中数学的始终。学生将学习指数函数、对数函数等具体的基本初等函数,结合实际问题,感受运用函数概念建立模型的过程与方法,体会函数在数学和其他学科中的重要性,初步运用函数思想理解和处理现实生活和社

会中的简单问题。” 二、内容安排: 函数这章教材共分个大节:第一大节是函数的概念及函数的一般性质;第二大节是指数与指数函数;第三大节是对数与对数函数;第四大节是函数的应用举例和实习作业。 1、函数是中学数学中最重要的基本概念之一。中学的函数教学大致为三个阶段,初中初步探讨函数的概念、函数关系的表示法、函数图象,并具体学习正比例、反比例、一次函数、二次函数等,使学生获得感性知识;本章及三角函数的学习是函数教学的第二阶段,是对函数概念的再认识阶段,用集合、映射的思想理解函数的一般定义,通过指数函数、对数函数以及后续的三角函数,使学生获得较为系统的函数知识,并初步培养函数的应用意识。第三阶段在选修部分,极限、导数与微分、积分是函数及其应用的深化与提高。 高中的函数知识是在初中的基础上学习的,主要讲函数的概念、函数关系的表示法、并学习函数的一般性质。从映射的概念看,函数是集合A到集合B的映射(A、B是非空数集),映射是特殊的对应,函数是特殊的映射,反函数也是映射。 2、学生在初中的基础上学习有理指数幂及其运算法则是不困难的。指数函数及其图象和性质是这一节的重点,要通过具体实例了解指数函数模型的实际背景,通过具体函数的图象来观察、归纳函数的性质,反之,函数性质又直观反映在图象上,指导准确作出函数图象。

Group by详解 完美例句

SELECT COUNT(*) AS 水果种类, ProductPlace AS 出产国 FROM T_TEST_FRUITINFO WHERE (ProductPlace <> 'Japan') GROUP BY ProductPlace 那么在最后结果中由于Japan不符合where语句,所以分组结果中将不会出现Japan。 现在我们加入ALL关键字: SELECT COUNT(*) AS 水果种类, ProductPlace AS 出产国 FROM T_TEST_FRUITINFO WHERE (ProductPlace <> 'Japan') GROUP BY ALL ProductPlace 重新运行后,我们可以看到Japan的分组,但是对应的“水果种类”不会进行真正的统计,聚合函数会根据返回值的类型用默认值0或者NULL 来代替聚合函数的返回值。 2.3 GROUP BY [Expressions] WITH CUBE | ROLLUP: 首先需要说明的是Group By All 语句是不能和CUBE 和 ROLLUP 关键字一起使用的。 首先先说说CUBE关键字,以下是SQL Server 2000联机帮助中的说明:指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的 GROUP BY 汇总行。GROUP BY 汇总行在结果中显示为 NULL,但可用来表示所有值。使用 GROUPING 函数确定结果集内的空值是否是 GROUP BY 汇总值。 结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其它操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论指定分组列时所使用的是什么顺序,行数都相同。 我们通常的Group By语句是按照其后所跟的所有字段进行分组,而如果加入了CUBE关键字以后,那么系统将根据所有字段进行分组的基础上,还会通过对所有这些分组字段所有可能存在的组合形成的分组条件进行分组计算。由于上面举的例子过于简单,这里就再适合了,现在我们的数据集将换一个场景,一个表中包含人员的基本信息:员工所在的部门编号 (C_EMPLINFO_DEPTID)、员工性别(C_EMPLINFO_SEX)、员工姓名 (C_EMPLINFO_NAME)等。那么我现在想知道每个部门各个性别的人数,那么我们可以通过如下语句得到: SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX

Oracle练习题讲解

一、填空 1.在多进程Oracle实例系统中,进程分为用户进程、后台进程和服务进程。 2.标准的SQL语言语句类型可以分为:数据定义语句(DDL)、数据操纵语句(DML)和数据控制语句(DCL)。 3.在需要滤除查询结果中重复的行时,必须使用关键字Distinct; 在需要返回查询结果中的所有行时,可以使用关键字ALL。 4.当进行模糊查询时,应使用关键字like和通配符问号(?)或百分号"%"。 5.Where子句可以接收From子句输出的数据,而HA VING子句则可以接收来自WHERE、FROM或GROUP BY子句的输入。 6.在SQL语句中,用于向表中插入数据的语句是Insert。 7.如果需要向表中插入一批已经存在的数据,可以在INSERT语句中使用Select 语句。 8.使用Describe命令可以显示表的结构信息。 9.使用SQL*Plus的Get命令可以将文件检索到缓冲区,并且不执行。 10.使用Save命令可以将缓冲区中的SQL命令保存到一个文件中,并且可以使用Run命令运行该文件。 11.一个模式只能够被一个数据库对象所拥有,其创建的所有模式对象都保存在自己的模式中。 12.根据约束的作用域,约束可以分为表级约束和列级约束两种。列级约束是字段定义的一部分,只能够应用在一个列上;而表级约束的定义独立于列的定义,它可以应用于一个表中的多个列。 13.填写下面的语句,使其可以为Class表的ID列添加一个名为PK_CLASS_ID 的主键约束。 ALTER TABLE Class Add ____________ PK_LASS_ID (Constraint) PRIMARY KEY ________ (ID) 14. 每个Oracle 10g数据库在创建后都有4个默认的数据库用户:system、sys、sysman和DBcnmp

MySql自字段、聚合和分组知识点

MySQL字段控制、聚合和分组 1字段控制查询 1.1去除重复记录 去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINCT:SELECT DISTINCT sal FROM emp; 1.2查看雇员的月薪与佣金之和 因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。 SELECT *,sal+comm FROM emp; comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL: SELECT *,sal+IFNULL(comm,0) FROM emp; 1.3给列名添加别名 在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total:SELECT *, sal+IFNULL(comm,0) AS total FROM emp; 给列起别名时,是可以省略AS关键字的: SELECT *,sal+IFNULL(comm,0) total FROM emp; 2聚合函数 聚合函数是用来做纵向运算的函数: ●COUNT():统计指定列不为NULL的记录行数; ●MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; ●MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; ●SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

R实现分组汇总的几种办法

R实现分组汇总的几种办法 分组汇总是对二维结构化数据中的某个字段(或多个字段)分组,并对组内字段进行汇总的算法,下面的例子将展示R语言实现分组汇总的几种办法。为了更加通用,例子中的分组字段是2个,汇总算法也是2种。 案例描述: 请将数据框orders按照CLIENT和SELLERID分组,并在组内对AMOUNT字段分别求和、求最大值。 说明:orders存储着订单记录,其来源可以是数据库也可以是文件,比如: 方法1:aggregate函数 代码: result1<-aggregate(orders$AMOUNT, orders[,c("SELLERID","CLIENT")],sum) result2<-aggregate(orders$AMOUNT, orders[,c("SELLERID","CLIENT")],max) result<-cbind(result1,result2$x) 代码解读: 1.从名字就可以看出,aggregate是专用于分组汇总的函数,它的输入参数和计算结果都 是数据框,用法相对简单。 2.aggregate函数不能对分组后的数据进行多种汇总计算,因此要用两句代码分别实现sum 和max算法,最后再用cbind拼合。显然,上述代码在性能和易用性上存在不足。 3.aggregate函数对分组字段的顺序有一个奇怪的要求:必须反向排列。鉴于这个怪要求, 先对CLIENT分组再对SELLERID分组就必须写成:orders[,c("SELLERID","CLIENT")]。如果按照正常的思维习惯写代码,结果将是错误的。 4.不仅代码的写法违反正常的思维习惯,计算后的结果也很怪异:SELLERID字段会排在 CLIENT之前。事实上,为了使计算结果更符合业务逻辑,上述的代码还要继续加工才行。 总结: aggregate函数勉强可用,但在性能和方便性上存在不足,代码的写法、计算结果、业

Oracle分组ROLLUP、GROUP BY、GROUPING、GROUPING SETS区别和作用+++

Oracle分组ROLLUP、GROUP BY、GROUPING、GROUPING SETS区别和作用1.ROLLUP ROLLUP的作用相当于 SQL> set autotrace on SQL> select department_id,job_id,count(*) 2 from employees 3 group by department_id,job_id 4 union 5 select department_id,null,count(*) 6 from employees 7 group by department_id 8 union 9 select null,null,count(*) 10 from employees;

最后面的SA_REP表示此jobid没有部门,为null 这里的union系统默认进行了排序 使用ROLLUP能达到上面GROUP BY的功能,但性能开销更小SQL> ed 已写入file afiedt.buf 1 select department_id,job_id,count(*) 2 from employees 3* group by rollup (department_id,job_id) SQL> /

2.为什么ROLLUP会比GROUP BY性能好 ROLLUP(a,b,c)=a,b,c+a,b+a+All 通过一次全表扫描,得出a,b,c的分组统计信息后;分组统计a,b 相同,c不同的项即可得到a,b;依此类推……,就不用去多次全表扫描 3.ROLLUP的另类用法ROLLUP(a,(b,c)) ROLLUP((a,b)) SQL> ed 已写入file afiedt.buf 1 select department_id,job_id,count(*) 2 from employees 3* group by rollup ((department_id,job_id)) SQL> / 注意面的语句是group by rollup ((department_id,job_id)) 不是group by rollup (department_id,job_id)

聚合函数及分组查询英文测试题

Review Questions 1. How will the results of the following two statements differ? Statement 1: SELECT MAX(longitude), MAX(latitude) FROM zip_state_city; Statement 2: SELECT MAX(longitude), MAX(latitude) FROM zip_state_city GROUP BY state; A. Statement 1 will fail because it is missing a GROUP BY clause. B. Statement 2 will return one row, and statement 1 may return more than one row. C. Statement 2 will fail because it does not have the columns used in the GROUP BY clause in the SELECT clause. D. Statement 1 will display two columns, and statement 2 will display two values for each state. 2. Using the SALES table described here, you need to report the following: Gross, net, and earned revenue for the second a NN nd third quarters of 1999 NN Gross, net, and earned revenue for sales in the states of Illinois, California, and Texas (codes IL, CA, and TX) Column Name state_code sales_date gross net earned Key Type PK PK Nulls/Unique NN NN NN NN NN FK Table Datatype VARCHAR2 DATE NUMBER NUMBER NUMBER Length 2 11,2 11,2 11,2 Will all the requirements be met with the following SQL statement? SELECT state_code, SUM(ALL gross), SUM(net), SUM(earned) FROM sales_detail WHERE TRUNC(sales_date,’Q’) BETWEEN TO_DATE(’01-Apr-1999’,’DD-Mon-YYYY’) AND TO_DATE(’01-Sep-1999’,’DD-Mon-YYYY’) AND state_cd IN (’IL’,’CA’,’TX’)

Oracle必背选择题

1.( )触发器允许触发操作的语句访问行的列值。(选一项) A、行级 B、语句级 C、模式 D、数据库级 2.( )是oracle在启动期间用来标识物理文件和数据文件的二进制文件。(选一项) A、控制文件 B、参数文件 C、数据文件 D、可执行文件 3.CREATE TABLE 语句用来创建(选一项) A、表 B、视图 C、用户 D、函数 4.imp命令的哪个参数用于确定是否要倒入整个导出文件。(选一项) A、constranints B、tables C、full D、file 5.ORACLE表达式NVL(phone,'0000-0000')的含义是(选一项) A、当phone为字符串0000-0000时显示空值 B、当phone为空值时显示0000-0000 C、判断phone和字符串0000-0000是否相等 D、将phone的全部内容替换为0000-0000 6.ORACLE交集运算符是(选一项) A、intersect B、union C、set D、minus 7.ORACLE使用哪个系统参数设置日期的格式(选一项) A、nls_language B、nls_date C、nls_time_zone D、nls_date_format 8.Oracle数据库中,通过()访问能够以最快的方式访问表中的一行(选一项) A、主键

B、Rowid C、唯一索引 D、整表扫描 9.Oracle数据库中,下面()可以作为有效的列名。(选一项) A、Column B、123_NUM C、NUM_#123 D、#NUM123 10.Oracle数据库中,以下()命令可以删除整个表中的数据,并且无法回滚(选一项) A、drop B、delete C、truncate D、cascade 11.Oracle中, ( )函数将char或varchar数据类型转换为date数据类型。(选一项) A、date B、to_date C、todate D、ctodate 12.ORACLE中,执行语句:SELECT address1||','||address2||','||address2 "Address" FROM employ; 将会返回()列(选一项) A、0 B、1 C、2 D、3 13.Oralce数据库中,以下()函数可以针对任意数据类型进行操作。(选一项) A、TO_CHAR B、LOWER C、MAX D、CEIL 14.partition by list(msn_id)子句的含义是(选一项) A、按msn_id列进行范围分区 B、按msn_id列进行列表分区 C、按msn_id列进行复合分区 D、按msn_id列进行散列分区 15.比较pagesize和linesize两个命令的特点,正确的是(选两项) A、pagesize命令用于设置屏幕上每一页包含的行数 B、linesize命令用于设置屏幕上每一行的字符数

MySQL分组函数与分组查询

分组函数与分组查询(group by) 分组函数 功能:用作统计使用,又称为聚合函数或统计函数或组函数 分类:sum 求和、avg 平均值、max 最大值、min 最小值、count 计算个数 特点: - sum/avg一般用于处理数值型数据,max/min/count可以处理任何类型数据 - 以上分组函数都忽略null值 1、简单的使用 SELECT sum(salary) FROM employees; SELECT avg(salary) FROM employees; SELECT min(salary) FROM employees; SELECT max(salary) FROM employees; SELECT count(salary) FROM employees; SELECT sum(salary)和, round(avg(salary), 2)平均, max(salary)最高, min(salary)最低, count(salary)个数 FROM employees;

2.参数支持哪些类型(sum/avg一般用于处理数值型数据,max/min/count可以处理任何类型数据) 3.是否忽略null值(是) 4.和distinct搭配使用 SELECT sum(DISTINCT salary), sum(salary) FROM employees; SELECT count(DISTINCT salary), count(salary) FROM employees; 5.count函数的详细介绍 SELECT count(*) FROM employees; SELECT count(1) FROM employees; #效率: MYISAM存储引擎下,count(*)的效率最高 INNODB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)要高一些 6.和分组函数一同查询的字段要求是group by后的字段 练习: #1.查询公司员工工资的最大值、最小值、平均值、总和 SELECT max(salary)最大值, min(salary)最小值, round(avg(salary), 2)平均值, sum(salary)总和 FROM employees; #2.查询员工表中的最大入职时间和最小入职时间的相差天数(DIFFRENCE) SELECT

分组及聚集函数的使用(全部-20140411)

聚集函数只能出现在2个位置 (1)select与from之间; (2)having子句后面。 (1)统计“会计学院”的学生人数。 SELECT count(*) as 会计学院学生人数FROM student where 所属院系="会计学院"; SELECT count(学号) as 会计学院学生人数FROM student where 所属院系="会计学院"; SELECT count(姓名) as 会计学院学生人数FROM student where 所属院系="会计学院"; (2)统计每个学院的学生人数。 SELECT count(*) as 学生人数FROM student group by 所属院系; SELECT 所属院系,count(*) as 学生人数FROM student group by 所属院系; (3)统计至少有5个学生所在学院的学生人数。 SELECT 所属院系,count(*) as 学生人数FROM student group by 所属院系having count(*)>=5; (4)查找每门课成绩都在80分(含80分)以上学生的学号、姓名和所属院系。 select 学号,姓名,所属院系from student where 学号in (select 学号from grade group by 学号having min(成绩)>=80) (结果为:王海、李军、周洲、陈明毅) 将成绩为空的记录抛除: 方法一: select 学号,姓名,所属院系from student where 学号in (select 学号from grade group by 学号having min(成绩)>=80) and 学号not in (select 学号from grade where 成绩is null ) (结果为:王海、李军) 方法二: select 学号,姓名,所属院系from student where 学号not in (select 学号from grade where 成绩<80 ) and 学号not in (select 学号from grade where 成绩is null ) and 学号in (select 学号from grade) 找错: (1)select 学号,姓名,所属院系from student where 学号not in (select 学号from grade where 成绩<80 group by 学号having count(*)=0) 子查询的结果为空,原因是什么? (搜出“成绩<80”的之后,对找出的结果进行分组,不可能count(*)=0 ,注意执行顺序) (5)查找每门课成绩都在80分(含80分)至90分(含90分)之间学生的学号、姓名和所属院系。 select 学号,姓名,所属院系from student where 学号in (select 学号from grade group by 学号having min(成绩)>=80 and max(成绩)<=90)地 找错(查找成绩都在……之间的课程信息,有点问题) A. select * from course where 课程编号in (select 课程编号from grade,schedule where grade.

SQL 关于分组的问题

SQL语句:Group By总结 1. Group By 语句简介: Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Gr oup)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 P.S. 这里真是体会到了一个好的命名的力量,Group By从字面是直接去理解是非常好理解的。恩,以后在命名的环节一定要加把劲:)。话题扯远了。 2. Group By 的使用: 上面已经给出了对Group By语句的理解。基于这个理解和SQL Server 2000的联机帮助,下面对Group By语句的各种典型使用进行依次列举说明。 2.1 Group By [Expressions]: 这个恐怕是Group By语句最常见的用法了,Group By + [分组字段](可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。比如有如下数据集,其中水果名称(FruitName)和出产国家(ProductPla ce)为联合主键: 如果我们想知道每个国家有多少种水果,那么我们可以通过如下SQL语句来完成: SELECT COUNT(*)AS水果种类,ProductPlace AS出产国 FROM T_TEST_FRUITINFO GROUPBY ProductPlace

首先我们不使用带ALL关键字的Group By语句: SELECT COUNT(*)AS水果种类,ProductPlace AS出产国 FROM T_TEST_FRUITINFO WHERE(ProductPlace<>'Japan') GROUPBY ProductPlace 那么在最后结果中由于Japan不符合where语句,所以分组结果中将不会出现J apan。 现在我们加入ALL关键字: SELECT COUNT(*)AS水果种类,ProductPlace AS出产国 FROM T_TEST_FRUITINFO WHERE(ProductPlace<>'Japan') GROUPBY ALL ProductPlace 重新运行后,我们可以看到Japan的分组,但是对应的“水果种类”不会进行真正的统计,聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。 2.3 GROUP BY [Expressions] WITH CUBE | ROLLUP: 首先需要说明的是Group By All 语句是不能和CUBE 和ROLLUP 关键字一起使用的。 首先先说说CUBE关键字,以下是SQL Server 2000联机帮助中的说明: 指定在结果集内不仅包含由GROUPBY提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的GROUPBY汇总行。GROUPBY汇总行在结果中显示为NULL,但可用来表示所有值。使用GROUPING函数确定结果集内的空值是否是GR OUPBY汇总值。 结果集内的汇总行数取决于GROUPBY子句内包含的列数。GROUPBY子句中的每个

分组聚合函数详细讲解

聚合函数总结 在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析。比如我们常见的一些分组计算需求:求某个部门的薪资总和,薪资平均值,薪资最大值等等。 分组聚合函数也可称之为多行函数,它的输入是多个行构成得一个行集(这个行集可以是一张表的所有行,也可以是按照某个维度进行分组后的某一组行),而输出都是一个值。 1.分组聚合函数语法以及SQL 语句执行过程 SQL中使用分组聚合函数的语法 SELECT [column,] group_function(column), ... FROM table [WHERE condition] [GROUP BY column][having] [ORDER BY column]; 在select 语句中使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having 子句限制返回的结果集。 查询语句的select 和group by,having,Order by 子句是分组聚合函数唯一出现的地方,在where 子句中不能使用分组聚合函数。 select department_id, sum(salary) from employees where salary>10000 group by department_id having sum(salary) > 11000 order by sum(salary) sql语句执行过程 (1)按select找到where满足条件的元组形成结果表。 相当于: select department_id, salary from employees where salary>10000

Oracle 笔试题目带答案

1.( )程序包用于读写操作系统文本文件。(选一项) A、Dbms_output B、Dbms_lob C、Dbms_random D、Utl_file 2.( )触发器允许触发操作的语句访问行的列值。(选一项) A、行级 B、语句级 C、模式 D、数据库级 3.( )是oracle在启动期间用来标识物理文件和数据文件的二进制文件。(选一项) A、控制文件 B、参数文件 C、数据文件 D、可执行文件 4.CREATE TABLE 语句用来创建(选一项) A、表 B、视图 C、用户 D、函数 5.imp命令的哪个参数用于确定是否要倒入整个导出文件。(选一项) A、constranints B、tables C、full D、file 6.ORACLE表达式NVL(phone,'0000-0000')的含义是(选一项) A、当phone为字符串0000-0000时显示空值 B、当phone为空值时显示0000-0000 C、判断phone和字符串0000-0000是否相等 D、将phone的全部内容替换为0000-0000 7.ORACLE交集运算符是(选一项) A、intersect B、union C、set D、minus 8.ORACLE使用哪个系统参数设置日期的格式(选一项) A、nls_language

B、nls_date C、nls_time_zone D、nls_date_format 9.Oracle数据库中,通过()访问能够以最快的方式访问表中的一行(选一项) A、主键 B、Rowid C、唯一索引 D、整表扫描 10.Oracle数据库中,下面()可以作为有效的列名。(选一项) A、Column B、123_NUM C、NUM_#123 D、#NUM123 11.Oracle数据库中,以下()命令可以删除整个表中的数据,并且无法回滚(选一项) A、drop B、delete C、truncate D、cascade 12.Oracle中, ( )函数将char或varchar数据类型转换为date数据类型。(选一项) A、date B、to_date C、todate D、ctodate 13.ORACLE中,执行语句:SELECT address1||','||address2||','||address2 "Address" FROM employ; 将会返回()列(选一项) A、0 B、1 C、2 D、3 14.Oralce数据库中,以下()函数可以针对任意数据类型进行操作。(选一项) A、TO_CHAR B、LOWER C、MAX D、CEIL 15.partition by list(msn_id)子句的含义是(选一项) A、按msn_id列进行范围分区 B、按msn_id列进行列表分区

1-函数分组

隨機函數,分組排序,分組函數,多表插入或更新(merge),批量綁定,通用函數 1. rownum的區間查詢 DROP TABLE t_a; CREATE TABLE t_a (card_code VARCHAR2(3), q NUMBER, bal NUMBER); INSERT INTO t_a SELECT 001 card_code, ROWNUM q, trunc(dbms_random.VALUE * 100) bal FROM dual CONNECT BY ROWNUM <= 4 UNION SELECT 002 card_code, ROWNUM q, trunc(dbms_random.VALUE * 100) bal FROM dual CONNECT BY ROWNUM <= 4; SELECT * FROM t_a; select * from t_a where rownum>=1; select * from t_a where rownum>=3; select * from t_a where rownum<=3; select * from t_a where rownum<3; select * from t_a where rownum>3; select * from t_a where rownum>1; select * from (select card_code,q,bal,row_number()over(order by bal) as num from t_a) where num>2 and num<6; SELECT ROWNUM r, t.* FROM t_a t ORDER BY t.bal DESC; 為何行號是亂的?因先分配行號,再排序 SELECT ROWNUM r, t.* FROM (SELECT t.* FROM t_a t ORDER BY t.bal DESC) t; 應該先排序再分配行號 2.行列轉換 a.行轉列 SELECT a.card_code, SUM(decode(a.q, 1, a.bal, 0)) q1, SUM(decode(a.q, 2, a.bal, 0)) q2, SUM(decode(a.q, 3, a.bal, 0)) q3, SUM(decode(a.q, 4, a.bal, 0)) q4 FROM t_a a GROUP BY a.card_code ORDER BY1; b.列轉行 DROP TABLE t_b; CREATE TABLE t_b AS SELECT a.card_code, SUM(decode(a.q, 1, a.bal, 0)) q1, SUM(decode(a.q, 2, a.bal, 0)) q2, SUM(decode(a.q, 3, a.bal, 0)) q3, SUM(decode(a.q, 4, a.bal, 0)) q4 FROM t_a a GROUP BY a.card_code ORDER BY 1; SELECT * FROM t_b; SELECT t.card_code, t.rn q, decode(t.rn, 1, t.q1, 2, t.q2, 3, t.q3, 4, t.q4) bal FROM (SELECT a.*, b.rn FROM t_b a, (SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM <= 4) b) t ORDER BY1, 2; c.行轉列合併 DROP TABLE t_c; CREATE TABLE t_c AS SELECT card_code, bal||q as q FROM t_a; SELECT * FROM t_c; SELECT t1.card_code, substr(MAX(sys_connect_by_path(t1.q, ';')), 2) q FROM (SELECT a.card_code, a.q, row_number() over(PARTITION BY a.card_code ORDER BY a.q) rn FROM t_c a) t1 START WITH t1.rn = 1 CONNECT BY t1.card_code = PRIOR t1.card_code AND t1.rn - 1 = PRIOR t1.rn GROUP BY t1.card_code; d.列轉行分割 DROP TABLE t_d; CREATE TABLE t_d AS SELECT t1.card_code, substr(MAX(sys_connect_by_path(t1.q, ';')), 2) q FROM (SELECT a.card_code, a.q, row_number() over(PARTITION BY a.card_code ORDER BY a.q) rn

相关文档