MySQL之多表查询

接上一篇文章中student表

查询男生总人数
select count() from students where sex = ‘男’;
select sex,count(
) from students group by sex having sex = ‘男’;(having是固定语法,分组后进行筛选)

分页查询

查询前三行学生信息
select * from students limit 0,3;
数据库中支持索引,索引都是从0开始的,拿到数据是0,1,2。
0,3代表左闭右开,就是从0开始算,3不算,即[0,3)。

假如数据是从第一行开始,那么0可以省略
就是 select * from students limit 0,3;

如果不是从第一行开始,比如是查询第四行到第十二行的学生信息
select * from students limit 3,12;

limit分页公式:(n-1)*m,m;select * from 表名 limit (n-1)*m,m;
n指显示第n页数据,m指每页显示m条数据

比如现在想显示每页有四条数据,显示第二页(如果一共有10条数据,现在显示的就是第五条到第八条数据)
带入(n-1)*m,m就是4,4
select * from students limit (2-1)*4,4即select * from students limit 4,4;

如果不想套公式,那从第几条数据开始查看,第一个数就写那条数据减1,第二个数就写想看几条数据(第一个数是开始,第二个数是几个)这种适用于不知道页数的

就像上边说到
如果不是从第一行开始,比如是查询第四行到第十二行的学生信息
select * from students limit 3,12;
和套公式是一样的

多表查询

连接查询之等值连接
当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回
等值连接查询:查询的结果为两个表匹配到的数据(只有重合的部分)
在这里插入图片描述
当A表和B表中两个字段相等的时候就可以让它们产生联系,这就是多表查询中的等值连接。B拿出的值和A拿出的值重合了,相当于数学中的交集。

之前有个学生students表,再建一个成绩scores表,学生表中的学号和成绩表中的学号是相同的(如果相同字段的值不同,无法产生连接)

查询两个表中相同内容的所有信息
第一种查询方式
select * from students,scores where students.studentNo = scores.studentno;
第二种查询方式(内连接 inner join…on…)
select * from students inner join scores on students.studentNo = scores.studentno;

三个表中查询(新增课程courses表
students.studentNo = scores.studentno,scores.courseNo = courses.courseNo)
第一种查询方式(如果表特别多就一直and)
select * from students,scores,courses where students.studentNo = scores.studentno and scores.courseNo = courses.courseNo;
第二种查询方式
select * from students inner join scores on students.studentNo = scores.studentno inner join courses on scores.courseNo = courses.courseNo;
如果后面再加条件后面直接加where就行(查询大乔的三个表的数据)
select * from students inner join scores on students.studentNo = scores.studentno inner join courses on scores.courseNo = courses.courseNo where students.name = ‘大乔’;

连接查询之左连接
左连接:相同部分加左边所有的全部内容
在这里插入图片描述
select * from students left join scores on students.studentNo = scores.studentno;
左连接和右连接都和等值连接冲突
如果是三个表
select * from students left join scores on students.studentNo = scores.studentno left join courses on scores.courseNo = courses.courseNo;

连接查询之右连接
右连接:相同部分加右边所有的全部内容
在这里插入图片描述

select * from students right join scores on students.studentNo = scores.studentno;
如果是三个表 ,和左连接一样
select * from students right join scores on students.studentNo = scores.studentno right join courses on scores.courseNo = courses.courseNo;

也可以(如果知道分数表,通过分数表来对学生表进行左连接,对课程表进行右连接)
就是把什么表写在什么位置,就是进行怎样的连接 根据写的位置来进行操作
select * from scores left join courses on students.studentNo = scores.studentno right join courses on scores.courseNo = courses.courseNo;

子查询
查询大于平均年龄的学生
select avg(age) from students;算出平均年龄
select * from students where age > 平均年龄;
把两句SQL语句连到一起,这就是表级子查询
select * from students where age > (select avg(age) from students);
查询成绩表里的所有数据,并与courses表里名为数据库和qtp的数据进行等值连接
select * from scores inner join (select * from courses where name in(‘数据库’,‘qtp’)) c on scores.courseNo = c.coursesno;

自关联

自己和自己关联是自关联

创建表create table areas(aid int primary key,atitle varchar(20),pid int)charset=utf8;

查询北京市的所有城区(p为主表,c代表城市)要确定哪个是主哪个是副
select * from areas p inner join areas c on p.pid = c.aid where c.atitle = ‘北京’;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值