MySQL中in和exists区别?

exists用于对外表记录做筛选:

  • exists会遍历外查询表,将外查询表的每一行,代入内查询进行判断。当exists里的条件语句能够返回记录行时,条件就为真,返回外表当前记录。反之如果exists里的条件语句不能返回记录行,条件为假,则外表当前记录被丢弃。
select a.* from A awhere exists(select 1 from B b where a.id=b.id)

in是先把后边的语句查出来放到临时表中,然后遍历临时表,将临时表的每一行,代入外查询去查找。

select * from A where id in(select id from B)

使用场景:

  • 子查询的表比较大的时候,使用exists可以有效减少总的循环次数来提升速度;
  • 当外查询的表比较大的时候,使用in可以有效减少对外查询表循环遍历来提升速度;

什么是存储过程?有哪些优缺点?

存贮过程: 存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合。用户可以像使用自定义的函数―样重复调用这些存储过程,实现它所定义的操作。这个过程经编译和优化后存储在数据库服务器中,使用时只要调用即可。
优点:

  • 存储过程和函数可以重复使用,减轻开发人员的工作量。类似于java中方法可以多次调用;
  • 减少网络流量,存储过程和函数位于服务器上,调用的时候只需要传递名称和参数即可;
  • 减少数据在数据库和应用服务器之间的传输,可以提高数据处理的效率;
  • 将一些业务逻辑在数据库层面来实现,可以减少代码层面的业务处理。
    缺点:
  • 互联网项目中,迭代太快,项目的生命周期也比较短,在这样的情况下,存储过程的管理不是特别友好,同时复用性也没有写在服务层那么好。

MySQL 执行查询的过程?

  1. 客户端通过 TCP 连接发送连接请求到 MySQL 连接器,连接器会对该请求进行权限验证及连接资源分配。
  2. 客户端发送一条查询给服务器,服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果,否则进入下一阶段。
  3. 分析器进行词法分析,语法分析。
  4. 优化器执行计划生成,索引选择。
  5. 最后交给执行器,操作引擎,返回结果。

删除表的三种方式?

  1. delete from

    • delete 是删除表中的数据,不删除表结构,速度最慢,但可以与where连用,可以删除指定的行;
      delete from user;  -- 删除user表的所有数据
      delete from user where user_id = 1; --删除user表的指定记录
  2. drop table

    • drop 是直接删除表信息,速度最快,但是无法找回数据 ;
      drop table user; -- 删除 user 表
  3. truncate (table)

    • truncate 是删除表数据,不删除表的结构,速度排第二,但不能与where一起使用;
      truncate table user; --删除 user 表
      三种方式的区别:

count(1)、count(*) 与 count(列名) 的区别?

执行效果:

  • count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL ;
  • count(1) 计算一共有多少符合条件的行 ,用1代表代码行,在统计结果的时候,不会忽略列值为NULL;
  • count(列名) 只包括列名那一列,在统计结果的时候,会忽略列值为空(这⾥的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。

执行速度:

  • 列名为主键,count(列名)会比count(1)快;
  • 列名不为主键,count(1)会比count(列名)快;
  • 如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*);
  • 如果有主键,则 select count(主键)的执行效率是最优的;
  • 如果表只有一个字段,则 select count(*)最优。

MySQL 的内连接、左连接、右连接有有什么区别?

MySQL的连接主要分为内连接外连接,外连接常⽤的有左连接右连接

  1. inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
  2. left join左连接在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录
  3. right join右连接在两张表进行连接查询时,会返回表所有的行,即使在左表中没有匹配的记录。

MySQL使用枚举类型的优缺点?

优点:

  1. 减少空间:枚举类型只存储了预先定义好的几种取值,而不是存储字符串或数字,因此能够节省存储空间。
  2. 限制字段值:使用枚举类型可以限制字段的取值范围,确保存储的数据的正确性。
  3. 数据安全:使用枚举类型可以降低因人为失误导致的数据错误的风险。
  4. 提高代码可读性:使用枚举类型可以使代码更容易理解,因为每个枚举值都有其明确的含义。

缺点:

  1. 可扩展性差:枚举类型定义了一组固定的值,如果要增加或删除枚举类型的值,需要修改数据库的表结构。
  2. 代码依赖性高:枚举类型定义在数据库中,如果需要修改枚举类型的值,需要修改代码。
  3. 限制:枚举类型只允许存储预先定义的有限集合中的值,不能存储其他值。