当前位置: 首页 > news >正文

MySQL学习笔记13

DISTINCT数据去重:

案例:获取tb_student学生表学员年龄的分布情况。

mysql> select * from tb_student;
+----+--------+------+--------+-----------------------+
| id | name   | age  | gender | address               |
+----+--------+------+--------+-----------------------+
|  1 | 刘备   |   33 | 男     | 湖北省武汉市          |
|  2 | 貂蝉   |   18 | 女     | 湖南省长沙市          |
|  3 | 关羽   |   32 | 男     | 湖北省荆州市          |
|  4 | 大乔   |   20 | 女     | 河南省漯河市          |
|  5 | 赵云   |   25 | 男     | 河北省石家庄市        |
|  6 | 小乔   |   18 | 女     | 湖北省荆州市          |
+----+--------+------+--------+-----------------------+
6 rows in set (0.00 sec)mysql> select distinct age from tb_student;
+------+
| age  |
+------+
|   33 |
|   18 |
|   32 |
|   20 |
|   25 |
+------+
5 rows in set (0.00 sec)

只要加上这个关键词,就是实现了去重的操作。

group by 子句(重点难点)

group by子句的作用:对数据进行分组操作,为什么要进行分组呢?分组的目标就是进行分组统计。

日常生活中的分组太多了,如按男女进行分组,按成绩进行分组,按院校、系部分组,按部门进行分组。

根据给定==数据列==的查询结果进行分组统计,最终得到一个==分组汇总表==

注:一般情况下group by需与==统计函数==一起使用才有意义

统计函数:

案例:求tb_student 表中应该有多少记录。

mysql> select count(*) from tb_student;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.03 sec)

案例:求年龄的最大值和最小值。

mysql> select max(age) from tb_student;
+----------+
| max(age) |
+----------+
|       33 |
+----------+
1 row in set (0.00 sec)mysql> select min(age) from tb_student;
+----------+
| min(age) |
+----------+
|       18 |
+----------+
1 row in set (0.00 sec)

案例:针对id字段求和。

mysql> select sum(id) from tb_student;
+---------+
| sum(id) |
+---------+
|      21 |
+---------+
1 row in set (0.00 sec)

案例:求年龄的平均值。

mysql> select avg(age) from tb_student;
+----------+
| avg(age) |
+----------+
|  24.3333 |
+----------+
1 row in set (0.00 sec)

GroupBy命令:实现数据的统计。

案例:求tb_student 男女同学的总数。

mysql> select gender,count(*) from tb_student group by gender;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男     |        3 |
| 女     |        3 |
+--------+----------+
2 rows in set (0.00 sec)

案例:求tb_student 中男同学的最大值与女同学的最大值。

mysql> select gender, max(age) from tb_student group by gender;
+--------+----------+
| gender | max(age) |
+--------+----------+
| 男     |       33 |
| 女     |       20 |
+--------+----------+
2 rows in set (0.00 sec)

group by的分组原理:

分组就是在内存分区域,然后分组,然后针对其中的每一列,然后进行统计。

记住:以后只要涉及到求每个学科、每个部门、每个年级、每个系部薪资最高、成绩最好、薪资的平均值等等,就是基于GROUP BY + 统计函数。

Having子句:

having与where类似,根据条件对==数据==进行过滤筛选

where==针对表中的列==发挥作用,查询数据

having==针对查询结果集==发挥作用,筛选数据

针对上次的查询结果再进行数据查询。执行两次查询。

mysql> select * from tb_student having age > 20;
+----+--------+------+--------+-----------------------+
| id | name   | age  | gender | address               |
+----+--------+------+--------+-----------------------+
|  1 | 刘备   |   33 | 男     | 湖北省武汉市          |
|  3 | 关羽   |   32 | 男     | 湖北省荆州市          |
|  5 | 赵云   |   25 | 男     | 河北省石家庄市        |
+----+--------+------+--------+-----------------------+
3 rows in set (0.00 sec)

案例:按学科进行分组,求每个学科拥有多少人。

mysql> drop table tb_student;
Query OK, 0 rows affected (0.02 sec)mysql> create table tb_student(-> id mediumint not null auto_increment,-> name varchar(20),-> age tinyint unsigned default 0,-> gender enum('男','女'),-> subject enum('ui','java','yunwei','python'),-> primary key(id)-> ) engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.00 sec)mysql> insert into tb_student values (null,'悟空',255,'男','ui'),(null,'八戒',250,'男','python'),(null,'唐僧',30,'男','yunwei'),(null,'沙僧',150,'男','java'),(null,'小白龙',100,'男','yunwei'),(null,'白骨精',28,'女','ui'),(null,'兔子精',22,'女','yunwei'),(null,'狮子精',33,'男','yunwei');
Query OK, 8 rows affected (0.00 sec)
Records: 8  Duplicates: 0  Warnings: 0mysql> select * from tb_student;
+----+-----------+------+--------+---------+
| id | name      | age  | gender | subject |
+----+-----------+------+--------+---------+
|  1 | 悟空      |  255 | 男     | ui      |
|  2 | 八戒      |  250 | 男     | python  |
|  3 | 唐僧      |   30 | 男     | yunwei  |
|  4 | 沙僧      |  150 | 男     | java    |
|  5 | 小白龙    |  100 | 男     | yunwei  |
|  6 | 白骨精    |   28 | 女     | ui      |
|  7 | 兔子精    |   22 | 女     | yunwei  |
|  8 | 狮子精    |   33 | 男     | yunwei  |
+----+-----------+------+--------+---------+
8 rows in set (0.00 sec)

根据学科进行分组,求每个学科有多少人? 

然后在这个基础上再次筛选学科人数大于3人的筛选。在查询基础上再次进行处理的,就只有having语句了。

mysql> select subject,count(*) from tb_student group by subject;
+---------+----------+
| subject | count(*) |
+---------+----------+
| ui      |        2 |
| java    |        1 |
| yunwei  |        4 |
| python  |        1 |
+---------+----------+
4 rows in set (0.00 sec)mysql> select subject,count(*) from tb_student group by subject having count(*)>3;
+---------+----------+
| subject | count(*) |
+---------+----------+
| yunwei  |        4 |
+---------+----------+
1 row in set (0.00 sec)

having语句是在原来分组操作之后,再次进行查询的操作。

Order by 子句:

其主要作用是对数据进行排序。

排序是两种:

升序(从小到大)

mysql> select * from 数据表名称 ... order by 字段名称 asc;

降序排列(从大到小)。

mysql> select * from 数据表名称 ... order by 字段名称 desc;

案例:按年龄进行排序(由小到大 ):

mysql> select * from tb_student order by age asc;
+----+-----------+------+--------+---------+
| id | name      | age  | gender | subject |
+----+-----------+------+--------+---------+
|  7 | 兔子精    |   22 | 女     | yunwei  |
|  6 | 白骨精    |   28 | 女     | ui      |
|  3 | 唐僧      |   30 | 男     | yunwei  |
|  8 | 狮子精    |   33 | 男     | yunwei  |
|  5 | 小白龙    |  100 | 男     | yunwei  |
|  4 | 沙僧      |  150 | 男     | java    |
|  2 | 八戒      |  250 | 男     | python  |
|  1 | 悟空      |  255 | 男     | ui      |
+----+-----------+------+--------+---------+
8 rows in set (0.00 sec)mysql> select * from tb_student order by age desc;
+----+-----------+------+--------+---------+
| id | name      | age  | gender | subject |
+----+-----------+------+--------+---------+
|  1 | 悟空      |  255 | 男     | ui      |
|  2 | 八戒      |  250 | 男     | python  |
|  4 | 沙僧      |  150 | 男     | java    |
|  5 | 小白龙    |  100 | 男     | yunwei  |
|  8 | 狮子精    |   33 | 男     | yunwei  |
|  3 | 唐僧      |   30 | 男     | yunwei  |
|  6 | 白骨精    |   28 | 女     | ui      |
|  7 | 兔子精    |   22 | 女     | yunwei  |
+----+-----------+------+--------+---------+
8 rows in set (0.00 sec)

Limit子句:分页函数。

基本语法:

mysql> select * from 数据表名称 ... limit number; 查询满足条件的number条数据
或
mysql> select * from 数据表名称 ... limit offset,number; 从偏移量为offset开始查询,查询number条记录
offset的值从0开始

案例:获取班级中年龄最大的学员信息。

mysql> select * from tb_student order by age desc limit 1;
+----+--------+------+--------+---------+
| id | name   | age  | gender | subject |
+----+--------+------+--------+---------+
|  1 | 悟空   |  255 | 男     | ui      |
+----+--------+------+--------+---------+
1 row in set (0.00 sec)

案例:从偏移量为1的元素开始查询,查询2条记录。

mysql> select * from tb_student;
+----+-----------+------+--------+---------+
| id | name      | age  | gender | subject |
+----+-----------+------+--------+---------+
|  1 | 悟空      |  255 | 男     | ui      |
|  2 | 八戒      |  250 | 男     | python  |
|  3 | 唐僧      |   30 | 男     | yunwei  |
|  4 | 沙僧      |  150 | 男     | java    |
|  5 | 小白龙    |  100 | 男     | yunwei  |
|  6 | 白骨精    |   28 | 女     | ui      |
|  7 | 兔子精    |   22 | 女     | yunwei  |
|  8 | 狮子精    |   33 | 男     | yunwei  |
+----+-----------+------+--------+---------+
8 rows in set (0.00 sec)mysql> select * from tb_student limit 1,2;
+----+--------+------+--------+---------+
| id | name   | age  | gender | subject |
+----+--------+------+--------+---------+
|  2 | 八戒   |  250 | 男     | python  |
|  3 | 唐僧   |   30 | 男     | yunwei  |
+----+--------+------+--------+---------+
2 rows in set (0.00 sec)

LIMIT子句在开发项目中,主要应用于数据分页。

案例:实现数据分页:

分页效果,找出下规律。

mysql> select * from tb_student limit 0,2;
+----+--------+------+--------+---------+
| id | name   | age  | gender | subject |
+----+--------+------+--------+---------+
|  1 | 悟空   |  255 | 男     | ui      |
|  2 | 八戒   |  250 | 男     | python  |
+----+--------+------+--------+---------+
2 rows in set (0.00 sec)mysql> select * from tb_student limit 2,2;
+----+--------+------+--------+---------+
| id | name   | age  | gender | subject |
+----+--------+------+--------+---------+
|  3 | 唐僧   |   30 | 男     | yunwei  |
|  4 | 沙僧   |  150 | 男     | java    |
+----+--------+------+--------+---------+
2 rows in set (0.00 sec)mysql> select * from tb_student limit 4,2;
+----+-----------+------+--------+---------+
| id | name      | age  | gender | subject |
+----+-----------+------+--------+---------+
|  5 | 小白龙    |  100 | 男     | yunwei  |
|  6 | 白骨精    |   28 | 女     | ui      |
+----+-----------+------+--------+---------+
2 rows in set (0.00 sec)mysql> select * from tb_student limit 6,2;
+----+-----------+------+--------+---------+
| id | name      | age  | gender | subject |
+----+-----------+------+--------+---------+
|  7 | 兔子精    |   22 | 女     | yunwei  |
|  8 | 狮子精    |   33 | 男     | yunwei  |
+----+-----------+------+--------+---------+
2 rows in set (0.00 sec)

分页操作是程序员使用得比较多的。 

http://www.lryc.cn/news/175146.html

相关文章:

  • 怎么获取外网ip地址
  • 算法 只出现一次的两个数字-(哈希+异或)
  • 外卖霸王餐小程序、H5、公众号版外卖系统源码
  • amlogic 机顶盒关闭DLNA 后,手机还能搜到盒子
  • @Autowire、@Recourse用啥?
  • [linux] 过滤警告⚠️
  • Linux必备操作系统命令大全
  • 【rtp】VideoTimingExtension 扩展的解析和写入
  • 网络安全CTF比赛有哪些事?——《CTF那些事儿》告诉你
  • Winform直接与Wpf交互
  • Uni-app 调用微信地图导航功能【有图】
  • Golang slice 通过growslice调用nextslicecap计算扩容
  • HTTP 协商缓存 Last-Modified,If-Modified-Since
  • 零基础教程:Yolov5模型改进-添加13种注意力机制
  • vue截取地址参数
  • ubuntu 14.04更新GCC版本
  • AndroidUtil - 强大易用的安卓工具类库
  • [多态设计模式]枚举
  • 【QT】QRadioButton的使用(17)
  • 力扣:105. 从前序与中序遍历序列构造二叉树(Python3)
  • 【含java2023面试题】HashMap、HashTable、ConcurrentHashMap
  • AT24C02芯片
  • Python+Django前后端分离
  • win11系统固定到快速访问的文件夹无法调整顺序的问题
  • 短视频矩阵系统,短视频矩阵源码技术开发
  • Flask 数据库 连接池、DBUtils、http 连接池
  • Day 01 python学习笔记
  • CSharp Library develop histroy
  • 林木种苗生产vr虚拟实训教学降低培训等待周期
  • LabVIEW在运行时调整表控件列宽