SQL 函数 笔记((Structured Query Language)
2017-10-26 20:43
627 查看
1. COUNT() 函数返回匹配指定条件的行数。
2. HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数(GROUP BY)一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。有时候需要对部分分组进行过滤,比如只检索人数多于一个的年龄段,下面的是错误的SQL语句:
因为聚合函数不能再WHERE语句中使用,必须使用HAVING子句来代替,如下:
HAVING语句中也可以像WHERE语句一样使用复杂的过滤条件,比如:检索人数为1个过着3个的年龄段,可以使用下面的SQL:
也可以使用IN操作实现:
HAVING语句和WHERE语法类似,不过使用WHERE的时候GROUP BY子句要位于WHERE 子句之后,而使用HAVING子句的时候GROUP BY 子句要位于HAVING子句之前。
注意:HAVING子句中不能包含未聚合(分组)的列名。
3.限制结果集行数 oracle 中函数ROW_NUMBER()
在oracle中rownum为保留字。
oracle支持标准函数ROW_NUMBER(),不过Oracle中提过了更方便的特性计算行号,无需自行计算行号,Oracle为每个结果集都增加了一个默认的表示行号的列,这个列的名称为rownum。比如:
使用rownum可以很轻松取得结果集中前N条的数据行,比如:
rownum为结果集中每一行的行号,从1开始计数,当进行检索的时候,对于第一条数据其rownum为1,因为符合 WHERE rownum <=6 所以被放在检索结果集中;当检索到第二条数据的时候为2 - - - - -直到第七行。可以实现按照工资从高到低取出第1个到第6个员工信息的功能。
注意:
按照工资高低顺序去除第三个到第五个员工信息:
检索结果为空!!!当检索的时候,第一条记录其rownum为1,不符合BETWEEN 3 AND 5 所以没有被放在结果集中,当检索第二条记录的时候,因为第一个没有放入结果集,所以第二条数据的rownum还是1,所以依次类推,结果为空!
因此,如果要使用rownum实现“按照工资从高到低的顺序取出第三个到四五个员工的信息”的功能,需要借助于窗口函数ROW_NUMBER()。上面的!
oracle实例:
-- 查询所有记录的条数 select count(*) from as nums access_log; -- 查询websites 表中 alexa列中不为空的记录的条数 select count(alexa) from as nums websites; -- 查询websites表中 country列中不重复的记录条数 select count(distinct country) as nums from websites;
2. HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数(GROUP BY)一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。有时候需要对部分分组进行过滤,比如只检索人数多于一个的年龄段,下面的是错误的SQL语句:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge WHERE COUNT(*)>1;
因为聚合函数不能再WHERE语句中使用,必须使用HAVING子句来代替,如下:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1;
HAVING语句中也可以像WHERE语句一样使用复杂的过滤条件,比如:检索人数为1个过着3个的年龄段,可以使用下面的SQL:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)=1 OR COUNT(*)=3;
也可以使用IN操作实现:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) IN (1,3);
HAVING语句和WHERE语法类似,不过使用WHERE的时候GROUP BY子句要位于WHERE 子句之后,而使用HAVING子句的时候GROUP BY 子句要位于HAVING子句之前。
注意:HAVING子句中不能包含未聚合(分组)的列名。
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FName IS NOT NULL GROUP BY FAge;
3.限制结果集行数 oracle 中函数ROW_NUMBER()
SELECT * FROM(SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) row_num,FNumber,FName,FSalary,FAge FROM T_Employee)a WHERE a.row_num>=3 AND a.row_num<=5;
在oracle中rownum为保留字。
oracle支持标准函数ROW_NUMBER(),不过Oracle中提过了更方便的特性计算行号,无需自行计算行号,Oracle为每个结果集都增加了一个默认的表示行号的列,这个列的名称为rownum。比如:
SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee;
使用rownum可以很轻松取得结果集中前N条的数据行,比如:
SELECT * FROM T_Employee WHERE rownum<=6 ORDER BY FSalary Desc;
rownum为结果集中每一行的行号,从1开始计数,当进行检索的时候,对于第一条数据其rownum为1,因为符合 WHERE rownum <=6 所以被放在检索结果集中;当检索到第二条数据的时候为2 - - - - -直到第七行。可以实现按照工资从高到低取出第1个到第6个员工信息的功能。
注意:
按照工资高低顺序去除第三个到第五个员工信息:
SELECT * FROM T_Employee WHERE rownum BETWEEN 3 AND 5 ORDER BY FSalary Desc;
检索结果为空!!!当检索的时候,第一条记录其rownum为1,不符合BETWEEN 3 AND 5 所以没有被放在结果集中,当检索第二条记录的时候,因为第一个没有放入结果集,所以第二条数据的rownum还是1,所以依次类推,结果为空!
因此,如果要使用rownum实现“按照工资从高到低的顺序取出第三个到四五个员工的信息”的功能,需要借助于窗口函数ROW_NUMBER()。上面的!
oracle实例:
[sql] view plain copy CREATE TABLE STUDENTS( --创建一个学生表 SID INTEGER, --学生id SNAME VARCHAR2(20), --学生姓名 SSEX VARCHAR2(10), --学生性别 SUBJECT VARCHAR2(20), --科目名称 SCORE INTEGER --对应科目成绩 ); --插入信息 INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(10,'小李','男','英语',90); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(11,'小欣','女','英语',96); INSERT INTO STUDENTS(SID,SNAME,SSEX,S 4000 UBJECT,SCORE)VALUES(12,'小张','男','英语',88); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(12,'小张','男','语文',99); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(12,'小张','男','数学',73); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(10,'小李','男','数学',85); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(10,'小李','男','语文',93); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(11,'小欣','女','语文',95); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(11,'小欣','女','数学',63); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(13,'小萌','女','语文',90); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(13,'小萌','女','数学',92); INSERT INTO STUDENTS(SID,SNAME,SSEX,SUBJECT,SCORE)VALUES(13,'小萌','女','英语',86); --查询处理后的数据形式(1) SELECT S.SID,S.SNAME,S.SUBJECT,S.SCORE,ROW_NUMBER() OVER (PARTITION BY S.SUBJECT ORDER BY S.SCORE DESC) FROM STUDENTS S; --查每一科的第一名(2) SELECT * FROM(SELECT S.SID,S.SNAME,S.SUBJECT,S.SCORE,ROW_NUMBER() OVER (PARTITION BY S.SUBJECT ORDER BY S.SCORE DESC) RN FROM STUDENTS S)A WHERE A.RN=1;
相关文章推荐
- SQL(Structured Query Language)学习笔记
- SQL Structured Query Language(结构化查询语言) 数据库
- 数据库跟丽军学 之二 关系数据库操作语言SQL(Structured Query Language, 结构化查询语言)
- SQL结构化查询语言(Structured Query Language)
- PL/SQL(Procedure Language & Structured Query Language)
- Qt中SQL QSqlQuery 对象中prepare()函数的用法(初学者,学习笔记,还望指正)
- 数据库——SQL语句(Structured query Language)
- SQL(Structured Query Language)语句分哪几类
- SQL语法 (Structured Query Language)
- Structured Query Language (SQL)
- SQL:结构化查询语言(Structured Query Language)。
- sql: structured query language(结构化查询语言)
- SQL 常用函数-笔记
- PL/SQL函数笔记
- 【sql笔记】ROUND() 函数
- QT笔记:数据库总结(二)之SQL模型类-QSqlQueryModel模型
- PL/SQL函数学习笔记:trim和to_char的应用
- SQL 常用函数-笔记
- Oracle笔记:pl/sql过程、函数、包