MySQL(查询练习)

本文详细介绍了一个包含学生、课程、教师及成绩的MySQL数据库结构,并通过具体实例演示了各种SQL查询技巧,包括数据检索、统计、排序及聚合函数的使用。

MySQL查询练习

数据准备

学生表

create table student(
	sno varchar(20) primary key,
	sname varchar(20) not null,
	ssex varchar(10) not null,
	sbirthday datetime,
	class varchar(20)
);

课程表

create table course(
	cno varchar(20) primary key,
	cname varchar(20) not null,
	tno varchar(20) not null,
	foreign key(tno) references teacher(tno)
);

教师表

create table teacher(
	tno varchar(20) primary key,
	tname varchar(20) not null,
	tsex varchar(20) not null,
	tbirthday datetime,
	prof varchar(20) not null,
	depart varchar(20) not null
);

成绩表

create table score(
	sno varchar(20) ,
	cno varchar(20) not null,
	degree decimal,
	foreign key(sno) references student(sno),
	foreign key(cno) references course(cno),
	primary key(sno,cno)
	
);

添加数据

--学生表
insert into student values('101','曾华','男','1977-09-01','95033');
insert into student values('102','匡明','男','1975-06-03','95031');
insert into student values('103','王丽','女','1976-09-01','95033');
insert into student values('104','王尼玛','男','1974-03-03','95031');
insert into student values('105','张全蛋','男','1976-02-01','95031');
insert into student values('106','赵铁柱','男','1975-11-06','95033');
--教师表
insert into teacher values('804','李成','男','1958-09-06','副教授','计算机系');
insert into teacher values('856','张旭','男','1969-04-23','讲师','电子工程系');
insert into teacher values('825','王萍','女','1972-05-05','助教','计算机系');
insert into teacher values('831','刘冰','女','1977-08-14','助教','电子工程系');
--课程表
insert into course values('3-105','计算机导论','825');
insert into course values('3-245','操作系统','804');
insert into course values('6-166','数字电路','856');
insert into course values('9-888','高等数学','831')
--成绩表
insert into score values('104','3-245','86');
insert into score values('105','3-245','76');
insert into score values('106','3-245','82');
insert into score values('104','3-105','91');
insert into score values('105','3-105','81');
insert into score values('106','3-105','79');
insert into score values('104','6-166','92');
insert into score values('105','6-166','84');
insert into score values('106','6-166','73');
insert into score values('104','9-888','98');
insert into score values('105','9-888','85');
insert into score values('106','9-888','77');

查询练习

1.查询student表所有记录

select *from student;

2.查询student表特定字段

select name,ssex,class from student;

3.查询教师所有单位即不重复的depart列
关键字distinct排除重复

select distinct depart from teacher;

4.查询score中成绩在60-80的
查询区间between … and …
使用运算符 < 和 >

select * from score where degree between 60 and 80;
select * from score where degree > 60 and degree<80;

5.查询成绩为85,86和88的,表示或者关系查询 关键字in

select *  from score where degree in (85,86,88);

6.查询student中"95031"班或者性别为"女"的同学记录,不同字段的或者关系查询 关键字or

select *  from student where class='95031' or ssex='女';

7.以class降序查询class表的记录 升序(默认)降序(desc) order by 关键字

select * from student order by class desc;

8.以cno升序,degree降序查询score表 升序降序共同查询

select * from score order by cno asc,degree desc;

9.统计’95031’班的人数,统计 count关键字

select * from student where class='95031';

10.统计score表中的最高分的学生号和课程号
子查询 先挑选出最高分,再用where找出最高分的学号和课程号

select sno,cno from score where degree=(select max(degree) from score);

--排序的做法
select sno,cno,degree from score order by degree desc limit 0,1
--0表示从第0条才是,1表示查询一条

11.查询每门课的平均成绩 avg,group by分组(同属某一类)

select avg(degree) from score where cno='3-105';
select cno,avg(degree) from score  group by cno;

12.查询score中至少有两名学生选修的并且以3开头的平均分数
1. WHERE 条件后面是不能跟聚合函数的,因为WHERE执行顺序大于聚合函数,如果需要用聚合函数作为过滤条件则用HAVING
2. HAVING通常是对分组以后的数据进行筛选,所以一般都是在使用GROUP BY 或者聚合函数后使用,而WHERE是在分组前对数据进行过滤

至少有两名:'count’计数
以三开头:like '3%'模糊查询

select cno,avg(degree),count(*) from score  group by cno having count(cno)>=2 and cno like'3%';
create table sailors( sid char(10) primary key, sname char(20), rating int, age int); create table boats( bid char(10) primary key, bname char(20), color char(10)); create table reserves( sid char(10) , bid char(10) , rdate date, primary key(sid,bid,rdate), foreign key (sid) references sailors(sid) on delete cascade, foreign key (bid) references boats(bid) on delete cascade); insert into sailors(sid,sname,rating,age) values("22","dustin",7,45) ("29","brustus",1,33), ("31","lubber",8,56), ("32","andy",8,26), ("58","rusty",10,35), ("64","horatio",7,35), ("71","zorba",10,35), ("74","horatio",9,35), ("85","art",3,26), ("86","john",1,17), ("95","bob",3,64), ("96","frodo",3,26), ("98","tom",3,17); insert into boats(bid,bname,color) values("101","A","red"), ("102","B","green"), ("103","C","blue"), ("104","D","white") ("105","E","red"), ("106","F","blue"), ("107","G","green"); insert into reserves(sid,bid,rdata) values("22","101","2010-01-08"), ("22","102","2010-01-09"), ("29","103","2010-01-09"), ("31","102","2010-02-11"), ("22","104","2010-03-08"), ("22","103","2010-03-10"), ("32","105","2010-03-11"), ("32","106","2010-03-18"), ("32","102","2010-03-19"), ("58","104","2010-03-20"), ("64","105","2010-03-20"), ("95","101","2010-04-02"), ("85","102","2010-04-05"), ("22","101","2010-04-07"), ("22","105","2010-05-01"), ("22","106","2010-06-18"), ("22","107","2010-07-09"), ("31","106","2010-08-06"), ("32","105","2010-08-06"), ("29","104","2010-08-07"), ("64","103","2010-09-05"), ("58","102","2010-09-09"), ("64","104","2010-11-03"), ("64","105","2010-11-04"), ("31","106","2010-12-0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值