資料庫:資料庫是一種以某種有組織的方式存儲的數據集合。其本質就是一個容器,通常是一個或者一組文件。 表:表示一種結構化的文件,可用來存儲某種特定類型的數據。 模式:描述資料庫中特定的表以及整個資料庫和其中表的關係。表具有一些特性,這些特性定義了數據在表中如何存儲,可以存儲什麼樣的數據,數據如何分解, ...
資料庫:資料庫是一種以某種有組織的方式存儲的數據集合。其本質就是一個容器,通常是一個或者一組文件。
表:表示一種結構化的文件,可用來存儲某種特定類型的數據。
模式:描述資料庫中特定的表以及整個資料庫和其中表的關係。表具有一些特性,這些特性定義了數據在表中如何存儲,可以存儲什麼樣的數據,數據如何分解,各個部分信息如何命名等信息。
列:表中的一個欄位,所有表都是有一個或多個列組成的。
行:行是表中的一個獨立的記錄,它包含了所有列的信息。
數據類型:數據類型限制可以存儲在類型紅的數據種類,還可以幫助正確的排序數據,併在優化磁碟使用方面起著重要作用。
資料庫、表、列、用戶、許可權等信息被存儲在數據可和表中,mysql資料庫用來存儲用戶及許可權信息,information_schema資料庫存儲資料庫以及其中的表、列、存儲過程等相關信息。
檢索數據:檢索數據使用SELECT語句,它可以從一個或者多個表中檢索信息。使用SELECT必須至少給出兩條信息:檢索什麼,從哪裡檢索。
檢索數據如果沒有明確排序查詢結果,則返回的數據的順序沒有特殊意義。除非確實需要表中的每個列,否則最好不要使用*通配符,檢索不需要的列通常會降低檢索和應用程式的性能。
限制重覆數據:使用DISTINCT關鍵字可以限制檢索出具有不同值得列表,DISTINCT關鍵字應用於檢索出的所有列中。
限制返回結果:使用LIMIT子句可以限制檢索結果返回的數目,以及內容。
排序檢索數據:使用ORDER BY子句可以對返回結果進行排序,當對多個列進行排序時,排序按照所規定的列的順序進行排序,也就是先按照第一個列進行排序,第一個列排序結果相同的再按照第二個列進行排序,以此類推。每個列的排序方向預設為升序,如果指定降序需要特殊指定。DESC關鍵字只應用到直接位於其前面的列名。
搜索條件(search criteria)也成為過濾條件(filter condition)
檢索數據可以通過SQL過濾和應用過濾兩種方式。應用過濾資料庫伺服器會返回多餘的數據,導致網路帶寬的浪費,同時客戶機處理資料庫的工作也會極大的影響應用的性能,並且時所創建的應用完全不具備可伸縮性。所以應該儘量在資料庫伺服器上實現對數據的過濾。
Order by 子句位於where 子句之後
Where 字句可用的操作符有:=,<>,!=,<,>,<=,>=,between
Mysql在執行匹配時不區分大小寫。
between匹配範圍中的所有的值,包括指定的開始值和結束值
空值NULL 和欄位包含0,空字元串(empty),或者僅僅包含空格不同,檢查是否為空值用 IS NULL 子句,例如:SELECT * FROM Ttable_name WHERE column_name IS NULL;
查詢條件使用!=不會返回NULL值行,如果想要返回NULL值行必須要用IS NULL 子句。
SQL中預設AND具有比OR高的操作優先順序,在任何使用AND和OR的WHERE子句中,應該使用圓括弧明確的分組操作符,不要依靠預設計算順序消除歧義。
IN操作符完成與OR相同的功能,IN的最大優點在於可以包含其他的SELECT語句,似的能夠更動態地建立WHERE子句。
NySQL允許使用NOT對IN,BETWEEN,EXISTS語句取反
為了在搜索子句中使用通配符,必須使用LIKE關鍵字。LIKE指示mysql,後跟的搜索模式利用通配符匹配,而不是直接相等匹配進行比較。
通配符:% 百分號表示任何字元出現任意次數。不能匹配NULL值。
_ 下劃線總是匹配任意單個字元。
使用通配符進行搜索的處理時間要比直接相等匹配所花時間更多。
直接從資料庫中檢索出轉換、計算或者格式化過的數據要比在客戶端中通過程式來完成要快得多,因為資料庫管理系統是設計來快速有效的完成這種處理的。
拼接欄位:Concat()函數 MySQL語句中可以使用Concat()函數把多個串拼接起來,各個串之間用逗號分隔。
去掉空格:RTrim()去掉右側空格,LTrim()去掉左面空格,Trim()去掉兩側空格
MySQL首選的日期格式為yyyy-mm-dd 例如:2016-11-09。
SQL數據類型為datetime,顯示時間和日期,如果只提取時間可以使用Date()函數,只把日期部分提取出來。
如果想要檢索某一年一個月中的所有數據有兩種實現方式1、BETWEEN關鍵字,限定日期區間2、使用如期處理函數 Year(date)=2016 AND Month(date)=12組合限定,這樣可以不用擔心每個月的實際天數或者閏月情況。
彙總數據
MySQL提供5個聚集函數:
AVG() 返回某列的平均值
COUNT() 返回某列的行數 count(*)對所有行計數包括NULL;
count(column)計數指定列,不包括NULL值。
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列的和
MySQL中使用聚集函數來彙總數據他們的返回結果一版要比在客戶端應用程式中計算快得多,而且更節省資源,不論是時間資源還是硬體資源。
分組數據
分組允許把數據分為多個邏輯組,以便能對每個組進行聚集計算。WITH ROLLUP 可以實現在分組統計數據基礎上再進行相同的統計(SUM,AVG,COUNT…)。例如:SELECT ID,UPLOAD_TIME,COUNT(*) AS num_count FROM table_nbame WHERE MONTH(UPLOAD_TIME)=12 GROUP BY ID WITH ROLLUP 檢索出的結果在num_count最後一行會返回所有分組統計數量的和
WHERE字句用來過濾掉不符合匹配條件的行,在分組中,可以使用HAVING子句進一步過濾掉不符合條件的分組。WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。
ORDER BY和GROUP BY,GROUP BY是對數據進行分組,ORDER BY 是對輸出的數據進行排序,兩個子句一起使用的時候ORDER BY 子句用在GROUP BY子句之後,並且數據在查詢的時候先分組然後再排序輸出。
SELECT語句中各個子句的書寫順序:SELECT->FROM->WHERE->GROUP BY->HAVING->ORDER BY->LIMIT
子查詢
嵌套在其他查詢中的查詢語句為子查詢。
1、將子查詢的放置在WHERE子句中,可以利用子查詢的結果充當查詢條件過濾數據。
2、將子查詢作為計算欄位將查詢結果充當返回的數據
子查詢最常見的使用時再WHERE子句的IN操作符中,以及用來填充計算列
表的聯結
關係型資料庫設計的基礎是要儘量減少相同數據的多次重覆出現。關係表的設計就是要保證把信息分解成多個表,一類數據一個表,各表通過某些常用的值互相關聯,這也正體現了關係的內涵。
按照關係資料庫設計的基礎,相關數據被存儲在多個表中,用單條SQL語句檢索出想要的數據的有效手段是使用聯結。
創建聯結的關鍵是要規定聯結的所有表,以及他們如何實現關聯。應該保證所有的連接都有WHERE子句。
笛卡爾積:沒有聯結條件的表檢索出的行的數目是相聯結的幾個表的行數的積。
基於兩個表之間的相等測試進行的聯結成為等值聯結,也叫做內部聯結。等值聯結形式: select table2.column1,table2.column1 from table1,table2 where table1.column2=tabl2.column2
內部聯結的規範形式為:select table1.column1,table2.column1 from table1 inner join table2 on table1.column2=table2.column2
聯結條件使用特點的ON語句而不是WHERE子句。
使用子查詢的場合很多也可以使用聯結來實現數據的檢索。
自聯結:自聯結就是同一張表的兩次聯結。在同一張表中有可能需要通過兩次查詢才能檢索出想要的數據,只用一條SELECT語句通過子查詢可以實現這種檢索,同時使用自聯結能更高效的實現從相同表中檢索數據。
使用子查詢的例子可能如下:SELECT id,name FROM products WHERE vend_id=(SELECT vend_id FROM product WHERE id=123)。這條語句檢索出和id為123的產品具有相同生產商的產品信息。
使用自聯結的形式如下:SELECT p1.id,p1.name FROM products AS p1,products AS p2 WHERE p1.vend_id=p2.vend_id AND p2.id=123
外部聯結:內部聯結是基於兩個表中的相等測試建立起來的聯結,外部聯結比內部聯結更強大,他可以包含那些在相關表中沒有關聯行的行。也就是說,使用外部關聯,可以檢索出在另外一張表裡沒有相關關聯記錄的欄位信息。
組合查詢:使用UNION關鍵字可以將兩條或者以上的SELECT語句檢索結果組合成單個查詢結果集。使用UNION關鍵字要保證,每個SELECT語句必須包含相同的列、表達式或者聚集函數,也就是說每個SELECT查詢出的內容必須是相同的,這樣才能組合成單個結果集;每個查詢的列數據類型必須相容。UNION語句預設從結果集中自動去除了重覆的行。如果需要包括重覆的行可使用UNION ALL關鍵字。
數據插入及系統安全:利用MySQL的安全機制,可以針對每個表或者每個用戶禁止使用INSERT語句。
插入數據使用INSERT語句,不要使用沒有指定明確列的INSERT語句,這樣可以不用考慮表結構中列的順序的變化所帶來的影響。
MySQL使用單條INSERT語句處理多個插入比使用多條INSERT語句要高效得多。
使用INSERT…SELECT語句可以實現把檢索出來的數據插入到表中。
資料庫引擎:資料庫引擎用來具體管理和處理數據(有待更詳細的介紹)
MySQL常見引擎:
InnoDB:支持事務處理,不支持全文本搜索
MyISAM:性能極高,支持全文本搜索,不支持事務處理
MWMORY:功能上類似於MyISAM,但是數據存儲在記憶體中而不是磁碟上,速度很快,適合用於臨時表。
通過外鍵保持關係的表必須要具有相同的引擎類型。
視圖:MySQL在MySQL5之後添加了對視圖功能的支持。視圖不是表,他也不包含任何數據,他包含的全部是根據需要檢索數據的查詢,也就是一條SELECT語句。在本質上,視圖提供了一種MySQL的SELECT語句層次的封裝,視圖功能的全部意義在於簡化複雜數據的處理。
使用視圖的作用:
- 重用SQL語句。這是封裝的特性。
- 簡化複雜的SQL操作。這是視圖功能最本質的作用。
- 使用表的組成部分而不是整個表。視圖已經做過一次查詢,可以當做虛擬的表來使用。
- 保護數據。通過給用戶授予表的特定部分的訪問許可權而不是整個表,可以有效地保證數據安全。
- 更改數據格式和表示。使用視圖相當於增加了一個緩衝層,可以在此層次上做特殊的數據顯示處理。
存儲過程:MySQL5 添加了對存儲過程的支持。存儲過程實際上是一種保存在資料庫伺服器上的一種函數,所以存儲過程名稱後需要有圓括弧()。存儲過程簡單來說就是為了以後的使用而保存的一條或者多條MySQL語句的集合。當所需要使用的MySQL語句比較複雜,尤其是包含業務規則和智能處理時,使用存儲過程能夠很方便的得到結果。
使用存儲過程的理由:
- 把多條處理語句封裝在一個單元中。和視圖類似,通過封裝簡化複雜操作。不過視圖只是封裝SELECT語句,存儲過程可以封裝全部類型的SQL語句,並且還能進行智能處理。
- 保證數據的完整性。
- 簡化對變動的處理。
- 提高性能。存儲過程比使用單獨的SQL語句要快。
- 用戶使用和創建存儲過程的許可權是分開的,這保證了資料庫的安全。
創建存儲過程:
此例是一個闡明存儲過程功能的很好的示例。CREATE PROCEDURE procedure_name()語句用來創建存儲過程。如果此函數有接受或者返回的參數,那接收或者返回的參數要在()中列舉出來,並且使用IN或者OUT或者INOUT關鍵之指定該參數是傳入參數還是傳出參數,並且指定參數數據類型。BEGIN和END語句用來限定存儲過程體。在存儲過程體中,通過SELECT…INTO把要返回的數據存儲在存儲過程名的()中指定的返回變數中。
觸發器:觸發器定義在資料庫的表上,針對INSERT,DELETE,UPDATE三個事件發生時可以自動的執行某些操作。觸發器明在每個表中必須唯一。只有真正的物理實體表才支持觸發器,每個表每個事件只允許一個觸發器。觸發器可以定義在事件發生之前或者之後自動觸發,因此每張表最多支持6個觸發器。
事務處理:事務是一組SQL語句。事務處理是一種機制,用來管理必須成批執行的MySQL操作,以保證資料庫不包含不完整的結果。通過事務處理,可以保證一組操作不會中途停止,他們作為整體執行,或者完全不執行。最著名的解釋事務處理必要性的例子就是銀行賬戶轉賬問題。
有關事務的幾個名詞:
- 事務:一組SQL語句。
- 回退:撤銷指定SQL語句的過程。
- 提交:將未存儲的SQL語句結果寫入資料庫。
- 保留點:事務處理中設置的臨時占位符,可以控制事務回退的位置。
簡單的回退使用ROLLBACK語句可以撤銷整個事務,複雜的事務處理可以自己指定保留點,然後使用ROLLBACK TO回退到指定的保留點,這樣可以是實現部分提交或回退。
安全管理:MySQL伺服器的安全基礎是:通過控制訪問用戶的許可權,保證用戶對他們需要的數據具有適當的訪問許可權,既不多也不少。管理訪問控制需要創建和管理用戶賬號。
MySQL資料庫的用戶賬號信息存儲在mysql資料庫的user表中。
創建用戶賬號:CREATE USER user_name IDENTIFIED BY ‘password’;創建用戶賬號及其對應的密碼。新創建的用戶不具有任何許可權。
刪除用戶賬號:DROP USER user_name;
設置訪問許可權:使用GRANT語句為用戶設置許可權,設置許可權語句要給出的信息包含:
- 要授予的許可權
- 被授予訪問的資料庫或者表
- 被授予許可權的用戶
例如:GRANT SELECT ON database_name.* TO user_name;
這條語句授予user_name用戶針對database_name資料庫的所有表只讀許可權。
撤銷訪問許可權:REVOKE語句是GRANT的反操作。
GRANT和REVOKE語句能夠控制的訪問許可權層次:
- 整個伺服器 GRANT|REVOKE ALL;
- 整個資料庫 ON database.*;
- 特定的表 ON database.table;
- 特定的列
- 特定的存儲過程