MYSQL-SQL-03-DQL(Data Query Language,数据查询语言)(单表查询)
DQL(数据查询语言)
- DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。
- 查询关键字: SELECT
- 在一个正常的业务系统中,查询操作的频次是要远高于增删改的,当我们去访问企业官网、电商网站,在这些网站中我们所看到的数据,实际都是需要从数据库中查询并展示的。而且在查询的过程中,可能还会涉及到条件、排序、分页等操作。
- 数据准备:
CREATE TABLE emp(id INT COMMENT '编号',workno VARCHAR(10) COMMENT '工号',NAME VARCHAR(10) COMMENT '姓名',gender CHAR(1) COMMENT '性别',age TINYINT UNSIGNED COMMENT '年龄',idcard CHAR(18) COMMENT '身份证号',workaddress VARCHAR(50) COMMENT '工作地址',entrydate DATE COMMENT '入职时间')COMMENT '员工表';
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (1, '00001', '柳岩666', '女', 20, '123456789012345678', '北京', '2000-01-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (7, '00007', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (8, '00008', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (9, '00009', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (10, '00010', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (11, '00011', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (13, '00013', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (14, '00014', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (15, '00015', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (16, '00016', '周芷若', '女', 18, NULL, '北京', '2012-06-01');
一、基本语法
SELECT字段列表
FROM表名列表
WHERE条件列表
GROUP BY分组字段列表
HAVING分组后条件列表
ORDER BY排序字段列表
LIMIT分页参数
1、基础查询(不带任何条件)—查询多个字段
-- 查询指定字段SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;-- 查询所有字段SELECT * FROM 表名 ;
注意 : * 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)
-- 查询emp表的id字段
select id from emp;
-- 查询emp表的所有字段
select * from emp;
2、基础查询(不带任何条件)—设置字段别名
-- 设置别名可以使用as关键字也可以省略as
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名; -- 省略asSELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;
as可以省略
select id as eid from emp;-- 这个和上面的作用一样的,省略了as
select id eid from emp;
3、基础查询(不带任何条件)—去除重复记录
DISTINCT关键字:用于从查询结果中删除重复的行,确保返回的每一行都是唯一的。它通常用于 SELECT 语句中,以获取不同(唯一)的记录集合
- DISTINCT 可以单列使用
- DISTINCT 也可以与多个列一起使用,以返回基于这些列组合的唯一行
SELECT DISTINCT 字段列表 FROM 表名;
- distinct单列
-- 查询公司员工的上班地址有哪些(不要重复),'工作地址'是别名
select distinct workaddress '工作地址' from emp;
- distinct多列
-- 查询公司男员工的上班地址有哪些(不要重复),'工作地址'是别名
select distinct gender '性别', workaddress '工作地址' from emp;
- DISTINCT 是一个有用的关键字,用于从查询结果中去除重复的行。然而,它可能会增加查询的复杂性,并可能影响性能,因此在使用时需要谨慎
4、条件查询
- 语法:
SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
4.1、常用的比较运算符
- 判断字段是不是null的时候,就可以使用is null或者是is not null来进行条件判断,而不是用=null或!=null。
-- 查询身份证号码为null的数据
select * from emp where idcard is null;
-
=
运算符不能用于检查 NULL 值,因为 NULL 表示未知,而未知与任何值(包括它自己)都不相等。因此,column = NULL 总是返回 FALSE。 -
同样地,
<>
运算符也不能用于检查 NULL 值,因为 NULL 不等于任何值,包括它自己。因此,column <> NULL 也总是返回 FALSE。 -
is null和 is not null的影响——索引和性能:
- 在某些情况下,使用 IS NULL 或 IS NOT NULL 条件可能会影响查询性能,特别是当涉及到大表或索引时。因此,在设计数据库和编写查询时,应考虑到这一点。
- 默认值:在创建表时,可以为列指定默认值。如果未为列提供值,则MySQL将使用默认值(如果已指定)。如果未指定默认值且列允许 NULL,则MySQL将插入 NULL 值。
- 在某些情况下,使用 IS NULL 或 IS NOT NULL 条件可能会影响查询性能,特别是当涉及到大表或索引时。因此,在设计数据库和编写查询时,应考虑到这一点。
4.2、常用的的逻辑运算符
-- 查询没有身份证号的员工信息select * from emp where idcard is null;-- 查询有身份证号的员工信息
select * from emp where idcard is not null;-- 查询年龄不等于 28 的员工信息select * from emp where age != 28;select * from emp where age <> 28;-- 查询年龄在15岁(包含) 到 20岁(包含)之间的员工信息
select * from emp where age >= 15 && age <= 20;select * from emp where age >= 15 and age <= 20;select * from emp where age between 15 and 20;-- 查询年龄等于18 或 20 或 40 的员工信息select * from emp where age = 18 or age = 20 or age =40;select * from emp where age in(18,20,40);-- 查询姓名为两个字的员工信息(_表示一个占位符,%表示匹配任意个字符)
select * from emp where name like '__';-- 查询身份证号最后一位是X的员工信息(%表示前面可以有n个字符)select * from emp where idcard like '%X';
5、聚合函数
- 聚合函数:将一列数据作为一个整体,进行纵向计算 。
SELECT 聚合函数(字段列表) FROM 表名 ;
注意 : NULL值是不参与所有聚合函数运算的。
-- 统计的是总记录数(常用)
select count(*) from emp; -- 统计的是idcard字段不为null的记录数
select count(idcard) from emp; -- 统计该企业员工的平均年龄
select avg(age) from emp;-- 统计该企业员工的最大年龄
select max(age) from emp;-- 统计该企业员工的最小年龄select min(age) from emp;-- 统计西安地区员工的年龄之和select sum(age) from emp where workaddress = '西安';
6、分组查询
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];
- where与having区别:
- 执行时机不同:
where是分组之前进行过滤
,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
。 - 判断条件不同:
where不能对聚合函数进行判断
,而having可以。
- 执行时机不同:
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
执行顺序: where > 聚合函数 > having 。
- 支持多字段分组, 具体语法为 : group by columnA,columnB,…
-- 根据性别分组 , 统计男性员工 和 女性员工的数量
select gender, count(*) from emp group by gender ;
-- 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址
select workaddress, count(*) address_count from emp where age < 45 group by
workaddress having address_count >= 3;
7、排序查询
- 排序在日常开发中是非常常见的一个操作,有升序排序(ASC,默认升序),也有降序排序(DESC)。
- 语法:
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
-
排序方式:
- ASC(ascend) : 升序(默认值)
- DESC(descend): 降序
-
注意事项:
如果是升序, 可以不指定排序方式ASC ;
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
-- 根据年龄对公司的员工进行升序排序select * from emp order by age asc;select * from emp order by age;-- 根据入职时间, 对员工进行降序排序
select * from emp order by entrydate desc;-- 根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序select * from emp order by age asc , entrydate desc;
8、分页查询
- 分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台都需要借助于数据库的分页操作。
- 语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
- 注意事项:
起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
-- 查询第1页员工数据, 每页展示10条记录select * from emp limit 0,10;select * from emp limit 10; -- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10-- 查询第2页员工数据, 每页展示10条记录 --------> (页码-1)*页展示记录数select * from emp limit 10,10;
9、DQL语句在执行时的执行顺序
- 1、证明from比where和select先执行
select e.age from emp e where e.id = 1; -- 这里使用表的别名可以说明是from先执行的,而where和select是后执行的,因为如果from不限执行,表别名e就无法使用了
- 2、证明where比select先执行
select e.age a from emp e where e.id = 1 and a = 1;
-
3、证明select比order by 先执行
-
4、因为group by是对where条件过滤后的数据进行分组,而select是从分组的数据中选择需要的列,所以group by先执行
-
5、limit是对最后的结果限制返回的行数,所以limit是最后执行的。
-
总结:
select的执行顺序为
:- 执行第一:FROM:首先确定数据源,即表或视图。
- 执行第二:WHERE:对数据源进行过滤,只保留符合条件的行。
- 执行第三:GROUP BY:对过滤后的数据进行分组。
- 执行第四:HAVING:对分组后的数据进行进一步过滤(如果有 HAVING 子句)。
- 执行第五:SELECT:选择需要返回的列,并计算表达式(包括聚合函数)。
- 执行第六:ORDER BY:对结果进行排序(如果有 ORDER BY 子句)。
- 执行第七:LIMIT:限制返回的行数(如果有 LIMIT 子句)。
相关文章:

MYSQL-SQL-03-DQL(Data Query Language,数据查询语言)(单表查询)
DQL(数据查询语言) DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。 查询关键字: SELECT 在一个正常的业务系统中,查询操作的频次是要远高于增删改的,当我们去访…...

【数据结构和算法】三、动态规划原理讲解与实战演练
目录 1、什么是动态规划? 2、动态规划实战演练 2.1 力扣题之爬楼梯问题 (1)解题思路1: (2)解题思路2: (3)动态规划(DP):解题思路 (4&#x…...
交叉编译 perl-5.40.0(riscv64)
交叉编译 perl-5.40.0(riscv64) https://arsv.github.io/perl-cross/usage.html https://github.com/arsv/perl-cross 借助 perl-cross 进行交叉编译 https://www.perl.org/get.html#unix_like 这里获取 perl-5.40.0 的源码 https://github.com/arsv/pe…...

Leetcode 搜索旋转排序数组
这段代码是用于解决LeetCode第33题“搜索旋转排序数组”的Java解法。以下是对该算法思想的中文解释: 算法思想 二分查找的基本思路: 由于数组是部分有序的(被旋转过),我们可以利用二分查找的思想,逐步缩小…...

Spring Task—定时任务
Spring Task 是 Spring 提供的一种轻量级定时任务调度功能,内置在 Spring 框架中。与 Quartz 等重量级调度框架相比,Spring Task 使用简便,无需额外依赖,适合在简单的调度任务场景中使用。通过注解配置方式,开发者可以…...

Spring Boot 应用开发概述
目录 Spring Boot 应用开发概述 Spring Boot 的核心特性 Spring Boot 的开发模式 Spring Boot 在企业应用开发中的优势 结论 Spring Boot 应用开发概述 Spring Boot 是由 Pivotal 团队开发的一个框架,基于 Spring 框架,旨在简化和加速基于 Spring …...

Chrome谷歌浏览器加载ActiveX控件之allWebDesktop控件介绍
背景 allWebDesktop控件是一款方便用户在线打开各类文档的OA办公控件。它设计比较轻巧,充分利用计算机程序资源打开文档,并将程序窗口嵌入到allWebDesktop控件区域内,从而实现浏览器内打开各类文档效果。 allWebPlugin中间件是一款为用户提供…...

GitHub Star 数量前 5 的开源应用程序生成器
欢迎来的 GitHub Star 数量排名系列文章的第 7 篇——最受欢迎的应用程序生成器。 之前我们已经详细探讨过:在 GitHub 上最受欢迎的——无代码工具、低代码项目、内部工具、CRUD项目、自部署项目和 Airtable 开源替代品。累计超过 50 个优质项目!&#…...

DBC文件当中新建CANFD等类型的报文
同学最近有添加CANFD报文的需求,需要用到CANFD类型报文的DBC文件,这下就难住我了,我之前用的DBC文件只有“CAN Standard”“CAN Extended”两种类型,压根没见过FD的。 后来他找到了项目之前的DBC,打开来看,…...

基于SpringBoot的房地产销售管理系统【附源码】
基于SpringBoot的房地产销售管理系统(源码L文说明文档) 目录 4 系统设计 4.1用户登录功能的详细实现 4.2管理员权限的功能实现 4.2.1客户信息管理功能的详细实现 4.2.2房产管理功能的详细实现 4.2.3预约看房功能的详细实现 4.2.4论…...

圆点虚线 Android
参考 https://blog.csdn.net/l_o_s/article/details/73550876 <com.xxx.wwww.weight.PointDividerViewandroid:layout_width"match_parent"android:layout_height"wrap_content"app:PDbackgroundColor"color/white"app:dotColor"color/…...

贵州鑫宏远农业-始终致力于推动现代农业的科技创新与发展
贵州鑫宏远农业科技有限公司,是一家在高科技农业领域深耕细作、锐意进取的企业。自成立以来,我们始终致力于推动现代农业的科技创新与发展,业务全面覆盖农业科学研发、组织培养生产、专业育苗培植、半成品及成品精细化养护、市场销售以及全方…...

程序员做销售,从代码到客户的逆袭之路
大家好,我是小悟。 在这个互联网风起云涌、技术迭代日新月异的时代,“跨界”已然成为一种新潮流。就好似那从天而降的大侠,一不小心就可能横跨了数个充满奇遇与挑战的领域。 想象一下,一个平日里只跟代码打交道的程序员…...
Flink CDC系列之:理解学习Kubernetes模式
Flink CDC系列之:理解学习Kubernetes模式 准备会话模式启动会话集群设置 Flink CDC提交 Flink CDC Job Kubernetes 是一种流行的容器编排系统,用于自动化计算机应用程序的部署、扩展和管理。Flink 的原生 Kubernetes 集成允许您直接在正在运行的 Kuberne…...
git合并相关操作详解
在使用Git进行分支管理时,合并(merge)操作是非常常见的。下面是Git合并相关的详细步骤和一些常见的场景及注意事项。 一、 基本合并操作 假设我们有两个分支:main 和 feature,希望将 feature 合并到 main 上。 切换到目标分支 首先需要切换到你想合并到的分支。例如,切…...

前端经典【面试题】持续更新HTML、CSS、JS、VUE、FLUTTER、性能优化等
HTML/CSS 面试题 什么是语义化 HTML? 说明:语义化 HTML 使用 HTML 标签来描述内容的含义,而不仅仅是其外观。使用语义化标签可以提高可读性和可访问性,并对 SEO 友好。示例: <header><h1>网站标题</h1&…...
【Linux知识】linux磁盘管理深入了解
文章目录 常见磁盘管理命令行磁盘分区NASNAS 磁盘挂载🔐 如何设置NAS设备的访问权限? Mkfs🧐 mkfs 命令支持哪些文件系统类型? Mount🔑 在Linux中,如何安全地卸载挂载的文件系统? 常见磁盘管理命…...
Qt Essential Classes
目录 QVariant QFlags QRandomGenerator 经典的Qt容器 QVector QList QMap QMultiMap QSet QHash QVariant 同std::variant是一样的,他是一个更加高级的union。在一个时间下,它虽然实际上只能是一种类型,但是一个variant可以hold住…...

小小猫棒onu替换家用光猫,薅运营商带宽羊毛,突破1000M
小小猫棒onu 一、总体步骤 1 记录原来光猫信息 主要包括SN,ploam密码,loid、loid密码、 mac、上网的vlan id等 一般gpon采用SN、ploam密码、SNploam密码三种中的一种认证方式 一般Epon采用loid(逻辑id)、mac、loid mac三种中…...

软件测试学习笔记丨Selenium学习笔记:css定位
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22511 本文为霍格沃兹测试开发学社的学习经历分享,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 说明:本篇博客基于sel…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...