面試的時候被多表查詢考倒了,回來練習一下,以作備用。
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `course` -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cid` varchar(10) NOT NULL COMMENT '課程編號', `cname` varchar(10) NOT NULL COMMENT '課程名稱', `tid` varchar(10) NOT NULL COMMENT '教師編號', PRIMARY KEY (`cid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of course -- ---------------------------- INSERT INTO `course` VALUES ('01', '語文', '02'); INSERT INTO `course` VALUES ('02', '數學', '01'); INSERT INTO `course` VALUES ('03', '英語', '03'); INSERT INTO `course` VALUES ('04', '物理', '04'); -- ---------------------------- -- Table structure for `score` -- ---------------------------- DROP TABLE IF EXISTS `score`; CREATE TABLE `score` ( `sid` varchar(10) NOT NULL COMMENT '學生編號', `cid` varchar(10) NOT NULL COMMENT '課程編號', `score` decimal(18,1) NOT NULL COMMENT '成績' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of score -- ---------------------------- INSERT INTO `score` VALUES ('01', '01', '80.0'); INSERT INTO `score` VALUES ('01', '02', '90.0'); INSERT INTO `score` VALUES ('01', '03', '99.0'); INSERT INTO `score` VALUES ('02', '01', '70.0'); INSERT INTO `score` VALUES ('02', '02', '60.0'); INSERT INTO `score` VALUES ('02', '03', '80.0'); INSERT INTO `score` VALUES ('03', '01', '80.0'); INSERT INTO `score` VALUES ('03', '02', '80.0'); INSERT INTO `score` VALUES ('03', '03', '80.0'); INSERT INTO `score` VALUES ('04', '01', '50.0'); INSERT INTO `score` VALUES ('04', '02', '30.0'); INSERT INTO `score` VALUES ('04', '03', '20.0'); INSERT INTO `score` VALUES ('05', '01', '76.0'); INSERT INTO `score` VALUES ('05', '02', '87.0'); INSERT INTO `score` VALUES ('06', '01', '31.0'); INSERT INTO `score` VALUES ('06', '03', '34.0'); INSERT INTO `score` VALUES ('07', '02', '89.0'); INSERT INTO `score` VALUES ('07', '03', '98.0'); -- ---------------------------- -- Table structure for `student` -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sid` varchar(10) NOT NULL COMMENT '學生學號', `sname` varchar(10) NOT NULL COMMENT '學生姓名', `sage` datetime NOT NULL COMMENT '學生年齡', `ssex` varchar(10) NOT NULL COMMENT '學生性別', PRIMARY KEY (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('01', '趙雷', '1990-01-01 00:00:00', '男'); INSERT INTO `student` VALUES ('02', '錢電', '1990-12-21 00:00:00', '男'); INSERT INTO `student` VALUES ('03', '孫風', '1990-05-06 00:00:00', '男'); INSERT INTO `student` VALUES ('04', '李雲', '1990-08-06 00:00:00', '男'); INSERT INTO `student` VALUES ('05', '周梅', '1991-12-01 00:00:00', '女'); INSERT INTO `student` VALUES ('06', '吳蘭', '1992-03-01 00:00:00', '女'); INSERT INTO `student` VALUES ('07', '鄭竹', '1989-07-01 00:00:00', '女'); INSERT INTO `student` VALUES ('08', '王菊', '1990-01-20 00:00:00', '女'); -- ---------------------------- -- Table structure for `teacher` -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `tid` varchar(10) NOT NULL COMMENT '教師編號', `tname` varchar(10) DEFAULT NULL COMMENT '教師姓名', PRIMARY KEY (`tid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES ('01', '張三'); INSERT INTO `teacher` VALUES ('02', '李四'); INSERT INTO `teacher` VALUES ('03', '王五'); INSERT INTO `teacher` VALUES ('04', '三八');
就四張表。course,student,teacher,score。



。
1、查詢"01"課程比"02"課程成績高的學生的信息及課程分數
1.1、查詢同時存在"01"課程和"02"課程的情況
select a.* , b.score,c.score from student a , score b , score c where a.sid = b.sid and a.sid = c.sid and b.cid = '01' and c.cid = '02' and b.score > c.score
1.2、查詢同時存在"01"課程和"02"課程的情況和存在"01"課程但可能不存在"02"課程 的情況(不存在時顯示為 null)
select a.* , b.score ,c.score from student a left join score b on a.sid = b.sid and b.cid = '01' left join score c on a.sid = c.sid and c.cid = '02' where b.score>IFNULL(c.score,0)
2、查詢"01"課程比"02"課程成績低的學生的信息及課程分數
3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
select a.sid , a.sname , cast(avg(b.score) as decimal(18,2)) avg_score from Student a , score b where a.sid = b.sid group by a.sid , a.sname having cast(avg(b.score) as decimal(18,2)) >= 60 order by a.sid
--group by 和having 解釋:前提必須了解sql語言中一種特殊的函數:聚集函數,
--例如SUM, COUNT, MAX, AVG等。這些函數和其它函數的根本區別就是它們一般作用在多條記錄上。
--WHERE關鍵字在使用集合函數時不能使用,所以在集合函數中加上了HAVING來起到測試查詢結果是否符合條件的作用。
--需要注意說明:當同時含有where子句、group by 子句 、having子句及聚集函數時,執行順序如下:
--執行where子句查找符合條件的數據;
--使用group by 子句對數據進行分組;對group by 子句形成的組運行聚集函數計算每一組的值;最后用having 子句去掉不符合條件的組。
--having 子句中的每一個元素也必須出現在select列表中。有些數據庫例外,如oracle.
--having子句和where子句都可以用來設定限制條件以使查詢結果滿足一定的條件限制。
--having子句限制的是組,而不是行。where子句中不能使用聚集函數,而having子句中可以。
--cast(avg(b.score) as decimal(18,2))解釋:Cast(字段名 as 轉換的類型 )
4、查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績(注意成績為null的學生,使用ifnull()函數)
select a.sid , a.Sname , IFNULL(cast(avg(b.score) as decimal(18,2)),0) avg_score from Student a left join score b on a.sid = b.sid group by a.sid , a.sname having ifnull(cast(avg(b.score) as decimal(18,2)),0) < 60 order by a.Sid
5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績
select a.sid AS 學生編號, a.Sname as 學生姓名, count(b.cid) 選課總數, sum(score) 所有課程的總成績 from Student a left join score b on a.sid = b.sid group by a.sid,a.Sname order by a.sid
