logo  

Java编程实用经验

Java编程实用经验
作者: 陈安廉

摘要:软件开发进阶系列


mysql联表


2021-07-14 09:40:04



-- 笛卡尔积,交叉连接

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