當前位置:首頁 » 編程語言 » 中聯sql試題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

中聯sql試題

發布時間: 2023-05-02 22:11:11

sql試題求解

1
IF OBJECT_ID('學生表')IS NOT NULL
DROP TABLE 學生表
GO
create table 學生表 --建立學生表.
(
學號 int not null , --學號,姓名,年齡,性別,家庭住址,聯系電話
姓名 varchar(10) not null, --姓名
性別 varchar(2)
年齡 int,
聯系電話 varchar(10),
家庭住址 varchar(50),
聯系電話 varchar(20),
check (性別 ='男' OR 性別='女'),
)

1.1
delete 學生表
insert 學生表 (學號,姓名,年齡,性別,聯系電話,學歷)
values(1,"A",22,"男","123456","小學")
insert 學生表 (學號,姓名,年齡,性別,聯系電話,學歷)
values(2,"B",21,"男","119","中學")
insert 學生表 (學號,姓名,年齡,性別,聯系電話,學歷)
values(3,"C",23,"男","110","高中")
insert 學生表 (學號,姓名,年齡,性別,聯系電話,學歷)
values(4,"D",18,"女","114","大學")

1.2
update 學生表
set 學歷='大專'
where 聯系電話 like '11%'
go

1.3
delet 學生表
where 性別='女',姓名 like 'B%'
go

1.4
select 姓名,學號
from 學生表
where 學歷='大專',年齡<22
go

1.5
select 姓名,性別
from 學生表
order by 年齡 desc
go

2.1
use stu
IF OBJECT_ID('Student')IS NOT NULL
DROP TABLE Student
GO
create table Student --建立學生表.
(
學號 int not null ,
姓名 varchar(10) not null, --姓名
性別 varchar(2)
年齡 int,
所在系 varchar(10),
check (性別 ='男' OR 性別='女'),
)

2.2
use stu
select 學生表.學號
from Student As 學生表,SG As 成績表
where 學生表.學號=成績表.學號,成績表.成績<60
go

2.3
use stu
select 姓名,性別,年齡
from Student
where 所在系='計算機系',性別='男',姓名 like '張%'
go

2.4
use stu
insert Student (學號,姓名,年齡,性別,所在系)
values(05020,"高平",19,"女","積極管理系")
go

4.1
刪除student表中學號為2004009的學生的信息

4.2
在stu資料庫的student表中創建列名為姓名,家庭住址的視圖student_view

4.3
查詢stu資料庫的student表中前9條信息

4.4
在stu資料庫的student表中創建查詢學號,姓名,家庭住址的存儲過程student_pro

4.5
在stu資料庫的student表中創建帶輸入參數的存儲過程

4.6
查詢Sg表中課程號為06的平均成績

㈡ 求SQL試題答案

1. C
2. A
3. A
4. B 說明:%是一個通配符,如select * from test where ID like 12% 這句話就表示在test表中搜索出ID以12開頭的數據記錄,可以是123,也可以是1234.
5. C
6. A 如果讀者也作為主鍵你想會發生啥情況,每個人只能借1本書,災難啊
7. A 我真的運行了一次,因為我也不確定...
8. B
9. C
10.D
11.D
12.B 這一題考的是LEFT OUTER JOIN的用法,LEFT OUTER JOIN等同於LEFT JOIN,數據數目按照較大數來算.
二.
1. ABCE D是程序員做的事
2. ABC 系統固定的角色許可權是標準的PUBLIC許可權,用戶可以根據需要進行許可權的調整,就是C選項
3. DE A錯誤的原因是因為事務備份的還原精度要比差異備份高,能恢復到故障點前一刻,這是差錯備份做不到的;B,事務日誌只能恢復從上一次備份到本次故障點之間的一個時刻.
4. AB

㈢ sql面試題1

【1】騰訊面試題

table_A ( 用戶userid和登錄時間time)求連續登錄3天的用戶數

https://www.cnblogs.com/ikww/p/12012831.html

【SQL】查詢連續登陸7天以上的用戶

查詢7天連續登陸用戶這個問題很經典,解決方法也有很多,這里我講一下筆者的方法,希望對大家有幫助。

具體思路:

1、因為每天用戶登錄次數可能不止一次,所以需要先將用戶每天的登錄日期去重。

2、再用row_number() over(partition by _ order by _)函數將用戶id分組,按照登陸時間進行排序。

3、計算登錄日期減去第二步驟得到的結果值,用戶連續登陸情況下,每次相減的結果都相同。

4、按照id和日期分組並求和,篩選大於等於7的即為連續7天登陸的用戶。

表信息如下圖

第一步:用戶登錄日期去重

1select DISTINCT date(date) as 日期,id from orde;

結果為:

第二步:用row_number() over()函數計數

1select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from orde)a;

結果為:

第三步:日期減去計數值得到結果

1select *,date(日期)-cum as 結果 from (select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from orde)a)b;

結果:

第四步:根據id和結果分組並計算總和,大於等於7的即為連續登陸7天的用戶

1select id,count(*) from (select *,date(日期)-cum as 結果 from (select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from orde)a)b)c GROUP BY id,結果 having count(*)>=7;

結果為:

用了多次嵌套查詢,最終得到我們需要的結果。

01

01.還原題目場景 - 建表

select*fromtmp.tmp_last_3_day;

02

02.解決問題關鍵 - 分析

03

03.見證奇跡的時刻 - 實現

  連續3天登錄的用戶id ­­ sql如下:

我們再來看下結果:

04

04.面試反思總結 - 升華

現在看來,其實也不難嘛!思路很重要,有了思路,問題自然迎刃而解(此處有掌聲)。。ps:六師妹說今晚的加雞腿~哈哈

05

05.條條大路通羅馬

其實,方法有很多,上面只是選了一種技巧性比較強的一種。下面也是一種不錯的方法,大佬們肯定還有其他實現方式,歡迎小夥伴們右下角點[在看]評論留言,一起討論,一起進步 ~ go go go ...

【2】滴滴面試題

學生表:tb_student(name:學生姓名,id:學號,class:班級,in_time:入學時間,age:年齡,sex:性別,major:專業)

學生成績表:tb_score(id:學號,course:課程,score:分數)

(1)篩選出2017年入學的「計算機」專業年齡最小的10位同學名單(姓名、學號、班級、年齡)

(2)統計每個班同學各科成績平均分大於80分的人數和人數佔比

select a.class,

count(case when a.avg_score>80 then 1 else null end) as '人數'

count(case when a.avg_score>80 then 1 else null end)/count(a.id) as '人數佔比'

from

(select st.class,sc.id,avg(sc.score) as avg_score

from tb_student st

inner join tb_score sc

on st.id=sc.id

group by 1)a

(1)select st.name,st.id,st.class,st.age

from tb_student st

inner join tb_score sc

on st.id=sc.id

where year(st.in_time)='2017'

and major='計算機'

order by age asc

limit 0,9

(2)

鏈接:https://zhuanlan.hu.com/p/110924684

(1)

selectname,id,class,agefromtb_studentwhereyear(in_time)=2017andmajor='計算機'ORDERBYageASClimit10;

(2)

SELECTa.class,sum(casewhenaaa.x>80then1else0end)asnum_80,(sum(casewhenaaa.x>80then1else0end)/count(*))asproportionfromtb_studentaINNERJOIN(SELECTid,avg(score)asxfromtb_scoreGROUPBYid)asaaaona.id=aaa.idGROUPBYclass;

解析:寫一個子查詢,從score表中得到以學號分組的學生各科平均分。命名為aaa,將其與學生表內聯結。再以class分組,得到以class分組的各班學生的平均分,最後通過case語句,sum聚合函數得到平均分>80分的計數,和所佔各班總人數比例。

case語句也可以用if語句來代替

寫法2:

SELECTa.class,count(if(aaa.avg>80,true,null))asnumover80,count(if(aaa.avg>80,true,null))/count(a.id)astotalfromtb_studentaINNERJOIN(SELECTid,avg(score)asxfromtb_scoreGROUPBYid)asaaaona.id=aaa.idGROUPBYclass;

㈣ SQL 試題 求高手給正確答案!

題那麼多,分這么少,沒有積極性,沒人給你做啊。

我有時間再給你看看吧。

簡答讀程題
1列出Sql Server 2000資料庫中常見的資料庫對象。
表、視圖、存儲過程、觸發器、索引

2簡述INSERT觸發器的工作原理
當insert一條或多條數據的時候,即觸發該觸發器。

單選題
1、關於主鍵描述正確的是:( c )
A、包含一列 B、包含兩列 C、包含一列或者多列 D、以上都不正確
2、模式查找like '_a%',下面哪個結果是可能的( b )。
A、aili B、
C、bba D、cca
3、下列途徑哪個不是實現值域完整性約束的 __D___ 。
A 、rule( 規則 ) B 、default C 、not null D 、trancation
4 關於視圖和索引,下列說法那個是正確的___B__ 。
A 、視圖是虛表,觀察到的數據是實際基本表中的數據。
B 、索引查找法是比表掃描法查詢更快的一種方法。
C 、視圖是查詢數據的一種方法,只能基於基本表建立。
D 、索引的創建只和數據的存儲有關系。
5在SQL SERVER伺服器上,存儲過程是一組預先定義並(D)的Transact-SQL語句。
A、另保存 B、編寫 C、解釋說明 D、編譯
6、SQL Server 2000是一個(C)的資料庫系統。
A、層次型 B、 網狀型 C、關系型 D、組合型
7、SQL語言中,條件「年齡BETWEEN 40 AND 50」表示年齡在40至50之間,且( a )。
A、包括40歲和50歲 B、不包括40歲和50歲
C、包括40歲但不包括50歲 D、包括50歲但不包括40歲
8、面對索引的相關描述正確的是:(B)。
A、經常被查詢的列不適合建索引。 B、 列值唯一的列適合建索引。
C、有很多重復值的列適合建索引。 D、 是外鍵或主鍵的列不適合建索引。

㈤ SQL筆試試題

select ACCOUNT
,sum(RENT),sum().... from USERLIST a ,CHARGE b where a.TELEPHONE
=b.TELEPHONE(+)
group by a.ACCOUNT

上飢友面是oracle用的
通用的宴肢毀晌備是
select ACCOUNT
,sum(RENT),sum().... from USERLIST a left join CHARGE b on a.TELEPHONE
=b.TELEPHONE
group by a.ACCOUNT

㈥ SQL資料庫系統及應用~試題一套~~求高手解答!!

一、1.C,2.D,3.A,4.D,5.D,6.C,7.D,8.D,9.C,10.D
二、1.A,2.A,3.A,4.A,5.B.6.A,7.B,8.B,9.B,10.B
自己做著玩的,非標准答案~

㈦ 經典sql面試題及答案第10期

create proc 存儲過程名

[@參數名 參數類型[, @參數名 參數類型...]]

as

批處理語句

go

alter proc 存儲過程名

[@參數名 參數類型[, @參數名 參數類型...]]

as

批處理語句

go

drop proc 存儲過程名

exec proc 存儲過程名 [參數值[, 參數值...]]

不一樣,加括弧是執行sql語句,不加括弧是執行存儲過程。

a. 以Return傳回整數

b. 以output格式傳回參數

c. Recordset

返回值的區別: output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中。

create proc queryPage

@tablename nvarchar(50), --用於傳入表名

@idname nvarchar(50), --用於傳入欄位名

@pagesize int, --用於傳入每頁記錄數

@currentpage int, --用於傳入希望查看的頁面編號

@totalpages int output --用於傳出頁面總數

as

--聲明保存查遲友詢語句的局部變數:

declare @sql as nvarchar(1000)

--聲明保存記錄總碼盯槐數的局部變數:

declare @rowcount as int

--獲得記錄總數:

set @sql='select @rc=count() from '+@tablename --不要直接執行select @rowcount=count() from @tablename

--將參數傳入語句:

exec sp_executesql @sql,N'@rc int output',@rc=@rowcount output

--將根據每頁的行數得到則拿的總頁數保存到輸出參數中:

set @totalpages = ceiling(cast(@rowcount as float)/cast(@pagesize as float))

if @currentpage >1

begin if @currentpage>@totalpages

begin set @currentpage = @totalpages --則顯示最後一頁

end

set @sql = 'select top '+cast(@pagesize as varchar) +' * from '+@tablename+' where '+@idname+' not in (select top ' +cast(@pagesize*(@currentpage-1) as varchar) +' '+@idname+' from '+@tablename+' order by '+@idname+') order by '+@idname

end else --只選第一頁就不必使用子查詢了,提高性能

begin set @sql = 'select top '+cast(@pagesize as varchar) +' * from '+@tablename+' order by '+@idname

end exec(@sql) --執行查詢語句

go

㈧ SQL查詢面試題與答案

SQL查詢面試題與答案

SQL語言是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本文件的擴展名。下面是我搜集的SQL查詢面試題與答案,歡迎大家閱讀。

SQL查詢面試題與答案一

1.一道SQL語句面試題,關於group by表內容:

2005-05-09 勝

2005-05-09 勝

2005-05-09 負

2005-05-09 負

2005-05-10 勝

2005-05-10 負

2005-05-10 負

如果要生成下列結果, 該如何寫sql語句?

勝 負

2005-05-09 2 2

2005-05-10 1 2

------------------------------------------

create table #tmp(rq varchar(10),shengfu nchar(1))

insert into #tmp values('2005-05-09','勝')

insert into #tmp values('2005-05-09','勝')

insert into #tmp values('2005-05-09','負')

insert into #tmp values('2005-05-09','負')

insert into #tmp values('2005-05-10','勝')

insert into #tmp values('2005-05-10','負')

insert into #tmp values('2005-05-10','負')

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

2) select N.rq,N.勝,M.負 from (

select rq,勝=count(*) from #tmp where shengfu='勝'group by rq)N inner join

(select rq,負=count(*) from #tmp where shengfu='負'group by rq)M on N.rq=M.rq

3)select a.col001,a.a1 勝,b.b1 負 from

(select col001,count(col001) a1 from temp1 where col002='勝' group by col001) a,

(select col001,count(col001) b1 from temp1 where col002='負' group by col001) b

where a.col001=b.col001

2.請教一個面試中遇到的SQL語句的查詢問題

表中有A B C三列,用SQL語句實現:當A列大於B列時選擇A列否則選擇B列,當B列大於C列時選擇B列否則選擇C列。

------------------------------------------

select (case when a>b then a else b end ),

(case when b>c then b esle c end)

from table_name

3.面試題:一個日期判斷的sql語句?

請取出tb_send表中日期(SendTime欄位)為當天的所有記錄?(SendTime欄位為datetime型,包含日期與時間)

------------------------------------------

select * from tb where datediff(dd,SendTime,getdate())=0

4.有一張表,裡面有3個欄位:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按以下條件顯示出來(並寫出您的思路):

大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。

顯示格式:

語文 數學 英語

及格 優秀 不及格

------------------------------------------

select

(case when 語文>=80 then '優秀'

when 語文>=60 then '及格'

else '不及格') as 語文,

(case when 數學>=80 then '優秀'

when 數學>=60 then '及格'

else '不及格') as 數學,

(case when 英語>=80 then '優秀'

when 英語>=60 then '及格'

else '不及格') as 英語,

from table

5.在sqlserver2000中請用sql創建一張用戶臨時表和系統臨時表,裡麵包含兩個欄位ID和IDValues,類型都是int型,並解釋下兩者的區別?

------------------------------------------

用戶臨時表:create table #xx(ID int, IDValues int)

系統臨時表:create table ##xx(ID int, IDValues int)

區別:

用戶臨時表只對創建這個表的用戶的Session可見,對其他進程是不可見的.

當創建它的進程消失時這個臨時表就自動刪除.

全局臨時表對整個SQL Server實例都可見,但是所有訪問它的Session都消失的時候,它也自動刪除.

6.sqlserver2000是一種大型資料庫,他的`存儲容量只受存儲介質的限制,請問它是通過什麼方式實現這種無限容量機制的。

------------------------------------------

它的所有數據都存儲在數據文件中(*.dbf),所以只要文件夠大,SQL Server的存儲容量是可以擴大的.

SQL Server 2000 資料庫有三種類型的文件:

主要數據文件

主要數據文件是資料庫的起點,指向資料庫中文件的其它部分。每個資料庫都有一個主要數據文件。主要數據文件的推薦文件擴展名是 .mdf。

次要數據文件

次要數據文件包含除主要數據文件外的所有數據文件。有些資料庫可能沒有次要數據文件,而有些資料庫則有多個次要數據文件。次要數據文件的推薦文件擴展名是 .ndf。

日誌文件

日誌文件包含恢復資料庫所需的所有日誌信息。每個資料庫必須至少有一個日誌文件,但可以不止一個。日誌文件的推薦文件擴展名是 .ldf。

7.請用一個sql語句得出結果

從table1,table2中取出如table3所列格式數據,注意提供的數據及結果不準確,只是作為一個格式向大家請教。

如使用存儲過程也可以。

table1

月份mon 部門dep 業績yj

-------------------------------

一月份 01 10

一月份 02 10

一月份 03 5

二月份 02 8

二月份 04 9

三月份 03 8

table2

部門dep 部門名稱dname

--------------------------------

01 國內業務一部

02 國內業務二部

03 國內業務三部

04 國際業務部

table3 (result)

部門dep 一月份 二月份 三月份

--------------------------------------

01 10 null null

02 10 8 null

03 null 5 8

04 null null 9

------------------------------------------

1)

select a.部門名稱dname,b.業績yj as '一月份',c.業績yj as '二月份',d.業績yj as '三月份'

from table1 a,table2 b,table2 c,table2 d

where a.部門dep = b.部門dep and b.月份mon = '一月份' and

a.部門dep = c.部門dep and c.月份mon = '二月份' and

a.部門dep = d.部門dep and d.月份mon = '三月份' and

2)

select a.dep,

sum(case when b.mon=1 then b.yj else 0 end) as '一月份',

sum(case when b.mon=2 then b.yj else 0 end) as '二月份',

sum(case when b.mon=3 then b.yj else 0 end) as '三月份',

sum(case when b.mon=4 then b.yj else 0 end) as '四月份',

sum(case when b.mon=5 then b.yj else 0 end) as '五月份',

sum(case when b.mon=6 then b.yj else 0 end) as '六月份',

sum(case when b.mon=7 then b.yj else 0 end) as '七月份',

sum(case when b.mon=8 then b.yj else 0 end) as '八月份',

sum(case when b.mon=9 then b.yj else 0 end) as '九月份',

sum(case when b.mon=10 then b.yj else 0 end) as '十月份',

sum(case when b.mon=11 then b.yj else 0 end) as '十一月份',

sum(case when b.mon=12 then b.yj else 0 end) as '十二月份',

from table2 a left join table1 b on a.dep=b.dep

8.華為一道面試題

一個表中的Id有多個記錄,把所有這個id的記錄查出來,並顯示共有多少條記錄數。

------------------------------------------

select id, Count(*) from tb group by id having count(*)>1

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

SQL查詢面試題與答案二

1、查詢不同老師所教不同課程平均分從高到低顯示

SELECT max(Z.T#) AS 教師ID,MAX(Z.Tname) AS 教師姓名,C.C# AS 課程ID,MAX(C.Cname) AS 課程名稱,AVG(Score) AS 平均成績

FROM SC AS T,Course AS C ,Teacher AS Z

where T.C#=C.C# and C.T#=Z.T#

GROUP BY C.C#

ORDER BY AVG(Score) DESC

2、查詢如下課程成績第 3 名到第 6 名的學生成績單:企業管理(001),馬克思(002),UML (003),資料庫(004)

[學生ID],[學生姓名],企業管理,馬克思,UML,資料庫,平均成績

SELECT DISTINCT top 3

SC.S# As 學生學號,

Student.Sname AS 學生姓名 ,

T1.score AS 企業管理,

T2.score AS 馬克思,

T3.score AS UML,

T4.score AS 資料庫,

ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 總分

FROM Student,SC LEFT JOIN SC AS T1

ON SC.S# = T1.S# AND T1.C# = '001'

LEFT JOIN SC AS T2

ON SC.S# = T2.S# AND T2.C# = '002'

LEFT JOIN SC AS T3

ON SC.S# = T3.S# AND T3.C# = '003'

LEFT JOIN SC AS T4

ON SC.S# = T4.S# AND T4.C# = '004'

WHERE student.S#=SC.S# and

ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)

NOT IN

(SELECT

DISTINCT

TOP 15 WITH TIES

ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)

FROM sc

LEFT JOIN sc AS T1

ON sc.S# = T1.S# AND T1.C# = 'k1'

LEFT JOIN sc AS T2

ON sc.S# = T2.S# AND T2.C# = 'k2'

LEFT JOIN sc AS T3

ON sc.S# = T3.S# AND T3.C# = 'k3'

LEFT JOIN sc AS T4

ON sc.S# = T4.S# AND T4.C# = 'k4'

ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);

3、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60]

SELECT SC.C# as 課程ID, Cname as 課程名稱

,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]

,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]

,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]

,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]

FROM SC,Course

where SC.C#=Course.C#

GROUP BY SC.C#,Cname;

4、查詢學生平均成績及其名次

SELECT 1+(SELECT COUNT( distinct 平均成績)

FROM (SELECT S#,AVG(score) AS 平均成績

FROM SC

GROUP BY S#

) AS T1

WHERE 平均成績 > T2.平均成績) as 名次,

S# as 學生學號,平均成績

FROM (SELECT S#,AVG(score) 平均成績

FROM SC

GROUP BY S#

) AS T2

ORDER BY 平均成績 desc;

5、查詢各科成績前三名的記錄:(不考慮成績並列情況)

SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數

FROM SC t1

WHERE score IN (SELECT TOP 3 score

FROM SC

WHERE t1.C#= C#

ORDER BY score DESC

)

ORDER BY t1.C#;

6、查詢每門課程被選修的學生數

select c#,count(S#) from sc group by C#;

7、查詢出只選修了一門課程的全部學生的學號和姓名

select SC.S#,Student.Sname,count(C#) AS 選課數

from SC ,Student

where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;

8、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;

Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2

from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2

9、查詢所有課程成績小於60分的同學的學號、姓名;

select S#,Sname

from Student

where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

10、查詢沒有學全所有課的同學的學號、姓名;

select Student.S#,Student.Sname

from Student,SC

where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);

11、查詢至少有一門課與學號為“1001”的同學所學相同的同學的學號和姓名;

select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';

12、查詢至少學過學號為“001”同學所有一門課的其他同學學號和姓名;

select distinct SC.S#,Sname

from Student,SC

where Student.S#=SC.S# and C# in (select C# from SC where S#='001');

13、把“SC”表中“葉平”老師教的課的成績都更改為此課程的平均成績;

update SC set score=(select avg(SC_2.score)

from SC SC_2

where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='葉平');

14、查詢和“1002”號的同學學習的課程完全相同的其他同學學號和姓名;

select S# from SC where C# in (select C# from SC where S#='1002')

group by S# having count(*)=(select count(*) from SC where S#='1002');

15、刪除學習“葉平”老師課的SC表記錄;

Delect SC

from course ,Teacher

where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';

16、向SC表中插入一些記錄,這些記錄要求符合以下條件:沒有上過編號“003”課程的同學學號、2、

號課的平均成績;

Insert SC select S#,'002',(Select avg(score)

from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');

17、按平均成績從高到低顯示所有學生的“資料庫”、“企業管理”、“英語”三門的課程成績,按如下形式顯示: 學生ID,,資料庫,企業管理,英語,有效課程數,有效平均分

SELECT S# as 學生ID

,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 資料庫

,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企業管理

,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英語

,COUNT(*) AS 有效課程數, AVG(t.score) AS 平均成績

FROM SC AS t

GROUP BY S#

ORDER BY avg(t.score)

18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分

SELECT L.C# As 課程ID,L.score AS 最高分,R.score AS 最低分

FROM SC L ,SC AS R

WHERE L.C# = R.C# and

L.score = (SELECT MAX(IL.score)

FROM SC AS IL,Student AS IM

WHERE L.C# = IL.C# and IM.S#=IL.S#

GROUP BY IL.C#)

AND

R.Score = (SELECT MIN(IR.score)

FROM SC AS IR

WHERE R.C# = IR.C#

GROUP BY IR.C#

);

19、按各科平均成績從低到高和及格率的百分數從高到低順序

SELECT t.C# AS 課程號,max(course.Cname)AS 課程名,isnull(AVG(score),0) AS 平均成績

,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分數

FROM SC T,Course

where t.C#=course.C#

GROUP BY t.C#

ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC

20、查詢如下課程平均成績和及格率的百分數(用"1行"顯示): 企業管理(001),馬克思(002),OO&UML (003),資料庫(004)

SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企業管理平均分

,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企業管理及格百分數

,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 馬克思平均分

,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 馬克思及格百分數

,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分

,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分數

,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 資料庫平均分

,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 資料庫及格百分數

FROM SC

;

㈨ 一些SQL的試題

1.應用程序
2.實體完整性
3.distince
4.
5.create Nonclustered index IDX_authors on authors(州名列,城市名列)
6.創建表
7.select 列名 from 表名
8.sum()
9.top
10.alter procere
11.ltrim()
12.declare @變數名 數據類型
13.where
14.from
15.order by
16.cast(表達式 as 數據類型)
17.count()
18.drop procere 存儲過程名
19.創建資料庫
20.價格大於15美元的所有數據
21.資料庫
22.rollback
23.
24.服務管理器
25.
26.數據冗餘(備份)
27.3
28.資料庫
29.應用程序
30.drop table
33.操作系統
許可權
1.
2.是並發控制的單位,是用戶定義的一個操作序列,具有原子性,一致性,隔離性,持續性四個特性。
3.共享鎖(S鎖):如果事務T對數據A加上共享鎖後,則其他事務只能對A再加共享鎖,不能加排他鎖.
獲准共享鎖的事務只能讀數據,不能修改數據。
4.
5.
1.存儲過程可以使得程序執行效率更高、安全性更好,因為過程建立之後 已經編譯並且儲存到資料庫,直接寫sql就需要先分析再執行因此過程效率更高,直接寫sql語句會帶來安全性問題,如:sql注入
2.建立過程不會很耗系統資源,因為過程只是在調用才執行。
6.聚簇索引是一種對磁碟上實際數據重新組織以按指定的一個或多個列的值排序。
7.
8.是並發控制的單位,是用戶定義的一個操作序列,具有原子性,一致性,隔離性,持續性四個特性。
BEGIN TRAN [Tran_name]開始事務
COMMIT TRAN [Tran_name]事務完成提交事務
9.存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化後存儲在資料庫伺服器中,應用程序使用時只要調用即可。
10.增量備份:是針對於上一次備份(無論是哪種備份):備份上一次備份後,所有發生變化的文件。
12.原子性,要麼都做,要麼不做。
13.排它鎖若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其它任何事務都不能再對A加任何類型的鎖,直到T釋放A上的鎖。
它防止任何其它事務獲取資源上的鎖,直到在事務的末尾將資源上的原始鎖釋放為止。
14.分布式資料庫系統通常使用較小的計算機系統,每台計算機可單獨放在一個地方,每台計算機中都有DBMS的一份完整拷貝副本,並具有自己局部的資料庫,位於不同地點的許多計算機通過網路互相連接,共同組成一個完整的、全局的大型資料庫。
15.
17同2,18同8
19.DBMS資料庫管理系統,DBA資料庫管理員
20.1對1,一個學生對應一個學號
1對多 一個學生對應多門功課
多對多 商品與廠商
(備註:只能做這么多了,很長時間沒看書了,有時間可以看看<資料庫系統概論>薩師煊 王珊 高等教育出版社,很不錯的一本書哦。上有你要的答案,特別是簡答題。)
21.
22.資料庫完整性,對資料庫提出的某種約束條件或規則。
分三種:實體完整性,參照完整性,用戶自定義完整性
23.
24.原則如下:
●在經常進行連接,但是沒有指定為外鍵的列上建立索引,而不經常連接的欄位則由優化器自動生成索引。
●在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引。
●在條件表達式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在雇員表的「性別」列上只有「男」與「女」兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。
●如果待排序的列有多個,可以在這些列上建立復合索引(compound index)。

26。聚集索引確定表中數據的物理順序。由於聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引)
非聚集索引一種索引,該索引中索引的邏輯順序與磁碟上行的物理存儲順序不同。一個表可以有多個聚集索引

㈩ sql面試題50題(mysql版)

--插入學生表測試數據
insert into Student values(༽' , '趙雷' , 񟬶-01-01' , '男');
insert into Student values(༾' , '錢電' , 񟬶-12-21' , '男');
insert into Student values(༿' , '孫風' , 񟬶-05-20' , '男');
insert into Student values(ཀ' , '李雲' , 񟬶-08-06' , '男');
insert into Student values(ཁ' , '周梅' , 񟬷-12-01' , '女');
insert into Student values(ག' , '吳蘭' , 񟬸-03-01' , '女');
insert into Student values(གྷ' , '鄭竹' , 񟬵-07-01' , '女');
insert into Student values(ང' , '王菊' , 񟬶-01-20' , '女');
--課程表測試數據
insert into Course values(༽' , '語文' , ༾');
insert into Course values(༾' , '數學' , ༽');
insert into Course values(༿' , '英語' , ༿');
--教師表測試數據
insert into Teacher values(༽' , '張三');
insert into Teacher values(༾' , '李四');
insert into Teacher values(༿' , '王五');
--成績表測試數據
insert into Score values(༽' , ༽' , 80);
insert into Score values(༽' , ༾' , 90);
insert into Score values(༽' , ༿' , 99);
insert into Score values(༾' , ༽' , 70);
insert into Score values(༾' , ༾' , 60);
insert into Score values(༾' , ༿' , 80);
insert into Score values(༿' , ༽' , 80);
insert into Score values(༿' , ༾' , 80);
insert into Score values(༿' , ༿' , 80);
insert into Score values(ཀ' , ༽' , 50);
insert into Score values(ཀ' , ༾' , 30);
insert into Score values(ཀ' , ༿' , 20);
insert into Score values(ཁ' , ༽' , 76);
insert into Score values(ཁ' , ༾' , 87);
insert into Score values(ག' , ༽' , 31);
insert into Score values(ག' , ༿' , 34);
insert into Score values(གྷ' , ༾' , 89);
insert into Score values(གྷ' , ༿' , 98);

-- 1、查詢"01"課程比"02"課程成績高的學生的信息及課程分數
select c.*,a.s_score as 01課程score,b.s_score as 02課程score from
score a,score b
left join student c
on b.s_id = c.s_id
where a.s_id = b.s_id and a.c_id = ༽' and b.c_id = ༾' and a.s_score > b.s_score;

-- 2、查詢"01"課程比"02"課程成績低的學生的信息及課程分數
select a.* ,b.s_score as 01課程,c.s_score as 02課程 from student a
join score b
on a.s_id=b.s_id and b.c_id = ༽'
left join score c
on b.s_id = c.s_id and c.c_id = ༾'
where b.s_score < c.s_score ;

-- 3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
select a.s_id,a.s_name,round(avg(b.s_score),2) as 平均成績 from student a
join score b
on a.s_id = b.s_id
group by b.s_id having 平均成績 >= 60;
備註:round[avg(成績),1]里,round是四捨五入函數,1代表保留1位小數

-- 4、查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績
-- (包括有成績的和無成績的)
select b. ,round(avg(a.s_score),2) as 平均成績 from
student b
left join score a on b.s_id = a.s_id group by a.s_id having 平均成績 < 60
union
select b.
,0 as 平衡成績 from student b where b.s_id not in (select s_id from score);

-- 5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績
select a.s_id,a.s_name,count(b.c_id) as 選課總數 ,sum(b.s_score) as 總分 from student a
left join score b
on a.s_id = b.s_id group by s_id ;

-- 6、查詢"李"姓老師的數量
select count(*) as 李姓老師數量 from teacher where t_name like '李%'

-- 7、查詢學過"張三"老師授課的同學的信息
select a.* from student a join score b
on a.s_id = b.s_id
where b.c_id in (select c.c_id from course c
join teacher d on c.t_id = d.t_id where d.t_name = '張三');

-- 8、查詢沒學過"張三"老師授課的同學的信息
select a.* from student a left join score b on a.s_id = b.s_id where a.s_id not in
(select s_id from score where c_id =
(select c_id from course where t_id =
(select t_id from teacher where t_name = '張
三'))) group by a.s_id;

-- 9、查詢學過編號為"01"並且也學過編號為"02"的課程的同學的信息
select * from student where s_id in
(select a.s_id from score a join score b on a.s_id = b.s_id
where a.c_id = ༽' and b.c_id = ༾');

-- 10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息
select * from student where s_id in
(select s_id from score where c_id = ༽' )
and s_id not in (select s_id from score where c_id = ༾' );

-- 11、查詢沒有學全所有課程的同學的信息
select * from student where s_id not in
(select s_id from score group by s_id having count(c_id) = 3);

-- 12、查詢至少有一門課與學號為"01"的同學所學相同的同學的信息
select distinct a.* from student a left join score b
on a.s_id = b.s_id where b.c_id in
(select c_id from score where s_id = ༽') and a.s_id != ༽' ;
注意:distinct是去重的

-- 13、查詢和"01"號的同學學習的課程完全相同的其他同學的信息
select * from student where s_id in
(select s_id from score group by s_id having count(c_id) =
(select count(c_id) from score where s_id = ༽') and s_id not in
(select s_id from score where c_id not in
(select c_id from score where s_id = ༽')) and s_id != ༽');

-- 14、查詢沒學過"張三"老師講授的任一門課程的學生姓名
select s_name from student where s_id not in
(select s_id from score where c_id in
(select c_id from course where t_id in
(select t_id from teacher where t_name ='張三')));

-- 15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
select a.s_id ,b.s_name,round(avg(a.s_score),2) as 平均成績 from score a
left join student b on a.s_id = b.s_id
where s_score < 60 group by s_id having count(1) >=2;
或者試試
select a.s_id ,b.s_name,round(avg(a.s_score),2) as 平均成績 from score a
left join student b on a.s_id = b.s_id
where a.s_score < 60 group by a.s_id having count(*) >=2;

-- 16、檢索"01"課程分數小於60,按分數降序排列的學生信息
select a.* ,b.c_id ,b.s_score from student a
left join score b on a.s_id = b.s_id
where b.c_id = ༽' and b.s_score < 60
order by b.s_score desc;

-- 17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
select a.s_name ,
sum(case when b.c_id = ༽' then s_score else null end ) as 語文,
sum(case when b.c_id = ༾' then s_score else null end ) as 數學,
sum(case when b.c_id = ༿' then s_score else null end ) as 英語,
round(avg(s_score),2) as 平均成績
from student a left join score b on a.s_id = b.s_id group by a.s_name
order by 平均成績 desc;

-- 18.查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
--及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90
select b.c_id,b.c_name,
max(a.s_score) as 最高分,
min(a.s_score) as 最低分,
round(avg(a.s_score),2) as 平均分,
round(sum(case when a.s_score>= 60 then 1 else 0 end)/count(s_id),2) as 及格率 ,
round(sum(case when a.s_score>= 70 and a.s_score <80 then 1 else 0 end)/count(s_id),2) as 中等率,
round(sum(case when a.s_score>= 80 and a.s_score <90 then 1 else 0 end)/count(s_id),2) as 優良率,
round(sum(case when a.s_score>= 90 then 1 else 0 end)/count(s_id),2) as 優秀率
from score a
left join course b
on a.c_id = b.c_id group by b.c_id;

-- 19、按各科成績進行排序,並顯示排名
第一種:
set @pre_c_id:= ༽'
set @rank:=0;
select tb2.s_id ,tb2.c_id,tb2.s_score,tb2.排名 from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2;

如果看不懂用第二種方法:
SELECT a.c_id,a.s_id,a.s_score,COUNT(b.s_score)+1 AS 排名
FROM score a LEFT JOIN score b ON a.s_score<b.s_score AND a.c_id = b.c_id
GROUP BY a.c_id,a.s_id,a.s_score ORDER BY a.c_id,排名,a.s_id ASC

-- 20、查詢學生的總成績並進行排名
set @rank:=0;
select * ,(@rank:=@rank+1) as rank from
(select s_id ,sum(s_score) as 總成績 from score
group by s_id order by 總成績 desc) tb1;

-- 21、查詢不同老師所教不同課程平均分從高到低顯示
select a.c_id, d.t_name,round(avg(a.s_score)) as 平均分 from score a
left join student b on a.s_id = b.s_id
left join course c on a.c_id = c.c_id
left join teacher d on c.t_id = d.t_id group by a.c_id
order by 平均分 desc;

-- 22、查詢所有課程的成績第2名到第3名的學生信息及該課程成績
set @pre_c_id:= ༽'
set @rank:=0;
select b.s_name,tb2.s_id ,tb2.c_id,tb2.s_score,tb2.排名 from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2 join student b on tb2.s_id = b.s_id where 排名 = 2 or 排名 =3;

-- 23、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],(85-70],(70-60],(0-60]及所佔百分比
select b.c_id,b.c_name ,
sum(case when a.s_score >=85 then 1 else 0 end) as 100-85 ,
concat(round(100 sum(case when a.s_score >=85 then 1 else 0 end)/count( ),2), '%') as 百分比,
sum(case when a.s_score <85 and a.s_score >=70 then 1 else 0 end) as 85-70 ,
concat(round(100 sum(case when a.s_score <85 and a.s_score >=70 then 1 else 0 end)/count( ),2),'%') as 百分比,
sum(case when a.s_score <70 and a.s_score >=60 then 1 else 0 end) as 70-60 ,
concat(round(100 sum(case when a.s_score <70 and a.s_score >=60 then 1 else 0 end)/count( ),2) ,'%')as 百分比,
sum(case when a.s_score <60 and a.s_score >=0 then 1 else 0 end) as 60-0 ,
concat(round(100 sum(case when a.s_score <60 and a.s_score >=0 then 1
else 0 end)/count(
),2),'%') as 百分比
from score a left join course b on a.c_id = b.c_id group by b.c_id;

-- 24、查詢學生平均成績及其名次
select tb1.*,(@rank:=@rank +1 ) as rank from
(select s_id ,round(avg(s_score),2) as 平均成績 from score
group by s_id order by 平均成績 desc) tb1,(select @rank:=0) b;

-- 25、查詢各科成績前三名的記錄
set @pre_c_id:= ༽'
set @rank:=0;
select b.s_name,tb2.s_id ,tb2.c_id,tb2.s_score,tb2.排名 from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2 join student b on tb2.s_id = b.s_id where 排名 <4;

-- 26、查詢每門課程被選修的學生數
select c_id ,count(s_id) as 選修人數 from score group by c_id;

-- 27、查詢出只有兩門課程的全部學生的學號和姓名
select a.s_id ,b.s_name from score a left join student b on a.s_id = b.s_id group by s_id having count(*) = 2;

-- 28、查詢男生、女生人數
select sum(case s_sex when '男' then 1 else 0 end) as 男生人數,
sum(case s_sex when '女' then 1 else 0 end) as 女生人數 from student;

-- 29、查詢名字中含有"風"字的學生信息
select * from student where s_name like '%風%'

-- 30、查詢同名同性學生名單,並統計同名人數
--略,不想寫

-- 31、查詢1990年出生的學生名單
select * from student where s_birth like 񟬶%'

-- 32、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
select c_id ,round(avg(s_score),2) as 平均成績 from score group by c_id order by 平均成績 desc, c_id asc;

-- 33、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績
select a.s_id,b.s_name ,round(avg(s_score),2) as 平均成績 from score a
left join student b on a.s_id = b.s_id group by a.s_id having 平均成績>=85;

-- 34、查詢課程名稱為"數學",且分數低於60的學生姓名和分數
select b.s_name ,a.s_score from score a
left join student b on a.s_id = b.s_id
where a.c_id=(select c_id from course where c_name = '數學')and a.s_score < 60;

-- 35、查詢所有學生的課程及分數情況;
select b.s_name,
sum(case when a.c_id = ༽' then a.s_score else null end) as 語文,
sum(case when a.c_id = ༾' then a.s_score else null end) as 數學,
sum(case when a.c_id = ༿' then a.s_score else null end) as 英語
from score a right join student b on a.s_id = b.s_id group by b.s_name

-- 36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
select b.s_name,
sum(case when a.c_id = ༽' then a.s_score else null end) as 語文,
sum(case when a.c_id = ༾' then a.s_score else null end) as 數學,
sum(case when a.c_id = ༿' then a.s_score else null end) as 英語
from score a right join student b on a.s_id = b.s_id group by b.s_name having 語文>= 70 or 數學>= 70 or 英語>= 70 ;

-- 37、查詢不及格的課程
select a.s_id,a.c_id,b.c_name,a.s_score from score a
left join course b on a.c_id = b.c_id where a.s_score<60;

--38、查詢課程編號為01且課程成績在80分以上的學生的學號和姓名;
select a.s_id,b.s_name from score a left join student b on a.s_id = b.s_id where a.c_id = ༽' and a.s_score>=80;

-- 39、求每門課程的學生人數
select c_id,count(*) as 學生人數 from score group by c_id ;

-- 40、查詢選修"張三"老師所授課程的學生中,成績最高的學生信息及其成績
select a.*,b.c_id,max(b.s_score) as 最高成績 from student a
right join score b on a.s_id = b.s_id
group by b.c_id
having b.c_id = (select c_id from course
where t_id = (select t_id from teacher where t_name = '張三'));

-- 41、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績
--(這題我搞不清題目是什麼意思,是指查找學生個體參加了的所有課程的成績各不相同的那個學生信息呢?還是所有課程之間做對比呢,我更傾向於理解為前者)

--理解為前者的寫法
select * from
(select * from score group by s_id,s_score) tb1
group by s_id having count(*) = 1;

--理解為後者的寫法
select distinct a.s_id,a.c_id,b.s_score from score a,score b where a.c_id != b.c_id and a.s_score = b.s_score;

-- 42、查詢每門課程成績最好的前兩名
set @pre_c_id:= ༽'
set @rank:=0;
select tb2.s_id ,tb2.c_id,tb2.s_score from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2
join student b on tb2.s_id = b.s_id where 排名 <3;

-- 43、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人相同,按課程號升序排列
select c_id ,count(*) as 選修人數 from score group by c_id having 選修人數>5 order by 選修人數 desc , c_id asc;

-- 44、檢索至少選修兩門課程的學生學號
select s_id from score group by s_id having count(*) >= 2;

-- 45、查詢選修了全部課程的學生信息
select * from student where s_id in
(select s_id from score group by s_id having count(*) = 3)

--46、查詢各學生的年齡
select s_name ,(date_format(now(),'%Y')-date_format(s_birth,'%Y') + (CASE when date_format(now(),'%m%d')>=date_format(s_birth,'%m%d') then 0 else 1 end)) as age
from student

-- 47、查詢本周過生日的學生
---(實現得並不完全,因為例如出生月日為『01-01』在每一年可能會輸入不同周)
select * from student where week(date_format(s_birth,'%m%d'))=week(date_format(now(),'%m%d')) ;

-- 48、查詢下周過生日的學生
select * from student
where week(date_format(s_birth,'%m%d'))=week(date_format(date_add(now(),interval 7-dayofweek(now())+1 day),'%m%d'));

-- 49、查詢本月過生日的學生
select * from student where date_format(s_birth,'%m') = date_format(now(),'%m')

-- 50、查詢下月過生日的學生
select * from student where date_format(s_birth,'%m') = date_format(date_add(now(),interval 1 month),'%m')