一、概述
关系理论的3个支柱是选择、投影、联接。使用联接可以将不同表或视图的行相互联系起来。联接支持暗示数据库中存储数据的方式。有几种方法可以联接表的,最常见的方法称为同等联接,该联接依据列值或表达式的相等性将一行与另一个表中的一行或多行关联起来,还可以使用非同等联接来联接表。在这种联接中,行与另一个表中的一行或多行关联起来,前提是这些行的列值在由不等于运算符确定的范围之内。
另一种不常见的方法是将这些行与同一个表中的其他行关联起来。这种关联建立在列之上,
这些列相互之间有逻辑关系以及层次结构关系。这种联接称为自联接。当执行同等联接和非同等联接时,会排除包含空值或公共联接列中具有不同条目的行。如果有必要的话,可以使用外联接来获得单行。当来自一个表的所有行联接到另一个表的所有行时,就会形成笛卡尔乘积。这种联接通常是
遗漏联接条件或联接条件不充足的结果,但有时也故意为之。
二、联接分类
1、同等联接和非同等联接
2、自联接
3、外联接
(1)左外联接(2)右外联接(3)全外联接
以上关于具体每种联接的含意、示例、用法在这里不做详细说明,更多相关知识可以查看Oracle官方文档。
三、需求场景
看如下图,在数据库里面有两张表,产品价格表和价格范围表,通过编写SQL语句来实现统计报表的效果。
1、创建两张表并插入数据
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
SQL> desc product_price; Name Type Nullable Default Comments ------- ------------ -------- ------- -------- PRODUCT VARCHAR2(25) Y PRICE NUMBER Y SQL> desc extend_price; Name Type Nullable Default Comments ----------- ------ -------- ------- -------- START_PRICE NUMBER Y END_PRICE NUMBER Y SQL> select * from product_price; PRODUCT PRICE ------------------------- ---------- a 2b 3c 11d 11e 12f 35g 34h 23i 33j 66k 1011rows selected SQL> select * from extend_price; START_PRICE END_PRICE ----------- ---------- 091019202930394099999 |
2、分析
既然是要显示成统计报表的形式内容,那么首先得拿着product_price表的price列值与extend_price
表的start_price/end_price列进行比较才能确定在哪些区间有多少产品
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
SQL> SELECT CASE WHEN b.start_price || '元到'|| b.end_price || '元'LIKE '0%'THEN '10元以下'WHEN b.start_price || '元到'|| b.end_price || '元'LIKE '4%'THEN '40元以上'ELSE b.start_price || '元到'|| b.end_price || '元'END EXTEND_PRICE, SUM ( CASE WHEN a.price >= b.start_price AND a.price <= b.end_price THEN 1ELSE 0END ) PRODUCT_COUNT FROM product_price a, extend_price b WHERE a.price >= b.start_price AND a.price <= b.end_price GROUP BY CASE WHEN b.start_price || '元到'|| b.end_price || '元'LIKE '0%'THEN '10元以下'WHEN b.start_price || '元到'|| b.end_price || '元'LIKE '4%'THEN '40元以上'ELSE b.start_price || '元到'|| b.end_price || '元'END ORDER BY 1; |
|
1
2
3
4
5
6
7
8
|
EXTEND_PRICE PRODUCT_COUNT -------------------------------------------------------------------------------- ------------- 10元以下 210元到19元 420元到29元 130元到39元 340元以上 1 |
转载于:https://blog.51cto.com/wish1024/1261242