文章目录
- 模糊检索
- like匹配
- 正则
- Between and
- In
- 分组查询
- 聚合函数
- 分组Group by
- Having子句
- 关联查询
- 为什么需要关联查询
- 内连接(等值连接)
- 外连接
- 交叉连接(笛卡尔乘积)
- 自连接
模糊检索
like匹配
模糊查询提取的数据不一定是确切的, 它允许用户输入的查询条件也是模糊的、大概的、不特别明确的。 例如,只查询王姓学员的信息
正则
“.” 匹配任意单个的字符。
“[]” 匹配在[]内的任意一个字符
“[^]” 匹配不在[]内的任意一个字符
“ * ” 匹配零个或多个在它前面的字符
“^” 匹配文本的开始字符
“$” 匹配文本的结尾字符
“+” 匹配+前面的字符1次或多次
“{n}” 匹配前面的字符至少n次
-- 模糊查询 LIKE %匹配 _ 代表匹配的数字
select * from class where c_name LIKE '%3班'
select * from class where c_name LIKE '_3班'
select * from class where c_name LIKE '%3班%'
-- mybatis
select * from class where c_name LIKE CONCAT('%','3班','%')
Between and
-- between AND 包含3和5
select * from class where id between 3 and 5;
In
用来匹配某个字段的值是几个可数的选项值之一
-- in 在指定范围
select * from class where id in (3,4,5,6)
update class set c_name = '1222班' where id = 4
select * from class where id in (4,5)
分组查询
**分组:**查询的是右侧的分组信息与左侧的原有信息无关,最终展示的是分组信息。无法展示原本的原有的信息。因为每一个组都对应了多个原有信息。对于分组之后:展示列的位置上只能有分组列和聚合列,但是不能出现普通列。——MySql可以展示,展示的原有数据的第一条。
聚合函数
获取某些列的最大值、最小值、平均值等统计分析信息,有时候还需要计算出究竟查询到多少行数据项。分别有:sum、count(注意非空值)——计数,结果集有几行、max、min、avg
-- 聚合函数 max() min() avg()平均 count()总数 sum()求和
select max(id) from class;
分组Group by
注意: 分组查询一般和聚合函数连用
-- group by 分组
select avg(id) from class group by(c_name);
select * from class;
alter table class add age int;
select avg(id) from class group by(c_name);
select avg(id) 平均id,age 年龄分类 from class group by(age);
Having子句
Having目的:对分组后的数据做过滤
-- having 分组查询的时候 条件语句需要having
select avg(id) 平均id,age 年龄分类 from class group by(age) having 平均id > 5;
关联查询
为什么需要关联查询
– 表一般是拆分:避免冗余存储,修改 删除风险很大,而且占地
– 拆分之后:增删改方便了而且扩展,但是查询效率低了。需要数据找多张表
关联查询:就是将多张表数据根据一定的条件组合到一起,类似一张表的效果展示。
内连接:等值连接。
外连接
交叉连接
内连接(等值连接)
内连接和外连接一样都是最常用的连接查询,它根据表中共同的的列进行匹配,特别是两个表存在主外键关系时,通常会使用到内连接查询
内连接也称为等值连接,返回的结果集是两个表中所有相匹配的数据,舍弃不匹配的数据两张表都符合关联条件——根据关联条件查询左表有数据右表也数据那么改数据展示,如果一张表有一张表没有就不显示。
eg:班级和学生关联查询——班级id=班级id学生中的班级id在班级中找不到——这个学生不显示101班,没有学生——不会学生班级id直接null–肯定找不到数据所以不显示。
select 列名
from 表1
inner join 表2 on 表1和表2 的关联条件
inner join 表3 on 表1和表3的 表2 和表3条件–关联条件
select exam,b.studentname,c.subjectname
from exam a
join studentinfo b on a.studentid=b.studentid
join `subject` c on a.subjectid=c.subjectid
-- 查询教师名称以及教师的部门名称
外连接
-- 左外连接 写在前面的表展示完全 没有的数据用null LEFT OUTER JOIN
select * from class c left join class_t t on c.id = t.c_id;
-- having 分组查询的时候 条件语句需要having
select avg(id) 平均id,age 年龄分类 from class group by(age) having 平均id > 5;
交叉连接(笛卡尔乘积)
-- 交叉连接:笛卡尔乘积
select *
from emp a
join dbdate b on 1=1
select a.empname,b.dateinfo,c.*
from emp a
cross join dbdate b
left join ribao c on a.empid=c.empid and b.dateid=c.dateid
自连接
select 学生.*,组长.stuname as 组长名
from tab_stu 学生
left join tab_stu 组长 on 学生.zuzhangid=组长.stuid