sql 语言实现查找成绩排名10到20的学生 sql语句实现:
查询成绩表中10名至20名的学生
方法
select top 11 * from score where sno not in (select top 9 sno from score order by sc desc)order by sc desc
补充说明:score, sc, sno 分别为成绩表,成绩和学号。
这道冥思苦想了N久的题目原来只用一个top就搞定了,真是狂汗,看来还要看书。
用一句SQL取出第 m 条到第 n 条记录的方法
从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本)
SELECT TOP n-m+1 * FROM Table
WHERE (id NOT IN (SELECT TOP m-1 id FROM Table ))
--从TABLE表中取出第m到n条记录 (Exists版本)
SELECT TOP n-m+1 * FROM TABLE AS a WHERE Not Exists
(Select * From (Select Top m-1 * From TABLE order by id) b Where b.id=a.id )
Order by id
--m为上标,n为下标,例如取出第8到12条记录,m=8,n=12,Table为表名
Select Top n-m+1 * From Table Where Id>(Select Max(Id) From
(Select Top m-1 Id From Table Order By Id Asc) Temp) Order By Id Asc
直接取得数据库中的分页记录 前提是表中必须有主键
取得第M条记录之后的N条记录: SELECT TOP N * FROM [TABLE]
WHERE (ID NOT IN (SELECT TOP M id FROM [TABLE]
ORDER BY [ORDER])) ORDER BY [ORDER]
Oracle中的实现,取得第M到N条记录: SELECT * FROM (
SELECT * , ROWNUM AS CON FROM (
SELECT * FROM [TABLE] ORDER BY [ORDER] )
WHERE ROWNUM <= N )
WHERE CON >= M;
查询表中连续的某几条记录
不要传任何列的条件参数,查询表中连续的某几条记录 如:表A,id列为主键 id name sex age
------------------------- 1 luoyi male 21 2 yaya female 20 3 lili female 22 4 wuyong male 25 .......................
这个表的记录还有很多,如果我想取第二、第三条记录,不为别的,我就想要这两条,这不仅在编程中会用到,而且在一些公司面试时也有类似考题(呵呵,我没有遇到过),在oracle和mssqlserver中SQL代码分别为:
二、ms sql server
在server中没有minus,只能用类似于oracle的第二种方法
select * from (select top 3 * from A) as b where b.id not in(select top 1 id from A)
三、绘制出来的结果为: id name sex age
-------------------------------- 2 yaya female 20 3 lili female 22
特点:一次查询,数据库只返回一页的数据。而不是取出所有的数据。 说明:
pagesize: 每页显示记录数 cureentpage:当前页数
select * from ( select TOP pagesize * FROM ( SELECT TOP
pagesize*cureentpage * from user_table ORDER BY id ASC ) as aSysTable ORDER BY id DESC ) as bSysTable ORDER BY id ASC
例子说明:
假如数据库表如下:
user_table:
id:主键,自增 username:字符 password:字符
假设有80条记录,每页显示10条记录,id 从1到80
现在按照id升序排列取出第三页的数据应该为:所取得记录的id 应该为 21到30。
这时该语句应该为:
select * from ( select TOP 10 * FROM ( SELECT TOP 30 * from user_table ORDER BY id ASC ) as aSysTable ORDER BY id DESC ) as bSysTable ORDER BY id ASC
原理如下:
先按照id从小到大升序取出30条记录(3*10),也就是:id 在 1-30 之间的记录 (SELECT TOP 30 * from user_table ORDER BY id ASC)
然后按照ID降序排列这30条记录,得到记录为id 在:从30到 1
然后在这些30条记录中取出前10条记录:取得的记录为:id 在30-21之间。这就是我们需要的数据,但这时是按照降序排列的,不符合要求。
最后在重新排序得到最终我们需要的数据。id在21-30之间。 随机取出若干条记录的SQL语句 随机取出若干条记录的SQL语句
Sql server:
select top 20 * from 表 order by newid()
高效SQL——合并多个字段值或多条记录
高效SQL——从无主键表中合并字段值 create table #T1 (
A varchar(10), B varchar(20) )
insert into #T1 values ('aa','1')
insert into #T1 values ('aa','9a') insert into #T1 values ('bb','1') insert into #T1 values ('bb','10') insert into #T1 values ('bb','16') insert into #T1 values ('aa','16') insert into #T1 values ('aa','17') insert into #T1 values ('aa','30') insert into #T1 values ('bb','6df') insert into #T1 values ('aa','5') insert into #T1 values ('aa','8') insert into #T1 values ('aa','ed')
所要的结果:
aa 1,9a,16,17,30,5,8,ed bb 1,10,16,6df
解决方法: 程序代码
declare @c varchar(1024) set @c=''
declare @x char(10),@y char(10)
set @x='' set @y=''
select @y=@x,@x=x.a,@c=@c + (case @x when @y then ',' else ';' + x.a + ':' end)
+x.d from (select b as d,a from #t1) as x order by x.a
set @c=substring(@c,2,len(@c)-1) select @c
为什么说是高效呢?
因为摒弃了游标和函数的途径,而采用变量的方式来保存值 也就是说避免了游标和函数自身的缺点 如果是简单地把字段值合并的sql语句: 程序代码
select c1||c2||c3 as name from table
中间可以添加字符常量和数字,如
select c1||'test'||c2||c3 as name from table
select c1||2||c2||c3 as name from table
如何用一条SQL语句,将多条记录(一个字段)合并为一个? 例如:
table字段为:tableID(nchar)
查询结果为不确定的多条:
tableID T1 T2 T3 T4 …… 如题:
A、B两个表拥有一样的表结构,都以id为主键,如何将A表中存在而B表中不存在的记录插入到B表中。
表结构如下:
create table A(
id int primary key, name varchar(20), password varchar(20)
A表记录:
ID NAME PASSWORD ------------------ 1 2 3 4 5
B表记录:
ID NAME PASSWORD ------------------ Tom 1234 Mary 1234 Lucy 1234 Billy 1234 Henry 1234
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库SQL数据库试题(笔试题)(6)在线全文阅读。
相关推荐: