热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLSERVER的知识点

1.列和表别名SQL别名用于为表或表中的列提供临时名称。SQL别名通常用于使表名或列名更具可读性。SQL一个别名只存在于查询期间。别名使用AS关键字,通常可以省略

1.列和表别名

SQL 别名用于为 表 或 表中的列 提供临时名称。 SQL 别名通常用于使 表名 或 列名 更具可读性。 SQL 一个别名只存在于查询期间。

别名使用 AS 关键字,通常可以省略。

建议在下列情况下使用别名 查询涉及多个表 用于查询函数 需要把两个或更多的列放在一起 列名长或可读性差

SELECT 列名
FROM 表名 AS 别名;

2. 连接表

在关系数据库中,数据分布在多个逻辑表中。

要获得完整有意义的数据集,需要使用连接来查询这些表 中的数据。

SQL Server支持多种连接,包括 [内连接],[左连接],[右连接],[全外连接]和[交叉连接]。 每种连接类型指定SQL Server如何使用一个表中的数据来选择另一个表中的行。

(1).SQL Server内连接

内连接是SQL Server中最常用的连接之一。 内部联接子句用于查询来自两个或多个相关表的数据。 SQL Server INNER JOIN 子句的语法:

SELECT
product_name,
category_name,
brand_name,
list_price
FROM
production.products p
INNER JOIN production.categories c ON c.category_id = p.category_id
INNER JOIN production.brands b ON b.brand_id = p.brand_id
ORDER BY
product_name DESC;

(2).SQL Server左连接

LEFT JOIN 子句用于查询来自多个表的数据。

它返回左表中的所有行和右表中的匹配行。 如果在右表中找不到匹配的行,则使用 NULL 代替显示。 以下图说明了两个结果集的左连接结果:

SELECT
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o ON o.product_id = p.product_id
ORDER BY
order_id

(2).ON与WHERE子句 

SELECT
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o ON o.product_id = p.product_id
WHERE order_id = 100
ORDER BY
order_id;

(3). SQL Server右连接

RIGHT JOIN 子句组合来自两个或多个表的数据。

RIGHT JOIN 开始从右表中选择数据并与左表中的行 匹配。

RIGHT JOIN 返回一个结果集,该结果集包含右表中的所有行,无论是否具有左表中的匹配行。

如果右表中的行没有来自右表的任何匹配行,则结果集中右表的列将使用 NULL 值。 以下是 RIGHT JOIN 的语法:

SELECT
product_name,
order_id
FROM
sales.order_items o
RIGHT JOIN production.products p
ON o.product_id = p.product_id
ORDER BY
order_id;

 (4).SQL Server 交叉连接

CROSS JOIN 连接两个或多个不相关的表。 以下是两个表的SQL Server CROSS JOIN 的语法:

SELECT
select_list
FROM
T1
CROSS JOIN T2;
或者
SELECT
select_list
FROM
T1, T2;

CROSS JOIN 将第一个表(T1)中的每一行与第二个表(T2)中的每一行连接起来。

换句话说,交叉连接返回 两个表中行的笛卡尔积。

与INNER JOIN或LEFT JOIN不同,交叉连接不会在连接的表之间建立关系。

假设 T1 表包含三行: 1 , 2 和 3 , T2 表包含三行: A , B 和 C 。

CROSS JOIN 从第一个表(T1)获取一行,然后为第二个表(T2)中的每一行创建一个新行。

然后它对第一个 表(T1)中的下一行执行相同操作,依此类推。 在此图中, CROSS JOIN 总共创建了 9 行。 通常,如果第一个表有 n 行,第二个表有 m 行,则交叉连接 将产生 n x m 行。 

(5).SQL Server自连接

自联接用于将表连接到自身(同一个表)。

它对于查询分层数据或比较同一个表中的行很有用。 自联接使用内连接或左连接子句。 由于使用自联接的查询引用同一个表,因此表别名用于为查询中的表 分配不同的名称。

SELECT
e.first_name + ' ' + e.last_name employee,
m.first_name + ' ' + m.last_name manager
FROM
sales.staffs e
INNER JOIN sales.staffs m ON m.staff_id = e.manager_id
ORDER BY
manager

(6).SQL Server全外链接

 FULL OUTER JOIN当左表或右表中存在匹配项时,该命令将返回所有行。 下面创建一些示例表来演示全外连接。 首先,创建一个名为 pm 的新模式,它代表项目管理

INSERT INTO
pm.projects(title)
VALUES
('New CRM for Project Sales'),
('ERP Implementation'),
('Develop Mobile Sales Platform');
INSERT INTO
pm.members(name, project_id)
VALUES
('John Doe', 1),
('Lily Bush', 1),
('Jane Doe', 2),
('Jack Daniel', null);

3.分组数据

(1).SQL Server Group By语句

 Group By 从字面意义上理解就是根据“By”指定的规则对数据进行分组,

所谓的分组就是将一个“数据集” 划分成若干个“小区域”,

然后针 对若干个“小区域”进行数据处理。 以下是 GROUP BY 子句的语法:

SELECT
customer_id,
YEAR (order_date) order_year
FROM
sales.orders
WHERE
customer_id IN (1, 2)
ORDER BY
customer_id;

(2).GROUP BY子句和聚合函数

 GROUP BY 子句通常与聚合函数一起用于统计数据。

聚合函数对组执行计算并返回每个组的唯一值。

例如, COUNT() 函数返回每个组中的行数。

其他常用的聚合函数是: SUM() , AVG() , MIN() , MAX()。

GROUP BY 子句将行排列成组,聚合函数返回每个组的统计量(总数量,最小值,最大值,平均值,总和 等)。 例如,以下查询返回客户按年度下达的订单数:

SELECT
customer_id,
YEAR (order_date) order_year,
COUNT (order_id) 订单数量
FROM
sales.orders
WHERE
customer_id IN (1, 2)
GROUP BY
customer_id,
YEAR (order_date)
ORDER BY
customer_id;

(1).带有COUNT()函数示例的GROUP BY子句

SELECT
city,
COUNT (customer_id) customer_count
FROM
sales.customers
GROUP BY
city
ORDER BY
city;

(2).GROUP BY子句带有MIN和MAX函数示例

SELECT
brand_name,
MIN (list_price) min_price,
MAX (list_price) max_price
FROM
production.products p
INNER JOIN production.brands b ON b.brand_id = p.brand_id
WHERE
model_year = 2018
GROUP BY
brand_name
ORDER BY
brand_name;

4.SQL Server Having子句

HAVING 子句通常与[GROUP BY]子句一起使用,以根据指定的条件列表过滤分组。 以下是 HAVING 子句 的语法:

SELECT
select_list
FROM
table_name
GROUP BY
group_list
HAVING
conditions;

在此语法中,

GROUP BY 子句将行汇总为分组,

HAVING 子句将一个或多个条件应用于这些每个分组。

只有使条件评估为 TRUE 的组才会包含在结果中。

换句话说,过滤掉条件评估为 FALSE 或 UNKNOWN 的 组。

因为SQL Server在 GROUP BY 子句之后处理 HAVING 子句,所以不能通过使用列别名来引用选择列表中指 定的聚合函数。 以下查询将失败: 

 

SELECT
column_name1,
column_name2,
aggregate_function (column_name3) column_alias
FROM
table_name
GROUP BY
column_name1,
column_name2
HAVING
column_alias > value

5.子查询

(1).SQL Server子查询

子查询是嵌套在另一个语句(如:[SELECT],[INSERT]

,[UPDATE]或[DELETE])中的查询。 以下语句显示如何在 SELECT 语句的[WHERE]子句中使用子查询来查找位于纽约( New York )的客户的销售订单:

SELECT
order_id,
order_date,
customer_id
FROM
sales.orders
WHERE
customer_id IN (
SELECT
customer_id
FROM
sales.customers
WHERE
city = 'New York'
)
ORDER BY
order_date DESC;

(2).SQL Server嵌套子查询

子查询可以嵌套在另一个子查询中。

SQL Server最多支持 32 个嵌套级别。 请考虑以下示例: 

SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price > (
SELECT
AVG (list_price)
FROM
production.products
WHERE
brand_id IN (
SELECT
brand_id
FROM
production.brands
WHERE
brand_name = '上海永久'
OR brand_name = '凤凰'
)
)
ORDER BY
list_price;

 (3).SQL Server相关子查询

相关子查询是使用外部查询的值的[子查询]。

换句话说,它取决于外部查询的值。

由于这种依赖性,相 关子查询不能作为简单子查询独立执行。

此外,对外部查询评估的每一行重复执行一次相关子查询。 相关子查询也称为重复子查询。 以下示例查找价格等于其类别的最高价格的产品。

SELECT
product_name,
list_price,
category_id
FROM
production.products p1
WHERE
list_price IN (
SELECT
MAX (p2.list_price)
FROM
production.products p2
WHERE
p2.category_id = p1.category_id
GROUP BY
p2.category_id
)
ORDER BY
category_id,
product_name;
-- 子查询写法
SELECT
p1.product_id,p1.product_name,p1.category_id,p1.list_price
FROM
production.products p1
INNER JOIN (
SELECT
category_id,
max(list_price) max_price
FROM
production.products
GROUP BY
category_id
) p2 ON p1.category_id = p2.category_id
AND p1.list_price = p2.max_price;

(4).SQL Server Exists运算符

EXISTS 运算符是一个逻辑运算符,用于检查子查询是否返回任何行。 如果子查询返回一行或多行,则 EXISTS 运算符返回 TRUE 。 以下是SQL Server EXISTS 运算符的语法:

EXISTS ( subquery)

(1).1. 带子查询的EXISTS返回NULL示例 以下示例返回 customers 表中的所有行:

SELECT
customer_id,
first_name,
last_name
FROM
sales.customers
WHERE
EXISTS (SELECT NULL)
ORDER BY
first_name,
last_name;

(5).SQL Server Any运算符

ANY 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值集进行比较。 以下是 ANY 运算符的语法:

scalar_expression comparison_operator ANY (subquery)

 在上面语法中,

scalar_expression - 是任何有效的表达式。

comparison_operator - 是任何比较运算符,包括等于( &#61; )&#xff0c;不等于( <> )&#xff0c;大于( > )&#xff0c;大于或等于 ( >&#61; )&#xff0c;小于( <)&#xff0c;小于或等于( <&#61; )。

subquery 是一个[SELECT]语句&#xff0c;它返回单个列的结果集&#xff0c;其数据与标量表达式的数据类型相同。

 

SELECT
product_name,
list_price
FROM
production.products
WHERE
product_id &#61; ANY (
SELECT
product_id
FROM
sales.order_items
WHERE
quantity >&#61; 2
)
ORDER BY
product_name;

(7).SQL Server All运算符

SQL Server ALL 运算符是一个逻辑运算符&#xff0c;

它将标量值与子查询返回的单列值列表进行比较。 以下是 ALL 运算符语法&#xff1a; 

scalar_expression comparison_operator ALL ( subquery)

在上面语法中&#xff0c; scalar_expression 是任何有效的表达式。

comparison_operator 是任何有效的比较运算符&#xff0c;包括等于( &#61; )&#xff0c;不等于( <> )&#xff0c;大于( > )&#xff0c;大于或 等于( >&#61; )&#xff0c;小于( <)&#xff0c;小于或等于( ALL ( subquery ) 如果 scalar_expression 大于子查询返回的最大值&#xff0c;则表达式返回 TRUE 。

例如&#xff0c;以下查询查找价格大于所有品牌产品的平均价格的产品&#xff1a;

SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price > ALL (
SELECT
AVG (list_price) avg_list_price
FROM
production.products
GROUP BY
brand_id
)
ORDER BY
list_price;

(2).scalar_expression

如果标量表达式( scalar_expression )小于子查询( subquery )返回的最小值&#xff0c;则表达式求值为 TRUE 。 以下示例按品牌查找价格低于平均价格中最低价格的产品&#xff1a;

SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price SELECT
AVG (list_price) avg_list_price
FROM
production.products
GROUP BY
brand_id
)
ORDER BY
list_price DESC;

 

 

 

 

 

 

 

 


推荐阅读
  • 包含phppdoerrorcode的词条 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • C# 中 SQLite 报错:在 "\\s\\" 附近出现语法错误,如何解决? ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • SQL 连接详解与应用
    本文详细介绍了 SQL 连接的概念、分类及实际应用,包括内连接、外连接、自连接等,并提供了丰富的示例代码。 ... [详细]
  • 本文详细介绍了数据库并发控制的基本概念、重要性和具体实现方法。并发控制是确保多个事务在同时操作数据库时保持数据一致性的关键机制。文章涵盖了锁机制、多版本并发控制(MVCC)、乐观并发控制和悲观并发控制等内容。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
author-avatar
宁波南诚装饰_886
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有