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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 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);

整表查询

在MySQL中,查询依赖于 select 关键字。而整表查询则是 select * from 表名;

* 表示所有,在这里表示所有列。

select * from student;

指定列查找

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


select class_id,name from student;


别名查询

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


别名查询依赖 as 关键字。表别名:select * / 列名 from 表名 as 表别名; ,

列别名:select 列名1 as 列别名,列名2 from 表名; (as 可以省略)

select class_id as c_id,name from student;

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);


LEASTGREATEST 的参数中如果存在 NULL ,那么就会停止比较,直接返回 NULL。

select least(null,20,30);


逻辑运算符

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

位运算符

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


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

条件查询

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

select * / 列名 from 表名 where 条件;

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

select 
  name,english 
from 
  student 
where 
  english >= 80 AND english < 90; -- 查询英语乘积在80-90分之间的学生信息

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

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

答案是不行的,因为 select 的执行是后于 where 的。

模糊查询

MySQL中模糊查询的关键字是 LIKE ,并且我们还需要知道模糊查询会使用的通配符

% 用来匹配任意字符,_ 用来匹配单个字符。

select * / 列名 from 表名 where 列名 = '_%';

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


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


排序查询

我们可以将需要查询的数据进行排序之后展现出来。而MySQL排序则需要使用到 order by 关键字。

select * / 列名 from 表名 (where 条件) order by 列名 asc / desc;


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

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

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

order by排序的字段必须是数字类型或者英文和数字字符串类型

MySQL中,也可以以多个列为标准来排序。但是这些列的比重与顺序呈正相关。

select * from 表名 order by 列名1,列名2; 先以列名1为标准,如果列名1的数据相等,就比较列名2中的数据。

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

聚合查询

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

select 聚合函数(列名) from 表名;

聚合函数


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


select count(name) from student;

聚合函数对NULL的处理:


count 函数对 null 值的处理如果 count 函数的参数为星号( * ),则统计所有记录的个数。而如果参数为某字段,不统计含null 值的记录个数。


sum 和 avg 函数对 null 值的处理这两个函数忽略 null 值的存在,就好象该条记录不存在一样。

max 和 min 函数对 null 值的处理max 和 min 两个函数同样忽略 null 值的存在。


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

分组查询

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


select * / 列名 from 表名 group by 列名


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

select * from student group by class_id;

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



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

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


分组之后的条件筛选

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

select 
  class_id,count(class_id) 
from 
  student 
group by 
  class_id 
having 
  count(class_id) > 1; -- 筛选出班级人数大于1的班级

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

select 
  class_id,count(class_id) cid_num 
from 
  student 
group by 
  class_id 
having 
  cid_num > 1; -- 筛选出班级人数大于1的班级


答案是可以的,那么我们需要知道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;  -- 显示总成据前五名的信息

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

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

将整张表插入到另一张表中可以大量节省代码量和时间。在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;


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
SQL 缓存 监控
MySQL缓存机制:查询缓存与缓冲池优化
MySQL缓存机制是提升数据库性能的关键。本文深入解析了MySQL的缓存体系,包括已弃用的查询缓存和核心的InnoDB缓冲池,帮助理解缓存优化原理。通过合理配置,可显著提升数据库性能,甚至达到10倍以上的效果。
|
2月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
4月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
270 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
227 14
|
2月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
以上概述了MySQL 中常见且重要 的几种 SQL 查询及其相关概念 这些知识点对任何希望有效利用 MySQL 进行数据库管理工作者都至关重要
109 15
|
2月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
2月前
|
SQL 关系型数据库 MySQL
MySQL入门指南:从安装到第一个查询
本文为MySQL数据库入门指南,内容涵盖从安装配置到基础操作与SQL语法的详细教程。文章首先介绍在Windows、macOS和Linux系统中安装MySQL的步骤,并指导进行初始配置和安全设置。随后讲解数据库和表的创建与管理,包括表结构设计、字段定义和约束设置。接着系统介绍SQL语句的基本操作,如插入、查询、更新和删除数据。此外,文章还涉及高级查询技巧,包括多表连接、聚合函数和子查询的应用。通过实战案例,帮助读者掌握复杂查询与数据修改。最后附有常见问题解答和实用技巧,如数据导入导出和常用函数使用。适合初学者快速入门MySQL数据库,助力数据库技能提升。
|
3月前
|
存储 关系型数据库 MySQL
使用命令行cmd查询MySQL表结构信息技巧分享。
掌握了这些命令和技巧,您就能快速并有效地从命令行中查询MySQL表的结构信息,进而支持数据库维护、架构审查和优化等工作。
401 9
|
2月前
|
SQL 监控 关系型数据库
MySQL高级查询技巧:子查询、联接与集合操作
本文深入解析了MySQL高级查询的核心技术,包括子查询、联接和集合操作,通过实际业务场景展示了其语法、性能差异和适用场景,并提供大量可复用的代码示例,助你从SQL新手进阶为数据操作高手。
|
4月前
|
人工智能 Java 关系型数据库
Java的时间处理与Mysql的时间查询
本文总结了Java中时间与日历的常用操作,包括时间的转换、格式化、日期加减及比较,并介绍了MySQL中按天、周、月、季度和年进行时间范围查询的方法,适用于日常开发中的时间处理需求。

推荐镜像

更多