select * from kind;
create table student (sno int,sname varchar2(8))
insert into student
select 1,'tom' from dual union
select 2,'jack' from dual union
select 3,'jerry' from dual union
select 4, 'wendy' from dual union
select 5 , 'sorry' from dual
create table courses (c_no int , c_name varchar2(8))
insert into courses
select 1,'语文' from dual union
select 2,'数学' from dual union
select 3,'英语' from dual
create table score (sno int ,c_no int ,mark int)
insert into score
select 1,1,60 from dual union
select 1,2,80 from dual union
select 1,3,100 from dual union
select 2,1,90 from dual union
select 2,2,80 from dual union
select 2,3,65 from dual union
select 3,1,50 from dual union
select 3,2,86 from dual union
select 3,3,90 from dual union
select 4,1,45 from dual union
select 4,2,86 from dual union
select 4,3,100 from dual union
select 5,1,20 from dual union
select 5,2,89 from dual union
select 5,3,90 from dual
select s.sno 学号,s.sname 姓名 /*,decode(c.c_name,'语文',score.mark) 语文 */from student s,courses c,score score group by s.sno,s.sname
select sum(decode(c.c_name,'语文',sco.mark)) 语文,sum(decode(c.c_name,'数学',sco.mark)) 数学,sum(decode(c.c_name,'英语',sco.mark)) 英语 from courses c left outer join score sco on sco.c_no=c.c_no
select a.no,语文,英语,数学,(语文+数学+英语)as 总成绩,(语文+数学+英语)/3 as 平均成绩,(3-fnum)*100/3 as 及格率 from
(select no,sco as 语文 from test1017 where name='语文') a join (select no,sco as 英语 from test1017 where name='英语') b on a.no=b.no
join (select no,sco as 数学 from test1017 where name='数学') c on b.no=c.no
left join (select no,count(*)as fnum from test1017 where sco<60 group by no) d on c.no=d.no
select decode(c_name,'语文',1),decode(c_name,'数学',1) from score,courses where score.c_no=courses.c_no group by score.c_no,courses.c_name
select * from score s,student stu,courses c where s.sno=stu.sno and s.c_no=c.c_no
select distinct decode(c_name,'语文',1) 语文 ,decode(c_name,'数学',1) 数学 from score right outer join courses on courses.c_no=score.c_no--where score.c_no=courses.c_no
select* from courses;
select * from
(select sname s_name from student group by sname) left outer join
(select sname,语文,数学,英语 from (
select sno,decode(c_name,'语文',mark) 语文, decode(c_name,'数学',mark) 数学,decode(c_name,'英语',mark) 英语 from courses right outer join score on courses.c_no=score.c_no
) right outer join student on student.sno=sno) on s_name=sname --group by student.sname
--通过观察我们看的出其中有两个重点一个是行变列一个是连接分组然后并行(用组合函数)注:并行我们可以用组合函数SUM()分列可用分析函数DECODE得新列
--根据题意可知要行变列所以使用分析函数DECODE通过相等来设列而列值通过两表连接使SCORE中的MARK做值
--通过第一步思路要进行两表连接那么用什么方式呢因为各人各科成绩是不一样的而又列中的值是成绩那就用对成绩表做全查的右外连接
--经过第一步我们可以得到15条记录而其中SNO重复的可知我们要分组正好可以得到学生名字因为SNO同SNAME一一对应的但如果在
--select sno s_no,decode(c_name,'语文',mark) 语文, decode(c_name,'数学',mark) 数学,decode(c_name,'英语',mark) 英语 from courses right outer join score on courses.c_no=score.c_no语句
--分组的话那就要在所有的列上加组函数如:SUM()的啊那就成了一行了与我们的想法又不同了如何解决呢那我们就不能在上面语句上分组了
--我们知道分组对FROM句中是不起作用的那可不可以先分了组再把对应数据的数据查出来呢正好可以通过连表把SNAME也查出来(注意SELECT FROM WHERE GROUP BY ODERY BY 执行顺序是先GROUP BY 再SELECT 然后WHERE 最后 ORDER BY 的)
--通过表连接在外层上GROUP BY 后再组合函数
select sname 姓名,语文,数学,英语, (语文+数学+英语) 总分 from (
select sname ,sum(语文) 语文,sum(数学) 数学,sum(英语) 英语 from (
select sno s_no,decode(c_name,'语文',mark) 语文, decode(c_name,'数学',mark) 数学,decode(c_name,'英语',mark) 英语 from courses right outer join score on courses.c_no=score.c_no
),student where s_no=student.sno group by student.sname
)
分享到:
相关推荐
通过oracle的管道技术实现行变列,或者复杂的SQL语句实现。 可以完成复杂逻辑在oracle中完成,减少对编程程序的依赖。
Oracle数据库中的"行变列"技术是指将数据库中原本存储为多行的数据转换为单行的列式展示,这在数据分析、报表制作等场景中非常常见。存储过程是Oracle数据库中预编译的PL/SQL代码块,可以执行一系列复杂的数据库操作...
### Oracle行转列 #### 基本概念 行转列,即Pivot操作,是指将原始数据集中的一列或多列中的值转换为新的列名,并将这些列的值分布到相应的行中。这与传统的表结构有所不同,在传统表结构中,每一列代表一种属性,...
DECODE函数在处理列转行的问题时,尤其适用于将多列数据合并到一行中,使得数据展示更加简洁明了。下面我们将详细讲解DECODE函数的使用方法以及如何在列转行操作中应用它。 DECODE函数的基本语法如下: ```sql ...
1. 数据行过大:当行中的列值变大,使得整个行的大小超过单个数据块的限制。 2. 表设计不合理:如过多的大对象(LOB)字段或者不必要的大字符字段。 3. 表空间碎片:频繁的插入、删除和更新操作导致数据块空间的不...
oracle 中的数据从竖行显示处理为横行显示
二、Oracle行排序 在Oracle中,对数据进行排序是通过SQL的ORDER BY子句实现的。以下是一些关键点: 1. ORDER BY子句的位置:它通常位于SELECT语句的末尾,用于指定查询结果的排序顺序。 2. 升序与降序:ASC(升序...
通过封装这些接口,go-goracle为Go程序员提供了更加友好的Go语言风格的API,使得在Go中操作Oracle数据库变得简单易行。 在goracle-master这个压缩包中,包含了项目的源代码和相关的文档。源代码主要分为几个关键...
Oracle SQL支持多种数据类型,如CHAR、VARCHAR2(可变长度字符串)、NUMBER(数字)、DATE(日期时间)、CLOB(大对象,用于存储文本)、BLOB(大对象,用于存储二进制数据)等。选择正确的数据类型对于数据的存储和...
Oracle中的ROWID是伪列,它是数据库中每个行的唯一地址,用于快速定位数据。ROWNUM也是伪列,它返回行的序列号,常用于限制查询结果的数量。例如,`SELECT * FROM table WHERE ROWNUM 将返回表中的前10行。 总的来...
在Oracle中,表是数据的容器,由列和行组成。创建表时需定义每列的数据类型和约束,如非空约束、唯一性约束、主键约束等。索引用于提高查询速度,分为唯一索引、非唯一索引、位图索引和函数索引等。 四、联接操作 ...
Oracle数据库以其强大的数据处理能力和稳定性受到青睐,而C#作为.NET Framework的一部分,提供了丰富的库和工具,使得与Oracle数据库的交互变得简单高效。 一、Oracle数据库基础 Oracle是全球最大的数据库管理系统...
以上列出的关键字只是Oracle庞大词汇库的一小部分。熟练掌握这些关键字不仅有助于提高SQL技能,还有助于更高效地管理和维护Oracle数据库。对于想要深入学习Oracle的人来说,理解并正确使用这些关键字是十分重要的...
PIVOT函数可以自动将行数据转换为列,使得数据透视变得更加便捷。 ```sql -- Oracle 11g及以上版本 SELECT * FROM sales_table PIVOT ( SUM(sales) FOR month IN ('Jan' AS Jan_Sales, 'Feb' AS Feb_Sales, ...)...
Oracle数据库是全球最广泛使用的数据库管理系统之一,它遵循SQL标准,提供了一套强大的SQL语句,使得数据库操作变得高效和灵活。在Oracle数据库中,SQL语句是与数据库进行交互的主要方式。本文将总结一些Oracle基本...
Oracle使用一个或多个行片段来存储表的每一行数据的前255列。当一个数据块可以容纳一个完整的数据行时(且表的列数小于等于256),那么此行就可以使用一个行片段来存储。当插入一个数据行,或更新已有数据行时,数据...
Oracle提供了丰富的API和函数来操作XMLType,如XMLQuery、XMLExists、XMLCast、XMLTable等,这些函数使得在SQL中处理XML变得简单易行。 3. **XQuery**: XQuery是用于查询XML数据的标准语言,Oracle支持XQuery用于对...
在Oracle数据库管理中,行转列与列转行是常见的数据操作需求,特别是在数据分析和报表展示时。这两种操作可以通过不同的SQL技巧实现,如使用CASE语句、PIVOT和UNPIVOT操作,以及DECODE函数等。下面将详细介绍如何在...