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

匿名 (未验证) 提交于 2019-12-03 00:39:02

前言:

  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)
练习的数据库表

一:查询所有

      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.2:字段 LIKE ‘%值‘;匹配最后一个

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

  4.4:字段 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)

原文:https://www.cnblogs.com/wdmlsx/p/9267707.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!