資料庫面試題 ,無聊整一下
資料庫試題
1.現有學生、課程、成績、教師四張表。包含以下資訊:
Student(S#,Sname,Sage,Ssex)學生表。
S#:學號;Sname:學生姓名;Sage:學生年齡;Ssex:學生性別。
Course(C#,Cname,T#)課程表。
C#:課程編號;Cname:課程名稱;T#:教師編號。
SC(S#,C#,score)成績表。
S#:學號;C#:課程編號;score:成績。
Teacher(T#,Tname)教室表。
T#:教師編號;Tname:教師名字。
完成以下題目:
1)查詢“111”課程比“112”課程成績高的所有學生的學號;
2)查詢平均成績大於60分的同學的學號和平均成績;
3)查詢姓“李”的老師的個數;
4)查詢各科成績最高分和最低分:以如下形式顯示:課程ID,最高分,最低分。
5)刪除‘2’同學的‘111’課程的成績。
這邊我沒有那麼全去建表, 以下是剛才在大概7-8分鐘內,以最快速的想到啥方法就去用啥方法解決上面的問題。
首先1) 我看到題目,先想到這個用臨時表,一張 111的, 一張112的,再通過學號關聯起來查詢。
所以,有了以下的程式碼思路:
select 學生表.學生號 ,成績表.成績 from 學生表,成績表,課程表 where 三表各種等值關聯 and 課程識別號=‘111’;
select 學生表.學生號 ,成績表.成績 from 學生表,成績表,課程表 where 三表各種等值關聯 and 課程識別號=‘112’;
然後同時作為臨時表,
select 學生表.學生號 from (select 學生表.學生號 ,成績表.成績 from 學生表,成績表,課程表 where 三表各種等值關聯 and 課程識別號=‘111’)a,(select 學生表.學生號 ,成績表.成績 from 學生表,成績表,課程表 where 三表各種等值關聯 and 課程識別號=‘112’)b where a.學生號=b.學生號 and a.score>b.score;
我後面補了2個表,給後面幾題,這樣為了大家看思路更清晰,
學生表:
成績表:
不要在意這些表的欄位名什麼的,單純為了配合講解思路。
好了2)一看到題目裡面的‘和’字,我第一時間還是想到分層解題,也就是繼續用臨時表。
所以有了以下程式碼:
先把平均成績,學生號,計算出來,
SELECT score.stuid,avg(score) as tlscore from world.score, student where student.stuid=score.stuid group by score.stuid
然後當作臨時表組合下,
select stuid,tlscore from(SELECT score.stuid,avg(score) as tlscore from world.score, student where student.stuid=score.stuid group by score.stuid)a where tlscore>60;
3)這個簡單寫,模糊查詢,姓為前,後面模糊
我查的姓張的,
SELECT count(*) FROM world.student where name like '張%'
4)這麼單純考的就是max,min,
select subname ,max(score),min(score) from score group by subname
我的表裡面沒建課程表和成績表關聯,直接用的課程名,意思理會就行,多個關聯而已。
5)這個有點意思,字面上說是刪除某個課程成績, 但是其他記錄應該不刪除,那我這用update了,
update score set score=null where subname='pe' and stuid='3'
好了,今天無聊看別人部落格看的的什麼公司面試題,就跟著做了下。 就這樣吧。
最後 mysql查詢語句實現分頁查詢, 翻頁。
MySQL資料庫實現分頁查詢的SQL語句寫法!
一:分頁需求:
客戶端通過傳遞start(頁碼),limit(每頁顯示的條數)兩個引數去分頁查詢資料庫表中的資料,那我們知道MySql資料庫提供了分頁的函式limit m,n,但是該函式的用法和我們的需求不一樣,所以就需要我們根據實際情況去改寫適合我們自己的分頁語句,具體的分析如下:
比如:
查詢第1條到第10條的資料的sql是:select * from table limit 0,10; ->對應我們的需求就是查詢第一頁的資料:select * from table limit (1-1)*10,10;
查詢第10條到第20條的資料的sql是:select * from table limit 10,20; ->對應我們的需求就是查詢第二頁的資料:select * from table limit (2-1)*10,10;
查詢第20條到第30條的資料的sql是:select * from table limit 20,30; ->對應我們的需求就是查詢第三頁的資料:select * from table limit (3-1)*10,10;
二:通過上面的分析,可以得出符合我們自己需求的分頁sql格式是:
select * from table limit (start-1)*limit,limit; 其中start是頁碼,limit是每頁顯示的條數。
這個start limit,後面結合前端頁面傳過來給後端,後端給mysql呼叫就行。 思路是這樣就好。 實際開發,前後端都有外掛或者別人寫好的程式碼, 分頁很簡單的。