您的位置:首页 > 数据库 > MySQL

【MySQL - 4】条件查询、排序查询、分组查询、分页查询、聚合函数等DQL操作大全(R)

2020-08-01 22:19 841 查看

目录

  • 2. 条件查询
  • 3. 排序查询
  • 4. 聚合函数
  • 5. 分组查询
  • 6. 分页查询
  • 在开始介绍各种查询之前,先给出一个总的语法框架

    select
    列名1, 列名2, ... ,列名n
    from
    表名
    where
    条件
    group by
    分组依据(列名)
    having
    分组后的条件(想看哪个分组)
    limit
    分页限定;

    以上的语法框架并不是每个部分都必须要有的,必须要有的部分是

    select 列名1, 列名2, ... ,列名n from 表名;

    其它部分则是根据需求进行选用,那么下面就来详细了解每个部分的功能吧

    1. 基础查询

    其实基础查询就是刚刚所说的必须要有的部分:

    select 列名1, 列名2, ... ,列名n from 表名;

    其中,如果我要查询所有的列名,就是查询整个表的话,则可以用*来代替列名列表,即上节课所介绍的:

    select * from 表名;

    为了方便演示,这里就不用上节课所创建的表啦,这里创建了一个新表

    CREATE TABLE test(id INT,NAME VARCHAR(8),sex VARCHAR(8),age INT,address VARCHAR(8),math INT,english INT);
    INSERT INTO test(id,NAME,sex,age,address,math,english) VALUES(1,"小明","男",23,"广东",98,65),
    (2,"花花公主","女",18,"福建",85,90),(3,"小月","女",47,"福建",83,99),(4,"马冬梅","女",65,"湖南",80,70),
    (5,"冬秋夏","男",18,"江西",23,NULL),(6,"江小冬","女",19,"北京",85,90),(7,"强仔","男",20,"上海",73,47),
    (8,"金翎中","男",30,"广东",87,56);

    查看一下这个表

    SELECT * FROM test;


    假如我不想看那么多信息,我只想看学号、姓名与性别怎么操作呢?

    SELECT id,NAME,sex FROM test;

    去重

    这时候,如果我又想看看这些同学分别在什么城市

    SELECT address FROM test;


    你会发现这样查询出来的城市数据,会有重复的部分,那么可不可以去重呢?那肯定是可以的,这里有一个

    DISTINCT
    关键词

    SELECT DISTINCT address FROM test;

    这样就可以实现去重的效果啦

    四则运算

    假如我想看一下每个同学的数学和英语成绩的总分,但是原始数据没有,怎么办呢?别担心,有办法,我们可以使用四则运算计算一些列的值并显示,什么意思?来,看看

    SELECT NAME,math,english,math+english FROM test;

    其查询结果

    哇,是不是很神奇?但是,冬秋夏同学好像有点问题,怎么会是NULL呢?英语没有考也应该有数学成绩呀?这是因为MySQL运算过程中只要有NULL都会得出NULL结果,怎么办呢?别急别急,我们可以利用

    IFNULL
    表达式改进一下

    • IFNULL(表达式1, 表达式2)
      :假如表达式1的值是NULL,则替换为表达式2

    下面来改写一下语句

    SELECT NAME,math,english,math+IFNULL(english,0) FROM test;

    起别名

    冬秋夏同学正常了吧?但是你又觉得这个列名太长了,可不可以自定义呢?对,也是可以的,这里就有一个

    AS
    关键词

    SELECT NAME,math,english,math+IFNULL(english,0) AS total FROM test;


    好看很多了吧?其实还可以改进,怎么改进?

    AS
    省略也可以达到重命名的效果

    SELECT NAME,math,english,math+IFNULL(english,0) total FROM test;

    其运行结果也是同样的,这里就不再贴出来啦

    2. 条件查询

    条件查询顾名思义就是筛选我们想看的数据,因此需要对数据定位,因此就需要

    WHERE
    关键词,其实在前面两篇文章中已经有接触过这个关键词了,下面先来介绍一下一些常用的运算符

    • <, >, <=, >=, =, <>
    • BETWEEN…AND…
    • IN(值1, 值2, … ,值n)
    • IS NULL
    • AND 或 &&
    • OR 或 ||
    • NOT 或 !

    上述

    <>
    运算符其实就是不等运算符,
    IN
    运算符随后直接演示会更加清楚,除此以外应该各自的意思都很清楚,就不详细解释了,下面直接来演示一下他的效果

    现在我需要看数学和英语都及格的同学的成绩

    SELECT * FROM test WHERE math>60 AND english>60;


    查看数学成绩在70与80之间的同学的成绩

    SELECT * FROM test WHERE math BETWEEN 70 AND 80;


    找出那个没有考英语的同学(英语成绩为),注意这里不能使用

    =NULL
    来判断

    SELECT * FROM test WHERE english IS NULL;


    现在要找出英语成绩是46,56或65的同学

    SELECT * FROM test WHERE english IN(65,56,47);


    经过一波操作,是不是就很清楚明白了,下面再介绍另外一个条件查询

    模糊查询

    • LIKE:有两个占位符,
      _
      表示单个任意字符,
      %
      表示多个任意字符

    究竟什么是模糊查询呢?这里来个简单的例子,我想要找一个名字里有“”的同学,那么这个冬就有可能出现在任意位置,因此需要用到占位符,

    %
    可以表示0-n个任意字符,因此这里使用它作为占位符

    SELECT * FROM test WHERE NAME LIKE "%冬%";


    现在我主意变了,想要找一个名字第一个字是“”的同学

    SELECT * FROM test WHERE NAME LIKE "小%";


    最后我再想找一下名字的第二个字是“”的同学,因为说明了是第二个字,那么这个字前就应该需要且只需要一个表示单个字符的占位符

    SELECT * FROM test WHERE NAME LIKE "_小%";

    3. 排序查询

    为排序查询服务的正是

    ORDER BY
    关键词,他的语法也很简单

    SELECT 列名1, 列名2, ... ,列名n from 表名 ORDER BY 列名1 排序方式1, 列名2 排序方式2, ... ,列名n;

    排序方式有两种:

    • ASC:升序排序,若不指定排序方式则默认以该种方式进行排序
    • DESC:降序排序

    另外注意,如果有多个排序条件,仅当前面的条件值一样的时候才会判断第二条件

    现在我们按数学成绩升序排序来查看一下

    SELECT * FROM test ORDER BY math;


    我们再按英语成绩为倒序排序来查看一下

    SELECT * FROM test ORDER BY english DESC;


    终极混合使用,现在需求是,按数学成绩升序排序,若数学成绩相同则按英语成绩升序排序,若英语成绩也相同则按学号降序排序

    SELECT * FROM test ORDER BY math ASC,english ASC,id DESC;

    4. 聚合函数

    聚合函数:将一列数据作为一个整体进行纵向计算,它的函数关键字有如下几种:

    • count:计算个数,一般选择不会有空值的列,假如非要选择有空值的列,也可以使用
      IFNULL
      解决
    • max:计算最大值,有空值会自动排除空值
    • min:计算最小值,有空值会自动排除空值
    • sum:计算,有空值会自动排除空值
    • avg:计算平均值,有空值会自动排除空值

    下面开始演示时间,首先是看总人数

    SELECT COUNT(id) FROM test;


    英语不及格的总人数

    SELECT COUNT(id) FROM test WHERE IFNULL(english,0) < 60;


    最高的数学成绩

    SELECT MAX(math) FROM test;


    最低的英语成绩

    SELECT MIN(english) FROM test;


    咦,好像有点问题,不应该是没有考试的同学最低吗?对,理论上肯定是这样,但是刚刚说了,这个函数会把NULL自动排除,因此我们需要做些手脚

    SELECT MIN(IFNULL(english,0)) FROM test;


    再来看看全班的数学总分英语总分

    SELECT SUM(math),SUM(english) FROM test;


    总分没啥意义?我们来看看平均分

    SELECT AVG(math),AVG(english) FROM test;


    慢着,英语平均分好像不太对?怎么没算没有考那个同学?这就对了,都说自动排除了,所以我们还是要做手脚

    SELECT AVG(math),AVG(IFNULL(english,0)) FROM test;


    这个成绩就对了嘛,可是作为班主任的你又觉得平均分太低了很难看,因此你决定看看及格的人的平均分

    SELECT AVG(math),AVG(IFNULL(english,0)) FROM test WHERE math>=60 AND english>=60;

    5. 分组查询

    分组查询的关键词的

    GROUP BY
    ,他的一般使用格式:

    SELECT 分组依据(列名),聚合函数 FROM test GROUP BY 分组依据(列名);

    是不是好像有点抽象?我们先来个直观的例子,假如我要看看女生男生分别的数学平均分

    SELECT sex,AVG(math) FROM test GROUP BY sex;


    是不是很清楚啦?其实在分组关键词附近还可以用关键词进行限定,主要是两个关键词:

    • WHERE
      :在分组之前进行限定,如果不满足条件,则不参与分组,其条件表达式不可以使用聚合函数
    • HAVING
      :在分组之后进行限定,如果不满足条件,则不进行显示,其条件表达式可以使用聚合函数

    又懵了对吧,下面继续用例子来唤醒你,现在我要看一下男生女生数学成绩大于80的人数

    SELECT sex,COUNT(id) FROM test WHERE math>80 GROUP BY sex;


    这时候你又不想看见那些人数太少的,因此我们又来限定一下

    SELECT sex,COUNT(id) FROM test WHERE math>80 GROUP BY sex HAVING COUNT(id)>2;


    咦,那个函数写两次聚合函数有点麻烦?你也可以帮它改名

    SELECT sex,COUNT(id) 人数 FROM test WHERE math>80 GROUP BY sex HAVING 人数>2;

    6. 分页查询

    说起分页查询,大家一下子可能不知道是什么东西,但绝对你用得很多,你在百度搜索某样东西的时候,通常会有数以万计的搜索结果,那百度是把全部结果都扔出来给你看了吗?没有,他给你10个结果一页,看完了你自己再去点下一页对吧?是这种操作吧?因此我们这里所介绍的分页查询同样也是这个意思,它所使用的关键字是

    LIMIT
    ,下面来看看他的语法

    SELECT 列名1, 列名2, ... ,列名n FROM 表名 LIMIT 开始索引,每页查询的页数;

    注意这个开始索引跟我们学的数组类似,是以0为开始的,下面就来看看刚刚那个学生表第一页查询的结果

    SELECT * FROM test LIMIT 0,3;


    第二页

    SELECT * FROM test LIMIT 3,3;


    第三页

    SELECT * FROM test LIMIT 6,3;


    最后一页结果不够显示则会有多少显示多少

    好啦,DQL相关操作全部介绍完啦,激动不?本文的内容比较多,语法很容易忘记,大家好好练习

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐