SQL查询介绍(第一部分)推荐集合
SQL语言是一种简单而强大的语言,让你赶快写更复杂的查询语句,但对于大多数开发商来说,SQL查询的数据库的使用不是一个抽象的过程,一个合理的步骤,这可能是坚持写一些SQL查询来解决特定的问题,这一系列的文章主要是关于SQL查询的一些基本理论和抽象的概念,写一个查询语句。sql查询简介
SQL语言起源于关系数据库理论发表在e.j.codd 1970,所以SQL是关系数据库的SQL查询,它是从数据库中的数据的一个子集。这句话似乎晦涩难懂。
如果在数据库中只有一个表,如果所有的数据都是像下图(从adventurework示例数据库):
对于子集的概念,请看下面:
最后,子集如下所示:
事实上,不管SQL中的查询多么复杂,它都可以抽象为上面的过程。
准确查询的前提
为了正确地获取所需的数据子集,思路是正确的,正确地将思路转换成相应的sql语句,重要的是要有良好的数据库设计。好的设计在这里我指的是业务逻辑和数据库设计的至少第三个范例,为了实现第三范式,这只是我个人的观点,简单介绍了范例,请看我的博客:这些东西的数据库范例。如果数据库设计很差,数据库中有大量冗余信息,有很多异常,即使sql写得正确,也无法获得准确的结果。
两种方式,相同的结果
在SQL中,获取相同的数据子集可以使用不同的思想或不同的SQL语句,因为SQL来自关系数据库理论,关系数据库理论也来自数学。当考虑如何构建查询语句时,可以将其抽象为两种方式。
1。关系代数方法
关系代数的思想是一步一步地对数据库进行操作,最终得到预期的结果。
例如,以下语句如下所示:
复制代码代码如下所示:
选择姓名、部门、年龄
从员工
年龄在20岁以上
关系代数的思想是将上面的语句描述为:在表雇员表上投影(选择列)操作,然后过滤结果,只得到年龄大于20的结果。
2。关系的算法
与关系代数相比,关系算法更关注获取数据的条件。上面的SQL可以用关系算法来描述:我想得到所有20岁以上员工的姓名、部门和年龄。
你为什么需要两种方法
对于简单查询语句,不需要上述两种方法。你可以用你的脚来思考它,问题是很多查询语句都很复杂,算法之间的关系是更注重的是满足信息条件,而代数方法之间的关系,更关注的是如何检索特定信息。简单的说,这个关系是什么算法和代数的方法表达,表达之间的关系被认为how.sql语言句子中的显示。一些时间关系代数方法,有时是算法之间的关系,有些是两种思想的混合。
对于一些查询,关系代数可能更简单。对于其他情况,关系演算将更加直接。还有其他情况。我们需要混合两种方式,所以在编写SQL查询时,这两种思维方式是必要的。
单表查询
单个表查询是所有查询的中间状态,在最后连接之后,可以将多个表的复杂查询抽象为单个表查询,因此从单个表查询开始。
选择列的子集
根据上面的数据子集,选择列通过添加SELECT语句之后选择的列名来实现:
例如,选定列的一个子集通过选择后面的相应列名来在下面的数据库中实现。
相应的SQL语句如下所示:
复制代码代码如下所示:
选择{ }
{组}
从{ } { }中,人力资源部。{ }
选择一行的子集
行的子集被添加到SQL语句的WHERE子句中,并具有相应的限制。当WHERE子句为true时的表达式,即在满足条件时返回该行的相应子集。
WHERE子句后面的运算符分别分为比较运算符和逻辑运算符。
比较两个相同类型的数据进行比较,然后返回布尔运算符(bool),SQL,有六种比较运算符,分别等于(=),(小于),小于或等于(=)和(<>),并不是说Yu Huo等于和大于等于或可以被看作是一个组合的比较运算符和逻辑运算符。
逻辑运算符是连接两个布尔类型并返回一个新布尔类型的运算符。在SQL中,逻辑运算符通常将比较运算符返回的布尔类型连接起来,以确定WHERE子句的真和假条件。有三种逻辑运算符,和(或)、或(或)、不(不)。
例如,我想选择第二和第第六,来说明比较运算符和逻辑运算符,您可以使用以下SQL语句:
复制代码代码如下所示:
选择{ }
{组}
从{ } { }中,人力资源部。{ }
在1和departmentid5 DepartmentID DepartmentID >和< 7
因此,我们可以看到这些操作符具有优先级,从大到小的优先级是比较运算符>(和)非(或)。
当然,运算符也可以用括号来更改表的优先级。
不添加括号时:
复制代码代码如下所示:
*选择
从{ } { }中,人力资源部。{ }
1、在DepartmentID > = = 5或DepartmentID DepartmentID <= 7
添加圆括号来更改操作顺序:
复制代码代码如下所示:
*选择
从{ } { }中,人力资源部。{ }
1、在DepartmentID > = = 5或DepartmentID DepartmentID <= 7)
很特别的空
如果用户在表中注册,则不需要用户在数据库中填充的一些可选信息被保存为null,在使用上述语句后的WHERE子句中的null值,可能导致数据丢失,如可选信息为性别(性别),假设以下两个条件子句:
复制代码代码如下所示:
性别=M
不在(性别=M )
由于空值的存在,数据行返回两种说法是整个表,不是所有的数据。所以,当零价值的考虑,有条件的条款在哪里有可能值的真与假为真,假,和未知的(空)。这些都是可能的答案时,我们认为在现实世界中的一些问题,真的,假的,我不知道。
那么我们如何在这种情况下不丢失数据,例如上面,如何使整个表数据不会丢失,必须有除真、假未知之外的这个选项,SQL提供的是NULL来显示未知选项:
如果性别为null,则添加上述语句,并且不会丢失更多数据。
排序结果
以上方法都是取数据,以下是关于排序的子集,将采取out.sql排序通过ORDER BY子句。BY子句是sql语句语句的最后一个子子句,也就是说,子句之后可以添加任何子句。
ORDERBY子句分为升序和降序(ASC)(降序),如果不指定默认为升序或降序,上升,并通过(秩序)是根据订货的3个类型的数据的数据类型进行排序:
性格
数
时间和日期
字符按字母顺序排序,数字按数字排序,时间和日期按时间排序。
其他一些相关的
看法
视图可以被视为一个保存的虚拟表,或者作为保存的查询语句,视图的优点是可以根据视图中的表内容的变化来更改视图。
使用视图的优点是查询可以加密和管理,据说它也可以优化性能(我不同意)。
防止重复
有时我们不想重复所取数据的子集,例如,你想知道一些特定雇员的部门总数。
复制代码代码如下所示:
选择{ EmployeeID }
{ DepartmentID }
从{ } { }中,人力资源employeedepartmenthistory。{ }
这个结果是没有意义的,SQL提供了明确的关键字来做这件事:
复制代码代码如下所示:
选择不同的DepartmentID
从{ } { }中,人力资源employeedepartmenthistory。{ }
聚合函数
所谓聚合函数是为了一个特定的目的,将同一列的多个值聚合成一个,例如,我想知道一组人的最大年龄是什么,如何使用max(年龄),例如,我想知道一个类的平均测试结果是多少,平均值(结果)。
总结
本文简要概述了SQL查询和简单单表查询的基本原理,它们是数据库查询的基本概念。对于复杂的查询,我们必须理解这些概念。