SQL语句(三)—— DQL

目录

基本语法

一、基础查询

1、查询多个字段

2、字段设置别名

3、去除重复记录

4、示例代码

二、条件查询

1、语法

2、条件列表常用的运算符

3、示例代码

三、分组查询

(一)聚合函数

1、介绍

2、常见的聚合函数

3、语法

4、示例代码

(二)分组查询

1、语法

2、where 与 having 区别

3、注意事项

4、示例代码

四、排序查询

1、语法

2、排序方式

3、注意事项

4、示例代码

五、分页查询

1、语法

2、注意事项

3、示例代码

六、DQL语言的实战应用

(一)执行顺序

(二)各个字句的作用

(三)实际书写代码的思路


        DQL 英文全称是Data Query Language,即数据查询语言,用来查询数据库中表的记录

        在一个正常的业务系统中,查询操作的频次是要远高于增删改的。

        当我们去访问企业官网、电商网站,在这些网站中我们所看到的数据,实际都是需要从数据库中查询并展示的。而且在查询的过程中,可能还会涉及到条件排序分页等操作。

基本语法

DQL 查询语句,语法结构如下:

select字段列表
from表名列表
where条件列表
group by分组字段列表
having分组后条件列表
order by排序字段列表
limit分页参数

        我们在讲解这部分内容的时候,会将上面的完整语法进行拆分,分为以下几个部分.

        ① 基本查询 (不带任何条件);② 条件查询 (WHERE);③ 聚合函数 (count、max、min、avg、sum);④ 分组查询 (group by);⑤ 排序查询 (order by);⑥ 分页查询 (limit)

一、基础查询

1、查询多个字段

        在基本查询的DQL语句中,不带任何的查询条件,查询的语法如下:        

select 字段1, 字段2, 字段3 ... from 表名 ;

select * from 表名 ; 

        注意:* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。

2、字段设置别名

select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] ... from 表名;

select 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... from 表名;

        注意:关键字 as 可以省略,方括号表示可以不添加。

3、去除重复记录

select distinct 字段列表 from 表名;

        select 的意思是选择,在这里选择对应的字段的意思就是,选到了什么字段,什么字段就显示出来,那一列就显示出来,没有被选择到的就不显示出来。

        from 的意思是来自,后面接表名,也就是说明数据来源于哪个表。

4、示例代码

(1)查询指定字段 name, workno, age 并返回

select name,workno,age from emp;

(2)查询返回所有字段

select id ,workno,name,gender,age,idcard,workaddress,entrydate from emp;
select * from emp;

(3)查询所有人员的工作地址、起别名

select workaddress as '工作地址' from emp;
-- as可以省略
select workaddress '工作地址' from emp;

(4)查询公司员工的上班地址有哪些(不要重复)

select distinct workaddress '工作地址' from emp;

二、条件查询

1、语法

select 字段列表 from 表名 where 条件列表 ;

2、条件列表常用的运算符

(1)常用的比较运算符如下:

(2)常用的逻辑运算符如下:

3、示例代码

(1)查询年龄在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;

(2)查询性别为女且年龄小于25岁的员工信息

select * from emp where gender = '女' and age < 25;

(3)查询姓名为两个字的员工信息

select * from emp where name like '__';
--like后面有两条_,说明匹配两个任意字符

(4)查询身份证号最后一位是X的员工信息

select * from emp where idcard like '%X';
--%可以表示任意字符,'%X只要保证最后一位是X就行了'
select * from emp where idcard like '_________________X';

三、分组查询

(一)聚合函数
1、介绍

        聚合函数即将一列数据作为一个整体,进行纵向计算 。select 的作用就是选择要展现的列,其后面可以接字段与聚合函数

        select 后面接字段就是正常输出一列;而接聚合函数,就是对这一列进行相应的处理,再展示出来,其行数会做出相应的调整。

        直接引用表中原始字段,未经过聚合函数处理,这列则被称为非聚合列。而经过聚合函数处理的列,则称为聚合列

        聚合函数可以单独使用但是如当与非聚合列一起出现时,必须通过 group by 明确分组规则否则会导致语法错误

2、常见的聚合函数

3、语法

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

      注意:NULL值是不参与所有聚合函数运算的

4、示例代码

(1)统计该企业员工数量

select count(*) from emp; -- 统计的是总记录数
select count(idcard) from emp; -- 统计的是idcard字段不为null的记录数

(2)统计该企业员工的最大年龄

select max(age) from emp;

(3)统计西安地区员工的年龄之和

select sum(age) from emp where workaddress = '西安';

(二)分组查询
1、语法

select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];

2、where 与 having 区别

(1)执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。

(2)判断条件不同:where不能对聚合函数进行判断,而having可以。

3、注意事项

(1)分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。[重点]

        例如,我根据性别 gender 分组,分组结为男与女,所以此时就会得到得到男与女两组即男女两行;但这两行并没有数据,仅知道一行存放男性的数据、一行存放女性的数据。

        此时使用聚合函数max(age),就会在这两行呈现对应数据,即男性的最大年龄与女性的最大年龄;再接gender字段,则在两行中分别填放男、女;

        但如果接 workplace 字段,性别男或性别女会对应多个工作地址,系统根本不知道显示哪个。所以 select 的后面只能接作为分组依据的字段聚合函数

(2)执行顺序

        where > group by> 聚合函数 > having 

(3)支持多字段分组,具体语法为:group by columnA,columnB

4、示例代码

(1)根据性别分组 , 统计男性员工和女性员工的数量

select gender, count(*) from emp group by gender ;

(2)查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址

select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;

(3)统计各个工作地址上班的男性及女性员工的数量

select workaddress, gender, count(*) '数量' from emp group by gender , workaddress ;

四、排序查询

        排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序

1、语法

select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ;

2、排序方式

asc:升序(默认值)

desc:降序

3、注意事项

(1)如果是升序,可以不指定排序方式ASC,因为默认升序;

(2)如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;

4、示例代码

(1)根据年龄对公司的员工进行升序排序

select * from emp order by age asc;
select * from emp order by age;

(2)根据入职时间, 对员工进行降序排序

select * from emp order by entrydate desc;

(3)根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序

select * from emp order by age asc , entrydate desc;

五、分页查询

        分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台都需要借助于数据库的分页操作

1、语法

select 字段列表 from 表名 limit 起始索引, 查询记录数 ;

2、注意事项

(1)起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数

(2)分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。

(3)如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。

3、示例代码

(1)查询第1页员工数据, 每页展示10条记录

select * from emp limit 0,10;
select * from emp limit 10;

(2)查询第2页员工数据, 每页展示10条记录,即起始索引 = (页码-1) * 页展示记录数

select * from emp limit 10,10;

六、DQL语言的实战应用

(一)执行顺序

        在讲解DQL语句的具体语法之前,我们已经讲解了DQL语句的完整语法,及编写顺序,现在我们要来说明的是DQL语句在执行时的执行顺序,也就是先执行哪一部分,后执行哪一部分。

(二)各个字句的作用

from:指定要查询的表。

where:筛选满足条件的行。

group by:按照指定列对结果进行分组。

having:分组后,筛选满足条件的行。

select:选择要返回的列。

order by:对结果进行排序。

        所以说一条语句执行的完整过程是:

        from 先决定查询哪个表,where 筛选满足条件的行,group by再对指定的列进行分组,没有参与分组的列可以忽略了,因为根本select不出来,接着having 对分组后的结果进行二次筛选,筛选满足条件的行;

        在前置操作完成后,select 就可以选择需要输出的列;

        order by可以对输出的结果进行相应的排序,如果需要分页,则可以使用limit。

(三)实际书写代码的思路

        题目:编写一个SQL查询,找出入职日期在2022年之后,所在部门员工平均工资超过5200的部门,统计这些部门的员工数量,最后按照员工数量从多到少排序。以下是表的具体内容:

-- 创建员工表
create table 员工 (员工编号 int primary key,员工姓名 varchar(50),部门 varchar(50),工资 decimal(10, 2),入职日期 date
);-- 插入示例数据
insert into 员工表 (员工编号, 员工姓名, 部门, 工资, 入职日期)
values (1, '爱丽丝', '人力资源部', 5000, '2022-01-01'),(2, '鲍勃', '信息技术部', 6000, '2022-03-15'),(3, '查理', '人力资源部', 5500, '2022-05-20'),(4, '大卫', '信息技术部', 7000, '2022-07-10'),(5, '伊芙', '财务部', 4500, '2022-09-05');

        写代码的思路其实就是“代码的书写顺序”,语句的书写顺序符合的是人的思路,语句的执行顺序符合的是计算机的逻辑。【重点】

        我们可以把书写代码的过程分为三部分分组之前分组分组之后

        分组之前:第一步要知道,需要输出哪几列从哪个表得到数据,即 select 与 from。根据“统计这些部门的员工数量”,可以知道,我们需要输出的有两列:部门、数量;数量需要使用聚合函数 count。接着,找出分组之前的筛选条件(where),是“入职日期在 2022 年之后”。

        分组:然后要确定分组条件(group by)我们已经知道了,输出的两列是部门与数量,因为输出的列除了聚合函数以外,就是分组条件所以分组条件是部门。

        分组之后:确定分组后的筛选条件(having)排序规则(order by)接着由“所在部门员工平均工资超过5200的部门”可知,在分组之后,我们还要根据平均工资 5200 进行相应的筛选;最后根据员工数量的多少进行排序。

        三步之后,即可得到以下代码:

select department,count(employee_id) 
fromemployees
where hire_date >= '2022-01-01'
group by department
having avg(salary) > 5200
order by count(employee_id) desc;

        以上即为数据查询语言 DQL 的所有内容,我们首先对整体语句拆分,作逐个击破;然后对其整体的执行过程书写思路作讲解,从而能在日常代码书写中,将语句写出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LENOVO联想ThinkBook 16 G6 ABP(21KK)恢复预装OEM原厂Win11系统镜像

适用机型&#xff1a;【21KK】 链接&#xff1a;https://pan.baidu.com/s/1lbvIh4KTbqm8EZQZfxvNIQ?pwd7vp0 提取码&#xff1a;7vp0 联想原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、Office办公软件、联想浏览器、联想电脑管家、联想软件商店、联想智能引…

# 基于人脸关键点的多表情实时检测系统

基于人脸关键点的多表情实时检测系统 在计算机视觉领域&#xff0c;人脸表情识别技术已经取得了显著的进展。它不仅可以用于娱乐应用&#xff08;如动态表情包生成&#xff09;&#xff0c;还能在心理健康监测、智能安防、人机交互等领域发挥重要作用。今天&#xff0c;我将分…

在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重构二开的开源项目 Dify-Plus

一、安装环境信息说明 硬件资源&#xff08;GB 和 GiB 的主要区别在于它们的换算基数不同&#xff0c;GB 使用十进制&#xff0c;GiB 使用二进制&#xff0c;导致相同数值下 GiB 表示的容量略大于 GB&#xff1b;换算关系&#xff1a;1 GiB ≈ 1.07374 GB &#xff1b;1 GB ≈ …

SQL Server存储过程和触发器的使用

存储过程 &#xff08;1&#xff09;创建存储过程&#xff0c;使用Employees表中的员工人数来初始化一个局部变量&#xff0c;并调用这个存储过程。 1. Create PROCEDURE test number1 int output --输出参数&#xff0c;可以从程序中返回信息 2. As 3. begin 4. D…

子类是否能继承

继承 父类&#xff1a; 子 类 构造方法 非私有 不能继承 私有&#xff08;private&#xff09;不能继承 成员变量 非私有 能继承 私有&…

2025年【山东省安全员C证】考试题及山东省安全员C证考试内容

在当今建筑行业蓬勃发展的背景下&#xff0c;安全生产已成为企业生存与发展的基石。安全员作为施工现场安全管理的直接责任人&#xff0c;其专业能力和资质认证显得尤为重要。山东省安全员C证作为衡量安全员专业水平的重要标准&#xff0c;不仅关乎个人职业发展&#xff0c;更直…

Spring 中的 bean 生命周期

&#x1f331; 一、什么是 Bean 生命周期&#xff1f; 在 Spring 容器中&#xff0c;一个 Bean 从“创建 → 初始化 → 使用 → 销毁”&#xff0c;经历了完整的生命周期。 Spring 提供了 多个扩展点 让你可以在这些阶段做事情&#xff0c;比如注入资源、日志记录、连接资源、清…

Media streaming mental map

Media streaming is a huge topic with a bunch of scattered technologies, protocols, and formats. You may feel like hearing fragments without seeing the big picture. Let’s build that mental map together — here’s a high-level overview that connects everyt…

AIDD-深度学习 MetDeeCINE 破译代谢调控机制

深度学习 MetDeeCINE 破译代谢调控机制 目录 使用 FEP/REMD 和 DFT 方法准确预测药物多靶点绝对结合自由能的新途径。Scorpio 框架利用对比学习优化核苷酸序列表示&#xff0c;提升基因组分析效率&#xff0c;尤其在未知序列的分类和泛化能力上表现出色。LPM 模型整合多模态扰…

【2】搭建k8s集群系列(二进制)之安装etcd数据库集群

一、etcd服务架构 Etcd 是一个分布式键值存储系统&#xff0c;Kubernetes 使用 Etcd 进行数据存储&#xff0c;所以先 准备一个 Etcd 数据库&#xff0c;为解决 Etcd 单点故障&#xff0c;应采用集群方式部署&#xff0c;这里使用 3 台组建集群&#xff0c;可容忍 1 台机器故障…

fastGPT—前端开发获取api密钥调用机器人对话接口(HTML实现)

官网文档链接&#xff1a;OpenAPI 介绍 | FastGPT 首先按照文档说明创建api密钥 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

cpp自学 day19(多态)

一、基本概念 同一操作作用于不同的对象&#xff0c;产生不同的执行结果 &#x1f449; 就像「按F1键」&#xff1a;在Word弹出帮助文档&#xff0c;在PS弹出画笔设置&#xff0c;​同一个按键触发不同功能 &#xff08;1&#xff09;多态类型 类型实现方式绑定时机​静态多态…

Java 大视界 -- Java 大数据在航天遥测数据分析中的技术突破与应用(177)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

人脸考勤管理一体化系统(人脸识别系统,签到打卡)

人脸考勤管理一体化系统 项目介绍 本项目是基于Flask、SQLAlchemy、face_recognition库的人脸考勤管理一体化系统。 系统通过人脸识别技术实现员工考勤打卡、人脸信息采集、人脸模型训练等功能。 项目采用前后端分离的技术框架&#xff0c;基于Flask轻量级Web框架搭建后端服务…

单调栈学习C++

目录 一&#xff0c;每日温度 二&#xff0c;下一个更大的元素I 三&#xff0c;下一个更大的元素II 四&#xff0c;接雨水 小结&#xff1a; 单调栈是一种特殊的栈结构&#xff0c;里面的元素按照单调递增或者递减的顺序排列。常用于解决元素左边或者右边比它大或者小的问…

网络钓鱼攻击的威胁和执法部门的作用(第一部分)

在当今的数字世界中&#xff0c;网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段&#xff0c;用于欺骗人们提供敏感信息&#xff0c;例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…

左值与右值,空间与数据

左值是空间&#xff0c;右值是数据 编程总是对“数据”&#xff0c;对"存放数据的空间"操作 a返回一个当前的数据&#xff0c;存放到一个临时空间中&#xff0c;自身的空间中的数据再进行运算 a直接对自身空间中的数据进行运算 其余知识&#xff1a; 1.变量名的意…

无人机飞行术语科普!

一、基础操作类 1. 炸机 指无人机意外坠毁或严重损坏&#xff08;如撞树、撞楼、失控摔机等&#xff09;。 例句&#xff1a;“今天风太大&#xff0c;差点炸机&#xff01;” 2. 一键放生 调侃某些情况下无人机失控飞丢&#xff0c;无法找回&#xff08;源自某些品牌…

模拟算法(一):一维数组模拟

目录 模拟的概念 例1&#xff1a;开关灯 算法思路&#xff1a; 代码如下&#xff1a; 输入输出&#xff1a; 例2&#xff1a;序列操作和查询 算法思路&#xff1a; 代码如下&#xff1a; 输入输出&#xff1a; 例3&#xff1a;数组折叠 算法思路&#xff1a; 代码如…

MySQL 基础入门

写在前面 关于MySQL的下载安装和其图形化软件Navicat的下载安装,网上已经有了很多的教程,这里就不再赘述了,本文主要是介绍了关于MySQL数据库的基础知识。 MySQL数据库 MySQL数据库基础 MySQL数据库概念 MySQL 数据库&#xff1a; 是一个关系型数据库管理系统 。 支持SQL语…