title: 数据库查询
date: 2021-08-14 14:16:43
tags: [SQL, 数据库]
数据库查询
单表查询
select 列名
from 表名
where 条件
[order by 列名 DESC/ASC]
多表查询
同表
自连接
一张表中,有两个及以上的字段,且这些字段有一定的关系,就可以在这上面进行连接操作,俗称自连接。
示例
车站站点表
通过自连接查询上下站关系找到坐车线路
SELECT a.preStation, a.nextStation, b.preStation, b.nextStation
FROM tb_path AS a, tb_path AS b
WHERE a.nextStation = b.preStation
异表
数据库结构
tb_a
tb_b
内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
等值连接
在连接条件中使用**等于(=)**运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
SELECT *
FROM tb_a AS a
INNER JOIN tb_b AS b
ON a.id = b.id
查询结果,注意列数是 4 列,两张表的字段直接拼接在一起,重复的字段在后面添加数字序列以做区分。
通俗讲就是根据条件,找到 tb_a 和 tb_b 数据的交集,加以 Venn 图表示就是
不等值连接
在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<,<>,!=。
SELECT *
FROM tb_a AS a
INNER JOIN tb_b AS b
ON a.id < b.id
自然连接
在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
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
外连接
外连接不只列出与连接条件相匹配的行,而且还加上左表(左外连接时)或右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。
左连接
将左表的所有数据与右表存在的数据连接起来,如果没有对应项,则为 Null。
SELECT *
FROM tb_a AS a
LEFT JOIN tb_b AS b
ON a.id = b.id
Venn 图表示:
如果需要两者的交集部分,可采用内连接或左连接加条件。
// 内连接
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 图表示:
如果不需要两者的交集部分,可采用左连接加条件。
SELECT *
FROM tb_a AS a
LEFT JOIN tb_b AS b
ON a.id = b.id
WHERE b.id IS NULL
Venn 图表示:
右连接
将右表的所有数据与左表存在的数据连接起来,如果没有对应项,则为 Null。
SELECT *
FROM tb_a AS a
RIGHT JOIN tb_b AS b
ON a.id = b.id
Venn 图表示:
如果需要两者的交集部分,可采用内连接或右连接加条件。
// 内连接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 图表示:
如果不需要两者的交集部分,可采用左连接加条件。
SELECT * FROM tb_a AS a RIGHT JOIN tb_b AS bON a.id = b.idWHERE a.id IS NULL
Venn 图表示:
全连接
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 图表示:
如果不需要两者的交集部分,可采用如下方式。
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 图表示: