1. 程式人生 > >mysql經典面試題

mysql經典面試題

sel tin per sql 得出 本周 公式 第三題 to_days

數據庫優化:
這個優化法則歸納為5個層次:
1、 減少數據訪問(減少磁盤訪問)
2、 返回更少數據(減少網絡傳輸或磁盤訪問)
3、 減少交互次數(減少網絡傳輸)
4、 減少服務器CPU開銷(減少CPU及內存開銷)
5、 利用更多資源(增加資源)

我們一般在什麽字段上建索引?
這是一個非常復雜的話題,需要對業務及數據充分分析後再能得出結果。主鍵及外鍵通常都要有索引,其它需要建索引的字段應滿足以下條件:
1、字段出現在查詢條件中,並且查詢條件可以使用索引;
2、語句執行頻率高,一天會有幾千次以上;
3、通過字段條件可篩選的記錄集很小,那數據篩選比例是多少才適合?
這個沒有固定值,需要根據表數據量來評估,以下是經驗公式,可用於快速評估:
小表(記錄數小於10000行的表):篩選比例<10%;
大表:(篩選返回記錄數)<(表總記錄數*單條記錄長度)/10000/16
單條記錄長度≈字段平均內容長度之和+字段數*2

-- 當前時間
select CURTIME();
-- 當前日期
select NOW();
-- 查詢當天數據
select * from 表名 where TO_DAYS(時間字段)=TO_DAYS(NOW());
-- 查詢本周的數據
SELECT * FROM 表名 WHERE YEARWE--EK(date_format(時間字段,‘%Y-%m-%d‘)) = YEARWEEK(now());
-- 最近7天
SELECT * FROM 表名 where date_sub(curdate(), INTERVAL 7 DAY) <= date (時間字段);
-- 查詢本月的數據
select * from 表名 where DATE_FORMAT(時間字段,‘%Y%m‘) =DATE_FORMAT(CURDATE(),‘%Y%m‘);
-- 上一月
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , ‘%Y%m‘ ) , date_format( 時間字段名, ‘%Y%m‘ ) ) =1

/*-----------------------------------------第一大題--------------------------------------------------*/

S(SO,SN,SD,SA) 學號,學員姓名,所屬單位,學員年齡

C(CO,CN)課程編號,課程名稱

SC_1(SO,CO,G)學號,所選修的課程編號,學習成績

/*1 查詢選修課程名為‘稅收基礎的學員學號和姓名’*/
--方法一:連接查詢

SELECT s.SO,s.SN FROM S s,C c,sc_1 sc
where c.CN=‘稅收基礎‘
and s.so=sc.SO and sc.co=c.CO;

--方法二:嵌套查詢
SELECT so,sn from s
where so in(
SELECT so from sc_1 where co in (
SELECT co from c where cn=‘稅收基礎‘
)
)

/*2 查詢選修課程編號為‘c002’學員姓名和所屬單位’*/
--方法一:連接查詢
SELECT s.SN,s.SD from s s,c c,sc_1 sc
where c.co=‘c002‘
and c.co=sc.CO and s.so=sc.so;

--方法二:嵌套查詢
SELECT sn,sd from s
where so in(
SELECT so from sc_1 where co IN (
SELECT co from c
where co=‘c002‘
)
)

/*3 查詢不選修課程編號為‘c005的學員姓名跟所屬單位’*/
SELECT sn,sd from s
where so not IN
(select so from sc_1 WHERE co=‘C005‘);

/*4 查詢選修全部課程學員姓名和所屬單位’*/
SELECT sn,sd from s
where so in
(
SELECT so from sc_1
GROUP BY so
HAVING COUNT(co)=(SELECT COUNT(co) FROM c)
);

/*5 查詢選修了課程的學員人數*/
SELECT COUNT(DISTINCT so) as 選修課程人數 from sc_1;

/*6 查新選修課程大於5門的學員姓名跟所屬單位*/
SELECT sn,sd from s
where so IN
(SELECT so from sc_1
GROUP BY so
HAVING COUNT(so)>5
);

/*-----------------------------------------第二大題--------------------------------------------------*/

S(SNO,SNAME)學生關系,SNO學號,SNAME姓名

C(CNO,CHAME,CTEACHER)課程關系,CNO課程號,CHAME課程名,任課老師

SC(SNO,CNO,SCGRADE)選課關系,SCGRADE成績

/*第一題 找出沒有選修過李明老師的課程的所有學生*/
SELECT s.sname FROM student s
where sno not IN
(SELECT DISTINCT(sc1.cno) from class c,sc sc1,student s
where c.cno=sc1.cno and sc1.sno=s.sno
and c.cteacher=‘李明‘
);


/*第二題 列出有兩門以上不及格課程的學生姓名跟平均成績*/
select s.sname as 學生姓名,avg(ssc.scgrade) as 平均成績 from student s
,sc ssc,(select sno from sc
where scgrade<60
GROUP BY sno
HAVING COUNT((cno)>=2)) a
where s.sno=a.sno and ssc.sno=a.sno
GROUP BY s.sno,s.sname;


/*第三題 列出既學過1號課程又學過2號課程的學生姓名*/
Select s.sno,s.sname FROM student s
where s.sno in
(
Select sc2.sno FROM sc sc2,class c2 Where sc2.cno=c2.cno AND c2.cno IN(‘1‘,‘2‘)
GROUP BY sc2.sno
HAVING COUNT(DISTINCT c2.cno)=2
);

/*第四題 列出1號課成績比2號該門課成績高的所有學生學號*/
SELECT sc1.sno as 學生編號 from sc sc1,sc sc2 where
sc1.cno=‘1‘
and sc2.cno=‘2‘
and sc1.sno=sc2.sno
and sc1.scgrade>sc2.scgrade;

/*第五 列出1號課成績比2號同學課成績高的所有學生學號以及1號跟2號課成績*/

SELECT sc1.sno as 學生編號,sc1.scgrade as 語文成績,sc2.scgrade as 數學成績 from sc sc1,sc sc2 where
sc1.cno=‘1‘
and sc2.cno=‘2‘
and sc1.sno=sc2.sno
and sc1.scgrade>sc2.scgrade

mysql經典面試題