zoukankan      html  css  js  c++  java
  • SQL奇技淫巧

    1.SQL行列转换

    问题:假设有张学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    想变成(得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74 84 94
    张三 74 83 93

    代码:

    select 姓名 as 姓名 ,
    max(case 课程 when '语文' then 分数 else 0 end) 语文,
    max(case 课程 when '数学' then 分数 else 0 end) 数学,
    max(case 课程 when '物理' then 分数 else 0 end) 物理
    from tb
    group by 姓名

    2.SQL分页

    --分页方案一:(利用Not In和SELECT TOP分页) 
    语句形式: 
    SELECT TOP 10 * FROM TestTable
    WHERE (ID NOT IN(SELECT TOP 20 id FROM TestTable ORDER BY id)) 
    ORDER BY ID 
     
     
    SELECT TOP 页大小 * FROM TestTable 
    WHERE (ID NOT IN (SELECT TOP 页大小*页数 id FROMORDER BY id)) 
    ORDER BY ID 
     
    ------------------------------------- 
     
    --分页方案二:(利用ID大于多少和SELECT TOP分页) 
    语句形式: 
    SELECT TOP 10 * FROM TestTable 
    WHERE (ID > (SELECT MAX(id) FROM (SELECT TOP 20 id FROM TestTable ORDER BY id) AS T)) 
    ORDER BY ID 
     
     
    SELECT TOP 页大小 * FROM TestTable 
    WHERE (ID > (SELECT MAX(id) FROM (SELECT TOP 页大小*页数 id FROMORDER BY id) AS T)) 
    ORDER BY ID 
     
    ------------------------------------- 
     
    --分页方案三:(利用SqlServer2005中的新特性ROW_NUMBER进行分页)
     
    Select * FROM (
      select ROW_NUMBER()Over(order by id desc) as rowId,* from TestTable
    ) as mytable
    where rowId between 21 and 40

    3.SQL查询结果合并

    --合并重复行
    select * from A
     union
    select * from B
     
    --不合并重复行
    select * from A
     union all
    select * from B

    4.SQL随机排序

    SELECT * FROM TestTable ORDER BY NEWID()

    5.SQL以逗号分隔取两边数据

    select charindex(',',',')         --结果是1
    select charindex(',','NULL')     --结果是0
    select charindex(',','')         --结果是0
    select charindex(',','T,ToEstate')    --结果是2
    select len('T,ToEstate')               --结果是10
    select  len('T,ToEstate') - charindex(',','T,ToEstate')  --结果是10-2=8
    select right('T,ToEstate',(len('T,ToEstate') - charindex(',','T,ToEstate'))) --结果是 ToEstate
    select
    case when charindex(',',roomdirection)>1 then  left(roomdirection,charindex(',',roomdirection)-1) else null end as roomdirection1 ,
    case when charindex(',',roomdirection)>1 then  right(roomdirection,(len(roomdirection) - charindex(',',roomdirection)))  else null end as roomdirection2
    from  tb

     6.WAITFOR延时执行

    --WAITFOR
    --例 等待1 小时2 分零3 秒后才执行SELECT 语句
    waitfor delay '01:02:03'
    select * from employee
    --例 等到晚上11 点零8 分后才执行SELECT 语句
    waitfor time '23:08:00'
    select * from employee
  • 相关阅读:
    表的创建与管理
    以传值和传引用的方式传递参数 IN OUT NOCOPY
    PLSQL中的三种参数模式IN、OUT、IN OUT
    用python写GPU上的并行计算程序,有什么库或者编译器?
    cupy中tensor数据类型与numpy以及pytorch中相互转换
    c++ string split
    Java 读取大文件
    Linux 使用系列
    安装以太坊环境
    服务器排查问题相关命令
  • 原文地址:https://www.cnblogs.com/sdadx/p/7478335.html
Copyright © 2011-2022 走看看