MySQL数据库原理习题---SQL连接查询

SQL连接查询

1)查询每个学生及其选课情况

Select student.*,sc.*
From student, sc
Where student.sno=sc.sno;

2)分别用左外连接和右外连接实现查询所有学生信息及其选修成绩的情况(包括没有选课的学生信息)

Select student.*,cno,grade
From student left outer join sc on (student.sno=sc.sno);

3)查询选修2号课程且成绩在90分以上的学生姓名和系别信息

Select sname,sdept 
From student,sc
Where student.sno=sc.sno and cno='002' and grade>90;

4)查询每个学生的学号、姓名、选修的课程名及成绩

Select student.sno,sname,cname,grade
From student,sc,course
Where student.sno=sc.sno and course.cno=sc.cno;

5)查询计算机系的学生所学课程的课程名。

Select distinct cname 
From course,sc,student
Where sc.sno=student.sno and sc.cno=course.cno and Student.sdept='cs';

6)查询姓张的同学学的课程的课程名称。

Select distinct cname 
From student,sc,course
Where student.sno=sc.sno and sc.cno=course.cno and sname like '张%';

7)查询至少选修两门课程的学生姓名

Select sname 
From student
Where sno in
	(Select sno 
	From sc group by sno having count(*)>=2);

或者

SELECT Sname,COUNT(SC.Sno) 
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno
GROUP BY SC.Sno HAVING count(SC.Sno)>=2;

8)查询课程平均成绩大于80的课程名称

Select cname 
From course 
Where cno in
    (Select cno 
    From sc group by cno having avg(grade)>=80);

9)查询选修人数最多的课程名称

Create view v_cnors(cno,xkrs) as 
Select cno,count(*) From sc  group by cno;
Select cname From course where cno in(
Select cno From sc group by cno 
having count(*)= (select max(xkrs) From v_cnors));

或者

SELECT Cname,COUNT(SC.Sno) AS 人数 
FROM Course,SC 
WHERE Course.Cno=SC.Cno
HAVING COUNT(SC.Cno)>= ALL (SELECT COUNT(SC.Cno) 
FROM SC GROUP BY SC.Cno);

10)查询计算机系的学生选修课程中选修人数前三名的课程名称

Select cname,count(*) 
From course,sc,student
Where student.sno=sc.sno and course.cno=sc.cno and Sdept='cs'
Group by cname  Order by count(*) desc
Limit 3;

11)查询每门课程的先修课程名称和学分信息

Select c1.cpno,c2.cname,c2.credit
From course c1,course c2
Where c1.cpno=c2.cno;

12)分别用左外连接和右外连接实现查询所有课程信息和其先修课程信息(包括没有先修课程的课程信息)

Select c1.*,c2.*
From course c1 left outer join course c2 on c1.cpno=c2.cno;
SELECT Course.*,SC.* 
FROM Course RIGHT OUTER JOIN SC ON SC.Cno=Course.Cno;

13)查询每门课程的间接先修课的信息(先修课程的先修课程)

Select c1.cno,c2.cpno 
From course c1,course c2
Where c1.cpno=c2.cno;

14)查询有不及格的学生姓名和所在系

Select sname,sdept 
From student
Where sno in (select distinct sno from sc where grade<60);

或者

SELECT DISTINCT Sname,Sdept 
FROM Student,SC 
WHERE Student.Sno=SC.Sno AND(Grade<60 or Grade IS NULL);

15)查询所有成绩为优秀(大于90分)的学生姓名

Select sname 
From student
Where sno in(select sno from sc group by sno having min(grade)>=90);

或者

SELECT DISTINCT Sname 
FROM Student,SC 
WHERE Student.Sno=SC.Sno AND(Grade>90 or Grade IS NULL);

16)增加一个表格成绩等级表,表里记录成绩等级编号和每个等级对应的最低成绩和最高成绩

Create table dengji
(id tinyint primary key,
Lowgrade int not null,
Highgrade int not null)
Insert into dengji values (1,90,100)
Insert into dengji values(2,80,89)
Insert into dengji values(3,70,79)
Insert into dengji values(4,60,69)
Insert into dengji values(5,0,59);

或者

CREATE TABLE Glevel(
ID TINYINT PRIMARY KEY,
Lowgrade INT NOT NULL,
Highgrade INT NOT NULL);
Insert INTO Glevel VALUES(1,90,100),(2,80,89),(3,70,79),(4,60,69),(5,0,59);

17)对每个成绩等级进行计数(按等级进行分组)

Select id,count(*) 
From dengji,sc
Where grade between lowgrade and highgrade
Group by id;

18)查询每个学生每个成绩等级有多少计数

Select sno,id,count(*) 
From sc,dengji
Where grade between lowgrade and highgrade
Group by sno,id;

19)查询每门课程每个成绩等级有多少计数

Select cno,id,count(*) 
From sc,dengji
Where grade between lowgrade and highgrade
Group by cno,id;

20)查询每个学生选修成绩的对应等级

Select  sno,grade,id 
From sc,dengji
Where grade between lowgrade and highgrade
Group by sno,grade,id;

21)查询选修成绩等级是5的课程名称和学生姓名

Select distinct cname,sname,sc.*
From student,course,sc,dengji
Where student.sno=sc.sno and course.cno=sc.cno and grade between lowgrade and highgrade and id=5;
  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来为您解答MySQLSQL语句练习题(一)。 1. 创建一个名为“test”的数据库。 ``` CREATE DATABASE test; ``` 2. 在“test”数据库中创建一个名为“student”的数据表,包含以下字段:学号(id,整型,主键),姓名(name,字符串类型,不超过20个字符),年龄(age,整型),性别(gender,字符串类型,不超过10个字符),成绩(score,整型)。 ``` USE test; CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(20), age INT, gender VARCHAR(10), score INT ); ``` 3. 插入以下数据到“student”数据表中: ``` INSERT INTO student VALUES (1, 'Tom', 18, 'male', 80), (2, 'Jerry', 19, 'male', 85), (3, 'Lily', 18, 'female', 90), (4, 'Lucy', 20, 'female', 95); ``` 4. 查询“student”数据表中所有学生的姓名和年龄。 ``` SELECT name, age FROM student; ``` 5. 查询“student”数据表中所有学生的学号、姓名和成绩,并按成绩从高到低排序。 ``` SELECT id, name, score FROM student ORDER BY score DESC; ``` 6. 查询“student”数据表中所有学生的平均年龄。 ``` SELECT AVG(age) FROM student; ``` 7. 查询“student”数据表中成绩大于等于90分的学生姓名和成绩。 ``` SELECT name, score FROM student WHERE score >= 90; ``` 8. 将“student”数据表中学号为3的学生成绩更新为100分。 ``` UPDATE student SET score = 100 WHERE id = 3; ``` 9. 删除“student”数据表中年龄小于19岁的学生。 ``` DELETE FROM student WHERE age < 19; ``` 以上是MySQLSQL语句练习题(一)的解答,希望能对您有所帮助。如果您有任何疑问或需要进一步的帮助,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

把你藏起来!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值