数据库面试题

这篇博客详细介绍了数据库面试中的常见问题,包括基础概念如函数、数据类型、事务特性,数据库原理如索引类型和存储过程,以及查询题和项目场景下的应用。还探讨了MySQL与Oracle的区别,事务的隔离级别,以及如何防止SQL注入。此外,还讨论了数据库优化,如自增主键与UUID的选择。
摘要由CSDN通过智能技术生成

数据库面试题

基础

用过那些常用函数

数学函数
ABS(x) 返回x的绝对值
MOD(x,y) 返回x被y除后的余数
CEIL(x) 返回不小于x的最小整数
FLOOR(x) 返回不大于x的最大整数
ROUND(x) 对x进行四舍五入
字符串函数
CHAR_LENGTH(str) 计算字符串字符个数
INSERT(s1,x,len,s2) 返回字符串s1,其子字符串起始于位置x,被字符串s2取代len个字符
LOWER(str)LCASE(str)UPPER(str)UCASE(str)
REPLACE(s,s1,s2) 返回一个字符串,用字符串s2替代字符串s中所有的字符串s1
时间函数

  • CURDATE() 将当前日期按照"YYYY-MM-DD"或者"YYYYMMDD"格式的值返回
  • CURRENT_TIMESTAMP()、LOCALTIME()、NOW()、SYSDATE() 这四个函数作用相同,返回当前日期和时间值,格式为"YYYY_MM-DD HH:MM:SS"或"YYYYMMDDHHMMSS"
  • DATE_ADD(date,INTERVAL expr type)、ADD_DATE(date,INTERVAL expr type) 返回将起始时间加上expr type之后的时间,比如DATE_ADD(‘2010-12-31 23:59:59’,
    INTERVAL 1 SECOND)表示的就是把第一个时间加1秒
  • DATE_SUB(date,INTERVAL expr type)、SUBDATE(date,INTERVAL expr type) 返回将起始时间减去expr type之后的时间
  • ADDTIME(date,expr)、SUBTIME(date,expr) 前者进行date的时间加操作,后者进行date的时间减操作
  • UNIX_TIMESTAMP()、UNIX_TIMESTAMP(date) 前者返回一个格林尼治标准时间1970-01-01 00:00:00到现在的秒数,后者返回一个格林尼治标准时间1970-01-01 00:00:00到指定时间的秒数
  • YEAR(date)、QUARTER(date)、MINUTE(time)、SECOND(time)
    条件判断函数
    IF(expr,v1,v2) 如果expr是TRUE则返回v1,否则返回v2
    IFNULL(v1,v2) 如果v1不为NULL,则返回v1,否则返回v2
    CASE expr WHEN v1 THEN r1 [WHEN v2 THEN v2] [ELSE rn] END
    其他
    VERSION()
    MD5(str)、PASSWORD(str)
    ENCODE(str, pswd_str) 使用pswd_str作为密码,加密str
    DECODE(crypt_str,pswd_str) 使用pswd_str作为密码,解密加密字符crypt_str,crypt_str是由ENCODE函数返回的字符串

数据类型

数值类型
tinyint、smallint、mediumint、int、integer、bigint、float、double、decimal
字符串类型
Char、varchar、tinyblob、tinytext、blob、text、mediumblob、mediumtext、longtext、longblob
时间类型
Date、time、year、datetime、timestamp

事务特性

原子性 (atomicity):强调事务的不可分割.
一致性 (consistency):事务的执行的前后数据的完整性保持一致.
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
持久性(durability) :事务一旦结束,数据就持久到数据库

事务的安全性问题

脏读 :一个事务读到了另一个事务的未提交的数据
不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.
幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

事务的隔离级别

未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
串行化的 (serializable) :避免以上所有读问题.
Mysql 默认:可重复读
Oracle 默认:读已提交

事务的7个事务传播行为

propagion_XXX :事务的传播行为

  • 保证同一个事务中
    propagion_required: 支持当前事务,如果不存在 就新建一个(默认)
    propagion_supports: 支持当前事务,如果不存在,就不使用事务
    propagion_mandatory: 支持当前事务,如果不存在,抛出异常

  • 保证没有在同一个事务中
    propagion_requires_new: 如果有事务存在,挂起当前事务,创建一个新的事务
    propagion_not_supported: 以非事务方式运行,如果有事务存在,挂起当前事务
    propagion_never: 以非事务方式运行,如果有事务存在,抛出异常
    propagion_nested: 如果当前事务存在,则嵌套事务执行

jdbc连接数据库

存储过程的语法

"Oracle存储过程基本语法 存储过程

CREATE OR REPLACE PROCEDURE 存储过程名
   <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值