SQL 函数 笔记((Structured Query Language)

来源:互联网 发布:淘宝号如何实名认证 编辑:程序博客网 时间:2024/05/22 13:47

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)aWHERE 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 copyCREATE 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 0
原创粉丝点击