MySql【数据查询语言DQL】

news2024/9/19 14:15:20

DQL[非常重要]

DQL 主要指查询语句,有查询单表数据,也有查多表数据表,单表查询

  • 基本查询

  • 条件查询

  • 模糊查询

  • 排序查询

  • 聚合查询

  • 去重查询

  • 分组查询

  • 限制查询

1、 数据准备

将发的stu.sql导入到MySql中

image-20230314205804686

image-20230808110132974

2、 基本查询

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


查询返回的是一张虚拟表,查询对原表数据没有任何影响,默认查询的全表数据

-- 基本查询
-- 查询所有列
select sid,sname,age,sex,score,cid groupLeaderId from stu;
-- 查询所有列,在测试,练习时可以使用*代替
select * from stu;
-- 查询指定 列
select sid,sname,sex from stu;
-- 查询的列名可以取别名,使用as,但是一般as不写
select sid as 学号,sname as 姓名,score 成绩 from stu
​
-- 年龄+1
select age+1 from stu;
算数运算符描述
+两列做加法运算
-两列做减法运算
*两列做乘法运算
/两列做除法运算

注意:%是占位符,而非模运算符。

3、 条件查询

条件查询就是在基础查询基础上,再给sql设置条件,只查询部分符合条件的数据

条件语句 : select 字段1,字段2,... from 表名 where 字段 条件 值;

条件运算符

  • = ,在这里是相等,不是赋值

  • >

  • <

  • >=

  • <=

  • !=

  • and 条件并列

  • or 条件选择

  • in 范围

  • not in

  • between..and 条件范围

-- ============== 条件查询 ==============
-- 查询学号为1001的学生信息
select * from stu where sid = 1001;
-- 查询学生成绩大于60的学生id 姓名,成绩
select sid,sname,score from stu where score > 60;
-- 查询学生性别为女,并且年龄小于50的记录
select * from stu where sex = '女' and  age < 50;
-- 查询学生学号为1001,或者姓名为李四的记录
select * from stu where sid = 1001 or sname = '李四';
-- 查询学号为1001,1002,1003的记录
select * from stu where sid = 1001 or sid = 1002 or sid = 1003;
select * from stu where sid in (1001,1002,1003);
select * from stu where sid >= 1001 and sid <= 1003;
-- 查询学号不是1001,1002,1003的记录
select * from stu where sid not in (1001,1002,1003);
select * from stu where sid != 1001 and sid != 1002 and sid != 1003;
-- 查询学生年龄在20到40之间的学生记录
select * from stu where age >= 20 and age <= 40;
select * from stu where age between 20 and 40;
-- 查询性别非男的学生记录
select * from stu where sex != '男';
select * from stu where sex = '女';
--  查询性别为null的学生记录
update stu set sex = null where sid = 1001.;
--  查询是不能=null运算
-- select * from stu where sex = null;
select * from stu where sex is null;
--  查询性别不为null的学生记录
select * from stu where sex is not null;

4、 模糊查询

模糊查询其实也是条件查询

语法: select 字段1,字段2,... from 表名 where 字段 like '%值%';

  • % 匹配任意多个字符

-- ============== 模糊查询 ============== 
-- 查询姓名以“张”开头的学生记录
select * from stu where sname like '张%';
-- 查询姓名中包含“三”的学生记录
select * from stu where sname like '%三%';

5、 排序查询

对查询后的数据按照指定字段以及指定规则排序

语法: select 字段1,字段2,... from 表名 order by 字段 [desc|asc];

  • desc 降序

  • asc 升序,默认是升序


排序查询写在最后

-- ============== 排序查询 ============== 
-- 查询所有学生记录,按年龄升序排序
select * from stu order by age asc;
select * from stu order by age;
-- 查询所有学生记录,按年龄降序排序
select * from stu order by age desc;
-- 查询所有学生记录,按年龄升序排序,如果年龄相同时,按编号降序排序
select * from stu order by age asc , sid desc;
-- 查询成绩大于60的学生id,姓名,成绩,并根据成绩降序
select sid,sname,score from stu where score > 60 order by score desc;

6、 聚合函数

将查询的结果,聚合运算得到一个结果值,语法特点

  • 聚合运算完,结果只有一行数据

  • 其他字段不能和聚合函数同时查询,除非有分组查询

聚合函数分类

  • count(expr) 计算指定列的不为null的行数

  • max(expr) 计算指定列的最大值

  • min(expr) 计算指定列的最小值

  • avg(expr) 计算指定列的平均数,除以不为null的条数

  • sum(expr) 计算指定列的和 ,计算不为null的数据

  • 函数中的expr,可以写列名,也可以写函数表达式


语法: select 聚合函数(字段) from 表名;

-- ================== 聚合函数 ==================
/*
聚合函数: 
    把多行数据聚合在一起运算得到一个结果
注意: 
    聚合函数执行完,返回的结果只有一行记录
    与聚合函数一同出现的列必须出现在group by后
函数:
    count(字段) : 对该列不为null的行计数
    sum(字段): 对该列不为null的数据求和
    avg(字段): 对该列不为null的数据求和再求平均值
    min(字段): 对该列不为null的数据求最小值
    max(字段): 对该列不为null的数据求最大值
语法:
    放在select后from前,对查询的结果列进行运算
    放在having后使用
*/
-- 查询stu表中记录数
select count(sid) from stu;
select count(sid),sname from stu; -- 报错,语法不对
-- 查询stu表中有成绩的人数
select count(score) from stu;
select count(sex) from stu;
-- 查询stu表中成绩大于60的人数
-- 先执行from获得全部数据,再通过where过滤数据,再计算select后
select count(sid) from stu where score > 60;
-- 查询所有学生成绩和
select sum(score) from stu;
-- 统计所有学生平均成绩(所有有成绩的人的平均分)
select avg(score) from stu;
-- 统计所有学生平均成绩(所有人包括成绩为空的)
select sum(score) / count(sid) from stu;
select sname,age from stu;
-- 扩展: 使用as取别名,as可以省略
select sum(score) / count(sid) as 平均数 from stu;-- 可以
select sum(score) / count(sid) as '平均数' from stu;-- 可以
select sum(score) / count(sid) '平均数' from stu;-- 可以
-- 查询最高成绩和最低成绩
select max(score),min(score) from stu;
select max(score) 'max',min(score) 'min' from stu;

7、 去重函数[了解]

可以将某列数据去重查询,distinct,一般不单独使用,配合聚合函数使用

-- ============== 去重查询 ============== 
-- 查询年龄不重复的共有多少人        
select count(distinct age) from stu;

8、 分组查询

分组查询,就是按照一定条件(列)将查询的数据分为几组.

语法: select 字段1,字段2,... from 表名 [where 字段 条件 值] group by 字段 having 字段 条件值;

  • group by 字段,根据指定字段分组

  • having 字段 值, 分组后再过滤

有个非常重要特点: SQL只要有分组,分成几组,查询结果就只有几行,所以一般配合聚合函数来使用,是组内数据的聚合


与聚合函数同时出现的列,必须出现在group by语句中

或者说group by后面的字段可以出现在select后

having和where都是过滤

  • where是分组前过滤,having是分组后过滤

  • where后不能使用聚合函数,having可以聚合函数

/*
分组查询,通过group by 字段对数据分组,对组内聚合运算
---
分组查询的特点
1) group by语句中,select后的字段必须出现group by中
  或者说
   与聚合函数同时出现的列,必须出现在group by中
   否则会报错
2) 分成几组,最终结果是几行记录
3) 聚合函数是对分组后组内聚合的
-----------------
having和where都是过滤数据,什么区别?
1) where是分组前过滤对每行记录过滤
   having后分组后 对组过滤
2) having后可以写聚合函数的
   where不行
*/      
​
-- 查询男生多少人,女生多少人
select sex,count(sex) from stu group by sex;
-- 查询每个班级的班级编号和每个班级的成绩和
select cid,sum(score) from stu group by cid;
-- 查询每个班级的班级编号以及每个班级的人数
select cid,count(*) from stu group by cid;
-- 查询每个班级的班级编号以及每班内男生女生各多少人
select cid,sex,count(*) from stu group by cid,sex
-- 查询成绩总和大于200的班级编号以及成绩和[重点: 分组后过滤用having]
select cid,sum(score) 
from stu 
group by cid 
having sum(score) > 200
-- 查询每个班成绩大于60的人数[会将4班直接过滤掉]
select cid,count(*) from stu where score > 60 group by cid
-- 利用if函数
select cid,count(if(score > 60,score,null)) from stu group by cid;
-- 查询所有人成绩都大于50的班级的班级编号和人数
select cid,count(*) from stu group by cid having min(score) > 50
-- 查询成绩总和大于200的班级编号以及成绩和并根据成绩总和升序
select cid,sum(score)
from stu
group by cid
having sum(score) > 200
order by sum(score) asc 

9、 限制查询

就是将查询完的数据,可以限制展现条数

语法: limit n -- 限制输出指定n条,从第一条开始

limit x,y -- 限制输出,从x下标处输出y条,第一条的下标是0


常用于分页操作

-- ================== 分页(limit)查询 ==================
-- 在最后写limit x[,y]
-- limit x,限制输出结果的条数为x
select * from stu limit 5;
select * from stu where score > 40 limit 5;
-- limit x,y 限制从x行处输出y条,x从0开始
select * from stu limit 0,4;
-- 分页中有些已知条件
-- 当前面    pageNo = 1
-- 每页数据量pageSize = 3
-- 数据总量  total = count(sid)
-- 页数      pageCount = total%pageSize==0?total/pageSize:(total/pageSize)+1
-- 第一页
select * from stu limit 0,3
-- 第二页 
select * from stu limit 3,3
-- 第三页 
select * from stu limit 6,3
-- 第pageNo页
select * from stu limit (pageNo-1)*pageSize,pageSize

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

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

相关文章

吉利银河L6 第二年保险 出险对保费的影响

出险情况 出险一次 自己责任 自己修车走车损,1000多元; 给对方修车走交强险,1000多元. 导致保费上涨1100左右. 车损,三者等项目都上涨 注意:如果出险流程没走完(不会导致第二年报价上涨),恰好可以买第二年保险(保险到期前一个月),如果你买了,这次出险没给你加钱,会在第二年给…

远程控制电脑的软件有哪些?精选4个小妙招分享!

远程控制电脑的软件多种多样&#xff0c;它们各自具有不同的特点和优势。 以下是精选的四种远程控制软件及其使用小妙招&#xff0c;供您参考&#xff1a; 1.安企神 软件特点&#xff1a; 远程控制&#xff1a; 实时桌面控制&#xff1a;能够实时查看和控制远程计算机的桌面…

[译] RAGFlow 使用说明

本文翻译整理自&#xff1a;https://ragflow.io/docs/dev/ 本文档更多是 RAGFlow 系统操作内容&#xff0c;虽然不难/深刻&#xff0c;但有些细节没有注意&#xff0c;在搭建和使用的时候就容易出各类问题。所以读完这个文档是有必要的。 文章目录 快速启动一、先决条件二、启…

插入排序:直接插入排序、希尔排序详细说明

插入排序 基本思想&#xff1a;直接插入排序是⼀种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到⼀个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到⼀个新的有序序列。 在玩扑克牌整理手中…

【操作系统】实验:指示灯开关控制

目录 一、实验目的 二、实验内容 三、实验步骤 四、记录与处理 五、思考 六、成果文件提取链接 一、实验目的 学习51单片机通用I/O口的基本输入/输出功能&#xff0c;掌握汇编程序编程与仿真设计方法。 二、实验内容 &#xff08;1&#xff09;创建一个包含80C51固件&am…

diffusion model(扩散模型)DDPM解析

DDPM 前向阶段 重复 2-5 步骤 x 0 ∼ q ( x 0 ) \mathbf{x}_0\sim q(\mathbf{x}_0) x0​∼q(x0​)从数据集中采样一张图片 t ∼ U n i f o r m ( { 1 , … , T } ) t\sim\mathrm{Uniform}(\{1,\ldots,T\}) t∼Uniform({1,…,T})&#xff0c;从 1~T 中随机挑选一个时间步 t ϵ …

JavaWeb实战教程:如何打造旅行社网站系统,提升在线服务能力?

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

rockyliunx 救援模式下禁用docker

目录地址 /usr/lib/systemd/system/docker.service 进入系统界面&#xff1a; 选择系统 按E 按e出现 如下界面&#xff0c;找到 quite 后面添加 init/bin/bash 按 ctrl x 保存 后&#xff0c;到如下界面 加载文件系统为读写 输入命令 mount -o remount, rw / 修改docer.s…

P7910[CSP-J2021]插入排序

题目描述 插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生&#xff0c;今天 H 老师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为O(1)&#xff0c;则插入排序可以以 O(n^2)的时间复杂度完成长度为 n 的数组的排序。不妨假设这 n 个数字分别存储…

win11找环境变量

第一步&#xff1a;win&#xff0b;i 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第五步&#xff1a;

从屎山代码到RTOS,老工程师的架构进化史

很多老铁和我反馈&#xff0c;说很喜欢看我写的内容&#xff0c;不管是朋友圈还是文章&#xff0c;能在字里行间&#xff0c;受益匪浅。 想想也很久没时间没写长文了&#xff0c;既然大家喜欢看&#xff0c;我尽量抽时间多写。 长文预警&#xff0c;全文5800多字&#xff0c;…

云动态摘要 2024-08-28

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费领用]电商出海AIGC福利包活动 腾讯云 2024-08-20 腾讯云智能助力中小电商企业用户出海&#xff0c;帮助企业用户轻松打造全场景AIGC应用。 注册阿里云免费领云服务器_云服务器ECS_阿…

【达梦数据库】表空间重命名新建用户下的模式

目录 背景需求解决方法 背景 达梦数据库中&#xff0c;一个用户对应一个表空间&#xff0c;用户会创建默认模式0。 在使用过程中&#xff0c;客户需要新建模式1&#xff0c;并且模式1和原来的表空间对应。 需求 1、表空间如何重命名 2、如何新建用户下的模式1 解决方法 表…

Linux设备树初步

一.设备树的概念 设备树&#xff1a;是一种描述硬件资源的数据结构&#xff0c;不是将设备的每个细节都硬编码到操作系统中&#xff0c;而是可以在引导时传递给操作系统的数据结构中描述硬件的许多方面。 设备树是描述一个硬件平台的硬件资源。这个“设备树”可以被bootloade…

综合能源充电站有序充电策略

随着电动汽车的发展&#xff0c;充电用户越来越多&#xff0c;同时也出现了一系列问题&#xff0c;尤其是无序充电带来的充电成本高、充电排队时间长和电网负荷安全影响等问题&#xff0c;制约着电动汽车和充电设施的发展。为解决此类问题&#xff0c;文章研究和设计有序充电策…

Kevin‘s notes about Qt---Episode 4 多次点击按钮反复执行机械臂动作

原先版本 SDK 1.2.1 - 2020-04-02 HMI 界面 4.0.6.135135 控制器 1.7.5 升级程序 0.6.4 伺服版本 不详(似乎也并不重要) 前言 在之前的工作中,这个问题并没有得到有效解决,情况如下: 在之前版本的程序中,每次动作执行完后需要关闭Qt界面,下一次想要运行机械臂程序时,…

数据链路层(Mac帧,报头字段,局域网通信原理),MTU,MSS,ip报文的分包与组装(ip报头字段介绍,组装过程,判断是否被分片/收到全部分片)

目录 数据链路层 介绍 MTU 介绍 在哪一层分片 IP报文的分包与组装 16位标识 3位标志 13位片偏移 示例 组装过程 确定是否被分片 确定是否收到全部分片 注意点 数据链路层与网络层的关系 Mac帧 Mac地址 报头格式 目的/源地址 类型 局域网通信原理 图解 碰撞…

TCP并发服务端的实现

思想&#xff1a;创建多个套接字&#xff0c;由"我"来管理这些套接字 方法&#xff1a; 1.多进程 2.多线程 3.IO多路复用 tcp服务器端创建流程&#xff1a; socket() bind() listen() connfd accept IO多路复用&#xff1a; 多个文件I复用同一个进程 IO…

基于深度学习的游客满意度分析与评论分析【情感分析、主题分析】

需要本项目的可以私信博主 目录 1 绪论 1.1 选题背景及研究意义 1.1.1 选题背景 1.1.2 研究意义 1.2 研究内容与方法 1.2.1 研究内容 1.2.2 研究方法 1.3 创新与不足 1.3.1创新点 1.3.2研究局限性 2 文献综述 2.1 相关概念界定 2.1.1 大数据分析 2.1.2 游客满意度 2.2 国内外研…

【香橙派系列教程】(十八) 视觉垃圾桶-网络线程

【十八】视觉垃圾桶-网络线程 文章目录 【十八】视觉垃圾桶-网络线程一、增加网络控制功能1.实现需求&#xff1a;2.TCP 心跳机制解决Soket异常断开问题 二、Linux内核提供了通过sysctl命令查看和配置TCP KeepAlive参数的方法。三、C语言实现TCP KeepAlive功能1.函数原型2.返回…