MySQL指南之基礎知識

張風捷特烈發表於2019-03-16

個人所有文章整理在此篇,將陸續更新收錄:知無涯,行者之路莫言終(我的程式設計之路)


零、如何訪問伺服器上的mysql資料庫

1.遠端連線服務端的MySQL

開發3306埠(埠號為你伺服器上的MySQL訪問埠)

開放3306埠.png


2.本地訪問服務端

這裡貌似不允許連線

本地訪問服務端.png

|-- 在服務端進入mysql語句執行: 開放許可權----------------- 
Grant all privileges on *.* to 'root'@'%' identified by '你的密碼' with grant option;
複製程式碼

訪問遠端Mysql成功.png

MySQL指南之基礎知識


一、關於MySQL的相關知識

簡單來說MySQL服務就是向若干個客戶端提供並運算元據的軟體

客戶端與服務端.png

mysql的結構

MySQL伺服器中有若干資料庫,資料庫中又有若干表,表中又有若干記錄,記錄又有若干欄位
複製程式碼

mysql的結構.png

記錄對映實體在應用中使用

在Java中有一種資料型別叫List,也就是列表,對資料庫的操作會將一張表通過實體類對映成物件列表
其中一條記錄對於List中的一個物件,物件的屬性和表的欄位往往一一對應,
能夠遠端獲取資料產生實體類列表,就可以填充客戶端UI,這便讓資料庫在程式語言中有了價值
這也使得前後端在應用層面實現分離,明確介面後,各端可以專注各自的業務
複製程式碼

資料.png

實體.png


1.MySQL的檔案目錄

將解壓檔案bin的路徑配置到環境變數path下,以便在任意地方都可執行命令

MySQL指南之基礎知識


2.安裝MySQL服務及基本指令
# 安裝MySQL 將會在服務裡出現一個叫MYSQL57的服務
mysqld install MYSQL57
# 啟動MySQL
net start mysql
# 停止MySQL
net stop mysql 
# 設定密碼
update mysql.user set authentication_string=password('xxxx') where user='root';
# 資料庫備份
mysqldump -uroot -p mycode > D:\\backupSql\\android.sql
# 資料庫還原
mysql -u root -p mycode < D:\\backupSql\\android.sql
# 進入MySQl 全寫 和 簡寫
mysql --host=toly1994.com --user=root --port=3306 --password
mysql -htoly1994.com -P3306 -uroot -p 
# 退出
quit 或 exit 或 \q
# MySQL資料庫版本
mysql -V 或 mysql --version
複製程式碼

3.MySQL的配置檔案

my.ini 檔案

[mysql]
default-character-set=utf8  # 設定mysql客戶端預設字符集
[mysqld]
port = 3306     #設定3306埠
basedir=D:B\mysql-5.7.22-winx64         # 設定mysql的安裝目錄
datadir=D:\B\mysql-5.7.22-winx64\data       # 設定mysql資料庫的資料的存放目錄
max_connections=200         # 允許最大連線數
character-set-server=utf8       # 服務端使用的字符集 預設為8位元編碼的latin1字符集
default-storage-engine=INNODB       # 建立新表時將使用的預設儲存引擎
explicit_defaults_for_timestamp=true        # 開啟查詢快取
# skip-grant-tables         # 無需密碼登入mysql
複製程式碼

4.忘了密碼怎麼辦
1. net stop mysql 
2. 開啟my.ini檔案 在[mysqld]下 新增skip-grant-tables
3. net start mysql
4. mysql -u root -p 回車 回車
5. use mysql
6. update user set authentication_string=password("xxxx") where user="root";
6. flush privileges;
7. quit
8. 將my.ini檔案的skip-grant-tables註釋掉
9. 重啟服務
複製程式碼

5.其他用法
|---修改前面符號
並沒有什麼實際用處,就是將`mysql>` 換一下,適於裝B症患者...

mysql -uroot -p --prompt toly-》
toly-》use zoom
Database changed
toly-》

|--- mysql中有內建函式使用
mysql> SELECT VERSION(), CURRENT_DATE,NOW(),USER();
+-----------+--------------+---------------------+----------------+
| VERSION() | CURRENT_DATE | NOW()               | USER()         |
+-----------+--------------+---------------------+----------------+
| 5.7.22    | 2019-03-15   | 2019-03-15 18:51:12 | root@localhost |
+-----------+--------------+---------------------+----------------+

|---mysql中支援簡單計算
mysql> SELECT 1+1, (4+1)*5,4/5,5^8;
+-----+---------+--------+-----+
| 1+1 | (4+1)*5 | 4/5    | 5^8 |
+-----+---------+--------+-----+
|   2 |      25 | 0.8000 |  13 |
+-----+---------+--------+-----+
複製程式碼

二、MySQL中的資料型別

下面的四張表就是下一篇練習MySQL的資源,我真是太聰明瞭...如果有錯歡迎指出,我及時update

|----整型----|
+-----------+-----------+----------------------+-----------------+--------------+
| 型別      | 位元組數    | 有符號範圍           | 無符號範圍      | 描述         |
+-----------+-----------+----------------------+-----------------+--------------+
| TINYINT   |         1 | -2⁷ ~ 2⁷-1           | 0 ~ 2⁸-1        | 很小整數     |
| SMALLINT  |         2 | -2¹⁶ ~ 2¹⁶-1         | 0 ~ 2¹⁶-1       | 小整數       |
| MEDIUMINT |         3 | -2²⁴ ~ 2²⁴-1         | 0 ~ 2²⁴-1       | 中等整數     |
| INT       |         4 | -2³² ~ 2³²-1         | 0 ~ 2³²-1       | 標準整數     |
| BIGINT    |         8 | -2⁶⁴ ~ 2⁶⁴-1         | 0 ~ 2⁶⁴-1       | 大整數       |
+-----------+-----------+----------------------+-----------------+--------------+
複製程式碼

|----小數型----|
+---------+-----------+-------------------------------------------------------+----------------------------+
| 型別    | 位元組數    | 取值範圍                                              | 描述                       |
+---------+-----------+-------------------------------------------------------+----------------------------+
| FLOAT   |         4 | ±1.175494351E-38 ~ ±3.402823466E+38                   | 單精度浮點                 |
| DOUBLE  |         8 | ±2.2250738585072014E-308 ~ ±1.7976931348623157E+308   | 雙精度浮點                 |
| DECIMAL |      不定 | 是M,D而定                                             | M:總位數,D:小數位數        |
+---------+-----------+-------------------------------------------------------+----------------------------+
複製程式碼

|----字元型----|
+------------+-------------------+---------------+-----------------------------------+
| 型別       | 最大位元組數        | 最大範圍      | 描述                              |
+------------+-------------------+---------------+-----------------------------------+
| CHAR(M)    | M                 | L或M或M×W     | 定長字串,M 0~255                |
| VARCHAR(M) | M                 | L+1或 L+2     | 變長字串,L<=M且M[0,65535]       |
| TINYTEXT   | 2⁸-1              | L+1個位元組     | 微型的字串                      |
| TEXT       | 2¹⁶-1             | L+2個位元組     | 小型的字串                      |
| MEDIUMTEXT | 2²⁴-1             | L+3個位元組     | 中型的字串                      |
| LONGTEXT   | 2³²-1             | L+4個位元組     | 大型的字串                      |
| ENUM       | 1或2位元組          | 65535         | 列舉                              |
| SET        | 1、2、3、4或8     | 64            | 集合                              |
+------------+-------------------+---------------+-----------------------------------+
複製程式碼

|----時間型----|
+-----------+-----------+---------------------------------------------------------------+------------------------------------+
| 型別      | 位元組數    | 取值範圍                                                      | 描述                               |
+-----------+-----------+---------------------------------------------------------------+------------------------------------+
| YEAR      |         1 | 1901~2155                                                     | 年YYYY                             |
| DATE      |         3 | 1000-01-01 ~ 9999-12-31                                       | 日期YYYY-MM-DD                     |
| TIME      |         3 | -838:59:59[.000000] ~ 838:59:59[.000000]                      | 時間HH:MM:SS                       |
| DATETIME  |         8 | 1000-01-01 00:00:00[.000000] ~ 9999-12-31 23:59:59[.999999]  | 日期加時間YYYY-MM-DD HH:MM:SS      |
| TIMESTAMP |         4 | 1970-01-01 00:00:01[.000000] ~ 2038-01-19 03:14:07[.999999]  | 時間戳                             |
+-----------+-----------+---------------------------------------------------------------+------------------------------------+
複製程式碼

|----二進位制型----|
+--------------+-----------------+---------------+--------------------+
| 型別         | 最大位元組數      | 最大範圍      | 描述               |
+--------------+-----------------+---------------+--------------------+
| BIT(M)       | M               | (M+7)/8       | 定長字串         |
| BINARY(M)    | M               | M             | 定長字串         |
| VARBINARY(M) | M               | L+1 或 L+2    | 變長字串         |
| TINYBLOB     | 2⁸-1            | L+1           | 微型的字串       |
| BLOB         | 2¹⁶-1           | L+2個位元組     | 小型的字串       |
| MEDIUMBLOB   | 2²⁴-1           | L+3個位元組     | 中型的字串       |
| LONGBLOB     | 2³²-1           | L+4個位元組     | 大型的字串       |
+--------------+-----------------+---------------+--------------------+
複製程式碼

這裡只是簡單的列一下,更多的詳情介紹詳見此篇:MySQL入門系列:MySQL資料型別


三、其他點

1.結束符:; \g \G

; \g效果一樣,\G 豎直分佈

mysql> SELECT * FROM  number;
+-----------+------+----------------------+----------------+--------------+
| type      | byte | range_singed         | range_unsinged | info         |
+-----------+------+----------------------+----------------+--------------+
| TINYINT   |    1 | -2⁷ ~ 2⁷-1           | 0 ~ 2⁸-1       | 很小整數     |
| SMALLINT  |    2 | -2¹⁶ ~ 2¹⁶-1         | 0 ~ 2¹⁶-1      | 小整數       |
| MEDIUMINT |    3 | -2²⁴ ~ 2²⁴-1         | 0 ~ 2²⁴-1      | 中等整數     |
| INT       |    4 | -2³² ~ 2³²-1         | 0 ~ 2³²-1      | 標準整數     |
| BIGINT    |    8 | -2⁶⁴ ~ 2⁶⁴-1         | 0 ~ 2⁶⁴-1      | 大整數       |
+-----------+------+----------------------+----------------+--------------+

mysql> SELECT * FROM  number\g
+-----------+------+----------------------+----------------+--------------+
| type      | byte | range_singed         | range_unsinged | info         |
+-----------+------+----------------------+----------------+--------------+
| TINYINT   |    1 | -2⁷ ~ 2⁷-1           | 0 ~ 2⁸-1       | 很小整數     |
| SMALLINT  |    2 | -2¹⁶ ~ 2¹⁶-1         | 0 ~ 2¹⁶-1      | 小整數       |
| MEDIUMINT |    3 | -2²⁴ ~ 2²⁴-1         | 0 ~ 2²⁴-1      | 中等整數     |
| INT       |    4 | -2³² ~ 2³²-1         | 0 ~ 2³²-1      | 標準整數     |
| BIGINT    |    8 | -2⁶⁴ ~ 2⁶⁴-1         | 0 ~ 2⁶⁴-1      | 大整數       |
+-----------+------+----------------------+----------------+--------------+

mysql> SELECT * FROM  number\G
*************************** 1. row ***************************
          type: TINYINT
          byte: 1
  range_singed: -2⁷ ~ 2⁷-1
range_unsinged: 0 ~ 2⁸-1
          info: 很小整數
*************************** 2. row ***************************
          type: SMALLINT
          byte: 2
  range_singed: -2¹⁶ ~ 2¹⁶-1
range_unsinged: 0 ~ 2¹⁶-1
          info: 小整數
*************************** 3. row ***************************
          type: MEDIUMINT
          byte: 3
  range_singed: -2²⁴ ~ 2²⁴-1
range_unsinged: 0 ~ 2²⁴-1
          info: 中等整數
*************************** 4. row ***************************
          type: INT
          byte: 4
  range_singed: -2³² ~ 2³²-1
range_unsinged: 0 ~ 2³²-1
          info: 標準整數
*************************** 5. row ***************************
          type: BIGINT
          byte: 8
  range_singed: -2⁶⁴ ~ 2⁶⁴-1
range_unsinged: 0 ~ 2⁶⁴-1
          info: 大整數
複製程式碼

2.清除命令
`\c 或 Ctrl+c`
複製程式碼

3.一條語句可換行
mysql> SELECT
    ->  *
    -> FROM
    ->  number;
+-----------+------+----------------------+----------------+--------------+
| type      | byte | range_singed         | range_unsinged | info         |
+-----------+------+----------------------+----------------+--------------+
| TINYINT   |    1 | -2⁷ ~ 2⁷-1           | 0 ~ 2⁸-1       | 很小整數     |
| SMALLINT  |    2 | -2¹⁶ ~ 2¹⁶-1         | 0 ~ 2¹⁶-1      | 小整數       |
| MEDIUMINT |    3 | -2²⁴ ~ 2²⁴-1         | 0 ~ 2²⁴-1      | 中等整數     |
| INT       |    4 | -2³² ~ 2³²-1         | 0 ~ 2³²-1      | 標準整數     |
| BIGINT    |    8 | -2⁶⁴ ~ 2⁶⁴-1         | 0 ~ 2⁶⁴-1      | 大整數       |
+-----------+------+----------------------+----------------+--------------+
複製程式碼

4.一行可執行多條語句
mysql> SELECT * FROM  number;SELECT * FROM  number_float;
+-----------+------+----------------------+----------------+--------------+
| type      | byte | range_singed         | range_unsinged | info         |
+-----------+------+----------------------+----------------+--------------+
| TINYINT   |    1 | -2⁷ ~ 2⁷-1           | 0 ~ 2⁸-1       | 很小整數     |
| SMALLINT  |    2 | -2¹⁶ ~ 2¹⁶-1         | 0 ~ 2¹⁶-1      | 小整數       |
| MEDIUMINT |    3 | -2²⁴ ~ 2²⁴-1         | 0 ~ 2²⁴-1      | 中等整數     |
| INT       |    4 | -2³² ~ 2³²-1         | 0 ~ 2³²-1      | 標準整數     |
| BIGINT    |    8 | -2⁶⁴ ~ 2⁶⁴-1         | 0 ~ 2⁶⁴-1      | 大整數       |
+-----------+------+----------------------+----------------+--------------+
5 rows in set (0.00 sec)

+---------+------+-------------------------------------------------------+----------------------------+
| type    | byte | num_range                                             | info                       |
+---------+------+-------------------------------------------------------+----------------------------+
| FLOAT   |    4 | ±1.175494351E-38 ~ ±3.402823466E+38                   | 單精度浮點                 |
| DOUBLE  |    8 | ±2.2250738585072014E-308 ~ ±1.7976931348623157E+308   | 雙精度浮點                 |
| DECIMAL | NULL | 是M,D而定                                             | M:總位數,D:小數位數        |
+---------+------+-------------------------------------------------------+----------------------------+
複製程式碼
5.select可以通過逗號拼表
mysql> select 'a','b','c','d';
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
複製程式碼

四、資料庫正規化

1.先對接一下,簡單描述相關概念
關係:  表/若干元組的集合
元組:  一行/一條記錄/一個實體物件
屬性:   一列/欄位
分量:  元組中的一個屬性值/一個實體物件的某一欄位
域:    屬性實際取值範圍

超鍵:能夠唯一標識一條記錄的屬性或屬性集(可含多個屬性)
候選鍵/候選碼:能夠唯一標識一條記錄的屬集(不含多餘屬性)
主鍵/主碼:一個[候選鍵]作為主鍵

主屬性:[候選鍵]中的屬性
非主屬性:[非候選鍵]中的屬性
複製程式碼

2.ER圖

er圖.png

簡單分析一下文章與評論.png


3.第一正規化:1NF
在關係模型中,對於新增的一個規範要求,所有的域都應該是原子性的
即資料庫表的每一列(屬性)都是不可分割的原子資料項。
即實體中的某個屬性有多個值時,必須拆分為不同的屬性。
在符合第一正規化(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分
複製程式碼

這裡的價格成了二維,不符合第一正規化,應該展平

不符合

拆分


4.第二正規化:2NF
在第一正規化的基礎上:
[非主屬性]對[主屬性]不存在部分函式依賴關係
複製程式碼
商品名 供應商 標準價格 價格 差價 供應商電話 分類
小刀 晨光文具 1.00 1.00 0 7654321 文具
鉛筆 得力文具 1.00 1.50 0.5 1234567 文具
卷筆刀 晨光文具 5.00 5.00 0 7654321 文具
練字本 得力文具 2.00 2.00 0 1234567 文具
小刀 得力文具 1.00 1.20 0.2 1234567 文具
插入異常:A實體依賴於B實體,B實體的缺失而使A實體表示異常
|-- 

更新異常:更新A表的某一屬性,需要多行進行更新
|-- 如果更新[得力文具]的供應商電話,需要更新三條資料

刪除異常:A實體刪除一行,導致B實體資訊丟失
|-- 當刪除第一、三行,晨光文具的供應商資訊丟失

資料冗餘:相同的資料在多張表中存在,或表的某屬性可通過計算得到(如平均值、和等)
|-- 得力文具以及電話號碼重複了很多次。標準價格,價格和差價之間有運算關係
複製程式碼
商品id 商品名 標準價格 分類
1 小刀 1.00 文具
2 鉛筆 1.00 文具
3 卷筆刀 5.00 文具
4 練字本 2.00 文具
供應id 供應商 供應商電話
1 晨光文具 7654321
2 得力文具 1234567
供應id 商品id 差價
1 1 0
1 3 0
2 2 0.5
2 4 0
2 1 0.2

5.第三正規化:3NF
在第二正規化的基礎上:
[非主屬性]對任意[主屬性]不存在傳遞性函式依賴

|--- 比如下面的(書名)-->(作者)-->(年代)  
複製程式碼
書名 作者 年代 上架建議 價格
海子 海子 近現代 詩集 30.6
朝花夕拾 老舍 近現代 名著 19.9
你是人間的四月天 林徽因 近現代 經典文學 25.6
資治通鑑 司馬光 北宋 古典文學 55.6

6.BC正規化:BCNF
在第三正規化的基礎上:
[所有屬性]對任意[主屬性]不存在傳遞性依賴
複製程式碼

第四、第五正規化暫不提及,注意正規化並非嚴格的標準。
可以根據實際情況反正規化化來用空間換時間

這篇就到這裡,以後想到什麼再加吧。

相關文章