数据库中的11种查询用法,作为程序员,你都掌握了吗?
wptr33 2024-12-08 19:12 30 浏览
本文介绍了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` 表中满足嵌套查询条件的行。
要使用嵌套查询,只需要将内部查询放在外部查询的适当位置,并将其视为一个普通的表或数据源进行操作。嵌套查询的结果将作为外部查询的一部分来处理。
相关推荐
- MySQL进阶五之自动读写分离mysql-proxy
-
自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?
-
引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...
- 一文由浅入深带你完全掌握MySQL的锁机制原理与应用
-
本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...
- 验证Mysql中联合索引的最左匹配原则
-
后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...
- MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
-
目录1.索引基础...
- 你会看 MySQL 的执行计划(EXPLAIN)吗?
-
SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...
- MySQL 从入门到精通(四)之索引结构
-
索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...
- mysql总结——面试中最常问到的知识点
-
mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...
- mysql总结——面试中最常问到的知识点(2)
-
首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...
- MySQL基础全知全解!超详细无废话!轻松上手~
-
本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...
- 深入剖析 MySQL 中的锁机制原理_mysql 锁详解
-
在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...
- Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析
-
引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...
- MySQL基础篇:DQL数据查询操作_mysql 查
-
一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...
- MySql:索引的基本使用_mysql索引的使用和原理
-
一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
如何将AI助手接入微信(打开ai手机助手)
-
redission YYDS spring boot redission 使用
-
SparkSQL——DataFrame的创建与使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (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)
- c语言 switch (34)
- git commit (34)