数据库查询


title: 数据库查询
date: 2021-08-14 14:16:43
tags: [SQL, 数据库]


数据库查询

image-20210814142340436

单表查询

select 列名
from 表名
where 条件
[order by 列名 DESC/ASC]

多表查询

同表

自连接

一张表中,有两个及以上的字段,且这些字段有一定的关系,就可以在这上面进行连接操作,俗称自连接。

示例

车站站点表

image-20210814172207605

通过自连接查询上下站关系找到坐车线路

SELECT a.preStation, a.nextStation, b.preStation, b.nextStation
FROM tb_path AS a, tb_path AS b
WHERE a.nextStation = b.preStation

image-20210814172101223

异表

数据库结构

tb_a

image-20210814174733031

tb_b

image-20210814174744206

内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。

等值连接

在连接条件中使用**等于(=)**运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列

SELECT * 
FROM tb_a AS a 
INNER JOIN tb_b AS b
ON a.id = b.id

查询结果,注意列数是 4 列,两张表的字段直接拼接在一起,重复的字段在后面添加数字序列以做区分。

image-20210814174852541

通俗讲就是根据条件,找到 tb_a 和 tb_b 数据的交集,加以 Venn 图表示就是

image-20210815120151176

不等值连接

在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<,<>,!=。

SELECT * 
FROM tb_a AS a 
INNER JOIN tb_b AS b
ON a.id < b.id

image-20210815145250600

自然连接

在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列

SELECT * 
FROM tb_a AS a 
NATURAL JOIN tb_b AS b
交叉连接

交叉连接不带 WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积

SELECT * 
FROM tb_a AS a 
CROSS JOIN tb_b AS b

image-20210815150546163

外连接

外连接不只列出与连接条件相匹配的行,而且还加上左表(左外连接时)或右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

左连接

将左表的所有数据与右表存在的数据连接起来,如果没有对应项,则为 Null。

SELECT * 
FROM tb_a AS a 
LEFT JOIN tb_b AS b
ON a.id = b.id

Venn 图表示:

image-20210815150943010

image-20210815151009586

如果需要两者的交集部分,可采用内连接或左连接加条件。

// 内连接
SELECT * 
FROM tb_a AS a 
INNER JOIN tb_b AS b
ON a.id = b.id
// 左连接加条件
SELECT * 
FROM tb_a AS a 
LEFT JOIN tb_b AS b
ON a.id = b.id
WHERE b.id IS NOT NULL

Venn 图表示:

image-20210815120151176

image-20210815152710431

如果不需要两者的交集部分,可采用左连接加条件。

SELECT * 
FROM tb_a AS a 
LEFT JOIN tb_b AS b
ON a.id = b.id
WHERE b.id IS NULL

Venn 图表示:

image-20210815153224193

image-20210815153243233

右连接

将右表的所有数据与左表存在的数据连接起来,如果没有对应项,则为 Null。

SELECT * 
FROM tb_a AS a 
RIGHT JOIN tb_b AS b
ON a.id = b.id

Venn 图表示:

image-20210815153551570

image-20210815153513536

如果需要两者的交集部分,可采用内连接或右连接加条件。

// 内连接SELECT * FROM tb_a AS a INNER JOIN tb_b AS bON a.id = b.id// 左连接加条件SELECT * FROM tb_a AS a RIGHT JOIN tb_b AS bON a.id = b.idWHERE a.id IS NOT NULL

Venn 图表示:

image-20210815120151176

image-20210815152710431

如果不需要两者的交集部分,可采用左连接加条件。

SELECT * FROM tb_a AS a RIGHT JOIN tb_b AS bON a.id = b.idWHERE a.id IS NULL

Venn 图表示:

image-20210815153828296

image-20210815153810474

全连接

mysql 不支持 FULL JOIN,故需要另辟其境,比如左连接加右连接。

SELECT * FROM tb_a AS a LEFT JOIN tb_b AS bON a.id = b.idUNIONSELECT * FROM tb_a AS a RIGHT JOIN tb_b AS bON a.id = b.id

Venn 图表示:

image-20210815155722417

image-20210815155644217

如果不需要两者的交集部分,可采用如下方式。

SELECT * FROM tb_a AS a LEFT JOIN tb_b AS bON a.id = b.idWHERE b.id IS NULLUNIONSELECT * FROM tb_a AS a RIGHT JOIN tb_b AS bON a.id = b.idWHERE a.id IS NULL

Venn 图表示:image-20210815155858969

image-20210815155912680

总结

image-20210815160202037

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值