Mysql基础2
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 执行查询的过程?
- 客户端通过 TCP 连接发送连接请求到 MySQL 连接器,连接器会对该请求进行权限验证及连接资源分配。
- 客户端发送一条查询给服务器,服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果,否则进入下一阶段。
- 分析器进行词法分析,语法分析。
- 优化器执行计划生成,索引选择。
- 最后交给执行器,操作引擎,返回结果。
删除表的三种方式?
delete from
- delete 是删除表中的数据,不删除表结构,速度最慢,但可以与where连用,可以删除指定的行;
delete from user; -- 删除user表的所有数据
delete from user where user_id = 1; --删除user表的指定记录
- delete 是删除表中的数据,不删除表结构,速度最慢,但可以与where连用,可以删除指定的行;
drop table
- drop 是直接删除表信息,速度最快,但是无法找回数据 ;
drop table user; -- 删除 user 表
- drop 是直接删除表信息,速度最快,但是无法找回数据 ;
truncate (table)
- truncate 是删除表数据,不删除表的结构,速度排第二,但不能与where一起使用; 三种方式的区别:
truncate table user; --删除 user 表
- truncate 是删除表数据,不删除表的结构,速度排第二,但不能与where一起使用;
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的连接主要分为内连接和外连接,外连接常⽤的有左连接、右连接。
- inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集;
- left join左连接在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
- right join右连接在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
MySQL使用枚举类型的优缺点?
优点:
- 减少空间:枚举类型只存储了预先定义好的几种取值,而不是存储字符串或数字,因此能够节省存储空间。
- 限制字段值:使用枚举类型可以限制字段的取值范围,确保存储的数据的正确性。
- 数据安全:使用枚举类型可以降低因人为失误导致的数据错误的风险。
- 提高代码可读性:使用枚举类型可以使代码更容易理解,因为每个枚举值都有其明确的含义。
缺点:
- 可扩展性差:枚举类型定义了一组固定的值,如果要增加或删除枚举类型的值,需要修改数据库的表结构。
- 代码依赖性高:枚举类型定义在数据库中,如果需要修改枚举类型的值,需要修改代码。
- 限制:枚举类型只允许存储预先定义的有限集合中的值,不能存储其他值。
评论