Nodejs 第三十四章 SQL语句之查询
Nodejs 第三十四章 SQL语句之查询
- 在上一章节中,我们学习了对数据库以及对数据表本身的基本操作
- 在这一章节中,我们将着重讲解在日常使用中,频率最高的查询语句
查询列
- 在正式开始中,我们首先要从上一章节的SQL书写顺序中明白,位于命令最前面的必然是操作类型关键字
- 而在最高频率的查询系列命令中,都是以SELECT(查询)作为开头的
查询单列
- FROM是来自的意思,xxx来自于yyy,比如小余来自福建,但不能说是福建来自小余对吧,所以要查询的内容必须放在前面,而查询主体放在后面。你需要区分是谁包含了谁在内
SELECT `name` FROM `user`
# SELECT [列名] FROM [表名]
查询多列
- 查询多个列,则是采用多个逗号隔开。
- 所以说逗号除了表示
区分开
的意思之外,在这里还有并列
的意思。 - 听上去是不是有点冲突?
- 区分开:在 SQL 的 SELECT 语句中,逗号用于分隔列名,表示这些列是独立的字段。这里的“区分开”意味着每个用逗号隔开的项被视为单独的实体或字段。
- 并列:逗号这里的“并列”指的是在查询结果中,这些列将被同时展示。每个列名代表一个独立的数据字段,它们共同构成了查询结果的一部分。所以,并列的意思在这里更倾向于“同时选择多个字段”。
- 所以说逗号除了表示
SELECT `name`,`age` FROM `user`
# SELECT [列名] FROM [表名]
查询所有列
- 在SQL语句中,
*
表示通配符,也就是所有内容
的意思,跟我们前面在后端设置跨域请求源的时候是一样一样的
SELECT * FROM `user`
# 查询来自user表的所有内容
定义别名
- 利用
as
语法可以定义字段的别名,但什么情况下需要定义别名?这个我们需要搞清楚,不然就变死学习了,学了然后不知道用在哪种情况
-
增强可读性:当字段名不够直观或过于复杂时,使用别名可以使查询的输出更容易理解。例如,如果数据库中的字段名为
created_at
,可以将其别名设为Registration Date
,使得结果更加直观一般情况下不要随便更改表的字段名,其他地方要是引用了这个字段名,然后我们一改,其他地方不就芭比Q了
-
解决字段名冲突:在进行表的连接(JOIN)操作时,如果多个表中存在同名字段,使用别名可以解决字段名冲突的问题,确保查询的准确性。
-
简化复杂的表达式:对于涉及复杂数学或字符串操作的字段,使用别名可以简化后续的引用。例如,如果有复杂的计算式,为其设定一个别名后,后续可以直接使用别名引用该计算结果。
-
在聚合查询中使用:在使用聚合函数(如
SUM()
,AVG()
等)时,通常需要为结果设置别名,以便在结果集中引用或在程序代码中使用。 -
在子查询中使用:在子查询中计算得出的结果字段,特别是当子查询用作表达式或表连接的一部分时,使用别名对外部查询提供一个引用点。
SELECT `name` as `Name1` FROM `user`
排序
降序
- 一般正常情况就是升序,那如果我们要实现降序功能的话,也是有对应的
条件或者修饰符
的- ORDER BY [字段名称]
desc
降序(从大到小)asc
升序(从小到大) desc
和asc
就是排序修饰符
- ORDER BY [字段名称]
- 而
ORDER BY
子句的主要作用是对查询结果进行排序,包括但不限于基本排序、多列排序、聚合数据排序、子查询排序。我想你是能看出这完全是排序体系的专属- 通常出现在查询语句的
末尾
,排在从句和其他查询修饰符之后 - 你可以理解为,放最后决定就OK了
- 通常出现在查询语句的
SELECT `id`, `name`, `age` FROM `user` ORDER BY `id` DESC;
限制查询结果
在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 BY
、HAVING
、ORDER BY
等子句之前。这个顺序对于执行查询和优化性能非常重要
位置解释
- 在
FROM
子句之后:FROM
子句指定了查询将要操作的表或视图,WHERE
子句之所以紧随其后,是因为在进行任何进一步的处理之前,首先需要从指定的表中筛选出满足条件的记录。如果WHERE
子句先于FROM
子句,SQL解析器将不知道WHERE
子句中引用的字段来自哪个表,因此不能正确解析和执行查询。 - 在
GROUP BY
子句之前:如果使用了GROUP BY
子句,它通常位于WHERE
子句之后。这是因为首先需要过滤数据(通过WHERE
子句),然后再对结果集进行分组。如果顺序相反,可能会先对整个表进行分组,这样不仅增加了处理的数据量,还可能包括了最终并不需要的数据行,从而降低了查询效率。
为什么这样安排
- 效率和性能:通过在
GROUP BY
和ORDER 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