【程序人生】MySQL數據庫

部分參考來源

https://www.cnblogs.com/haiyan123/p/7476241.html
https://www.runoob.com/python3/python3-mysql.html
https://www.cnblogs.com/martinzhang/p/3455681.html
https://www.cnblogs.com/sench/p/8672370.html
http://c.biancheng.net/mysql/
https://www.cnblogs.com/xuchuankun/p/9451495.html
https://blog.csdn.net/Zhihua_W/article/details/80907525
https://blog.csdn.net/yoyofu007/article/details/80333569
https://www.cnblogs.com/ahu-lichang/p/10899747.html
https://www.jianshu.com/p/f5cf992564af
https://www.cnblogs.com/Eva-J/articles/10126413.html
https://www.runoob.com/python3/python3-mysql.html

理論部分

MySQL 是一個關係型數據庫管理系統

數據存儲方式

計算機數據(Data)的存儲一般以硬盤爲數據存儲空間資源,從而保證計算機內的數據能夠持續保存。對於數據的處理,一般會採用數據庫相關的技術進行處理,從而保證數據處理的高效性

採用數據庫的管理模式不僅提高了數據的存儲效率,而且在存儲的層面上提高了數據的安全性通過分類的存儲模式讓數據管理更加安全便捷,更能實現對數據的調用和對比,並且方便查詢等操作的使用

什麼是數據庫

數據庫是數據管理的有效技術是由一批數據構成的有序集合這些數據被存放在結構化的數據表裏數據表之間相互關聯,反映客觀事物間的本質聯繫。數據庫能有效地幫助一個組織或企業科學地管理各類信息資源。

數據是數據庫中存儲的基本對象,是按一定順序排列組合的物理符號。數據有多種表現形式,可以是數字、文字、圖像,甚至是音頻或視頻,它們都可以經過數字化後存入計算機。

數據庫是數據的集合,具有統一的結構形式並存放於統一的存儲介質內,是多種應用數據的集成,並可被各個應用程序所共享

在日常生活中,人們可以直接用中文、英文等自然語言描述客觀事物。在計算機中,則要抽象出對這些事物感興趣的特徵,並組成一個記錄來描述

例如,在學生檔案中,學生信息是由學號、姓名、性別、年齡、籍貫、聯繫電話等特徵組成的,那麼這些具體的特徵值所構成的一條記錄就是一個學生的信息數據,例如“2016010102,張三,男,26,山西,計算機學院,185********”。

值得注意的是,數據的描述形式還不能完全表達其內容,需要經過解釋。例如,對於上面這條學生記錄,瞭解其含義的人會得到這樣的信息:張三的學號是 2016010102,今年 26 歲,山西人,就讀於計算機學院,他的聯繫電話是 185********;而不瞭解其語義的人則無法理解其含義。所以,數據和對數據的解釋是不可分的,數據的解釋是指對數據含義的說明,數據的含義也稱數據的語義,因此數據與其語義密不可分,沒有語義的數據是沒有意義和不完整的。

數據庫的存儲結構

數據庫的存儲結構是指數據庫中的物理數據和邏輯數據的表示形式、物理數據和邏輯數據之間關係映射方式的描述。在數據庫技術中,可以使用兩種形式描述客觀現實的數據:物理數據描述和邏輯數據描述。物理數據和邏輯數據之間的轉換通過數據庫管理系統實現

物理數據描述

物理數據描述是指數據在存儲設備上的存儲方式,物理數據是實際存放在存儲設備上的數據,這些數據也稱爲物理記錄。根據物理記錄存儲的位置,又可以分爲有序存儲和無序存儲。

在物理數據描述中,使用的數據描述術語包括以下各項:

  • 位(bit):二進制的一個單位稱爲位,位只能取 1 或 0。
  • 字節(byte):8 個位稱爲一個字節,可以存放對應 ASCII 碼的一個字符。
  • 字(word):若干個字節組成一個字。一個字所含的二進制的位數稱爲字長,許多計算機的字長是不同的,例如計算機的字長可以是 8 位、16 位、24 位、32 位等。
  • 塊(block):內存儲器和外存儲器交換信息的最小單位,又稱爲物理塊或物理記錄,每塊的大小通常爲 256 字節、512 字節、1024 字節等。
  • 卷(volume):一臺輸入輸出設備所能裝載的全部有用信息,例如磁帶機的一盤磁帶即爲一卷,磁盤設備的一個盤組也是一卷。
  • 無序存儲(unordered):數據記錄按照插入的順序進行存儲。

邏輯數據描述

邏輯數據描述是指用戶或程序員用於操作的數據形式,邏輯數據是一種抽象的概念,是對客觀現實世界的反映和記錄,這些數據也可以稱爲邏輯記錄。

邏輯數據包含兩個層次,一個層次是對客觀現實信息世界的描述,另一個層次是對數據庫管理系統中數據的描述

在對客觀現實信息世界的描述中,使用的術語包括以下幾項:

  • 實體(entity):客觀現實存在的東西使用實體來描述。實體既可以是具體的、有形的對象,也可以是抽象的、無形的對象。例如,一本書是一個有形對象,一次借書過程則是一個無形的對象。
  • 實體集(entities):特性完全相同的同類實體的集合稱爲實體集。例如,一個圖書館所有的書籍是一個實體集,該圖書館的所有借書過程也是一個實體集。
  • 屬性(attribute):實體的特性稱爲屬性。每個屬性都有一個值域,這些值域可以是整數類型、浮點數類型、字符類型或日期類型等。例如,實體書的屬性包括書名、書號、出版日期、頁數、價格以及出版社等,這些屬性對應的值域分別爲字符類型、字符類型、日期類型、整數類型、浮點數類型和字符類型等。
  • 標識符(identifier):能夠唯一地標識每個實體的屬性或屬性集。例如,書的書號屬性是實體書的標識符,借書過程實體的標識符包括借書證號、書號兩個屬性。

這些邏輯數據最終要通過數據庫管理系統來轉換成物理數據。在數據庫管理系統中,描述邏輯數據的術語包括哪些呢?

下面以關係型數據庫管理系統爲例進行介紹:

  • 數據項(data item):也稱爲字段(field),標記實體屬性的可以命名的最小信息單位,數據項的命名一般採用屬性的描述性名稱。這些名稱可以是中文、英文或漢語拼音。
  • 元組(tuple):也稱爲記錄(record),數據項的集合稱爲元組。一個元組表示一個具體的實體
  • 關係(relation):在關係型數據庫系統中,同一類元組所在的集合稱爲關係。關係適用於描述實體集,它包括一個實體集的所有元組。例如,所有的圖書可以組成一個 books 關係。
  • 鍵碼(key):在關係型數據庫系統中,能夠唯一地標識關係中每個元組的數據項或數據項的組合稱爲關係的鍵碼

客觀實體經過兩層邏輯數據的描述,最後轉變成實際存儲的物理數據

數據庫在開發中的作用

從數據庫系統應用角度來看,數據庫系統常見的運行與應用結構有:客戶端/服務器結構瀏覽器/服務器結構

在客戶端/服務器(Client/Server,C/S)結構中,數據庫的使用者(如 DBA、程序設計者)通過命令行客戶端、圖形化界面管理工具或應用程序等連接到數據庫管理系統,可以通過數據庫管理系統查詢和處理存儲在底層數據庫中的各種數據。

數據庫使用者與命令行客戶端、圖形化界面管理工具或應用程序等直接交互,而不與數據庫管理系統直接聯繫

在這種結構中,命令行客戶端、圖形化界面管理工具或應用程序等稱爲“客戶端”或“前臺”,主要完成與數據庫使用者的交互任務;而數據庫管理系統則稱爲“服務器”或“後臺”,主要負責數據管理。這種結構經常被稱爲“C/S”結構

在客戶端/服務器模式中,客戶端和服務器可以同時工作在同一臺計算機上,這種工作方式稱爲“單機方式”;也可以“網絡方式”運行,即服務器被安裝和部署在網絡中某一臺或多臺主機上。

對於客戶端應用程序的開發,目前常用的語言工具主要有 Visual C++、Delphi、.NET 框架、Visual Basic、Python 等。

數據庫能有效存儲數據,讀取數據、查找數據更是方便,其實那些管理軟件就是通過軟件的界面向內部的數據庫進行數據的增、刪、改、查操作。

表關係

關係型數據庫,表與表的記錄之間存在着三種關係:一對多、多對多、一對一的關係。

  • 一對多:在從表(多方)創建一個字段,字段作爲外鍵指向主表(一方)的主鍵
  • 多對多:需要創建第三張表,中間表中至少兩個字段,這兩個字段分別作爲外鍵指向各自一方的主鍵
    在這裏插入圖片描述
  • 一對一:在實際的開發中應用不多,因爲一對一可以創建成一張表

這裏涉及主鍵和外鍵的概念:

  • 主鍵:一張表中,可以用於唯一標識一條記錄的字段組(或者說是屬性組)。給你一個主鍵的值,你就可以找到一條確定的記錄。
  • 外鍵:如果一個表A的主鍵還存在與另一個表B中,那麼B中這個字段可以作爲表A的外鍵。

主鍵是唯一的,用於標識一張表。外鍵可以有多個,用於建立表和表的關係。

MySQL常見的約束條件

限制表中的數據,保證添加到數據表中的數據準確和可靠性。凡是不符合約束的數據,插入時就會失敗。
約束條件在創建表時可以使用, 也可以修改表的時候添加約束條件。

  1. NOT NULL :非空約束,保證字段的值不能爲空
  2. DEFAULT:默認約束,保證字段總會有值,即使沒有插入值,都會有默認值
  3. UNIQUE:唯一,保證唯一性,但是可以爲空,比如座位號
  4. PRIMARY KEY:主建約束,同時保證唯一性和非空
  5. FOREIGN KEY:外鍵約束,用於限制兩個表的關係,保證從表該字段的值來自於主表相關聯的字段的值
  • 表級約束:對多個數據列建立的約束,稱爲表級約束。表級約束只能在列定義後聲明
  • 列級約束:對一個數據列建立的約束,稱爲列級約束。列級約束既可以在列定義時聲明,也可以在列定義後聲明

數據庫設計原則

  1. 命名規則
    數據庫的的名字一般都是很隨意,最好和我們的項目業務一致,這樣比較好進行區分;數據表的命名應儘可能和所服務的業務模塊名一致,也就是我們所存儲實體的名稱,表名應儘量包含與所存放數據對應的單詞,一眼可以看出此表所保存的是什麼;表字段的命名也應儘量保持和實際數據相對應,聯合索引名稱應儘量包含所有索引鍵字段名或縮寫且各字段名在索引名中的順序應與索引鍵在索引中的索引順序一致

  2. 字段類型
    經常需要計算和排序等消耗CPU的字段,應該儘量選擇更爲迅速的字段,如用TIMESTAMP(4個字節,最小值1970-01-01 00:00:00)代替DATATIME(8個字節,最小值1001-01-01 00:00:00),通過整型替代浮點型和字符型;
    變長字段使用varchar,不要使用char,注意設計合適的長度
    對於二進制多媒體數據、流水隊列數據(如日誌)、超大文本數據不要放在數據庫字段中
    業務邏輯執行過程必須讀到的表中字段必須要有初始的值,避免業務讀出爲負或無窮大的值導致程序失敗。

  3. 存儲引擎選擇
    一般情況可以選擇MyISAM存儲引擎,如果需要事務支持必須使用InnoDB存儲引擎。

  4. 表設計
    業務邏輯執行過程必須讀到的表中字段必須要有初始的值,避免業務讀出爲負或無窮大的值導致程序失敗。
    並不需要一定遵守範式理論,字段適度的冗餘,可以讓Query儘量減少Join,提高查詢速度。
    訪問頻率較低的大字段拆分出數據表。
    有些大字段佔用空間多,訪問頻率較其他字段明顯要少很多,這種情況進行拆分,頻繁的查詢中就不需要讀取大字段,造成IO資源的浪費。
    大表可以考慮水平拆分。
    大表影響查詢效率,根據業務特性有很多拆分方式,像根據時間遞增的數據,可以根據時間來分。
    以id劃分的數據,可根據id%數據庫個數的方式來拆分。

  5. 索引設計
    業務需要的相關索引是根據實際的設計所構造sql語句的where條件來確定的,業務不需要的不要建索引,不允許在聯合索引(或主鍵)中存在多餘的字段。特別是該字段根本不會在條件語句中出現。唯一確定一條記錄的一個字段或多個字段要建立主鍵或者唯一索引不能唯一確定一條記錄,爲了提高查詢效率建普通索引。業務使用的表,有些記錄數很少,甚至只有一條記錄,爲了約束的需要,也要建立索引或者設置主鍵。
    對於取值不能重複,經常作爲查詢條件的字段,應該建唯一索引(主鍵默認唯一索引)並且將查詢條件中該字段的條件置於第一個位置沒有必要再建立與該字段有關的聯合索引對於經常查詢的字段,其值不唯一,也應該考慮建立普通索引查詢語句中該字段條件置於第一個位置對聯合索引處理的方法同樣
    業務通過不唯一索引訪問數據時,需要考慮通過該索引值返回的記錄稠密度,原則上可能的稠密度最大不能高於0.2,如果稠密度太大,則不合適建立索引了。需要聯合索引(或聯合主鍵)的數據庫要注意索引的順序。SQL語句中的匹配條件也要跟索引的順序保持一致

  6. 查詢語句設計
    INSERT語句中,根據測試,批量一次插入1000條時效率最高,多於1000條時,要拆分,多次進行同樣的插入,應該合併批量進行。注意query語句的長度要小於mysqld的參數max_allowed_packet查詢條件中各種邏輯操作符性能順序是and、or、in,因此在查詢條件中應該儘量避免使用在大集合中使用in。永遠用小結果集驅動大記錄集,因爲在mysql中,只有NestedJoin一種Join方式,就是說mysql的join是通過嵌套循環來實現的。通過小結果集驅動大記錄集這個原則來減少嵌套循環的循環次數,以減少IO總量及CPU運算次數。儘量優化Nested Join內層循環。只取需要的columns,儘量不要使用select *。僅僅使用最有效的過濾字段,where 字句中的過濾條件少爲好。儘量避免複雜的Join和子查詢。

數據庫三大範式(1NF、2NF、3NF)

三大範式遞次規範,越高的範式數據庫冗餘越小

  1. 1NF —— 強調數據表的原子性
    據庫表的每一列都是不可分割的原子數據項,而不能是集合關係型數據庫自動滿足1NF

  2. 2NF
    2NF在1NF基礎上,消除非主屬性對碼的部分函數依賴,這句話涉及4個概念:“碼”“非主屬性”“部分函數依賴”和“函數依賴”,下面對這些概念進行解讀。
    碼:假設 K 爲某表中的一個屬性或屬性組,若除 K 之外的所有屬性都完全函數依賴於 K(這個“完全”不要漏了),那麼我們稱 K 爲候選碼,簡稱爲碼,即當 K 確定的情況下,該表除 K 之外的所有屬性的值也就隨之確定,那麼 K 就是碼,一個表可以有多個碼
    非主屬性:除去所有的主屬性,剩下的就都是非主屬性
    函數依賴:在一張表中如果屬性x的值確定,那麼屬性y的值也就確定下來了,可以說屬性y函數依賴x,即xy,y=f(x)x→y, y=f(x)
    對函數依賴進行細分後可以劃分爲三大類,分別是:
    完全函數依賴:在一張表中,若 X → Y,且對於 X 的任何一個真子集(假如屬性組 X 包含超過一個屬性的話),X → Y 不成立,那麼我們稱 Y 對於 X 完全函數依賴。
    傳遞函數依賴:假如 Z 函數依賴於 Y,且 Y 函數依賴於 X (嚴格來說還有一個X 不包含於Y,且 Y 不函數依賴於Z的前提條件),那麼我們就稱 Z 傳遞函數依賴於 X。
    部分函數依賴:假如 Y 函數依賴於 X,但同時 Y 並不完全函數依賴於 X,那麼我們就稱 Y 部分函數依賴於 X。
    數據表結構是否符合2NF的判斷方法是:
    1、找出數據表中的碼
    2、根據碼確定主屬性
    3、確定非主屬性
    4、判斷非主屬性是否部分依賴於碼
    消除部分函數依賴,需要將數據表結構拆分成多個數據表

  3. 3NF
    在2NF的基礎之上,消除了非主屬性對於碼的傳遞函數依賴。存在非主屬性對於碼的傳遞函數依賴,則不符合3NF的要求

操作部分

ubuntu安裝MySQL

  1. 下載MySQL源碼包
    https://downloads.mysql.com/archives/community/

在這裏插入圖片描述

  1. 新建一個用戶組mysql
sudo groupadd mysql
cat /etc/group
// 查看所有用戶組

/etc/group 存放的是,組及其屬性信息

mysql : x : 1001 :
羣組名稱 : 羣組密碼 : GID : 附加組

  1. 新建一個系統帳號mysql,並指定系統帳號mysql所屬組爲mysql
    系統帳號不用於登錄,一般是給程序來使用
sudo useradd -r -g mysql mysql 
cat /etc/passwd
// 查看所有用戶

/etc/passwd 存放的是,用戶及其屬性信息

mysql : x : 999:1001 : : /home/mysql :
登錄用戶名 : 密碼 : UID : GID : 全名或註釋 : 用戶主目錄 : 用戶默認使用shel

創建這個單獨的系統帳號mysql指定爲mysqld的運行用戶,是爲了安全,這樣做的好處是,當別人黑了你的數據庫的時候,只能得到系統的mysql權限,得不到整個root的權限

  1. 安裝依賴
sudo apt-get install make cmake gcc g++ bison libncurses5-dev build-essential
  1. 編譯安裝
cmake -DCMAKE_INSTALL_PREFIX=/thirdparty/mysql/ -DMYSQL_DATADIR=/thirdparty/mysql/data -DMYSQL_UNIX_ADDR=/thirdparty/mysql/mysqld.sock -DMYSQL_TCP_PORT=3306 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DSYSCONFDIR=/etc -DMYSQL_USER=mysql -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/thirdparty-source/mysql-boost-5.7.27
cmake參數 描述
-DCMAKE_INSTALL_PREFIX 安裝根目錄
-DMYSQL_DATADIR 數據存儲目錄
-DMYSQL_UNIX_ADDR UNIX socket文件
-DMYSQL_TCP_PORT TCP/IP端口
-DDEFAULT_CHARSET 默認字符集
-DDEFAULT_COLLATION 默認字符校對
-DWITH_READLINE readline庫
-DSYSCONFDIR 配置文件(my.cnf)目錄
-DMYSQL_USER mysqld運行用戶
-DDOWNLOAD_BOOST
-DWITH_BOOST
cmake存儲引擎選項(默認支持csv、myisam、myisammrg、heap) 描述
-DWITH_INNOBASE_STORAGE_ENGINE=1 啓用InnoDB引擎支持
-DWITH_ARCHIVE_STORAGE_ENGINE=1 啓用IARCHIVE引擎支持
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 啓用BLACKHOLE引擎支持
-DWITHOUT_<某種引擎>_STORAGE_ENGINE 除去對某種引擎的支持
make -j4
sudo make install
  1. 添加環境變量
# mysql
export MYSQL_HOME="/thirdparty/mysql":$MYSQL_HOME
export PATH="/thirdparty/mysql/bin":$PATH

配置MySQL

  1. 利用chown將mysql安裝目錄的擁有者改爲前面新建的系統帳號mysql
cd /thirdparty/mysql
sudo chown -R mysql:mysql ./
  1. 初始化mysql,生成mysql臨時密碼
sudo /thirdparty/mysql/bin/mysqld --initialize --user=mysql

2020-03-08T07:06:18.947930Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-03-08T07:06:19.107070Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-03-08T07:06:19.149147Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-03-08T07:06:19.205975Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4f5a149f-610b-11ea-8bfa-f875a4065aa0.
2020-03-08T07:06:19.206823Z 0 [Warning] Gtid table is not ready to be used. Table ‘mysql.gtid_executed’ cannot be opened.
2020-03-08T07:06:19.207402Z 1 [Note] A temporary password is generated for root@localhost: 臨時密碼

  1. 開啓SSL功能
    SSL(Secure Socket Layer:安全套接字層)利用數據加密、身份驗證和消息完整性驗證機制,爲基於TCP等可靠連接的應用層協議提供安全性保證
sudo /thirdparty/mysql/bin/mysql_ssl_rsa_setup

運行完這個命令後,會在,DMYSQL_DATADIR,目錄下生成一些pem文件,這些文件就是用於啓用SSL功能的

  1. 測試啓動MySQL
sudo /thirdparty/mysql/bin/mysqld_safe --user=mysql &

mysqld_safe是個守護進程,加了&設置成後臺程序,也是會卡在這的,需要ctrl+c退出會話,注意只是退出會話,mysqld_safe作爲守護進程是不退出的。這個守護進程當發現mysqld程序退出時,會重新把mysqld啓動。

  1. 啓動MySQL服務,並更改root賬戶密碼
sudo /thirdparty/mysql/support-files/mysql.server start
sudo /thiedparty/mysql/bin/mysql -u root -p

Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.27

Copyright © 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

鍵入:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密碼');

Query OK, 0 rows affected, 1 warning (0.00 sec)

鍵入:

exit;

退出MySQL會話

  1. 停止MySQL服務
sudo /thirdparty/mysql/support-files/mysql.server stop

MySQL創建新用戶並分配權限

root帳戶是無法遠程登陸的,只可以本地登陸
給數據庫創建新用戶:

CREATE USER 新用戶名稱@新用戶IP地址 IDENTIFIED BY "新用戶登錄密碼";

給用戶分配權限:

GRANT 權限1, 權限2, ... ON 數據庫名稱.表名稱 TO 新用戶名稱@新用戶IP地址;

權限列表:

  • SELECT
  • INSERT
  • UPDATE
  • DELETE
  • CREATE
  • DROP
  • INDEX
  • ALTER
  • GRANT
  • REFERENCES
  • RELOAD
  • SHUTDOWN
  • PROCESS
  • FILE

新建用戶,這個用戶對數據庫中的所有表有所有權限

GRANT ALL PRIVILEGES ON 數據庫名稱.* TO 新用戶名稱@新用戶IP地址;

刪除用戶:

DROP USER 新用戶名稱@新用戶IP地址;

查看某個數據庫存在的所有用戶:

SELECT USER,HOST FROM mysql.user;

使用MySQL

基礎操作

  1. 顯示所有存在的數據庫
show databases;
  1. 新建一個數據庫
CREATE DATABASE 數據庫名稱;
  1. 刪除一個存在的數據庫
DROP DATABASE 數據庫名稱;
  1. 選定對某個數據庫進行操作
use 數據庫名稱;
  1. 顯示當前選定數據庫中所有的表
show tabels;
  1. 創建表
CREATE TABLE 表名稱(列名稱1 數據類型, 列名稱2 數據類型, 列名稱3 數據類型, ....)
數據類型 描述
integer(size) 僅容納整數。在括號內規定數字的顯示寬度。4字節。有符號範圍(-2147483648,2147483647)。無符號範圍(0,4294967295)
int(size) 僅容納整數。在括號內規定數字的顯示寬度。4字節。有符號範圍(-2147483648,2147483647)。無符號範圍(0,4294967295)
smallint(size) 僅容納整數。在括號內規定數字的顯示寬度。2字節。有符號範圍(-32768,32767)。無符號範圍(0,65535)
tinyint(size) 僅容納整數。在括號內規定數字的顯示寬度。1字節。有符號範圍(-128,127)。無符號範圍(0,255)
decimal(size,d) 容納帶有小數的數字。 “size” 規定數字的最大位數。“d” 規定小數點右側的最大位數。要求d<=size
numeric(size,d)
char(size) 容納固定長度的字符串(可容納字母、數字以及特殊字符)。在括號中規定字符串的長度。
varchar(size) 容納可變長度的字符串(可容納字母、數字以及特殊的字符)。在括號中規定字符串的最大長度。
date(yyyymmdd) 容納日期。
  1. 刪除表
DROP TABLE 表名稱;
  1. 查看錶的全部內容
SELECT * FROM 表名稱;
  1. 查看錶的指定字段的內容
SELECT 列名稱1, 列名稱2, ...列名稱n FROM 表名稱;
  1. 插入內容到表
INSERT INTO 表名稱(1名稱,2名稱, ... 列n名稱) VALUES(1的值,2的值, ... 列n的值);
  1. 刪除表內容
DELETE FROM 表名稱 WHERE 條件;
  1. 顯示錶所有字段
SHOW COLUMNS FROM 表名稱;
  1. 創建表時添加約束:
DROP TABLE IF EXISTS students;
CREATE TABLE students(
id INT,
s_name VARCHAR(10) NOT NULL,  # 非空約束
s_sex CHAR(1) DEFAULT '男',   # 默認約束
s_seat INT,
age INT,
teacher_id INT, 
 
# 上面是列級約束的寫法,下面是表級約束的寫法
 
CONSTRAINT pk PRIMARY KEY(id), # 主建約束,pk是給約束起名字,方便以後通過這個名字來刪除這個約束。後面一樣
CONSTRAINT uq UNIQUE(s_seat),  # 唯一約束
CONSTRAINT fk_students_teacher FOREIGN KEY(teacher_id) REFERENCES teacher(id)  # 外鍵約束
);
  1. 表更換名稱
ALTER TABLE 表名稱 RENAME TO 表新名稱;  

列屬性修改操作

語法:

ALTER TABLE 表名稱 操作關鍵字 操作具體內容;  

ALTER COLUMN、MODIFY COLUMN、CHANGE的區別:

  • ALTER COLUMN,對於部分只需要修改表定義而不需要修改表數據的操作,使用ALTER COLUMN操作可以直接修改.frm文件避免數據發生移動,操作很快
  • MODIFY COLUMN,會引起表的重建,非常慢
  • CHANGE,主要用於列的重命名、列類型的變更以及列位置的移動,也很慢

僅需要修改表結構的操作有:

  • 更改字段的默認值
  • 增加和刪除字段的AUTO_INCREMENT屬性,(AUTO_INCREMENT用於主鍵自動增長的,從1開始增長)
  • 增刪改ENUM的常量值,(ENUM是字段的一種類型,表示枚舉類型,字段的數據只能是ENUM設置的常量值之一)
  1. 修改字段類型
ALTER TABLE 表名稱 MODIFY COLUMN 字段名稱 字段類型(size);  
  1. 增加列
ALTER TABLE 表名稱 ADD COLUMN 字段名稱 字段類型(size);  
  1. 刪除列
ALTER TABLE 表名稱 DROP COLUMN 字段名稱;  
  1. 添加約束
ALTER TABLE 表名稱 MODIFY COLUMN 字段名稱 字段類型(size) NOT NULL;
// 添加非空約束

ALTER TABLE 表名稱 ADD PRIMARY KEY(字段名稱);
// 指定字段爲主鍵方式一
ALTER TABLE 表名稱 MODIFY COLUMN 字段名稱 字段類型(size) PRIMARY KEY; 
// 指定字段爲主鍵方式二
  1. 刪除約束
ALTER TABLE 表名稱 MODIFY COLUMN 字段名稱 字段類型(size);
// MODIFY理解爲重構, 重構這一字段, 不添加非空約束, 就是刪除非空約束

ALTER TABLE 表名稱 DROP PRIMARY KEY;
// 去掉表的主鍵約束
  1. 顯示錶中所有鍵
  • 鍵:在數據庫中關鍵碼(簡稱,鍵),由一個或多個屬性組成
SHOW KEYS FROM 表名稱;
  1. 修改字段名稱
ALTER TABLE 表名稱 CHANGE 舊字段名 新字段名 新數據類型;

查詢

  1. 查詢語句
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 條件;

注意字段名稱1, 字段名稱2等,是值查詢這些字段的值,和後面的WHERE條件無關

  1. 指定查詢前幾條或者中間某幾行數據
    根據條件查詢指定字段的值,從第參數1行開始,返回參數2條結果
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 條件 LIMIT 參數1, 參數2;
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 條件 LIMIT 參數1;
// 等價於
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 條件 LIMIT 0, 參數1;
  1. 關係運算符篩選
    等於:=
    大於:>
    大於等於:>=
    小於:<
    小於等於:<=
    不等於:!=
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 某字段=某值;
  1. 邏輯運算符
    與:AND
    或:OR
    非:NOT
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 某字段=某值 AND 某字段>=某值;
  1. 範圍查詢
    IN
    BETWEEN 小數值 AND 大數值
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 某字段 IN (某值1, 某值2, ...);
// 查詢某字段的值是某值1、或某值2、或... 的字段名稱1、字段名稱2、... 的值
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 某字段 BETWEEN 小數值 AND 大數值;
// 查詢某字段的值範圍是[小數值, 大數值]的字段名稱1、字段名稱2, ... 的值(範圍包括邊界)
  1. 空判斷
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 某字段 IS NULL;       
// 查詢條件是某字段爲空
SELECT 字段名稱1, 字段名稱2, ... FROM 表名稱 WHERE 某字段 IS NOT NULL;    
// 查詢條件是某字段不爲空
  1. 模糊查詢
    LIKE
    %表示任意多個字符(包括0)
    _表示任意一個字符
    ESCAPE:取消%或_字符的通配符特性
    [ ]表示括號內所列出的字符中的一個
    [^ ] 表示不在括號所列之內的單個字符
SELECT * FROM student WHERE name LIKE "%王%";
// 查詢name中有”王“字的數據

索引

索引的目的在於提高查詢效率,與我們查閱圖書所用的目錄是一個道理:先定位到章,然後定位到該章下的一個小節,然後找到頁數。

本質是:通過不斷地縮小想要獲取數據的範圍來篩選出最終想要的結果同時把隨機的事件變成順序的事件,也就是說,有了這種索引機制,我們可以總是用同一種查找方式來鎖定數據。

安裝MySQL的python接口

sudo pip3 install PyMySQL

使用PyMySQL

import pymysql
 
 
db = pymysql.connect("localhost","user","key","database")
// 連接到數據庫
  • localhost:如果在本機上登錄,就填"localhost"。如果是遠程登錄,就填"數據庫所在主機的IP地址"
  • user:"用戶名稱"
  • key:"密碼"
  • database:"數據庫名稱"

創建表:

import pymysql
 
 
db = pymysql.connect("localhost","user","key","database")
// 連接到數據庫
cursor = db.cursor()
// 使用cursor()方法獲取操作遊標
cursor.execute("MySQL語法的創建表語句")
// 創建表
db.close()
// 關閉數據庫連接

數據庫插入操作:

import pymysql
 
 
db = pymysql.connect("localhost","user","key","database")
// 連接到數據庫
cursor = db.cursor()
// 使用cursor()方法獲取操作遊標

try:
   cursor.execute("MySQL語法的插入語句")
   db.commit()
   // 提交到數據庫執行
except:
   db.rollback()
   // 如果發生錯誤則回滾

db.close()
// 關閉數據庫連接

數據庫查詢操作:

import pymysql
 
 
db = pymysql.connect("localhost","user","key","database")
// 連接到數據庫
cursor = db.cursor()
// 使用cursor()方法獲取操作遊標

try:
   cursor.execute("MySQL語法的查詢語句")
   results = cursor.fetchall()
   // 獲取所有記錄列表
   // cursor.fetchone() 獲取單條記錄
   for row in results:
      查詢到的字段1= row[0]
      查詢到的字段2= row[1]
      ...
      查詢到的字段n值 = row[n-1]
      
      print("字段1=%s,字段2=%s,... 字段n=%s" % \
            (查詢到的字段1, 查詢到的字段2, ... 查詢到的字段n值))
      // 打印結果
except:
   print ("Error: unable to fetch data")

db.close()
// 關閉數據庫連接

結語

如果您有修改意見或問題,歡迎留言或者通過郵箱和我聯繫。
手打很辛苦,如果我的文章對您有幫助,轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章