mysql 嵌套查询多表_MySql嵌套查询+关联查询+多表查询+对应案例 超详细,一看就会!!!...

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

先看我的数据库表 (直接看目录找需要的)

总共

4张表

cb9433a701c8e596aa6f9477540aa4fb.png

老师职位表 tb_position

881a5263e8c7d104643116af9d53879d.png

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

e5fbf83b3a84cc2c8420f6b5bac1e1d3.png

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

9004f94503ec6d49ad00f159863566c9.png

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

d6042754eb81dab18be40927aab1e50c.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;1

2

3

4

5

2a81a336c6e2367eac21613a69b19474.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;1

2

3

4

5

6

1741e8175760266786266fe7f5493746.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;1

2

3

4

5

6

1f97bb6735c5ac5e2fa2a9a419397e7f.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;1

2

3

4

5

6

7

8

9

10

11

12

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

146357e9b8dd5d5196a72565c6f5d452.png

5. LIMIT 分页查询

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

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

SELECT *

FROM tb_student

LIMIT 0,3;1

2

3

4

5

c1262694ebdf4df2eba7e0f4a171de0c.png

6. ORDER BY 排序查询

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

SELECT *

FROM tb_teacher

ORDER BY position_id

DESC; -- 降序1

2

3

4

76ec4af2fb761db6cbb920b479bf9193.png

SELECT *

FROM tb_teacher

ORDER BY position_id

ASC; -- 升序1

2

3

4

2f06aa895222d2a13ec095049f5004c5.png

7. 聚合函数

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

2e3a1f444955995b597dc346c7acb994.png

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

-- 计算教师id平局值

SELECT AVG(ID)

FROM tb_teacher;1

2

3

7dc2d59683f895193084a043a91876a8.png

3c894bfb9fce99ee072bdc28d43ae74f.png

8.分组查询

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

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

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

对所有数据分组查询

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

SELECT COUNT(*),

FROM tb_teacher

GROUP BY position_id;1

2

3

4

da5d4937796cc58ebdd83e39de0dd75e.png

2. 分组前筛选

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

SELECT COUNT(*)

FROM tb_teacher

WHERE id>2

GROUP BY position_id;1

2

3

4

5

6

a98b46e631f66f550aaac887b35da837.png

9ba1d5605d9db979d243f2e97fe89109.png

3.分组后筛选

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

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

FROM 表名

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

GROUP BY 第二个分组条件 , 当然先执行上面那个 HAVING 通过查找出来的数据 通过一些条件在进行筛选 ; z1

2

3

4

5

【表达的有点绕】

9.嵌套查询

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

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

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

主查询使用子查询的结果

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

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

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

SELECT *

FROM tb_student

WHERE id

IN (SELECT id FROM tb_teacher)1

2

3

4

5

6

83695f4d232d7a6f34773b9c2914f48c.png

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

SELECT *

FROM tb_student

WHERE

EXISTS (SELECT * FROM tb_teacher WHERE id=2)

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

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

2

3

4

5

6

959ac492be16d7ac6e61fcacc56ad832.png

374d48c8fbe599f93391886e3314424a.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)1

2

3

4

5

6

bc6956bbc44940d64b7fa605477768bb.png

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

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

SELECT *

FROM tb_student

WHERE id>

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

2

3

4

c6f657dc7a31521b94d14cfe0f1be9e5.png

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

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

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

not in 或not exists来代替.

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

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

关于 IN,NOT IN,ANY和ALL使用时的陷进 可以看一下这篇帖子

https://blog.csdn.net/kkdelta/article/details/7468850

10 LIKE模糊查询 LOCATE()模糊搜索

LIKE

-- 模糊查询 这里的 LIKE 后面的 % 需要注意

SELECT * FROM tb_student WHERE t_stu_name LIKE '%张%'1

2

LOCATE()

-- 模糊搜索

SELECT * FROM tb_student WHERE `LOCATE`('张',t_stu_name)1

2

两张表的结果一样

07de4b31f2e54bbe50575fac599198e4.png

使用LIKE时间稍慢

会继续更新~~~

文章来源: blog.csdn.net,作者:Oct_TwentyFour,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/haobo__/article/details/112342469

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL查询和多关联是两种不同的查询技术,用于在查询数据时处理复杂的条件和关系。 子查询是指在一个查询嵌套另一个查询,内部查询的结果作为外部查询的条件之一。子查询可以在 SELECT、FROM、WHERE 和 HAVING 子句中使用。例如,你可以使用子查询来获取满足某个条件的记录,然后将其用作外部查询的条件或结果集。 下面是一个使用子查询的示例,假设你有两个:Customers 和 Orders。你想要获取所有在某个城市下单的顾客信息,可以使用子查询来实现: ``` SELECT * FROM Customers WHERE CustomerID IN (SELECT CustomerID FROM Orders WHERE City = 'New York'); ``` 多关联用于将多个关联起来,以便在查询中使用这些的字段。通过指定连接条件,你可以根据共同的值将多个连接在一起。常见的多关联类型包括内连接、左连接、右连接和全连接。 下面是一个使用多关联的示例,假设你有两个:Customers 和 Orders。你想要获取所有顾客及其对应的订单信息,可以使用多关联来实现: ``` SELECT Customers.CustomerName, Orders.OrderID FROM Customers JOIN Orders ON Customers.CustomerID = Orders.CustomerID; ``` 在这个示例中,我们使用了 INNER JOIN 来连接两个,并通过 Customers.CustomerID 和 Orders.CustomerID 这两个字段进行关联。 总而言之,子查询和多关联是在 MySQL 中处理复杂查询的强大工具。它们可以根据具体需求选择使用,以实现所需的查询功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值