前面我们给一张电影表设置外键之后,跨表查只能查到电影类型对应的数字,但是具体查不到电影的具体类型,还是拿着这个序号去电影类型表去查,我们想在一张表上就把电影类型显示出来,就要用到多表查询。
一,交叉连接:也叫卡迪尔积,自然连接
比如:同时查两张表中的信息,第一张表有8行,第二张表有15行,那么查他们的组合生成的表就有12*15=120行,这样有个缺点就是我们的15部电影都各自对应一个类型,应该有15行数据是有效的,但是它这足足多出来了120-15=115行垃圾数据。
SELECT *FROM film,`types`
二,内连接
针对上面的数据我们要进行筛选,发现只要当tid=tid,就是电影类型表的类型对应的tid等于电影表的tid,才是有效数据。
SELECT *FROM film,`types` WHERE types.tid=film.tid
发现只要加个条件就可以了,但这不是标准的内连接,下面才是
SELECT *FROM `types` INNER JOIN film ON types.tid=film.tid
而且这里的INNER可以省略,film和types谁在前面,就先显示谁的数据。
案例:查询所有电影名及对应的类型名
SELECT fname,tname FROM film JOIN `types` ON film.`tid`=types.`tid`
案例:查询哪些会员喜欢哪些类型?
典型的三张表的多表查询,不管来多少表,都按那个格式走就对了。
SELECT vname,tname FROM vip,`types`,likes WHERE likes.`tid`= types.`tid`
AND likes.`vid` =vip.`vid`
内连接法
SELECT vname,tname FROM vip INNER JOIN `TYPES` INNER JOIN likes ON likes.`tid`= types.`tid`
AND likes.`vid` =vip.`vid`
三,外连接
1,左外连接
就是以左表为基准,事事依着左面,宛如一条舔狗。
比如左表有10行数据,右表有8行数据,那么左表10行数据全部显示,右表不够的用null补齐拼成10行
再比如左表有10行数据,右表有12行数据,那么左表10行数据全部显示,右表多余的删除掉,拼成10行数据
2,右外连接
3,全外连接