SQL JOIN 数据库表关联关系

SQL JOIN 数据库表关联关系,第1张

SQL 的表关联关系主要有四种 inner join,left join,right join和full join,其区别和使用场景如下:

• inner join(内连接),在两张表进行连接查询时,只保留两张表中完全匹配的结果集。

• left join,在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。(一般left join 和right join 中都选择left join)

• right join,在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。

• full join,在两张表进行连接查询时,返回左表和右表中所有没有匹配的行。

full join 和union的功能一样,可以把两张表里没有匹配的行关联在一起。

在进行模型设计时,选择用哪种表关联方式会影响到你最终的物理表数据是否齐全,所以需要深刻理解每一种关联方式最终返回的值有哪些。

在模型设计时,要考虑业务场景,选择以哪张事实表作为主表。当门店流量表里某一天的数据为空时,意味着当天门店没有客流量,但是依然会产生房租水电等固定成本,所以选择门店流量表作为主表时,采取left join 的方式关联财务指标汇总表时,不会返回对应的房租水电等数据。 当有业务场景能够满足主表无数据产生,子表会有数据产生的情况表之间通过FULL JOIN 或者 UNION的方式 。

现在确定表之间用FULL JOIN 的方式进行关联了,返回表中对应门店流量表无数据产生给空值,源表为财务指标汇总表的数据展示其对应数据。我们的物理表门店成本月度分析表如图所示,日期和门店编码作为主键。可能会有人有疑问,为什么日期和门店字段有多个来源表和多个来源字段。还是用门店流量表和财务指标汇总表以门店和日期进行全关联,那么2张表中都有的门店日期字段,现在合并为一张表,只展示一个门店日期字段。我们可以想象取客流量的数据时需要门店流量表的门店日期字段才能匹配出对应数据,同理房租水电费也需要对应的财务指标汇总表里的日期门店才能匹配出对应的数据。这样是是不是很好理解为啥物理表的主键字段需要多个来源表和来源字段了。我们的物理表即门店月度分析表的 源表有几张就需要有几个门店日期字段作为来源字段。

如果是

父子关系,

或者

一对多

关系。

可以通过

创建外键的方式,

父表

子表之间,

创建一个关联关系。

例如:

--

创建测试主表.

ID

是主键.

CREATE

TABLE

test_main

(

id

INT

NOT

NULL,

value

VARCHAR(10),

PRIMARY

KEY(id)

)

--

创建测试子表.

CREATE

TABLE

test_sub

(

id

INT

NOT

NULL,

main_id

INT

,

value

VARCHAR(10),

PRIMARY

KEY(id)

)

--

插入测试主表数据.

INSERT

INTO

test_main(id,

value)

VALUES

(1,

'ONE')

INSERT

INTO

test_main(id,

value)

VALUES

(2,

'TWO')

--

插入测试子表数据.

INSERT

INTO

test_sub(id,

main_id,

value)

VALUES

(1,

1,

'ONEONE')

INSERT

INTO

test_sub(id,

main_id,

value)

VALUES

(2,

2,

'TWOTWO')

SQL>

--

创建外键(默认选项)

SQL>

ALTER

TABLE

test_sub

ADD

CONSTRAINT

main_id_cons

FOREIGN

KEY

(main_id)

REFERENCES

test_main

Table

altered.

SQL>

SQL>

--

测试删除主表数据.

将出错

ORA-02292:

违反完整约束条件

SQL>

DELETE

2

test_main

3

WHERE

4

ID

=

1

DELETE

*

ERROR

at

line...如果是

父子关系,

或者

一对多

关系。

可以通过

创建外键的方式,

父表

子表之间,

创建一个关联关系。

例如:

--

创建测试主表.

ID

是主键.

CREATE

TABLE

test_main

(

id

INT

NOT

NULL,

value

VARCHAR(10),

PRIMARY

KEY(id)

)

--

创建测试子表.

CREATE

TABLE

test_sub

(

id

INT

NOT

NULL,

main_id

INT

,

value

VARCHAR(10),

PRIMARY

KEY(id)

)

--

插入测试主表数据.

INSERT

INTO

test_main(id,

value)

VALUES

(1,

'ONE')

INSERT

INTO

test_main(id,

value)

VALUES

(2,

'TWO')

--

插入测试子表数据.

INSERT

INTO

test_sub(id,

main_id,

value)

VALUES

(1,

1,

'ONEONE')

INSERT

INTO

test_sub(id,

main_id,

value)

VALUES

(2,

2,

'TWOTWO')

SQL>

--

创建外键(默认选项)

SQL>

ALTER

TABLE

test_sub

ADD

CONSTRAINT

main_id_cons

FOREIGN

KEY

(main_id)

REFERENCES

test_main

Table

altered.

SQL>

SQL>

--

测试删除主表数据.

将出错

ORA-02292:

违反完整约束条件

SQL>

DELETE

2

test_main

3

WHERE

4

ID

=

1

DELETE

*

ERROR

at

line

1:

ORA-02292:

integrity

constraint

(HR.MAIN_ID_CONS)

violated

-

child

record

found


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10075608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存