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 )
    

      

  • 相关阅读:
    前端必看的数据可视化入门指南
    win10下查看进程,杀死进程
    前端如何使用proxyTable和nginx解决跨域问题
    vue-wechat-title动态修改title
    npm与cnpm混用导致的问题
    sass与less对比学习
    nginx,作为前端的你会多少?
    Ubuntu16.04安装python3.7及相应的pip
    漫游Kafka设计篇之性能优化(7)
    漫游Kafka设计篇之消息传输的事务定义(5)
  • 原文地址:https://www.cnblogs.com/knsbyoo/p/9104088.html
Copyright © 2011-2022 走看看