likes
comments
collection
share

Nodejs 第三十四章 SQL语句之查询

作者站长头像
站长
· 阅读数 30

Nodejs 第三十四章 SQL语句之查询

  • 在上一章节中,我们学习了对数据库以及对数据表本身的基本操作
    • 在这一章节中,我们将着重讲解在日常使用中,频率最高的查询语句

查询列

  • 在正式开始中,我们首先要从上一章节的SQL书写顺序中明白,位于命令最前面的必然是操作类型关键字
    • 而在最高频率的查询系列命令中,都是以SELECT(查询)作为开头的

查询单列

  • FROM是来自的意思,xxx来自于yyy,比如小余来自福建,但不能说是福建来自小余对吧,所以要查询的内容必须放在前面,而查询主体放在后面。你需要区分是谁包含了谁在内
SELECT `name` FROM `user`
# SELECT [列名] FROM [表名]

Nodejs 第三十四章 SQL语句之查询

查询多列

  • 查询多个列,则是采用多个逗号隔开。
    • 所以说逗号除了表示区分开的意思之外,在这里还有并列的意思。
    • 听上去是不是有点冲突?
      1. 区分开:在 SQL 的 SELECT 语句中,逗号用于分隔列名,表示这些列是独立的字段。这里的“区分开”意味着每个用逗号隔开的项被视为单独的实体或字段。
      2. 并列:逗号这里的“并列”指的是在查询结果中,这些列将被同时展示。每个列名代表一个独立的数据字段,它们共同构成了查询结果的一部分。所以,并列的意思在这里更倾向于“同时选择多个字段”。
SELECT `name`,`age` FROM `user`
# SELECT [列名] FROM [表名]

Nodejs 第三十四章 SQL语句之查询

查询所有列

  • 在SQL语句中,*表示通配符,也就是所有内容的意思,跟我们前面在后端设置跨域请求源的时候是一样一样的
SELECT * FROM `user`
# 查询来自user表的所有内容

Nodejs 第三十四章 SQL语句之查询

定义别名

  • 利用as语法可以定义字段的别名,但什么情况下需要定义别名?这个我们需要搞清楚,不然就变死学习了,学了然后不知道用在哪种情况
  1. 增强可读性:当字段名不够直观或过于复杂时,使用别名可以使查询的输出更容易理解。例如,如果数据库中的字段名为created_at,可以将其别名设为Registration Date,使得结果更加直观

    一般情况下不要随便更改表的字段名,其他地方要是引用了这个字段名,然后我们一改,其他地方不就芭比Q了

  2. 解决字段名冲突:在进行表的连接(JOIN)操作时,如果多个表中存在同名字段,使用别名可以解决字段名冲突的问题,确保查询的准确性。

  3. 简化复杂的表达式:对于涉及复杂数学或字符串操作的字段,使用别名可以简化后续的引用。例如,如果有复杂的计算式,为其设定一个别名后,后续可以直接使用别名引用该计算结果。

  4. 在聚合查询中使用:在使用聚合函数(如SUM(), AVG()等)时,通常需要为结果设置别名,以便在结果集中引用或在程序代码中使用。

  5. 在子查询中使用:在子查询中计算得出的结果字段,特别是当子查询用作表达式或表连接的一部分时,使用别名对外部查询提供一个引用点。

SELECT `name` as `Name1` FROM `user`

Nodejs 第三十四章 SQL语句之查询

排序

降序

  • 一般正常情况就是升序,那如果我们要实现降序功能的话,也是有对应的条件或者修饰符
    • ORDER BY [字段名称] desc降序(从大到小) asc 升序(从小到大)
    • descasc就是排序修饰符
  • ORDER BY子句的主要作用是对查询结果进行排序,包括但不限于基本排序多列排序聚合数据排序子查询排序。我想你是能看出这完全是排序体系的专属
    • 通常出现在查询语句的末尾,排在从句和其他查询修饰符之后
    • 你可以理解为,放最后决定就OK了
SELECT `id`, `name`, `age` FROM `user` ORDER BY `id` DESC;

Nodejs 第三十四章 SQL语句之查询

限制查询结果

在SQL中,LIMIT 子句用于限制查询结果的数量,这对于分页显示结果或仅返回部分结果集非常有用。当你想要获取一定范围内的数据记录时,可以使用 LIMIT 来实现这一功能

语法

LIMIT 通常在查询语句的末尾使用,并可以接受一或两个数字参数:

  • 单参数用法LIMIT [限制条数] 指定从查询结果的开始处返回固定数量的记录。
  • 双参数用法LIMIT [开始行偏移], [限制条数] 第一个数字指定从哪一行开始返回结果(行偏移),第二个数字限定返回的记录数。
# 返回 Users 表中的前10条记录
SELECT * FROM `user`
LIMIT 10;

# 跳过前5条记录,然后返回接下来的10条记录,这常用于实现数据的分页显示(用途)
# 其中5是开始的偏移量,10是从偏移处开始计算的记录数
SELECT * FROM `user`
LIMIT 5, 10;

条件查询

在SQL中,条件查询是通过WHERE子句来实现的,它允许你指定过滤数据的标准,从而仅返回符合这些条件的记录

  • WHERE子句通常位于FROM子句之后,但在GROUP BYHAVINGORDER BY等子句之前。这个顺序对于执行查询和优化性能非常重要

位置解释

  1. FROM子句之后FROM子句指定了查询将要操作的表或视图,WHERE子句之所以紧随其后,是因为在进行任何进一步的处理之前,首先需要从指定的表中筛选出满足条件的记录。如果WHERE子句先于FROM子句,SQL解析器将不知道WHERE子句中引用的字段来自哪个表,因此不能正确解析和执行查询。
  2. GROUP BY子句之前:如果使用了GROUP BY子句,它通常位于WHERE子句之后。这是因为首先需要过滤数据(通过WHERE子句),然后再对结果集进行分组。如果顺序相反,可能会先对整个表进行分组,这样不仅增加了处理的数据量,还可能包括了最终并不需要的数据行,从而降低了查询效率。

为什么这样安排

  • 效率和性能:通过在GROUP BYORDER BY之前应用WHERE子句,可以最大限度地减少需要进一步处理的数据量。这样做可以显著提高查询的效率和响应时间。
  • 逻辑正确性:SQL的处理顺序要求先确定数据的来源(FROM子句),然后筛选数据(WHERE子句),接着可能的分组(GROUP BY)和组内过滤(HAVING),最后是排序(ORDER BY)。这种顺序符合数据处理的逻辑流程,保证了操作的正确性和可预测性。
SELECT * FROM `user` WHERE `name` = '小余'
# SELECT * FROM `user` WHERE [列名 name] = [值 '小余']

联合查询

逻辑运算符包括:

  • AND:当所有条件同时满足时,返回 TRUE
  • OR:当至少一个条件满足时,返回 TRUE
  • NOT:反转条件的结果
#返回名字为 "小余" 且年龄大于 18 岁的用户
SELECT * FROM `user` WHERE `name` = '小余' AND `age` > 18;
#返回名字为 "小余" 或年龄大于 18 岁的所有用户
SELECT * FROM `user` WHERE `name` = '小余' OR `age` > 18;
#返回不是名字为 "小余" 的所有用户
SELECT * FROM `user` WHERE NOT `name` = '小余';

模糊查询

  • 我们在前面所有的查询都算是精准查询,所查询的内容必须一模一样才能查到。但有时候我们并不需要这么精准,比如我想查用户姓"余"的有多少人的需求,用精准查询就不太方便了。此时模糊查询就能够符合我们的需求

语法

LIKE运算符用于在WHERE子句中搜索列中的模糊模式。可以使用通配符:

  • %:代表零个或多个字符
  • _:代表一个单一字符

LIKE的位置

LIKE运算符通常位于WHERE子句中,这是因为WHERE子句用于定义SQL查询的条件,决定哪些行将被包含在结果集中。LIKE作为条件的一部分,帮助指定需要满足的模糊匹配条件。

为什么写在那里?

  • 筛选作用LIKE用于筛选数据,符合逻辑地将其放在处理筛选逻辑的WHERE子句中。

  • 执行顺序:SQL的执行顺序要求先解析FROM子句确定数据来源,再解析WHERE子句进行行级的过滤。将LIKE放在WHERE中符合SQL的解析和执行流程,确保在数据返回前完成所有必要的筛选。

    我们可以这么理解:整个WHERE是一个大筛选,而LIKE是小筛选。小筛选都是包含在大筛选内,这是基础的规律逻辑,其他带筛选功能的也都是放WHERE里面。这样我们就完全没必要死记硬背命令,只需要看该运算符是不是用来筛选的就知道放哪了

    好处:

    • 统一位置:将所有的筛选条件都放在WHERE子句中可以保持SQL语句的清晰和一致性,避免在多个地方散布筛选逻辑,使得SQL代码更易于阅读和维护。
    • 功能性分隔:逻辑上,FROM子句定义了数据的来源,WHERE子句定义了数据的过滤规则。这种分隔确保了每部分的SQL代码都专注于单一功能,有助于优化查询性能和简化查询逻辑的理解
  • 优化查询:放在WHERE子句中,数据库可以优化查询执行,尤其是在索引或优化查询计划时,有效利用LIKE进行模式匹配。

-- 查询所有姓余的用户
SELECT * FROM `user` WHERE `name` LIKE '余%';
-- 这里的`%`表示在'余'之后可以有任意数量的字符(包括零个字符)

-- 查询所有名字中包含余的用户
SELECT * FROM `user` WHERE `name` LIKE '%余%';
-- 这里的第一个`%`表示'余'之前可以有任意数量的字符,第二个`%`表示'余'之后也可以有任意数量的字符

-- 查询所有名字以余结束的用户
SELECT * FROM `user` WHERE `name` LIKE '%余';
-- 这里的`%`表示在'余'之前可以有任意数量的字符

-- 查询名字恰好是三个字且第二个字是余的用户
SELECT * FROM `user` WHERE `name` LIKE '_余_';
-- 这里每个`_`代表恰好一个字符,因此整个表达式匹配三个字符长的名字,其中第二个字符是'余'

-- 查询名字第二个字是余,总共四个字的用户
SELECT * FROM `user` WHERE `name` LIKE '_余__';
-- 类似上一个例子,但是增加了一个字符长度,总长为四个字符,其中第二个仍是'余'

-- 查询名字第一个字是余,后面跟两个任意字符的用户
SELECT * FROM `user` WHERE `name` LIKE '余__';
-- 这里`余`是首字,后面恰好跟两个字符,总长度为三个字符
转载自:https://juejin.cn/post/7365811000475746314
评论
请登录