MySql嵌套查询+关联查询+多表查询+对应案例+mybatis动态sql 超详细 您所在的位置:网站首页 登录网页设计 MySql嵌套查询+关联查询+多表查询+对应案例+mybatis动态sql 超详细

MySql嵌套查询+关联查询+多表查询+对应案例+mybatis动态sql 超详细

2024-01-04 13:27| 来源: 网络整理| 查看: 265

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

有对MySql数据库的初步使用不是很了解的朋友们,可以切换到这里噢~~ https://blog.csdn.net/haobo__/article/details/110356744

文章目录 先看我的数据库表 (直接看目录找需要的)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是表示子查询结果中任意一个 10 LIKE模糊查询 LOCATE()模糊搜索11.mybatis的动态查询1.autoMapping和autoMappingBehavior的区别2. resultMap概述3. resultType元素4.动态sql 12、mysql的常用语法插入一条数据插入多条数据插入查询结果)(把查询的结果插入到对应的表中)去重查询查询的时候 直接使用四则运算查询的时候 重命名 (as 可以省略不写)使用concat连接字符串得到自定义格式的查询结果使用order by对查询的结果进行排序,asc升序,desc降序使用group by对数据进行分组组合使用 count 是统计查询出的条数使用group_concat()实现显示没个分组中的字段如果要在分组查询中加入条件,则必须使用having而不是where如果使用条件分组的同时还要排序,则order by必须位于having后边concat连接字符串concat_ws使用分隔符连接字符串length和char_length来获取字符串的长度 11.时间与时间戳的转换获取当前的时间/时间戳10位时间戳/时间格式转换13位时间戳/时间格式转换 14 树状结构一次查询(不推荐使用)FIND_IN_SET和Match+Against区别和使用获取随机数

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

总共 4张表 在这里插入图片描述

老师职位表 tb_position 在这里插入图片描述学生表(为了好辨认效果) tb_student 在这里插入图片描述老师表 (id 班级 老师名字 职位对应表) tb_teacher 在这里插入图片描述老师与学生的关系对应表,毕竟有多种关系 多对多 tb_stu_teach 在这里插入图片描述 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;

在这里插入图片描述

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;

在这里插入图片描述

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;

在这里插入图片描述

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;

为了看出不同 在教师表中添加了一行数据 在这里插入图片描述

5. LIMIT 分页查询 -- INDEX =(当前页码-1)*个数 -- 下标从 INDEX 开始 查询 X 条 我这里 index是0,x是3 SELECT * FROM tb_student LIMIT 0,3;

在这里插入图片描述

6. ORDER BY 排序查询

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

SELECT * FROM tb_teacher ORDER BY position_id DESC; -- 降序

在这里插入图片描述

SELECT * FROM tb_teacher ORDER BY position_id ASC; -- 升序

在这里插入图片描述

7. 聚合函数

在查询数据时 可以将一列数据进行纵向的计算 在这里插入图片描述 用法 : 聚合函数查询的语法 SELECT 聚合函数(列名) FROM 表名

-- 计算教师id平局值 SELECT AVG(ID) FROM tb_teacher;

在这里插入图片描述 在这里插入图片描述

8.分组查询

按照特定条件把数据进行分组,把每一组当做一个整体,分别对某一组数据进行计算。 分组查询语法,字段列表只能是分组列、或者聚合函数

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

对所有数据分组查询 -- 按教师的职位分类 查询 当前职业教师的个数 SELECT COUNT(*), FROM tb_teacher GROUP BY position_id;

在这里插入图片描述 2. 分组前筛选

-- 分组前筛选 将id大于2的按教师的职位分类 查询 当前职业教师的个数 SELECT COUNT(*) FROM tb_teacher WHERE id>2 GROUP BY position_id;

在这里插入图片描述 在这里插入图片描述

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)

在这里插入图片描述

2. EXISTS 是表示子查询是否返回结果,而不管返回的具体内容。 SELECT * FROM tb_student WHERE EXISTS (SELECT * FROM tb_teacher WHERE id=2) -- 我这里的子查询为能查到结果 所以返回值如下 -- 要是我将子查询条件设置为 WHERE id=100 因为我教师表中,没有id为100的,所以总的查询结果为null.

在这里插入图片描述 在这里插入图片描述

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

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

-- 1. 先查出教师表中 id 教师表查出结果的数值 (每个值都会比较) SELECT * FROM tb_student WHERE id> All (SELECT id FROM tb_teacher WHERE id ANY (SELECT id FROM tb_teacher WHERE id 3. resultType元素

使用resultType进行输出映射,只有查询出来的列名和pojo(实体bean)中的属性名一致,该列才可以映射成功。简单来说也就是你的数据库字段和JavaBean里的字段名称必须一致才能映射成功。

4.动态sql 1.基于OGNL表达式 2.完成多条件查询等逻辑实现 3.用于实现动态SQL的元素主要有 if trim where set choose(when、otherwise) foreach

if

where and name=#{name} 当有可能一个参数都不传得情况下 上面写法会报错 //会自动剔除第一个if前面的and 进行更新等sql操作时可以用 【注】: 1。这条跟新语句至少要成功一个条件 2. 每个sql后注意,隔开

trim

prefix:前缀 prefixOverrides=""前缀怎么处理 suffix:后缀 suffixOverrides=“后缀怎么处理” 灵活的去除多余关键字。 代替where和 set

foreach

条数据的操作:比如查询条件是一个集合,通常用于in条件 属性 item、index、collection:必须指定{list、array、map-key}、open、separator、close

在这里插入图片描述

12、mysql的常用语法

我的表 在这里插入图片描述

一些常用的数据操作

插入一条数据

INSERT into shop_user(uid,PASSWORD,telephone,username) VALUES (4,‘aaa’,‘123’,‘bvc’);

插入多条数据

INSERT into shop_user(uid,PASSWORD,telephone,username) VALUES (1,‘dsa’,‘123’,‘dadqa’),(2,‘dasd’,‘2133’,‘dsadsa’),(3,‘dad’,‘123’,‘jiawwwwdei’)

插入查询结果)(把查询的结果插入到对应的表中)

INSERT into shop_user(uid,PASSWORD,telephone,username) select t.uid,t.PASSWORD,t.telephone,t.username from shop_user t;

去重查询

select distinct uid,PASSWORD,telephone,username from shop_user

查询的时候 直接使用四则运算

select distinct uid*4,PASSWORD,telephone,username from shop_user

查询的时候 重命名 (as 可以省略不写)

select distinct uid as ‘Id’,PASSWORD as ‘密码’,telephone as ‘电话’,username as ‘姓名’ from shop_user;

使用concat连接字符串得到自定义格式的查询结果

select concat (username,‘的密码是:’,password)result from shop_user

使用order by对查询的结果进行排序,asc升序,desc降序

select * from shop_user ORDER BY uid asc ,PASSWORD desc;

使用group by对数据进行分组

select * from shop_user GROUP BY username

组合使用 count 是统计查询出的条数

select count(*) from shop_user GROUP BY username ORDER BY username desc;

使用group_concat()实现显示没个分组中的字段

select group_concat(uid)uid,group_concat(PASSWORD)PASSWORD,group_concat(telephone)telephone,username from shop_user GROUP BY username

如果要在分组查询中加入条件,则必须使用having而不是where

select * from shop_user GROUP BY uid HAVING uid



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有