MySql面试题(持续更新)

1. 左连接,右连接,内连接的概念。

  左连接:以左表为主,保留左表的所有数据,并且依次拿每行数据去匹配右表所有行,如果没匹配的,右边表的数据为null。

  右连接:以右表为主,保留右表的所有数据,并且依次拿每行数据去匹配左表的所有行,如果没有匹配的,左边表的数据为null。

  内连接:左表和右表相互匹配的记录。(左连接∩右连接)

  全连接:两张表的所有数据都有保留,并且相互去匹配对方表的所有行,如果没有匹配的,另一部表的数据为null。(左连接+右连接-内连接)MySql没有全连接。

例子:

  有员工表:                         

     

  员工部门中间表:

 

左连接例子:

SELECT * from employee t1 LEFT JOIN employee_department t2 ON t1.id = t2.employee_id

  

分析:可以看出左表的记录都还在,并且每行数据依次去匹配右表所有行的记录。

 右连接例子:

SELECT * from employee t1 RIGHT  JOIN employee_department t2 ON t1.id = t2.employee_id

  

分析:可以看出右表的数据都在,并且每行依次去匹配左表所有行的数据。

内连接例子:

SELECT * from employee t1 INNER  JOIN employee_department t2 ON t1.id = t2.employee_id

  

分析:左表和右表相互匹配的数据,相当于左连接∩右连接

 

 2. 设计表及实现查询

  面试题一:

  问:公司内部的系统设计表,有部门和员工,多对多关系,要求设计表。

  答:设计员工表(表:employee,字段:id,name),部门表(表:department,字段:id,name),员工-部门中间表(表:employee_department,字段:employeeId,departmentId)

  问:要求写出SQL,实现查询员工属于A但是不属于B的集合。

  答:先理清逻辑,查询出属于A的集合,然后剔除掉属于B的集合,这样就会去使用in查询。但是in的查询效率太低了,不能过滤。MySql针对这种情况,有exists关键字,来判断是否存在,而且可以在where条件里面过滤。

SELECT
	t1.employee_id
FROM
	employee_department t1
LEFT JOIN department t2 ON t1.department_id = t2.id
WHERE
	t2.`name` = 'A'
AND NOT EXISTS ( SELECT
	1
FROM
	employee_department t3
LEFT JOIN department t4 ON t3.department_id = t4.id
WHERE
	t4.`name` = 'C'
AND t3.employee_id = t1.employee_id )

  

posted @ 2018-05-29 11:18  knbsyoo  阅读(156)  评论(0编辑  收藏  举报