1.什么是内连接、外连接、交叉连接?
内连接:取两张表符合连接条件的记录
外连接:除取两张表符合连接条件的记录外,还取某张表或两张表中不满足连接条件记录
交叉连接:取两张表所有记录的一一对应
2.MySQL 的内连接、左连接、右连接有什么区别?
内连接:返回两张表符合连接条件的记录
左连接:返回左表的所有记录和右表满足连接条件的记录,如果右表没有满足条件的记录,则以 NULL 填充
右连接:返回右表的所有记录和左表满足连接条件的记录,如果左表没有满足条件的记录,则以 NULL 填充
3.数据库的三大范式
三大范式的作用是减少数据冗余,提高数据完整性
第一范式:确保表中每一列是不可分割的
第二范式:在第一范式的基础上,要求数据库表中的每一列和主键直接相关,而不能只与主键的某一部分相关
第三范式:在第二范式的基础上,消除非主键列对主键的传递依赖
4.varchar 与 char 的区别?
-
varchar 是不定长字符串,char 是定长字符串
-
varchar:插入数据是多长就按照多长存储,char:插入数据长度小于 char 的固定长度就用空格补齐
-
varchar 存取速度慢于 char
-
varchar 最大长度为 65532,char 最大长度 255
5.blob 和 text 有什么区别?
-
blob 存储二进制数据,text 存储大字符串
-
blob 没有字符集,text 有字符集,并根据字符集的校对规则对值进行排序和比较
6.DATETIME 和 TIMESTAMP 的异同?
相同:
-
日期时间存储格式一致
-
都可存储日期时间
-
都能存储微妙,小数点后六位
不同:
-
前者无默认值,后者有
-
前者无时区信息,后者有
-
前者占8个字节,后者4个
-
前者日期范围:
1000-01-01 00:00:00.000000
~9999-12-31 23:59:59.999999
,后者日期范围:1970-01-01 00:00:01.000000
UTC到 ``2038-01-09 03:14:07.999999
UTC
7.MySQL 中 in 和 exists 的区别?
-
查询两张表大小相当,二者差别不大
-
如果两个表一个是大表一个是小表,则子查询表大的用
exits
,小的用in
-
如果查询语句用到了 not in,那么内外表都要全部扫描,不用索引,而 not exits 的子查询能用索引。因此无论表大还是表小,后者性能更高
8.MySQL 里记录货币用什么字段类型比较好?
decimal 和 numric
9.MySQL 怎么存储 emoji?
MySQL 的 utf8 字符集仅支持最多 3 个字节的 UTF-8 字符,但是 emoji 表情(😊)是 4 个字节的 UTF-8 字符,所以在 MySQL 中存储 emoji 表情时,需要使用 utf8mb4 字符集。
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
MySQL 8.0 已经默认支持 utf8mb4 字符集,可以通过 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
查看。
10.drop、delete 与 truncate 的区别?
区别 | delete | truncate | drop |
---|---|---|---|
类型 | 属于 DML | 属于 DDL | 属于 DDL |
回滚 | 可回滚 | 不可回滚 | 不可回滚 |
删除内容 | 表结构还在,删除表的全部或者一部分数据行 | 表结构还在,删除表中的所有数据 | 从数据库中删除表,所有数据行,索引和权限也会被删除 |
删除速度 | 删除速度慢,需要逐行删除 | 删除速度快 | 删除速度最快 |
11. UNION 与 UNION ALL 的区别?
-
UNION 在表连接时会筛掉重复的记录行,UNION ALL 不会
-
UNION ALL性能更高
12.count(1)、count(*) 与 count(列名) 的区别?
-
count(1):统计所有行数,但不关注行中的具体列数据,不会忽略 NULL 值
-
count(*):统计所有行数并检查行中的每列是否为 null ,不忽略 NULL 值
-
count(列名):统计那一列所有行,会忽略 NULL 值
13.一条 SQL 查询语句的执行顺序?
-
FROM:对 FROM 子句中的左表<left_table>和右表<right_table>执行笛卡儿积(Cartesianproduct),产生虚拟表 VT1
-
ON:对虚拟表 VT1 应用 ON 筛选,只有那些符合<join_condition>的行才被插入虚拟表 VT2 中
-
JOIN:如果指定了 OUTER JOIN(如 LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表 VT2 中,产生虚拟表 VT3。如果 FROM 子句包含两个以上表,则对上一个连接生成的结果表 VT3 和下一个表重复执行步骤 1)~步骤 3),直到处理完所有的表为止
-
WHERE:对虚拟表 VT3 应用 WHERE 过滤条件,只有符合<where_condition>的记录才被插入虚拟表 VT4 中
-
GROUP BY:根据 GROUP BY 子句中的列,对 VT4 中的记录进行分组操作,产生 VT5
-
CUBE|ROLLUP:对表 VT5 进行 CUBE 或 ROLLUP 操作,产生表 VT6
-
HAVING:对虚拟表 VT6 应用 HAVING 过滤器,只有符合<having_condition>的记录才被插入虚拟表 VT7 中。
-
SELECT:第二次执行 SELECT 操作,选择指定的列,插入到虚拟表 VT8 中
-
DISTINCT:去除重复数据,产生虚拟表 VT9
-
ORDER BY:将虚拟表 VT9 中的记录按照<order_by_list>进行排序操作,产生虚拟表 VT10。11)
-
LIMIT:取出指定行的记录,产生虚拟表 VT11,并返回给查询用户
14.介绍一下 MySQL bin 目录下的可执行文件
-
mysql:客户端程序,连接 MySQL 服务器
-
mysqldump:MySQL 数据库备份工具,用于创建一个或多个 MySQL 数据库级别的 SQL 转储文件,包含表结构和数据。对数据备份、迁移、恢复非常重要
-
mysqladmin:MySQL 管理工具。可创建、删除数据库,查看 MySQL 服务器状态
-
mysqlcheck:MySQL 提供的命令行工具,用于检查、修复、分析和优化数据库表,对数据库的维护和性能优化非常有用
-
mysqlimport:用于从文本文件中导入数据到数据库表中,非常适合用于批量导入数据。
-
mysqlshow:用于显示 MySQL 数据库服务器中的数据库、表、列等信息。
-
mysqlbinlog:用于查看 MySQL 二进制日志文件的内容,可以用于恢复数据、查看数据变更等。
15.用过哪些 MySQL 函数?
用过哪些字符串函数来处理文本?
-
CONCAT()
: 连接两个或多个字符串。 -
LENGTH()
: 返回字符串的长度。 -
SUBSTRING()
: 从字符串中提取子字符串。 -
REPLACE()
: 替换字符串中的某部分。 -
LOWER()
和UPPER()
: 分别将字符串转换为小写或大写。 -
TRIM()
: 去除字符串两侧的空格或其他指定字符。
用过哪些数值函数用过哪些数值函数?
-
ABS()
: 返回一个数的绝对值。 -
CEILING()
: 返回大于或等于给定数值的最小整数。 -
FLOOR()
: 返回小于或等于给定数值的最大整数。 -
ROUND()
: 四舍五入到指定的小数位数。 -
MOD()