MySQL语法之DQL数据查询语言(数据库的查询)

news/2024/4/16 15:56:05/文章来源:https://blog.csdn.net/yuandfeng/article/details/129207886

Java知识点总结:想看的可以从这里进入

目录

        • 2.5.4、DQL数据查询
          • 1、简单查询
          • 2、模糊查询
          • 3、连表查询
          • 4、自连接
          • 5、UNION
          • 6、排序
          • 7、分页查询
          • 8、分组查询
          • 9、子查询in
          • 10、子查询EXISTS

2.5.4、DQL数据查询

数据库的基本功能,对数据进行查询。关键字select,从数据库查询所需要的数据,是数据库最核心的语言,也是使用最多的语句。不同的数据库select语句有细微的差别。

下面是select语句的书写顺序:

#方式1:
SELECT [DISTINCT] 要返回的字段....
FROM[ JOIN][ON] 多表的连接条件
WHERE 条件
[GROUP BY  分组] 
[HAVING 分组中函数过滤条件]
[ORDER BY 排序的字段  ASC/DESC]
[LIMIT 分页];

下面是 select 语句的执行顺序:

执行顺序子句作 用
1、form获取到将要查询的表所有数据(如果是连表的数据,需要根据笛卡尔积获取表数据,然后通过on进行筛选,然后再根据JOIN是的连接方式添加外部行)
2、where对数据根据条件进行筛选
3、group by配合聚合函数,对筛选后的数据进行分组
4、havinghaving子句对分组后的数据进行过滤,可以检索聚合函数
5、select将查询到的结果,生成一个临时表
6、distinct去除临时表中的重复数据
7、order by对去重后的临时数据按需要进行排序
8、limit进行分页显示
1、简单查询

SELECT…FROM….,是DQL中最简单的查询语句。

--  无条件查询所有表中信息   *会显示所有的字段(主要注意的是*这个通配符是不建议使用的,因为使用*会影响效率)
SELECT * FROM `表名` ;--  查询特定字段的信息SELECT 字段1,字段2... FROM `表名`;-- 给需要查询的字段起别名(as也可以给数据表起名字,当数据表很多时可以使用)SELECT 字段1 AS '别名', 字段2 AS '别名'... FROM `表名`;
image-20210425105207065 image-20210425105119534

SELECT后可以跟WHERE子句,用来设置条件,根据条件查询所需数据。

-- 根据where的条件查询数据   多条件(and与  or或 not非【where not id=1 排除id=1的数据】)
SELECT 字段... FROM 表名 WHERE 表达式 and 表达式...;
image-20210425172950279

SELECT语句是可以直接计算表达式的。

--  直接计算表达书
select 1+1*50 as '计算结果'; --  查询自增的步数,每次自增几?(计算变量)
select @@auto_increment_increment
image-20230223202648038

在SELECT中用于去重的关键字是 DISTINCT,写在SELECT的后面。

--  去重查询:查出来的重复数据,会自定去除,只显示一条
SELECT DISTINCT  字段 FROM 表名;
image-20230223202604626 image-20210425173205028
2、模糊查询

主要使用比较运算符进行一些判断操作

操作符描述实例
BETWEEN AND在某个区间内BETWEEN 2 and 5 在[2,5]内
NOT BETWEEN不在两值之间
IN在集合中
NOT IN不在集合中
LIKE模糊匹配
IS NULL为空可查询某字段为空的所有数据
IS NOT NULL不为空可查询某字段不为空的所有数据
  • LIKE 的==%== ,类似于正则中的*,可匹配任意个字符。
  • LIKE的 _ ,可以匹配一个字符。
  • 如果没有 %和_,就相当于运算符 =
  • 使用 AND 或者 OR 指定一个或多个条件。
  • 可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句来指定条件。
--  模糊查询 LIKE   (%代表任意个字符,_代表一个字符【__代表2个字符】)
-- 查询用户中姓李的
SELECT * FROM 表名 WHERE 姓名字段 LIKE '李%'; --查询用户中姓李的且名字只有两个字符的:
SELECT * FROM 表名 WHERE 姓名字段 LIKE '李_';   --查询用户名字中间带寻的
SELECT * FROM 表名 WHERE 姓名字段 LIKE '%寻%'--查询在为1,2,3班的学生	,多条结果集时
SELECT * FROM 表名 WHERE 班级id字段 IN (1,2,3);--查询某字段为空的数据  IS NULL  或者 =''
SELECT * FROM 表名 WHERE 字段 IS NULL;		-- IS NOT NULL    不为空
SELECT * FROM 表名 WHERE 字段='';
3、连表查询

关联查询,指两个或两个以上的表一起完成的,查询的关键是这些表之间有关联字段。操作关键字 JOIN

连表查询主要分为三种:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

    image-20220722111209028

    SELECT 字段1,字段2.....
    FROM1 INNER JOIN2
    ON 关联条件
    WHERE 其他子句;
    
    image-20210426163918713
  • **LEFT JOIN(左连接):**获取左表所有记录,即使右表没有对应匹配的记录。

    image-20220722111142815

    SELECT 字段1,字段2.....
    FROM1 LEFT JOIN2
    ON 关联条件
    WHERE 其他子句;
    
    image-20210426162714394
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

    image-20220722111239978

    SELECT 字段1,字段2.....
    FROM1 RIGHT JOIN2
    ON 关联条件
    WHERE 其他子句;
    
    image-20210426163745617
  • 多张表连接

    image-20210426171001069

join的几种情况:(oracle中还有两种情况,但MySQL中不支持 full join)

image-20220419162341602

注意事项

笛卡尔积是一个数学运算,它是两个集合的最大组合数,即两个集合之间数据的乘积。

笛卡尔积的产生:在表连接过程中如果没有条件进行约束会产生笛卡尔积,即查询的最终结果=第一个表行数*第二个表行数,所以我们在进行连表查询时,一定要带上查询的条件,避免笛卡尔积的产生。( n个表,至少需要n-1个连接条件。两表至少1个条件,3表至少2个条件)

ON和WHERE的区别

1、join on是一个具体的语法,生成临时表时使用的条件,它不管on中的条件是否为真,都会返回(左连接返回左表全部记录)(右连接返回右表全部记录)。

2、where是等值查询,是在生成临时表以后再进行过滤,对左右表都进行筛选。

on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。

阿里编程规范:

【 强制 】对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或表名)进行限定。

说明 :对多表进行查询记录、更新记录、删除记录时,如果对操作列没有限定表的别名(或表名),并且操作列在多个表中存在时,就会抛异常。

image-20230224160131655

这种规范是因为不同表中的字段很有可能会出现重名的情况,比如name这个字段,在两张表中都存在,如果不加以限制,就会出现异常。

4、自连接

特殊的一种表连接,以一张表为基础,在逻辑上当成多张表进行处理,简单来说就是自己和自己连接。把一张表用语法拆成两张一样的表,只是变量名不同。

自连接在表中的数据有层次结构的时候使用,比如:商品分类表(一张表中有商品的多级分类),权限表(表中有上下级的关系),菜单表(多级菜单),省市联动表等等。在商品类别表有的二级菜单有一个父id的字段,存放上级菜单的id(一级菜单的电器类id为1,二级菜单手机的id为2,父id字段为1,则表示手机是电器的下级分类)。

具体把一张表当成几张表使用,需要根据需求比如下面的省市区的数据表。

  • 一张国省市区(县)的数据表,用自连接将其显示出来 (表使用父级id的字段来区分上下级关系)

    image-20230224163742874
  • 显示国省市区四级关系

    image-20230224163542249
  • 显示省市区三级关系

    image-20230224163849067
  • 显示两级关系

    image-20230224163950205
5、UNION

UNION 操作符用来合并查询结果,它用于将两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

  • 连接的两个sql语句返回的字段数量必须相同。
  • 两个语句返回的字段名不一样时,只显示第一个语句中返回的字段值
  • UNION会进行去重,记录不会重复,按字段的默认规则排序。UNION ALL是返回所有,不会进行排序。从效率上说,UNION ALL 要比 UNION 更快。
SELECT 字段 FROM[WHERE 条件]
UNION [ALL]				-- 连接两个select查询的结果:ALL为显示所有
SELECT 字段 FROM[WHERE 条件];
image-20220419175023074
6、排序

排序 [ORDER BY ] 写在WHERE条件之后,可以对查询结果按某一字段(数字、字母等)进行降序DESC / 升序ASC 的排列。

--  排序
SELECT 字段... FROM...
WHERE  条件.....
ORDER BY 字段 DESC / ASC(默认) 
image-20230224172004296 image-20230224171840733

[ORDER BY ]后面也可以跟多个字段进行排序,在对多列进行排序的时候,首先排序的第一个字段必须有相同的值,这样才会对第二列进行排序,如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。

image-20230224172256971
7、分页查询

分页 [LIMIT] 一般写在 SELECT语句的最后,按设置给数据进行分页显示。当数据过多时,使用过程中需要进行分页来提供良好的体验,同时分页可以缓解数据库的压力,提升查询效率。

--  排序
SELECT 字段... FROM...
WHERE  条件.....
LIMIT 位置偏移量, 行数;
LIMIT 页面起始值,页面行数pageSize      
公式:LIMIT(当前页数-1)*每页条数,每页条数
-- 是查询语句中处于最后面的语句
-- 起始值:就是当前页第一条数据是查询数据的第几条。从0开始而非1
-- 页面行数:页面最大显示数每页显示五条数据:
第一页: limit 0,5    -- (1-1)pageSize,pageSize
第二页: limit 5,5    -- (2-1)pageSize,pageSize
第三页: limit 10,5   -- (3-1)pageSize,pageSize
第四页: limit 15,5   -- (4-1)pageSize,pageSize
...
第n页: limit (n-1)pageSize,pageSize
实际网页中分页需要的数据:
1、当前页:n
2、每页最大显示数量:pageSize
3、总页数:数据总数/pageSize
4、每页的起始值:(n-1)pageSize

image-20230224171505600

image-20230224171517196

8、分组查询

[GROUP BY ]分组查询,是先将数据按一个或多个字段进行分组后,再将数据按需要检索。分组在使用时必须配合聚合函数(count、sum、avg、max、min)一起使用

SELECT 普通字段, 聚合函数处理 
FROMWHERE 条件
GROUP BY  按某字段分组(可以一列或多列分组);

WHERE 子句在 GROUP BY 语句之前,对分组前的数据起筛选作用,所以无法对分组后的数据进行过滤,同时where无法和聚合函数同用,所以这时候时候 HAVING子句对分组后的数据进行过滤。HAVING子句必须配合GROUP BY使用,无法单独使用。

SELECT 普通字段, 聚合函数处理 
FROMWHERE 条件
GROUP BY  按某字段分组(可以一列或多列分组)
HAVING 可以对聚合函数进行条件检索;

WHERE和HAVING对比:

1、WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的函数作为筛选条件;
HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。

这是因为在查询语法结构中,WHERE执行 在 GROUP BY 之前,所以无法对分组结果进行筛选。HAVING 在 GROUP BY 之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是 WHERE 无法完成的。另外,WHERE排除的记录不再包括在分组中。

2、如果需要从关联表中获取需要的数据,WHERE是先筛选后连接,HAVING 是先连接后筛选。 所以在关联查询中,WHERE 比 HAVING 更高效。因为 WHERE 可以先筛选,用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。HAVING 则需要先把结果集准备好,用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用的资源就比较多,执行效率也较低。

所以在使用时,一般包含分组统计函数的条件用 HAVING,普通条件用 WHERE。

  • 在数据库通过0和1保存性别,以性别分组分别查询各自的数量

    image-20230224165815663
  • 以班级分组,查询各个班级的人数:

  • 如果仅仅是想查询班级人数>10的班级,那么就需要对COUNT(*)进行条件筛选,这时候就需要用到HAVING 了

    image-20230224170616336

GROUP BY 在使用聚合函数统计出来数据,只能知道一些大致的情况,比如班级学生数量,但是我们如果还想知道班级内学生的姓名时,可以使用 group_concat函数

group_concat(字段 [排序:order by asc / desc] [separator'分隔符'(默认,])
image-20230224171153748
9、子查询in

子查询就是在where语句中嵌套一个select语句,关键字 一般为 INEXISTS 或者是 比较运算符

在 WHERE 子句中 IN 可以过滤某个字段的多个值(WHERE 字段 IN(值1,值2…)),当 IN 后的值不是固定的几个值,而是某条 SELECT 语句的查询结果时,使用 IN 关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较,如果某行的特定列的值存在,则在 SELECT 语句的查询结果中就包含这一行。

  1. IN 过滤字段的值

    SELECT * FROMWHERE 字段 IN (value1,value2...);
    
    image-20230224174913843
  2. IN 子查询

    1. 如果子查询的SELECT返回的是一条数据的话,可以使用 运算符 =、>、>=、<、<=、<>

      SELECT * FROMWHERE 字段 运算符 (SELECT * FROM[WHERE .......])
      
      image-20230224183039644
    2. 如果子查询的SELECT返回的是多条语句:

      SELECT * FROMWHERE 字段 IN (SELECT * FROM[WHERE .......])
      
      image-20230224183257515

10、子查询EXISTS

EXISTS是查询中用于测试内部查询是否返回行的布尔值运算符,将主查询的数据放到子查询中做条件验证,根据结果决定主查询数据是否保留。

EXISTS: 是否存在的意思, EXISTS子查询就是用来判断某些条件是否满足(跨表),

EXISTS是接在 WHERE 之后

EXISTS返回的结果只有0和1.

SELECT * FROMWHERE EXISTS (SELECT * FROMWHERE... )

例:如果存在数学考试则列出整个表的记录

image-20230224183711042

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

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

相关文章

Python3+Selenium3自动化测试

此前对网页内容进行元素定位的操作&#xff0c;接下来就可以对已经定位的元素进行操作了&#xff0c;一般情况下定位好元素后通过IDE的提示就可以了解到有哪些方法 #coding utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import By dr…

关于永中Office(永中办公软件)不认Windows系统安装的字体的解决办法

一位网友的电脑最近安装了永中Office软件&#xff0c;在使用过程中发现无法使用方正小标宋简体、仿宋GB2312等字体&#xff0c;这些字体在之前所用的微软Office中可以正常使用。他根据网上查到的一些的资料&#xff0c;将这些字体文件复制到C:\Program Files\Yozosoft\Yozo_Off…

【AcWing-Python-786】第k个数/快速选择算法

题目&#xff1a;https://www.acwing.com/problem/content/788/对应视频讲解&#xff1a;https://www.acwing.com/video/228/题目描述回顾快排【AcWing-Python-785】快速排序 - CSDN博客&#xff08;一&#xff09;步骤找到分界点x&#xff1a;可以是区间最左端点、区间最右端点…

华为OD机试用Python实现 -【天然蓄水库 or 天然蓄水池】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲天然蓄水库 or 天然蓄水池题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明示例三输入输出说明Python 代码实现算法思路华为OD机试300题大纲 参加华为

蓝桥2.24训练

1&#xff0c;奇怪的函数 P2759 奇怪的函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1这道题有两个点&#xff0c;一个是求数的位数 2&#xff0c;用整数二分求出的位数与n比较 #include <bits/stdc.h> using namespace std; typedef long long ll; ll n; int ma…

这9道软件测试面试题,就能刷掉90%的软件测试员

转眼就要到“金三银四”了&#xff0c;没点真本事真技术&#xff0c;没点面试经验&#xff0c;不了解点职场套路&#xff0c;如何过五关斩六将&#xff1f;如何打败面试官&#xff1f;如何拿下那梦寐以求的offer&#xff1f; 如果你的跳槽意向已经很确定&#xff0c;那么请往下…

Laravel框架01:composer和Laravel简介

Laravel框架01&#xff1a;composer和Laravel简介一、Composer介绍二、创建Laravel项目三、Laravel目录结构四、Laravel启动方式一、Composer介绍 composer 是PHP中用来管理依赖关系的工具。类似于Javascript的NPM。composer官网&#xff1a;https://getcomposer.org/安装结束…

Android源码分析 —— Activity栈管理(基于Android8)

0. 写在前面 本文基于 Android8.0源码&#xff0c;和Android9.0大同小异&#xff0c;但和Android10.0差别非常大&#xff01;新版改用ATM来管理Activity的启动&#xff0c;Activity的生命周期也通过XXXItem来管理。由于我分析的Activity启动流程就是基于Android8/9的&#xff…

通用信息抽取技术UIE产业案例解析,Prompt 范式落地经验分享!

想了解用户的评价究竟是“真心夸赞”还是“阴阳怪气”&#xff1f;想快速从多角色多事件的繁杂信息中剥茧抽丝提取核心内容&#xff1f;想通过聚合相似事件准确地归纳出特征标签&#xff1f;……想了解UIE技术在产业中的实战落地经验&#xff1f;通用信息抽取技术 UIE 产业案例…

啊哈 算法读书笔记 第 2 章 栈、队列、链表

第 2 章 栈、队列、链表 目录 第 2 章 栈、队列、链表 队列&#xff1a; 解密回文——栈 纸牌游戏&#xff1a; 链表 模拟链表 队列&#xff1a; 首先将第 1 个数删除&#xff0c;紧接着将第 2 个数放到这串数的末尾&#xff0c;再将第 3 个数删除并将第 4 个数放到这串…

Mysql 语句优化 (Explain)

Mysql 语句优化 &#xff08;Explain&#xff09; 1. 概述 ​ 在 select 语句之前增加 explain 关键字&#xff0c; mysql 会在查询上设置一个标记&#xff0c;返回查询执行计划信息&#xff0c;而不是执行这条sql 字段formatjson时的名称含义idselect_id该语句的唯一标识sel…

centos7安装

centos7安装制作U盘启动盘下载镜像下载 UltralISO制作启动盘使用U盘安装系统修改模式为 UEFI调整BOOT option保存重启进入安装界面安装图形界面安装搜狗输入法制作U盘启动盘 下载镜像 去官网下载镜像&#xff0c;找到 mirrors链接&#xff08;速度快&#xff09; 选择一个中…

创客匠人直播:构建公域到私域的用户增长模型

进入知识付费直播带货时代&#xff0c;很多拥有知识技能经验的老师和培训机构吃到了流量红利。通过知识付费直播&#xff0c;老师们可以轻松实现引流、变现&#xff0c;还可以突破时间、地域的限制&#xff0c;为全国各地的学员带来优质的教学服务&#xff0c;因此越来越受到教…

使用JavaScript+Selenium玩转Web应用自动化测试

自动化测试 在软件开发过程中, 测试是功能验收的必要过程, 这个过程往往有测试人员参与, 提前编写测试用例, 然后再手动对测试用例进行测试, 测试用例都通过之后则可以认为该功能通过验收. 但是软件中多个功能之间往往存在关联或依赖关系, 某一个功能的新增或修改可能或影响到…

CTFer成长之路之反序列化漏洞

反序列化漏洞CTF 1.访问url&#xff1a; http://91a5ef16-ff14-4e0d-a687-32bdb4f61ecf.node3.buuoj.cn/ 点击下载源码 本地搭建环境并访问url&#xff1a; http://127.0.0.1/www/public/ 构造payload&#xff1a; ?sindex/index/hello&ethanwhoamiPOST的参数&#…

Redis的持久化方式

Redis支持两种方式的持久化&#xff0c;一种是RDB方式、另一种是AOF&#xff08;append-only-file&#xff09;方式&#xff0c;两种持久化方式可以单独使用其中一种&#xff0c;也可以将这两种方式结合使用。 •RDB&#xff1a;根据指定的规则“定时”将内存中的数据存储在硬…

【Virtualization】Windows11安装VMware Workstation后异常处置

安装环境 Windows 11 专业版 22H2 build 22621.1265 VMware Workstation 17 Pro 17.0.0 build-20800274 存在问题 原因分析 1、BIOS未开启虚拟化。 2、操作系统启用的虚拟化与Workstation冲突。 3、操作系统启用内核隔离-内存完整性保护。 处置思路 1、打开“资源管理器”…

6-Java中新建一个文件、目录、路径

文章目录前言1-文件、目录、路径2-在当前路径下创建一个文件3-在当前路径下创建一个文件夹&#xff08;目录&#xff09;3.1 测试1-路径已经存在3.2 测试2-路径不存在3.2 创建不存在的路径并新建文件3.3 删除已存在的文件并新建4-总结前言 学习Java中如何新建文件、目录、路径…

Fiddler报文分析-断点应用、模拟网络限速-HTTPS的 拦截

目录 一、报文分析 Statistics 请求性能数据 检查器&#xff08;Inspectors&#xff09; 自定义响应&#xff08;AutoResponder&#xff09; Composer Composer的功能就是用来创建HTTP Request然后发送请求。 允许自定义请求发送到服务器&#xff0c;即可以手动创建一个新…

大学毕业后,送了2个月外卖,哭了一整晚

先简单介绍一下自己&#xff0c;我来自湛江&#xff0c;大学学的的物流管理专业&#xff0c;现在就职于一家互联网公司&#xff0c;从事软件测试工作。 我来自湛江的一个偏远农村&#xff0c;家里兄弟姐妹多&#xff0c;父母无力负担我的学费&#xff0c;很多时候学费都是靠姐…