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 )

  

最新文章

  1. Atitit 常用二维码对比(QR、PDF417、DM、汉信码 Aztec code maxicode
  2. 源码安装ipython,并在ipython中整合spark
  3. 07-JAVA继承与接口
  4. Jquery对文本框的值、字符串的验证;正则表达式字符串的验证
  5. Asp.Net 三层架构之泛型应用
  6. Servlet获取参数
  7. Div样式查看器
  8. highcharts 结合phantomjs纯后台生成图片系列二之php
  9. Homework3
  10. Java并发——同步容器与并发容器
  11. HDOJ/HDU 1556 Color the ball(树状数组)
  12. Python自动化运维之25、Ajax
  13. rpm-bin
  14. css3中动画animation的应用
  15. Android UI法宝发展Angrytools
  16. hdu3480 Division(dp平行四边形优化)
  17. Django(三) ORM 数据库操作
  18. hdu4780 最小费用最大流
  19. input框输入金额显示千分位
  20. kafka 配置启动

热门文章

  1. (转)python类class中_init_函数以及参数self的简单解释
  2. unordered_map 遇到 vector subscript out of range 的错误提示
  3. Kubernetes(一)--简介
  4. 将Spring容器跟随系统启动并获取容器对象
  5. 【2008-2009 ICPC NEERC D】Deposits(暴力)
  6. CentOS6安装各种大数据软件 第十章:Spark集群安装和部署
  7. VUE 跳转另一页面返回之前页面刷新,但数据依然存在
  8. python学习第二天 -----2019年4月17日
  9. UART学习之路(一)基本概念
  10. Oracle入门第一天(下)——数据库的管理