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