SQL面試題


本博客總結自各個博客,匯集於此。不定期更新。。。

1. 用一條SQL 語句 查詢出每門課都大於80 分的學生姓名

name kecheng fenshu

張三 語文 81

張三 數學 75

李四 語文 76

李四 數學 90

王五 語文 81

王五 數學 100

王五 英語 90

解法1: select distinct name from table where name not in (select distinct name from table where fenshu<=80)
解法2:select name from table group by name having min(fenshu)>80

2. 刪除除了自動編號不同, 其他都相同的學生冗余信息

學生表 如下:

自動編號 學號 姓名 課程編號 課程名稱 分數

1 2005001 張三 0001 數學 69

2 2005002 李四 0001 數學 89

3 2005001 張三 0001 數學 69

Answer: delete tablename where 自動編號 not in(select min( 自動編號) from tablename group by 學號, 姓名, 課程編號, 課程名稱, 分數)

3. 一個叫 team 的表,里面只有一個字段name, 一共有4 條紀錄,分別是a,b,c,d, 對應四個球對,現在四個球對進行比賽,用一條sql 語句顯示所有可能的比賽組合.

答:select a.name, b.name
from team a, team b
where a.name < b.name

4. 請用SQL 語句實現:從TestDB 數據表中查詢出所有月份的發生額都比101 科目相應月份的發生額高的科目。請注意:TestDB 中有很多科目,都有1-12 月份的發生額。

AccID :科目代碼,Occmonth :發生額月份,DebitOccur :發生額。
數據庫名:JcyAudit ,數據集:Select * from TestDB
答:select a.*
from TestDB a
,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b
where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur

5. 面試題:怎么把這樣一個表

year month amount

1991 1 1.1

1991 2 1.2

1991 3 1.3

1991 4 1.4

1992 1 2.1

1992 2 2.2

1992 3 2.3

1992 4 2.4

查成這樣一個結果

year m1 m2 m3 m4

1991 1.1 1.2 1.3 1.4

1992 2.1 2.2 2.3 2.4

select year,
(select amount from aaa m where month=1 and m.year=aaa.year) as m1,
(select amount from aaa m where month=2 and m.year=aaa.year) as m2,
(select amount from aaa m where month=3 and m.year=aaa.year) as m3,
(select amount from aaa m where month=4 and m.year=aaa.year) as m4
from aaa group by year

6. 說明:復制表( 只復制結構, 源表名:a 新表名:b)

SQL: select * into b from a where 1<>1 (where1=1,拷貝表結構和數據內容)
ORACLE:create table b
As
Select * from a where 1=2

補充

1、既復制表結構也復制表內容的SQL語句:CREATE TABLE tab_new AS SELECT * FROM tab_old;
2、只復制表結構不復制表內容的SQL語句:CREATE TABLE tab_new AS SELECT * FROM tab_old WHERE 1=2;
3、不復制表結構,只復制內容的sql語句:insert into tab_new select * from tab_old;或者SELECT vale1, value2 into Table2 from Table1

7. 說明:顯示文章、提交人和最后回復時間

SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

8. 說明:日程安排提前五分鍾提醒

SQL: select * from 日程安排 where datediff('minute',f 開始時間,getdate())>5

9. 有兩個表A 和B ,均有key 和value 兩個字段,如果B 的key 在A 中也有,就把B 的value 換為A 中對應的value

這道題的SQL 語句怎么寫?
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);

10. 高級sql 面試題

原表:
courseid coursename score

1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80

為了便於閱讀, 查詢此表后的結果顯式如下( 及格分數為60):
courseid coursename score mark

1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass

寫出此查詢語句

select courseid, coursename ,score ,decode (sign(score-60),-1,'fail','pass') as mark from course

11. sql題

create table testtable1
(
id int IDENTITY,
department varchar(12)
)

select * from testtable1
insert into testtable1 values('設計')
insert into testtable1 values('市場')
insert into testtable1 values('售后')

結果
id department
1 設計
2 市場
3 售后

create table testtable2
(
id int IDENTITY,
dptID int,
name varchar(12)
)
insert into testtable2 values(1,'張三')
insert into testtable2 values(1,'李四')
insert into testtable2 values(2,'王五')
insert into testtable2 values(3,'彭六')
insert into testtable2 values(4,'陳七')

用一條SQL語句,怎么顯示如下結果
id dptID department name
1 1 設計 張三
2 1 設計 李四
3 2 市場 王五
4 3 售后 彭六
5 4 黑人 陳七

答案:

SELECT testtable2.* , ISNULL(department,'黑人')
FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID

也做出來了可比這方法稍復雜。

12.查詢A(ID,Name)表中第31至40條記錄,ID作為主鍵可能是不是連續增長的列,完整的查詢語句如下:

select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by A ) T) order by A

13.查詢表A中存在ID重復三次以上的記錄,完整的查詢語句如下:

select * from(select count(ID) as count from table group by ID)T where T.count>3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM