mysql中关联查询已那个表为基准_MySql嵌套查询+关联查询+多表查询+对应案例 超详细,一看就会!!!...

本文详细介绍了MySQL中的各种查询方式,包括INNER JOIN、LEFT JOIN、RIGHT JOIN、UNION实现全外连接、LIMIT分页查询、ORDER BY排序、聚合函数、分组查询以及嵌套查询的使用。通过实例演示了如何在多表之间进行数据操作,帮助读者掌握MySQL的数据查询技巧。
摘要由CSDN通过智能技术生成

最近学习MyBatis框架 用到多表查询比较多,以前学的不是很好,今特意回来补上。呜呜呜。

文章目录

先看我的数据库表

1. INNER JOIN 内连接

2 .LEFT JOIN 左查询

3. RIGHT JOIN 右查询

4. UNION 全外连接

5. LIMIT 分页查询

6. ORDER BY 排序查询

7. 聚合函数

8.分组查询

9.嵌套查询

1. IN 表示值是否存在子查询结果集中

2. EXISTS 是表示子查询是否返回结果,而不管返回的具体内容。

3.ALL表示子查询结果中的所有。

4.ANY是表示子查询结果中任意一个

先看我的数据库表

总共

4张表

老师职位表 tb_position

8748aaf2c1f515f01bcd763fa8a6ed2c.png

学生表(为了好辨认效果) tb_student

31c22ddd937d35624fddc10b460987af.png

老师表 (id 班级 老师名字 职位对应表) tb_teacher

f2f3e58e870f8875f7a7ec73f00d5f80.png

老师与学生的关系对应表,毕竟有多种关系 多对多 tb_stu_teach

2f3a3c6d8b284a058f8d7d766c5cdd9c.png

1. INNER JOIN 内连接

-- 把两张表中 某列 相同值的给查询出来

select stu.t_stu_name,tea.t_no,tea.t_name

from tb_teacher tea

INNER JOIN tb_student stu

on stu.id = tea.id;

536ecd756dd01f1e4028c1bf0fae8515.png

2 .LEFT JOIN 左查询

-- 左查询

-- 以左边的表的数据为基准, 去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null;

SELECT STU.T_STU_NAME,TEA.T_NAME

FROM tb_student STU

LEFT JOIN tb_teacher TEA

ON STU.id = TEA.id;

d74fcf55abf3f0b8cc990bbb9d7a2140.png

3. RIGHT JOIN 右查询

-- 右查询

-- 以右边的表的数据为基准,去匹配左边的表的数据,如果匹配到就显示,匹配不到就显示为null;

SELECT STU.T_STU_NAME,TEA.T_NAME

FROM tb_teacher TEA --所谓的左边

RIGHT JOIN tb_student STU --所谓的右边

ON STU.id = TEA.id;

e74c7cbf26acff744e59b507176a172d.png

4. UNION 全外连接

-- 把两张表的字段都查出来,没有对应的值就显示null,

-- 注意:mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接;

(两个select 除了关键字不一样 其他都得一样,可以试试把查出来的值换一个 试试 哈哈哈)

SELECT STU.T_STU_NAME,TEA.T_NAME

FROM tb_student STU

LEFT JOIN tb_teacher TEA

ON STU.id = TEA.id

UNION

SELECT STU.T_STU_NAME,TEA.T_NAME

FROM tb_student STU

RIGHT JOIN tb_teacher TEA

ON STU.id = TEA.id;

为了看出不同 在教师表中添加了一行数据

bb06e1f77df3a04fed97583a590f06e3.png

5. LIMIT 分页查询

-- INDEX =(当前页码-1)*个数

-- 下标从 INDEX 开始 查询 X 条 我这里 index是0,x是3

SELECT *

FROM tb_student

LIMIT 0,3;

76e321e3c69e1d934dcfac706dd080df.png

6. ORDER BY 排序查询

默认为 升序 可以用关键字 DESC(降序) ASC(升序)

SELECT *

FROM tb_teacher

ORDER BY position_id

DESC; -- 降序

6df48a9ab7a82aa161576bced50d5e9d.png

SELECT *

FROM tb_teacher

ORDER BY position_id

ASC; -- 升序

808f3db8b87a04634889456a02073dce.png

7. 聚合函数

在查询数据时 可以将一列数据进行纵向的计算

e33c83d8bd36e01ea649970495fe8517.png

用法 : 聚合函数查询的语法 SELECT 聚合函数(列名) FROM 表名

-- 计算教师id平局值

SELECT AVG(ID)

FROM tb_teacher;

84d880116215ba90ea02838e6970e8f5.png

425a707eff4b93d9a9150fe4419cf94c.png

8.分组查询

按照特定条件把数据进行分组,把每一组当做一个整体,分别对某一组数据进行计算。

分组查询语法,字段列表只能是分组列、或者聚合函数

标准语句 SELECT 字段列表 FROM 表名 where 分组前条件 GROUP BY 分组列名 HAVING 分组后条件

对所有数据分组查询

-- 按教师的职位分类 查询 当前职业教师的个数

SELECT COUNT(*),

FROM tb_teacher

GROUP BY position_id;

32f207322f7a0822a0f8a09e55e17110.png

2. 分组前筛选

-- 分组前筛选 将id大于2的按教师的职位分类 查询 当前职业教师的个数

SELECT COUNT(*)

FROM tb_teacher

WHERE id>2

GROUP BY position_id;

91eb242cf599c610d2fb940fa5a03de8.png

7073b0455e84ef5ea97cf457a2e42ce7.png

3.分组后筛选

因为 数据表建不适合演示这个 所以把用法贴在这

SELECT 你要显示的一些数据,比如平均数(COUNT(列名),列名

FROM 表名

WHERE 分组条件 比如 分数大于60 。。等等等

GROUP BY 第二个分组条件 , 当然先执行上面那个

HAVING 通过查找出来的数据 通过一些条件在进行筛选 ; z

【表达的有点绕】

9.嵌套查询

子查询:一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性很低。

子查询一般出现在FROM和WHERE子句中。

子查询在主查询前执行一次

主查询使用子查询的结果

1. IN 表示值是否存在子查询结果集中

-- 1. 先查询出 我的教师表中的 id

-- 2. 再根据子查询的id ,寻找我学生表中对应的id

SELECT *

FROM tb_student

WHERE id

IN (SELECT id FROM tb_teacher)

066a4f53159c2ed7ecd0e98bc668f5ee.png

2. EXISTS 是表示子查询是否返回结果,而不管返回的具体内容。

SELECT *

FROM tb_student

WHERE

EXISTS (SELECT * FROM tb_teacher WHERE id=2)

-- 我这里的子查询为能查到结果 所以返回值如下

-- 要是我将子查询条件设置为 WHERE id=100 因为我教师表中,没有id为100的,所以总的查询结果为null.

96c4ee78d82551988730848caa573ac0.png

a73dc53d11127099f0fd1954f43a3df2.png

3.ALL表示子查询结果中的所有。

all表示要大于子查询结果中的所有,才会返回true, not in 相当于“<>all”.

-- 1. 先查出教师表中 id<=2的

-- 2.在查出学生表中的id > 教师表查出结果的数值 (每个值都会比较)

SELECT *

FROM tb_student

WHERE id>

All (SELECT id FROM tb_teacher WHERE id <=2)

d1cba7eb55bdca014dc6cd5234cd3371.png

4.ANY是表示子查询结果中任意一个

any表示只要大于子查询结果中的任一个,表达式就成立,=any表示等于子查询中的任一个,相当于in.

SELECT *

FROM tb_student

WHERE id>

ANY (SELECT id FROM tb_teacher WHERE id <=2)

1e77662cadf9cf83e427470923efc68a.png

in在子查询不返回数据的时候,为false,子查询结果中有null的时候,null不会用于比较。

any 同样在子查询不返回数据的时候,为false,子查询结果中有null的时候,null不会用于比较。

all在子查询不返回数据的时候,为true,子查询结果中有null的时候,不会返回数据。

not in 或not exists来代替.

not in 不等于<> any,相当于<>all,

<>any是只要不等于其中的任意一个,就成立

会继续更新~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值