mysql查询关键字补充与多表查询


目录
  • 查询关键字补充
    • having过滤
    • distinct去重
    • order by排序
    • limit分页
    • regexp正则
  • 多表查询
    • 子查询
    • 连表查询

查询关键字补充

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;