几道比较难的SQL题

上条记录和下一条记录

在展示博客文章时,在文章底部需要展示上一篇文章和下一篇文章,文章的排序当然是按照时间排序的。
选定下一条时可以用limit 1来实现,选取上一条时可以倒序limit 1实现

(SELECT * FROM article WHERE create_time<now_article_time ORDER BY create_time DESC LIMIT 1)
UNION
(SELECT * FROM article WHERE create_time>now_article_time ORDER BY create_time ASC LIMIT 1)

显示行号

Select a.*,(@rowNum:=@rowNum+1) as rowNo
From a,(Select (@rowNum :=3) ) b

通过变量rowNum来表示行号,在from子句中通过select语句给rowNum赋初值。这个过程涉及到SQL的执行顺序:即先执行from子句再执行select子句。

这种写法效率比较高,使用复合SQL语句的方式实现效率比较低(行号通过select语句来实现)。

MySQL打印学生成绩单

学生成绩单有语文、数学、英语三门成绩,如下所示:
语文 数学 英语
1 2 3
3 4 10
10 2 8
20 5 1
7 4 8
10 8 2
10 7 2
要求打印“rank(名次) sum(总分)”两列的成绩单(总分降序排列)。

SELECT 1 + (SELECT COUNT(1)  FROM
            stu AS y WHERE
            y.chinese + y.math + y.english > x.chinese + x.math + x.english) AS rank,
    (x.chinese + x.math + x.english) AS sum_score
FROM
    stu AS x ORDER BY sum_score DESC;

这里用到了if函数,也可以通过SQL条件语句来实现:
case 表达式 when 取值1 then 答案1 when 取值2 then 答案2 else 答案3 end
这样写复杂度较高,下面这种方法比较简单。

SELECT  rank, sum_score FROM
    (SELECT 
        IF(@last_sum = x.chinese + x.math + x.english, @rank, @rank:=@rank + 1) AS rank,
            (x.chinese + x.math + x.english) AS sum_score,
            (SELECT @last_sum:=x.chinese + x.math + x.english) AS yy
    FROM
        stu AS x, (SELECT @last_sum:=- 1, @rank:=0) AS nothing
    ORDER BY sum_score DESC) AS haha;

这里用到的技巧如下:
1、通过创建临时表、两重select来只选中某些列
2、在where子句中执行变量的初始化
3、在select子句中执行变量的更新
4、通过定义变量last_sum来记录上一条记录 的信息
5、通过比较上一条记录的总分跟当前记录的总分来决定是否让rank增加

SQL中的case语句

语法:

case [input_expression]
when when_expression then result_expression
[...n]
[else else_result_expression]
end

注:[]表示可选内容。
1、demo1:case后带表达式

select *,
       case sgroup
       when 1 then N'组1'
       when 2 then N'组2'
       when 3 then N'组3'
       else N'未知' end groupname
  from @stuinfo

2、demo2:case后不带表达式

select *,
       case
       when sgroup = 1 and gender = 'm' then N'第一组男生'
       when sgroup = 1 and gender = 'f' then N'第一组女生'
       when sgroup = 2 and gender = 'm' then N'第二组男生'
       when sgroup = 2 and gender = 'f' then N'第二组女生'
       when sgroup = 3 and gender = 'm' then N'第三组男生'
       when sgroup = 3 and gender = 'f' then N'第三组女生'
       else N'未知' end comment
  from @stuinfo

3、demo3:在order by子句中使用case语句

select * from @stuinfo
order by
    case when @orderby = 1 then id end desc,
    case when @orderby = 2 then id end

这里要用多个case,因为desc需要放在end 后面,否则会有语法错误。
由此可以构造一道题:对一群学生成绩单进行排序,如果是男生按照数学成绩降序排列,如果是女生按照语文成绩降序排列,最终得到全体学生的成绩和名次。
这个问题不使用case语句也能实现,但是使用case 语句更简洁、效率更高。

一言以蔽之,case语句可以用在任何表达式中,有表达式的地方就可以有case语句。order by后面其实跟的也是表达式而不是列名。

SQL语句实现数据库表的数据迁移

国家标准分为强制性标准和推荐性标准,这两种标准的字段完全一致,当时建表时一时糊涂,分成了两个表。现在想合并force_standard、recommend_standard两张表为standard表,并加上字段is_force来表示该标准是否强制性标准。
当然可以通过一段代码,for循环实现,但那样麻烦,用SQL只需要一句话。

insert into standard(列名,列名,列名...is_force) 
select 列名,列名,列名...,true from force_standard union
select 列名,列名,列名...,false from recommend_standard
展开阅读全文

数据结构初学者,有几道较难的题目求教!

02-04

以下几道数据结构题求JAVA实现,谢谢大牛们了rn第一题rn(1)读入一连串字母(前序遍历)并根据字母顺序组成一个二叉搜索树,并逆时针旋转90度将树状结构打印出来(只需要打印字母本身,不需要打印直线,并打印出中序遍历rn(2)然后输入第二串字符,如果二叉搜索树中含有输入字符的任何一个即删除之,最终得到一个新的二叉搜索树,然后一样将树状图和中序遍历打印一次。rn一个例子如下(第一次输入MBADEROU(树的前序遍历),不能有空格):rn[img=http://i1072.photobucket.com/albums/w365/ryantao2010/QQ20120204102945.jpg][/img]rnrn第二题rn(1)从tree.txt中读入一串数字并组成一个[color=#FF0000]平衡二叉搜索树[/color](AVL树),然后像第一题那样逆时针90度打印树状图rn(2)写出计算这棵树的叶子间的最大距离的方法。例子如下(txt文件里的内容是数字10,20到90):rn[img=http://i1072.photobucket.com/albums/w365/ryantao2010/QQ20120204103958.jpg][/img]rntxt文件里的内容是数字10,20到90,diameter就是两个叶子路径的最大值(包括叶子本身)rnrn第三题rn如果两棵树分支相同就称这两棵树同形(不需要数值相同),譬如下面第一和第三棵树同形但一二不是:rn[img=http://i1072.photobucket.com/albums/w365/ryantao2010/QQ20120204104702.jpg][/img]rn写一个程序要求用户输入两串前序遍历的字符串组成二叉树,并判断这两棵树是否同形。输出例子如下:rn[img=http://i1072.photobucket.com/albums/w365/ryantao2010/QQ20120204105350.jpg][/img]rnrn分数不多,谢谢大家了 论坛

几道sql语言的题...

03-22

现有一个公司的部门及雇员的数据库,由下面三个表组成:rn雇员(雇员号,姓名,年龄,薪水)rn部门(部门员,部门名,部门经理)rn工作(雇员号,部门号,工作年限)rn试用SQL语言先建一个数据库,数据库名为自己的姓名,然后完成下列操作:rn1. 在数据库中建表,在定义中要求声明rn1) 每个表的主码和外码rn2) 雇员姓名和部门名不能为空rn2. 往表中插入数据rn雇员(E01,Tom,35,8000rnE02,Dennis,24,5000rnE03,John,20,4000rnE04,Rick,41,7000rnE05,Bill,45,7500rnE06,Frank,35,6000rnE07,Jank,25,3000rnE08,Mike,23,3500)rn 部门(D01,人事,E04rn D02,信息,E01rn D03,销售,E05rn D04,财务,E06)rn 工作(E01,D02,6rn E01,D03,1rn E01,D04,2rn E02,D01,2rn E02,D04,0rn E03,D02,0rn E04,D01,4rn E04,D02,1rn E05,D03,2rn E06,D04,4rn E07,D04,1rn E08,D03,2)rn3. 用SQL语句完成下列操作:rn1) 列出Tom工作过的部门名及工作年限。rn2) 列出姓名以J开头的雇员的姓名及其工作过的部门名及工作年限。rn3) 将人事部门的所有人员的工作年限加一年rn4) 建立一个视图,视图名为人事变动表,包括的属性有:雇员号,姓名,部门名,工作年限rn5) 用上面产生的视图按工作年限的升序显示人事变动表rnrnrnrn(2)select 雇员.姓名,工作.部门号,工作.工作年限 where 工作.雇员号=雇员.雇员号and 雇员号 in (select 雇员号 from 雇员 where 姓名 like ‘j%’)rnrn这样为什么不对?rnrn第(3)题怎么做?rnrn谢谢 论坛

几道

04-15

1、SQL SERVER服务器的网库配置为TCP/IP socket,但使用1450作为端口。请问如何配置网库使访问成功:rnA、 At the server use the Network utility to use port 1450rnB、 At the server use the Client utility to use port 1450rnC、 At the Client configure the Client utility to use port 1450rn2、 NT的SQLGROUP的成员连接SQL不能成功,经检查其default Net-Library是Named Pipes.最可能的原因是:rnA、 用户计算机上没有配置有效的ODBC DSN For SQL Server.rnB、 用户计算机没有同SQL Server.计算机建立可信连接rnC、 SQL Server.数据库文件没有共享到网络上rnD、 Windows NT的Guest用户被禁用rn3、 你用QQL的身份安装了SQL2000,两个星期后,SQL Server.不能启动,最可能的原因是:rnA、 QQL没有管理员权限rnB、 QQL的密码过期rnC、 机器没有安装网卡rnD、 以上都不对rn4、 C盘安装windows2000时,SQL2000缺省实例的数据库文件用哪个文件夹?rnA、 C:\Program Files\80\DatarnB、 C:\MSSQL2000\DatarnC、 C:\SQLServer\DatarnD、 C:\Program Files\Microsoft SQL Server\MSSQL\Datarn5、 SQL Server 2000服务的大部分信息在哪个注册表中?rnA、 HKey_Local_Machine\Software\SQLServerrnB、 HKey_Local_Machine\Software\Microsoft\SQLServerrnC、 HKey_Current_Config\Software\Microsoft\SQLServerrnD、 HKey_Current_User\Software\Microsoft\SQLServerrn6、 TCP/IP与SQL Server的缺省端口上哪个?rnA、433rnB、520rnC、1020rnD、1433rn7、 服务器ZWB安装了QQL实例,客户端程序如何称呼这个实例?rnA、 ZWBrnB、 ZWB\QQLrnC、 ZWB\instance1rnD、 ZWB\instance0rn8、 安装SQL Server之后,要启动SQL Server时,出现Server cannot start故障消息。你安装了缺省实例,问题在哪?rnA、 将服务赋予Local 帐号rnB、 使用的帐号需要Login as Service权限rnC、 使用的帐号需要成为Domain Admins组成员rnD、 使用的帐号需要将口令设为Change on loginrn9、 安装SQL Server之后,重新启动服务器时,要启动SQL Server之后才能让别人连接。怎么解决这个问题?rnA、 将SQL Server Agent设置成在操作系统启动时自动启动rnB、 将SQL Server服务配置为在系统启动时自动启动rnC、 将对服务指定的用户帐号设置为本地登录rnD、 将对Agent指定的用户帐号设置为本地登录rn10、你在机器ZWB(操作系统为WIN98)上安装了SQL2000个人版,客户机QQL的操作系统为win2000 server,当你在QQL上连接WIN98上的SQL Server时,连接失败。经检查,QQL上的客户端网络配置为命名管道。请选择正确的描述:rnA、 WIN98上安装的数据库只能在本地使用rnB、 WIN98上的SQL Server不支持服务器端命名管道rnC、 WIN2000 SERVER不能访问WIN98上的数据库rnD、 在QQL上使用客户端网络配置增加TCP/IP网库即可访问rn11、一张表大约有10万记录,每条记录字节数为5K,请问该表格占用多少空间?rnA、 500M B、600M C、 700M D、800Mrn12、你想用ALTER DATABASE命令删除文件组,但失败了,为什么?rnA、 文件组中没有文件rnB、 文件组中还有文件rnC、 文件组中有系统文件rnD、 文件组中有另一个数据库中的文件rn13、 系统表存放在哪个数据库?rna) MASTERrnb) 当前数据库rnc) 所有数据库rnd) MODEL数据库rn14、 下列关于将表和索引放到文件组中的陈述,哪句是正确的?rna) 表和相应索引应放在同一文件组中rnb) 表和相应索引应放在不同文件组中rnc) 表和相应索引应放在不同文件组中,但要一起备份rnd) 表和相应索引应放在不同文件组中,但不能一起备份rn15、 SQL SERVER使用哪种类型的事务日志?rna) Read – writernb) Write – firstrnc) Write – aheadrnd) Write – lastrn16、 Joe 使用Windows95和UNIX 系统访问SQL SERVER7.0。 Joe同时拥有NT帐号和SQL帐号。而且帐号和密码均相同。如果他用信任连接访问SQL。请问他所具有的权限为:rna) NT和SQL的权限的组合rnb) NT权限rnc) SQL权限rnd) SQL权限(但不包含NT权限)rn17、 如果你的环境中有Windows95,NT Workstation和NetWare用户。如果他们都要访问SQL。请选择所有可能的答案:rna) Create NT logons for Windows NT clientsrnb) Create NT logons for Windows95 clientsrnc) Create NT logons for NetWare clientsrnd) Create SQL logons for NetWare clientsrn18、 你想使用新安装的SQL SERVER的安全管理最简单,你应该如何做?rna) 用NT认证并添加NT用户到SQL SERVER中rnb) 用NT认证并添加NT组到SQL SERVER中rnc) 用SQL认证并添加SQL用户到SQL SERVER中rnd) 用SQL认证并添加NT用户到SQL SERVER中rn19、 Laura是公司新员工,她要处理所有的定单。你希望Laura只能够通过定单应用程序修改定单数据库但不能够用其它应用软件修改。你如何控制?rna) 用存储过程实现rnb) 用有update权限的应用角色实现rnc) 用有UPDATE权限的SQL用户实现rnd) 用有UPDATE权限的视图实现rn20、你要对UNIX用户QQL生成新登录帐号,用什么命令?rnA、 sp_addlogin ‘QQL’,’password’,’pubs’rnB、 sp_grantlogin ‘QQL’,’password’,’pubs’rnC、 sp_createlogin ‘QQL’,’password’,’pubs’rnD、 sp_makelogin ‘QQL’,’password’,’pubs’rn21、MASTER数据库坏了,但你的用户数据库没有受到影响。当你重建MASTER数据库后,如何操作能最快的恢复你的数据库?rnA、 Restore the user database from an existing backup.rnB、Use sp_attach_db to attach the existing user database to the new master database.rnC、手工修改系统表添加用户数据库。rnD、SQL自动恢复数据库rn22、公司每周定期备份一次SQL SERVER2000中的MASTER数据库,根据业务情况,可能也需要对MASTER数据库进行备份。请问下面哪个操作将更新数据库,因此需要备份MASTER数据库rnA、修改数据库配置选项rnB、从数据库中删除文件组rnC、新建用户数据库rnD、修改用户数据库的用户安全设置rn23、关于BACKUP语句中的INIT和NOINIT参数,描述正确的是:rnA、INIT是做全库备份,备份数据库中所有数据rnB、NOINIT是做差异备份,备份从上次备份以来的数据变化rnC、INIT是覆盖备份设备中的备份rnD、NOINIT是向备份设备中追加备份集rn24、关于RESTORE语句中的RECOVERY和NORECOVERY参数,描述正确的是:rnA、RECOVERY是撤消半个事务rnB、NORECOVERY是保留半个事务rnC、RECOVERY在恢复最后一个备份集的时候使用rnD、NORECOVERY在恢复非最后一个备份集的时候使用rn25、关于TRUNCATE_ONLY和NO_LOG参数,描述正确的是:rnA、TRUNCATE_ONLY是备份事务日志,然后清除事务日志rnB、NO_LOG是不备份事务日志,而是清除日志, 同时不写日志rnC、NO_LOG是不备份事务日志,而是清除日志,同时还要写日志rnD、TRUNCATE_ONLY是不备份事务日志,而是清除日志, 同时还要写日志rn26、你是SYSADMINS成员。你创建了一个作业:先BACKUP数据库然后将备份文件拷贝到网络上另一台计算机上。当你分别执行这两步操作时均成功。但当你执行该作业时,发现第一步成功,第二步失败了。原因是:rnA、SQL SERVER AGENT服务没有启动rnB、SQL SERVER AGENT启动帐号不是管理员rnC、SQL SERVER AGENT启动帐号选择了local system accountrnD、MSSQLSERVER服务没有启动rn27、下面哪些是实现自动化任务时必不可少的构件:rnA、SQL SERVER服务rnB、SQL SERVER AGENT服务rnC、性能监控器rnD、事件查看器rn28、SQL SERVER使用哪个数据库来保存作业的定义:rnA、MSDB数据库rnB、MASTER数据库rnC、作业所运行的数据库rnD、使用操作系统文件来保存rn29、SQL SERVER AGENT服务帐号需要什么权限:rnA.logon as a service权限rnB.Sysadmin成员关系rnC.Backup Operators成员关系rnD.Server Operators成员关系rn30、报警从哪里检查错误?rnA.Windows应用程序日志rn B.SQL Server事件日志rn C.Master数据库错误日志rn D.SQL Server直接将错误发送到警报引擎rn 论坛

没有更多推荐了,返回首页