mysql的数据库联表查询
该部分内容是数据库的重点,尽量讲得通俗易懂
目录
一、自联结——表与自己联结
首先来看个例子:
假如你发现某物品(其ID为1)存在问题,因此想知道⽣产该物品的供应商⽣产的其他物品 是否也存在这些问题。此查询要求⾸先找到⽣产ID为1的物品的供应商,然后找出这个供应 商⽣产的其他物品。
使用子查询
select prod_id,prod_name
from products
where vend_id = (select vend_id from products where prod_id = 1);
使用联结查询:
select p1.prod_id,p1.prod_name
from products as p1,products as p2
where p1.vend_id = p2.vend_id and p2.prod_id = 1;
看似使用子查询很清晰,容易理解,为什么还要进行联表查询?因为子查询的的性能比联表查询的性能低。数据库追求的是越快越好,能最求高性能,绝不用低性能。后面还有专门讲数据库的索引,它也是为了提高数据库的查询速度而成为重点。
二、表联结——两个不同表联结
下面通过一个简单的例子讲解以下内容:
创建表t1
CREATE TABLE t1(
sid VARCHAR(20),
sname VARCHAR(20)
);
插入t1数据
INSERT INTO t1 VALUES
(1,'张三'),
(2,'李四');
创建表t2
CREATE TABLE t2(
sid VARCHAR(20),
class VARCHAR(20)
);
插入t2数据
INSERT INTO t2 VALUES
(2,'2班'),
(3,'3班');
1.内部联结
SELECT * FROM t1 JOIN t2 ON t1.sid = t2.sid;
等同于
select * from t1, t2 where t1.sid = t2.sid;
结果:
查询出来的结果是左表和右表都有的数据结果;
为什么要用联结,理由同自联结阐述。
2.外部联结
2.1左联结
SELECT * FROM t1 LEFT JOIN t2 ON t1.sid = t2.sid;
结果:以左边的表查询出来行的结果为基准,右边表的结果如果有则显示,没有则为null;
2.2右联结
SELECT * FROM t1 RIGHT JOIN t2 ON t1.sid = t2.sid;
结果: 以右边的表查询出来行的结果为基准,左边表的结果如果有则显示,没有则为null;
三、组合查询UNION
条件:union查询两个sql语句的列数要相等,且同一列的数据类型要相似。
1.UNION
union的结果会自动去重:
SELECT * FROM t1 LEFT JOIN t2 ON t1.sid = t2.sid
UNION
SELECT * FROM t1 RIGHT JOIN t2 ON t1.sid = t2.sid;
结果:
2.UNION ALL
union all的结果不去重:
SELECT * FROM t1 LEFT JOIN t2 ON t1.sid = t2.sid
UNION ALL
SELECT * FROM t1 RIGHT JOIN t2 ON t1.sid = t2.sid;
结果: