最近学习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
学生表(为了好辨认效果) 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<=2的
-- 2.在查出学生表中的id > 教师表查出结果的数值 (每个值都会比较)
SELECT *
FROM tb_student
WHERE id>
All (SELECT id FROM tb_teacher WHERE id <=2)
4.ANY是表示子查询结果中任意一个
any表示只要大于子查询结果中的任一个,表达式就成立,=any表示等于子查询中的任一个,相当于in.
SELECT *
FROM tb_student
WHERE id>
ANY (SELECT id FROM tb_teacher WHERE id <=2)
in在子查询不返回数据的时候,为false,子查询结果中有null的时候,null不会用于比较。
any 同样在子查询不返回数据的时候,为false,子查询结果中有null的时候,null不会用于比较。
all在子查询不返回数据的时候,为true,子查询结果中有null的时候,不会返回数据。
not in 或not exists来代替.
not in 不等于<> any,相当于<>all,
<>any是只要不等于其中的任意一个,就成立
会继续更新~~~