sql过滤空值_图解SQL⽤法
本⽂介绍关系数据库的设计思想:在 SQL 中,⼀切皆关系。
在计算机领域有许多伟⼤的设计理念和思想,例如:
在 Unix 中,⼀切皆⽂件。
在⾯向对象的编程语⾔中,⼀切皆对象。
关系数据库同样也有⾃⼰的设计思想:在 SQL 中,⼀切皆关系。
关系模型
关系模型(Relational model)由 E.F.Codd 博⼠于 1970 年提出,以集合论中的关系概念为基础;⽆论是现实世界中的实体对象还是它们之间的联系都使⽤关系表⽰。我们在数据库系统中看到的关系就是⼆维表(Table),由⾏(Row)和列(Column)组成。因此,也可以说关系表是由数据⾏构成的集合。
关系模型由数据结构、关系操作、完整性约束三部分组成。
关系模型中的数据结构就是关系表,包括基础表、派⽣表(查询结果)和虚拟表(视图)。
常⽤的关系操作包括增加、删除、修改和查询(CRUD),使⽤的就是 SQL 语⾔。其中查询操作最为复杂,包括选择(Selection)、投影(Projection)、并集(Union)、交集(Intersection)、差集(Exception)以及笛卡⼉积(Cartesian product)等。
完整性约束⽤于维护数据的完整性或者满⾜业务约束的需求,包括实体完整性(主键约束)、参照完整性(外键约束)以及⽤户定义的完整性(⾮空约束、唯⼀约束、检查约束和默认值)。
我们今天的主题是关系操作语⾔,也就是 SQL。本⽂使⽤的⽰例数据来源于
blog.csdn/horses/article/details/86518676。
⾯向集合
SQL(结构化查询语⾔)是操作关系数据库的标准语⾔。SQL ⾮常接近英语,使⽤起来⾮常简单。它在设计之初就考虑了⾮技术⼈员的使⽤需求,我们通常只需说明想要的结果(What),⽽将数据处理的过程(How)交给数据库管理系统。所以说,SQL 才是真正给⼈⽤的编程语⾔! 接下来我们具体分析⼀下关系的各种操作语句;⽬的是为了让⼤家能够了解 SQL 是⼀种⾯向集合的编程语⾔,它的操作对象是集合,操作的结果也是集合。
在关系数据库中,关系、表、集合三者通常表⽰相同的概念。
SELECT
下⾯是⼀个简单的查询语句:
SELECT employee_id, first_name, last_name, hire_date
FROM employees;
它的作⽤就是从 employees 表中查询员⼯信息。显然,我们都知道 FROM 之后是⼀个表(关系、集合)。不仅如此,整个查询语句的结果也是⼀个表。所以,我们可以将上⾯的查询作为表使⽤:
SELECT *
FROM (SELECT employee_id, first_name, last_name, hire_datesql中delete用法
FROM employees) t;
括号内的查询语句被称为派⽣表,我们给它指定了⼀个别名叫做 t。同样,整个查询结果也是⼀个表;这就意味着我们可以继续嵌套,虽然这么做很⽆聊。 我们再看⼀个 PostgreSQL 中的⽰例:
-- PostgreSQL
SELECT *
FROM upper('sql');
| upper |
|-------|
| SQL |
upper() 是⼀个⼤写转换的函数。它出现在 FROM ⼦句中,意味着它的结果也是⼀个表,只不过是 1 ⾏ 1 列的特殊表。 SELECT ⼦句⽤于指定需要查询的字段,可以包含表达式、函数值等。SELECT 在关系操作中被称为投影(Projection),看下⾯的⽰意图应该就⽐较好理解了。
除了 SELECT 之外,还有⼀些常⽤的 SQL ⼦句。 WHERE ⽤于指定数据过滤的条件,在关系运算中被称为选择(Selection),⽰意图如下:
ORDER BY ⽤于对查询的结果进⾏排序,⽰意图如下:
总之,SQL 可以完成各种数据操作,例如过滤、分组、排序、限定数量等;所有这些操作的对象都是关系表,结果也是关系表。
在这些关系操作中,有⼀个⽐较特殊,就是分组。
GROUP BY
分组( GROUP BY)操作和其他的关系操作不同,因为它改变了关系的结构。来看下⾯的⽰例:
SELECT department_id, count(*), first_name
FROM employees
GROUP BY department_id;
该语句的⽬的是按照部门统计员⼯的数量,但是存在⼀个语法错误,就是 first_name 不能出现在查询列表中。原因在于按照部门进⾏分组的话,每个部门包含多个员⼯;⽆法确定需要显⽰哪个员⼯的姓名,这是⼀个逻辑上的错误。 所以说,GROUP BY 改变了集合元素(数据⾏)的结构,创建了⼀个全新的关系。分组操作的⽰意图如下:
尽管如此,GROUP BY 的结果仍然是⼀个集合。
UNION
SQL ⾯向集合特性最明显的体现就是 UNION(并集运算)、INTERSECT(交集运算)和 EXCEPT/MINUS(差集运算)。 这些集合运算符的作⽤都是将两个集合并成⼀个集合,因此需要满⾜以下条件:
两边的集合中字段的数量和顺序必须相同;
两边的集合中对应字段的类型必须匹配或兼容。
具体来说,UNION 和 UNION ALL ⽤于计算两个集合的并集,返回出现在第⼀个查询结果或者第⼆个查询结果中的数据。它们的区别在于UNION 排除了结果中的重复数据,UNION ALL 保留了重复数据。下⾯是 UNION 操作的⽰意图:
INTERSECT 操作符⽤于返回两个集合中的共同部分,即同时出现在第⼀个查询结果和第⼆个查询结果中的数据,并且排除了结果中的重复数据。INTERSECT 运算的⽰意图如下:
EXCEPT 或者 MINUS 操作符⽤于返回两个集合的差集,即出现在第⼀个查询结果中,但不在第⼆个查询结果中的记录,并且排除了结果中的重复数据。EXCEPT 运算符的⽰意图如下:
除此之外,DISTINCT 运算符⽤于消除重复数据,也就是排除集合中的重复元素。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论