目录
文章目录
SQL 结构化查询语言
SQL 是操作关系数据库的标准语言,是一种面向集合的编程语言,它的操作对象是集合,操作的结果也是集合。SQL 可以完成各种数据操作,例如:查询、过滤、排序、分组、限定数量等。
SELECT 查询语句
SELECT 子句用于指定需要查询的表字段(属性),在关系操作中被称为投影(Projection),查询列表可以是字段名、表达式、或函数值等。
示例:
SELECT employee_id, first_name, last_name, hire_date
FROM employees;
作用是从 employees 表中查询 employee_id, first_name, last_name, hire_date 属性的值,结果返回一个派生表。这个派生表也可以作为一个 “新表” 来使用:
SELECT *
FROM (SELECT employee_id, first_name, last_name, hire_date
FROM employees) t;
上述,我们给派生表指定了一个别名 t。
一个 PostgreSQL 的示例:
SELECT *
FROM upper('sql');
PG SQL upper() 是一个大写转换函数。它出现再 FROM 子句中,意味着它的结果也是一个表,只不过是 1 行 1 列的特殊表。
| upper |
|-------|
| SQL |
WHERE 过滤语句
WHERE 用于指定数据过滤的条件,在关系运算中被称为选择(Selection)。
ORDER BY 排序语句
ORDER BY 用于对查询的结果进行排序。
GROUP BY 分组语句
GROUP BY 操作是比较特殊的,因为它会创建一个全新的关系,即:派生表的字段可能完全不属于基本表。
SELECT department_id, count(*), first_name
FROM employees
GROUP BY department_id;
该语句用于按照部门统计员工的数量,但是存在一个语法错误,就是 first_name 不能出现在查询列表中。因为,如果按照部门进行分组的话,每个部门包含多个员工,所以无法确定需要显示哪个员工的姓名,这是一个逻辑上的错误。
所以说,GROUP BY 创建了一个全新的关系,如下图所示:派生表的字段不属于原来的基本表。
集合运算语句
SQL 面向集合特性最明显的体现就是 UNION(并集运算)、INTERSECT(交集运算)和 EXCEPT/MINUS(差集运算)。集合运算符的作用都是将两个集合并成一个集合,因此需要满足以下条件:
- 两边的集合中字段的数量和顺序必须相同;
- 两边的集合中对应字段的类型必须匹配或兼容。
SQL 中的关系概念来自数学中的集合理论,因此 UNION、INTERSECT 和 EXCEPT 分别来自集合论中的并集(∪\cup∪)、交集(∩\cap∩)和差集(∖\setminus∖)运算。
需要注意的是,数学集合理论中的集合不允许存在重复的数据,但是 SQL 允许。因此,SQL 中的集合也被称为多重集合(multiset)。多重集合与集合理论中的集合都是无序的,但是 SQL 可以通过 ORDER BY 子句对查询结果进行排序。
UNION 并集运算
UNION 和 UNION ALL 用于计算两个集合的并集,返回出现在第一个查询结果或者第二个查询结果中的数据。区别在于 UNION 排除了结果中的重复数据,UNION ALL 保留了重复数据。
INTERSECT 交集运算
INTERSECT 操作符用于返回两个集合中的共同部分,即同时出现在第一个查询结果和第二个查询结果中的数据,并且排除了结果中的重复数据。
EXCEPT/MINUS 差集运算
EXCEPT 或者 MINUS 操作符用于返回两个集合的差集,即出现在第一个查询结果中,但不在第二个查询结果中的记录,并且排除了结果中的重复数据。
JOIN 连接语句
常见的 JOIN 连接类型包括:内连接、外连接、交叉连接等。其中,外连接又可以分为左外连接、右外连接以及全外连接。其他类型的连接还有半连接(SEMI JOIN)、反连接(ANTI JOIN)。
-
**内连接(Inner Join)**返回两个表中满足连接条件的数据。
-
**左外连接(Left Outer Join)**返回左表中所有的数据,对于右表,返回满足连接条件的数据,如果没有就返回空值。
-
**右外连接(Right Outer Join)**返回右表中所有的数据,对于左表,返回满足连接条件的数据,如果没有就返回空值。右外连接与左外连接可以互换,以下两者等价:
t1 RIGHT JOIN t2
t2 LEFT JOIN t1
-
**全外连接(Full Outer Join)**等价于左外连接加上右外连接,同时返回左表和右表中所有的数据,对于两个表中不满足连接条件的数据返回空值。
-
交叉连接也称为笛卡尔积(Cartesian Product)。两个表的交叉连接相当于一个表的所有行和另一个表的所有行两两组合,结果的数量为两个表的行数相乘。
值得注意的是,集合操作是将两个集合合并成一个更大或更小的集合;而连接查询将两个集合转换成一个更大或更小的集合,同时获得了一个更大的元素(更多的列)。所以,很多时候集合操作都可以通过连接查询来实现,例如:
SELECT department_id
FROM departments
UNION
SELECT department_id
FROM employees;
等价于:
SELECT COALESCE(d.department_id, e.department_id)
FROM departments d
FULL JOIN employees e ON (e.department_id = d.department_id);
参考文档
https://mp.weixin.qq.com/s/yY0NVl4emGgUVeLQG0XbAQ
来源:oschina
链接:https://my.oschina.net/u/4299887/blog/4522338