• SQL基础知识总结二


    一、SQL基础练习题总结

    1、练习题1:

    表中有ABC三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列.
    sql语句如下:
    select(
    case
    when A>B then A else B end),
    (case
    when B>C then B else C end)
    from t;


    2、练习题2:
    有一张表T_Scores,记录比赛成绩
    Date Name Score
    2008 拜仁 胜
    2008 奇才 胜
    2008 湖人 胜
    2008 拜仁 负
    2008 拜仁 负
    2008 奇才 胜
    要求输出下面格式:
    Name 胜 负
    拜仁 1 2
    湖人 1 0
    奇才 2 0
    sql语句如下:
    select Name,
    sum(
    case score
    when N'胜' then 1
    else 0
    end
    ) as 胜,
    sum(
    case score
    when N'负' then 1
    else 0
    end
    ) as 负
    from T_Scores
    group by Name;


    3、练习题3:
    创建一张表,记录电话呼叫员的工作流水,记录呼叫员编号CallerNumber、对方号码TelNum、通话开始时间StartDateTime、通话结束时间EndDateTime.


    (1)、输出所有数据中通话时间最长的5条记录.
    sql语句如下:
    select top 5 * from T_CallRecords1
    order by DateDiff(second,StartDateTime,EndDateTime) desc;


    (2)、输出所有数据中拔打长途号码(对方号码以0开头)的总时长.
    sql语句如下:
    select sum(DateDiff(second,StartDateTime,EndDateTime)) from T_CallRecords1
    where TelNum like '0%';


    (3)、输出本月通话总时长最多的前三个呼叫员的编号.(遇到这种比较麻烦的,应一步一步来,先写一部分,在挨个往上加条件)
    sql语句如下:
    select top 3 CallerNumber from T_CallRecords1
    where datediff(month,StartDateTime,getdate())=0//本月
    group by CallerNumber
    order by sum(DateDiff(month,StartDateTime,EndDateTime)) desdscc;


    (4)、输出本月拨打电话次数最多的前三个呼叫员的编号.
    sql语句如下:
    select top 3 CallerNumber,count(*) from T_CallRecords1
    where datediff(month,StartDateTime,getdate())=0
    group by CallerNumber
    order by count(*) DESC;


    (5)、输出所有数据的拨号流水,并且在最后一行添加总呼叫时长
    呼叫员编号、对方号码、通话时长
    ......
    汇总 [市内号码时长][长途号码时长]
    sql语句如下:
    select CallerNumber,TelNum,DateDiff(second,StartDateTime,EndDateTime)
    from T_CallRecords1
    union all
    select '汇总',
    convert(varchar(50),//将整数的通话时长转换为与TelNum类型一致的varchar类型
    sum((case
    when TelNum not like '0%' then DateDiff(second,StartDateTime,EndDateTime)
    else 0
    end
    ))
    ) as 市内号码时长,
    sum((case
    when TelNum like '0%' then DateDiff(second,StartDateTime,EndDateTime)
    else 0
    end
    )) as 长途号码时长
    from T_CallRecords1;

    二、SQL其他基础知识

    1、索引(index):

    (1)、建索引条件:只给经常在where里出现的字段创建索引.
    (2)、创建索引的方式:在表设计器中点击右键,选择"索引/键"--添加--在列中选择索引包含的列.
    (3)、使用索引的优缺点:

    • 优点:提高查询效率.
    • 缺点:索引占据空间,而且添加、更新、删除数据的时候也需要同步更新索引,因此会降低Insert、Update、Delete操作的速度.

    (4)注意一点不要认为创建了索引,就不会全表扫描了,在sql语句里含有like、函数、类型转换时仍然有可能全表扫描.


    2、表的连接(join):
    (1)、inner join(等值连接):只返回两个表中联接字段相等的行.
    (2)、left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录.
    (3)、right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录.
    (4)、注意的是:left join和right join可以嵌套在inner join之中,但是inner join不能嵌套于left join或right join之中.


    3、子查询:将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样《被当做结果集的查询语句称为子查询.
    (1)、单值子查询:只有返回且返回一行、一列数据的子查询才能当成单值子查询.
    sql语句如下:
    select 1 asf1,2,(select min(FYearPublishered) from T_Book),(select max(FYearPublishered) from T_Book) as f4;
    (2)、限制结果集(ROW_NUMBER()):返回第3行到第5行的数据.
    sql语句如下:
    select * from
    (
    select ROW_NUMBER() OVER(order by FSalary DESC) as rownum,
    FNumber,FName,FSalary,FAge from T_Employee
    ) as e1
    where e1.rownum>=3 and e1.rownum<=5;

  • 相关阅读:
    类方法代码重构寻找坏味道
    迭代二分查找二分查找
    系统牛逼[置顶] 使用RAMP理解内在动机 Understanding Intrinsic Motivation with RAMP
    对象服务器Webservices获取天气
    手机服务器Android消息推送(二)基于MQTT协议实现的推送功能
    概率小数2013年阿里巴巴暑期实习招聘笔试题目(不完整,笔试时间:2013.5.5)
    像素颜色JavaFX示例简易图片处理工具
    算法队列SPFA算法详解
    选择文件Eclipse制作jar包
    nullnull推箱子
  • 原文地址:https://www.cnblogs.com/zcz527/p/3089604.html
Copyright © 2020-2023  润新知