数据库中的11种查询用法,作为程序员,你都掌握了吗?
wptr33 2024-12-08 19:12 13 浏览
本文介绍了sqlserver数据库中的11种查询用法,都是程序员在实际工作中经常用到的:
一.简单查询
简单查询是最基本的查询类型,用于从数据库中选择特定列或所有列的数据。
SELECT 列名1, 列名2 FROM 表名;
二.条件查询
条件查询是使用WHERE子句来筛选满足特定条件的数据。通过指定条件,可以从数据库中检索满足要求的行。即带有WHERE子句的查询:
1.等于(=)操作符:
SELECT * FROM 表名 WHERE 列名 = 值;
该查询将返回列名等于给定值的行。
2.不等于(<>或!=)操作符:
SELECT * FROM 表名 WHERE 列名 <> 值;
该查询将返回不等于给定值的行。
3.大于(>)和小于(<)操作符:
SELECT * FROM 表名 WHERE 列名 > 值;
该查询将返回列名大于给定值的行。
4.大于等于(>=)和小于等于(<=)操作符:
SELECT * FROM 表名 WHERE 列名 <= 值;
该查询将返回列名小于等于给定值的行。
5.BETWEEN操作符:
SELECT * FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2;
该查询将返回列名在给定范围内的行。
6.IN操作符:
SELECT * FROM 表名 WHERE 列名 IN (值1, 值2, 值3);
该查询将返回列名等于给定值之一的行。
7.LIKE操作符:
SELECT * FROM 表名 WHERE 列名 LIKE 'abc%';
该查询将返回列名以"abc"开头的行,%用于表示任意字符。
8.NOT操作符:
SELECT * FROM 表名 WHERE NOT 列名 = 值;
该查询将返回不满足条件的行。
三、别名查询
别名查询可以为表、列或子查询指定一个临时名称,以简化查询语句并提高可读性。通过为对象赋予别名,可以在查询中引用它们,并且还可以使用别名进行计算或连接操作。
1. 为表指定别名:
SELECT t.列名 FROM 表名 AS t;
这将为表指定别名"t",然后在查询中使用该别名引用列。
2. 为列指定别名:
SELECT 列名 AS 别名 FROM 表名;
这将为列指定一个别名,在结果中显示别名而不是原始列名。
3. 使用别名进行计算:
SELECT 列名1, 列名2, 列名1 + 列名2 AS 计算列名 FROM 表名;
这将为计算列指定一个别名,并且可以使用原始列进行计算操作。
4. 使用别名进行连接:
SELECT t1.列名, t2.列名 FROM 表名1 AS t1 INNER JOIN 表名2 AS t2 ON t1.列名 = t2.列名;
这将为每个表指定一个别名,并在连接操作中使用这些别名。
5. 为子查询指定别名:
SELECT 列名 FROM (SELECT 列名 FROM 表名) AS 别名;
这将对子查询结果集指定一个别名,并在外部查询中引用该别名。
通过使用别名,可以使查询更具可读性和易于理解。同时,别名还可以用于处理复杂的查询逻辑和多表连接操作。
四、分组查询
分组查询用于将数据按照一列或多列进行分组,并对每个组应用聚合函数(如COUNT、SUM、AVG等)。通过分组查询,可以对数据进行汇总和统计,以获得更有意义的结果。
1. 基本分组查询:
SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名;
这将根据指定的列对数据进行分组,并计算每个组的行数。
2. 分组查询与聚合函数结合:
SELECT 列名, SUM(列名) FROM 表名 GROUP BY 列名;
这将根据指定的列对数据进行分组,并计算每个组中该列的总和。
3. 多列分组查询:
SELECT 列名1, 列名2, COUNT(*) FROM 表名 GROUP BY 列名1, 列名2;
这将根据多个列对数据进行分组,并计算每个组的行数。
4. 过滤分组结果:
SELECT 列名, COUNT(*) FROM 表名 WHERE 条件 GROUP BY 列名;
这将在分组之前使用WHERE子句筛选数据,并对满足条件的行进行分组和计数。
5. 分组排序:
SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名 ORDER BY COUNT(*) DESC;
这将对分组结果按照计数值进行降序排序。
6. 使用HAVING子句过滤分组:
SELECT 列名1, COUNT(*) FROM 表名 GROUP BY 列名1 HAVING COUNT(*) > 10;
这将在分组之后使用HAVING子句筛选数据,并只返回满足条件的分组。
7. 对分组结果重命名:
SELECT 列名 AS 新列名, COUNT(*) AS 计数 FROM 表名 GROUP BY 列名;
这将为分组结果的列指定新的别名,使其更具描述性。
分组查询在SQL Server中非常有用,可以用于生成报表、统计数据、数据分析等场景。通过使用GROUP BY子句和适当的聚合函数,可以根据需要对数据进行灵活的分组和计算。
五、排序查询
排序查询用于对结果集按照一个或多个列的值进行排序。通过指定排序顺序(升序或降序),可以使数据以特定的方式呈现。
1. 基本的排序查询:
SELECT 列名 FROM 表名 ORDER BY 列名;
这将根据指定的列对结果集进行升序排序。
2. 降序排序查询:
SELECT 列名 FROM 表名 ORDER BY 列名 DESC;
这将根据指定的列对结果集进行降序排序。
3. 多列排序查询:
SELECT 列名1, 列名2 FROM 表名 ORDER BY 列名1, 列名2;
这将首先按照列名1对结果集进行排序,然后在相同值的情况下按照列名2进行排序。
4. 排序查询与聚合函数结合:
SELECT 列名, COUNT(*) AS 计数 FROM 表名 GROUP BY 列名 ORDER BY 计数 DESC;
这将对分组结果按照计数值的降序排序。
5. 使用NULL值排序处理:
SELECT 列名 FROM 表名 ORDER BY 列名 ASC NULLS FIRST;
这将把NULL值放在排序结果的最前面。
6. 排序查询与LIMIT子句结合(仅适用于SQL Server 2012及更高版本):
SELECT 列名 FROM 表名 ORDER BY 列名 OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;
这将跳过前5行,并返回接下来的10行结果。
7. 对排序结果重命名:
SELECT 列名 AS 新列名 FROM 表名 ORDER BY 列名;
这将为排序结果的列指定新的别名,使其更具描述性。
排序查询可用于按照特定的规则对结果集进行排序,使数据按照预期的顺序展示。通过使用不同的排序顺序和多列排序,我们可以满足不同的排序需求,并获得符合要求的有序结果。
六、去重查询
去重查询用于从结果集中删除重复的行。通过使用DISTINCT关键字,可以获取唯一的记录,确保每行数据只显示一次。
1. 基本的去重查询:
SELECT DISTINCT 列名 FROM 表名;
这将返回指定列中的唯一值。
2. 多列去重查询:
SELECT DISTINCT 列名1, 列名2 FROM 表名;
这将返回指定列组合中的唯一组合值。
3. 去重查询与排序结合:
SELECT DISTINCT 列名 FROM 表名 ORDER BY 列名;
这将返回唯一的列值,并按照指定列的顺序进行排序。
4. 去重查询与聚合函数结合:
SELECT 列名, COUNT(*) AS 计数 FROM 表名 GROUP BY 列名;
这将对指定列进行分组,并计算每个唯一值的数量。
5. 去重查询与条件过滤结合:
SELECT DISTINCT 列名 FROM 表名 WHERE 条件;
这将根据条件筛选满足条件的唯一值。
6. 去重查询与子查询结合:
SELECT DISTINCT 列名 FROM 表名 WHERE 列名 IN (SELECT 列名 FROM 表名 WHERE 条件);
这将基于子查询的结果获取唯一值。
7. 多表联接的去重查询:
SELECT DISTINCT 列名 FROM 表1 JOIN 表2 ON 表1.列名 = 表2.列名;
这将返回多个表联接的结果中的唯一值。
去重查询可用于消除重复的记录,提供干净且不重复的数据集。通过灵活运用去重查询,我们可以根据需求获取唯一的记录,避免重复的数据出现。
在SQL Server中,可以使用`DISTINCT`关键字进行去重查询。该关键字用于从结果集中选择唯一的记录,并且会自动删除重复的行。
注意:
使用`DISTINCT`关键字可能会对查询的性能产生影响,因为它需要对结果集进行排序和比较,以找出重复的行。在处理大型数据集时要谨慎使用。
七、分页查询
分页查询用于限制结果集的行数,并指定返回结果集的起始位置。这对于大型数据集或需要分批加载数据的情况非常有用。
1. 基本的分页查询:
SELECT 列名
FROM 表名
ORDER BY 排序列
OFFSET 起始行数
ROWS FETCH NEXT 每页行数 ROWS ONLY;
这个查询将从指定表中按照排序列进行排序,并返回指定范围的结果。
2. 分页查询的起始行数和每页行数的计算:
DECLARE @PageNumber INT = 2;
DECLARE @PageSize INT = 10;
SELECT 列名 FROM 表名
ORDER BY 排序列
OFFSET (@PageNumber - 1) * @PageSize
ROWS FETCH NEXT @PageSize ROWS ONLY;
这个查询将根据给定的页码和每页行数计算起始行数,并返回相应的结果。
3. 分页查询与条件过滤结合:
DECLARE @Offset INT = 5;
DECLARE @Limit INT = 10;
SELECT 列名 FROM 表名
WHERE 条件
ORDER BY 排序列
OFFSET @Offset ROWS
FETCH NEXT @Limit ROWS ONLY;
这个查询将基于给定的条件过滤结果,并返回指定范围的结果。
4. 使用ORDER BY子句进行分页查询:
SELECT 列名 FROM 表名
ORDER BY 排序列
OFFSET 0 ROWS
FETCH NEXT 10 PERCENT ROWS ONLY;
这个查询将返回结果集中的前10%的数据。
5. 使用子查询进行分页查询:
SELECT 列名
FROM (SELECT 列名,
ROW_NUMBER() OVER (ORDER BY 排序列) AS RowNum
FROM 表名) AS SubQuery
WHERE RowNum BETWEEN 11 AND 20;
这个查询使用ROW_NUMBER()函数为每一行添加行号,并通过子查询选择指定范围的结果。
6. 结合TOP子句实现简单的分页查询(仅适用于SQL Server 2012及更高版本):
SELECT TOP 10 列名 FROM 表名 ORDER BY 排序列;
这个查询将返回排在前10位的结果。
分页查询可用于限制结果集的大小,提高查询效率,并分批加载大型数据集。通过设置起始行数、每页行数以及排序条件,我们可以获取特定范围内的数据。分页查询在处理大量数据时非常有用,可有效地管理数据的加载和显示。
八、模糊查询
模糊查询是一种用于匹配包含特定模式的文本数据的查询方法。SQL Server 提供了两种用于模糊查询的常用操作符:`LIKE` 和 `CHARINDEX()` 函数。
1. 使用 `LIKE` 操作符进行模糊查询:
SELECT 列名 FROM 表名 WHERE 列名 LIKE '模式';
这个查询将返回满足指定模式的匹配项。在模式中可以使用通配符 `%` 表示任意字符序列(包括空字符),使用 `_` 表示单个字符。
例如,要查找姓氏以 "Smith" 开头的顾客:
SELECT CustomerName FROM Customers WHERE CustomerName LIKE 'Smith%';
2. 使用 `CHARINDEX()` 函数进行模糊查询:
SELECT 列名 FROM 表名 WHERE CHARINDEX('搜索文本', 列名) > 0;
这个查询将返回包含指定搜索文本的匹配项。`CHARINDEX()` 函数返回搜索文本在列中第一次出现的位置,如果未找到则返回 0。
例如,要查找地址中包含 "Street" 的顾客:
SELECT CustomerName FROM Customers WHERE CHARINDEX('Street', Address) > 0;
除了上述示例,还可以根据具体需求结合运算符和函数来构建更复杂的模糊查询条件。此外,还可以使用正则表达式等高级功能来进行更精确的模式匹配。
九、表连接查询
表连接查询是一种常用的操作,用于将多个表的数据合并在一起,以便进行更复杂的查询和分析。有几种类型的表连接查询可以使用:
1. 内连接(INNER JOIN):
内连接返回两个表中匹配的行,即只返回两个表中都存在的记录。
SELECT *
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
2. 左连接(LEFT JOIN):
左连接返回左侧表中的所有行,以及与右侧表匹配的行。如果在右侧表中没有匹配的行,则右侧列的值将为 NULL。
SELECT *
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
3. 右连接(RIGHT JOIN):
右连接返回右侧表中的所有行,以及与左侧表匹配的行。如果在左侧表中没有匹配的行,则左侧列的值将为 NULL。
SELECT *
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
4. 全连接(FULL OUTER JOIN):
全连接返回两个表中的所有行,并根据匹配条件组合它们。如果在其中一个表中没有匹配的行,则另一个表中对应列的值将为 NULL。
SELECT *
FROM table1
FULL OUTER JOIN table2
ON table1.column = table2.column;
十、子查询
子查询是一种查询嵌套在另一个查询中的查询。它允许您在主查询中使用一个查询结果作为子查询的数据源,以便根据这个结果执行更复杂的操作。
子查询通常用于以下情况:
1. 在 WHERE 或 HAVING 子句中过滤数据:您可以使用子查询来检索满足某个条件的特定数据集,然后将其作为主查询的过滤条件。
2. 在 SELECT 语句中返回计算列或聚合值:子查询可以返回单个值,该值可以作为主查询中的计算列或聚合函数的输入。
3. 在 FROM 子句中创建临时表:您可以使用子查询在主查询之前创建一个临时表,并将其作为主查询的数据源。
下面是几个示例来演示如何在 SQL Server 中使用子查询:
1. 使用子查询过滤数据:
SELECT column1, column2
FROM table1
WHERE column1 IN (SELECT column1 FROM table2 WHERE condition);
这个查询检索 `table1` 表中满足子查询条件的行。
2. 在 SELECT 语句中使用子查询:
SELECT column1, (SELECT MAX(column2) FROM table2) AS max_value
FROM table1;
这个查询返回 `table1` 表的每一行,以及从 `table2` 表中获取的最大值(计算列)。
3. 使用子查询创建临时表:
SELECT t1.column1, t2.column2
FROM (SELECT column1, column2 FROM table1) AS t1
JOIN (SELECT column1, column2 FROM table2) AS t2
ON t1.column1 = t2.column1;
这个查询使用子查询在主查询之前创建了两个临时表 `t1` 和 `t2`,然后通过连接它们来检索数据。
要使用子查询,只需将子查询放在括号中,然后将其视为一个普通的表或数据源进行操作。可以根据需要嵌套多个子查询,以构建更复杂的查询逻辑。
注意:
子查询可能会影响查询的性能,因此在使用子查询时应谨慎选择合适的优化策略,例如使用 JOIN 等其他方法来实现相同的结果。
十一、嵌套查询
嵌套查询是一个查询嵌套在另一个查询的 FROM、SELECT、WHERE 或 HAVING 子句中的查询。嵌套查询允许您根据主查询的结果执行更复杂的操作。
嵌套查询通常用于以下情况:
1. 在 FROM 子句中创建派生表:您可以将一个查询作为主查询的数据源,创建一个虚拟的派生表来进行进一步的处理。
2. 在 SELECT 语句中返回计算列或聚合值:嵌套查询可以在主查询的 SELECT 子句中返回一个计算列或聚合函数的结果。
3. 在 WHERE 或 HAVING 子句中过滤数据:您可以使用嵌套查询来检索满足某个条件的特定数据集,然后将其作为主查询的过滤条件。
下面是几个示例来演示如何在 SQL Server 中使用嵌套查询:
1. 在 FROM 子句中创建派生表:
SELECT t1.column1, t2.column2
FROM (SELECT column1, column2 FROM table1) AS t1
JOIN (SELECT column1, column2 FROM table2) AS t2
ON t1.column1 = t2.column1;
这个查询将嵌套查询 `(SELECT column1, column2 FROM table1)` 和 `(SELECT column1, column2 FROM table2)` 视为派生表 `t1` 和 `t2`,并通过连接它们来检索数据。
2. 在 SELECT 语句中使用嵌套查询:
SELECT column1, (SELECT MAX(column2) FROM table2) AS max_value
FROM table1;
这个查询返回 `table1` 表的每一行,以及从 `table2` 表中获取的最大值(计算列)。
3. 在 WHERE 子句中使用嵌套查询:
SELECT column1, column2
FROM table1
WHERE column1 IN (SELECT column1 FROM table2 WHERE condition);
这个查询检索 `table1` 表中满足嵌套查询条件的行。
要使用嵌套查询,只需要将内部查询放在外部查询的适当位置,并将其视为一个普通的表或数据源进行操作。嵌套查询的结果将作为外部查询的一部分来处理。
相关推荐
- Linux高性能服务器设计
-
C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...
- 独立游戏开发者常犯的十大错误
-
...
- 学C了一头雾水该咋办?
-
学C了一头雾水该怎么办?最简单的方法就是你再学一遍呗。俗话说熟能生巧,铁杵也能磨成针。但是一味的为学而学,这个好像没什么卵用。为什么学了还是一头雾水,重点就在这,找出为什么会这个样子?1、概念理解不深...
- C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?
-
上节我们分析了C++基础语法的const,static以及this指针,那么这节内容我们来看一下inline内联函数吧!inline内联函数...
- C语言实战小游戏:井字棋(三子棋)大战!文内含有源码
-
井字棋是黑白棋的一种。井字棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、三子旗等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时...
- C++语言到底是不是C语言的超集之一
-
C与C++两个关系亲密的编程语言,它们本质上是两中语言,只是C++语言设计时要求尽可能的兼容C语言特性,因此C语言中99%以上的功能都可以使用C++完成。本文探讨那些存在于C语言中的特性,但是在C++...
- 在C++中,如何避免出现Bug?
-
C++中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C++中的一...
- ESL-通过事件控制FreeSWITCH
-
通过事件提供的最底层控制机制,允许我们有效地利用工具箱,适时选择使用其中的单个工具。FreeSWITCH是一个核心交换与混合矩阵,它周围有几十个模块提供各种功能特性。我们完全控制了所有的即时信息,这些...
- 物理老师教你学C++语言(中篇)
-
一、条件语句与实验判断...
- C语言入门指南
-
当然!以下是关于C语言入门编程的基础介绍和入门建议,希望能帮你顺利起步:C语言入门指南...
- C++选择结构,让程序自动进行决策
-
什么是选择结构?正常的程序都是从上至下顺序执行,这就是顺序结构...
- C++特性使用建议
-
1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...
- C++程序员学习Zig指南(中篇)
-
1.复合数据类型结构体与方法的对比C++类:...
- 研一自学C++啃得动吗?
-
研一自学C++啃得动吗?在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!个人...
- C++关键字介绍
-
下表列出了C++中的常用关键字,这些关键字不能作为变量名或其他标识符名称。1、autoC++11的auto用于表示变量的自动类型推断。即在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git pull 之后本地代码被覆盖 解决方案
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mysql max (33)
- vba instr (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)