分享

SQL 面试题

 暖风醉伊人 2016-09-08
  1. SQL SERVER面试题  
  2.   
  3. 1.用一条SQL语句 查询出每门课都大于80分的学生姓名  
  4.   
  5. name   kecheng   fenshu  
  6. 张三     语文       81  
  7. 张三     数学       75  
  8. 李四     语文       76  
  9. 李四     数学       90  
  10. 王五     语文       81  
  11. 王五     数学       100  
  12. 王五     英语       90  
  13.   
  14. A: select distinct name from table where name not in (select distinct name from table where fenshu<=80)  
  15.   
  16. 2.学生表 如下:  
  17. 自动编号   学号   姓名 课程编号 课程名称 分数  
  18. 1        2005001 张三 0001      数学    69  
  19. 2        2005002 李四 0001      数学    89  
  20. 3        2005001 张三 0001      数学    69  
  21. 删除除了自动编号不同,其他都相同的学生冗余信息  
  22.   
  23. A: delete tablename where 自动编号 not in(select min(自动编号) from tablename group by 学号,姓名,课程编号,课程名称,分数)  
  24.   
  25. 一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.  
  26. 你先按你自己的想法做一下,看结果有我的这个简单吗?  
  27.   
  28. 答:select a.name, b.name  
  29. from team a, team b  
  30. where a.name < b.name  
  31. 如果不加where条件,则是表自己对自己进行全外连接查询,结果为表中的每条数据进行比对:
    aa,ab,ac,ad,ba,bb,bc,bd,ca,cb,cc,cd,da,db,dc,dd
    但这里会有很多重复数据,而且两个球不能相同,为了去掉这些内容(例如:ab和ba是一样的只需要留一个)
    加入了一个a.name < b.name的条件,这样就只会保留第一个值比第二个值小的数据了
    aa,ab,ac,ad中保留ab,ac,ad
    ba,bb,bc,bd中保留bc,bd
    这样结果就是要的了

  32.   
  33.    
  34.   
  35. 请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。  
  36. AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。  
  37. 数据库名:JcyAudit,数据集:Select * from TestDB  
  38.   
  39. 答:select a.*  
  40. from TestDB a  
  41. ,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b  
  42. where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur  
  43.   
  44. ************************************************************************************  
  45.   
  46. 面试题:怎么把这样一个表儿  
  47. year month amount  
  48. 1991   1     1.1  
  49. 1991   2     1.2  
  50. 1991   3     1.3  
  51. 1991   4     1.4  
  52. 1992   1     2.1  
  53. 1992   2     2.2  
  54. 1992   3     2.3  
  55. 1992   4     2.4  
  56. 查成这样一个结果  
  57. year m1 m2 m3 m4  
  58. 1991 1.1 1.2 1.3 1.4  
  59. 1992 2.1 2.2 2.3 2.4  
  60.   
  61. 答案一、  
  62. select year,  
  63. (select amount from aaa m where month=1 and m.year=aaa.yearas m1,  
  64. (select amount from aaa m where month=2 and m.year=aaa.yearas m2,  
  65. (select amount from aaa m where month=3 and m.year=aaa.yearas m3,  
  66. (select amount from aaa m where month=4 and m.year=aaa.yearas m4  
  67. from aaa group by year  
  68.   
  69.    
  70.   
  71. 这个是ORACLE 中做的:  
  72. select * from (select nameyear b1, lead(year) over  
  73. (partition by name order by year) b2, lead(m,2) over(partition by name order by year) b3,rank()over(  
  74. partition by name order by year) rk from t) where rk=1;  
  75.   
  76. ************************************************************************************  
  77.   
  78. 精妙的SQL语句!  
  79. 精妙SQL语句  
  80. 作者:不详 发文时间:2003.05.29 10:55:05  
  81.   
  82. 说明:复制表(只复制结构,源表名:a 新表名:b)  
  83.   
  84. SQL: select * into b from a where 1<>1  
  85.   
  86. 说明:拷贝表(拷贝数据,源表名:a 目标表名:b)  
  87.   
  88. SQL: insert into b(a, b, c) select d,e,f from b;  
  89.   
  90. 说明:显示文章、提交人和最后回复时间  
  91.   
  92. SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b  
  93.   
  94. 说明:外连接查询(表名1:a 表名2:b)  
  95.   
  96. SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  
  97.   
  98. 说明:日程安排提前五分钟提醒  
  99.   
  100. SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5  
  101.   
  102. 说明:两张关联表,删除主表中已经在副表中没有的信息  
  103.   
  104. SQL:  
  105.   
  106. delete from info where not exists ( select * from infobz where info.infid=infobz.infid )  
  107.   
  108. 说明:--  
  109.   
  110. SQL:  
  111.   
  112. SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE  
  113.   
  114. FROM TABLE1,  
  115.   
  116. (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE  
  117.   
  118. FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND  
  119.   
  120. FROM TABLE2  
  121.   
  122. WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,  
  123.   
  124. (SELECT NUM, UPD_DATE, STOCK_ONHAND  
  125.   
  126. FROM TABLE2  
  127.   
  128. WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =  
  129.   
  130. TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,  
  131.   
  132. WHERE X.NUM = Y.NUM (+)  
  133.   
  134. AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B  
  135.   
  136. WHERE A.NUM = B.NUM  
  137.   
  138. 说明:--  
  139.   
  140. SQL:  
  141.   
  142. select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩  
  143.   
  144. 说明:  
  145.   
  146. 从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)  
  147.   
  148. SQL:  
  149.   
  150. SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy'AS telyear,  
  151.   
  152. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,  
  153.   
  154. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,  
  155.   
  156. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,  
  157.   
  158. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,  
  159.   
  160. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,  
  161.   
  162. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,  
  163.   
  164. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,  
  165.   
  166. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,  
  167.   
  168. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,  
  169.   
  170. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,  
  171.   
  172. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,  
  173.   
  174. SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC  
  175.   
  176. FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration  
  177.   
  178. FROM TELFEESTAND a, TELFEE b  
  179.   
  180. WHERE a.tel = b.telfax) a  
  181.   
  182. GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')  
  183.   
  184. 说明:四表联查问题:  
  185.   
  186. SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....  
  187.   
  188. 说明:得到表中最小的未使用的ID号  
  189.   
  190. SQL:  
  191.   
  192. SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 ENDas HandleID  
  193.   
  194. FROM Handle  
  195.   
  196. WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)  
  197.   
  198.    
  199.   
  200. *******************************************************************************  
  201.   
  202. 有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value换为A中对应的value  
  203. 这道题的SQL语句怎么写?  
  204.   
  205. update   b   set   b.value=(select   a.value   from   a   where   a.key=b.key)   where   b.id   in(select   b.id   from   b,a   where   b.key=a.key);  
  206.   
  207. ***************************************************************************  
  208.   
  209. 高级sql面试题  
  210.   
  211. 原表:  
  212. courseid coursename score  
  213. -------------------------------------  
  214. 1 java 70  
  215. 2 oracle 90  
  216. 3 xml 40  
  217. 4 jsp 30  
  218. 5 servlet 80  
  219. -------------------------------------  
  220. 为了便于阅读,查询此表后的结果显式如下(及格分数为60):  
  221. courseid coursename score mark  
  222. ---------------------------------------------------  
  223. 1 java 70 pass  
  224. 2 oracle 90 pass  
  225. 3 xml 40 fail  
  226. 4 jsp 30 fail  
  227. 5 servlet 80 pass  
  228. ---------------------------------------------------  
  229. 写出此查询语句  
  230.   
  231. 没有装ORACLE,没试过  
  232. select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass'as mark from course  
  233.   
  234. 完全正确  
  235.   
  236. SQL> desc course_v  
  237. Name Null? Type  
  238. ----------------------------------------- -------- ----------------------------  
  239. COURSEID NUMBER  
  240. COURSENAME VARCHAR2(10)  
  241. SCORE NUMBER  
  242.   
  243. SQL> select * from course_v;  
  244.   
  245. COURSEID COURSENAME SCORE  
  246. ---------- ---------- ----------  
  247. 1 java 70  
  248. 2 oracle 90  
  249. 3 xml 40  
  250. 4 jsp 30  
  251. 5 servlet 80  
  252.   
  253. SQL> select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass'as mark from course_v;  
  254.   
  255. COURSEID COURSENAME SCORE MARK  
  256. ---------- ---------- ---------- ----  
  257. 1 java 70 pass  
  258. 2 oracle 90 pass  
  259. 3 xml 40 fail  
  260. 4 jsp 30 fail  
  261. 5 servlet 80 pass  
  262.   
  263. *******************************************************************************  
  264.   
  265. 原表:  
  266.   
  267. id proid proname  
  268. 1 1 M  
  269. 1 2 F  
  270. 2 1 N  
  271. 2 2 G  
  272. 3 1 B  
  273. 3 2 A  
  274. 查询后的表:  
  275.   
  276. id pro1 pro2  
  277. 1 M F  
  278. 2 N G  
  279. 3 B A  
  280. 写出查询语句  
  281.   
  282. 解决方案  
  283.   
  284. sql求解  
  285. 表a  
  286. 列 a1 a2  
  287. 记录 1 a  
  288. 1 b  
  289. 2 x  
  290. 2 y  
  291. 2 z  
  292. select能选成以下结果吗?  
  293. 1 ab  
  294. 2 xyz  
  295. 使用pl/sql代码实现,但要求你组合后的长度不能超出oracle varchar2长度的限制。  
  296. 下面是一个例子  
  297. create or replace type strings_table is table of varchar2(20);  
  298. /  
  299. create or replace function merge (pv in strings_table) return varchar2  
  300. is  
  301. ls varchar2(4000);  
  302. begin  
  303. for i in 1..pv.count loop  
  304. ls := ls || pv(i);  
  305. end loop;  
  306. return ls;  
  307. end;  
  308. /  
  309. create table t (id number,name varchar2(10));  
  310. insert into t values(1,'Joan');  
  311. insert into t values(1,'Jack');  
  312. insert into t values(1,'Tom');  
  313. insert into t values(2,'Rose');  
  314. insert into t values(2,'Jenny');  
  315.   
  316. column names format a80;  
  317. select t0.id,merge(cast(multiset(select name from t where t.id = t0.id) as strings_table)) names  
  318. from (select distinct id from t) t0;  
  319.   
  320. drop type strings_table;  
  321. drop function merge;  
  322. drop table t;  
  323.   
  324.    
  325.   
  326.   
  327. 用sql:  
  328.   
  329. Well if you have a thoretical maximum, which I would assume you would given the legibility of listing hundreds of employees in the way you describe then yes. But the SQL needs to use the LAG function for each employee, hence a hundred emps a hundred LAGs, so kind of bulky.  
  330.   
  331. This example uses a max of 6, and would need more cut n pasting to do more than that.  
  332.   
  333. SQL> select deptno, dname, emps  
  334. from (  
  335. select d.deptno, d.dname, rtrim(e.ename ||', '||  
  336. 4 lead(e.ename,1) over (partition by d.deptno  
  337. order by e.ename) ||', '||  
  338. 6 lead(e.ename,2) over (partition by d.deptno  
  339. order by e.ename) ||', '||  
  340. 8 lead(e.ename,3) over (partition by d.deptno  
  341. order by e.ename) ||', '||  
  342. 10 lead(e.ename,4) over (partition by d.deptno  
  343. 11 order by e.ename) ||', '||  
  344. 12 lead(e.ename,5) over (partition by d.deptno  
  345. 13 order by e.ename),', ') emps,  
  346. 14 row_number () over (partition by d.deptno  
  347. 15 order by e.ename) x  
  348. 16 from emp e, dept d  
  349. 17 where d.deptno = e.deptno  
  350. 18 )  
  351. 19 where x = 1  
  352. 20 /  
  353.   
  354. DEPTNO DNAME EMPS  
  355. ------- ----------- ------------------------------------------  
  356. 10 ACCOUNTING CLARK, KING, MILLER  
  357. 20 RESEARCH ADAMS, FORD, JONES, ROONEY, SCOTT, SMITH  
  358. 30 SALES ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD  
  359.   
  360. also  
  361. create function get_a2;  
  362. create or replace function get_a2( tmp_a1 number)  
  363. return varchar2  
  364. is  
  365. Col_a2 varchar2(4000);  
  366. begin  
  367. Col_a2:='';  
  368. for cur in (select a2 from unite_a where a1=tmp_a1)  
  369. loop  
  370. Col_a2=Col_a2||cur.a2;  
  371. end loop;  
  372. return Col_a2;  
  373. end get_a2;  
  374.   
  375. select distinct a1 ,get_a2(a1) from unite_a  
  376. 1 ABC  
  377. 2 EFG  
  378. 3 KMN  
  379.   
  380. *******************************************************************************  
  381.   
  382. 一个SQL 面试题  
  383.   
  384. 去年应聘一个职位未果,其间被考了一个看似简单的题,但我没有找到好的大案.  
  385. 不知各位大虾有无好的解法?  
  386.   
  387.   
  388. 题为:  
  389. 有两个表, t1, t2,  
  390. Table t1:  
  391.   
  392. SELLER | NON_SELLER  
  393. ----- -----  
  394.   
  395. A B  
  396. A C  
  397. A D  
  398. B A  
  399. B C  
  400. B D  
  401. C A  
  402. C B  
  403. C D  
  404. D A  
  405. D B  
  406. D C  
  407.   
  408.   
  409. Table t2:  
  410.   
  411. SELLER | COUPON | BAL  
  412. ----- --------- ---------  
  413. A 9 100  
  414. B 9 200  
  415. C 9 300  
  416. D 9 400  
  417. A 9.5 100  
  418. B 9.5 20  
  419. A 10 80  
  420.   
  421.    
  422.   
  423. 要求用SELECT 语句列出如下结果:------如A的SUM(BAL)为B,C,D的和,B的SUM(BAL)为A,C,D的和.......  
  424. 且用的方法不要增加数据库负担,如用临时表等.  
  425.   
  426. NON-SELLER| COUPON | SUM(BAL) ------- --------  
  427. A 9 900  
  428. B 9 800  
  429. C 9 700  
  430. D 9 600  
  431. A 9.5 20  
  432. B 9.5 100  
  433. C 9.5 120  
  434. D 9.5 120  
  435. A 10 0  
  436. B 10 80  
  437. C 10 80  
  438. D 10 80  
  439.   
  440. 关于论坛上那个SQL微软面试题  
  441.   
  442. 问题:  
  443.   
  444. 一百个账户各有100$,某个账户某天如有支出则添加一条新记录,记录其余额。一百天后,请输出每天所有账户的余额信息  
  445.   
  446.   
  447. 这个问题的难点在于每个用户在某天可能有多条纪录,也可能一条纪录也没有(不包括第一天)  
  448.   
  449. 返回的记录集是一个100天*100个用户的纪录集  
  450.   
  451. 下面是我的思路:  
  452.   
  453. 1.创建表并插入测试数据:我们要求username从1-100  
  454. CREATE TABLE [dbo].[TABLE2] (  
  455. [username] [varchar] (50) NOT NULL , --用户名  
  456. [outdate] [datetime] NOT NULL , --日期  
  457. [cash] [floatNOT NULL --余额  
  458. ON [PRIMARY  
  459.   
  460. declare @i int  
  461. set @i=1  
  462. while @i<=100  
  463. begin  
  464.     insert table2 values(convert(varchar(50),@i),'2001-10-1',100)  
  465.     insert table2 values(convert(varchar(50),@i),'2001-11-1',50)  
  466.     set @i=@i+1  
  467. end  
  468. insert table2 values(convert(varchar(50),@i),'2001-10-1',90)  
  469.   
  470. select * from table2 order by outdate,convert(int,username)  
  471.   
  472. 2.组合查询语句:  
  473. a.我们必须返回一个从第一天开始到100天的纪录集:  
  474. 如:2001-10-1(这个日期是任意的)到 2002-1-8  
  475. 由于第一天是任意一天,所以我们需要下面的SQL语句:  
  476. select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate  
  477. from table2  
  478. group by username  
  479. order by convert(int,username)  
  480. 这里的奥妙在于:  
  481. convert(int,username)-1(记得我们指定用户名从1-100 :-))  
  482. group by username,min(outdate):第一天就可能每个用户有多个纪录。  
  483. 返回的结果:  
  484. outdate                                                 
  485. ------------------------------------------------------  
  486. 2001-10-01 00:00:00.000  
  487. .........  
  488. 2002-01-08 00:00:00.000  
  489.   
  490. b.返回一个所有用户名的纪录集:  
  491. select distinct username from table2  
  492. 返回结果:  
  493. username                                           
  494. --------------------------------------------------  
  495. 1  
  496. 10  
  497. 100  
  498. ......  
  499. 99  
  500.   
  501. c.返回一个100天记录集和100个用户记录集的笛卡尔集合:  
  502. select * from  
  503. (  
  504. select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate  
  505. from table2  
  506. group by username  
  507. order by convert(int,username)  
  508.   
  509. as A  
  510. CROSS join  
  511. (  
  512. select distinct username from table2  
  513. as B  
  514. order by outdate,convert(int,username)  
  515. 返回结果100*100条纪录:  
  516. outdate                            username  
  517. 2001-10-01 00:00:00.000            1  
  518. ......  
  519. 2002-01-08 00:00:00.000            100  
  520.   
  521. d.返回当前所有用户在数据库的有的纪录:  
  522. select outdate,username,min(cash) as cash from table2  
  523. group by outdate,username  
  524.   
  525. order by outdate,convert(int,username)  
  526. 返回纪录:  
  527. outdate                            username    cash  
  528. 2001-10-01 00:00:00.000            1          90  
  529. ......  
  530. 2002-01-08 00:00:00.000            100        50  
  531.   
  532. e.将c中返回的笛卡尔集和d中返回的纪录做left join:  
  533. select C.outdate,C.username,  
  534. D.cash  
  535. from  
  536. (  
  537. select * from  
  538. (  
  539. select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate  
  540. from table2  
  541. group by username  
  542. order by convert(int,username)  
  543. as A  
  544. CROSS join  
  545. (  
  546. select distinct username from table2  
  547. as B  
  548. as C  
  549. left join  
  550. (  
  551. select outdate,username,min(cash) as cash from table2  
  552. group by outdate,username  
  553. as D  
  554. on(C.username=D.username and datediff(d,C.outdate,D.outdate)=0)  
  555.   
  556. order by C.outdate,convert(int,C.username)  
  557. 注意:用户在当天如果没有纪录,cash字段返回NULL,否则cash返回每个用户当天的余额  
  558. outdate                            username    cash  
  559. 2001-10-01 00:00:00.000            1          90  
  560. 2001-10-01 00:00:00.000            2          100  
  561. ......  
  562. 2001-10-02 00:00:00.000            1          90  
  563.   
  564. 2001-10-02 00:00:00.000            2          NULL <--注意这里  
  565. ......  
  566.   
  567. 2002-01-08 00:00:00.000            100        50  
  568.   
  569. f.好了,现在我们最后要做的就是,如果cash为NULL,我们要返回小于当前纪录日期的第一个用户余额(由于我们使用order by cash,所以返回top 1纪录即可,使用min应该也可以),这个余额即为当前的余额:  
  570. case isnull(D.cash,0)  
  571. when 0 then  
  572. (  
  573. select top 1 cash from table2 where table2.username=C.username  
  574. and datediff(d,C.outdate,table2.outdate)<0  
  575. order by table2.cash  
  576. )  
  577. else D.cash  
  578. end as cash  
  579.   
  580. g.最后组合的完整语句就是  
  581. select C.outdate,C.username,  
  582. case isnull(D.cash,0)  
  583. when 0 then  
  584. (  
  585. select top 1 cash from table2 where table2.username=C.username  
  586. and datediff(d,C.outdate,table2.outdate)<0  
  587. order by table2.cash  
  588. )  
  589. else D.cash  
  590. end as cash  
  591. from  
  592. (  
  593. select * from  
  594. (  
  595. select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate  
  596. from table2  
  597. group by username  
  598. order by convert(int,username)  
  599. as A  
  600. CROSS join  
  601. (  
  602. select distinct username from table2  
  603. as B  
  604. as C  
  605. left join  
  606. (  
  607. select outdate,username,min(cash) as cash from table2  
  608. group by outdate,username  
  609. as D  
  610. on(C.username=D.username and datediff(d,C.outdate,D.outdate)=0)  
  611.   
  612. order by C.outdate,convert(int,C.username)  
  613.   
  614. 返回结果:  
  615. outdate                                 username        cash  
  616. 2001-10-01 00:00:00.000    1                    90  
  617. 2001-10-01 00:00:00.000    2                   100  
  618. ......  
  619. 2002-01-08 00:00:00.000    100                50  
  620.   
  621. ***********************************************************************************  
  622.   
  623. 取出sql表中第31到40的记录(以自动增长ID为主键)  
  624.   
  625. *从数据表中取出第n条到第m条的记录*/  
  626.   
  627. declare @m int  
  628. declare @n int  
  629. declare @sql varchar(800)  
  630. set @m=40  
  631. set @n=31  
  632. set @sql='select top '+str(@m-@n+1) + '* from idetail where autoid not in(  
  633. select top '+ str(@n-1) + 'autoid from idetail)'  
  634. exec(@sql)  
  635.   
  636.    
  637.   
  638.    
  639.   
  640. select top 10 * from t where id not in (select top 30 id from t order by id ) orde by id  
  641.   
  642. --------------------------------------------------------------------------------  
  643.   
  644. select top 10 * from t where id in (select top 40 id from t order by id) order by id desc  
  645.   
  646.    
  647.   
  648. *******************************************************************************  
  649.   
  650. 一道面试题,写sql语句  
  651.   
  652. 有表a存储二叉树的节点,要用一条sql语句查出所有节点及节点所在的层.  
  653. 表a  
  654. c1 c2 A ----------1  
  655. ---- ---- / \  
  656. A B B C --------2  
  657. A C / / \  
  658. B D D N E ------3  
  659. C E / \ \  
  660. D F F K I ---4  
  661. E I  
  662. D K  
  663. C N  
  664.   
  665.   
  666. 所要得到的结果如下  
  667.   
  668. jd cs  
  669. ----- ----  
  670. A 1  
  671. B 2  
  672. C 2  
  673. D 3  
  674. N 3  
  675. E 3  
  676. F 4  
  677. K 4  
  678. I 4  
  679. 有高手指导一下,我只能用pl/sql写出来,请教用一条sql语句的写法  
  680.   
  681. SQL> select c2, level + 1 lv  
  682. from test start  
  683. with c1 = 'A'  
  684. connect by c1 = prior c2  
  685. union  
  686. select 'A', 1 from dual  
  687. order by lv;  
  688.   
  689. C2 LV  
  690. -- ----------  
  691. A 1  
  692. B 2  
  693. C 2  
  694. D 3  
  695. E 3  
  696. N 3  
  697. F 4  
  698. I 4  
  699. K 4  
  700.   
  701. 已选择9行。  
  702.   
  703.   
  704. 以上转自"http://blog.csdn.net/wenboliang/archive/2009/04/20/4095859.aspx  
  705.   
  706.    
  707.   
  708. ---------------------------------------------------------------  
  709.   
  710. 1.一道SQL语句面试题,关于group by  
  711. 表内容:  
  712. 2005-05-09 胜  
  713. 2005-05-09 胜  
  714. 2005-05-09 负  
  715. 2005-05-09 负  
  716. 2005-05-10 胜  
  717. 2005-05-10 负  
  718. 2005-05-10 负  
  719.   
  720. 如果要生成下列结果, 该如何写sql语句?  
  721.   
  722.             胜 负  
  723. 2005-05-09 2 2  
  724. 2005-05-10 1 2  
  725. ------------------------------------------  
  726. create table #tmp(rq varchar(10),shengfu nchar(1))  
  727.   
  728. insert into #tmp values('2005-05-09','胜')  
  729. insert into #tmp values('2005-05-09','胜')  
  730. insert into #tmp values('2005-05-09','负')  
  731. insert into #tmp values('2005-05-09','负')  
  732. insert into #tmp values('2005-05-10','胜')  
  733. insert into #tmp values('2005-05-10','负')  
  734. insert into #tmp values('2005-05-10','负')  
  735.   
  736. 1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq  
  737. 2) select N.rq,N.勝,M.負 from (  
  738. select rq,勝=count(*) from #tmp where shengfu='胜'group by rq)N inner join  
  739. (select rq,負=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq  
  740. 3)select a.col001,a.a1 胜,b.b1 负 from  
  741. (select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a,  
  742. (select col001,count(col001) b1 from temp1 where col002='负' group by col001) b  
  743. where a.col001=b.col001  
  744.   
  745. 2.请教一个面试中遇到的SQL语句的查询问题  
  746. 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。  
  747. ------------------------------------------  
  748. select (case when a>b then a else b end ),  
  749. (case when b>c then b esle c end)  
  750. from table_name  
  751.   
  752. 3.面试题:一个日期判断的sql语句?  
  753. 请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)  
  754. ------------------------------------------  
  755. select * from tb where datediff(dd,SendTime,getdate())=0  
  756.   
  757. 4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):    
  758.    大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。    
  759.        显示格式:    
  760.        语文              数学                英语    
  761.        及格              优秀                不及格      
  762. ------------------------------------------  
  763. select  
  764. (case when 语文>=80 then '优秀'  
  765.         when 语文>=60 then '及格'  
  766. else '不及格'as 语文,  
  767. (case when 数学>=80 then '优秀'  
  768.         when 数学>=60 then '及格'  
  769. else '不及格'as 数学,  
  770. (case when 英语>=80 then '优秀'  
  771.         when 英语>=60 then '及格'  
  772. else '不及格'as 英语,  
  773. from table  
  774.   
  775. 5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别?  
  776. ------------------------------------------  
  777. 用户临时表:create table #xx(ID int, IDValues int)  
  778. 系统临时表:create table ##xx(ID int, IDValues int)  
  779.   
  780. 区别:  
  781. 用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.  
  782. 当创建它的进程消失时这个临时表就自动删除.  
  783.   
  784. 全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.  
  785.   
  786. 6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。  
  787. ------------------------------------------  
  788. 它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL    Server的存储容量是可以扩大的.  
  789.   
  790. SQL Server 2000 数据库有三种类型的文件:  
  791.   
  792. 主要数据文件  
  793. 主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。  
  794.   
  795. 次要数据文件  
  796. 次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。  
  797.   
  798. 日志文件  
  799. 日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。  
  800.   
  801. 7.请用一个sql语句得出结果  
  802. 从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。  
  803. 如使用存储过程也可以。  
  804.   
  805. table1  
  806.   
  807. 月份mon 部门dep 业绩yj  
  808. -------------------------------  
  809. 一月份      01      10  
  810. 一月份      02      10  
  811. 一月份      03      5  
  812. 二月份      02      8  
  813. 二月份      04      9  
  814. 三月份      03      8  
  815.   
  816. table2  
  817.   
  818. 部门dep      部门名称dname  
  819. --------------------------------  
  820.       01      国内业务一部  
  821.       02      国内业务二部  
  822.       03      国内业务三部  
  823.       04      国际业务部  
  824.   
  825. table3 (result)  
  826.   
  827. 部门dep 一月份      二月份      三月份  
  828. --------------------------------------  
  829.       01      10        null      null  
  830.       02      10         8        null  
  831.       03      null       5        8  
  832.       04      null      null      9  
  833.   
  834. ------------------------------------------  
  835. 1)  
  836. select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份'  
  837. from table1 a,table2 b,table2 c,table2 d  
  838. where a.部门dep = b.部门dep and b.月份mon = '一月份' and  
  839. a.部门dep = c.部门dep and c.月份mon = '二月份' and  
  840. a.部门dep = d.部门dep and d.月份mon = '三月份' and  
  841. 2)  
  842. select a.dep,  
  843. sum(case when b.mon=1 then b.yj else 0 endas '一月份',  
  844. sum(case when b.mon=2 then b.yj else 0 endas '二月份',  
  845. sum(case when b.mon=3 then b.yj else 0 endas '三月份',  
  846. sum(case when b.mon=4 then b.yj else 0 endas '四月份',  
  847. sum(case when b.mon=5 then b.yj else 0 endas '五月份',  
  848. sum(case when b.mon=6 then b.yj else 0 endas '六月份',  
  849. sum(case when b.mon=7 then b.yj else 0 endas '七月份',  
  850. sum(case when b.mon=8 then b.yj else 0 endas '八月份',  
  851. sum(case when b.mon=9 then b.yj else 0 endas '九月份',  
  852. sum(case when b.mon=10 then b.yj else 0 endas '十月份',  
  853. sum(case when b.mon=11 then b.yj else 0 endas '十一月份',  
  854. sum(case when b.mon=12 then b.yj else 0 endas '十二月份',  
  855. from table2 a left join table1 b on a.dep=b.dep  
  856.   
  857. 8.华为一道面试题  
  858. 一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。  
  859. ------------------------------------------  
  860. select id, Count(*) from tb group  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多