单表查询_博客学习

 来自:CareySon

单表查询是所有查询的中间状态,既是多个表的复杂查询在最终进行这种连接后都能够被抽象成单表查询。所以先从单表查询开始。

 

1.选择列的子集

选择列是通过在select语句后面添加所要选择的列名实现的。

 

2.选择行的子集

选择行的子集是在Sql语句的where子句后面加上相应的限制条件,当where子句后面的表达式为“真”时,也就是满足所谓的“条件”时,相应的行的子集被返回。

where子句后面的运算符分为两类,分别是比较运算符逻辑运算符.

 

比较运算符是将两个相同类型的数据进行比较,进而返回布尔类型(bool)的运算符,在SQL中,比较运算符一共有六种,分别为  等于(=), 小于(<), 大于(>), 小于或等于(<=), 大于或等于(>=)以及 不等于(<>),其中小于或等于和大于或等于可以看成是比较运算符和逻辑运算符的结合体。

 

而逻辑运算符是将两个布尔类型进行连接,并返回一个新的布尔类型的运算符,在SQL中,逻辑运算符通常是 将比较运算符返回的布尔类型相连接 以最终确定where子句后面满足条件的真假。逻辑运算符一种有三种,与(AND),或(OR),非(NOT).

 

这几种运算符是有优先级的,优先级由大到小排列是:比较运算符 > 于(And)> 非(Or)。 当然,运算符也可以通过小括号来改变优先级

 

对于不加括号:

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

// 优先级:先是比较运算符,故应该是每部分先算出结果;然后第二优先级是 and(含义是同时成立)故两个 and 连接的三部分取交集;
// 最后是 or(含义是取并集),表示将优先级高的运算结果(or前面)和 or 后面的结果取并集。
// 这里明显 or 前面结果是空集,故并集就是 or 后面的结果。

加了括号改变运算顺序后:

SELECT *
  FROM [AdventureWorks].[HumanResources].[Department]
  WHERE DepartmentID>=1 and DepartmentID<=3 and (DepartmentID>=5 or DepartmentID<=7)

// 这里的分析也是同理,括号内意思是 部门ID 可以是 >=5 的那些,也可以是 <= 7 的那些,取并集显然是全集(全部取到)

 

 

3.很特别的NULL

    假如在一个用户注册的表中,一些选填信息并不需要用户必须填写,则在数据库中保存为null,这些null值在利用上面where子句后的运算符时,有可能造成数据丢失,比如一个选填信息是性别(Gender),假设下面两条条件子句:

where Gender="M"
where NOT (Gender="M")

   由于null值的存在,这两条语句返回的数据行加起来并不是整个表中的所有数据。所以,当将null值考虑在内时,where后面的条件子句拥有可能的值从真和假,增加为真,假,以及未知(null)。这些是我们在现实世界中想一些问题的时候可能的答案--真的,假的,我不知道。

    所以我们如何在这种情况下不丢失数据呢,对于上面的例子来说,如何才能让整个表的数据不被丢失呢,这里必须将除了“真”,“假”以外的“未知”这个选项包含在内,SQL提供了IS NULL来表明未知这个选项:

where Gender IS NULL

   将上面语句加入进去,则不会再丢失数据。

 

posted @ 2021-03-03 14:39  bigTreeM  阅读(163)  评论(0编辑  收藏  举报