多表聯合查詢練習


面試的時候被多表查詢考倒了,回來練習一下,以作備用。

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', '三八');
View Code

就四張表。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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM