MySQL初學中的探索-實操練習題及自己的答案
題目:新建一個數據庫ClassManager,包括四個表:學生表(Student)、課程表(Course)、成績表(Score)以及教師資訊表(Teacher)。四個表的結構分別如表1-1的表(一)表(四)所示,資料如表1-2的表(一)表(四)所示。用#並完成相關題目。 一.表1-1資料庫的表結構 表(一)Student (學生表) 屬性名 資料型別 可否為空 含 義 Sno varchar (20) 否 學號 Sname varchar (20) 否 學生姓名 Ssex varchar (20) 否 學生性別 Sbirthday datetime 可 學生出生年月 Class varchar (20) 可 學生所在班級 表(二)Course(課程表) 屬性名 資料型別 可否為空 含 義 Cno varchar (20) 否 課程號 Cname varchar (20) 否 課程名稱 Tno varchar (20) 否 教工編號 表(三)Score(成績表) 屬性名 資料型別 可否為空 含 義 Sno varchar (20) 否 學號 Cno varchar (20) 否 課程號 Degree Decimal(4,1) 可 成績 表(四)Teacher(教師表) 屬性名 資料型別 可否為空 含 義 Tno varchar (20) 否 教工編號 Tname varchar (20) 否 教工姓名 Tsex varchar (20) 否 教工性別 Tbirthday datetime 可 教工出生年月 Prof varchar (20) 可 職稱 Depart varchar (20) 否 教工所在部門
二.表1-2資料庫中的資料 表(一)Student Sno Sname Ssex Sbirthday class 108 曾華 男 1977-09-01 95033 105 匡明 男 1975-10-02 95031 107 王麗 女 1976-01-23 95033 101 李軍 男 1976-02-20 95033 109 王芳 女 1975-02-10 95031 103 陸君 男 1974-06-03 95031 表(二)Course Cno Cname Tno 3-105 計算機導論 825 3-245 作業系統 804 6-166 數位電路 856 9-888 高等數學 831 表(三)Score Sno Cno Degree 103 3-245 86 105 3-245 75 109 3-245 68 103 3-105 92 105 3-105 88 109 3-105 76 101 3-105 64 107 3-105 91 108 3-105 78 101 6-166 85 107 6-166 79 108 6-166 81 表(四)Teacher Tno Tname Tsex Tbirthday Prof Depart 804 李誠 男 1958-12-02 副教授 計算機系 856 張旭 男 1969-03-12 講師 電子工程系 825 王萍 女 1972-05-05 助教 計算機系 831 劉冰 女 1977-08-14 助教 電子工程系
三.完成以下操作 0.根據上述題目和表格,建立相應資料庫,建立相應表結構,並插入給定資料
- 查詢Student表中的所有記錄的Sname、Ssex和Class列。
- 查詢教師所有的單位即不重複的Depart列。
- 查詢Student表的所有記錄。
- 查詢Score表中成績在60到80之間的所有記錄。
- 查詢Score表中成績為85,86或88的記錄。
- 查詢Student表中“95031”班或性別為“女”的同學記錄。
- 以Class降序查詢Student表的所有記錄。
- 以Cno升序、Degree降序查詢Score表的所有記錄。
- 查詢“95031”班的學生人數。
- 查詢Score表中的最高分的學生學號和課程號。(子查詢或者排序)
- 查詢每門課的平均成績。
- 查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。
- 查詢分數大於70,小於90的Sno列。
- 查詢所有學生的Sname、Cno和Degree列。
- 查詢所有學生的Sno、Cname和Degree列。
- 查詢所有學生的Sname、Cname和Degree列。
- 查詢“95033”班學生的平均分。
- 查詢選修“3-105”課程的成績高於“109”號同學成績的所有同學的記錄。
- 查詢成績高於學號為“109”、課程號為“3-105”的成績的所有記錄。
- 查詢和學號為108、101的同學同年出生的所有學生的Sno、Sname和Sbirthday列。(使用year()方法對生日欄位求年份)
- 查詢“張旭“教師任課的學生成績。
- 查詢選修某課程的同學人數多於5人的教師姓名。
- 查詢95033班和95031班全體學生的記錄。
- 查詢存在有85分以上成績的課程Cno。
- 查詢出“計算機系“教師所教課程的成績表。
- 查詢“計算機系”與“電子工程系“不同職稱的教師的Tname和Prof。
- 查詢所有教師和同學的name、sex和birthday。
- 查詢所有“女”教師和“女”同學的name、sex和birthday。
- 查詢成績比該課程平均成績低的同學的成績表。
- 查詢所有任課教師的Tname和Depart。
- 查詢所有未講課的教師的Tname和Depart。
- 查詢至少有2名男生的班號。
- 查詢Student表中不姓“王”的同學記錄。
- 查詢Student表中每個學生的姓名和年齡。(使用year()方法對日期欄位)
- 查詢Student表中最大和最小的Sbirthday日期值。
- 以班號和年齡從大到小的順序查詢Student表中的全部記錄。
- 查詢“男”教師及其所上的課程。
- 查詢最高分同學的Sno、Cno和Degree列。
- 查詢和“李軍”同性別的所有同學的Sname。
- 查詢和“李軍”同性別並同班的同學Sname。
- 查詢所有選修“計算機導論”課程的“男”同學的成績表。
Answer:
create database ClassManager; use ClassManager;
create table student ( sno varchar(20) not null comment ‘學號’, sname varchar(20) not null, ssex varchar(20) not null, sbirthday datetime, class varchar(20) );
create table course ( cno varchar(20) not null, cname varchar(20) not null, tno varchar(20) not null );
create table score ( sno varchar(20) not null, cno varchar(20) not null, degree decimal(4,1) );
create table teacher ( tno varchar(20) not null, tname varchar(20) not null, tsex varchar(20) not null, tbirthday datetime, prof varchar(20) , depart varchar(20) not null );
insert into student (sno, sname, ssex, sbirthday, class) values (‘108’, ‘曾華’,‘男’,‘1977-09-01’,‘95033’); insert into student (sno, sname, ssex, sbirthday, class) values (‘105’, ‘匡明’,‘男’,‘1975-10-02’,‘95031’); insert into student (sno, sname, ssex, sbirthday, class) values (‘107’, ‘王麗’,‘女’,‘1976-01-23’,‘95033’); insert into student (sno, sname, ssex, sbirthday, class) values (‘101’, ‘李軍’,‘男’,‘1976-02-20’,‘95033’); insert into student (sno, sname, ssex, sbirthday, class) values (‘109’, ‘王芳’,‘女’,‘1975-02-10’,‘95031’); insert into student (sno, sname, ssex, sbirthday, class) values (‘103’, ‘陸君’,‘男’,‘1974-06-03’,‘95031’);
insert into course (cno, cname, tno) values (‘3-105’, ‘計算機導論’, ‘825’); insert into course (cno, cname, tno) values (‘3-245’, ‘作業系統’, ‘804’); insert into course (cno, cname, tno) values (‘6-166’, ‘數位電路’, ‘856’); insert into course (cno, cname, tno) values (‘9-888’, ‘高等數學’, ‘831’);
insert into score (sno, cno, degree) values (‘103’, ‘3-245’, ‘86’); insert into score (sno, cno, degree) values (‘105’, ‘3-245’, ‘75’); insert into score (sno, cno, degree) values (‘109’, ‘3-245’, ‘68’); insert into score (sno, cno, degree) values (‘103’, ‘3-105’, ‘92’); insert into score (sno, cno, degree) values (‘105’, ‘3-105’, ‘88’); insert into score (sno, cno, degree) values (‘109’, ‘3-105’, ‘76’); insert into score (sno, cno, degree) values (‘101’, ‘3-105’, ‘64’); insert into score (sno, cno, degree) values (‘107’, ‘3-105’, ‘91’); insert into score (sno, cno, degree) values (‘108’, ‘3-105’, ‘78’); insert into score (sno, cno, degree) values (‘101’, ‘6-166’, ‘85’); insert into score (sno, cno, degree) values (‘107’, ‘6-166’, ‘79’); insert into score (sno, cno, degree) values (‘108’, ‘6-166’, ‘81’);
insert into teacher (tno, tname, tsex, tbirthday, prof, depart) values (‘804’, ‘李誠’,‘男’,‘1958-12-02’,‘副教授’,‘計算機系’); insert into teacher (tno, tname, tsex, tbirthday, prof, depart) values (‘856’, ‘張旭’,‘男’,‘1969-03-12’,‘講師’,‘電子工程系’); insert into teacher (tno, tname, tsex, tbirthday, prof, depart) values (‘825’, ‘王萍’,‘女’,‘1972-05-05’,‘助教’,‘計算機系’); insert into teacher (tno, tname, tsex, tbirthday, prof, depart) values (‘831’, ‘劉冰’,‘女’,‘1977-08-14’,‘助教’,‘電子工程系’);
select sname, ssex, class from student; – 1
select distinct depart from teacher; – 2
select * from student; – 3
select * from score where degree between 60 and 80; – 4
select * from score where degree in(85, 86, 88); – 5
select * from student where class=‘95031’ or Ssex=‘女’; – 6
select * from student order by class desc; – 7
select * from score order by cno asc, degree desc; – 8
select count(*) as 學生人數-- as可省略 from student where class=‘95031’; – 9
select sno, cno from score order by degree desc limit 1; – 10
select sno, cno from score s1 where degree = ( select max(degree) from score s2 where s1.cno = s2.cno ) – 10.1
select cno, avg(degree) from score group by cno; – 11;
select cno, avg(degree) from score where cno like ‘3%’ group by cno having count(cno)>5; – 12
select sno, degree from score where degree>70 and degree<90; – 13
select sname, cno, degree from student st left join score sc on st.sno = sc.sno; – 14
select sno, cname, degree from score sc inner join course c on sc.cno = c.cno; – 15
select sname, cname, degree from student st left join score sc on st.sno = sc.sno left join course c on sc.cno = c.cno; – 16
select cno, avg(degree) from student st inner join score sc on st.sno = sc.Sno where st.class = ‘95033’ group by cno ; – 17
select * from student st inner join score sc on st.sno = sc.Sno where sc.cno = ‘3-105’ and sc.degree > (select degree from score sc where sc.sno = ‘109’ and sc.cno = ‘3-105’); – 18
select * from score where degree > (select degree from score where sno = ‘109’ and cno = ‘3-105’); – 19
select sno, sname, sbirthday from student st where year(Sbirthday) in (select year(sbirthday)from student where sno in(‘108’ , ‘101’)); – 20
select degree from teacher t inner join course co on t.tno = co.tno inner join score sc on co.cno = sc.cno where tname = ‘張旭’; – 21
select tname from score sc inner join course co on sc.cno = co.Cno inner join teacher t on t.tno = co.Tno group by sc.cno having count(sc.cno) > 5; – 22
select * from student st where class in(‘95033’, ‘95031’); – 23
select cno from score where degree > 85 group by cno; – 24
select degree from teacher t inner join course co on t.tno = co.tno inner join score sc on co.cno = sc.cno where depart = ‘計算機系’; – 25
select tname, prof from teacher where depart in (‘計算機系’,‘電子工程系’) group by prof having count(prof) = 1; – 26
select tname, prof from teacher where depart = ‘計算機系’ and prof not in ( select prof from teacher where depart = ‘電子工程系’ ); – 26.1
select sname as name, ssex as sex, sbirthday as birthday from( select sname, ssex, sbirthday from student union ALL select tname, tsex, tbirthday from teacher )as ts; – 27
select sname as name, ssex as sex, sbirthday as birthday from( select sname, ssex, sbirthday from student where ssex = ‘女’ union ALL select tname, tsex, tbirthday from teacher where tsex = ‘女’ )as ts; – 28
– 取出首條記錄的a.cno用作過濾,子查詢裡以avg函式得到該課程的平均分,主查詢以分數比對平均分,滿足條件保留否則拋棄(degree小於平均分的留下); – 跟著判斷父查詢表下一條記錄,處理過程相同,最後合併各次判斷結果從而的到最終結果。 select * from score sc1 where sc1.degree<( select avg(degree) from score sc2 where sc1.cno=sc2.cno); – 29
select tname, depart from teacher t left join course co on t.tno = co.Tno left join score sc on sc.cno = co.cno group by tname; – 30
select tname, depart from teacher t inner join course co on t.tno = co.Tno where tname not in (select tname from teacher t inner join course co on t.tno = co.Tno inner join score sc on sc.cno = co.cno group by tname); – 31
select class from student group by class having COUNT(Ssex = ‘男’) > 1; – 32
select * from student where sname not like ‘王%’; – 33
select sname, (year(NOW()) - year(Sbirthday))as age from student; – 34
select max(Sbirthday), min(Sbirthday) from student; – 35
select * from student order by class desc, Sbirthday asc; – 36
select tname, cname from teacher t inner join course c on c.tno = t.tno where t.Tsex = ‘男’; – 37
select sno, cno, degree from score sc1 where degree = ( select max(degree) from score sc2 where sc1.cno = sc2.cno ); – 38
select sname from student where ssex in (select ssex from student where sname = ‘李軍’); – 39
select sname from student where ssex in (select ssex from student where sname = ‘李軍’) and class in (select class from student where sname = ‘李軍’); – 40
select degree from course co inner join score sc on co.cno = sc.cno inner join student st on st.sno = sc.sno where cname = ‘計算機導論’ and ssex = ‘男’; – 41