SQL 函数 笔记((Structured Query Language)

1. COUNT() 函数返回匹配指定条件的行数。

-- 查询所有记录的条数
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,SUBJECT,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;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值