1.根據emp數據表編寫SQL查出所有name重復的記錄且按照age降序。
+--------+--------+-----+
| emp_no | name | age |
+--------+--------+-----+
| 1001 | 小明 | 18 |
| 1002 | 王強 | 20 |
| 1003 | 小雪 | 20 |
| 1004 | 小明 | 19 |
+--------+--------+-----+
select emp_no, name,age from emp where name in ( select t.name from ( select name,count(name) as num from emp group by name having num > 1 )t ) order by age desc;
(測試數據添加SQL見文章末尾)
1.學生表
Student(SID,Sname,Sage,Ssex) --SID 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別
2.課程表
Course(CID,Cname,TID) --CID --課程編號,Cname 課程名稱,TID 教師編號
3.教師表
Teacher(TID,Tname) --TID 教師編號,Tname 教師姓名
4.成績表
SC(SID,CID,score) --SID 學生編號,CID 課程編號,score 分數
1. 平均成績及格了的學生
select avg(score) avg_score,SID from SC group by SID having avg_score >= 60;
2. 查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
select a.SID,a.Sname,b.avg_score from Student a join ( select avg(score) avg_score,SID from SC group by SID having avg_score >= 60 ) b on a.SID = b.SID;
3. 查詢學過"張三"老師授課的同學的信息
select distinct a.SId,a.Sname,a.Sage,a.Ssex from Student a join SC b on a.SID = b.SID join Course c on c.CID = b.CID join Teacher d on d.TID = c.TID where d.Tname = '張三';
4. 查詢學過編號為"01"並且也學過編號為"02"的課程的同學的信息
--方法1
select m.* from Student m where SID in ( select SID from ( select distinct SID from SC where CID = '01' union all select distinct SID from SC where CID = '02' ) t group by SID having count(1) = 2 ) order by m.SID
--方法2
select Student.* from Student join SC on Student.SID = SC.SID where CID = '02' and exists (select 1 from SC sc_2 where sc_2.SID = SC.SID and sc_2.CID='01');
--方法3
select Student.* from Student join SC on Student.SID = SC.SID where CID = '01' and exists (select 1 from SC sc_2 where sc_2.SID = SC.SID and sc_2.CID='02');
5. 查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息
select Student.* from Student join SC on Student.SID = SC.SID where CID = '01' and not exists (select 1 from SC sc_2 where sc_2.SID = SC.SID and sc_2.CID='02');
6. 查詢兩門及其以上不及格課程的同學的學號
select SID from SC where score < 60 group by SID having count(1) >= 2;
7. 查詢兩門及其以上不及格課程的同學的學號、姓名及其平均成績
select Student.SID,Student.sname,avg(SC.score) as avg_score from student join SC on student.SID = SC.SID where Student.SID in(select SID from SC where score < 60 group by SID having count(1) >= 2) group by Student.SID,Student.sname;
查詢沒有學全所有課程的同學的信息
select Student.* from Student left join SC on Student.SID = SC.SID group by Student.SID , Student.Sname , Student.Sage , Student.Ssex having count(CID) < (select count(CID) from Course)
附錄》添加測試數據
1.學生表
create table Student(SID varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10));
insert into Student values('01' , '趙雷' , '1990-01-01' , '男');
insert into Student values('02' , '錢電' , '1990-12-21' , '男');
insert into Student values('03' , '孫風' , '1990-05-20' , '男');
insert into Student values('04' , '李雲' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吳蘭' , '1992-03-01' , '女');
insert into Student values('07' , '鄭竹' , '1989-07-01' , '女');
insert into Student values('08' , '王菊' , '1990-01-20' , '女');
2.課程表
create table Course(CID varchar(10),Cname nvarchar(10),TID varchar(10));
insert into Course values('01' , '語文' , '02');
insert into Course values('02' , '數學' , '01');
insert into Course values('03' , '英語' , '03');
3.教師表
create table Teacher(TID varchar(10),Tname nvarchar(10));
insert into Teacher values('01' , '張三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
4.成績表
create table SC(SID varchar(10),CID varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);