MySQL-查询

好吧,查询这个重要的操作,可能是数据库操作的“灵魂”吧。

简单的查询操作

1
select * from students;

消除重复行

1
select distinct gender from students;

条件

使用 where 子句对表中的数据筛选,结果为 True 的行会出现在结果集中。

1
select * from students where id >= 3;

比较运算符

  • 等于=
  • 大于>
  • 大于等于>=
  • 小于<
  • 小于等于<=
  • 不等于!=或<>
1
2
3
4
5
6
# 查询 id 不小于 3 的学生
select * from students where id >= 3;
# 查询 name 不是 'ahojcn' 的学生
select * from students where name != 'ahojcn';
# 查询没被删除的学生
select * from students where isdelete = 0;

逻辑运算符

  • and
  • or
  • not
1
2
3
4
# 查询编号大于 3 的女同学
select * from students where id > 3 and gender = 0;
# 查询编号小于 4 或没有删除的学生
select * from students where id < 4 and isdelete = 0;

模糊查询

  • like
  • %表示任意多个任意字符
  • _表示一个任意字符
1
2
3
4
5
6
# 查询姓 黄 的学生
select * from students where name like '黄%';
# 查询姓 黄 并且名字是一个字的学生
select * from students where name like '黄_';
# 查询姓 黄 或名字中含有 景 的学生
select * from students where name like '黄%' or name like '%景%';

范围查询

  • in表示在一个非连续的范围内
  • between … and …表示在一个连续的范围内
1
2
3
4
5
6
# 查询 id 是 1 或 2 或 6 的学生
select * from students where id in (1, 2, 6);
# 查询 id 在 3~8 之间的学生
select * from students where id between 3 and 8;
# 查询 id 在 3~8 的男生
select * from students where id between 3 and 8 and gender = 1;

NULL 判断

注意:NULL 与 '' 不同

1
2
3
4
# 查找没有填 birthday 的学生
select * from students where birthday is null;
# 查找填写了 birthday 的女生
select * from students where birthday is not null and gender = 0;

优先级

  • 小括号,not,比较运算符,逻辑运算符
  • and比or先运算,如果同时出现并希望先算or,需要结合()使用

聚合

MySQL 提供了 5 个聚合函数,可以快读得到统计数据。

  1. count(*) 表示计算总行数,括号中写星与列名,结果是相同的。

    1
    2
    # 查询学生总数
    select count(*) from students;
  2. max(列)表示求此列的最大值

    1
    2
    # 查询女生的编号最大值
    select max(id) from students where gender = 0;
  3. min(列)表示求此列的最小值

    1
    2
    # 查询未删除的学生最小编号
    select min(id) from students where isdelect = 0;
  4. sum(列)表示求此列的和

    1
    2
    # 查询男生编号之和
    select sum(id) from students where gender = 1;
  5. avg(列)表示求此列的平均值

    1
    2
    # 查询未删除女生的编号平均值
    select avg(id) from students where gender = 0;

分组

按照此字段分组,表示此字段相同的数据会被分到一个组中。

分组后,只能查询出相同的列,对于有差异的数据列无法从结果集中查出来。

可以对分组后的数据进行统计,做聚合运算。

1
2
3
4
5
6
7
8
9
10
11
12
# 语法
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...

# 查询男、女生总数
select gender as 性别,count(*)
from students
group by gender;

# 查询各城市总人数
select hometown as 家乡,count(*)
from studnets
group by hometown;

分组后筛选

1
2
3
4
# 语法
select 列1,列2,聚合... from 表名
group by 列1,列2,列3...
having 列1,...聚合...;

having后面的条件运算符与 where 的相同。

1
2
3
4
5
6
7
# 查询男生总人数 1
select count(*) from students where gender = 1;

# 查询男生总人数 2
select gender as 性别,count(*) from students
group by gender
having gender = 1;

对比 where 和 having

where 是对 from 后面指定的表进行数据筛选,属于对原始数据的筛选

having 是对 group by 的结果进行筛选

对比 where 和 having

排序

为了方便查看数据,可以对数据进行排序。

1
2
3
# 语法
select * from 表名
order by 列1 asc|desc,列2 asc|desc,...;
  • 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
  • 默认按照列值从小到大排列
  • asc从小到大排列,即升序
  • desc从大到小排序,即降序
1
2
3
4
5
6
7
8
9
# 查询未删除男生信息,按学号降序
select * from students
where gender = 1 and isdelete = 0
order by id desc;

# 查询未删除科目信息,按名称升序
select * from subject
where isdelete = 0
order by title;

分页

当数据量过大时,在一页中查看数据是一件非常麻烦的事情。

1
2
3
# 语法
select * from 表名
limit start,count
  • 从start开始,获取count条数据
  • start索引从0开始

示例:分页

  • 已知:每页显示m条数据,当前显示第n页
  • 求总页数:此段逻辑后面会在python中实现
    • 查询总条数p1
    • 使用p1除以m得到p2
    • 如果整除则p2为总数页
    • 如果不整除则p2+1为总页数
  • 求第n页的数据
1
2
3
select * from students
where isdelete=0
limit (n-1)*m,m

结果

总结

  • 完整的select语句
1
2
3
4
5
6
select distinct *
from 表名
where ....
group by ... having ...
order by ...
limit star,count
  • 执行顺序为:
    • from 表名
    • where ….
    • group by …
    • select distinct *
    • having …
    • order by …
    • limit star,count

文章作者: ahoj
文章链接: https://ahoj.cc/2019/06/MySQL-查询/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ahoj 的小本本