# MySQL簡介安裝及數據類型
[TOC]
## 導學
運行中的程序,其相關的運行期間數據是存儲在內存中的。程序一旦關閉,內存中的數據在程序關閉后就會被清理掉。比如在之前的JavaWeb學習中,我們發現有很多的數據我們都是存儲在服務器對象中的,一旦服務器重啟或者關閉,這些數據就會消失。
但是,我們的類似用戶數據要放置在持久化介質中,那么這些數據我們想要持久化保存下來,需要如何處理呢?這個時候就需要使用到無論在哪種開發中都非常重要的數據庫了。
## 數據庫簡介
### 什么是數據庫
>[info]數據庫-電子化的文件柜
數據庫是“按照數據結構來組織、存儲和管理數據的倉庫”。是一個長期存儲在計算機內的、有組織的、可共享的、統一管理的大量數據的集合。
數據庫是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合,可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、查詢、更新、刪除等操作。
數據庫是存放數據的倉庫。它的存儲空間很大,可以存放百萬條、千萬條、上億條數據。但是數據庫并不是隨意地將數據進行存放,是有一定的規則的,否則查詢的效率會很低。當今世界是一個充滿著數據的世界,充斥著大量的數據。即這個互聯網世界就是數據世界。數據的來源有很多,比如出行記錄、消費記錄、瀏覽的網頁、發送的消息等等。除了文本類型的數據,圖像、音樂、聲音都是數據。
**數據庫是一個按數據結構來存儲和管理數據的計算機軟件系統。數據庫的概念實際包括兩層意思:**
* [ ] 數據庫是一個實體,它是能夠合理保管數據的“倉庫”,用戶在該“倉庫”中存放要管理的事務數據,“數據”和“庫”兩個概念結合成為數據庫。
* [ ] 數據庫是數據管理的新方法和技術,它能更合適的組織數據、更方便的維護數據、更嚴密的控制數據和更有效的利用數據。
### 常用數據庫
* Oracle
* DB2(IBM)
* SQL Server(微軟)
* Postgre SQL
* MySQL
### MySQL數據庫
MySQL是一個關系型數據庫管理系統(這種所謂的"關系型"可以理解為"表格"的概念,,一個關系型數據庫由一個或數個表格組成,表與表之間可以通過主鍵與外鍵建立關系。),由瑞典MySQL AB 公司開發,屬于Oracle旗下產品。MySQL 是最流行的關系型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的RDBMS(Relational Database Management System,關系數據庫管理系統) 應用軟件之一。
MySQL是一種關系型數據庫管理系統,關系型數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。
對于一般的個人使用者和中小型企業來說,MySQL提供的功能已經綽綽有余,而且由于 MySQL是開放源碼,免費的軟件,因此可以大大降低總體擁有成本。
>[info] MySQL數據庫是我們今后將要學習的主要數據庫。
### MySQL術語
大多數時候,我們所講的數據庫,其實指的是數據庫系統。
接下來,我們來看看數據庫系統的主要結構:
**數據庫系統(Database System):DBS**
* 數據庫(Database)
* 數據庫管理系統(Database Managerment System):DBMS
主要是用來定義數據管理和維護數據的腳手架
* 應用開發工具
* 管理員及用戶
對于數據庫管理而言,我們主要是通過SQL語言進行管理,它并不是MySQL所獨有的。每個不同品牌的數據庫都有這類語言進行數據管理,這些SQL語言其實都是大同小異的,學習MySQL中的SQL語言后,能夠很快的上手其他種類的SQL語言。
**SQL語言(Structured Query Language)是一門結構化查詢語言**,以下是其包含的語言種類:
* DDL 數據定義語言 (定義數據庫、表、視圖、索引、觸發器等)
* DML 數據操作語言 (數據增刪改)
* DQL 數據查詢語言 (數據查詢)
* DCL 數據控制語言 (權限設置)
其實學習數據庫,主要是學習數據庫語言的使用。
## 數據庫下載安裝與卸載
### 下載
下載地址:[https://dev.mysql.com/downloads/mysql/](https://dev.mysql.com/downloads/mysql/)
>[warning] 要注意的問題:選擇你所用的操作系統和操作系統的位數
選擇安裝版本 社區版
1. msi版本


2. zip版本


解壓后

>[info] 需要注意的兩個文件夾:
> bin:放的是一系列MySql命令;
> data:放置的是MySql的數據庫文件
### 安裝
1. msi版安裝
>[warning] 如果已安裝要卸載重新安裝,需要把`C:\ProgramData\MySQL`目錄刪除,否則在安裝的最后一步會出現問題。
**安裝需要注意的幾個問題**
* 在配置步驟中,字符編碼選擇`UTF8`;
* 端口默認是`3306`,可以修改,但是不建議;
* 創建`root`賬號的密碼;防止記不住,建議123456
操作步驟:

**選項解釋:**
Developer Default:安裝MySQL服務器以及開發MySQL應用所需的工具。工具包括開發和管理服務器的GUI工作臺、訪問操作數據的Excel插件、與Visual Studio集成開發的插件、通過NET/Java/C/C++/OBDC等訪問數據的連接器、例子和教程、開發文檔。
Server only:僅安裝MySQL服務器,適用于部署MySQL服務器。


選擇development computer,占用內存較少。

密碼123456
最后一路next,直到最后finish
驗證:
打開計算機管理

進入安裝目錄中的bin目錄,輸入mysql -u root -p
2. zip安裝
關于zip版的安裝自學完成
### 配置環境變量
關于環境變量的Path的解釋:.exe .bat 是Windows平臺的可執行文件,為了方便,我們把MySQL的安裝目錄下的bin目錄追加到`Path`中(**在Windows10以下的系統中要特別注意不要把Path的變量值全部都替換掉,要在后面追加,加上;**)

### 完全卸載MySQL
1. 停止mysql

2. 管理面板-卸載程序

3. 刪除安裝文件夾,一般安裝在c盤下,尤其是`C:\ProgramData\MySQL`目錄刪除
4. 刪除注冊表
`win+r`,打開運行,輸入regedit;

打開注冊表后,刪除這三個文件下的MySQL,如果沒有就不用管了。

5. 清空垃圾桶
## 數據庫登錄退出常用命令
該命令指的是在命令提示符中的常用命令。命令行結束符默認是`;或\g`,如`select database();`
****常用SQL語句:****
**登錄**:` mysql -u root -p或mysql -u root -p加上密碼`
**退出**:`exit或quit或\q`
**獲得版本號**: `mysql -V 或mysql --version`
**得到mysql的版本信息**:`select version()`
**登陸的同時打開指定的數據庫**:`mysql -u root -p 密碼 -D db_name`
**顯示現有的庫**:`show databases`
**查看打開的數據庫**:`select database();`
**打開幫助手冊**:`help或\h或?`
**取消當前命令的執行**:`\c-寫在命令后面`
**得到登陸的用戶**:`select user()`
**得到當前的日期時間**:`select now()`
>[success]**SQL語句語法規范:**
1. 常用MySQL的關鍵字需要大寫(小寫也支持),庫名、表名、字段等使用小寫
2. SQL語句支持折行操作,拆分時不能把完整的單詞拆開
3. 數據庫名稱、表名稱、字段名稱不要使用MySQL的保留字,如果必須使用,需要使用反引號''將其括起來
## 創建和管理數據庫
**創建數據庫**:`CREATE DATABASE或|SCHEMA db_name;(數據庫名稱最好有意義,名稱不要包含特殊字符或MySQL關鍵字)`
**查看當前服務器下的全部數據庫**:`SHOW DATABASES或SCHEMAS;`
**檢測數據庫名稱是否存在,如果不存在則進行創建**:`CREATE DATABASE IF NOT EXISTS db_name;`
**查看上一步的警告信息**:`SHOW WARNINGS;`
**創建數據庫的同時制定編碼方式**:`CREATE DATABASE IF NOT EXISTS test3 DEFAULT CHARACTER SET 'UTF-8';`
**修改指定數據庫的編碼方式**:`ALTER DATABASE db_name DEFAULT CHARACTER SET = charset;`
**打開指定數據庫**:`USE db_name;`
**得到當前打開的數據庫**:`SELECT DATABASE();`
**刪除指定的數據庫**:`DROP DATABASE db_name;`
**如果數據庫存在則刪除**:`DROP DATABASE IF EXISTS db_name;`
**查看指定數據庫的詳細信息**:`SHOW CREATE DATABASE db_name;`
**mysql 注釋**:` #注釋 或者 --注釋`
## 數據表及相關操作
**數據表-用于保存數據**
1. 數據表是數據庫最重要的組成部分之一,數據保存在數據表中。說mysql是關系型數據庫的原因是表和表之間存在關系。
2. 數據表由行(row)和列(column)來組成。
3. 每個數據表中至少有一列,行可以有零行、一行或多行來組成。
4. 表名要求唯一,不要包含特殊字符,最好含義明確。
**創建表**
~~~
CREATE TABLE IF NOT EXISTS tbl_name(
字段名稱 字段類型[完整性約束條件],
字段名稱 字段類型[完整性約束條件],
. . .
)ENGINE=存儲引擎 CHARSET=編碼方式;
~~~
**表的字段類型**
* 數值型
整數、浮點數、定點數
* 字符串類型
* 時間日期類型
## MySQL常用數據類型
### 數值型
**整型**

其中布爾型等價于`TINYINT(1)`,0為false,其余為true。
`TINYINT(1)`,中的1的意思是值存入的數據的長度為1。不是數據的大小。
在mysql中沒有專門的布爾類型,但是在實際的開發中我們通常有這樣的需求,此時一般的處理方式就是在數據庫中存儲數字,不同的數字表示不同的狀態。
以后在數據庫設計時,遇到表示狀態或者是標識的字段,就可以用不同的數字來進行區分
**浮點型**

對于**decimal**類型的數據,我們稱之為定點數,浮點數的計算存在一定誤差,使用**decimal**類型可以提高計算精度,常用于銀行業務和工資,價格等數據的存儲。
MySQL 是支持所有標準 SQL 中的數值類型。在絕大多數的應用程序中,我們使用 INT 和 DECIMAL 類型就可以了。
### 字符串類型

一般最常使用 VARCHAR(可變長度)、CHAR(定長)、TEXT(長文本類型,例如博客文章等數據),其他不常用的還有 LONGTEXT、TINYTEXT等等。
>[warning]VARCHAR 和 CHAR 的區別:例如 VARCHAR 定義的長度為 200,在使用的時候是存儲了 4 個字符長度的字符串,那么在數據庫中只會占用 4 個字符的數據空間,CHAR 是定長,無論存儲多少數據,在數據空間中都會占用到定義的長度。
### 日期型

一般使用 DATETIME (用日期和時間構成)、DATE(只是表示日期),其他不常用的還有 TIME 、YEAR等等。
### 二進制數據的存放
在數據中,我們一般不會去存儲類似照片、視頻這樣的二進制文件,而是把這些文件在服務器中的訪問地址用字符串類型的數據進行存儲。
>[info] 在定義數據庫字段名稱時,由于數據庫不區分大小寫,所以,一般碰到了多個單詞,我們用`_`分隔
## 案例:建表
~~~
-- 創建用戶表所在庫
CREATE DATABASE IF NOT EXISTS dodoke DEFAULT CHARACTER SET 'UTF8';
-- 打開dodoke
USE dodoke;
-- 用戶表 dodoke_user
CREATE TABLE IF NOT EXISTS dodoke_user(
id INT,
username VARCHAR(20),
password CHAR(32),
email VARCHAR(50),
age TINYINT,
card CHAR(18),
tel CHAR(11),
salary FLOAT(8,2),
married TINYINT(1),
addr VARCHAR(100),
sex ENUM('男','女','保密')
)ENGINE=INNODB CHARSET=UTF8;
-- 查看當前數據庫下的數據表
SHOW TABLES;
-- 查看dodoke_user表的詳細信息
SHOW CREATE TABLE dodoke_user;
-- 通過三種方式查看指定數據表的表結構
SHOW COLUMNS FROM dodoke_user;
DESC dodoke_user;
DESCRIBE dodoke_user;
-- 最后刪除dodoke_user數據表
DROP TABLE dodoke_user;
~~~
## 完整型約束
在一個完整的表中,是需要對表中的字段進行相關約束的。
>[info] 使用約束主要是為了保證數據表中數據的合法性以及相對完整性。
約束類型包括:
* **主鍵約束**(PRIMARY KEY:PK):唯一的確定在數據表中的記錄,而且主鍵約束是不能為空的,我們一般使用沒有業務含義的字段去進行主鍵定義,在MySQL中可以使用自增長類型的主鍵或者可以使用 UUID 。一個表只能有一個主鍵。
* **非空約束**(NOT NULL)
* **默認值**(DEFAULT)
* **唯一約束**(UNIQUE KEY:UK):在一個表中可以有多個字段是唯一的
* **外鍵約束**(FOREIGN KEY:FK)
* **自增約束**(AUTO_INCREMENT):只能用于數值列,而且配合索引使用
* 正數約束(UNSIGNED):將對應字段下的值定義為正數,不建議使用,可能會給程序計算帶來一定的異常!
* 零填充:(ZEROFILL):在數值前自動填充0,建議在后端代碼中完善格式化,不建議數據庫格式化!
~~~sql
-- 創建表的語句
CREATE TABLE student_info1 (
id INT AUTO_INCREMENT PRIMARY KEY,
-- 建立非空和唯一性 約束
code CHAR(2) NOT NULL UNIQUE,
name VARCHAR(50) NOT NULL DEFAULT 'zhangsan',
age INT(12) NOT NULL,
weight DECIMAL(10, 2),
birthday DATE NOT NULL,
in_school DATETIME NOT NULL,
description TEXT
)
CREATE TABLE student_account1 (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
account VARCHAR(20),
password VARCHAR(20),
-- 設置本表的student_id字段作為外鍵,關聯到父表的主鍵字段id
CONSTRAINT FK_SI_SA_01 FOREIGN KEY (student_id) REFERENCES student_info1(id)
)
~~~
**外鍵的使用條件:**
* 兩個表必須是InnoDB表,MyISAM表暫時不支持外鍵
* 外鍵列必須建立了索引,MySQL 4.1.2以后的版本在建立外鍵時會自動創建索引,但如果在較早的版本則需要顯式建立;
* 外鍵字段是依賴于已存在表的一個主鍵(一般是主鍵),所以一定要先有主表。
* 外鍵關系的兩個表的列必須是數據類型相似,也就是可以相互轉換類型的列,比如int和tinyint可以,而int和char則不可以;
**外鍵的好處:**
可以使得兩張表關聯,保證數據的一致性和實現一些級聯操作。
>[warning]在建立了外鍵關系的兩個表中,一般是子表通過某個字段引用主表的**主鍵**數據。如果父表中有與子表相關聯的記錄,不能更新或刪除父表中的相關聯的記錄,同樣要刪除主表(父表),需要先刪除子表。如果要去對外鍵數據進行處理,一般我們會先解除外鍵關系,然后對數據處理后再加上。
**動態刪除與添加外鍵:**
~~~
-- 動態刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
-- 動態添加外鍵
ALTER TABLE 表名 ADD [CONSTRAINT 外鍵名稱] FOREIGN KEY(外鍵字段) REFERENCES 主表(主鍵字段);
-- 動態添加外鍵之前表中的記錄一定是合法的記錄,沒有臟值(不符合外鍵對應主表中字段包含的值),否則外鍵添加不會成功
~~~
**外鍵的約束操作**
* **CASCADE**:從父表進行刪除或更新,子表也跟著刪除或更新,級聯的操作
* **SET NULL**:從父表刪除或更新記錄,并且設置子表的外鍵列為NULL
* **NO ACTION**|**RESTRIC**:拒絕對父表做更新或刪除操作
~~~
ALTER TABLE 表名 ADD [CONSTRAINT 外鍵名稱] FOREIGN KEY(外鍵字段) REFERENCES 主表(主鍵字段)
ON DELETE CASCADE ON UPDATE CASCDE;
~~~