本文主要內容爲MySQL的基礎語句以及正則表達式等內容。mysql
本文操做的數據庫內容存在我的github:https://github.com/YuanGao-1/blog_demo.gitgit
init_schema.sql爲建表腳本github
init_data.sql爲測試數據正則表達式
具體導入過程爲:sql
create database (數據庫名); use (數據庫名) ; source init_schema.sql; //先建表 source init_data.sql; //導入測試數據
這些概念都是基本常識,總結下來能夠瀏覽一下。數據庫
數據庫(database)指保存有組織的數據的容器(一般是一個文件或一組文件)。框架
表(table)指某種特定類型數據的結構化清單。數據庫設計
表是一種結構化的文件,可用來存儲某種特定類型的數據。表能夠保存顧客清單、產品目錄,或者其餘信息清單。表名具備惟一性,同一個數據庫下,不該有兩個相同名字的表。函數
表具備一些特性,這些特性定義了數據在表中如何存儲,如能夠存儲什麼樣的數據,數據如何分解,各部分信息如何命名,等等。描述表的這組信息就是所謂的模式,模式能夠用來描述數據庫中特定的表以及整個數據庫(和其中表的關係)。工具
模式(schema)指關於數據庫和表的佈局及特性的信息。
有些資料上的模式和數據庫含義相同,須要注意
列(column)指表中的一個字段。全部表都是由一個或多個列組成的。
數據類型(datatype)指所允許的數據的類型。每一個表列都有相應的數據類型,它限制(或允許)該列中存儲的數據。
行(row)指表中的一個記錄。
主鍵(primary key)指一列(或一組列),其值可以惟一區分表中每一個行。能夠着重理解key
。
表中的任何列均可以做爲主鍵,只要它知足如下條件:
除MySQL強制實施的規則外,應該堅持的幾個廣泛承認的最好習慣爲:
- 不更新主鍵列中的值;
- 不重用主鍵列的值;
- 不在主鍵列中使用可能會更改的值。(例如,若是使用一個名字做爲主鍵以標識某個供應商,當該供應商合併和更改其名字時,必須更改這個主鍵。)
在CMD中鍵入mysql -uroot -p
進入mysql狀態,接下來須要鍵入密碼
mysql>
以後;;
或 \g
結束,換句話說,僅按 Enter
不執行命令;help
或 \h
得到幫助,也能夠輸入更多的文本得到特定命令的幫助(如,輸入 help select
得到使用SELECT語句的幫助);quit
或 exit
退出命令行實用程序。MySQL中一樣具備關鍵字。如:ues, show, SELECT等等(cmd中不區分大小寫)
先舉例一些基本的命令:
舉例:
什麼是自動增量? 某些表列須要惟一值。例如,訂單編號、僱員ID或(如上面例子中所示的)顧客ID。在每一個行添加到表中時,MySQL能夠自動地爲每一個行分配下一個可用編號,不用在添加一行時手動分配惟一值(這樣作必須記住最後一次使用的值)。這個功能就是所謂的自動增量。若是須要它,則必須在用CREATE語句建立表時把它做爲表定義的組成部分。咱們將在第21章中介紹CREATE語句。
此外,相關的show命令還有:
MySQL 5支持一個新的
INFORMATION_SCHEMA
命令,可用它來得到和過濾模式信息。
上述語句利用SELECT 語句從user
表中檢索一個名爲password
的列。所需的列名在SELECT關鍵字以後給出,FROM關鍵字指出從其中檢索數據的表名。如上的一條簡單SELECT語句將返回表中全部行。數據沒有過濾(過濾將得出結果集的一個子集),也沒有排序
SQL語句和大小寫 請注意,SQL語句不區分大小寫,所以SELECT與select是相同的。一樣,寫成Select也沒有關係。許多SQL開發人員喜歡對全部SQL關鍵字使用大寫,而對全部列和表名使用小寫,這樣作使代碼更易於閱讀和調試。不過,必定要認識到雖然SQL是不區分大小寫的,但有些標識符(如數據庫名、表名、列名)可能不一樣:在MySQL 4.1及以前的版本中,這些標識符默認是區分大小寫的;在MySQL 4.1.1版本中,這些標識符默認是不區分大小寫的。最佳方式是按照大小寫的慣例,且使用時保持一致。MySQL8.0中不區分,可是可根據本身的狀況進行調整。
惟一的不一樣是必須在SELECT關鍵字後給出多個列名,列名之間必須以逗號分隔。
SELECT * FROM 表名,爲檢索全部列。優勢:能檢索出名字未知的列。缺點:若是不是肯定須要全部列的信息,使用通配符*講會下降檢索和應用程序的性能。
解決辦法是使用DISTINCT關鍵字,顧名思義,此關鍵字指示MySQL只返回不一樣(惟一)的值。
實際上type中有多個重複的0,1,2行。
此語句使用SELECT語句檢索單個列。LIMIT 5指示MySQL返回很少於5行。
其中,LIMIT
後若跟兩個數字,如:5,5,則指示MySQL返回從行5開始的5行。第一個數爲開始位置,第二個數爲要檢索的行數。
帶一個值的LIMIT老是從第一行開始,給出的數爲返回的行數。帶兩個值的LIMIT能夠指定從行號爲第一個值的位置開始。
值得注意的是:
此外,LIMIT還有一種表示方法: LIMIT 10,5等效於 LIMIT 5 OFFSET 10第一個數字爲檢索的行數,第二個數字爲偏移量即開始的位置。
有一些情形須要徹底限定名,例如:使用徹底限定的名字來引用列(同時使用表名和列字)。表名也能夠是徹底限定的。(community是數據庫,user爲其中一個表,id爲user中的一個列)
2.2部分檢索出的數據並非以純粹的隨機順序顯示的。若是不排序,數據通常將以它在底層表中出現的順序顯示。這能夠是數據最初添加到表中的順序。可是,若是數據後來進行過更新或刪除,則此順序將會受到MySQL重用回收存儲空間的影響。所以,若是不明確控制的話,不能(也不該該)依賴該排序順序。關係數據庫設計理論認爲,若是不明確規定排序順序,則不該該假定檢索出的數據的順序有意義。
在這裏新介紹一個概念,子句:SQL語句由子句構成,有些子句是必需的,而有的是可選的。一個子句一般由一個關鍵字和所提供的數據組成。子句的例子有SELECT語句中的FROM子句。
爲了明確地排序用SELECT語句檢索出的數據,可以使用ORDER BY子句。ORDER BY子句取一個或多個列的名字,據此對輸出進行排序。請看下面的例子:
這條語句除了指示MySQL對 email
列以字母順序排序數據的ORDER BY子句外,與前面的語句相同。也可用其餘列進行排列以後顯示email
字段。
以下所示,先對 type
字段進行排序。以後在 type
相同的行中,對 username
字段進行排序。若 type
均不一樣,則不會對 username
進行排序。
指定排序方向:數據排序不限於升序排序(從A到Z)。這只是默認的排序順序,還可使用ORDER BY子句以降序(從Z到A)順序排序。爲了進行降序排序,必須指定DESC
關鍵字。
注意:對哪一個列進行降序排列,就須要在列後加 DESC
,ORDER BY默認是升序,關鍵字爲 ASC
在對文本性的數據進行排序時,A與a相同嗎?a位於B以前仍是位於Z以後?這些問題不是理論問題,其答案取決於數據庫如何設置。
在字典(dictionary)排序順序中,A被視爲與a相同,這是MySQL(和大多數數據庫管理系統)的默認行爲。可是,許多數據庫管理員可以在須要時改變這種行爲(若是你的數據庫包含大量外語字符,可能必須這樣作)。
注意,使用的時候,LIMIT要放在ORDER BY以後,不然會報錯。
2.3部分學習瞭如何用SELECT語句的ORDER BY子句對檢索出的數據進行排序。這個子句必須是SELECT語句中的最後一條子句。
過濾數據,即指定數據的搜索條件,畢竟在實際應用中檢索全部數據的狀況是很少的。
在SELECT語句中,數據根據WHERE子句中指定的搜索條件進行過濾。WHERE子句在表名(FROM子句)以後給出。這個例子採用的是相等測試:它檢查一個列是否具備指定的值,據此進行過濾。可是SQL容許作的事情不只僅是相等測試。
在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE以後,不然將會產生錯誤
值得注意的是,
MySQL在執行匹配時默認不區分大小寫,因此system
與SYSTEM
匹配。
爲了檢查某個範圍的值,可以使用BETWEEN操做符。其語法與其餘WHERE子句的操做符稍有不一樣,由於它須要兩個值,即範圍的開始值和結束值。
例如,BETWEEN操做符可用來檢索id
在11和22之間的全部用戶名。
從這個例子中能夠看到,在使用BETWEEN時,必須指定兩個值——所需範圍的低端值和高端值。這兩個值必須用AND關鍵字分隔。BETWEEN匹配範圍中全部的值,包括指定的開始值和結束值。
在建立表時,表設計人員能夠指定其中的列是否能夠不包含值。在一個列不包含值時,稱其爲包含空值NULL。
NULL 無值(no value),它與字段包含0、空字符串或僅僅包含空格不一樣
爲了進行更強的過濾控制,MySQL容許給出多個WHERE子句。這些子句能夠兩種方式使用:以AND子句的方式或OR子句的方式使用。
操做符(operator) 用來聯結或改變WHERE子句中的子句的關鍵字。也稱爲邏輯操做符(logical operator)
接下來介紹幾個操做符:
AND 用在WHERE子句中的關鍵字,用來指示檢索知足全部給定條件的行。
OR操做符與AND操做符不一樣,它指示MySQL檢索匹配任一條件的行。
在這裏值得注意的是SQL(像多數語言同樣)在處理OR操做符前,優先處理AND操做符。優先級不一樣,須要記住。
舉例以下:
這句命令的含義爲:檢索全部的,activation_code
不爲空且id
小於22這種狀況,以及type
=1這種狀況的記錄。
注意:在WHERE子句中使用圓括號 任什麼時候候使用具備AND和OR操做符的WHERE子句,都應該使用圓括號明確地分組操做符。不要過度依賴默認計算次序,即便它確實是你想要的東西也是如此。使用圓括號沒有什麼壞處,它能消除歧義。
例:(和開發語言相同的習慣,再也不贅述)
SELECT username,id,activation_code,type FROM user WHERE (activation_code IS NOT NULL AND id<22) OR type=1;
IN 操做符:圓括號在WHERE子句中還有另一種用法。IN操做符用來指定條件範圍,範圍中的每一個條件均可以進行匹配。IN取合法值的由逗號分隔的清單,全都括在圓括號中。
其實,這句命令等效於
SELECT username,id,activation_code,type FROM user WHERE type=1 OR type =2 ;
爲何要使用IN操做符?其優勢具體以下:
NOT操做符:WHERE子句中的NOT操做符有且只有一個功能,那就是否認它以後所跟的任何條件。
例:
檢索的爲 type
=0的記錄。
前面介紹的全部操做符都是針對已知值進行過濾的。無論是匹配一個仍是多個值,測試大於仍是小於已知值,或者檢查某個範圍的值,共同點是過濾中使用的值都是已知的。可是,這種過濾方法並非任什麼時候候都好用。例如,怎樣搜索產品名中包含文本anvil的全部產品?用簡單的比較操做符確定不行,必須使用通配符。利用通配符可建立比較特定數據的搜索模式。在這個例子中,若是你想找出名稱包含anvil的全部產品,可構造一個通配符搜索模式,找出產品名中任何位置出現anvil的產品。
通配符(wildcard) 用來匹配值的一部分的特殊字符。
搜索模式(search pattern) 由字面值、通配符或二者組合構成的搜索條件。
通配符自己實際是SQL的WHERE子句中有特殊含義的字符,SQL支持幾種通配符。
爲在搜索子句中使用通配符,必須使用LIKE操做符。LIKE指示MySQL,後跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較。
在搜索串中,%表示任何字符出現任意次數
舉例以下:
搜索的爲:username
開頭是nowcoder
的全部記錄。
根據MySQL的配置方式,搜索能夠是區分大小寫的。
通配符可在搜索模式中任意位置使用,而且可使用多個通配符。下面的例子使用兩個通配符,它們位於模式的兩端:%anvil%這樣的話就能夠找到符合本章開頭的產品記錄了。天然也可放在中間,再也不贅述。
值得注意的是,除了一個或多個字符外,%還能匹配0個字符。%表明搜索模式中給定位置的0個、1個或多個字符。
尾空格可能會干擾通配符匹配。例如,在保存詞anvil 時, 若是它後面有一個或多個空格, 則子句WHEREprod_name LIKE '%anvil'將不會匹配它們,由於在最後的l
後有多餘的字符。解決這個問題的一個簡單的辦法是在搜索模式最後附加一個%。一個更好的辦法是使用函數(本系列第二篇博客將會介紹)去掉首尾空格。
此外,雖然彷佛%通配符能夠匹配任何東西,但有一個例外,即NULL。即便是WHERE prod_name LIKE '%'也不能匹配用值NULL的行。
另外一個有用的通配符是下劃線(_)。下劃線的用途與%同樣,但下劃線只匹配單個字符而不是多個字符。
如上所示,利用的是3個下劃線通配符,匹配的爲username
只有3個字符的記錄。
使用通配符須要注意如下幾點:
Java中已有正則表達式的相關描述,再也不在本篇博客中解釋。
若是你熟悉正則表達式,須要注意:MySQL僅支持多數正則表達式實現的一個很小的子集。本章介紹MySQL支持的大多數內容。
這裏的用例能夠看一下,與章節3相比,將LIKE
操做符換成了REGEXP
,表示將使用正則表達式。REGEXP
後跟的是正則表達式。
再看一個例子:
這裏使用了一個特殊字符.
,含義是匹配任意一個字符。
其實,這裏也能夠用
LIKE
實現,區別在於若是LIKE
匹配的是整個串,而REGEXP
匹配的是子串。
MySQL中的正則表達式匹配(自版本3.23.4後)不區分大小寫(即,大寫和小寫都匹配)。爲區分大小寫,可以使用BINARY關鍵字,如WHERE prod_name REGEXP BINARY 'JetPack .000'。
爲搜索兩個串之一(或者爲這個串,或者爲另外一個串),使用 |
。和Java語言有些相似。
此外,OR匹配還有另外一種描述:
使用中括號,[12]定義一組字符,它的意思是匹配1或2。實際上是[1|2]的縮寫。
使用中括號的好處在於,假定有兩行命令:
SELECT username,id,activation_code,type FROM user WHERE type REGEXP '[12] ton'; SELECT username,id,activation_code,type FROM user WHERE type REGEXP '1|2 ton';
這兩行命令結果是不一樣的,'1|2 ton'返回的是符合正則表達式1或2 ton的全部記錄。
字符集合也能夠被否認,即,它們將匹配除指定字符外的任何東西。爲否認一個字符集,在集合的開始處放置一個便可。所以,儘管[123]匹配字符一、2或3,但中括號中若爲** 123**卻匹配除這些字符外的任何東西。
此外,還可進行簡寫,[123]可直接寫爲[1-3]
爲了匹配特殊字符,必須用\\
爲前導。\\-
表示查找-
,\\.
表示查找.
。
\\也用來引用元字符(具備特殊含義的字符),如表9-1所列。
多數正則表達式實現使用單個反斜槓轉義特殊字符,以便能使用這些字符自己。但MySQL要求兩個反斜槓(MySQL本身解釋一個,正則表達式庫解釋另外一個)。
爲方便工做,SQL預約義了一些字符集,成爲字符類,可見下圖。
接下來說一下,匹配多個實例的狀況下該怎麼作?
試想,若是咱們須要匹配知足正則表達式'stick'和'sticks'的實例,使用OR匹配確實能夠作到,可是有更簡單的方法。舉原文中例子:
匹配多個實例,須要使用\\(匹配內容)
另外還有一個例子值得學習:
目前爲止本博客以上的全部例子都是匹配一個串中任意位置的文本。爲了匹配特定位置的文本,須要使用表9-4列出的定位符。
^的雙重用途 ^有兩種用法。在集合中(用[和]定義),用它來否認該集合,不然,用來指串的開始處。
舉例:
檢索以1結尾的記錄。
LIKE和REGEXP的不一樣在於,LIKE匹配整個串而REGEXP匹配子串。利用定位符,經過用^開始每一個表達式,用$結束每一個表達式,可使REGEXP的做用與LIKE同樣。
字段(field) 基本上與列(column)的意思相同,常常互換使用,不過數據庫列通常稱爲列,而術語字段一般用在計算字段的鏈接上。
存儲在數據庫表中的數據通常不是應用程序所須要的格式。下面舉幾個例子。
在上述每一個例子中,存儲在表中的數據都不是應用程序所須要的。咱們須要直接從數據庫中檢索出轉換、計算或格式化過的數據;而不是檢索出數據,而後再在客戶機應用程序或報告程序中從新格式化。
這就是計算字段發揮做用的所在了。與前面各章介紹過的列不一樣,計算字段並不實際存在於數據庫表中。計算字段是運行時在SELECT語句內建立的。
Concat()拼接串,即把多個串鏈接起來造成一個較長的串。Concat()須要一個或多個指定的串,各個串之間用逗號分隔。
從前面的輸出中能夠看到,SELECT語句拼接地址字段工做得很好。但此新計算列的名字是什麼呢?實際上它沒有名字,它只是一個值。若是僅在SQL查詢工具中查看一下結果,這樣沒有什麼很差。可是,一個未命名的列不能用於客戶機應用中,由於客戶機沒有辦法引用它。
爲了解決這個問題,SQL支持列別名。別名(alias)是一個字段或值的替換名。別名用AS關鍵字賦予。請看下面的SELECT語句:
它指示SQL建立一個包含指定計算的名爲vend_title的計算字段。從輸出中能夠看到,結果與之前的相同,但如今列名爲vend_title,任何客戶機應用均可以按名引用這個列,就像它是一個實際的表列同樣。
這個就比較容易理解了,舉例以下:
demo
列是執行計算id*from_id計算後的列。
本系列瀏覽量太低,MySQL基礎部分將再也不更新,後續可能更新進階部分或進入框架階段。