MySQL表查询
表查询关键字
select与from
select用于指定查询的字段,from用于指定查询的表。
select 查询的字段 from 表名
也可以给查询的字段起别名:
select 字段1 as 别名,字段2 as 别名 from 表名
where筛选
where关键字用于筛选数据。
select 查询的字段 from 表名 where 条件
条件 | 含义 |
---|---|
id>3 | 筛选id字段值大于3的记录 |
id>3 and id<6 | 筛选id字段值大于3并且小于6的记录 |
id between 3 and 6 | 筛选id字段值在[3,6]之间的记录 |
id=2 or id=3 | 筛选id字段值等于2或者3的记录 |
id in (2,3) | 筛选id字段值等于2或者3的记录 |
not id=2 | 筛选id字段值不等于2的记录 |
id is null | 筛选id字段值为空的记录 |
模糊查询
模糊查询指查询条件不是很明确的情况。
模糊查询 | 含义 |
---|---|
like | 开启模糊查询的关键字 |
% | 匹配任意个任意字符 |
_ | 匹配一个任意字符 |
举例:
例子 | 含义 |
---|---|
name like '%k%' | 查询name字段值中包含'k'的记录 |
name like '张%' | 查询name字段值中以'张'开头的记录 |
name like '张_' | 查询name字段值中以'张'开头,并且只有两个字符的记录 |
name like '___' | 查询name字段值中为三个字符组成的记录 |
group by分组
group by关键字可以根据字段把相同的值组成一个整体,比如性别有男和女,group by可以把性别为男的分为一组,把性别为女的分为一组。
作用:可以快速的统计出一些数据。
语法:
select 字段名 from 表名 group by 字段名;
分组后不能直接获取分组以外其他字段的数据,需要用特殊方法
聚合函数
专门用于分组之后的数据统计。
聚合函数 | 含义 |
---|---|
max() | 统计最大值 |
min() | 统计最小值 |
sum() | 统计求和 |
count() | 统计计数 |
avg() | 统计平均值 |
举例:
# 统计男生和女生中年龄最大的人
select sex,max(age) from person group by sex;
# 统计男生和女生的人数
select sex,count(age) from person group by sex;
# 统计男生和女生的平均年龄
select sex,avg(age) from person group by sex;
间接获取分组以外其他字段的数据
group_concat()方法:
select group_concat(字段1,字段2) from 表名 group by 分组字段
也可以自定义分隔符:
select group_concat(字段1,'|',字段2) from 表名 group by 分组字段
补充
mysql5.7及以上版本默认自带 sql_mode=only_full_group_by,该模式要求分组之后默认只可以直接获取分组的依据不能直接获取其他字段;
如果是MySQL5.6及以下版本,需要自己手动添加。
having过滤
关键字having和where的功能一样的,都是对数据进行筛选,只不过where是用在分组之前的查询筛选,having是用在分组之后的查询筛选。
select 字段 from 表 group by 分组字段 having 条件
distinct去重
distinct关键字用于去掉一模一样的记录,如果数据中有主键,那么肯定无法去重。
select distinct 查询的字段 from 表
order by排序
order by可以对查询出来的数据进行排序。
升序排序
select 字段 from 表 order by 排序字段
# 或者
select 字段 from 表 order by 排序字段 asc
降序排序
select 字段 from 表 order by 排序字段 desc
多字段排序:先按排序字段1升序排序,如果值一样,那么按照排序字段2降序排序。
select 字段 from 表 order by 排序字段1 asc 排序字段2 desc
limit分页
limit关键字用于限制查询出来的记录数。
语法1:只展示m条记录
select 字段 from 表 limit m
语法2:展示m条记录后的n条记录
select 字段 from 表 limit m,n
补充:查询记录最大值
select 字段 from 表 order by 排序字段 desc limit 1
regexp正则
regexp关键字可以使用正则表达式筛选数据。
select 展示的字段 from 表 where 字段 regexp '正则表达式'
多表查询
多表查询的思路有两种:子查询和连表查询
子查询
子查询就是将一条SQL语句的查询结果加括号当做另外一条SQL语句的查询条件;
比如现有学生表与班级表:
- student(sid,sname,cid(外键))
- class(cid,cname)
如果想要查询名字为'张三'的学生所在班级,可以先查询'张三'所在的班级id:
select cid from student where sname='张三';
然后把查询的结果当作条件:
select cname from class where cid=(
select cid from student where sname='张三'
);
这种多表查询方式就是子查询。
连表查询
连表查询即两张表或多张表联合查询,连表操作有四个关键字:
- inner join:只连接两张表中有对应关系的数据
- left join:以左边的表为基准,展示所有的数据,没有对应项则用NULL填充
- right join:以右边的表为基准,展示所有的数据,没有对应项则用NULL填充
- union:两张的表的查询结果拼接在一起输出,前提是两个查询的列数要相同
比如现有学生表与班级表:
- student(sid,sname,cid(外键))
- class(cid,cname)
inner join关键字查询
select sname,cname from student inner join class
on student.cid=class.cid;
left join关键字查询
select sname,cname from student left join class
on student.cid=class.cid;
right join关键字查询
select sname,cname from student right join class
on student.cid=class.cid;
union关键字查询
select sname,cname from student left join class
on student.cid=class.cid
union
select sname,cname from student right join class
on student.cid=class.cid;