mysql行转列 subs_Oracle函数、存储过程、视图详解

本文详细介绍了Oracle中的行转列方法,包括利用CASE语句实现行转列的示例,以及GROUP BY和PARTITION BY的区别。此外,还探讨了rank()、dense_rank()函数的差异和rownum的使用。同时,文章讲解了Oracle存储过程的创建及参数类型,如IN、OUT、IN OUT,并展示了如何使用IF-THEN-ELSE和循环语句。最后,简要提及了Oracle视图的概念及其优点。
摘要由CSDN通过智能技术生成

Oracle函数、存储过程

Oracle函数

以下查询基于此表:

4ba2a0f699f0355a4d64e1bd114fd6fe.png

(1)行转列

7c8c292686071a590a59f014e3eee1f0.png

表中成绩是这样的,现在要求显示 张三 语文成绩 数学成绩 英语成绩

a88998bc89da85b22cdccf8780c382a2.png

SELECT NAME,

MAX(CASE WHEN SUBS='语文' THEN CJ END) AS 语文,

MAX(CASE WHEN SUBS='数学' THEN CJ END) AS 数学,

MAX(CASE WHEN SUBS='英语' THEN CJ END) AS 英语

FROM STUDENT

GROUP BY NAME

(2) group by是分组函数,partition by是分区函数

over(partition by cno order by degree )

先对cno 中相同的进行分区,在cno 中相同的情况下对degree 进行排序

例一:对每个同学所有成绩进行排序

28394c7dcbcdb6782abae7912dfe38fa.png

select t.*, rank() over(partition by name order by to_number(cj) desc) as rank from STUDENT t;

例二:查询每位同学的最高成绩的科目

fd3c11782638059cce22fa48866e6d42.png

select * from (select t.*, rank() over(partition by name order by to_number(cj) desc) as rank from STUDENT t) where rank = 1

(3)rank()与dense_rank()的区别

由以上的例子得出,rank()和dense_rank()都可以将并列第一名的都查找出来;但rank()是跳跃排序,有两个第一名时接下来是第三名;而dense_rank()是非跳跃排序,有两个第一名时接下来是第二名

(4)rownum的用法

c91299053d8b4d2b9dc8181909322cea.png

缺点:order by后会乱序

select rownum,t.* from STUDENT t

(5)rank() over()

6c085f132cc53df92c27a33ffd41e0f9.png

对总分进行排名并加上序号

SELECT NAME,

MAX(CASE WHEN SUBS='语文' THEN CJ END) AS 语文,

MAX(CASE WHEN SUBS='数学' THEN CJ END) AS 数学,

MAX(CASE WHEN SUBS='英语' THEN CJ END) AS 英语,

SUM(CJ),

RANK () OVER (ORDER BY SUM(CJ) DESC) AS rowno

FROM STUDENT

GROUP BY NAME

(6) group by分组查询后,查询的数据只能跟分组的那个字段有关

Oracle存储过程

PLSQL创建存储过程的方法

79722b0466aff3aa7112dd125dab9fae.png

参数解释:

CREATE OR REPLACE PROCEDURE demo(param1 student.id%TYPE)

AS/IS

name student.name%TYPE;

age number :=20;

BEGIN

--业务处理.....

END

这里的as和is一样任选一个,在这里没有区别,其中demo是存储过程名称。

param1 是参数,类型和student表id字段的类型一样。

声明变量age,类型数数字,初始化为20

输出查询结果,在数据库中“||”用来连接字符串

其中参数IN表示输入参数,是参数的默认模式。

OUT表示返回值参数,类型可以使用任意Oracle中的合法类型。

OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程

IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去

运算语法

12dfbf05f3a63c066a5e637309e201af.png

选择语句

a.IF…END IF

学生表的sex字段:1-男生;0-女生

IF s_sex=1 THEN

dbms_output.put_line('这个学生是男生');

END IF

b.IF…ELSE…END IF

IF s_sex=1 THEN

dbms_output.put_line('这个学生是男生');

ELSE

dbms_output.put_line('这个学生是女生');

END IF

循环语句

a.基本循环

LOOP

IF 表达式 THEN

EXIT;

END IF

END LOOP;

b.while循环

WHILE 表达式 LOOP

dbms_output.put_line('haha');

END LOOP;

c.for循环

FOR a in 10 .. 20 LOOP

dbms_output.put_line('value of a: ' || a);

END LOOP;

(1) 没有参数的存储过程

create or replace procedure demo_cdd as

s_name varchar2(10); -- 声明变量

s_subs varchar2(10);

s_cj number;

begin

-- 给单个变量赋值

select name into s_name

from student where id = 1and name = 'zs';

-- 给多个变量赋值

select subs, cj into s_subs,s_cj

from student where id = 1 and name = 'zs';

-- 输出

dbms_output.put_line('姓名:'||s_name||',科目:'||s_subs||',成绩:'||s_cj);

end ;

b58ed5a198a27bb14c9dbd5ede340dfb.png

(2)有参数的存储过程

create or replace procedure demoParms(

s_cj in number

) as

total number := 0;

begin

select count(1) into total from student s where s.cj = s_cj;

dbms_output.put_line('符合该条件的学生有'||total||'人');

exception

when too_many_rows then

DBMS_OUTPUT.PUT_LINE('返回值多于1行');

end;

create or replace procedure text is

begin

demoParms(89);

end;

7660ec876cf9acf352917cd865e9b683.png

参考链接

Oracle视图

视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。

视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。

视图的优点:

1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。

2.用户通过简单的查询可以从复杂查询中得到结果。

3.维护数据的独立性,试图可从多个表检索数据。

4.对于相同的数据可产生不同的视图。

视图分为简单视图和复杂视图:

1、简单视图只从单表里获取数据,复杂视图从多表;

2、简单视图不包含函数和数据组,复杂视图包含;

3、简单视图可以实现DML操作,复杂视图不可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值