• MySQL数据库——DQL操作——基本查询


    在这里插入图片描述

    前言

    MySQL数据库常见的操作是增删查改,而其中数据的查询是使用最多,也是最重要的操作,但是简单的查询操作是不够的,我们还需要对数据进行特定的出来再显示才能真正达到我们的目的。那么今天我将为大家分享MySQL的DQL操作——基本查询。

    事前准备——测试数据

    在分享之前,我们需要先在数据库中插入一些测试数据。

    create table student(class_id int,id int,name varchar(20),
    					gender varchar(10),
    					chinese decimal(3,1),math decimal(3,1),
    					english decimal(3,1));
    
    insert into student values(2301,1,'张三','男',87.5,93,94),
    						(2302,2,'李四','女',88,95,92),
    						(2302,3,'王五','男',86,96,96),
    						(2302,4,'赵六','男',90,90,89.5),
    						(2303,5,'李华','男',96,94,78),
    						(2303,6,'小明','男',93.5,93,97),
    						(2304,7,'小美','女',85,90,98),
    						(2304,8,'小帅','男',88,91.5,93),
    						(2305,9,'小芳','女',89,90,94),
    						(2206,10,'大壮','男',89,96.5,97);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    整表查询

    在MySQL中,查询依赖于 select 关键字。而整表查询则是 select * from 表名;
    * 表示所有,在这里表示所有列。

    select * from student;
    
    • 1

    在这里插入图片描述

    指定列查找

    平时我们可能不需要表中的全部数据,那么我们就可以指定列,来展示我们想要的数据,MySQL中使用 select 列名1,列名2 from 表名; 来查询指定列。

    select class_id,name from student;
    
    • 1

    在这里插入图片描述

    别名查询

    在查询的过程过,我们可以更改显示的表名或者列名,但更改的只是临时表的表名或者列名,实际上并没有更改。

    别名查询依赖 as 关键字。表别名:select * / 列名 from 表名 as 表别名;
    列别名:select 列名1 as 列别名,列名2 from 表名; (as 可以省略)

    select class_id as c_id,name from student;
    
    • 1

    在这里插入图片描述

    MySQL运算符

    我们可以通过使用MySQL运算符来操作数据。

    算术运算符

    算术运算符说明
    +加法运算
    -减法运算
    *乘法运算
    / 或 DIV除法运算,返回商
    % 或 MOD求余运算,返回余数

    比较运算符

    比较运算符说明
    =等于,注意:这里等于就是等于,没有 == 表示等于的说法
    < 和 <=小于和小于等于
    > 和 >=大于和大于等于
    <=>安全的等于,两个操作码均为NULL是,其所得值为1;而当一个操作码为NULL时,所得值值为0
    <> 或 !=不等于
    IS NULL 或 ISNULL判断一个值是否为 NULL
    IS NOT NULL判断一个值是否不为 NULL
    LEAST当有两个或多个参数时,返回最小值
    GREATEST当有两个或多个参数时,返回最大值
    BTWEEN AND判断一个值是否落在两个值之间
    IN判断一个值时否是 IN 列表中的任意一个值
    NOT IN判断一个值是否不是 IN 列表中的任意一个值
    LIKE通配符匹配
    REGEXP正则表达式匹配

    当我们需要判断数据是否为 NULL 的时候,不能使用 = 或 != ,而要使用 IS NULL
    IS NOT NULL ,因为在MySQL中 NULL 与任何数据都不相等,也包括自己。

    select least(10,20,30);
    
    • 1

    在这里插入图片描述
    LEASTGREATEST 的参数中如果存在 NULL ,那么就会停止比较,直接返回 NULL。

    select least(null,20,30);
    
    • 1

    在这里插入图片描述

    逻辑运算符

    逻辑运算符说明
    NOT 或 !逻辑非
    AND 或 &&逻辑与
    OR 或 ||逻辑或
    XOR逻辑异或

    位运算符

    位运算符说明
    |按位或
    &按位与
    ^按位异或
    <<按位左移
    >>按位右移
    ~按位取反,比特位 0->1,1 -> 0

    位运算符操作的对象都是数字的二进制形式。

    条件查询

    在查询数据的过程中,我们可以对数据进行筛选之后在显示出来。MySQL 条件查询依赖于 where 通常条件语句会使用到我们前面列举的MySQL运算符。
    select * / 列名 from 表名 where 条件;

    select * from student where class_id = 2302; -- 查询班级为2302的学生信息
    
    • 1

    在这里插入图片描述

    select 
    	name,english 
    from 
    	student 
    where 
    	english >= 80 AND english < 90; -- 查询英语乘积在80-90分之间的学生信息
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    这里会不会显得SQL语句很长呢?那么我们是否可以将 select 后面的列名别名然后再进行条件筛选呢?

    select 
    	name,english eng 
    from 
    	student 
    where 
    	eng >= 80 AND eng < 90; -- 查询英语乘积在80-90分之间的学生信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    答案是不行的,因为 select 的执行是后于 where 的。

    模糊查询

    MySQL中模糊查询的关键字是 LIKE ,并且我们还需要知道模糊查询会使用的通配符
    % 用来匹配任意字符,_ 用来匹配单个字符。
    select * / 列名 from 表名 where 列名 = '_%';

    select * from student where name like '小%';
    
    • 1

    在这里插入图片描述
    然后我们为了体现模糊查询我们再插入一个数据。

    insert into student values(2302,11,'李大虎','男',80,88,91);
    
    • 1
    select * from student where name like '_大%'; -- 查询名字第二个字为大的学生信息
    
    • 1

    在这里插入图片描述

    排序查询

    我们可以将需要查询的数据进行排序之后展现出来。而MySQL排序则需要使用到 order by 关键字。
    select * / 列名 from 表名 (where 条件) order by 列名 asc / desc;

    asc 表示升序排列(默认),desc 表示降序排列。

    select class_id,name,math from student order by math desc; -- 按数学成绩降序排列
    
    • 1

    在这里插入图片描述

    select class_id,name,math from student where gender = '男' order by math desc; -- 男生按数学成绩降序排列
    
    • 1

    在这里插入图片描述
    order by排序的字段必须是数字类型或者英文和数字字符串类型

    MySQL中,也可以以多个列为标准来排序。但是这些列的比重与顺序呈正相关。
    select * from 表名 order by 列名1,列名2; 先以列名1为标准,如果列名1的数据相等,就比较列名2中的数据。

    select * from student order by math,chinese,english;
    
    • 1

    在这里插入图片描述

    聚合查询

    MySQL聚合查询是一种用于计算和汇总数据的查询方式。它通过使用聚合函数和GROUP BY子句对数据进行分组,并对每个组中的数据应用聚合函数,从而返回汇总的结果。
    select 聚合函数(列名) from 表名;

    聚合函数

    聚合函数作用
    count()统计指定列不为NULL的记录行数
    sum()计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0
    max()计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算
    min()计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算
    avg()计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
    select count(name) from student;
    
    • 1

    在这里插入图片描述

    聚合函数对NULL的处理:

    1. count 函数对 null 值的处理如果 count 函数的参数为星号( * ),则统计所有记录的个数。而如果参数为某字段,不统计含null 值的记录个数。
    2. sum 和 avg 函数对 null 值的处理这两个函数忽略 null 值的存在,就好象该条记录不存在一样。
    3. max 和 min 函数对 null 值的处理max 和 min 两个函数同样忽略 null 值的存在。

    当我们使用聚合函数的时候,往往 select 后面的只有聚合函数,因为使用了聚合函数最终只会显示一行,不知道跟哪一行对齐。

    分组查询

    在日常生活中,我们往往需要先对数据进行分组,然后再对数据进行处理,同样MySQL也支持分组查询,MySQL中依赖于 group by 关键字实现分组查询。
    select * / 列名 from 表名 group by 列名

    因为使用了分组查询之后,每个不同的组的记录只会出现一条,所以我们 select 的对象只能含有该分组的列名或者聚合函数。

    select * from student group by class_id;
    
    • 1

    在这里插入图片描述

    select class_id,count(class_id) from student group by class_id; -- 统计每个班的学生人数
    
    • 1

    在这里插入图片描述

    group by 后面也可跟多个字段,只有这几个字段完全一样才会被分到一组。

    select class_id,gender,count(name) from student group by class_id,gender;
    
    • 1

    在这里插入图片描述

    分组之后的条件筛选

    当我们进行完分组之后,我们还可以对数据进行筛选,但是我们不能使用 where 条件 ,而是使用having 条件

    select 
    	class_id,count(class_id) 
    from 
    	student 
    group by 
    	class_id 
    having 
    	count(class_id) > 1; -- 筛选出班级人数大于1的班级
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    看到这里,大家会不会觉得这一行代码太长,可以将前面的聚合函数实现别名使用呢?

    select 
    	class_id,count(class_id) cid_num 
    from 
    	student 
    group by 
    	class_id 
    having 
    	cid_num > 1; -- 筛选出班级人数大于1的班级
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    答案是可以的,那么我们需要知道MySQL查询
    select * / 列名 from 表名 where 条件 group by 列名 having 条件 order by 列名 limit 中 select 、from 、where 、group by、having、order by、limit 的执行顺序。

    from -> where -> group by -> 聚合函数 -> having ->select -> order by -> limit

    分页查询

    当我们查询数据的时候,如果数据过多,那么一页肯定是放不下的,而且我们看的也不是很美观,所以这就用到了分页查询 limit

    在这里插入图片描述
    select * from 表名 limit num; num表示显示num个记录。
    select * from 表名 limit m,n 表示从第 m+1 个记录开始,显示n个数据。

    select 
    	*,(chinese + math + english) 
    as 
    	sum 
    from 
    	student 
    order by 
    	sum 
    desc limit 
    	5;  -- 显示总成据前五名的信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    select 
    	*,(chinese + math + english) 
    as 
    	sum 
    from 
    	student 
    order by 
    	sum 
    desc limit 
    	2,5;  -- 显示总成绩从第三名开始的五名学生的信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    将整张表的数据插入到另一张表中

    将整张表插入到另一张表中可以大量节省代码量和时间。在MySQL中,整表插入数据有两种方式:insert into Table2(列名1,列名2) select 列名1,列名2 from Table1; 这种方法Table2必须事先存在,select 列名1,列名2 into Table2 from Table1; 这种形式的插入要求Table2不存在,因为这种形式的插入会创建表Table2。但是第二种插入方式在MySQL8之后便不能使用了。

    注意:整表插入需要两张表的字段也就是列相同,并且尽量保证列类型也相同

    create table student2(class_id int,id int,name varchar(20),
    					gender varchar(10),
    					chinese decimal(3,1),math decimal(3,1),
    					english decimal(3,1));
    
    insert into student2 select * from student;
    select * from student2;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

  • 相关阅读:
    PIE-Engine 教程:水稻面积提取2—监督分类(宿迁市)
    【Python模块】图形化编程模块-turtle
    SpringBoot项目从0到1配置logback日志打印
    汽车SOA架构
    用于光波导系统的均匀性探测器
    .Net Core 3.1 解决数据大小限制
    Java面试题(六)--Redis
    【JavaScript】内置对象 ③ ( Math 内置对象 | Math 内置对象简介 | Math 内置对象的使用 )
    为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(上)
    安装Python及爬虫入门介绍
  • 原文地址:https://blog.csdn.net/m0_73888323/article/details/131937633