【收藏】写给程序员的 MySQL 高频面试题!
MySQL介绍及配置
-
SQL:structured query language 结构化查询语言。
-
MySQL:数据库管理系统(DBMS) RDBMS 软件 在指定系统上安装的一个软件(服务)。
-
主要管理数据获取存储等功能。包含数据库。
-
数据库管理系统有n个数据库—> 每个数据库有n张表—>每张表里面有n个字段(类型 约束)以及n行记录
-
配置情况:
- 在path: 配置mysql的 bin目录的路径;
- 核心配置文件为my.ini,更改默认编码格式为utf8:
第66行 default-character-set=utf8 第100行 character-set-server=utf8
- 可以愉快地使用了。
-
SQL的分类:
- DDL 数据定义语言 create alter
- DML 数据操作语言 insert delete update
- DQL 数据查询语言 select
- DCL 数据控制语言 grant begin commit flush
MySQL如何选用合适的数据类型
MySQL如何选用合适的数据类型char和varchar
MySQL中int(M)和tinyint(M)数值类型中M值的意义
DDL
1.创建数据库
create database 数据库名称;
2.查看创建数据库的基本信息
show create database 数据库名称;
java | CREATE DATABASE `java` /*!40100 DEFAULT CHARACTER SET latin1 */
3. 创建表
语法: tb_ t_
create table 表名(
字段1 字段类型 [约束],
字段2 字段类型 [约束],
字段3 字段类型 [约束],
.....
字段n 字段类型 [约束],
);
创建用户信息表 (一张表里面必不可少的3个字段: id createtime updatetime)
create table tb_userinfo(
id int(4) unsigned,
name varchar(20),
gender tinyint(1),
salary decimal(10,3),
birthday date,
createtime datetime,
updatetime datetime
);
表 vs 类 (ORM 对象关系映射)
表名===类名
表字段==类属性
表字段类型==类属性的数据类型
3. 删除表
drop table 表名;
4. 操作表结构 alter
新增表字段: alter table 表名 add 新的字段名称 类型 [约束];
alter table tb_userinfo add age tinyint(2) unsigned;
alter table tb_userinfo add age1 tinyint(2) unsigned after gender;
删除指定字段: alter table 表名 drop 字段名称;
alter table tb_userinfo drop age;
修改字段名称: alter table 表名 change age1 age 指定数据类型;
alter table tb_userinfo change age1 age tinyint(2) unsigned;
alter table tb_userinfo change age1 age int(2) unsigned;
mysql> alter table tb_userinfo modify age tinyint(2) unsigned; 只能修改类型
修改表名:
alter table 表名 rename 新的名称;
rename table tb_user to tb_userinfo;
DML
- insert
1.对所有的字段赋值
insert into 表名 values (数据1,....数据n);
- 指定部分字段(推荐)
insert into 表名 (字段1...字段n) values (数据1,....数据n);
修改指定数据库编码:
mysql> ALTER database 数据库名 character set utf8;
- delete
删除指定表里面的一条或者多行记录
delete from 表名; == > 清空表数据
根据条件删除记录: where
delete from 表名 [where 字段名 = 数据 and(or) 字段名 = 数据]; >=0行记录会受影响
- update
修改指定表里面的>=1行记录
update 表名 set 字段名1 = 新的数据1 ,字段名2 = 新的数据2 [where 字段名 = 数据 and(or) 字段名 = 数据];// >=0行记录会受影响
约束
- 空约束:null
- 非空约束:not null
- 默认约束:default
- 唯一性约束:unique
- 主键约束:primary key(行级约束:值唯一且不能为null)
- 外键约束:foreign key(表级约束)
- 在开发中,表里面不允许出现外键。一切表与表的关联关系,在代码层面上进行解决。
DQL
-- 查询语句 select * 通配符(表的所有列)
select * from 表名;
select 字段名称1,字段名称2 from 表1,表2
[where 条件1 and/or 条件2
group by 字段名(对结果分组)
having 条件1(分组后筛选行的操作)
order by 字段1 asc, 字段2 desc(排序)
limit ?,?(限定,多用于分页)
]
- 条件查询
- 字段控制查询
- 聚合函数
- 分组查询
- 关联查询
数据备份
1. 物理内存复制data目录 my.ini(96行) datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data
2. 利用客户端(navicat)的工具功能 转储-->结构+数据
3. 使用命令行:
备份: mysqldump -hip -uroot -proot java_1 > d:\\java_1.sql
mysqldump -hlocalhost -uroot -proot java_1 > d:\\java_1.sql
导入:
source sql文件路径
如何设计一个项目的数据库
- 糟糕的数据库设计
- 数据冗余
- 自带外键,数据插入删除麻烦(屏蔽使用物理外键)
- 程序的性能差
- 数据库设计步骤(个人博客):
- 分析需求,标识实体
- 用户表(用户登录注销,个人信息,写博客,创建分类)
- 分类表(文章分类)
- 文章表(文章的信息)
- 评论表
- 友链表(友情链接信息)
- 自定义表(系统信息,博客标题等)
- 用户表(用户登录注销,个人信息,写博客,创建分类)
- 标识实体之间的关系
- 写博客:user——>blog
- 创建分类:user——>category
- 关注:user——>user
- 评论:user——>user——>blog
数据库设计的三大范式
- 第一范式:
- 列原子性,保证每一列不可拆分
- 第二范式:
- 前提:满足第一范式
- 每张表只描述一件事情
- 第三范式:
- 前提:满足第一、第二范式
- 数据表中的每一列数据都和主键直接相关,而不能直接相关
- 规范性和性能的冲突
- 阿里规约:关联查询的表不得超过三张。
- 考虑商业化的需求和目标,性能更加重要。
- 在规范性能的情况下,适当考虑规范性。
- 会有故意增加冗余的字段(从多表查询变为单表查询)
- 会故意增加一些计算列(从大数据量降低为小数据量的查询)
常用函数
- 字符串函数(不常用)
- 数值函数
- 日期和时间函数