行转列 使用pivot关键字格式

select * from txueshen 
 pivot (
 sum(tfs) --聚合函数 也可用avg count  等根据需求
 for tkm   --需要转行的字段名
 in ('语文','数学 ' )   --写明确字段的值的,集合   必须是for中的值    不可使用子查询
 )

若想要在in中写动态的, pivot后面加上xml 生成的是xmltype类型的字段

不过我换用另一种方式

先查出需要转行的值的集合,用wm_concat()将结果集函数转成一行,在传入in中

select '('||wm_concat(''''||t.tkm||'''')||')' from (
 select distinct tkm from txueshen)t

这里自己加了一点自己的处理,实现in中传入动态值,不过就是用的时候需要与数据库交互两次

行转列 方式二 mysql 

3个要点

case when 把行转到列显示

group by 给要每行分组

使用聚合函数, 处理分组后的值.  数字用 sum ,或max, 字符串用 group_concat 

unpivot 列转行

select id , name, jidu, xiaoshou fromforin (q1, q2, q3, q4) )

注意: unpivot没有聚合函数,xiaoshou、jidu字段也是临时的变量

in中所包含的字段集合的数据类型必须一致, 而jidu显示为本列数据的字段标题, 

xiaoshou为内容的字段标题.

行专列也可用union all连接实现

------------------------------------------------------------------------------------------------------------

--sql中的 where 、group by 和 having 用法解析

--如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术

select DepartmentID as '部门名称',COUNT(*) as '个数' from BasicDepartment group by DepartmentID
--这个就是使用了group by + 字段 进行了分组,其中我们就可以理解为我们按照了部门的名称ID
--DepartmentID将数据集进行了分组;然后再进行各个组的统计数据分别有多少;

--如果不用 count(*) 而用类似下面的语法
select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID
--将会出现错误

--选择列表中的列 'BasicDepartment.DepartmentName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
    这就是我们需要注意的一点,如果在返回集字段中,这些字段要满足
    要么就要包含在Group By语句的后面,作为分组的依据;
    要么就要被包含在聚合函数中,作为分组的依据;

--出现的错误详解:咱们看看group by 的执行的过程,先执行select 的操作返回一个程序集,
--然后去执行分组的操作,这时候他将根据 group by 后面的字段
--进行分组,并且将相同的字段并称一列数据,如果group by 后面没有这个字段的话就要分成好多的数据。
--但是分组就只能将相同的数据分成两列数据,而一列中又只能放入一个字段,所以那些没有进行分组的
--数据系统不知道将数据放入哪里,所以就出现此错误

--目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,
--所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的
--数据格中,那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregate functions)了

--group by 和having 解释:前提必须了解sql语言中一种特殊的函数:聚合函数,
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

having是分组(group by)后的筛选条件,分组后的数据组内再筛选
where则是在分组前筛选

where子句中不能使用聚集函数,而having子句中可以,所以在集合函数中加上了HAVING来起到测试查询结果是否符合条件的作用。
即having子句的适用场景是可以使用聚合函数

having 子句限制的是组,而不是行
having 子句中的每一个元素也必须出现在select列表中

group by all与group by的区别

当你使用WHERE语句过滤数据时,结果分组中只显示你指定的那些记录,而符合分组定义但是不满足过滤条件的数据不会包含在某个分组中。当你想在分组中包含所有数据时添加关键字ALL即可,这时WHERE条件就不起作用

索引失效的情况 --mysql

1 数据类型不匹配  如: 数字=字符串, 时间=字符串
2 索引字段进行聚合运算
3 like %在左
4 联合索引 第一个字段未使用
5 OR连接的是同一个字段,那么索引不会失效,反之索引失效, 错误说法: OR前后的两个条件中的列都是索引时,索引才会生效,否则索引不生效。
6 is not null 索引失效   但是  is null 则会生效
7 NOT IN、NOT EXISTS导致索引失效   但是 in 使用索引
特殊记住  !=  <> 是会使用索引