前言
Mysql入门技能树-连接查询 |
---|
连接查询
INNER JOIN
以下关于INNER JOIN的说法错误的是:
错误的是C
不管是什么连接都是连接的其他表越少性能越好
LEFT JOIN
现有部门表
create table department(
id int primary key auto_increment,
name varchar(256)
)
和员工表
create table employee(
id int primary key auto_increment,
dept_id int,
name varchar(256),
post varchar(16)
)
Joe 想要列出所有的部门,如果这个部门有部门助理(post 为 assistant),则将 stuff 的名字也列出来,那么这个查询应该是:
答案是:C
B只会显示有部门助理的部门,如果部门内无部门助理,则相应部门不会显示,不满足题意列出所有的部门
AD和B一样的效果,因为是在where后限定的post 为 assistant
针对答案C我们换一种写法:
select d.id, d.name, e.name as assistant
from department as d
left join employee as e
on e.dept_id =d.id and e.post=‘assistant’
RIGHT JOIN
现有部门表和员工表
公司经过了一轮调整后,员工信息有些混乱,现在 Joe 要写一个查询,找出部门信息写 错的员工,这些员工所在的部门在 department 表中没有对应记录。
A限定了员工表的id是空,直接排除
C以部门表作为主表,限制部门表id为空,id又是主键自增,正常情况下是无结果的
D右链接返回右表部门表中所有的数据记录和左表中符合条件的数据记录,最后限制了部门表部门id是空的,正常情况下是无结果的
答案是:B
针对答案B我们可以用左连接实现:
select e.id, e.name, e.dept_id, d.name
from employee as e
left join department as d
on e.dept_id =d.id
where d.id is null
CROSS JOIN
Joe 需要生成 goods 表
create table goods(
id int primary key auto_increment,
category varchar(64),
name varchar(256),
price decimal(12, 4),
stock int,
upper_time timestamp
)
中所有T恤(category为T-Shirt)的所有尺寸,尺寸信息在 size 表
create table size(
id int primary key auto_increment,
name varchar(16)
)
中,那么这个查询应该是:
ACD语法错误
答案是B
right join/outter join/full join 跟完表名后都要跟 on 条件
其次mysql 也不支持full join
CROSS JOIN语句又称为交叉连接,当没有使用连接条件时,使用CROSS JOIN语句连接的两张表,每张表中的每行数据都会与另一张表中的所有数据进行连接。当使用连接条件时,会输出符合连接条件的结果数据。