1、创建四个表供查询

(1)学生表—Student

学号

姓名

性别

出生年月日

所在班级

【语句】

> create table student(

-> sno varchar(20) primary key,

-> sname varchar(20) not null,

-> ssex varchar(20) not null,

-> sbirthday datetime,

-> class varchar(20));

(2)教师表—Teacher

教师编号

教师姓名

教师性别

出生年月日

职称

所在部门

【语句】

> create table teacher(

-> tno varchar(20) primary key,

-> tname varchar(20) not null,

-> tsex varchar(10) not null,

-> tbirthday datetime,

-> prof varchar(20) not null,

-> depart varchar(20) not null);

(3)课程表—Course

课程号

课程名称

教师编号

【语句】

>create table course(

-> cno varchar(20) primary key,

-> cname varchar(20) not null,

-> tno varchar(20) not null,

-> foreign key(tno) references teacher(tno));

(4)成绩表—Score

学号

课程号

成绩

【语句】

>create table score(

-> sno varchar(20) not null,

-> cno varchar(20) not null,

-> degree decimal,

-> foreign key(sno) references student(sno),

-> foreign key(cno) references course(cno),

->primary key(sno,cno));

2、往表中添加数据

//添加学生信息

insert into student values('101','曾华','男','1977-09-01','95033');

insert into student values('102','匡明','男','1975-10-02','95031');

insert into student values('103','王丽','女','1976-01-23','95033');

insert into student values('104','李军','男','1976-02-20','95033');

insert into student values('105','王芳','女','1975-02-10','95031');

insert into student values('106','陆君','男','1974-06-03','95031');

insert into student values('107','王尼玛','男','1976-02-20','95033');

insert into student values('108','张全蛋','男','1975-02-10','95031');

insert into student values('109','赵铁柱','男','1974-06-03','95031');

//添加教师表

insert into teacher values(804,'李成','男','1958-12-02','副教授','计算机系');

insert into teacher values(856,'张旭','男','1969-03-12','讲师','电子工程系');

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('103','3-105','92');

insert into score values('103','3-245','86');

insert into score values('103','6-166','85');

insert into score values('105','3-105','88');

insert into score values('105','3-245','75');

insert into score values('105','6-166','79');

insert into score values('109','3-105','76');

insert into score values('109','3-245','68');

insert into score values('109','6-166','81');

3、查询练习

(1)查询student 表中所有的记录

> select * from student;

(2)查询部分记录(student表中的sno、sname、ssex)

> select sno,sname,ssex from student;

(3)查询教师depart中不重复的记录    distinct

>select distinct depart from teacher;

(4)查询区间(查询score中成绩在60到90的记录)

——用between……and……

>select * from score where degree between 60 and 90;

——直接用运算符进行比较

> select * from score where degree > 60 and degree < 90;

(5)表示或者关系(查询同一字段中指定记录:查询score表中成绩为85,86,88的记录)

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

(6)表示或者关系(查询不同字段中指定记录:查询student表中“95031”班或者性别为“女” 的记录)

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

(7)升序、降序

——以class降序查询student表中所有记录

>select * from student order by class desc;

——以class升序查询student表中所有记录

> select * from student order by class;(默认为升序)

> select * from student order by class asc;(或加asc)

(8)以cno升序、degree降序查询score表

>select * from score order by cno asc,degree desc;(先以cno升序,相同的再以degree降序)

(9)查询“95031”班的学生人数

>select count(*) from student where class='95031';

(10)查询score表中最高分的学生的学生号和课程号(子查询)

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

【注】1、找到最高分

>select max(degree) from score

2、找到最高分学生的学生号和课程号

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

——通过排序取出记录

1、将成绩降序

>select sno,cno,degree from score order by degree desc;

2、取记录(用limit,这里取出了一条,当然可以改变取值范围)

>  select sno,cno,degree from score order by degree desc limit 0,1;

(11)查询每门课的平均成绩

—1—分步查询

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

> select cno,avg(degree) from score where cno ='3-245';

>select cno,avg(degree) from score where cno ='6-166';

>select cno,avg(degree) from score where cno ='9-888';

—2—分组实现  group by

>select cno,avg(degree) from score group by cno;

(12)查询score表中至少有两名学生选修的并以3开头的课程的平均分数

> select cno,avg(degree),count(*) from score group by cno having count(cno)>=2 and cno like'3%';

—分析—:

> select cno from score group by cno;    //分组

>having count(cno)>=2          //选修>=2

> cno like'3%'        //以3开头

>avg(degree)    //求平均值

>count(*)    //因为现在已经进行了分组,直接记录每个字段所有的人数

(13)查询分数大于70小于90的sno列

>select sno,degree from score where degree between 70 and 90;

或者

> select sno,degree from score where degree > 70 and degree < 90;

(14)查询所有学生的sname、cno、degree列(多表查询)

>select sname,cno,degree from student,score where student.sno=score.sno;

【注】这里因为两个表共同有sno的字段,所以可以对应起来将sname替换过来

(15)查询所有学生的sno、cname、degree

> select sno,cname,degree from score,course where score.cno=course.cno;

(16)查询所有学生的sname、cname、degree(3表查询)

>select sname,cname,degree from score,course,student where student.sno=score.sno and score.cno=course.cno;

【拓展】as可以进行重命名

>select sname,cname,degree,student.sno as stu_sno,score.sno,course.cno as cou_cno,score.cno from score,course,student where student.sno=score.sno and score.cno=course.cno;

 

通过上述多表查询的练习我们知道,就是通过表与表之间外键联系起来,实现不同表之间的拼接展示

(17)查询“95031” 班学生每门课的平均分

—分析—

<a>查询95031班

> select * from student where class='95031';

<b>利用子查询通过sto将score中95031班的学生筛选出来

>select * from score where sno in(select sno from student where class='95031');

<c>将课程分组,求出每门课平均分,并查询

select cno,avg(degree) from score where sno in(select sno from student where class='95031') group by cno;

(18)查询选修“3-105”课程同学的成绩高于“109”号同学“3-105”成绩的其他所有同学的记录

>select * from score where cno = '3-105' and degree > (select degree from score where cno='3-105'and sno='109');

—分析—

<a>  先找到选修3-105并且学号为109的同学的成绩

>select degree from score where cno='3-105'and sno='109'

<b>  再筛选选修3-105的所有同学

>select * from score where cno = '3-105'

<c>二者结合在一起

>select * from score where cno = '3-105' and degree > (select degree from score where cno='3-105'and sno='109');

(19)查询成绩高于学号为“109”、课程号为“3-105”的同学的成绩的其他同学的记录情况

> select * from score where degree > (select degree from score where cno='3-105'and sno='109');

只需要满足(18)中的一个条件即可

(20)查询和学号为108、109的同学同年出生的所有学生的sno、sname和sbirthday字段

> select sno,sname,sbirthday from student where year(sbirthday) in(select year(sbirthday) from student where sno in(108,109));

—分析—

<a>先将学号为108、109的同学的出生年份查询出来

>select year(sbirthday) from student where sno in(108,109);

<b> 再通过子查询查到与上述两位同学同年出生的学生的记录

> select sno,sname,sbirthday from student where year(sbirthday) in(select year(sbirthday) from student where sno in(108,109));

(21)查询张旭教师任课的学生的成绩(嵌套子查询)

>>select sname,degree from score,student where score.sno = student.sno and cno = (select cno from course where tno = (select tno from teacher where tname='张旭'));

—分析—

<a>在teacher中先将张旭的tno找到

>select tno from teacher where tname='张旭'

<b>通过tno在表course中找到所对应的cno

> select cno from course where tno = (select tno from teacher where tname='张旭');

<c>通过表sname与表student中的sno,将成绩与学生姓名对应起来在满足cno等于上述取出的cno情况下查询出来

>select sname,degree from score,student where score.sno = student.sno and cno = (select cno from course where tno = (select tno from teacher where tname='张旭'));

(22)查询选修某课程的同学人数多于5人的教师的姓名

【注】从score表中我们已知满足上述问题的没有,现在对score添加几条数据(注意前面的操作用的都是之前的score表)

——新添加的数据——

insert into score values('101','3-105','90');

insert into score values('102','3-105','91');

insert into score values('104','3-105','89');

——之前的数据如下——

insert into score values('103','3-105','92');

insert into score values('103','3-245','86');

insert into score values('103','6-166','85');

insert into score values('105','3-105','88');

insert into score values('105','3-245','75');

insert into score values('105','6-166','79');

insert into score values('109','3-105','76');

insert into score values('109','3-245','68');

insert into score values('109','6-166','81');

继续……

语句: select tname from teacher where tno =( select tno from course where cno =(select cno from score group by cno having count(cno) >5))

—分析—

<a>在表score中查询选修某课程的同学人数多于5人的课程号cno

>select cno from score group by cno having count(cno) >5;

<b>在表course中查询满足上述cno的教师的tno

> select tno from course where cno =(select cno from score group by cno having count(cno) >5);

<c>最后在teacher表中查询满足上述tno的老师的tname

> select tname from teacher where tno =( select tno from course where cno =(select cno from score group by cno having count(cno) >5))

(23)查询95033班和95031班全体学生的记录

【注】我们在这里又新加了一条数据

> insert into student values('110','张飞','男','1974-06-03','95038');

语句: select * from student where class in('95033','95031');

(24)查询存在有85分以上成绩的课程cno

>select cno,degree from score where degree >85;

(25)查出“计算机系”教师所教课程的成绩表

> select * from score where cno in (select cno from course where tno in(select tno from teacher where depart ="计算机系"));

—分析—

<a>先从teacher表中查询计算机系老师的tno

>select tno from teacher where depart ="计算机系";

<b>从表course中查询到tno满足上述要求的con

>select cno from course where tno in(select tno from teacher where depart ="计算机系")

<c>从score表中查询满徐上述con的记录

> select * from score where cno in (select cno from course where tno in(select tno from teacher where depart ="计算机系"));

(26)查询“计算机系”与“电子工程系”不同职称的教师的tname和prof

<a>理解它的意思是,查询计算机系中电子工程系没有的职称+查询电子工程系中计算机系没有的职称

<b>查询计算机系中的职称

>select prof from teacher where depart ="计算机系"

<c>查询电子工程系中的职称在计算机系没有的记录

>select tname,prof from teacher where depart ="电子工程系" and prof not in(select prof from teacher where depart ="计算机系");

<d>同理查询计算机系中的职称在电子工程系中没有的记录

> select tname,prof from teacher where depart ="计算机系" and prof not in(select prof from teacher where depart ="电子工程系");

<e>两者相加    union

>select tname,prof from teacher where depart ="电子工程系" and prof not in(select prof from teacher where depart ="计算机系") union select tname,prof from teacher where depart ="计算机系" and prof not in(select prof from teacher where depart ="电子工程系");

(27)查询(选修编号为“3-105”且成绩至少高于选修编号为“3-245”的同学任意一位同学的成绩)的cno、sno、degree、将degree按从高到低的次序排列

>select degree from score where cno ='3-105'and degree > any( select degree from score where cno ='3-245') order by degree desc;

—分析—

<a>选修3-105同学的成绩

>select degree from score where cno ='3-105'

<b>选修3-245同学的成绩

>select degree from score where cno ='3-245'

<c>至少高与(高于选修3-245任何一位同学的成绩  >any )

>select degree from score where cno ='3-105'and degree > any( select degree from score where cno ='3-245')

<d>从高到底的次序排列    order by

>select degree from score where cno ='3-105'and degree > any( select degree from score where cno ='3-245') order by degree desc;

(28)查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的cno、sno、degree

> select degree from score where cno ='3-105'and degree > all( select degree from score where cno ='3-245') order by degree desc;

—分析—

<a>选修3-105同学的成绩

>select degree from score where cno ='3-105'

<b>选修3-245同学的成绩

>select degree from score where cno ='3-245'

<c>高于(是高于选修3-245的所有同学的成绩)>all

> select degree from score where cno ='3-105'and degree > all( select degree from score where cno ='3-245') order by degree desc;

(29)查询所有教师和同学的name、sex、和birthday

>select tname as name,tsex as sex,tbirthday as birthday from teacher union select sname,ssex,sbirthday from student;

—分析—

<a>求教师

>select tname,tsex,tbirthday from teacher

<b>求学生

>select sname,ssex,sbirthday from student;

<c>加一块 union

> select tname,tsex,tbirthday from teacher union select sname,ssex,sbirthday from student;

<d>取别名(因加两部分加一起字段还是只是一方的,所以整体给字段起个别名)

>select tname as name,tsex as sex,tbirthday as birthday from teacher union select sname,ssex,sbirthday from student;

(30)查询所有“女”教师和‘女"同学的name、sex、和birthday

> select tname as name,tsex as sex,tbirthday as birthday from teacher where tsex ='女' union select sname,ssex,sbirthday from student where ssex ='女';

—分析—

<a>查询所有“女”教师的name、sex、和birthday

>select tname,tsex,tbirthday from teacher where tsex ='女';

<b>查询所有“女”同学的name、sex、和birthday

>select sname,ssex,sbirthday from student where ssex ='女';

<c>加在一起  union

>select tname,tsex,tbirthday from teacher where tsex ='女' union select sname,ssex,sbirthday from student where ssex ='女';

<d>取别名

> select tname as name,tsex as sex,tbirthday as birthday from teacher where tsex ='女' union select sname,ssex,sbirthday from student where ssex ='女';

(31)查询成绩比该课程平均成绩低的同学的成绩表

>select * from score a where degree < (select avg(degree) from score b where a.cno = b.cno );

—分析—

<a>查看score表

 

<b>将表分为a、b两个表,如下:(脑子里琢磨)

 

<c>b表用于计算平均成绩再与a表进行比较查询满足条件的

>  select * from score a where degree < (select avg(degree) from score b where a.cno = b.cno );

(32)查询所有任课教师的tname、depart

>select tname,depart from teacher where tno in (select tno from course);

—分析—

任课 (查询教师的tno必须在course中有才满足)

>select tname,depart from teacher where tno in (select tno from course);

(33)查询至少有两名男生的班号

>select class,count(ssex) from student where ssex = '男' group by class having count(ssex) >=2;

<a>查询班号必须要分组(group by)

<b>男生  where……

<c>至少有两名 (后接条件:having )数量的话需要用到count

(34)查询student表中,不姓王“王”的同学记录

> select * from student where sname not like'王%';

(35)查询student表中每个同学的姓名和年龄

>select sname,year(now()) - year(sbirthday) as age from student;

—分析—

<a>当前年份

>select year(now());

<b>查询每个同学的出生年份

>select year(sbirthday) from student;

<c>用当前年份 -  出生年份=年龄(as取别名)

>select sname,year(now()) - year(sbirthday) as age from student;

(36)查询student表中最大和最小的sbirthday值

max、min

>select max(sbirthday) as '最大生日',min(sbirthday) as '最小生日' from student;

(37)以班号和年龄从大到小的顺序查询student表中的全部记录

> select * from student order by class desc,sbirthday asc;

(38)查询“男”教师及其所上的课程

> select * from course where tno in(select tno from teacher where tsex = '男');

—分析—

<a>先取出男教师的tno

>select tno from teacher where tsex = '男';

<b>再从表course中取出满足上述tno的记录

> select * from course where tno in(select tno from teacher where tsex = '男');

(39)查询最高分同学的sno、cno和degree

> select * from score where degree=( select max(degree) from score);

—分析—

<a>先求出最高分

> select max(degree) from score;

<b>求等于最高分的记录

> select * from score where degree=( select max(degree) from score);

(40)查询和“李军”同性别的所有同学的sname

>select sname from student where ssex =( select ssex from student where sname = '李军');

—分析—

<a>先查出李军的性别

> select ssex from student where sname = '李军';

<b>查询与满足上述性别的同学的名字

>select sname from student where ssex =( select ssex from student where sname = '李军');

(41)查询和“李军”同性别并同班的同学的sname

>select sname from student where ssex =( select ssex from student where sname = '李军') and class=(select class from student where sname = '李军');

—分析—

<a>先查出李军的性别

> select ssex from student where sname = '李军';

<b>查出李军的班级

>select class from student where sname = '李军';

<c>将上述两个条件连起来

>select sname from student where ssex =( select ssex from student where sname = '李军') and class=(select class from student where sname = '李军');

(42)查询所有选修“计算机导论”课程的“男”同学的成绩表

>select * from score where cno in(select cno from course where cname ="计算机导论") and sno in(select sno from student where ssex ='男');

—分析—

<a>从course中查询计算机导论的cno

>select cno from course where cname ="计算机导论";

<b>从student表中选出男同学的sno

>select sno from student where ssex ='男';

<c>从score中查询满足上述两个条件的同学的记录

>select * from score where cno in(select cno from course where cname ="计算机导论") and sno in(select sno from student where ssex ='男');

(43)、假设创建一个grade表,如下:

>create table grade(

->  low int(3),

->  high int(3),

-> grade char(1));

——添加数据

>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');

问题:查询所有同学的sno、cno、grade

>select sno,cno,grade from score,grade where degree between low and high;

—分析—

用between…and…将score表与grade表连接起来

>select sno,cno,grade from score,grade where degree between low and high;

【总结,比较生疏的】

> select cno,avg(degree),count(*) from score group by cno having count(cno)>=2 and cno like'3%';

having count()>/</=    与group by连用,满足数字条件的

con like    以……开头的

    

                关注个人公众号,有福利哦……

最新文章

  1. 取出session中的所有属性与值的方法
  2. js添加var和不加var区别
  3. 苹果内付费 IAP
  4. sqldependency 支持的select
  5. crawler spec
  6. UVA 315 315 - Network(求割点个数)
  7. 数学(数论)BZOJ 3309:DZY Loves Math
  8. .NET设计模式(9):桥接模式(Bridge Pattern)
  9. Netflix工程总监眼中的分类算法:深度学习优先级最低
  10. Linux主要发行版本介绍
  11. c++中虚函数和纯虚函数定义
  12. codeforces #304 DIV2
  13. &lt;抽象工厂&gt;比&lt;工厂方法&gt;多了啥
  14. 潭州课堂25班:Ph201805201 django框架 第五课 自定义简单标签,包含标签,模型类创建,梳理类创建 (课堂笔记)
  15. 电子商务系统+java+web+完整项目+包含源码和数据库Java实用源码
  16. MySQL创建计算字段
  17. linux系统环境搭建
  18. mvc基础知识(1)
  19. Java8新特性 -- Lambda基础语法
  20. bzoj : 4504: K个串 区间修改主席树

热门文章

  1. cglib用法
  2. linux彻底干干净净完全卸载 mysql
  3. idea配置jdk,maven,tomcat
  4. K8S的安装
  5. C++判断txt文件编码格式
  6. Mac 如何导出ipa文件中Assets.car包中的切图
  7. video兼容ie,ckplayer网页播放器
  8. vue.js 第八课
  9. 虚拟机下修改ip配置
  10. MySQL高级-索引1