实时更新

你用过哪些数据库?

  • mysql
  • redis

mysql 和 redis 的区别?

比较点 Mysql Redis
数据库类型 关系型 非关系型
作用
  • 持久化层
  • 存储需要持久化的数据,数据存在硬盘中
  • 一般是缓存层
  • 作为缓存数据库的存在
  • 数据存储在内存中
读取速度 较慢 基于内存,所以很快
运行机制
  • 每次请求访问数据库,都存在 I/O 操作
  • 反复访问数据库会造成系统负载过高
  • 优先查询缓存数据库,读取速度快
  • 查不到再查 Mysql 数据库

什么是关系型数据库?

依赖关系模型来创建的数据库

什么是非关系型数据库?

就是非关系模型的数据库

有哪些常见的关系型数据库?

Mysql、Oracle、SQL Server

有哪些常见的非关系型数据库?

Redis、MongoDB、HBASE

关系型数据库中的关系模型是指?

一对一、一对多、多对多都是关系模型,就是二维表格模型

非关系模型有哪些?

  • 列模型:Hbase
  • 键值对模型:redis
  • 文档类模型:mongoDB

关系型数据库的特点和缺点

  • 特点:数据存储在磁盘中,安全性高,容易理解
  • 缺点:不节省空间

非关系型数据库的特点和缺点

  • 特点:数据存储在内存,节省磁盘空间,效率也高
  • 缺点:也因为数据没存在磁盘,安全性较低,但目前很多非关系型数据库开始支持将数据转存到磁盘了

Mysql 的 SQL 语句区分大小写吗?

不区分

buffer 和 cache 的区别

  • cache 是写缓存
  • buffer 是读缓存

exists 和 in 的区别

  • 无论哪个表大,用 not exists 都比 not in 快
  • 内表比外表大时用 exists,外表比内表大时用 in

Mysql 是如何进行缓存数据的?

将查询的语句、执行结果等进行 hash,并保留在 cache 中

通过 explain,我们可以获取到哪些信息?

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用或实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

Mysql 中,查询语句中,关键字的执行顺序

  1. from
  2. on
  3. join
  4. where
  5. group by
  6. having
  7. select
  8. distinct
  9. order by
  10. limit

当数据库不存在时创建数据库

create database if not exists test

如何查看有什么数据库?

show databases

当数据库存在时则删除数据库

drop database if exists test

如何选择数据库?

use database_name

如何查看表结构?

desc 表名

如何查看数据表的创建语句?

show create table yytest;

有哪些常见的修改表操作?

  • 修改表名
  • 修改字段数据类型或字段名
  • 增加、删除字段
  • 修改字段的排列位置

distinct 关键字有什么用?

去重

distinct 可以在哪里使用?

只能在 select 语句中使用

如果想对多个字段去重,要怎么写?

SELECT DISTINCT <字段名>,<字段名> FROM <表名>;

limit 的初始位置是多少?

0

limit + offset 怎么用?

LIMIT 记录数 offset 初始位置

order by 默认是倒序还是顺序?

升序,asc

倒序是怎么写?

desc

like 关键字中,% 的含义

通配符,代表任意长度的字符

like 匹配的字符串区分大小写吗?

不区分,但可以添加 binary 关键字,这样就可以区分了

group by 多个字段的时候,可以讲下分组原理吗?

  1. 先按照第一个字段分组,如果第一个字段有相同值,则把分组结果再按第二个字段进行分组,以此类推
  2. 如果第一个字段分组每个值都是唯一的,则不会再按照第二个字段进行分组了

group_concat 有什么用?

可以将分组后每个组内的值都显示出来

having 可以代替 where 吗?

不可以

什么时候用 having?

group by 后使用 having 来过滤数据

having 和 where 的区别?

where having
不可以使用聚合函数 可以使用聚合函数
数据 group by 过滤 数据 group by 过滤
查询条件中不可以使用字段别名 查询条件中可以使用字段别名
用于过滤数据行 用于过滤分组后的结果集 
根据数据表的字段直接过滤 根据已查询出的字段进行过滤 

有哪些多表查询

  • cross join:交叉连接
  • inner join:内连接
  • left join:左外连接
  • right join:右外连接
  • union、union all:全连接

左连接、右连接、全连接的区别

  • 左连接会获取左表的所有记录,右表为空时补 null
  • 右连接会获取右表的所有记录,左表为空时补 null
  • 全连接会获取左右表的所有数据

什么是子查询?

  • 将一个查询语句嵌套在另一个查询语句中
  • 子查询可以实现多表查询
  • 子查询也能在 select、update、delete 语句中使用,还能进行多层嵌套

左右连接跟内连接的区别

左右连接为外连接,而内连接最大的不同在于,匹配成功的数据,只有两个表都有才会返回,相当于交集的关系

补充面试题:和全连接的区别

  • 在 mysql 中的全连接可以通过 union 来实现
  • 全连接是左连接和右连接的结合,只要有匹配成功的数据,无论两个表是否都有匹配的数据,都会返回,如果没有则显示 null,相当于并集

子查询和内连接、左外连接的区别

  • 子查询是指在一个查询语句上嵌套另一个查询语句,会写多条 select 语句
  • 内连接、外连接虽然也是多表查询,但是只有写一个 select 关键字

模糊查询的语句

  • like:% 代表任意,_ 代表任意单个字符,[ ] 范围内取一个字符
  • regexp:正则表达式

Mysql 默认的存储引擎是?

目前最新版的是 InnoDB

Mysql存储引擎有哪些?

InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE

Mysql innodb 存储引擎是什么概念?

  • 现在 innodb 是 Mysql 的默认存储引擎
  • 它为处理巨大数据量时的最大性能设计
  • 它提供了具有事务、回滚、崩溃修复能力、多版本并发控制的事务安全表

如何查看 Mysql 有什么存储引擎

show engines

MyIsam 存储引擎和 InnoDB 存储引擎的区别

比较点 MyIsam InnoDB
事务 不支持 支持
外键 不支持 支持
全文索引 支持 不支持,但可以通过插件支持,且效果更好
只支持表锁 还支持行锁
可移植性 数据以文件方式存储,移植性好 数据量大的时候移植性一般
主键 允许没有任何索引和主键的表存在 没有设置主键会自动生成一个主键
使用场景 执行大量的 select 执行大量的 insert、update

Mysql 存储引擎语句调优有了解吗?

这个忽略算了

在 Mysql 中什么是事务?

  • 事务就是一组具有原子性的操作,保证这一组数据库操作,要么全部成功,要么全部失败
  • 事务能保证数据库从一种一致性状态转换为另一种一致性状态
  • 事务是在引擎层实现的,也就是说并不是所有引擎都可以使用事务
  • MyISAM 就不支持事务,这也是为什么会被 InnoDB 取代的原因
  • 比如:银行转账、购买商品

Mysql 事务的四大特性是什么?

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

什么是索引 

索引就是数据表中对一个或多个列的值进行排序的结构,是帮助 Mysql 高效检索数据的数据结构

索引的优势

  • 提高数据查询的效率,就像书的目录一样
  • 保证行的唯一性
  • 加快表之间的连接
  • 用来排序或分组的字段添加索引可以加快分组或排序

索引的坏处

  • 创建索引和维护索引需要时间成本,成本随数据量增加而增大
  • 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大
  • 加快了查询效率,但降低了增删改效率,因为每次增删改都要动态维护索引,降低了数据的维护速度

什么场景下会用到索引

  • 经常需要查询的列,可以加快查询速度
  • 经常用在连接的列,可以加快连接速度
  • 经常需要排序的列,可以加快排序查询时间
  • 经常跟在 where 后的列,可以加快条件的判断速度
  • 仅对索引查询,当查询的列都在索引字段中,查询效率会更高

索引在什么场景下会失效?

  • 以 % 开头的 like 查询不能利用 B-tree 索引
  • 数据类型出现隐式转换的时候不会使用索引
  • 如果 Mysql 认为使用索引比全表扫描更慢,则不会使用索引
  • 用 or 分割的条件,若 or 前的条件有索引,但 or 后的条件没有索引,则不会使用索引

索引的类型

  • 普通索引
  • 唯一索引
  • 主键索引
  • 全文索引
  • 联合索引
  • 聚集索引
  • 覆盖索引

索引的实现方式(索引的模型)

  • 哈希表
  • 有序数组
  • 搜索树

InnoDB 的索引模型是什么?

B+Tree

为什么是 B+ Tree?

它能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数

普通索引和主键索引的区别?

  • 如果 SQL 语句的查询字段是主键,则只需搜索主键的 B+ 树
  • 如果 SQL 语句的查询字段是非主键,需要先搜索该字段的索引数,得到主键值后,再到主键的 B+ 树搜索一次
  • 普通索引也称非主键索引,需要多搜索一颗索引树,所以在应用中尽量使用主键索引

组合索引的识别原则了解吗?

  • 最左匹配原则,先从最左边的索引开始找,然后依次往后,中间不能跳过
  • 一般将使用最频繁的列放在最左边
  • 符合最左匹配的 SQL 语句的查询效率将大大提升

索引的建立原则

  • 最左匹配原则,先从最左边的索引开始找,然后依次往后,中间不能跳过
  • 尽量选择区分度高的列作为索引,比如身份证号码,而不是选择性别
  • = 和 in 可以乱序,比如 a = 1 and b = 2 and c = 3,建立 (a,b,c) 索引可以任意顺序,mysql 的查询优化器会帮你优化成索引可以识别的形式
  • 索引列不能参与计算,如果索引列参与计算的话,那每次检索的时候,都会先将索引计算一次,再做后续操作,导致成本太大
  • 尽量的扩展索引,不要新建索引,比如表中已经有 a 的索引,现在要加 (a,b) 的索引,直接修改原来的索引就行

自增主键的定义是什么?

NOT NULL PRIMARY KEY AUTO_INCREMENT

怎么查询这条sql 是否有慢查询呢?

查看慢查询日志状态

show variables like 'slow_query_log';

开启慢查询日志(重启后失效)

set global slow_query_log = 1 

疑问:开启慢查询日志后,什么样的 SQL 才会记录到慢查询日志里?

回答:由参数 long_query_time 控制,默认是 10s

查看慢查询时间阈值

show variables like 'long_query_time';

设置慢查询时间阈值

set global long_query_time=4;

当 SQL 语句执行时间大于 4s 的时候就会记录到慢查询日志中,等于 4s 不会记录哦

你了解 SQL 注入吗?

  • SQL 注入也是用户输入的数据,只不过是一串常见的查询或插入 SQL 语句,比如在表单输入框、留言框中输入,然后保存表单
  • 因为客户端或者服务端未经校验或未经充分校验用户输入的数据,让 SQL 注入数据变成了真正可执行的 SQL 命令
  • 攻击者可以通过 SQL 注入来获取一些敏感数据、插入一些恶意数据,可能会影响使用这个数据库的所有应用程序

怎么规避 SQL 注入吗?

可以从客户端和服务端分别做防御,但更侧重于服务端

对于客户端来说

  • 前端限制客户输入 SQL 常见的符号,比如单引号、双引号、等号、空格等等
  • 或者将特殊字符进行转义再传参给服务端

对于服务端来说

  • 不要用拼接的方式插入参数,使用预编译的 SQL 语句,通过参数化的方式插入参数,比如 preparestatement 语句
  • 使用专业的 SQL 注入漏洞扫描工具检查网站
  • 对特殊字符进行转义
  • 严格控制数据类型

Mysql 要支持 emoji 表情怎么做?

  • 设置字段的字符集编码为 utf8mb4
  • 设置表的字符集编码为 utf8mb4

常见视图有哪些?

索引和视图的区别有哪些?

Mysql 面试宝典的更多相关文章

  1. MySQL面试宝典

    ==============================================# 参数==============================================auto ...

  2. .NET工程师面试宝典

    .Net工程师面试笔试宝典 传智播客.Net培训班内部资料 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面试现场带过来的真实笔试面试题,覆盖了主流的 ...

  3. java面试宝典(蓝桥学院)

    Java面试宝典(蓝桥学院) 回答技巧 这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的学生在笔试/面试时更好地赢得好的结果.由于这套试题涉及的范围 ...

  4. Java面试宝典2013版(超长版)

    一. Java基础部分......................................................................................... ...

  5. Java面试宝典2014版

    一. Java基础部分......................................................................................... ...

  6. Java 面试宝典-2017

    http://www.cnblogs.com/nelson-hu/p/7190163.html Java面试宝典-2017   Java面试宝典2017版 一. Java基础部分........... ...

  7. Java面试宝典-2017

    Java面试宝典2017版 一. Java基础部分........................................................................... ...

  8. Java面试宝典2018

    转 Java面试宝典2018 一. Java基础部分…………………………………………………………………………………….. 7 1.一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制 ...

  9. Java面试宝典(2018版)

    置顶 2018年11月10日 23:49:18 我要取一个响亮的昵称 阅读数:8893    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen ...

随机推荐

  1. JAVA虚拟机的组成>从零开始学java系列

    目录 JAVA虚拟机的组成 什么是虚拟机? JAVA虚拟机的组成部分 堆区(堆内存) 方法区 虚拟机栈 本地方法栈 程序计数器 字符串常量池 JAVA虚拟机的组成 什么是虚拟机? 虚拟机是运行在隔离环 ...

  2. 数据库比对工具SQL(表、字段、触发器、索引、视图、存储过程)

    做一个数据库比对小工具,把SQL做一个笔记 SELECT object_id AS ID --表ID,'表' sType,Name --表名FROM sys.tablesORDER BY Name-- ...

  3. Jetpack Compose 1.0 终于要投入使用了!

    前言 Jetpack Compose 是用于构建原生界面的「新款 Android 工具包」.2021 Google IO 大会上,Google宣布:「Jetpack Compose 1.0 即将面世」 ...

  4. 树莓派3B/3B+/4B 刷机装系统烧录镜像教程

    树莓派3B/3B+/4B 刷机装系统烧录镜像教程 树莓派 背景故事 刚拿到树莓派的第一件事,应该就是要装系统了,那么应该怎么操作呢?下面就给大家介绍一下吧. 硬件准备 树莓派:3B/3B+/4B,本教 ...

  5. mybatis中Oracle及mysql插入时自动生成主键以及返回主键

    mysql的方式: 方式一: useGeneratedKeys="true" keyProperty="id" 方式二: <selectKey keyPr ...

  6. Docker部署Mysql实践

    前言:由于Docker部署容器时,没有指定IP,当机器重启后,容器的IP会变化,所以在创建容器的时候,最好能固定IP:同时,在Ubuntu系统中,每次执行命令,都需要root权限,命令需要加sudo标 ...

  7. Linux远程访问控制

    目录 一.SSH远程管理 1.1.定义 1.2.配置OpenSSH服务端 二.sshd服务支持两种验证方式 2.1.密码验证 2.2.使用SSH客户端程序 ssh远程登录 scp远程复制 sftp安全 ...

  8. Golang语言系列-02-常用数据类型

    Go语言常用数据类型 Go 语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串.byte/rune 之外, 还有数组.切片.函数.map.通道(channel).结构体等. Go语言的基本 ...

  9. Ubuntu 查询用户账号

    查看当前登录 who users 查看系统中所有用户: grep bash /etc/passwd XXXX-VirtualBox:~/桌面$ w 13:23:26 up 15 min, 1 user ...

  10. SQL注入:基本查询原理

    SQL注入概述 sql注入不需要精通sql的各种命令,只需要了解几个命令并会使用即可. SQL注入:一种针对于数据库的攻击 现在的web网站都需要数据库的支持. SQL部分重要内容: 库:databa ...