一、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;