几道 SQL 笔试题、面试题总结

2017-08-01mysql

最近一个星期面试了四五家公司,面试的岗位是 Java 实习生。发现每家公司的 SQL 知识考察的内容都不尽相同,并且本身的 SQL 知识更是弱项。为此在菜鸟教程上复习了 SQL 知识,也总结了这几天来的面试题目。git


 笔试整理github

一、给相似以下的表,要求用 SQL 求各班不一样性别成绩超过80分的平均数:面试

表:test_avgsql

NAME SCORE SEX CLASS
A 66 1
B 86 2
C 90 1
D 82 2

 

 

 

 

 

考察知识点:数据库

1)AVG() 函数。AVG 函数返回数值列的平均值。NULL 值不包括在计算中。segmentfault

2)GROUP BY。GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组(注意分组与排序的区别)函数

SELECT CLASS,SEX,AVG(SCORE) FROM test_avg WHERE SCORE > 80 GROUP BY SEX,CLASS;

 

二、给相似以下两张表,查出 employee 中全部名字及其 boss 名字,没有的赋值为“未知”:工具

表:employee编码

id name leader_id
1 aaa null
2 bbb 1
3 ccc 2
4 ddd 1

 

 

 

 

 

 

表:boss

id name
1 A
2 B

 

 

 

考察知识点:

1)IFNULL() 函数。IFNULL(表达式,填充数据) 函数:若查出数据为 Null,用填充数据填充。

2)左链接。例如:table1 LEFT JOIN table2 ON 限制条件时,table1 的数据全查出来。

SELECT employee.`name`,IFNULL(boss.'name','未知') as leader FROM employee LEFT JOIN boss ON employee.leader = boss.id;

 

三、用 SQL 语句建一份表:

以下为我建的一份表,注意表的引擎、字符集编码

CREATE TABLE IF NOT EXISTS 'table1' (
    'id' INT UNSIGNED AUTO_INCREMENT,
    'title' VARCHAR(100) NOT NULL,
    'author' VARCHAR(40) NOT NULL,
    'submission_date' DATE,
    PRIMARY KEY ('id')
)ENGINE=InnoDB DEFAULT CHARSET=utf-8;

 

四、如何查询一份表里最后 10 条记录的前 7 条记录?

思路:在子查询里用倒序按 id 查出(由于主键 id 确定是按顺序的)最后的 10 条记录,而后用 LIMIT 方法查询里面的前 7 条

考察知识点:

1)思惟可否灵活变通,运用倒序查询最后 10 条记录。

2)LIMIT 分页。语法:SELECT * FROM table LIMIT [offset,] rows。其中,offset 为偏移量,可选,基 0;rows 是查询的行数。

SELECT name FROM (SELECT name FROM test_avg ORDER BY `name` DESC LIMIT 10) as id ORDER BY name LIMIT 7 

 

 面试整理

一、对数据库范式的理解?

  • 范式(NF):“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。很晦涩吧?实际上你能够把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。(个人简单总结:表里属性间的合理化程度
  • 数据库范式也分为 1NF,2NF,3NF,BCNF,4NF,5NF。符合高一级范式的设计,一定符合低一级范式。
  • 1NF 的定义为:符合 1NF 的关系中的每一个属性都不可再分。(1NF 是全部关系型数据库的最基本要求)
  • 1NF 缺点:数据冗余过大,插入异常,删除异常,修改异常的问题
  • 2NF 在 1NF 的基础之上,消除了非主属性对于码的部分函数依赖
  • 3NF 在 2NF 的基础之上,消除了非主属性对于码的传递函数依赖

 

二、MySQL 如何进行分页?有什么缺点?

MySQL 使用 LIMIT 关键字进行分页操做。说明在上面第 4 点有说明。

缺点:一言以蔽之,就是越日后分页,LIMIT 语句的偏移量就会越大,速度也会明显变慢。此时,咱们能够经过子查询的方式来提升分页效率,大体以下:

SELECT * FROM articles WHERE id >= (SELECT id FROM articles  WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10 

 

三、MySQL 索引如何实现?有什么不足?

简单理解,索引就是为了加快查询速度的。而索引是独立存储的内容,所以当数据量很大是,更新表要同时更新索引,形成了更新的速度降低

这里我参考了两篇文章,地址以下:

http://fangjian0423.github.io/2017/07/05/mysql-index-summary/#more

http://www.javashuo.com/article/p-auvdsifi-bd.html

 


通过几回面试,知道了本身的 SQL 知识的缺少,如今总结并恶补了一番,感受思路清晰了不少。SQL 知识大体是经常使用函数、增删查改、约束、数据类型的使用,要想真正记在脑海仍是要多实际编写代码。能够尽可能在命令行窗口编写 SQL 语句来加深印象,逐渐远离可视化工具。

但愿个人总结也对你有帮助。:)

相关文章
相关标签/搜索