• 八:SQL之DQL数据查询语言单表操作


    前言:

      DQL数据库查询语言是我们在开发中最常使用的SQL,这一章总结了单表操作部分的常用查询方式

      主要操作有:查询所有字段、查询指定字段、查询指定记录、带IN的关键字查询,范围查询,陪查询、查询空值

      带AND的多条件查询、带OR的多条件查询,关键字DISTINCT,查询结果排序,分组查询。分页查询等

    准备好数据测试表 

     1 mysql> select * from student;
     2 +------+----------+-------+----------+-------------+
     3 | s_id | s_name   | s_age | s_gender | s_major     |
     4 +------+----------+-------+----------+-------------+
     5 |    1 | 马化腾   |    54 || CEO         |
     6 |    2 | 雷军     |    48 || CEO         |
     7 |    3 | 丁磊     |    46 || CEO         |
     8 |    4 | 马云     |    51 || CEO         |
     9 |    5 | 刘强东   |    45 || CEO         |
    10 |    6 | 王健林   |    65 || CEO         |
    11 |    7 | 周鸿祎   |    46 || CEO         |
    12 |    8 | 章泽天   |    25 || NULL        |
    13 |    9 | 章子怡   |    39 || NULL        |
    14 |   10 | 张一山   |    27 || 演员        |
    15 |   11 | 冯小刚   |    66 || 导演        |
    16 |   12 | 张艺谋   |    68 || 导演        |
    17 |   13 | 刘亦菲   |    32 || 演员        |
    18 |   14 | 莫言     |    70 || 作家        |
    19 |   15 | 科比     |    35 || 运动员      |
    20 |   16 | 梅西     |    31 || 运动员      |
    21 |   17 | 约翰塞纳 |    42 || 运动员      |
    22 |   18 | 凤姐     |    36 || NULL        |
    23 |   19 | 詹姆斯   |    31 || 运动员      |
    24 |   20 | 内马尔   |    25 || 运动员      |
    25 |   21 | 胡歌     |    35 || 演员        |
    26 |   22 | 许家印   |    67 || CEO         |
    27 |   23 | 周杰伦   |    35 || 歌手        |
    28 |   24 | 鹿晗     |    27 || 偶像明星    |
    29 |   25 | P-Gone   |    20 || 歌手        |
    30 |   26 | 李安     |    55 || 导演        |
    31 |   27 | 斯图尔特 |    28 || 演员        |
    32 |   29 | 犀利哥   |    45 || 乞丐        |
    33 |   31 | 冯提莫   |    26 || 主播        |
    34 |   32 | 卢本伟   |    25 || 主播        |
    35 |   33 | 小狗     |    21 || LOL职业选手 |
    36 |   34 | Gogoing  |    26 || LOL职业选手 |
    37 |   35 | 仙凡     |    27 || 主播        |
    38 |   36 | 黑人毅   |    29 || 主播        |
    39 |   37 | 旭旭宝宝 |    28 || 主播        |
    40 |   38 | 大龙猫   |    27 || 主播        |
    41 |   39 | 奥巴马   |    57 || 前美国总统  |
    42 |   40 | 克林顿   |    20 || 前美国总统  |
    43 |   42 | 林俊杰   |    37 || 歌手        |
    44 |   43 | 张韶涵   |    35 || 歌手        |
    45 |   44 | 杨紫     |    27 || 演员        |
    46 |   45 | 马东     |    49 || 主持人      |
    47 +------+----------+-------+----------+-------------+
    48 42 rows in set (0.00 sec)
    练习的数据库表

    一:查询所有

      1.1:查询所有记录  

          select * from student;

      1.2:查询指定字段

          select s_id,s_name,s_major from student;

      1.3:查询指定记录(带条件)

          select * from student where s_age > 50;

    二:关键字IN

      2.1:in(xx,yy,mm,..)满足条件的都会被查出来

      

    三:带BETWEEN AND 关键字

      3.1:between xx and yy指定了范围[xx yy]前后都包括在内

      

    四:带LIKE的模糊查询

      4.1:字段  LIKE  '值'--表示全匹配,LIKE相当于= 

      

      4.2:字段 LIKE '%值';匹配最后一个

      4.3:字段 LIKE '值%';匹配第一个

      4.4:字段 LIKE '%值%';全匹配

      

      4.5:字段 LIKE '_值';  _表示一个字符占位符

      4.6:字段 LIKE '值_';

      4.7:字段 LIKE '_值'_; 

     1 mysql> select * from student where s_name like '__马';
     2 +------+--------+-------+----------+------------+
     3 | s_id | s_name | s_age | s_gender | s_major    |
     4 +------+--------+-------+----------+------------+
     5 |   39 | 奥巴马 |    57 || 前美国总统 |
     6 +------+--------+-------+----------+------------+
     7 1 row in set (0.00 sec)
     8 
     9 mysql> select * from student where s_name like '马_';
    10 +------+--------+-------+----------+---------+
    11 | s_id | s_name | s_age | s_gender | s_major |
    12 +------+--------+-------+----------+---------+
    13 |    4 | 马云   |    51 || CEO     |
    14 |   45 | 马东   |    49 || 主持人  |
    15 +------+--------+-------+----------+---------+
    16 2 rows in set (0.00 sec)
    17 
    18 mysql> select * from student where s_name like '马__';
    19 +------+--------+-------+----------+---------+
    20 | s_id | s_name | s_age | s_gender | s_major |
    21 +------+--------+-------+----------+---------+
    22 |    1 | 马化腾 |    54 || CEO     |
    23 +------+--------+-------+----------+---------+
    24 1 row in set (0.00 sec)
    25 
    26 mysql> select * from student where s_name like '_马_';
    27 +------+--------+-------+----------+---------+
    28 | s_id | s_name | s_age | s_gender | s_major |
    29 +------+--------+-------+----------+---------+
    30 |   20 | 内马尔 |    25 || 运动员  |
    31 +------+--------+-------+----------+---------+
    32 1 row in set (0.00 sec)

    五:空值查询

      5.1:空值是指null并不是“"一般表示数据未知,或者在以后添加数据时,其字段默认为null  

     1 mysql> select * from student where isnull(s_major);
     2 +------+--------+-------+----------+---------+
     3 | s_id | s_name | s_age | s_gender | s_major |
     4 +------+--------+-------+----------+---------+
     5 |    8 | 章泽天 |    25 || NULL    |
     6 |    9 | 章子怡 |    39 || NULL    |
     7 |   18 | 凤姐   |    36 || NULL    |
     8 +------+--------+-------+----------+---------+
     9 3 rows in set (0.00 sec)
    10 
    11 mysql> select * from student where s_major is null;
    12 +------+--------+-------+----------+---------+
    13 | s_id | s_name | s_age | s_gender | s_major |
    14 +------+--------+-------+----------+---------+
    15 |    8 | 章泽天 |    25 || NULL    |
    16 |    9 | 章子怡 |    39 || NULL    |
    17 |   18 | 凤姐   |    36 || NULL    |
    18 +------+--------+-------+----------+---------+
    19 3 rows in set (0.00 sec)

      5.2:非空值查询 IS NOT NULL;    

       select * from student where s_major is not null;

    六:带 AND 或 OR 的多条件查询

     1 mysql> select * from student where s_age >= 60 and s_age < 70;
     2 +------+--------+-------+----------+---------+
     3 | s_id | s_name | s_age | s_gender | s_major |
     4 +------+--------+-------+----------+---------+
     5 |    6 | 王健林 |    65 || CEO     |
     6 |   11 | 冯小刚 |    66 || 导演    |
     7 |   12 | 张艺谋 |    68 || 导演    |
     8 |   22 | 许家印 |    67 || CEO     |
     9 +------+--------+-------+----------+---------+
    10 4 rows in set (0.00 sec)
    11 
    12 mysql> select * from student where s_age >= 60 or s_age <=20;
    13 +------+--------+-------+----------+------------+
    14 | s_id | s_name | s_age | s_gender | s_major    |
    15 +------+--------+-------+----------+------------+
    16 |    6 | 王健林 |    65 || CEO        |
    17 |   11 | 冯小刚 |    66 || 导演       |
    18 |   12 | 张艺谋 |    68 || 导演       |
    19 |   14 | 莫言   |    70 || 作家       |
    20 |   22 | 许家印 |    67 || CEO        |
    21 |   25 | P-Gone |    20 || 歌手       |
    22 |   40 | 克林顿 |    20 || 前美国总统 |
    23 +------+--------+-------+----------+------------+
    24 7 rows in set (0.00 sec)

    七:关键字DISTINCT,去重复查询

      去重复查询只是将给定列中的重复的记录去掉  

      

    八:分组查询 GOUP BY

      8.1:分组查询就是把值相等的列分到一个组里面

      8.2:带条件的分组查询where having的情况

        where:在分组前对表数据进行过滤,因此位置在group by前面

        having:在分组后对结果进行过滤,因此位置在group by后面

      8.3:分组查询可使用count()查询出每一组具体有多少条记录

      8.4:使用group_ concat(列名)还可以将该组中该列所有值查询出来

      8.5:还可以将分组查询的结果使用 order by排序

    参照以下代码

     1 mysql> select count(s_name) as 该组总数,s_major from student group by s_major;
     2 +----------+-------------+
     3 | 该组总数 | s_major     |
     4 +----------+-------------+
     5 |        3 | NULL        |
     6 |        8 | CEO         |
     7 |        2 | LOL职业选手 |
     8 |        1 | 主持人      |
     9 |        6 | 主播        |
    10 |        1 | 乞丐        |
    11 |        1 | 作家        |
    12 |        1 | 偶像明星    |
    13 |        2 | 前美国总统  |
    14 |        3 | 导演        |
    15 |        4 | 歌手        |
    16 |        5 | 演员        |
    17 |        5 | 运动员      |
    18 +----------+-------------+
    19 13 rows in set (0.00 sec)
    20 
    21 mysql> select count(s_name) as 该组总数,s_major from student group by s_major having count(s_name) >= 4;
    22 +----------+---------+
    23 | 该组总数 | s_major |
    24 +----------+---------+
    25 |        8 | CEO     |
    26 |        6 | 主播    |
    27 |        4 | 歌手    |
    28 |        5 | 演员    |
    29 |        5 | 运动员  |
    30 +----------+---------+
    31 5 rows in set (0.00 sec)
    32 
    33 mysql> select count(s_name) as 该组总数,s_major from student where s_age > 30 group by s_major having count(s_name) >= 4;
    34 +----------+---------+
    35 | 该组总数 | s_major |
    36 +----------+---------+
    37 |        8 | CEO     |
    38 |        4 | 运动员  |
    39 +----------+---------+
    40 2 rows in set (0.00 sec)
    41 
    42 mysql> select count(s_name) as 该组总数,s_major from student where s_age > 30 group by s_major having count(s_name) >= 4 order by s_major;
    43 +----------+---------+
    44 | 该组总数 | s_major |
    45 +----------+---------+
    46 |        8 | CEO     |
    47 |        4 | 运动员  |
    48 +----------+---------+
    49 2 rows in set (0.00 sec)
    50 
    51 mysql> select count(s_name) as 该组总数,s_major from student where s_age > 30 group by s_major having count(s_name) >= 4 order by s_major desc;
    52 +----------+---------+
    53 | 该组总数 | s_major |
    54 +----------+---------+
    55 |        4 | 运动员  |
    56 |        8 | CEO     |
    57 +----------+---------+
    58 2 rows in set (0.00 sec)
    59 
    60 mysql> select count(s_name) as 该组总数,s_major,group_concat(s_name) as 该组所有人姓名 from student group by s_major;
    61 +----------+-------------+---------------------------------------------------+
    62 | 该组总数 | s_major     | 该组所有人姓名                                    |
    63 +----------+-------------+---------------------------------------------------+
    64 |        3 | NULL        | 章泽天,凤姐,章子怡                                |
    65 |        8 | CEO         | 马化腾,周鸿祎,王健林,刘强东,马云,丁磊,雷军,许家印 |
    66 |        2 | LOL职业选手 | Gogoing,小狗                                      |
    67 |        1 | 主持人      | 马东                                              |
    68 |        6 | 主播        | 冯提莫,卢本伟,仙凡,黑人毅,旭旭宝宝,大龙猫         |
    69 |        1 | 乞丐        | 犀利哥                                            |
    70 |        1 | 作家        | 莫言                                              |
    71 |        1 | 偶像明星    | 鹿晗                                              |
    72 |        2 | 前美国总统  | 克林顿,奥巴马                                     |
    73 |        3 | 导演        | 李安,张艺谋,冯小刚                                |
    74 |        4 | 歌手        | P-Gone,周杰伦,林俊杰,张韶涵                       |
    75 |        5 | 演员        | 刘亦菲,胡歌,张一山,杨紫,斯图尔特                  |
    76 |        5 | 运动员      | 梅西,詹姆斯,内马尔,约翰塞纳,科比                  |
    77 +----------+-------------+---------------------------------------------------+
    78 13 rows in set (0.00 sec)
    GROUP BY练习代码

    九:LIMIT实现分页查询

      9.1:LIMIT 位置便宜量,行数;

        位置便宜量:默认值为0,即从第一条记录开始

        行数:指定从给定位置开始需要查询的总记录数

        LIMIT x,y 不能写成 LIMIT(x,y)

     1 mysql> select * from student limit 6;
     2 +------+--------+-------+----------+---------+
     3 | s_id | s_name | s_age | s_gender | s_major |
     4 +------+--------+-------+----------+---------+
     5 |    1 | 马化腾 |    54 || CEO     |
     6 |    2 | 雷军   |    48 || CEO     |
     7 |    3 | 丁磊   |    46 || CEO     |
     8 |    4 | 马云   |    51 || CEO     |
     9 |    5 | 刘强东 |    45 || CEO     |
    10 |    6 | 王健林 |    65 || CEO     |
    11 +------+--------+-------+----------+---------+
    12 6 rows in set (0.00 sec)
    13 
    14 mysql> select * from student limit 2,3;
    15 +------+--------+-------+----------+---------+
    16 | s_id | s_name | s_age | s_gender | s_major |
    17 +------+--------+-------+----------+---------+
    18 |    3 | 丁磊   |    46 || CEO     |
    19 |    4 | 马云   |    51 || CEO     |
    20 |    5 | 刘强东 |    45 || CEO     |
    21 +------+--------+-------+----------+---------+
    22 3 rows in set (0.00 sec)

    十:组函数(集合函数)查询

      count(*)--------------计算表中的总行数

      count(字段名)------计算指定列的总行数,会忽略NULL的值

      sum(字段名)------计算该列的总和

      avg(字段名);--------计算该列的平均值

      max(字段名)--------计算该列的最大值

      min(字段名)---------计算该列的最小值

    参考以下代码:

    mysql> select count(*) from student;
    +----------+
    | count(*) |
    +----------+
    |       42 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select count(s_major) from studen
    +----------------+
    | count(s_major) |
    +----------------+
    |             39 |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> select sum(s_age) from student;
    +------------+
    | sum(s_age) |
    +------------+
    |       1628 |
    +------------+
    1 row in set (0.00 sec)
    
    mysql> select avg(s_age) from student;
    +------------+
    | avg(s_age) |
    +------------+
    |    38.7619 |
    +------------+
    1 row in set (0.00 sec)
    
    mysql> select max(s_age) from student;
    +------------+
    | max(s_age) |
    +------------+
    |         70 |
    +------------+
    1 row in set (0.00 sec)
    
    mysql> select min(s_age) from student;
    +------------+
    | min(s_age) |
    +------------+
    |         20 |
    +------------+
    1 row in set (0.00 sec)
  • 相关阅读:
    CSS 对浏览器的兼容性技巧总结
    后台拿webshell的方法总结
    WEBSHELL权限提升技巧
    学习linq处理数据 遥远的青苹果
    在asp.net中怎么导出excel表
    SQL提取数据库记录按字的笔画排序
    主板前置音频线怎么接
    Oracle导入导出
    DevExpress GridControl界面汉化(摘自王铭)
    ASP.NET中如何防范SQL注入式攻击
  • 原文地址:https://www.cnblogs.com/wdmlsx/p/9267707.html
Copyright © 2020-2023  润新知