MySQL数据库----多表查询,表连接

一.查询概述:

查询:指的是针对表中已经存在的数据,可以按照特定组合,条件,或者次序等等来进行一系列的检索查看操作------>select语句。

二.查询的基本操作:

1.查询语句的基本结构:

select   列名1,列名2,列名3....     from   表名;

select子句:查什么,后面写的是要查询的列

from子句:从哪查,后面写的是查询过程中用到的表

2.   *    任意,所有

select    *     from   表名;       查看表中所有的数据

3.针对查询的结果进行去重复的操作---->distinct

格式:select   distinct   列名   from  表名;

--  查看student表中所有内容

select  *  from   student;

-- 查看sc表中所有的内容

select  *   from   sc;

--从student表中,查看学生学号sno,姓名sname,年龄sage,系别sdept

select  sno,sname,sage,sdept   from  student;

-- 从course表中查看课程的编号cno,以及课程的名字cname

select  cno,cname  from  course;

-- 从student表中查看一下学生都分布在哪些专业?

select  distinct  sdept   from   student;

-- 从学生信息表中,查看学员都来自于哪些城市?

select   *   from  学生信息;

select  distinct  籍贯   from  学生信息;

-- 从sc表中查看学生都修了哪些课程?

select  distinct  cno  from  sc;

4.别名查询

别名:另起名字的含义

思想:针对查询出来结果的标题,进行起名字

格式一:

select    列名1   '别名1',列名2  '别名2',列名3  '别名3'...  from   表名;

格式二:as关键词---->指定意思

select  列名1  as  '别名1',列名2  as  '别名2'...   from   表名;

5.针对查询的结果,也可以进行计算的操作

--  如果不给查询结果起标题,来看一下默认的标题情况--->和列名保持一致

--  查看student表中所有的内容

select   *    from    student;

-- select    列名1   '别名1',列名2  '别名2',列名3  '别名3'...  from   表名;

-- 从student表中查数据,生成别名

select  sno  '学号',sname  '姓名',ssex  '性别',sage  '年龄',sdept  '系别'   from  student;

-- 从student表中把学号,姓名,年龄另起别名查询出来   as

select   sno  as  '学号',sname  as  '姓名',sage  as  '年龄'   from   student;

-- 5.针对查询的结果,也可以进行计算的操作

-- 从sc表中查询每个学生成绩加10分之后的数据信息

select  *  from  sc;

select  sno,cno,grade+10  '加分后的成绩'   from  sc;

三.条件查询(选择查询)

概述:在实际查询工作中,很多时候也是需要条件筛选后的数据做操作,这种情况就可以利用条件查询(选择查询)---->where子句

格式:select  列名  from  表名  where   条件;

1.比较运算符

=   >   <     >=    <=   <>    !=  不等于

2.逻辑运算符,用来连接多个条件

and    连接条件同时满足

or     连接条件只需要满足其中一个即可

3.范围搜索条件查询

3.1查询在指定范围内的数据信息   between   开始值     and     结束值

select  列名  from  表名  where  列名   between  开始值  and  结束值;

3.2查询不在指定范围内的数据信息  not  between  开始值  and  结束值

select  列名  from  表名  where  列名  not  between  开始值  and  结束值;

-- 从sc中查看成绩及格的学生信息

select  *   from  sc   where   grade>=60;

-- 从student表中查看不是计算机系学生的信息

select   *   from  student   where   sdept<>'计算机系';

-- 从sc表中查看修了c02这门课,且成绩还得大于70分学生的信息

select  *   from   sc   where  cno='c02'  and  grade>70;

-- 从student表中查询年龄大于等于20或者是信息系的学生信息

select  *  from  student   where  sage>=20  or  sdept='信息系';

-- 从sc表中查看成绩在70-90之间的学员信息

select  *   from  sc  where  grade  between  70  and  90;

-- 从sc表中查看成绩不在70-90之间的学员信息

select  *  from   sc  where  grade not  between  70  and  90;

4.列表搜索条件查询

4.1匹配列表中的内容   in(值1,值2,值3....)

select  列名  from  表名  where  列名  in(值1,值2,值3...);

思想:只要匹配到列表中任意一个值,都会有查询的结果

4.2不要列表中的内容   not   in(值1,值2,值3...)

select  列名  from  表名  where  列名  not  in(值1,值2,值3...);

思想:只要是列表中的内容,我都不做查询,排除在外

5.字符匹配符查询(模糊查询)

5.1匹配和字符模板相关的数据   like  '字符模板'

select  列名   from  表名  where   列名  like  '字符模板';

思想:只要匹配到和字符模板相关的数据,就直接查询出来

5.2把匹配到和字符模板相关的数据排除在外   not  like  '字符模板'

select  列名  from 表名  where  列名  not  like   '字符模板';

思想:不要和模板相关的数据

字符模板的写法:提供了两个通配符

%   代表的是零个或多个字符,任意个字符

_     代表的是一个字符

例:王% ,能够匹配到的数据有( ABCD   )

A.王    B.王一   C.王一二   D.王一二三   E.大王   F.小王一

例:王_ ,能够匹配到的数据有(B )

A.王    B.王一   C.王一二   D.王一二三   E.大王   F.小王一

-- 从student表中查看计算机系和数学系的学生信息

select  *   from  student  where  sdept  in('计算机系','数学系');

select  *   from  student  where  sdept='计算机系'  or  sdept='数学系';

-- 从sc表中查看除了修了c01,c02这两门课学生的情况

select  *   from  sc  where  cno  not  in('c01','c02');

select  *  from  sc  where  cno!='c01'  and  cno!='c02';

-- 从student表中查看姓王的学生信息

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

select  *   from  student  where  sname  like  '王_';

-- 从student表中查看不是姓王的学生信息

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

-- 从student表中查看名字中第二个字符是小的学生信息

select  *   from  student   where   sname   like  '_小%';

-- 从班级信息表中查看pu开头的班级信息

select  *  from  班级信息  where  班级名称  like  'pu%';

-- 从sc表中查看修了c01,c04,c06的学生修课情况

select *  from  sc  where  cno  in('c01','c04','c06');

6.空值查询

思想:看某一条记录中是否存在空的值

6.1判断(查询)为空的记录    is  null

select   列名   from   表名   where   列名  is  null;

6.2判断(查询)不为空的记录    is  not  null

select  列名   from  表名   where  列名  is  not   null;

-- 从sc表中查看有考试成绩的学生修课情况

-- 有考试成绩 :成绩不为空,有数据

select  *   from  sc where  grade  is  not null;

-- 从sc表中查看没有考试成绩的学生修课情况

-- 没有考试成绩:成绩为空

select  *  from  sc  where  grade  is  null;

四.聚合函数

概述:是mysql中自带的函数,已经是声明好的,我们是直接拿来使用的,一般情况下是用来做计算

1.sum(列名)   求和

2.avg(列名)    求平均值

3.max(列名)   求最大值

4.min(列名)    求最小值

格式:select   聚合函数   from   表名;

5count(*)    统计元组的个数(统计行的个数)

6.count(列名)    统计该列的值的总个数

除了count(*)外,其它函数在做操作时,都会忽略空值(空值null不参与计算)

五.行数限定查询  limit

思想:从一张表中,查看指定行的数据,比如:前十行,前十五行,第七行到第十五行.....

格式一:select  列名   from  表名  limit  行数;(默认从第一行开始查起)

格式二:select  列名   from  表名   limit   开始位置的下标,行数;(从指定的行开始做查看,下标=位置-1)

-- 查看student表中前五行记录

select  *  from  student  limit  5;

-- 查看student表中数据:从第三行开始查看,查看4条记录

select  *  from  student  limit 2,4;

-- 查看student表中从第四行到第七行数据

select  *   from  student  limit 3,4;

-- 从第二行开始做查询,查询两条记录

select  *  from  student  limit  1,2;

六.分组查询   group  by

思想:针对查询出来的结果,按照某个列来进行分组(划分)

例:统计学校中每个年级的总人数

套路:首先:先把学校的总人数给查出来(获取到),然后:再来根据"年级"进行数据划分

比如:学校总人数是500人,按照年级划分,一年级80人,二年级110人....

格式:select   聚合函数  from  表名  group  by  列名;

针对分组后的数据,也可以进行条件筛选的操作

例:-- 从sc表中统计每门课程的修课总人数,限制条件:只看这门课选课总人数超过3人

having   分组的条件(一般情况下是聚合函数当条件)

where虽然作为条件查询,但是它后面不能写聚合函数

格式:

select  聚合函数   from  表名  group  by  列名   having   条件;

注意:having的使用,必须配合group  by,不能单独使用

-- 从student表中统计每个专业(系别)各自有多少人?

-- 查询出的是"人数"---->细化到每个专业

-- 在student表中,一行代表的是一个学生的记录,统计有多少行,就代表有多少个学生

select   sdept,count(*)  '总人数'  

from  student

group  by  sdept;

  七.排序查询     order  by

思想:把查询出来的结果,按照某个列进行排序(降序或升序)

升序  asc  (默认)       降序   desc

格式:select  列名   from  表名   order  by   列名   [asc或者desc];

一个完整的查询操作中包含的关键词:

select    要查的列名

from    表名

where  选择条件

group  by   分组的列名

having   聚合函数当条件(分组条件)

order  by  排序的列名     asc|desc;

八.多表查询---->表连接

在之前讲查询操作时,都是针对一个表中的数据来进行的,那么在实际的工作中,很多时候需要的数据,可能来源于多张表,这个时候就需要用到多表查询的操作(用到表的数量>=2)

例:查询学生的学号,姓名,系别,课程号,成绩

student(sno,sname,sdept)

sc(cno,grade)

================》只有两个表的结合,才能查询出最终的结果

多张表之间的查询,实现的方式:表连接(表与表之间的连接)

====》只有表与表之间建立了连接关系,才能进行多表查询

Ⅰ.表连接操作分类:

1.内连接查询(最常用)

提供表与表之间的连接方式,有两种写法:

格式一:where 来指定表与表之间的连接条件

select   表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2.....

from  表名1,表名2

where  表名1.列=表名2.列;

注意:表与表之间实现连接的列:列名可以不一致,但是列中的值和数据类型必须保持一致;内连接查询思想:只有两个表中匹配到的数据,才会有查询的结果;在表连接查询中,表名可以直接另起别名,方便操作,格式:表名  别名;select语句中的表名.列名的写法,其实表名是可以省略:如果查询的列,只存在于一个表中,那么表名可以省略,如果查询的列,两个表中都有,那么不可以省略表名

格式二:on 来指定表与表之间的连接条件

select   表名.列名

from   表名1  inner  join  表名2

on  表名1.列=表名2.列;

--  查询修课门数等于或大于4门的学生的平均成绩和选课门数。   sc

-- 查:平均成绩,选课门数 ---->细化每个学生

-- 条件:选课门数>=4

select  sno,avg(grade)  '平均成绩',count(*)  '选课门数'

from  sc

group by  sno

having count(*)>=

-- 案例1:查询学生的学号,姓名,性别,以及所在的班级名称和年级

/*

多表查询的做题思路:

1.确定表--->根据题上的分析,看用到了哪些表

2.确定表与表之间能够建立起连接的列  ---->找相同列(列名可以不一致,但是列的内容和数据类型必须一致)

3.确定要查询的内容   ---->题上要什么,咱们就查什么

4.最后再来看题上是否有额外的条件

注意点:在inner join on写法中,如果有额外的条件,需要在on的后面,单独用一个where子句来书写(on只放表连接条件)

select  表名.列名

from  表名1 inner  join   表名2

on   表名1.列名=表名2.列名

where   额外的条件;

-- 例:查询学生的学号sno,姓名sname,系别sdept,课程号cno,成绩grade

select s.sno,sname,sdept,cno,grade

from  student  s,sc c

where s.sno=c.sno;

-- 案例2:查询籍贯是beijing,班级是以'pu'开头的学生的学号,姓名,性别,以及所在的班级名称和年级

select  学号,姓名,性别,班级名称,年级

from  学生信息 s,班级信息 c

where s.班级编号=c.班级编号  and  s.籍贯='beijing'  and  c.班级名称  like  'pu%';

select  学号,姓名,性别,班级名称,年级

from  学生信息 s  join  班级信息  c

on  s.班级编号=c.班级编号  and  籍贯='beijing'  and  班级名称 like 'pu%';

select  学号,姓名,性别,班级名称,年级

from 学生信息 s  join  班级信息  c

on  s.班级编号=c.班级编号

where 籍贯='beijing'  and  班级名称  like  'pu%';

-- 查看修了数据库基础cname这门课学生的学号,课程号,成绩   course  sc    cno

select sno,sc.cno,grade

from  course,sc

where  course.cno=sc.cno  and   cname='数据库基础';

2.inner  join  on表连接分类

等值连接:指的是除了连接条件外,即使有额外的条件,条件中也只有=操作

非等值连接:指的是除了连接条件外,额外的条件中,还有其它的比较运算符

-- 查看计算机系且修了c02这门课的学生学号,姓名,年龄,课程号,成绩  student  sc    sno

select student.sno,sname,sage,cno,grade

from  student  inner join  sc

on  student.sno=sc.sno

where sdept='计算机系'  and  cno='c02';

以上的SQL语句,就是一个等值连接的写法

非等值连接案例:

案例:查询成绩大于40的学生个人情况(学号,姓名,性别,班级编号,成绩),并按照成绩降序排列。

select  s.学号,姓名,性别,班级编号,成绩

from  学生信息 s  inner join  成绩表 c

on  s.学号=c.学号

where 成绩>40

order  by  成绩  desc;

3.多表查询(表的数量>2)

格式一:where实现多表连接

select   表名.列名

from 表名1,表名2,表名3,表名4....

where  表名1.列=表名2.列   and   表名2.列=表名3.列   and  表名3.列=表名4.列....;

格式二:on实现多表连接

select   表名.列名

from   表名1  inner  join  表名2

on   表名1.列=表名2.列       inner   join    表名3

on    表名2.列=表名3.列       inner  join     表名4

on     表名3.列=表名4.列....;

-- 查看学生的学号sno,姓名sname,专业sdept,课程号cno,课程名cname,成绩grade

select student.sno,sname,sdept,sc.cno,cname,grade

from  student,sc,course

where  student.sno=sc.sno  and sc.cno=course.cno;

select student.sno,sname,sdept,sc.cno,cname,grade

from student  inner  join  sc

on  student.sno=sc.sno   inner  join   course

on  sc.cno=course.cno;

-- 查看修了数据结构的学生的学号,姓名,专业,成绩

-- 查看修了c02学生的学号,姓名,课程名,成绩,结果按成绩降序排列

-- 查看计算机系,且考试成绩及格的学生的学号,姓名,课程号,课程名

4.外连接:做表连接操作时,

基思想:至少会返回一个表的所有内容

到底会返回哪个表的所有内容?是和它的分类是有关系的。

外接分类:

4.1左外部连接(左连接)   left   outer  join

思想:返回的是左表的所有内容;如果左表的数据,在右表中没有找到匹配的信息,那么对应位置显示null

4.2右外部连接(右连接)   right  outer  join

思想:返回的是右表的所有内容;如果右表的数据,在左表中没有找到匹配的信息,那么对应位置显示null

区分左表和右表:在语法结构中,先写的表是左表,后写的表是右表

语法格式:

select  表名.列名

from   表名1  left  outer  join   表名2

on  表名1.列=表名2.列;

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值