1. 速求高手解答sql一道上機練習題
1:select 姓名,單位 from 讀者 where 姓名悉兄 like '李%'
2:select 書名,出版單位 from 圖書庫
3:
select 書兆早名,單價 from 圖書表 where 出版單位='高等教育出版社' order by 單價 desc
4:
select 分類號 from 圖書表 where 價格 between 10 and 20 order by 單位出版社,單價
5:
select * from 書名,作者 from 圖書 where 書名 like '計算機%'
6:
select 讀者.姓名,讀者族陸雀.單位 from 讀者 join 圖書 on 圖書.總編號=讀者.借書證號
太多了!不想寫! 哎!
2. SQL題目,急求解答,感謝
1、
CREATE TABLE `科室` (
`科室號` VARCHAR(32) NOT NULL,
`科室名` VARCHAR(100) NULL DEFAULT NULL,
`值班電話` VARCHAR(20) NULL DEFAULT NULL,
PRIMARY KEY (`科室號`)
)
2、
select * from '醫生' where 職稱='主任醫師'
3、
select '病人'.姓名,'病人'.'出生日期' from '病人','門診記錄' where '病人'.'病人編號'='門診記錄'.'病人編號' and '門診記錄'.'日期'='2017年11月11日'
4、
select '科室'.'科室號',count('門診記錄'.'門診號') as cc, from '科室','醫生','門診記錄' where '科室'.'科室號'='醫生'.'所屬科室號' and '醫生'.'工號'='門診記錄'.'工號'
group by '科室'.'科室號'
order by cc desc limit 1
5、
select * from '病人','門診記錄' where '病人'.'病人編號'='門診記錄'.'病人編號' and '門診記錄'.'診斷' like '%高血壓%'
6、
update '醫生' set '狀態'='退休' where '姓名'='賈寧'
3. 幫忙做個SQL題目
第一題,用SQL 2005 做如下,如果是以前的版本,不支持PIVOT運算符,相對麻煩:
------------------------------------
select MName As 姓名,[語文],[數學],[英語],[歷史]
from
(SELECT score.MID,Member.MName, F.FName,score.Score
FROM F
INNER JOIN score ON F.FID = score.FID
INNER JOIN Member ON score.MID = Member.MID) liming
PIVOT
( Sum(Score) FOR FName IN ("語文","數學","英語","歷史") )
As pvt --任意名
Order By MID --可不排列
------------------------------------
第二題光求結果不要求特殊排列的話,相對簡單
---------------------------------------------
SELECT Member.MName, F.FName,score.Score
FROM F
INNER JOIN score ON F.FID = score.FID
INNER JOIN Member ON score.MID = Member.MID
WHERE score.Score<70
---------------------------------------------
第三題也不難
--------------------------------------------
SELECT Member.MName, AVG(score.Score) as avgScore
FROM F
INNER JOIN score ON F.FID = score.FID
INNER JOIN Member ON score.MID = Member.MID
Group by score.MID,Member.MName --ID或者名字都一樣,二選一或者都選
Order by avgScore
--------------------------------------------
第四題存儲過程不知道你是要以參數輸出還是以Select一次性全部輸出,
就給你舉例為查詢全部輸出吧,如下,因為一學生為中心,所以以學生表為主對象,如果需要傳入參數,自己修改
--------------------------------------------
Create PROC selectF_PROC
AS
declare @s nvarchar(50)
declare @i int--循環的變數,如果按參數選擇,可以修改為傳入參數
set @i=0
while @i<=4
begin
set @s=N'參加'+CAST(@i AS nvarchar(5))+'次考試的學生'
SELECT Member.MID,Member.MName,@s
FROM F Right JOIN
score ON score.FID = F.FID Right Join
Member ON Member.MID = score.MID
group by Member.MID,Member.MName HAVING(count(score.FID)=@i)
set @i=@i+1
end
--------------------------------------------
執行語句:exec selectF_PROC
4. sql經典50題
一、查詢課程編號為「01」的課程比「02」的課程成績高的所有學生的學號(重點)
一刷:
excel思路:
觀察原始表格數據,在excel中想得到01比02高,我們需要將原始表格拆分成兩個表,課程01表和課程02表,再進行vlookup得到c表,根據if條件判斷篩出最終數據。
重點是:1.拆表 2.匹配
轉成SQL語言:
1.拆表語言:
2.關聯加匹配語言 :
3.完整語言:
----到這里其實就可以結束了;
4.若想加student的信息,則需要以上所有結果再作為c表再關聯匹配:
若想讓欄位1和2為上下結果,即重復前面的信息,則語言如下:
二刷:
擴展一:查詢成績小於60分的學生的學號和姓名
1、先反向找出大於等於60分的學號 :
2、匹配:
擴展二:查詢平均成績小於60分的學生的學號、姓名和平均成績
第一種
1、先找出小於60分和空的作為c表:
2、匹配:
三、查詢所有學生的學號、姓名、選課數、總成績(不重要)
四、查詢姓「李」的老師的個數(不重要)
五、查詢沒學過「張三」老師課的學生的學號、姓名(重點)
六、查詢學過「張三」老師所教的所有課的同學的學號、姓名(重點)
七、查詢學過編號為「01」的課程並且也學過編號為「02」的課程的學生的學號、姓名(重點)
八、查詢課程編號為「02」的總成績(不重點)
九、查詢成績小於60分的學生的學號和姓名(同題目二)
十、查詢沒有學全所有課的學生的學號、姓名(重點)
十一、查詢至少有一門課與學號為「01」的學生所學課程相同的學生的學號和姓名(重點)
十二、查詢和「01」號同學所學課程完全相同的其他同學的學號(重點)
十五、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績(重點)
十六、檢索"01"課程分數小於60,按分數降序排列的學生信息(和34題重復,不重點
十七、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績(重重點與35一樣)
十八、查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
-- 及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90 (超級重點)
十九、按各科成績進行排序,並顯示排名
二十、查詢學生的總成績並進行排名(不重點)
二十一、查詢不同老師所教不同課程平均分從高到低顯示(不重點)
二十二、查詢所有課程的成績第2名到第3名的學生信息及該課程成績(重要 25類似
二十三、 使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計各分數段人數:課程ID和課程名稱(重點和18題類似)
二十四、查詢學生平均成績及其名次(同19題,重點)
二十五、查詢各科成績前三名的記錄(不考慮成績並列情況)(重點 與22題類似)
二十六、查詢每門課程被選修的學生數(不重點)
二十七、查詢出只有兩門課程的全部學生的學號和姓名(不重點)
二十八、查詢男生、女生人數(不重點)
二十九、查詢名字中含有"風"字的學生信息(不重點)
三十一、 查詢1990年出生的學生名單(重點year)
三十二、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績(不重要)
三十三、查詢每門課程的平均成績,結果按平均成績升序排序,平均成績相同時,按課程號降序排列(不重要)
三十四、查詢課程名稱為"數學",且分數低於60的學生姓名和分數(不重點)
三十五、查詢所有學生的課程及分數情況(重點)
三十六、 查詢任何一門課程成績在70分以上的姓名、課程名稱和分數(重點)
三十七、 查詢不及格的課程並按課程號從大到小排列(不重點)
三十八、 查詢課程編號為03且課程成績在80分以上的學生的學號和姓名(不重要)
三十九、求每門課程的學生人數(不重要)
四十、查詢選修「張三」老師所授課程的學生中成績最高的學生姓名及其成績(重要top)
四十一、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績 (重點)
四十二、查詢每門功課成績最好的前兩名(同22和25題)
四十三、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列(不重要)
四十四、檢索至少選修兩門課程的學生學號(不重要)
四十五、查詢選修了全部課程的學生信息(重點劃紅線地方)
四十六、查詢各學生的年齡(精確到月份)
四十七、 查詢沒學過「張三」老師講授的任一門課程的學生姓名(還可以,自己寫的,答案中沒有)
四十八、 查詢兩門以上不及格課程的同學的學號及其平均成績
四十九、查詢本月過生日的學生(無法使用week、date(now())
五十、 查詢下月過生日的學生
5. SQL高手請進高分請你做3道簡單的題目
問題一:要求不清晰,借書和還書這個要求不明確
問題二:
select b.books_name,c.user_name
from lease a, books b, user c
where a.books_ID=b.books_ID and a.user_ID=c.user_ID
and loan_date between '2006-07-02' and '2007-07-05'
問題三:
select b.books_name,c.user_name
from lease a, books b, user c
where a.books_ID=b.books_ID and a.user_ID=c.user_ID
and YEAR(loan_date) = '2006'
6. Mysql|數據分析搞懂這15道SQL題目筆試就穩了
現有以下三張表
寫出SQL語句:查詢產品名稱=「A葯品」,在北京醫院2018~2019兩年的銷售「金額」,排除兩年銷售金額總和>1000000的醫院,要求查詢結果如下表。
寫出SQL語句,查詢題1的銷量表中2019年任意連續三個月銷售額都>0的醫院。
返回欄位:HospitalId,SalesMonth(2019年銷量>0的所有月份,逗號隔開)
以下是微信聊天記錄表
寫出SQL語句:按月統計2020年的微信回復率
發送次數 = 一組好友在一個自然天內的所有發送記錄計為1次。
回復率計算公式 =(發送次數在兩個自然天內被回復)/發送次數*100%
未完。。。 持續更新中。。。
7. SQL程序設計題目幫忙做下。
以前做過這類的期末設計,我找找
8. SQL練習題
一 學生 – 課程資料庫
1 查詢 7號課程沒有考試成績的學生學號
select sno from sc where cno=』7』 and grade is not null
2 查詢 7號課程成績在90分以上或60分以下的學生學號
select sno from sc where grade>90 or grade<60
3 查詢課程名以「數據」兩個字開頭的所有課程的課程號和課程名。
Select cno,cname from c where cname like 『數據%』
4 查詢每個學生所有課程的平均成績,輸出學生學號、平均成績
select sno,avg(grade) from sc group by sno
5 查詢每門課程的選修人數,輸出課程號、選修人數。
Select cno,count(*) from sc group by cno
6 查詢選修 7號課程的學生的學號、姓名、性別。
Select s.sno, sname,ssex from s , sc where s.sno=sc.sno and cno = 『7』
7 查詢選修7號課程學生的平均年齡。
Select avg(sage) from s , sc where s.sno=sc.sno and cno = 『7』
8 查詢由30名以上學生選修的課程號。
Select sno from sc group by cno having count(*)>30
9 查詢至今沒有考試不及格的學生學號
a: select sno from s where sno not in ( select sno from sc where grade<60 )
b: select sno from sc group by sno having min(grade)>=60
二
1 找出選修課程號為 C2 的學生學號與成績。
Select sno,grade from sc where cno=』C2』
2 找出選修課程號為C4 的學生學號與姓名。
Select s.sno , sname from s,sc where s.sno=sc.sno and cno=』C4』
3 找出選修課程名為 Maths 的學生學號與姓名。
Select s.sno ,sname from s,sc,c
where s.sno=sc.sno and c.cno=sc.cno and cname = 『Maths』
4找出選修課程號為C2或C4 的學生學號。
Select distinct sno from sc where cno in (『C2』,』C4』)
或: Select distinct sno from sc where cno=』C2』 or cno =』C4』
5找出選修課程號為C2和C4 的學生學號。
Select sno from sc where cno =』C2』 and sno in (
select sno from sc where cno = 『C4』 )
6 找出不學C2課程的學生姓名和年齡
select sname , sage from s where sno not in ( select sno from sc where cno=』C2』 )
或:
select sname , sage from s where not exists ( select * from sc where sc.sno=s.sno and cno=』C2』 )
7 找出選修了資料庫課程的所有學生姓名。(與3同)
Select s.sno ,sname from s,sc,c
where s.sno=sc.sno and c.cno=sc.cno and cname = 『資料庫』
8 找出資料庫課程不及格的女生姓名
嵌套:
select sname from s where ssex = 『女』 and sno in ( select sno from sc where grade<60 and cno in ( select cno from c where cname=』資料庫』) )
連接:
Select sname from s,sc,c
where s.sno=sc.sno and c.cno=sc.cno and ssex=』女』 and cname = 『資料庫』 and grade<60
9 找出各門課程的平均成績,輸出課程名和平均成績
select cname , avg(grade) from sc , c where c.cno =sc.cno group by sc.cno
10找出各個學生的平均成績,輸出學生姓名和平均成績
select sname , avg(grade) from s , sc where s.sno=sc.sno group by sc.sno
11 找出至少有30個學生選修的課程名
select cname from c where cno in ( select cno from sc group by cno having count(*)>=30 )
12 找出選修了不少於3門課程的學生姓名。
Select sname from s where sno in ( select sno from sc group by sno having count(*)>=3)
13 找出各門課程的成績均不低於90分的學生姓名。
Select sname from s where sno not in ( select sno from sc where grade<90)
14* 找出資料庫課程成績不低於該門課程平均分的學生姓名。
Select sname from s where sno in (
Select sno from sc , c where sc.cno=c.cno and cname=』資料庫』 and
Grade > (Select avg(grade) from sc , c where sc.cno=c.cno and cname=』資料庫』 ) )
15 找出各個系科男女學生的平均年齡和人數。
Select sdept,ssex , avg(sage) , count(*) from s
Group by sdept , ssex
16 找出計算機系(JSJ)課程平均分最高的學生學號和姓名。
Select sc.sno , sname from s, sc where s.sno=sc.sno and sdept=』JSJ』
Group by sc.sno Having avg(grade) =
( Select top 1 avg(grade) from sc, s where s.sno=sc.sno and sdept=』JSJ』
group by sc.sno order by avg(grade) DESC )
三 客戶 – 商品資料庫中包括3按各表:KH,FP,YWY
1 查詢工資在 1000 到3000 元之間的男性業務員的姓名和辦公室編號。
Select Yname , Ono from YWY where salary between 1000 and 3000 and Ysex=』男』
2 查詢各個辦公室的業務員人數,輸出辦公室編號和對應的人數。
Select Ono , count(*) from YWY group by Ono
3 查詢每個客戶在2002年5月購買的總金額,輸出客戶號和相應的總金額。
Select Kno,sum(Fmoney) from FP where fdate between 『2002.5.1』 and 『2002.5.31』
Group by Kno
4 查詢2002年5月購買次數超過5次的所有客戶號,且按客戶號升序排序。
Select Kno from FP where fdate between 『2002.5.1』 and 『2002.5.31』
Group by Kno having count(*)>5
Order by Kno ASC
5 查詢各辦公室男性和女性業務員的平均工資。
Select Ono,Ysex ,avg(salary) from YWY group by Ono , Ysex
6 查詢2002年5月曾經在王海亮業務員手中購買過商品的客戶號、客戶姓名、聯系電話。
Select Kno,Kname,phone from KH where Kno in (
Select kno from FP where fdate between 『2002.5.1』 and 『2002.5.31』 and
Yno=(select Yno from YWY where Yname = 『王海亮』 )
7 查詢所有工資比1538號業務員高的業務員的編號、姓名、工資。
Select yno ,Yname, salary from YWY where salary >
( Select salary from YWY where Yno=』1538』 )
8 查詢所有與1538號業務員在同一個辦公室的其他業務員的編號、姓名。
Select Yno , Yname from YWY where Yno<>』1538』 and Ono in (
Select Ono from YWY where Yno=』1538』 )
9 查詢銷售總金額最高的業務員的編號。
Select Yno from FP Group By Yno Having sum(Fmoney) =
(Select top 1 sum(Fmoney) from FP group by Yno ORDER BY sum(Fmoney) DESC)
10 查詢所有業務員的編號、姓名、工資以及工資比他高的其他業務員的平均工資。
利用自身連接
Select y1.Yno ,y1.Yname ,y1.salary , avg( y2. salary) from YWY y1 , YWY y2
Where y1.Yno<>y2.Yno and y1.salary < y2.salary
Group by y1.Yno
Sno salary sno salary
1 100 1 100
2 120 2 120
3 90 3 90
4 110 4 110
四 某中學資料庫中由一張表:
學生選課表:由板及代碼、班內學號、姓名、科目、成績五個屬性組成,關系模式為
SC(BJDM,BNXH,XSXM,KM,CJ) ,其中(BJDM,BNXH)為主碼。
說明:每個學生每門科目存放一個記錄,科目有「語文」、「數學」、「外語」三門。
1 找出每個班級的班級代碼、學生人數、平均成績。
Select BJDM,count(*) ,avg(CJ) from SC group by BJDM
2 找出每個學生的班級代碼、學生姓名、考試科目數、總成績。
Select BJDM,XSXM,count(*) , sum(CJ) from SC
Group by BNXH
3 輸出一張表格,每位學生對應一條記錄,包括:班級代碼、姓名、語文成績、數學成績、外語成績。
方法一:利用視圖
create view v1 (bjdm,xsxm, yw,sx,wy ) AS
select bjdm , xsxm , cj , 0,0 from sc where km=』語文』
union
select bjdm , xsxm , 0 , cj,0 from sc where km=』數學』
union
select bjdm , xsxm , 0,0,cj from sc where km=』外語』
select bjdm, xsxm , sum(yw) as 語文, sum(sx) as 數學, sum(wy) as 外語 from v1 group by bjdm, xsxm
方法二:自身連接
select a.bjdm,a.xsxm , a.km,a.cj , b.km,b.cj , c.km,c.cj from sc a , sc b , sc c
where a.bjdm=b.bjdm and a.bnxh= b.bnxh and b.bjdm=c.bjdm and b.bnxh= c.bnxh
and a.km=』語文』 and b.km=』數學』 and c.km=』外語』
方法三:利用存儲過程(略)
4 輸出一張表格:由成績低於60分的每位學生對應一條記錄,包括欄位:班級代碼、姓名、最低成績。
Select bjdm,xsxm ,min(CJ) from sc where grade<60 group by bjdm,xsxm
5輸出一張表格:由成績低於60分的每位學生對應一條記錄,包括欄位:班級代碼、姓名、最高成績、平均成績。
得到平均成績:create view V1 (bjdm,bnxh ,avg_cj) AS
select bjdm,bnxh ,avg(cj) from sc where bjdm , bnxh
select sc.bjdm,sc.xsxm ,max(cj) , avg_cj from sc , V1
where sc.bjdm=v1.bjdm and sc.bnxh=V1.bnxh and cj<60
group by sc.bjdm,sc.xsxm
6輸出一張表格:所有成績不低於60分的每位學生對應一條記錄,包括欄位:班級代碼、姓名、平均成績。
select bjdm, xsxm , avg(cj) from sc
where sno not in ( select sno from sc where grade<60)
group by bjdm, xsxm
7輸出一張表格:每一位學生對應一條記錄,包括欄位:班級代碼、姓名、去掉一個最低分後的平均成績。
方法一:
得到每個學生的最低分:
create view V1 (bjdm,bnxh ,min_cj) as
select bjdm,bnxh,min(cj) from sc group by bjdm,bnxh
select sc.bjdm,sc.xsxm , avg(cj) from sc , v1
where sc.bjdm=v1.bjdm and sc.bnxh=v1.bnxh and sc.cj <> v1.min_cj
group by bjdm,bnxh
方法二:
select sc.bjdm,sc.xsxm , ( sum(cj) – min(cj) ) / count(*) from sc
group by bjdm , bnxh
8輸出一張表格:每門科目對應一條記錄,包括欄位:科目、去掉一個最低分後的平均成績。
方法一:
得到每門課的最低分:
create view V1 ( km, min_cj) as
select km,min(cj) from sc group by km
select sc.km , avg(cj) from sc , v1
where sc.km=v1.km and sc.cj <> v1.min_cj
group by sc.km
方法二:
select km , (sum( cj) – min(cj) )/count(*) from sc
group by km
補充9:輸出表格:每門科目對應一條記錄,包括欄位:科目、去掉一個最低分和最高分後的平均成績。
select km , (sum( cj) – min(cj) – max(cj) )/count(*) from sc
group by km
五 資料庫存放著某高校1990年以來英語四、六級的考試情況,且規定:
1 英語四、六級考試每年分別在6月和12月舉行二次;
2 四級沒有通過的學生不能報考六級;
3 某一級的考試只要沒有通過可以反復參加考試;
4 某一級的考試一旦通過就不能再報考同級的考試;
5 允許報了名但不參加考試。
該資料庫中有二張表,相應的關系模式如下:
學生表:S(Sno, Sname, Ssex, Sage, Sdept),其中Sno為主碼。
考試表:E(Sno, Year, Month, Level, Grade),學號、年、月、級別、成績。
其中(Sno, Year, Month)為主碼。
1. 找出各次四級和六級考試的參考人數和平均成績(報了名但沒有參加考試的不作統計)
select year , month,level ,count(*) , avg(grade)
group by year,month , level
2. 找出各次四級考試中平均分最高的系科(報了名但沒有參加考試的不作統計)。
A: Select sdept from s , e where s.sno=e.sno
Where level=4
Group by sdept
Having avg(grade)>=ALL(
Select avg(grade) from s , e where s.sno=e.sno where level=4 Group by sdept )
B: Select top 1 sdept from s , e where s.sno=e.sno
Where level=4
Group by sdept
Order by (avg(grade) desc
3. 找出已經通過英語六級考試的學生的學號、姓名和性別(用連接方法做)
select s.sno,sname,ssex from s,e
where s.sno=e.sno and level=6 and grade>=60
4. 找出在同一年中四、六級考試都參加了的學生的學號
1) select sno from E
where (level=4 and grade>=60) or level=6
group by year having count(*)>=2
2) select sno from E X where level=4 and grade>=60 and exists (
select * from E Y where Y.sno=X.sno and year=X.year and level=6 )
5. 找出只參加一次考試就通過了英語六級考試的學生的學號
select sno from E
where level=6
group by sno
having count(*)=1 錯,想想為何?
1) select sno from E
where level=6
group by sno
having count(*)=1 and max(grade)>=60
2) select sno from E where level=6 and grade>=60 and sno in (
select sno from E where level=6 group by sno having count(*)=1)
6. 找出至今沒有通過英語四級考試的學生的學號(應包括至今還沒有參加過考試或者是參加了但還沒有通過兩種)
select sno from E where level=4
group by sno
having max(grade)<60
Union
Select sno from s where sno not in( select sno from E)
7. 找出英語六級考試中合格人數最少的考試年份和月份(有並列的都要列出,用一句SQL語句)。
Select year , month From E
Where level = 6 and grade>=60
Group by year , month
Having count(*) <=all
(Select count(*) from E where level=6 and grade>=60 group by year , month )
我是從「上海全鼎軟體學院」畢業的————————