• MYSQL基础02DQL查询数据9


    DQL:查询表中的记录

    1、语法:

      select

        字段列表

      from

        表名列表

      where

        条件列表

      group by 

        分组字段

      having

        分组之后的条件

      order by

        排序

       limit

        分页限定

    2、基础查询

    准备数据,创建一个学生表,包含如下列:

    CREATE TABLE student (  
    id INT, -- 编号  
    NAME VARCHAR(20), -- 姓名  
    age INT, -- 年龄  
    sex VARCHAR(5), -- 性别  
    address VARCHAR(100), -- 地址  
    math INT, -- 数学  
    english INT -- 英语 
    ); 
    
    INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES 
    (1,'马云',55,'男','杭州',66,78),
    (2,'马化腾',45,'女','深圳',98,87),
    (3,'马景涛',55,'男','香港',56,77),
    (4,'柳岩',20,'女','湖南',76,65),
    (5,'柳青',20,'男','湖南',86,NULL),
    (6,'刘德华',57,'男','香港',99,99),
    (7,'马德',22,'女','香港',99,99),
    (8,'德玛西亚',18,'男','南京',56,65);

     1. 多个字段的查询

    • 语法:select 字段名1,字段名2... from 表名;
    • 注意:如果查询所有字段,则可以使用*来替代字段列表。

     2. 去除重复

    • 关键字:distinct
    • 注意:只有两个结果集的数据完全一样才能去重

     3. 计算列

    • 一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
    • ifnull(表达式1,表达式2):null参与的运算,计算结果都为null

        * 表达式1:哪个字段需要判断是否为null

        * 表达式2:如果该字段为null后的替换值。

     4. 起别名

    • 关键字as:as也可以省略。

     5. 练习:

      a. 查询姓名和年龄

        SELECT NAME,age FROM student;

        

      b. 查询所有数据

       SELECT * FROM student;

       

      c.查询不重复的地址

         SELECT address FROM student; -- 查询结果有重复的地址

       

        SELECT DISTINCT address FROM student; -- distinct去除重复值

       

       d. 计算math和english分数之和

       SELECT NAME,math,english,math + english FROM student; -- 这么写柳青的分数之和为null

       

       SELECT NAME,math,english,math + IFNULL(english,0) FROM student; -- 如果english值为null则替换为0

       

      e. 给math和english分数之和列起别名为总分

       SELECT NAME,math,english,math + IFNULL(english,0) AS 总分 FROM student;

       

       f. 给math和english起别名

       SELECT NAME,math 数学,english 英语,math + IFNULL(english,0) 总分 FROM student;

       

    3、条件查询

     1. where子句后跟条件

     2. 运算符

       * >、<、<=、>=、=、<> 

       * BETWEEN...AND

       * IN(集合)

       * LIKE:模糊查询

         *占位符:

           *_:单个任意字符

           * %:多个任意字符

       * IS NULL    

       * and 或 &&

       * or 或 || 

       * not 或 ! 

     3. 练习:

      a. 查询年龄大于20岁

       SELECT * FROM student WHERE age > 20;

       SELECT * FROM student WHERE age >= 20; -- 查询年龄大于等于20

       

      b. 查询年龄等于20岁
       SELECT * FROM student WHERE age = 20;

       

      c. 查询年龄不等于20岁
       SELECT * FROM student WHERE age != 20;
       SELECT * FROM student WHERE age <> 20;

       

      d. 查询年龄大于等于20 小于等于30
       SELECT * FROM student WHERE age >= 20 && age <=30; -- SQL中不推荐使用&&
       SELECT * FROM student WHERE age >= 20 AND age <=30;
       SELECT * FROM student WHERE age BETWEEN 20 AND 30; -- 包含20,包含30

       

      e. 查询年龄22岁,18岁,25岁的信息
       SELECT * FROM student WHERE age =22 OR age = 18 OR age = 25;
       SELECT * FROM student WHERE age IN (22,18,25);

       

      f. 查询英语成绩为null
       SELECT * FROM student WHERE english = NULL; -- 不对的,null值不能使用= !=判断
       SELECT * FROM student WHERE english IS NULL;

       

      g. 查询英语成绩不为null
       SELECT * FROM student WHERE english IS NOT NULL;

       

      h. 查询姓马的有哪些?
       SELECT * FROM student WHERE NAME LIKE '马%';

       

      i. 查询姓名第二个字是化的人
       SELECT * FROM student WHERE NAME LIKE '_化%';

       

      j. 查询姓名是三个字的人
       SELECT * FROM student WHERE NAME LIKE '___';

       

      k. 查询姓名中包含德的人
       SELECT * FROM student WHERE NAME LIKE '%德%';

       

    4、排序查询

      1. 语法:order by 子句

        * order by 排序字段1 排序方式1, 排序字段2 排序方式2...

      2. 排序方式:

        * ASC:升序,默认的排序方式。

        * DESC:降序。

      3. 注意:如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件

      4. 练习

        a. 按照数学成绩升序排名

          SELECT * FROM student ORDER BY math; -- 默认升序

          SELECT * FROM student ORDER BY math ASC;

          

        b. 按照数学成绩降序排名

          SELECT * FROM student ORDER BY math DESC;

          

        c. 按照数学成绩排名,如果数学成绩一样则按照英语成绩排名,都是升序

          SELECT * FROM student ORDER BY math ASC, english ASC;

          

        d. 按照数学成绩升序排名,如果数学成绩一样则按照英语成绩降序排名

          SELECT * FROM student ORDER BY math ASC, english DESC;

          

    5、聚合函数

     将一列数据作为一个整体,进行纵向的计算

      1. count:计算个数

        一般选择非空的列:主键

        count(*):*表示只要这一列数据有一个不为null,就能够算一条记录

      2. max:计算最大值

        SELECT MAX(math) FROM student;

      3. min:计算最小值

        SELECT MIN(math) FROM student;

      4. sum:计算和

        SELECT SUM(english) FROM student; -- 排除了null

      5. avg:计算平均值

        SELECT AVG(math) FROM student; 

        SELECT AVG(english) FROM student; -- 计算结果不正确,因为总分/人数,人数是排除null值之后的人数7

     * 注意:聚合函数的计算,会排除null值。

         解决方案:

          1. 选择不包含非空的列进行计算。

          2. IFNULL函数:SELECT COUNT(IFNULL(english,0)) FROM student;

    6、分组查询

     用来统计具有相同特征的某一类数据,把这些数据当成一个整体。

      1. 语法:group by 分组字段;

      2. 注意:

        * 分组之后查询的字段:分组字段、聚合函数

        *  where和having的区别?

          a. where在分组之前进行限定,如果不满足条件则不参与分组。having在分组之后进行限定,如果不满足结果则不会被查询出来

          b. where后不可以跟聚合函数。having可以进行聚合函数的判断

      3. 练习:

      a. 按照性别分组,分别查询男、女同学的数学平均分
       SELECT sex, AVG(math) FROM student GROUP BY sex;

       

      b. 按照性别分组,分别查询男、女同学的数学平均分,人数
       SELECT sex, AVG(math), COUNT(id) FROM student GROUP BY sex;

       SELECT sex, NAME,AVG(math), COUNT(id) FROM student GROUP BY sex; -- name无意义,因为查的是分组后额第一条数据

       

      c. 按照性别分组,分别查询男、女同学的数学平均分,人数 要求:分数低于70分的人不参与分组
       SELECT sex, AVG(math), COUNT(id) FROM student WHERE math >70 GROUP BY sex;

       

      d. 按照性别分组,分别查询男、女同学的数学平均分,人数 要求:分数低于70分的人不参与分组,分组之后人数要大于2个人
       SELECT sex, AVG(math), COUNT(id) FROM student WHERE math >70 GROUP BY sex HAVING COUNT(id)>2;

       SELECT sex, AVG(math), COUNT(id) 人数 FROM student WHERE math >70 GROUP BY sex HAVING 人数>2;

        

    7、分页查询

      1. 语法:limit 开始的索引,每页查询的条数;

      2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

       -- 每页显示3条记录

        SELECT * FROM student LIMIT 0,3; -- 第1页
        SELECT * FROM student LIMIT 3,3; -- 第2页
        SELECT * FROM student LIMIT 6,3; -- 第3页

      3. limit 是一个MySQL"方言",其他类型数据库(SQL Server、Oracle)用不了。

  • 相关阅读:
    会声会影教程之图片音乐相册制作
    js校验表单后提交表单的三种方法总结(转)
    如何避免后台IO高负载造成的长时间JVM GC停顿(转)
    nginx的upstream目前支持5种方式的分配(转)
    Nginx配置文件详细说明(转)
    如何将character_set_database latin1 改为 gbk(转)
    Maven打包可执行Jar包方式
    六种微服务架构的设计模式(转)
    Linux Shell 命令
    Condition的await-signal流程详解(转)
  • 原文地址:https://www.cnblogs.com/ajing2018/p/15690773.html
Copyright © 2020-2023  润新知