雖然筆者從事的是Android客戶端的開發,平時和數據庫打的交道並不多,但是我們對於數據庫這一塊的學習還是很重要的,今天筆者想總結下MySQL關係型數據庫的一些常用知識點
數據庫概述
一、常見的概念
數據庫(DataBase):數據庫是按照數據結構來組織、存儲和管理數據的倉庫。數據庫管理系統(Database Management SystemDBMS):是專門用於管理數據庫的計算機系統軟件。數據庫管理系統能夠爲數據庫提供數據的定義、建立、維護、查詢和統計等操作功能,並完成對數據完整性、安全性進行控制的功能。
二、發展歷程
我們一般說的數據庫,就是指的DBMS: 數據庫服務器。數據庫技術發展歷程如下:
- 層次數據庫和網狀數據庫技術階段:使用指針來表示數據之間的聯繫。
- 關係數據庫技術階段:經典的里程碑階段。代表DBMS有Oracle、DB2、MySQL、SQL Server等。
- 後關係數據庫技術階段:關係型數據庫存在數據模型,性能,拓展伸縮性的缺點,出現了:
- ORDBMS:面向對象數據庫技術。
- NoSQL :結構化數據庫技術。
隨着大數據的不斷髮展,非關係型的數據庫現在成了一個極其熱門的新領域,非關係數據庫產品的發展非常迅速,產生了一系列出色的NoSQL數據庫。
常見的NoSQL數據庫分爲四大類
- 鍵值存儲數據庫:Oracle BDB,Redis,BeansDB
- 列式儲數數據庫:HBase,Cassandra,Riak
- 文檔型數據庫:MongoDB,CouchDB
- 圖形數據庫:Neo4J,InfoGrid,Infinite Graph
常見的關係數據庫:
數據庫系 | 所屬公司 |
---|---|
Oracle | Oracle |
DB2 | IBM |
SQL Server | MS |
MySQL | AB–>SUN–>Oracle |
特點比較:
- Oracle:運行穩定,可移植性高,功能齊全,性能超羣!適用於大型企業領域,但是價格昂貴。
- DB2:速度快、可靠性好,適於海量數據,恢復性極強。適用於大中型企業領域,但是價格昂貴。
- SQL Server:全面,效率高,界面友好,操作容易,但是不跨平臺。適用於中小型企業領域。
- MySQL:開源,體積小,速度快。適用於中小型企業領域。
三、SQL:結構化查詢語言(Structured Query Language)。
結構化查詢語言是關係型數據庫標準語言。特點:簡單,靈活,功能強大。
SQL包含6個部分:
- 數據查詢語言(DQL):
其語句,也稱爲“數據檢索語句”,用以從表中獲得數據,確定數據怎樣在應用程序給出。保留字SELECT是DQL(也是所有SQL)用得最多的動詞,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其他類型的SQL語句一起使用。 - 數據操作語言(DML):
其語句包括動詞INSERT,UPDATE和DELETE。它們分別用於添加,修改和刪除表中的行。也稱爲動作查詢語言。 - 事務處理語言(TPL):
它的語句能確保被DML語句影響的表的所有行及時得以更新。TPL語句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。 - 數據控制語言(DCL):
它的語句通過GRANT或REVOKE獲得許可,確定單個用戶和用戶組對數據庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對錶單個列的訪問。 - 數據定義語言(DDL):
其語句包括動詞CREATE和DROP。在數據庫中創建新表或刪除表(CREAT TABLE 或 DROP TABLE);爲表加入索引等。DDL包括許多與人數據庫目錄中獲得數據有關的保留字。它也是動作查詢的一部分。 - 指針控制語言(CCL):
它的語句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用於對一個或多個表單獨行的操作。
四、書寫規則
1.數據庫中,SQL語句大小寫不敏感
2.SQL語句可單行或多行書寫
3.在SQL語句中,關鍵字不能跨多行或縮寫
4.爲了提高可讀性,一般關鍵字大寫,其他小寫
5.空格和縮進使程序易讀
五、表的理解
什麼是表?表是用來幹嘛的?表又叫二維表(有行和列) ,用來存儲數據,
表具有固定的列數和任意的行數,在數學上稱爲“關係”。
二維表是同類實體的各種屬性的集合,每個實體對應於表中的一行,在關係中稱爲一條記錄
表中的列表示屬性,稱爲Field,相當於通常記錄中的一個數據項,也叫列、字段。
解釋表結構和麪向對象的關係
能不能使用面向對象的方式來操作數據庫呢?
MySQL安裝和配置
一、MySQL安裝過程中注意:
- MySQL的默認端口是:3306
- 數據庫默認字符集就是utf8
- 設置密碼:(儘量簡單能記住,忘記後很麻煩)
- MySQL的運行要基於 .Net framework 4和VC++庫
- 如果沒有安裝以上兩個庫則在安裝過程中會出錯,必須先安裝以上程序
- 解決MySQL佔內存的問題:
- 找到:my.ini文件:
- table_definition_cache=400
- table_open_cache=200
二、操作數據庫的流程
- 建立連接(認證身份)
- 客戶端向服務器端發送SQL命令
- 服務器端執行SQL,並返回執行的結果
- 客戶端接收結果(並顯示)
- 斷開連接
三、啓動和連接MySQL
1.啓動MySQL服務:打開數據庫連接之前:一定要保證MySQL服務已經開啓了.在服務中找到MySQL的服務,查看是否處於正在運行的狀態
在Windows中使用命令控制服務的狀態(必須使用管理員身份開啓命令行)
開啓服務: net start 服務名 如: net start mysql
關閉服務: net stop 服務名 如: net stop mysql
2.連接MySQL數據庫:
- 方式1:進入MySQL, 在命令行中輸入密碼;
- 方式2:在命令行中:找到安裝目錄下的bin錄製中有個mysql的命令
格式:mysql -u賬戶 -p密碼 -h數據庫服務器安裝的主機 -P數據庫端口
mysql -uroot -padmin -hlocalhost -P 3306
若連接的數據庫服務器在本機上,並且端口是3306。
則可以
四、MySQL圖形化管理軟件Navicat:
- Navicat for MySQL是一款強大的 MySQL 數據庫管理和開發工具,它爲專業開發者提供了一套強大的足夠尖端的工具,但對於新用戶仍然易於學習。
- Navicat for MySQL 基於Windows平臺,爲 MySQL 量身訂作,提供類似於 MySQL 的用管理界面工具。此解決方案的出現,將解放 PHP、J2EE 等程序員以及數據庫設計者、管理者的大腦,降低開發成本,爲用戶帶來更高的開發效率。
MySQL數據庫操作
一、數據庫操作和存儲引擎
1.數據庫和數據庫對象
一般來說我們說的數據庫(MySQL/Oracle等)指的都是數據庫服務器(DBMS)
數據庫:存儲數據庫對象的容器。
數據庫對象:存儲,管理和使用數據的不同結構形式,如:表、視圖、存儲過程、函數、觸發器、事件等。
數據庫分兩種:
- 系統數據庫(系統自帶的數據庫):不能修改
information_schema:存儲數據庫對象信息,如:用戶表信息,列信息,權限,字符,分區等信息
performance_schema:存儲數據庫服務器性能參數信息。
mysql:存儲數據庫用戶權限信息。
sys:系統配置信息。
- 用戶數據庫(用戶自定義的數據庫):一般的,一個項目一個用戶數據庫。
2.數據庫操作命令
(1)查看和選擇數據庫
- 查看數據庫服務器存在哪些數據庫: SHOW DATABASES;
- 使用指定的數據庫:USE database_name;
- 查看指定的數據庫中有哪些數據表: SHOW TABLES;
(2)創建和刪除數據庫
- 創建指定名稱的數據庫: CREATE DATABASE database_name;
- 刪除數據庫:DROP DATABASE database_name;
3.數據庫存儲引擎
二、MySQL常用列類型
1.整數類型
最常用的整數類型:
MySQL列類型 | Java數據類型 |
---|---|
INT | int/Integer |
BIGINT | long/Long |
MySQL 以一個可選的顯示寬度指示器的形式對 SQL 標準進行擴展,這樣當從數據庫檢索一個值時,可以把這個值加長到指定的長度。例如,指定一個字段的類型爲 INT(6),就可以保證所包含數字少於 6 個的值從數據庫中檢索出來時能夠自動地用空格填充。需要注意的是,使用一個寬度指示器不會影響字段的大小和它可以存儲的值的範圍。一般不用指定位寬。
2.小數類型
FLOAT[(s,p)] :
DOUBLE[(s,p)] : 小數類型,可存放實型和整型 ,精度(p)和範圍(s)
money double(5,2): 整數和小數一共佔5位.其中小數佔2位.
都不夠精確。
定點數據類型: DECIMAL,高精度類型,金額貨幣優先選擇。
MySQL列類型 | Java數據類型 |
---|---|
FLOAT | float/Float |
DOUBLE | double/Double |
DECIMAL(s,p) | BigDecimal |
3.字符類型
char(size) 定長字符,0 - 255字節,size指N個字符數,若插入字符數超過設定長度,會被截取並警告。
varchar(size) 變長字符,0 - 255字節,從MySQL5開始支持65535個字節,若插入字符數超過設定長度,會被截取並警告。
一般存儲大量的字符串,比如文章的純文本,可以選用TEXT系列類型,這個系列都是變長的。
注意:在MySQL中,字符類型必須指定長度,值要使用單引號引起來。 相當於Java中字符串(String,StringBuilder/StringBuffer);
對比char(4)和varchar(4)佔用空間的問題?
4.日期和時間類型
日期和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。
注意:在MySQL中,日期時間值使用單引號引起來。 相當於Java中Date,Calender。
5.二進制類型
存放圖形、聲音和影像,二進制對象,0-4GB。
開發中,我們一般存儲二進制文件保存路徑。
BIT:我們一般存儲0或1,存儲是Java中的boolean/Boolean類型的值。
其他的大二進制類型,開發中一般都不用
三、MySQL表的操作
1.創建表
步驟:
1. 先進入某一個數據庫
2. 輸入建表的命令
CREATE TABLE 表名(
列名1 列的類型 [約束],
列名2 列的類型 [約束],
....
列名N 列的類型 [約束]
);
注意:最後一行沒有逗號
使用使用標識符時不要用SQL的關鍵字,如果用到的話怎麼辦呢?比如新建一張訂單表(order),但是order是數據庫中的關鍵字(排序使用).
- 解決方案一:使用反引號`把自定義的標識符引起來.
- 解決方案二:使用表名的前綴,一般的,習慣t_order.
2.查看錶結構和刪除表
- 查看錶目錄:SHOW TABLES;
- 查看錶結構: DESC table_name;
- 查看DDL語句:SHOW CREATE TABLE table_name;
- 刪除表:DROP TABLE table_name;
3.表的約束:表的約束(針對於某一列):
- 非空約束:NOT NULL(NK),不允許某列的內容爲空。
- 設置列的默認值:DEFAULT。
- 唯一約束:UNIQUE(UK),在該表中,該列的內容必須唯一。
- 主鍵約束:PRIMARY KEY(PK), 非空且唯一。
- 主鍵自增長:AUTO_INCREMENT,從1開始,步長爲1。(MySQL特有)
- 外鍵約束:FOREIGN KEY(FK),A表中的外鍵列的值必須參照於B表中的某一列(B表主鍵)。
主鍵設計:
1:單列主鍵,單列作爲主鍵,建議使用。
複合主鍵,使用多列充當主鍵,不建議。
2:主鍵分爲兩種:
1)自然主鍵:使用有業務含義的列作爲主鍵(不推薦使用);
2)代理主鍵:使用沒有業務含義的列作爲主鍵(推薦使用);
單表查詢(DQL上)
一、簡單查詢
1.簡單數據查詢
語法:
SELECT {*, column [alias],...}
FROM table_name;
說明:
SELECT 選擇查詢列表
FROM 提供數據源(表、視圖或其他的數據源)
如果爲 * 和創建表時的順序一致。
可以自己調整順序,在select後邊加上要查詢的列名。
2.避免重複數據-DISTINCT
消除結果中重複的數據。
需求:查詢商品的分類編號。
語法:
SELECT DISTINCT 列名,...
FROM table_name;
3.實現數學運算查詢
對NUMBER型數據可以使用算數操作符創建表達式(+ - * /)
對DATE型數據可以使用部分算數操作符創建表達式 (+ -)
運算符優先級:
1、乘法和除法的優先級高於加法和減法
2、同級運算的順序是從左到右
3、表達式中使用"括號"可強行改變優先級的運算順序
4.設置列的別名
設置列名的別名。
1、改變列的標題頭;
2、用於表示計算結果的含義;
3、作爲列的別名;
4、如果別名中使用特殊字符,或者是強制大小寫敏感,或有空格時,都需加雙引號;
二、過濾查詢
1.比較運算符
比較運算符 含義
= 等於
> 大於
>= 大於或等於
< 小於
<= 小於或等於
!=(<>) 不等於
注意:字符串和日期要用單引號擴起來.
要讓MySQL查詢區分大小寫,可以:
SELECT * FROM table_name WHERE BINARY productName='g9x'
SELECT * FROM table_name WHERE BINARY productName='G9X'
2.邏輯運算符
邏輯運算符 含義
AND(&&) 如果組合的條件都是TRUE,返回TRUE
OR(||) 如果組合的條件之一是TRUE,返回TRUE
NOT(!) 如果下面的條件是FALSE,返回TRUE
3.優先級規則
運算優先級 運算符
1 所有比較運算符
2 NOT
3 AND
4 OR
注意:括號將跨越所有優先級規則
分析SQL:SELECT * FROM product WHERE (NOT productName LIKE '%M%' AND salePrice > 100) OR (dir_id = 2)
4.範圍查詢 -BTEWEEN AND
使用BETWEEN運算符顯示某一值域範圍的記錄,這個操作符最常見的使用在數字類型數據的範圍上,但對於字符類型數據和日期類型數據同樣可用。
格式:
SELECT <columnList> FROM table_name
WHERE 列名 BETWEEN minvalue AND maxvalue:閉區間。
5.集合查詢 -IN
使用IN運算符,判斷列的值是否在指定的集合中。
格式: WHERE 列名 IN (值1,值2....);
6.空值查詢 -IS NULL
IS NULL:判斷列的值是否爲空。
格式:WHERE 列名 IS NULL;
7.模糊查詢
使用LIKE運算符執行通配查詢,查詢條件可包含文字字符或數字:
%通配符:可表示零或多個字符。
_通配符:可表示一個字符。
通配符:用來實現匹配部分值得特殊字符。
三、結果排序
排序通過ORDER BY 實現 ASC升序 DESC降序 默認是升序
1.排序語法和規則
2.按單列排序
3.按多列排序
4.列的別名排序
四、MySQL分頁查詢
分頁設計:
假分頁(內存分頁):所有數據已經存在內容中,只是顯示部分而已,
優點:每次翻頁時都從內存中取數據,翻頁速度極快,簡單
缺點:消耗內存大,容易內存溢出
真分頁(數據庫分頁):每次翻頁都去數據庫查詢數據
優點:不會造成內存溢出
缺點:翻頁比較慢,複雜
此時,我們講解MySQL特有的分頁方式(LIMIT,在Oracle12C中也提供類似的語法).
設置每頁最多3條記錄:
語法: LIMIT ?, ?
參數1:
參數2:
第一頁:
第二頁:
第三頁:
第四頁:
第N頁:
演示下公式的分頁查詢效果 LIMIT (currentPage-1) * pageSize, pageSize
五、聚合函數
什麼是聚合函數/統計函數:
聚合函數作用於一組數據,並對一組數據返回一條記錄。
COUNT:統計結果記錄數
MAX: 統計計算最大值
MIN: 統計計算最小值
SUM: 統計計算求和
AVG: 統計計算平均值