MySQL面试题-表连接

356 阅读5分钟

  1. 什么是子查询 条件:一条SQL语句的查询结果做为另一条查询语句的条件或查询结果 嵌套:多条SQL语句嵌套使用,内部的SQL查询语句称为子查询。
  2. 子查询的三种情况 子查询是单行单列的情况:结果集是一个值,父查询使用:=、 <、 > 等运算符 -- 查询工资最高的员工是谁? select * from employee where salary=(select max(salary) from employee); 子查询是多行单列的情况:结果集类似于一个数组,父查询使用:in 运算符 -- 查询工资最高的员工是谁? select * from employee where salary=(select max(salary) from employee); 子查询是多行多列的情况:结果集类似于一张虚拟表,不能用于where条件,用于select子句中做为子表 -- 1) 查询出2011年以后入职的员工信息 -- 2) 查询所有的部门信息,与上面的虚拟表中的信息比对,找出所有部门ID相等的员工。 select * from dept d, (select * from employee where join_date > '2011-1-1') e where e.dept_id = d.id; – 使用表连接: select d., e. from dept d inner join employee e on d.id = e.dept_id where e.join_date > ‘2011-1-1’
  3. mysql中 in 和 exists 区别 mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。 如果查询的两个表大小相当,那么用in和exists差别不大。 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。 not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
  4. varchar与char的区别 char的特点 char表示定长字符串,长度是固定的; 如果插入数据的长度小于char的固定长度时,则用空格填充; 因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法; 对于char来说,最多能存放的字符个数为255,和编码无关 varchar的特点 varchar表示可变长字符串,长度是可变的; 插入的数据是多长,就按照多长来存储; varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法; 对于varchar来说,最多能存放的字符个数为65532 总之,结合性能角度(char更快)和节省磁盘空间角度(varchar更小),具体情况还需具体来设计数据库才是妥当的做法。

4. varchar(50)中50的涵义 最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)。在早期 MySQL 版本中, 50 代表字节数,现在代表字符数。 5. int(20)中20的涵义 是指显示字符的长度。20表示最大显示宽度为20,但仍占4字节存储,存储范围不变; 不影响内部存储,只是影响带 zerofill 定义的 int 时,前面补多少个 0,易于报表展示 6. mysql为什么这么设计 对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样; 7. mysql中int(10)和char(10)以及varchar(10)的区别 int(10)的10表示显示的数据的长度,不是存储数据的大小;chart(10)和varchar(10)的10表示存储数据的大小,即表示存储多少个字符。 int(10) 10位的数据长度 9999999999,占32个字节,int型4位 char(10) 10位固定字符串,不足补空格 最多10个字符 varchar(10) 10位可变字符串,不足补空格 最多10个字符 char(10)表示存储定长的10个字符,不足10个就用空格补齐,占用更多的存储空间 varchar(10)表示存储10个变长的字符,存储多少个就是多少个,空格也按一个字符存储,这一点是和char(10)的空格不同的,char(10)的空格表示占位不算一个字符 8. FLOAT和DOUBLE的区别是什么? FLOAT类型数据可以存储至多8位十进制数,并在内存中占4字节。 DOUBLE类型数据可以存储至多18位十进制数,并在内存中占8字节。 9. UNION与UNION ALL的区别? 如果使用UNION ALL,不会合并重复的记录行 效率 UNION 高于 UNION ALL 小编分类整理了许多java进阶学习材料和BAT面试题,需要资料的请加QQ群:731611386就能领取2019年java进阶学习资料和BAT面试题以及《Effective Java》(第3版)电子版书籍。