zoukankan      html  css  js  c++  java
  • 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 )
    

      

  • 相关阅读:
    [学习笔记]康托展开
    [模板]平衡树
    [题解]涂色
    [学习笔记]Lucas定理
    欧拉定理及其证明
    一些杂题(排列组合
    swift 动画合集
    UIDynamicAnimator UIKit动力学
    swift 当协议遇见了泛型
    Swift 协议
  • 原文地址:https://www.cnblogs.com/knsbyoo/p/9104088.html
Copyright © 2011-2022 走看看