mysql联表
-- 笛卡尔积,交叉连接
SELECT
tc.name,
tp.name
FROM
t_child tc
CROSS JOIN t_parent tp
SELECT * FROM t_child tc JOIN t_parent tp
SELECT * FROM t_child tc, t_parent tp where tp.name ='任正飞'
-- 内联;从笛卡尔积中挑选出on字句条件成立的记录
SELECT
tc.name,
tp.name
FROM
t_child tc
inner join t_parent tp on
tc.parnet = tp.id
-- 左联,先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余匹配不上的部分,即从表值为空的部分。从表值不为空且不满足条件的记录会被过滤。右联一样,只不过右表作为主表
SELECT
tc.name,
tp.name
FROM
t_child tc
left join t_parent tp on
tc.parnet = tp.id
-- 查出所有没有孩子记录的父亲
SELECT * from t_parent tp left join t_child tc on tc.parnet =tp.id where tc.id is null
SELECT * from t_child tc ,t_parent tp where tc.parnet =tp.id and tc.parnet is null
SELECT * from t_parent tp inner join t_child tc on tc.parnet =tp.id where tc.parnet is null
-- 全联;笛卡尔积中满足on条件的部分;加上左右两表中,另外的表值为空的记录;即只过滤不满足on条件的记录
SELECT
tc.name,
tp.name
FROM
t_child tc
left join t_parent tp on
tc.parnet = tp.id
UNION
SELECT
tc.name,
tp.name
FROM
t_child tc
right join t_parent tp on
tc.parnet = tp.id
EXPLAIN
SELECT
tc.name
-- tp.name
FROM
t_child tc
inner join t_parent tp on
tc.parnet = tp.id
where tc.name ='王思聪'
-- 查出所有的孩子及其父母
SELECT
tc.name,
tp.name
FROM
t_child tc
right join t_parent tp on
tc.parnet = tp.id
SELECT
tc.name,
tp.name
FROM
t_child tc
inner join t_parent tp on
tc.parnet = tp.id
-- 在left join中, 不过滤数据,只决定是否显示右表的字段
-- 在right join中, 不过滤数据,只决定是否显示左表的字段
-- 在inner join中,过滤数据
-- 联表含义在于生成一个笛卡尔积表;在left join中,左表全表+右表on过滤后的数据;
-- on后的条件仅是对从表进行条件筛选。对主表不起作用。这是由于sql的执行顺序决定的,先对两个表tb1和tb2进行 n×m 行的笛卡尔积计算 (SELECT * FROM tb1,tb2),然后用on后边的条件进行过滤,再对主表补充完整。
-- 先对两个表tb1和tb2进行 n×m 行的笛卡尔积计算 (SELECT * FROM tb1,tb2),如果and 作用在从表上,则用and 对从表过滤
-- where 会在生成的笛卡尔集上进行过滤
SELECT
tp.id as 父id,
tp.name as 父名,
tp.sex as 父性别,
tc.id as 子id,
tc.name as 子名,
tc.sex as 子性别
FROM
t_parent tp
left join t_child tc on
tc.parnet = tp.id
and tc.sex =0