sql查询练习

# 创建数据库school
CREATE DATABASE school;

# 创建表student
DROP TABLE IF EXISTS student;
CREATE TABLE student(
	`s_id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT comment '学生编号' , 
	`s_name` VARCHAR(4) NOT NULL comment '学生姓名',
	`s_sex` VARCHAR(2) NOT NULL comment '学生性别', 
	`s_birthday` DATETIME comment '学生生日',
	`class` VARCHAR(5) comment '学生班级',
	PRIMARY KEY(`s_id`),
	KEY s_name(`s_name`)
)engine=innodb DEFAULT CHARSET=utf8 comment '学生表';

# 创建表course
CREATE TABLE course(
	c_id VARCHAR(5) NOT NULL comment '课程编号', 
	c_name VARCHAR(10) NOT NULL comment '课程名称', 
	t_id VARCHAR(10) NOT NULL comment '授课老师'
)engine=innodb DEFAULT CHARSET=utf8 comment '课程表';

# 创建表score 
CREATE TABLE score (
	s_id VARCHAR(3) NOT NULL comment '学生编号', 
	c_id VARCHAR(5) NOT NULL comment '课程编号', 
	degree NUMERIC(10, 1) NOT NULL comment '学分'
)engine=innodb DEFAULT CHARSET=utf8 comment '分数表';

# 创建表teacher
CREATE TABLE teacher (
	t_id VARCHAR(3) NOT NULL comment '教师编号', 
	t_name VARCHAR(4) NOT NULL comment '教师名称', 
	t_sex VARCHAR(2) NOT NULL comment '教师性别', 
	t_birthday DATETIME NOT NULL comment '教师生日',
	prof VARCHAR(6) comment '职称', 
	depart VARCHAR(10) NOT NULL comment '院系'
)engine=innodb DEFAULT CHARSET=utf8 comment '教师表';

# 向各表导入数据
INSERT INTO student (s_id,s_name,s_sex,s_birthday,class) VALUES 
(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);


INSERT INTO course(c_id,c_name,t_id) VALUES 
('3-105' ,'计算机导论',825),
('3-245' ,'操作系统' ,804),
('6-166' ,'数据电路' ,856),
('9-888' ,'高等数学' ,100);

INSERT INTO score(s_id,c_id,degree) VALUES
(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-106',79),
(108,'6-166',81);


INSERT INTO teacher(t_id,t_name,t_sex,t_birthday,prof,depart) VALUES 
(804,'李诚','男','1958-12-02','副教授','计算机系'),
(856,'张旭','男','1969-03-12','讲师','电子工程系'),
(825,'王萍','女','1972-05-05','助教','计算机系'),
(831,'刘冰','女','1977-08-14','助教','电子工程系');






#sql题目(基础)
1、 查询student表中的所有记录的s_name、s_sex和class列。 
	#无别名
	select s_name,s_sex,class from student;
	#有别名
	select s_name as 学生姓名, s_sex as 学生性别, class as 学生班级 from student;


2、 查询教师所有的单位即不重复的depart列。 
	select distinct depart from teacher;
	

3、 查询student表的所有记录。 
	select * from student;
	

4、 查询score表中成绩在60到80之间的所有记录。
	select * from score where degree>=60 and degree<=80;
	
	
5、 查询score表中成绩为85,86或88的记录。 
	#方法1
	select * from score where degree=85 or degree=86 or degree=88;
	
	#方法2
	select * from score where degree in (85,86,88);
	
	
6、 查询student表中“95031”班或性别为“女”的同学记录。 
	select * from student where class=95031 or s_sex='女';
	

7、 以class降序查询student表的所有记录。 
	select * from student order by class desc;
	
	
8、 以c_id升序、degree降序查询score表的所有记录。
	select * from score order by c_id asc,degree desc;
 
9、 查询“95031”班的学生人数。 
	select count(*) as 95031班学生人数 from student where class=95031;
	

10、查询score表中的最高分的学生学号和课程号。 
	select s_id,c_id from score where degree=(select MAX(degree) from score);
	

11、查询‘3-105’号课程的平均分。 
	select AVG(degree) from score where c_id='3-105';
	

12、查询score表中至少有5名学生选修的并以3开头的课程的平均分数。
	select AVG(degree) as 平均分,c_id as 课程 from score where c_id like '3%' group by c_id having count(s_id)>=5;
 
 
13、查询最低分大于70,最高分小于90的s_id列。 
	select s_id from score where degree>70 and degree <90;


14、查询所有学生的s_name、c_id和degree列。 
	select student.s_name,score.c_id,score.degree from student left join score on student.s_id=score.s_id;
	

15、查询所有学生的s_id、c_name和degree列。 
	select student.s_id,course.c_name,score.degree from student
	join score  on student.s_id=score.s_id
	left join course on score.c_id=course.c_id;


16、查询所有学生的s_name、c_name和degree列。 
	select student.s_name,course.c_name,score.degree from student
	join score  on student.s_id=score.s_id
	left join course on score.c_id=course.c_id;


17、查询“95033”班所选课程的平均分。 
	select AVG(degree) from score 
	join student on score.s_id=student.s_id where class=95033;

18、假设使用如下命令建立了一个grade表: 
	create table grade(
		low varchar(3) not null comment 'low',
		upp varchar(3) not null comment 'upp',
		rank varchar(3) not null comment 'rank'
    )engine=innodb DEFAULT CHARSET=utf8 comment '等级表';
	
	insert into grade values(90,100,'A'); 
	insert into grade values(80,89,'B'); 
	insert into grade values(70,79,'C'); 
	insert into grade values(60,69,'D'); 
	insert into grade values(0,59,'E');
	
	现查询所有同学的s_id、c_id和rank列?
	
	select score.s_id,score.c_id,grade.rank from score,grade 
	where score.degree>=grade.low and score.degree<=grade.upp;
	
	
19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
	#**all的意思是“对于子查询返回的列中的所有值,如果比较结果为true,则返回true”
	select * from score where c_id='3-105' and degree>all(select degree from score where s_id=109 and c_id='3-105');


20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。 
	select * from score group by degree having count(c_id)>1;
	select * from score 
	where degree not in 
	(select MAX(degree) from score group by s_id)
	and s_id in
	(select s_id from score group by s_id having count(s_id)>1);
	


21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
	select * from score 
	where degree>(select degree from score where s_id=109 and c_id='3-105');
	
 
22、查询和学号为108的同学同年出生的所有学生的s_id、s_name和s_birthday列。 
	select s_id,s_name,s_birthday from student 
	where YEAR(s_birthday)=(select YEAR(s_birthday) from student where s_id=108);
	

23、查询“张旭“教师任课的学生成绩。 
	#方法1
	select s.s_id,s.degree from score s 
	join course c on s.c_id=c.c_id
	left join teacher t on c.t_id=t.t_id
	where t.t_name='张旭';
	
	#方法2
	select s.s_id,s.degree from score s
	join (teacher t,course c) on (s.c_id=c.c_id and c.t_id=t.t_id)
	where t.t_name='张旭';
	
	

24、查询选修某课程的同学人数多于5人的教师姓名。
	#方法1--通过子查询
	select teacher.t_name from teacher where t_id in 
	(select t_id from course where c_id in 
	(select c_id from score group by c_id having count(s_id)>5));
	
	#方法2--通过连接查询(推荐)
	select t.t_name from teacher t join 
	(course c,score s) on (t.t_id=c.t_id and c.c_id=s.c_id)
	group by s.c_id having count(s.s_id)>5;
 
25、查询95033班和95031班全体学生的记录。 
	select * from student where class in (95033,95031);
	

26、查询存在有85分以上成绩的课程c_id. 
	#方法1
	select distinct c_id from score where degree>85;
	
	#方法2
	select c_id from score group by c_id having MAX(degree)>85;

27、查询出“计算机系“教师所教课程的成绩表。
	select s.degree,t.depart from score s join 
	(course c,teacher t) on (s.c_id=c.c_id and c.t_id=t.t_id)
	where t.depart='计算机系';
 
 
28、查询“计算机系”与“电子工程系“不同职称的教师的t_name和prof。 
	select t_name,prof from teacher 
	where depart='计算机系' 
	and 
	prof not in (select prof from teacher where depart='电子工程系');

	
29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的c_id、s_id和degree,并按degree从高到低次序排序。 
	select * from score 
	where c_id='3-105'
	and 
	degree>any(select degree from score where c_id='3-245')
	order by degree desc;


30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的c_id、s_id和degree. 
	select * from score 
	where c_id='3-105'
	and 
	degree>all(select degree from score where c_id='3-245');


31、查询所有教师和同学的name、sex和birthday. 
	select s.s_name 名字,s.s_sex 性别,s.s_birthday 年龄 from student s
	union
	select t.t_name 名字,t.t_sex 性别,t.t_birthday 年龄 from teacher t;

	
32、查询所有“女”教师和“女”同学的name、sex和birthday. 
	select s.s_name 名字,s.s_sex 性别,s.s_birthday 年龄 from student s where s.s_sex='女'
	union
	select t.t_name 名字,t.t_sex 性别,t.t_birthday 年龄 from teacher t where t.t_sex='女';
	
	

33、查询成绩比该课程平均成绩低的同学的成绩表。 
	select * from score a 
	join (select c_id,AVG(degree) average from score group by c_id) b
	on a.c_id=b.c_id
	where a.degree<b.average;
	

34、查询所有任课教师的t_name和depart. (不是所有老师都教课)
	select t.t_name,t.depart from teacher t join course c on t.t_id=c.t_id;


35、查询所有未讲课的教师的t_name和depart. 
	#方法1--子查询
	select t_name,depart from teacher where t_id not in (select t_id from course);
	
	#方法2--exists
	select t_name,depart from teacher where not exists (select * from course where course.t_id=teacher.t_id);

	
36、查询至少有2名男生的班号。 
	select class from student where s_sex='男' group by class having count(s_sex)>1;
	

37、查询student表中不姓“王”的同学记录。 
	select * from student where s_name not like '王%';
	

38、查询student表中每个学生的姓名和年龄。 
	select s_name as 姓名,(YEAR(NOW())-YEAR(s_birthday)) as 年龄 from student;
	

39、查询student表中最大和最小的s_birthday日期值。 
	select DATE_FORMAT(MAX(s_birthday),'%Y-%d-%m') as 最大日期,DATE_FORMAT(MIN(s_birthday),'%Y-%d-%m') as 最小日期 from student;


40、以班号和年龄从大到小的顺序查询student表中的全部记录。 
	select * from student order by class desc,s_birthday desc;
	

41、查询“男”教师及其所上的课程。 
	select * from course c
	join teacher t on c.t_id=t.t_id
	where t.t_sex='男';


42、查询最高分同学的s_id、c_id和degree列。 
	select * from score order by degree desc limit 1;


	
43、查询和“李军”同性别的所有同学的s_name. 
	select s_name from student where s_sex=(select s_sex from student where s_name='李军');


	
44、查询和“李军”同性别并同班的同学s_name. 
	select s_name from student where (s_sex,class)=(select s_sex,class from student where s_name='李军');

	
	
45、查询所有选修“计算机导论”课程的“男”同学的成绩表。
	select sc.* from score sc
	join (student st,course c) on (sc.s_id=st.s_id and sc.c_id=c.c_id)
	where st.s_sex='男' and c.c_name='计算机导论';







 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是经典的51道SQL查询练习题: 1. 查询表中所有记录 ``` SELECT * FROM table_name; ``` 2. 查询表中的某些列 ``` SELECT column_name1, column_name2 FROM table_name; ``` 3. 查询表中不重复的某些列 ``` SELECT DISTINCT column_name1, column_name2 FROM table_name; ``` 4. 按条件查询表中的记录 ``` SELECT * FROM table_name WHERE condition; ``` 5. 对查询结果进行排序 ``` SELECT * FROM table_name ORDER BY column_name; ``` 6. 对查询结果进行倒序排序 ``` SELECT * FROM table_name ORDER BY column_name DESC; ``` 7. 查询表中前 n 条记录 ``` SELECT * FROM table_name LIMIT n; ``` 8. 查询表中第 m 条到第 n 条记录 ``` SELECT * FROM table_name LIMIT m, n-m+1; ``` 9. 对查询结果进行计数 ``` SELECT COUNT(*) FROM table_name; ``` 10. 对查询结果进行求和 ``` SELECT SUM(column_name) FROM table_name; ``` 11. 对查询结果进行平均值计算 ``` SELECT AVG(column_name) FROM table_name; ``` 12. 对查询结果进行最大值计算 ``` SELECT MAX(column_name) FROM table_name; ``` 13. 对查询结果进行最小值计算 ``` SELECT MIN(column_name) FROM table_name; ``` 14. 对查询结果进行分组计算 ``` SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name; ``` 15. 对查询结果进行分组计算并进行排序 ``` SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name ORDER BY COUNT(*) DESC; ``` 16. 对查询结果进行多条件查询 ``` SELECT * FROM table_name WHERE condition1 AND condition2; ``` 17. 对查询结果进行模糊查询 ``` SELECT * FROM table_name WHERE column_name LIKE '%keyword%'; ``` 18. 对查询结果进行通配符查询 ``` SELECT * FROM table_name WHERE column_name LIKE '_keyword'; ``` 19. 对查询结果进行多表查询 ``` SELECT * FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name; ``` 20. 对查询结果进行多表联合查询 ``` SELECT * FROM table_name1 UNION SELECT * FROM table_name2; ``` 21. 对查询结果进行多表交集查询 ``` SELECT * FROM table_name1 INTERSECT SELECT * FROM table_name2; ``` 22. 对查询结果进行多表差集查询 ``` SELECT * FROM table_name1 EXCEPT SELECT * FROM table_name2; ``` 23. 对查询结果进行子查询 ``` SELECT * FROM table_name WHERE column_name IN (SELECT column_name FROM another_table WHERE condition); ``` 24. 对查询结果进行连接查询 ``` SELECT * FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name; ``` 25. 对查询结果进行左连接查询 ``` SELECT * FROM table_name1 LEFT OUTER JOIN table_name2 ON table_name1.column_name=table_name2.column_name; ``` 26. 对查询结果进行右连接查询 ``` SELECT * FROM table_name1 RIGHT OUTER JOIN table_name2 ON table_name1.column_name=table_name2.column_name; ``` 27. 对查询结果进行全连接查询 ``` SELECT * FROM table_name1 FULL OUTER JOIN table_name2 ON table_name1.column_name=table_name2.column_name; ``` 28. 对查询结果进行自连接查询 ``` SELECT * FROM table_name t1, table_name t2 WHERE t1.column_name=t2.column_name; ``` 29. 对查询结果进行临时表查询 ``` CREATE TEMPORARY TABLE temp_table_name AS SELECT * FROM table_name WHERE condition; SELECT * FROM temp_table_name; ``` 30. 对查询结果进行自定义列名 ``` SELECT column_name1 AS name1, column_name2 AS name2 FROM table_name; ``` 31. 对查询结果进行多条件排序 ``` SELECT * FROM table_name ORDER BY column_name1 ASC, column_name2 DESC; ``` 32. 对查询结果进行多表连接查询并进行分组计算 ``` SELECT table_name1.column_name1, COUNT(*) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name GROUP BY table_name1.column_name1; ``` 33. 对查询结果进行多表连接查询并进行聚合计算 ``` SELECT table_name1.column_name1, SUM(table_name2.column_name2) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name GROUP BY table_name1.column_name1; ``` 34. 对查询结果进行多表连接查询并进行统计计算 ``` SELECT table_name1.column_name1, COUNT(*) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1; ``` 35. 对查询结果进行分页查询 ``` SELECT * FROM table_name LIMIT m, n-m+1; ``` 36. 对查询结果进行日期计算 ``` SELECT DATE_ADD(date_column, INTERVAL 1 MONTH) FROM table_name; ``` 37. 对查询结果进行日期格式化 ``` SELECT DATE_FORMAT(date_column, '%Y-%m-%d') FROM table_name; ``` 38. 对查询结果进行日期比较 ``` SELECT * FROM table_name WHERE DATEDIFF(date_column1, date_column2) > 30; ``` 39. 对查询结果进行日期范围查询 ``` SELECT * FROM table_name WHERE date_column BETWEEN 'start_date' AND 'end_date'; ``` 40. 对查询结果进行日期部分提取 ``` SELECT YEAR(date_column), MONTH(date_column), DAY(date_column) FROM table_name; ``` 41. 对查询结果进行多表连接查询并进行分组计算和排序 ``` SELECT table_name1.column_name1, COUNT(*) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name GROUP BY table_name1.column_name1 ORDER BY COUNT(*) DESC; ``` 42. 对查询结果进行多表连接查询并进行多条件排序 ``` SELECT * FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name ORDER BY table_name1.column_name1 ASC, table_name2.column_name2 DESC; ``` 43. 对查询结果进行多表连接查询并进行多条件分组计算和排序 ``` SELECT table_name1.column_name1, COUNT(*) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1 ORDER BY COUNT(*) DESC; ``` 44. 对查询结果进行多表连接查询并进行多条件聚合计算和排序 ``` SELECT table_name1.column_name1, SUM(table_name2.column_name2) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1 ORDER BY SUM(table_name2.column_name2) DESC; ``` 45. 对查询结果进行多表连接查询并进行多条件统计计算和排序 ``` SELECT table_name1.column_name1, COUNT(*) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1 ORDER BY COUNT(*) ASC; ``` 46. 对查询结果进行多表连接查询并进行多条件分组计算、聚合计算和排序 ``` SELECT table_name1.column_name1, COUNT(*), SUM(table_name2.column_name2) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1 ORDER BY COUNT(*) DESC, SUM(table_name2.column_name2) ASC; ``` 47. 对查询结果进行多表连接查询并进行多条件统计计算、聚合计算和排序 ``` SELECT table_name1.column_name1, COUNT(*), SUM(table_name2.column_name2) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1 ORDER BY COUNT(*) ASC, SUM(table_name2.column_name2) DESC; ``` 48. 对查询结果进行多表连接查询并进行多条件分组计算、聚合计算、统计计算和排序 ``` SELECT table_name1.column_name1, COUNT(*), SUM(table_name2.column_name2), AVG(table_name2.column_name2) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1 ORDER BY COUNT(*) DESC, SUM(table_name2.column_name2) ASC; ``` 49. 对查询结果进行多表连接查询并进行多条件分组计算、聚合计算、统计计算、排序和分页查询 ``` SELECT table_name1.column_name1, COUNT(*), SUM(table_name2.column_name2), AVG(table_name2.column_name2) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1 ORDER BY COUNT(*) DESC, SUM(table_name2.column_name2) ASC LIMIT m, n-m+1; ``` 50. 对查询结果进行多表连接查询并进行多条件分组计算、聚合计算、统计计算、排序、分页查询和列过滤 ``` SELECT table_name1.column_name1, COUNT(*), SUM(table_name2.column_name2), AVG(table_name2.column_name2) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1 ORDER BY COUNT(*) DESC, SUM(table_name2.column_name2) ASC LIMIT m, n-m+1 OFFSET k ROWS FETCH NEXT l ROWS ONLY; ``` 51. 对查询结果进行多表连接查询并进行多条件分组计算、聚合计算、统计计算、排序、分页查询、列过滤和条件过滤 ``` SELECT table_name1.column_name1, COUNT(*), SUM(table_name2.column_name2), AVG(table_name2.column_name2) FROM table_name1 JOIN table_name2 ON table_name1.column_name=table_name2.column_name WHERE condition GROUP BY table_name1.column_name1 HAVING COUNT(*) > 10 ORDER BY COUNT(*) DESC, SUM(table_name2.column_name2) ASC LIMIT m, n-m+1 OFFSET k ROWS FETCH NEXT l ROWS ONLY; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值