
SQL是一种易于学习但功能强大的语言,可让您快速入门并编写更复杂的查询语句. 但是对于大多数开发人员而言,使用SQL查询并没有一个抽象的过程和一个合理的步骤,这在编写一些特定的SQL查询语句来解决特定问题时可能会导致“卡住”. 本系列文章重点介绍SQL查询的一些基本理论和用于编写查询语句的抽象思想.
SQL语言起源于E.J. Codd成立于1970年,因此SQL用于关系. 对于SQL查询,它是指从中获取数据的子集. 这句话听起来有些晦涩,对. 让我用几张图片简单地解释一下:
如果中只有一个表,并且所有数据都如下所示(摘自AdventureWork示例):

关于子集的概念,请看下面的图片:

最后,子集如下:

实际上常见sql语句,无论SQL中的查询多么复杂,都可以将其抽象到上述过程中.
精确查询的前提条件
用于正确获取所需数据子集. 除了需要将正确的主意和正确的主意转换为相应的SQL查询语句外. 另一个非常重要的一点是,您需要一个良好的设计. 这里的良好设计意味着的设计符合业务逻辑,并且至少实现了第三范式. 为了实现第三范式,这只是我个人的看法. 有关简短的介绍,请参见我的博客: Database范式那些事. 如果设计很糟糕,则存在很多冗余,并且中信息的异常也很多,即使正确编写了SQL,也无法获得准确的结果.
两种方法,结果相同
在SQL中,您可以使用不同的想法或不同的SQL语句来获取相同的数据子集,因为SQL是从关系理论派生而关系理论是从数学派生的. 考虑如何构造查询语句时,您可以采用两种方法进行抽象:

1. 关系代数法
关系代数方法的思想是对进行逐步操作并最终获得所需的结果.
例如,以下语句:
Select Name,Department,Age From Employee where Age>20
关系代数的概念将上述陈述描述为: 在Employee表上进行投影(选择列)操作,然后过滤结果,仅获得早于20的结果.
与关系代数方法相比,关系算法更加关注获取数据的条件. 上面的SQL可以使用关系算法描述为: 我想获取姓名,部门和年龄.
对于简单的查询语句,不需要以上两种方法. 你可以举起你的脚. 问题在于许多查询语句非常复杂. 对于关系算法,它更关注提取的信息满足的条件,而对于关系代数方法,它更关注如何提取特定信息. 简而言之,关系算法表示“什么”,而关系代数方法表示“如何”. 在SQL语句中泄漏的想法有时是关系代数方法常见sql语句,有时是关系算法,有些是这两种想法的混合.
对于某些查询情况,关系代数方法可能更简单,而对于其他情况,关系算法将显得更直接. 在某些情况下,我们需要混合两种想法. 因此,在编写SQL查询时,这两种思维方式都是必需的.
单表查询是所有查询的中间状态. 最终建立连接后,可以将多个表的两个复杂查询都抽象为单表查询. 因此,从一个表查询开始.
根据上面的数据子集,选择列是通过在select语句之后添加要选择的列名称来实现的:
例如,在以下中,通过选择后选择相应的列名称来选择列的子集.

相应的SQL语句如下:

SELECT [Name] ,[GroupName] FROM [AdventureWorks].[HumanResources].[Department]
通过在Sql语句的where子句之后添加相应的限制条件来选择行的子集. 当where子句后面的表达式为“ true”时,即满足所谓的“条件”时,将返回相应的行的子集.
where子句后面的运算符分为两类,即比较运算符和逻辑运算符.
比较运算符是比较两个相同类型的数据,然后返回一个布尔(布尔)运算符. 在SQL中,有六个比较运算符,它们等于(=),小于(<),大于(>),小于或等于(<=),大于或等于(> =)且不等于等于(<>),小于等于或大于等于等于可视为比较运算符和逻辑运算符.
逻辑运算符连接两个布尔类型并返回一个新的布尔类型运算符. 在SQL中,逻辑运算符通常连接比较运算符返回的布尔类型,以最终确定满足子句后的真假条件的位置. 逻辑运算符有三种,AND(与),OR(或),NOT(非).

例如,我想选择第二和第六项. 为了说明比较运算符和逻辑运算符,可以使用以下Sql语句:
SELECT [Name] ,[GroupName] FROM [AdventureWorks].[HumanResources].[Department] WHERE DepartmentID>1 and DepartmentID<3 or DepartmentID>5 and DepartmentID<7
由此可见,这些运算符具有优先级,并且优先级是比较运算符的优先级> Yu(And)>不是(Or)
当然,对于上表,操作员还可以通过括号更改优先级

不带括号:
SELECT * FROM [AdventureWorks].[HumanResources].[Department] WHERE DepartmentID>=1 and DepartmentID<=3 and DepartmentID>=5 or DepartmentID<=7


添加括号以更改计算顺序后:
SELECT * FROM [AdventureWorks].[HumanResources].[Department] WHERE DepartmentID>=1 and DepartmentID<=3 and (DepartmentID>=5 or DepartmentID<=7)

如果在用户注册表中,用户不需要填写某些可选信息,则将其作为空存储在中. 这些空值可能会在Lost上方的where子句之后使用运算符时引起数据,例如,假设以下两个条件子句,则可选信息之一是Gender:
where Gender="M"
where NOT (Gender="M")
由于存在空值,因此这两个语句返回的数据行未累加整个表中的所有数据. 因此,在考虑空值时,where后面的条件子句的可能值从true和false开始,增加到true,false和unknown(null). 当我们考虑现实世界中的一些问题时,这些是可能的答案,真,假,我不知道.
那么在这种情况下如何不丢失数据呢?对于上面的示例,如何使整个表的数据不丢失,除了“ true”,“ false”之外,这里还必须是“ unknown”选项包括在内,SQL提供IS NULL表示此选项未知:
where Gender IS NULL
如果添加以上语句,则不会丢失数据.
上面的方法都是关于获取数据的,下面的是关于整理子集的. SQL由Order by子句排序. Order by子句是Sql查询语句的最后一个子句,这意味着在Order by子句之后不能添加任何其他子句.
Order By子句分为升序(ASC)和降序(DESC),如果不指定升序或降序,则默认为升序(从小到大),而Order by根据排序的数据类型分别可以排序三种数据类型:

字符
号码
时间和日期
字符按字母排序,数字按数字大小排序,时间和日期按时间排序.
可以将视图视为已保存的虚拟表,也可以仅视为已保存的查询语句. 视图的优点是可以根据视图查询表的内容来更改视图. 例如,要理解这句话:

使用视图的优点是它可以对查询进行加密并且易于管理,据说可以优化性能(我不认识这一点).
有时候我们不想重复提取的数据子集,例如,您想知道某些特定员工属于多个部门
SELECT [EmployeeID] ,[DepartmentID] FROM [AdventureWorks].[HumanResources].[EmployeeDepartmentHistory]

此结果毫无意义. SQL提供了Distinct关键字来实现此目的:
SELECT distinct DepartmentID FROM [AdventureWorks].[HumanResources].[EmployeeDepartmentHistory]

所谓的汇总功能是出于特定目的将同一列中的多个值汇总为一个. 例如,我想知道一群人的最大年龄. 我可以使用MAX(Age),例如,我想知道一个班级的平均考试成绩AVG(Result)可以达到多少……
本文简要概述了SQL查询和简单单表查询的原理. 这些是查询的基本概念. 对于复杂的查询,理解这些概念至关重要.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-187275-1.html
没钱的不是就要自宫
每年只创新广告就行了