最近学习MyBatis框架 用到多表查询比较多,以前学的不是很好,今特意回来补上。呜呜呜。
总共
4张表
-- 把两张表中 某列 相同值的给查询出来
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;
-- 左查询
-- 以左边的表的数据为基准, 去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null;
SELECT STU.T_STU_NAME,TEA.T_NAME
FROM tb_student STU
LEFT JOIN tb_teacher TEA
ON STU.id = TEA.id;
-- 右查询
-- 以右边的表的数据为基准,去匹配左边的表的数据,如果匹配到就显示,匹配不到就显示为null;
SELECT STU.T_STU_NAME,TEA.T_NAME
FROM tb_teacher TEA --所谓的左边
RIGHT JOIN tb_student STU --所谓的右边
ON STU.id = TEA.id;
-- 把两张表的字段都查出来,没有对应的值就显示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;
-- INDEX =(当前页码-1)*个数
-- 下标从 INDEX 开始 查询 X 条 我这里 index是0,x是3
SELECT *
FROM tb_student
LIMIT 0,3;
默认为 升序
可以用关键字 DESC(降序) ASC(升序)
SELECT *
FROM tb_teacher
ORDER BY position_id
DESC; -- 降序
SELECT *
FROM tb_teacher
ORDER BY position_id
ASC; -- 升序
在查询数据时 可以将一列数据进行纵向的计算
用法
: 聚合函数查询的语法 SELECT 聚合函数(列名) FROM 表名
-- 计算教师id平局值
SELECT AVG(ID)
FROM tb_teacher;
按照特定条件把数据进行分组,把每一组当做一个整体,分别对某一组数据进行计算。
分组查询语法,字段列表只能是分组列、或者聚合函数
标准语句
SELECT 字段列表 FROM 表名 where 分组前条件 GROUP BY 分组列名 HAVING 分组后条件
-- 按教师的职位分类 查询 当前职业教师的个数
SELECT COUNT(*),
FROM tb_teacher
GROUP BY position_id;
-- 分组前筛选 将id大于2的按教师的职位分类 查询 当前职业教师的个数
SELECT COUNT(*)
FROM tb_teacher
WHERE id>2
GROUP BY position_id;
3.分组后筛选
因为 数据表建不适合演示这个 所以把用法贴在这
SELECT 你要显示的一些数据,比如平均数(COUNT(列名),列名
FROM 表名
WHERE 分组条件 比如 分数大于60 。。等等等
GROUP BY 第二个分组条件 , 当然先执行上面那个
HAVING 通过查找出来的数据 通过一些条件在进行筛选 ; z
【表达的有点绕】
- 子查询:一般在子查询中,程序
先运行
在嵌套在最内层的语句,再运行
外层。因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性
很低。子查询一般出现在FROM和WHERE子句中。
- 子查询在主查询前执行一次
- 主查询使用子查询的结果
-- 1. 先查询出 我的教师表中的 id
-- 2. 再根据子查询的id ,寻找我学生表中对应的id
SELECT *
FROM tb_student
WHERE id
IN (SELECT id FROM tb_teacher)
SELECT *
FROM tb_student
WHERE
EXISTS (SELECT * FROM tb_teacher WHERE id=2)
-- 我这里的子查询为能查到结果 所以返回值如下
-- 要是我将子查询条件设置为 WHERE id=100 因为我教师表中,没有id为100的,所以总的查询结果为null.
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)
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是只要不等于其中的任意一个,就成立
关于 IN,NOT IN,ANY和ALL使用时的陷进 可以看一下这篇帖子
https://blog.csdn.net/kkdelta/article/details/7468850
会继续更新~~~