【收藏】寫給程序員的 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
數據庫設計的三大範式
- 第一範式:
- 列原子性,保證每一列不可拆分
- 第二範式:
- 前提:滿足第一範式
- 每張表只描述一件事情
- 第三範式:
- 前提:滿足第一、第二範式
- 數據表中的每一列數據都和主鍵直接相關,而不能直接相關
- 規範性和性能的衝突
- 阿里規約:關聯查詢的表不得超過三張。
- 考慮商業化的需求和目標,性能更加重要。
- 在規範性能的情況下,適當考慮規範性。
- 會有故意增加冗餘的字段(從多表查詢變爲單表查詢)
- 會故意增加一些計算列(從大數據量降低爲小數據量的查詢)
常用函數
- 字符串函數(不常用)
- 數值函數
- 日期和時間函數