摘要:本文主要根据网上一些面试题和自己面试遇到的数据库问题进行总结,主要偏重于mysql数据库,供大家学习参考,也方便自己温故知新,如有侵权,请联系删除。
SQL数据库结构化查询语句
DDL(Data Definition Language)数据库定义语言:
CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME
DML(Data Manipulation Language)数据操纵语言:
SELECT、INSERT、UPDATE、DELETE、MERGE、CALL、EXPLAIN PLAN、LOCK TABLE
DCL(Database Control Language)数据控制语言:
grant、revoke
数据查询语言DQL:
SELECT
MySQL_基础_DQL数据查询语言
模糊查询
LIKE # 模糊查询,% 任意多个字符,_ 任意单个字符
sql语句优化
1)选择最有效率的表名顺序
数据库的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表将被最先处理
2)WHERE子句中的连接顺序
数据库采用自右而左的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之左,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的之右。
3)SELECT子句中避免使用*号
4)用TRUNCATE替代DELETE
5)多使用内部函数提高SQL效率
6)使用表或列的别名
7)善用索引
8)避免在索引列上使用NOT,避免在索引列上使用计算
参考文章:数据库面试题(开发者必看)
sql语句的执行顺序
form—>where—>group by—>聚集函数—>having—>所有表达式—>select—>order by—>limit
MySQL实现分页查询
1)limit 基本实现方式
查询语句:select 表字段1,表字段2,… from 表名 limit 0,10;
limit:属于服务端分页,适合于查询数据量比较大的项目
0:显示第1页 ,10:每页显示10条
limit分页公式:curPage是当前第几页;pageSize是一页多少条记录
limit (curPage-1)*pageSize,pageSize
2)建立主键或者唯一索引
数据量达到了 万级到百万级 sql语句的性能将会影响数据的返回。这时需要利用主键或者唯一索引进行数据分页;
假设主键或者唯一索引为 good_id
收到客户端{pageNo:5,pagesize:10}
select * from table where good_id > (pageNo-1)*pageSize limit pageSize;
–返回good_id为40到50之间的数据
3)基于数据再排序
当需要返回的信息为顺序或者倒序时,对上面的语句基于数据再排序。order by ASC/DESC 顺序或倒序 默认为顺序
select * from table where good_id > (pageNo-1)*pageSize order by good_id limit pageSize;
–返回good_id为40到50之间的数据,数据依据good_id顺序排列
参考文章:MySQL实现分页查询
什么叫存储过程
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。
如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程
索引的作用?和它的优点缺点是什么?
索引就是一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。
索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
数据库三大范式
1)第一范式:
A、每一列属性都是不可再分的属性值,确保每一列的原子性
B、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。
2)满足第一范式,并且每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
3)满足第二范式,并且数据不能存在传递关系,即数据库表中的每一列和主键直接相关,而不是间接相关,也就是属性不能传递性依赖于主属性
sql注入,如何避免
sql注入:用户输入的数据,未经检测,变成了sql语句的一部分,造成意外的结果输出。
避免sql注入:避免数据变成代码被执行,对sql语句进行预编译和查询参数绑定,在SQL语句中放置占位符’?’,然后将带有占位符的SQL语句传给数据库编译,执行的时候才将用户输入的数据作为执行的参数传给用户。这样的操作不仅使得SQL语句在书写的时候不再需要拼接,看起来也更直接,而且用户输入的数据也没有机会被送到数据库的SQL解释器被编译执行,也不会越权变成代码。
sql中的连接查询
1)inner join(等值连接或者叫内连接),在两张表进行连接查询时,只保留两张表中完全匹配的结果集。
2).left join(左连接):在两张表进行连接查询时,会返回左表所有的行和和右表中连接字段相等的记录,即使在右表中没有匹配的记录。
3)right join(右连接),在两张表进行连接查询时,会返回右表所有的行和左表中连接字段相等的记录,即使在左表中没有匹配的记录。
4)full join(全外连接),在两张表进行连接查询时,返回左右表中所有的记录和左右表中连接字段相等的记录。MySQL目前不支持此种方式,可以用其他方式替代解决。
什么是触发器?
触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。
可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。
其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。
最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
如果有1000万条数据,执行库查询时如何提高查询效率?
问题分析:从1000万这个数字可以定位到考察数据量特别大的情况下如何提升查询效率。
数据库设计方面
建立索引
数据表分区
尽量使用固定长度的字段
限制字段长度
分表,分库
数据库I/O方面
增加缓冲器
涉及表的级联,不同的表存储在不同的磁盘上,以增加I/O速度
改善物理设备,比如更换固态硬盘
在SQL语句方面
优化SQL语句,较少比较次数
限制返回的记录数,进行分页查询
在Java方面
反复查询,使用preparedStatement减少查询次数
考虑数据缓存,较少数据库访问
参考文章:校招数据库笔试面试题汇总详解
在网上找一些练习题的经典文章
经典SQL练习题(MySQL版)
MySQL经典练习题及答案,常用SQL语句练习50题
写在后面,本文主要参考文档网址: https://yq.aliyun.com/articles/38181