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

news2024/10/2 1:28:28

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.coloradmin.cn/o/369998.html

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

相关文章

MySQL基础知识-刷题笔记

数据库刷题笔记 查漏补缺&#xff0c;面试八股文&#xff0c;以下内容未说明的均以MySQL数据库为准 where 不能和聚合函数一起使用 having可以和聚合函数一起使用 having必须与group by一起使用1、SUBSTRING_INDEX(str ,substr ,n)&#xff1a;返回字符substr在str中第n次出现位…

udiMagic 导入 Excel to Tally ERP Crack

关于 udiMagic 软件 udiMagic 是一款可帮助您快速轻松地将数据导入 Tally ERP 的应用程序。它由 Shweta Softwares 创建和分发&#xff0c;于2007 年首次推出。 您可以在 USB 闪存驱动器 [旅行许可证] 中携带 udiMagic&#xff0c;并在具有任何 Tally 版本的任何计算机上使用…

Spring MVC 源码- LocaleResolver 组件

LocaleResolver 组件LocaleResolver 组件&#xff0c;本地化&#xff08;国际化&#xff09;解析器&#xff0c;提供国际化支持回顾先来回顾一下在 DispatcherServlet 中处理请求的过程中哪里使用到 LocaleResolver 组件&#xff0c;可以回到《一个请求的旅行过程》中的 Dispat…

【C++】json数据处理

Json是一种轻量级的数据交换格式。 文章目录1. cJson介绍2. 解析json数据3. 封装json数据4. 从文件中读取json1. cJson介绍 JSON对象是一个无序的"名称/值"键值对的集合&#xff1a; 以"{“开始&#xff0c;以”}"结束&#xff0c;允许嵌套使用&#xff…

相约3.8!罗姆EEPROM在线研讨会

科技的迭代更新速度不断超乎想象&#xff0c;人们也越来越追求数据的可追溯性和安全性&#xff0c;为避免意外情况导致数据丢失&#xff0c;在车载、工业等领域中&#xff0c;数据存储更经常使用安全性较好的EEPROM【带电可擦除可编程只读存储器】。与FLASH存储器的按“片”擦写…

偏向锁、轻量级所、自旋锁、重量级锁,它们都是什么?它们之间有什么关系?为什么会有这些锁?

互斥锁的本质是共享资源。 当有多个线程同时对一个资源进行操作时&#xff0c;为了线程安全&#xff0c;要对资源加锁。 更多基础内容参看上文《深入了解Java线程锁(一)》 接下来&#xff0c;我们来看看两个线程抢占重量级锁的情形&#xff1a; 上图讲述了两个线程ThreadA和…

JDBC-

文章目录JDBC1&#xff0c;JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2&#xff0c;JDBC快速入门2.1 编写代码步骤2.2 具体操作3&#xff0c;JDBC API详解3.1 DriverManager3.2 Connection &#xff08;事务归我管&#xff09;3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…

CSS 浮动【快速掌握知识点】

目录 前言 一、设置浮动属性 二、确定浮动元素的宽度 三、清除浮动 总结&#xff1a; 前言 CSS浮动是一种布局技术&#xff0c;它允许元素浮动到其父元素的左侧或右侧&#xff0c;从而腾出空间给其他元素。 一、设置浮动属性 使用CSS float属性将元素设置为浮动。例如&…

【华为OD机试模拟题】用 C++ 实现 - 数组的中心位置(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

MySQL —— 表的约束

文章目录1. null 空属性2. default 默认值3. comment 列描述4. zerofill 格式化输出5. primary key 主键6. auto_increment 自增长7. 唯一键8. unique key 外键前言&#xff1a; 表的约束主要是靠数据类型。有些情况&#xff0c;光靠数据类型约束是不够的&#xff0c;比如想要限…

【Java】ThreadLocal原理

​ ThreadLocal ThreadLocal意为线程本地变量&#xff0c;用于解决多线程并发时访问共享变量的问题。 每个线程都会有属于自己的本地内存&#xff0c;在堆&#xff08;也就是上图的主内存&#xff09;中的变量在被线程使用的时候会被复制一个副本线程的本地内存中&#xff0c…

【H5 | CSS | JS】如何实现网页打字机效果?快收下这份超详细指南(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

在C#中初测OpencvSharp4

一、配置OpenCV 首先&#xff0c;我们新建一个工程&#xff0c;然后就是给这个工程配置OpenCV了&#xff0c;最简单的方法还是Nuget&#xff0c;来我们右键一个Nuget&#xff1a; 打开Nuget后&#xff0c;你可以直接输入OpenCVSharp4来查找&#xff0c;当然&#xff0c;如果你…

公司新来的00后真是卷王,工作没两年,跳槽到我们公司起薪20K都快接近我了

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。…

罗永浩进场之后,苹果入局之前:XR又寒冬了吗?

科技圈的悲欢并不相通。ChatGPT狂飙之际&#xff0c;XR领域正在迎来至暗时刻。岁末年初&#xff0c;就在罗永浩重返高科技创业,计划进军XR&#xff08;扩展现实&#xff09;类领域的时间段前后&#xff0c;接连出现了押注元宇宙的Meta裁员&#xff0c;Meta旗下VR工作室Ready At…

【华为OD机试模拟题】用 C++ 实现 - 快递业务站(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 流水线(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

数据库|(六)连接查询

&#xff08;六&#xff09;连接查询1. 笛卡尔乘积2. 连接查询分类2.1 按年代分2.2 按功能分3. 等值连接(sql 92标准)3.1 特点3.2 一般使用3.3 为表取别名3.4 两表顺序可以调换3.5 可以加筛选3.6 可以加分组3.7 可以加排序3.8 可以实现三表连接4. 非等值连接(sql 92标准)5. sql…

【深度学习】GPT系列模型:语言理解能力的革新

GPT-1&#x1f3e1; 自然语言理解包括一系列不同的任务&#xff0c;例如文本蕴涵、问答、语义相似度评估和文档分类。尽管大量的未标记文本语料库很充足&#xff0c;但用于学习这些特定任务的标记数据却很稀缺&#xff0c;使得判别式训练模型难以达到良好的表现。我们证明&…

Spring(入门)

1. 什么是spring&#xff0c;它能够做什么?2. 什么是控制反转(或依赖注入)3. AOP的关键概念4. 示例 4.1 创建工程4.2 pom文件4.3 spring配置文件4.4 示例代码 4.4.1 示例14.4.2 示例2 &#xff08;abstract&#xff0c;parent示例&#xff09;4.4.3 使用有参数构造方法创建jav…