zoukankan      html  css  js  c++  java
  • MySQL单表数据查询(DQL)

    数据准备工作:

    CREATE TABLE student(
        sid INT PRIMARY KEY AUTO_INCREMENT,
        sname VARCHAR(10),
        age TINYINT,
        city VARCHAR(10),
        score TINYINT
    );
    
    INSERT INTO student VALUES (NULL,"曹操",28,"洛阳",95);
    INSERT INTO student VALUES (NULL,"刘备",27,"成都",80);
    INSERT INTO student VALUES (NULL,"孙权",17,"建业",85);
    INSERT INTO student VALUES (NULL,"孔明",21,"成都",98);
    INSERT INTO student VALUES (NULL,"关羽",25,"成都",70);
    INSERT INTO student VALUES (NULL,"张飞",24,"成都",50);
    INSERT INTO student VALUES (NULL,"鲁肃",22,"建业",90);
    INSERT INTO student VALUES (NULL,"周瑜",19,"建业",97);
    INSERT INTO student VALUES (NULL,"郭嘉",23,"洛阳",98);
    INSERT INTO student VALUES (NULL,"小乔",18,"建业",70);
    INSERT INTO student VALUES (NULL,"貂蝉",26,NULL,65);

    一、简单查询

    语法:select select选项 字段列表 from 数据源;

     select选项:系统该如何对待查询得到的结果

    all:默认的,表示保存所有的记录

    distinct:去重,去除重复的记录(所有的字段值都相同),只保留一条

    字段列表:对查询结果显示哪些列名

    *:全部列名

    as:给列名起别名,解决从多张表获取数据存在列名冲突的问题

    from数据源:只要是一个符合二维表结构的数据即可

    单表数据:from 表名

    多表数据:from 表名1,表名2...

    动态数据:from (select select选项 字段列表 from 数据源) as 别名

    1.1 查询所有学生

    查询指令:select * from student;

    mysql> select * from student;
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   1 | 曹操   |   28 | 洛阳   |    95 |
    |   2 | 刘备   |   27 | 成都   |    80 |
    |   3 | 孙权   |   17 | 建业   |    85 |
    |   4 | 孔明   |   21 | 成都   |    98 |
    |   5 | 关羽   |   25 | 成都   |    70 |
    |   6 | 张飞   |   24 | 成都   |    50 |
    |   7 | 鲁肃   |   22 | 建业   |    90 |
    |   8 | 周瑜   |   19 | 建业   |    97 |
    |   9 | 郭嘉   |   23 | 洛阳   |    98 |
    |  10 | 小乔   |   18 | 建业   |    70 |
    |  11 | 貂蝉   |   26 | NULL   |    65 |
    +-----+--------+------+--------+-------+
    11 rows in set (0.03 sec)

    1.2 查询学生姓名和年龄

    查询指令:select sname,age from student;

    mysql> select sname,age from student;
    +--------+------+
    | sname  | age  |
    +--------+------+
    | 曹操   |   28 |
    | 刘备   |   27 |
    | 孙权   |   17 |
    | 孔明   |   21 |
    | 关羽   |   25 |
    | 张飞   |   24 |
    | 鲁肃   |   22 |
    | 周瑜   |   19 |
    | 郭嘉   |   23 |
    | 小乔   |   18 |
    | 貂蝉   |   26 |
    +--------+------+
    11 rows in set (0.00 sec)

    1.3 运算查询:将所有学生的年龄+10进行显示

    查询指令:select sname,age+10 from student;

    mysql> select sname,age+10 from student;
    +--------+--------+
    | sname  | age+10 |
    +--------+--------+
    | 曹操   |     38 |
    | 刘备   |     37 |
    | 孙权   |     27 |
    | 孔明   |     31 |
    | 关羽   |     35 |
    | 张飞   |     34 |
    | 鲁肃   |     32 |
    | 周瑜   |     29 |
    | 郭嘉   |     33 |
    | 小乔   |     28 |
    | 貂蝉   |     36 |
    +--------+--------+
    11 rows in set (0.00 sec)

     1.4 别名查询:将列名sname,age分别用中文显示

    查询指令:select sname as 姓名,age as 年龄 from student;

    mysql> select sname as 姓名,age as 年龄 from student;
    +--------+--------+
    | 姓名   | 年龄   |
    +--------+--------+
    | 曹操   |     28 |
    | 刘备   |     27 |
    | 孙权   |     17 |
    | 孔明   |     21 |
    | 关羽   |     25 |
    | 张飞   |     24 |
    | 鲁肃   |     22 |
    | 周瑜   |     19 |
    | 郭嘉   |     23 |
    | 小乔   |     18 |
    | 貂蝉   |     26 |
    +--------+--------+
    11 rows in set (0.00 sec)

    二、高级查询

    语法:select select选项 字段列表 from 数据源 where 条件 group by 分组 having 条件 order by 排序 limit 分页 ;

    2.1 where 子句

    作用:针对表去对应的磁盘处获取所有的记录,where的作用就是在拿到一条结果就开始进行判断,判断是否符合

    条件,如果符合就获取放到内存中去,如果不符合条件就不获取。

     

    2.1.1 查询年龄大于24的学生

    查询指令:select * from student where age > 24;

    mysql> select * from student where age > 24;
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   1 | 曹操   |   28 | 洛阳   |    95 |
    |   2 | 刘备   |   27 | 成都   |    80 |
    |   5 | 关羽   |   25 | 成都   |    70 |
    |  11 | 貂蝉   |   26 | NULL   |    65 |
    +-----+--------+------+--------+-------+
    4 rows in set (0.00 sec)

    2.1.2 查询年龄是18到22的学生

    查询指令:select * from student where age between 18 and 22;

    mysql> select * from student where age between 18 and 22;
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   4 | 孔明   |   21 | 成都   |    98 |
    |   7 | 鲁肃   |   22 | 建业   |    90 |
    |   8 | 周瑜   |   19 | 建业   |    97 |
    |  10 | 小乔   |   18 | 建业   |    70 |
    +-----+--------+------+--------+-------+
    4 rows in set (0.00 sec)

    2.1.3 查询地址是成都或洛阳的学生

    查询指令:select * from student where city in ("成都","洛阳");

    mysql> select * from student where city in ("成都","洛阳");
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   1 | 曹操   |   28 | 洛阳   |    95 |
    |   2 | 刘备   |   27 | 成都   |    80 |
    |   4 | 孔明   |   21 | 成都   |    98 |
    |   5 | 关羽   |   25 | 成都   |    70 |
    |   6 | 张飞   |   24 | 成都   |    50 |
    |   9 | 郭嘉   |   23 | 洛阳   |    98 |
    +-----+--------+------+--------+-------+
    6 rows in set (0.00 sec)

    2.1.4 查询姓孙的学生

    查询指令:select * from student where sname like "孙%";

    mysql> select * from student where sname like "孙%";
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   3 | 孙权   |   17 | 建业   |    85 |
    +-----+--------+------+--------+-------+
    1 row in set (0.00 sec)

    2.1.5 查询地址不为空的学生

    查询指令:select * from student where city is not null;

    mysql> select * from student where city is not null;
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   1 | 曹操   |   28 | 洛阳   |    95 |
    |   2 | 刘备   |   27 | 成都   |    80 |
    |   3 | 孙权   |   17 | 建业   |    85 |
    |   4 | 孔明   |   21 | 成都   |    98 |
    |   5 | 关羽   |   25 | 成都   |    70 |
    |   6 | 张飞   |   24 | 成都   |    50 |
    |   7 | 鲁肃   |   22 | 建业   |    90 |
    |   8 | 周瑜   |   19 | 建业   |    97 |
    |   9 | 郭嘉   |   23 | 洛阳   |    98 |
    |  10 | 小乔   |   18 | 建业   |    70 |
    +-----+--------+------+--------+-------+
    10 rows in set (0.00 sec)

    2.1.6 查询地址为成都或洛阳,且年龄大于25的学生

    查询指令:select * from student where city in ("成都","洛阳") and age > 25;

    mysql> select * from student where city in ("成都","洛阳") and age > 25;
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   1 | 曹操   |   28 | 洛阳   |    95 |
    |   2 | 刘备   |   27 | 成都   |    80 |
    +-----+--------+------+--------+-------+
    2 rows in set (0.00 sec)

    2.1.7 查询地址不是成都或洛阳的学生

    查询指令:select * from student where city not in ("成都","洛阳");

    mysql> select * from student where city not in ("成都","洛阳");
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   3 | 孙权   |   17 | 建业   |    85 |
    |   7 | 鲁肃   |   22 | 建业   |    90 |
    |   8 | 周瑜   |   19 | 建业   |    97 |
    |  10 | 小乔   |   18 | 建业   |    70 |
    +-----+--------+------+--------+-------+
    4 rows in set (0.00 sec)

    2.2 group by 子句

    作用:根据指定的字段,将数据进行分组,分组的目标是为了统计。

    聚合函数:对分组数据进行统计操作。

    count():统计每组中的数量,如果统计目标是字段,那么不统计为空NULL字段,如果为*,则统计记录数

    avg():求平均值

    sum():求和

    max():求最大值

    min():求最小值

    2.2.1 统计各个地方的人数

    查询指令:select city,count(*) from student group by city;

    mysql> select city,count(*) from student group by city;
    +--------+----------+
    | city   | count(*) |
    +--------+----------+
    | NULL   |        1 |
    | 建业   |        4 |
    | 成都   |        4 |
    | 洛阳   |        2 |
    +--------+----------+
    4 rows in set (0.02 sec)

    2.2.2 统计各个地方的平均年龄

    查询指令:select city,avg(age) from student group by city;

    mysql> select city,avg(age) from student group by city;
    +--------+----------+
    | city   | avg(age) |
    +--------+----------+
    | NULL   |  26.0000 |
    | 建业   |  19.0000 |
    | 成都   |  24.2500 |
    | 洛阳   |  25.5000 |
    +--------+----------+
    4 rows in set (0.01 sec)

    2.2.3 统计各个地方的成绩总和

    查询指令: select city,sum(score) from student group by city;

    mysql> select city,sum(score) from student group by city;
    +--------+------------+
    | city   | sum(score) |
    +--------+------------+
    | NULL   |         65 |
    | 建业   |        342 |
    | 成都   |        298 |
    | 洛阳   |        193 |
    +--------+------------+
    4 rows in set (0.00 sec)

    2.2.4 统计各个地方的最大成绩与最小成绩

    查询指令:select city,max(score),min(score) from student group by city;

    mysql> select city,max(score),min(score) from student group by city;
    +--------+------------+------------+
    | city   | max(score) | min(score) |
    +--------+------------+------------+
    | NULL   |         65 |         65 |
    | 建业   |         97 |         70 |
    | 成都   |         98 |         50 |
    | 洛阳   |         98 |         95 |
    +--------+------------+------------+
    4 rows in set (0.01 sec)

    2.3 having 子句

    作用:对分组后的数据进行筛选

    having与where的区别:

    1.having是在分组后对数据进行过滤,where是在分组前对数据进行过滤

    2.having后面可以使用统计函数过滤数据,where后面不可以使用统计函数

    2.3.1 统计各个地方的学生人数,获取人数大于2的数据

    查询指令:select city,count(*) as num from student group by city having num > 2;

    mysql> select city,count(*) as num from student group by city having num > 2;
    +--------+-----+
    | city   | num |
    +--------+-----+
    | 建业   |   4 |
    | 成都   |   4 |
    +--------+-----+
    2 rows in set (0.00 sec)

    注意:having是在group by之后,group by是在where之后,where的时候表示将数据从磁盘拿到内存,

    where之后的所有操作都是内存操作。

    2.4 order by 子句

    作用:对查询结果进行排序显示,默认按升序,可以对多个字段进行排序

    asc:升序排序

    desc:降序排序

    2.4.1 把所有学生先按成绩进行降序排序,再按年龄进行升序排序

    查询指令:select * from student order by score desc,age asc;

    mysql> select * from student order by score desc,age asc;
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   4 | 孔明   |   21 | 成都   |    98 |
    |   9 | 郭嘉   |   23 | 洛阳   |    98 |
    |   8 | 周瑜   |   19 | 建业   |    97 |
    |   1 | 曹操   |   28 | 洛阳   |    95 |
    |   7 | 鲁肃   |   22 | 建业   |    90 |
    |   3 | 孙权   |   17 | 建业   |    85 |
    |   2 | 刘备   |   27 | 成都   |    80 |
    |  10 | 小乔   |   18 | 建业   |    70 |
    |   5 | 关羽   |   25 | 成都   |    70 |
    |  11 | 貂蝉   |   26 | NULL   |    65 |
    |   6 | 张飞   |   24 | 成都   |    50 |
    +-----+--------+------+--------+-------+
    11 rows in set (0.00 sec)

    2.5 limit 子句

    作用:利用limit来限制获取指定区间的数据。

    基本语法:limit offset,length;

    offset:偏移量,从哪条记录开始,第一条记录为0

    length:长度,获取多少条记录

    2.5.1 对成绩进行排名,获取成绩是第6名到第10名的学生

    查询指令:select * from student order by score desc limit 5,5;

    mysql> select * from student order by score desc limit 5,5;
    +-----+--------+------+--------+-------+
    | sid | sname  | age  | city   | score |
    +-----+--------+------+--------+-------+
    |   3 | 孙权   |   17 | 建业   |    85 |
    |   2 | 刘备   |   27 | 成都   |    80 |
    |   5 | 关羽   |   25 | 成都   |    70 |
    |  10 | 小乔   |   18 | 建业   |    70 |
    |  11 | 貂蝉   |   26 | NULL   |    65 |
    +-----+--------+------+--------+-------+
    5 rows in set (0.00 sec)
  • 相关阅读:
    this指向
    this指向
    this指向
    this指向
    a=b=c 连等赋值的分析
    测试应用documentFragment 和 直接操作dom 的区别
    javascript 基本数据类型、引用数据类型
    判断一个变量的具体类型 的终极方案
    判断变量是否为 NaN
    C#稳固基础:传统遍历与迭代器
  • 原文地址:https://www.cnblogs.com/heqiuyong/p/9484846.html
Copyright © 2011-2022 走看看