MSSQL笔试题

一道MSSQL笔试题 

有一组通话记录,数据量较大。信息表结构如下:
ID 主叫号码 被叫号码通话起始时间   通话结束时间           通话时长

其中ID为主键
求其中同一个号码的两次通话之间间隔大于某个时间的通话记录ID 。不妨设时间间隔为2分钟

一、

select distinct id
from tb t
where id in (select id from tb where [主叫号码]=t.[主叫号码] and (datediff(minute,t.[通话起始时间],[通话结束时间])>=2))
or id=(case when (select count(*) from tb where [主叫号码]=t.[主叫号码] and (datediff(minute,t.[通话起始时间],[通话结束时间])>=2))>0 then id else 0 end)

二、

select t.id as '首次主叫ID'
 ,b.id as '下次叫ID'
from tb t
inner join tb b
on t.[主叫号码]=b.[主叫号码]
and datediff(minute,t.[通话起始时间],b.[通话结束时间])>2
and t.id<>b.id


希望大家奉献更好的方法。共同学习,不胜感激。

 

A             B     C     D  
  2001     01     1     200  
  2001     02     2     300  
  2001     05     4     400  
  2002     01     1     10  
  2002     05     2     100  
   
  编写SQL语句使上表变成  
  A           01     02     05  
  2001   200     150   100              
  2002     10               50

 

 


 笔试题目
 
 
自己在SQL Server中建立一个数据库(或利用现有数据库),再建立下表。
SQL Server中表test:


CREATE  TABLE  test( 
               Code          smallint  NOT  NULL,                --学生编号 
               Name          varchar(10)  NOT  NULL,          --学生姓名 
               Lessons    varchar(1000)  NOT  NULL,      --课程名称,每个名称以“,”结束 
               Score1      varchar(1000)  NOT  NULL,      --期中成绩,每课程成绩以“,”结束 
               Score2      varchar(1000)  NOT  NULL,      --期末成绩,每课程成绩以“,”结束 
 
               PRIMARY  KEY  (Code) 

go
 

实例记录数据:


insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20301,'张三','语文,数学 
,外语,','100,99,98,','97,96,95,') 
go 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20302,'李四','语文,数学 
,外语,','90,89,88,','87,86,85,') 
go 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20303,'王五','语文,数学 
,外语,','70,69,68,','67,66,65,') 
go
 

屏幕显示实例:


编号   姓名    期中    期末    期中    期末     期中    期末
课程 20301   张三    100      97       99      96       98      95 
语文 20302   李四     90      87       89      86       88      85     
数学 20302   李四     90      87       89      86       88      85   
外语 20303   王五     70      67       69      66       68      65
 

题目的难点在于科目是动态的

陶清网站已经有人用sql实现了

他说没有用到游标只用了一个函数

函数已经给出

但后面的具体实现过程他没有提供

还请csdn上的高手们赐教

谢谢


drop  table  test 
go 
drop  table  #t 
go 
CREATE  TABLE  test( 
               Code          smallint  NOT  NULL,                --学生编号 
               Name          varchar(10)  NOT  NULL,          --学生姓名 
               Lessons    varchar(1000)  NOT  NULL,      --课程名称,每个名称以“,”结束 
               Score1      varchar(1000)  NOT  NULL,      --期中成绩,每课程成绩以“,”结束 
               Score2      varchar(1000)  NOT  NULL,      --期末成绩,每课程成绩以“,”结束 
 
               PRIMARY  KEY  (Code) 

go 
 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20301,'张三','语文,数学 
,外语,','100,99,98,','97,96,95,') 
go 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20302,'李四','语文,数学 
,外语,','90,89,88,','87,86,85,') 
go 
insert  into  test  (Code,Name,Lessons,Score1,Score2)  values(20303,'王五','语文,数学 
,外语,','70,69,68,','67,66,65,') 
go 
/*
 

屏幕显示实例:


编号   姓名    期中    期末    期中    期末     期中    期末
课程 20301   张三    100      97       99      96       98      95 
语文 20302   李四     90      87       89      86       88      85     
数学 20302   李四     90      87       89      86       88      85   
外语 20303   王五     70      67       69      66       68      65
 

*/


create  table  #t( 
               Code          smallint  NOT  NULL,                --学生编号 
               Name          varchar(10)  NOT  NULL,          --学生姓名 
               Lessons    varchar(100)  NOT  NULL,      --课程名称,每个名称以“,”结束 
               Score1      int, 
               Score2      int 

go 
Select  1 
while  @@rowcount  >  0 
begin 
           insert  #t   
           select  code,name 
           ,left(lessons,charindex(',',lessons)-1)   
           ,left(score1,charindex(',',score1)-1) 
           ,left(score2,charindex(',',score2)-1) 
           from  test 
           where  charindex(',',lessons)>0 
 
           update  test  set  lessons  =  right(lessons,len(lessons)-charindex(',',lessons)),   
           score1  =  right(score1,len(score1)-charindex(',',score1))  , 
           score2  =  right(score2,len(score2)-charindex(',',score2))   
           where  charindex(',',lessons)>0 
end 
 
 
declare  @sql  varchar(8000) 
set  @sql  =  'select  code,name' 
select  @sql  =  @sql  +  ',sum(case  lessons  when  '''+lessons+'''  then  cast
(score1
 as  int)  end)  ['+rtrim(lessons)+'中]' 
+  ',sum(case  lessons  when  '''+lessons+'''  then  cast
(score2  as  int)  end)  ['+rtrim(lessons)+'末]' 
 from  (select  distinct  lessons  as  lessons  from  #t)  as  a 
select  @sql  =  @sql+'  from  #t  group  by  code,name' 
exec(@sql) 
 
 
code    name  数学中    数学末    外语中    外语末    语文中   语文末             
20302    李四   89        86       88         85        90       87 
20303    王五   69        66       68         65        70       67 
20301    张三   99        96       98         95       100       97
 
 

 

联通笔试题,写给大家参考一下

     表中内容                   查询结果         
   a    9     10              a    9    45
   b    9     15              b    9    40
   c    9     20              c    9    35
   d    9     10              d    9    45
   a    9.5   30              a    9.5  45
   b    9.5   20              b    9.5  55
   c    9.5   10              c    9.5  65
   d    9.5   15              d    9.5  60
   a    9.8   15              a    9.8  75
   b    9.8   20              b    9.8  70
   c    9.8   30              c    9.8  60
   d    9.8   25              d    9.8  65

 


数据库笔试题<SQL-Server>2007年03月15日 星期四 10:48<1>在SQL Server数据库中,在Products表中查询最贵的产品名称和价格,正确的SQL语句为:

SELECT Productname,Price FROM Products WHERE Price =(SELECT MAX(Price) FROM Products)

<2>删除在Orders 定单表中所有超过3年的老定单,正确的SQL语句为:

DELETE FROM Orders WHERE OrdersDate < DATEADD(YYYY,-3,GETDATE())

<3>什么是触发器?SQL Server 2000有什么不同类型的触发器?

KEY:触发器是一种专用类型的存储过程,它被捆绑到SQL Server 2000的表格或者视图上。在SQLServer

2000里,有INSTEAD-OF和AFTER两造触发器。INSTEAD-OF触发器是替代数据操控语言(Data Manipulation

Language,DML)语句对表格执行语句的存储过程。例如:如果我有一个用于Table1的INSTEAD-OF-UPDATE触发

器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新

语句则不会执行操作。AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生

在数据库表格里的数据变化十分好用。

<4>怎样获得所有数据库清单?


select name from master..sysdatabases

 

<5>这样获得当前数据库中数据表的清单?


select name from sysobjects where xtype='u' and name!='dtproperties'

<6>查找表中从10行到15行的记录,id 可能不连续 ?

select top 5 * from (select top 15 * from [表] order by id asc) [表] order by [列] desc

<7>随机从表中抽取10条记录?

select top 10 * from [table name] order by newid()

<8>计算出生年月?

DECLARE @BEGINDATE DATETIME
DECLARE @ENDDATE DATETIME
DECLARE @y INT
DECLARE @m INT
DECLARE @d INT
SET @BEGINDATE ='2004-05-15'
SET @ENDDATE = '2007-07-18'

SET @y = DATEDIFF(MM,@BEGINDATE,@ENDDATE)/12 
SET @m = DATEDIFF(MM,@BEGINDATE,@ENDDATE)%12 
SET @d = DATEDIFF(DD,DATEADD(yy,@y,DATEADD(mm,@m,@BEGINDATE)),@ENDDATE)

IF @d < 0 and @m = 0
SELECT @y - 1 AS '年',(12 -1) + @m AS '月',30 + @d AS '日'
ELSE IF @d <0
SELECT @y AS '年',@m - 1 AS '月',30 + @d AS '日'
ELSE
SELECT @y AS '年',@m AS '月',@d AS '日'


<9>区域插入或更新数据

/*假如在31-39条填入20*/
update [table] set KK = '20' where KK in (select top 9 * from (select top 39 * from [table] order by KK asc) [table] order by [KK] desc)
/*[table] 指的是你要查询的表,这里关键在于in的用法和括号里的语句编写*/ 
 

### Mysql 笔试题及相关知识点 以下是针对 MySQL 的一些典型笔试题及其解答,涵盖了基础概念、语法应用以及高级特性等内容。 #### 1. **MySQL 是什么?** MySQL 是一种开源的关系型数据库管理系统 (RDBMS),广泛应用于 Web 应用程序开发中。它使用标准的 SQL 查询语言来管理和操作数据[^1]。 #### 2. **MySQL 支持的数据类型有哪些?** MySQL 提供了丰富的数据类型,主要包括数值类型(如 `INT`、`FLOAT` 和 `DECIMAL`)、日期和时间类型(如 `DATE`、`TIME` 和 `DATETIME`)、字符串类型(如 `VARCHAR` 和 `TEXT`)以及其他特殊类型(如 `ENUM` 和 `SET`)[^1]。 #### 3. **主键的作用是什么?** 主键是一种特殊的约束条件,用于唯一标识表中的每一行记录。主键值不允许重复且不能为空,从而确保数据的一致性和完整性[^1]。 #### 4. **外键的概念及用途?** 外键是指在一个表中定义的一个字段,其值必须匹配另一个表中的主键值。外键主要用于实现两个表之间的关联关系,维护参照完整性。 #### 5. **如何过滤 SELECT 结果集?** 在 MySQL 中,可以使用 `WHERE` 子句对查询结果进行筛选。例如: ```sql SELECT * FROM users WHERE age > 18; ``` 此语句会返回年龄大于 18 岁的所有用户记录。 #### 6. **创建数据库的方法?** 可以通过以下命令创建一个新的数据库实例: ```sql CREATE DATABASE database_name; ``` 其中 `database_name` 表示新数据库的名字。 #### 7. **MySQL 的体系架构概述?** MySQL 架构由三大部分组成:客户端/服务器通信层、核心服务功能模块集合(包括查询解析器、优化器等组件),以及底层存储引擎接口层。这种设计使得不同类型的存储需求能够灵活适配不同的场景[^1]。 #### 8. **SQL 定义及其意义?** SQL 即 Structured Query Language(结构化查询语言),它是访问和处理关系型数据库的标准编程工具之一。利用它可以完成诸如检索、插入、修改甚至删除数据库内的信息等多种任务。 #### 9. **ACID 特性的含义及其重要性?** ACID 是指事务具备四个基本属性——原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation) 及持久性(Durability)。这四者共同保障了交易过程的安全可靠,在面对并发环境或者系统崩溃等情况时尤为重要[^1][^4]。 #### 10. **为什么要在 MySQL 中引入索引机制?** 索引类似于书籍章节前面附带的内容提纲页码指示图谱,极大地提升了查找特定条目的速度。合理运用索引不仅可以加快读取效率还能减少不必要的磁盘I/O消耗;另外某些情况下也可以用来强制实施实体间联系规则防止冲突发生等等[^1]. --- ### 示例代码片段展示 下面是一些实际应用场景下的 sql 编程例子: #### 条件复杂查询案例 假设我们需要找出所有来自北京大学的学生或者绩点高于3.7的同学,则可以用如下方式表达该逻辑: ```sql SELECT device_id, gender, age, university, gpa FROM user_profile WHERE university = '北京大学' OR gpa > 3.7; ``` #### 处理嵌套子查询的情况 当涉及到多张表格联合分析的时候经常会遇到需要用到子查询的情形。比如我们要获取那些没有任何课程成绩记录老师的姓名与所属部门名称列表的话就可以这样写: ```sql SELECT Tname, Depart FROM Teacher WHERE Tname NOT IN ( SELECT DISTINCT Tname FROM Teacher AS t JOIN Course c ON t.Tno=c.Tno JOIN Score s ON c.Cno=s.Cno); ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值