MySQL基礎篇(一)

本文主要內容爲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; //導入測試數據

1.基礎概念

這些概念都是基本常識,總結下來能夠瀏覽一下。數據庫

數據庫(database)指保存有組織的數據的容器(一般是一個文件或一組文件)。框架

表(table)指某種特定類型數據的結構化清單。數據庫設計

表是一種結構化的文件,可用來存儲某種特定類型的數據。表能夠保存顧客清單、產品目錄,或者其餘信息清單。表名具備惟一性,同一個數據庫下,不該有兩個相同名字的表。函數

表具備一些特性,這些特性定義了數據在表中如何存儲,如能夠存儲什麼樣的數據,數據如何分解,各部分信息如何命名,等等。描述表的這組信息就是所謂的模式,模式能夠用來描述數據庫中特定的表以及整個數據庫(和其中表的關係)。工具

模式(schema)指關於數據庫和表的佈局及特性的信息。

有些資料上的模式和數據庫含義相同,須要注意

列(column)指表中的一個字段。全部表都是由一個或多個列組成的。

數據類型(datatype)指所允許的數據的類型。每一個表列都有相應的數據類型,它限制(或允許)該列中存儲的數據。

行(row)指表中的一個記錄。

主鍵(primary key)指一列(或一組列),其值可以惟一區分表中每一個行。能夠着重理解key

表中的任何列均可以做爲主鍵,只要它知足如下條件:

  • 任意兩行都不具備相同的主鍵值;
  • 每一個行都必須具備一個主鍵值(主鍵列不容許NULL值)。

除MySQL強制實施的規則外,應該堅持的幾個廣泛承認的最好習慣爲:

  • 不更新主鍵列中的值;
  • 不重用主鍵列的值;
  • 不在主鍵列中使用可能會更改的值。(例如,若是使用一個名字做爲主鍵以標識某個供應商,當該供應商合併和更改其名字時,必須更改這個主鍵。)

2.使用Mysql

在CMD中鍵入mysql -uroot -p

進入mysql狀態,接下來須要鍵入密碼

  • 命令輸入在 mysql> 以後;
  • 命令用 ;\g 結束,換句話說,僅按 Enter 不執行命令;
  • 輸入 help\h 得到幫助,也能夠輸入更多的文本得到特定命令的幫助(如,輸入 help select 得到使用SELECT語句的幫助);
  • 輸入 quitexit 退出命令行實用程序。

2.1 關鍵字

MySQL中一樣具備關鍵字。如:ues, show, SELECT等等(cmd中不區分大小寫)

先舉例一些基本的命令:

  • use + 名字(database);打開某數據庫
  • show databases;返回可用數據庫的一個列表
  • show tables;返回當前選擇的數據庫內可用表的列表
  • show columns from 名字(table);這個命令要求給出表名,返回表中的屬性信息。它對每一個字段返回一行,行中包含字段名、數據類型、是否容許NULL、鍵信息、默認值以及其餘信息(如字段id的auto_increment)。此外,須要注意的是此命令等效於describe 名字(table)

舉例:

什麼是自動增量? 某些表列須要惟一值。例如,訂單編號、僱員ID或(如上面例子中所示的)顧客ID。在每一個行添加到表中時,MySQL能夠自動地爲每一個行分配下一個可用編號,不用在添加一行時手動分配惟一值(這樣作必須記住最後一次使用的值)。這個功能就是所謂的自動增量。若是須要它,則必須在用CREATE語句建立表時把它做爲表定義的組成部分。咱們將在第21章中介紹CREATE語句。

此外,相關的show命令還有:

MySQL 5支持一個新的INFORMATION_SCHEMA命令,可用它來得到和過濾模式信息。

2.2 檢索語句(SELECT)

上述語句利用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能夠指定從行號爲第一個值的位置開始。

值得注意的是:

  • 檢索出來的第一行爲行0而不是行1。所以,LIMIT 1,1 將檢索出第二行而不是第一行。
  • 行數不夠時,LIMIT中指定要檢索的行數爲檢索的最大行數。若是沒有足夠的行(例如,給出LIMIT 10, 5,但只有13行),MySQL將只返回它能返回的那麼多行。

此外,LIMIT還有一種表示方法: LIMIT 10,5等效於 LIMIT 5 OFFSET 10第一個數字爲檢索的行數,第二個數字爲偏移量即開始的位置。

徹底限定

有一些情形須要徹底限定名,例如:使用徹底限定的名字來引用列(同時使用表名和列字)。表名也能夠是徹底限定的。(community是數據庫,user爲其中一個表,id爲user中的一個列)

2.3 排序檢索

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關鍵字。

注意:對哪一個列進行降序排列,就須要在列後加 DESCORDER BY默認是升序,關鍵字爲 ASC

在對文本性的數據進行排序時,A與a相同嗎?a位於B以前仍是位於Z以後?這些問題不是理論問題,其答案取決於數據庫如何設置。
在字典(dictionary)排序順序中,A被視爲與a相同,這是MySQL(和大多數數據庫管理系統)的默認行爲。可是,許多數據庫管理員可以在須要時改變這種行爲(若是你的數據庫包含大量外語字符,可能必須這樣作)。

注意,使用的時候,LIMIT要放在ORDER BY以後,不然會報錯。

2.3部分學習瞭如何用SELECT語句的ORDER BY子句對檢索出的數據進行排序。這個子句必須是SELECT語句中的最後一條子句。

2.4 過濾數據(WHERE)

過濾數據,即指定數據的搜索條件,畢竟在實際應用中檢索全部數據的狀況是很少的。

在SELECT語句中,數據根據WHERE子句中指定的搜索條件進行過濾。WHERE子句在表名(FROM子句)以後給出。這個例子採用的是相等測試:它檢查一個列是否具備指定的值,據此進行過濾。可是SQL容許作的事情不只僅是相等測試。

在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE以後,不然將會產生錯誤

值得注意的是,

MySQL在執行匹配時默認不區分大小寫,因此systemSYSTEM匹配。

範圍值檢查

爲了檢查某個範圍的值,可以使用BETWEEN操做符。其語法與其餘WHERE子句的操做符稍有不一樣,由於它須要兩個值,即範圍的開始值和結束值。
例如,BETWEEN操做符可用來檢索id在11和22之間的全部用戶名。

從這個例子中能夠看到,在使用BETWEEN時,必須指定兩個值——所需範圍的低端值和高端值。這兩個值必須用AND關鍵字分隔。BETWEEN匹配範圍中全部的值,包括指定的開始值和結束值。

空值檢查

在建立表時,表設計人員能夠指定其中的列是否能夠不包含值。在一個列不包含值時,稱其爲包含空值NULL。

NULL 無值(no value),它與字段包含0、空字符串或僅僅包含空格不一樣

組合WHERE子句

爲了進行更強的過濾控制,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操做符?其優勢具體以下:

  • 在使用長的合法選項清單時,IN操做符的語法更清楚且更直觀。
  • 在使用IN時,計算的次序更容易管理(由於使用的操做符更少)。
  • IN操做符通常比OR操做符清單執行更快。
  • IN的最大優勢是能夠包含其餘SELECT語句,使得可以更動態地創建WHERE子句。(將在第二篇博客子查詢部分詳解)

NOT操做符:WHERE子句中的NOT操做符有且只有一個功能,那就是否認它以後所跟的任何條件。

例:

檢索的爲 type =0的記錄。

3.使用通配符進行過濾

前面介紹的全部操做符都是針對已知值進行過濾的。無論是匹配一個仍是多個值,測試大於仍是小於已知值,或者檢查某個範圍的值,共同點是過濾中使用的值都是已知的。可是,這種過濾方法並非任什麼時候候都好用。例如,怎樣搜索產品名中包含文本anvil的全部產品?用簡單的比較操做符確定不行,必須使用通配符。利用通配符可建立比較特定數據的搜索模式。在這個例子中,若是你想找出名稱包含anvil的全部產品,可構造一個通配符搜索模式,找出產品名中任何位置出現anvil的產品。

通配符(wildcard) 用來匹配值的一部分的特殊字符。

搜索模式(search pattern) 由字面值、通配符或二者組合構成的搜索條件。

通配符自己實際是SQL的WHERE子句中有特殊含義的字符,SQL支持幾種通配符。

爲在搜索子句中使用通配符,必須使用LIKE操做符。LIKE指示MySQL,後跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較。

3.1 百分號(%)通配符

在搜索串中,%表示任何字符出現任意次數

舉例以下:

搜索的爲:username開頭是nowcoder的全部記錄。

根據MySQL的配置方式,搜索能夠是區分大小寫的。

通配符可在搜索模式中任意位置使用,而且可使用多個通配符。下面的例子使用兩個通配符,它們位於模式的兩端:%anvil%這樣的話就能夠找到符合本章開頭的產品記錄了。天然也可放在中間,再也不贅述。

值得注意的是,除了一個或多個字符外,%還能匹配0個字符。%表明搜索模式中給定位置的0個、1個或多個字符。

尾空格可能會干擾通配符匹配。例如,在保存詞anvil 時, 若是它後面有一個或多個空格, 則子句WHEREprod_name LIKE '%anvil'將不會匹配它們,由於在最後的l後有多餘的字符。解決這個問題的一個簡單的辦法是在搜索模式最後附加一個%。一個更好的辦法是使用函數(本系列第二篇博客將會介紹)去掉首尾空格。

此外,雖然彷佛%通配符能夠匹配任何東西,但有一個例外,即NULL。即便是WHERE prod_name LIKE '%'也不能匹配用值NULL的行。

3.2 下劃線(_)通配符

另外一個有用的通配符是下劃線(_)。下劃線的用途與%同樣,但下劃線只匹配單個字符而不是多個字符。

如上所示,利用的是3個下劃線通配符,匹配的爲username只有3個字符的記錄。

使用通配符須要注意如下幾點:

  • 不要過分使用通配符。若是其餘操做符能達到相同的目的,應該使用其餘操做符。
  • 在確實須要使用通配符時,除非絕對有必要,不然不要把它們用在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起來是最慢的。
  • 仔細注意通配符的位置。若是放錯地方,可能不會返回想要的數據。

4.使用正則表達式進行搜索

Java中已有正則表達式的相關描述,再也不在本篇博客中解釋。

若是你熟悉正則表達式,須要注意:MySQL僅支持多數正則表達式實現的一個很小的子集。本章介紹MySQL支持的大多數內容。

4.1 基本字符匹配

這裏的用例能夠看一下,與章節3相比,將LIKE操做符換成了REGEXP,表示將使用正則表達式。REGEXP後跟的是正則表達式。

再看一個例子:

這裏使用了一個特殊字符.,含義是匹配任意一個字符。

其實,這裏也能夠用LIKE實現,區別在於若是LIKE匹配的是整個串,而REGEXP匹配的是子串。

MySQL中的正則表達式匹配(自版本3.23.4後)不區分大小寫(即,大寫和小寫都匹配)。爲區分大小寫,可以使用BINARY關鍵字,如WHERE prod_name REGEXP BINARY 'JetPack .000'

4.2 進行OR匹配

爲搜索兩個串之一(或者爲這個串,或者爲另外一個串),使用 | 。和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'返回的是符合正則表達式12 ton的全部記錄。

字符集合也能夠被否認,即,它們將匹配除指定字符外的任何東西。爲否認一個字符集,在集合的開始處放置一個便可。所以,儘管[123]匹配字符一、2或3,但中括號中若爲** 123**卻匹配除這些字符外的任何東西。

此外,還可進行簡寫,[123]可直接寫爲[1-3]

爲了匹配特殊字符,必須用\\爲前導。\\-表示查找-,\\.表示查找.

\\也用來引用元字符(具備特殊含義的字符),如表9-1所列。

多數正則表達式實現使用單個反斜槓轉義特殊字符,以便能使用這些字符自己。但MySQL要求兩個反斜槓(MySQL本身解釋一個,正則表達式庫解釋另外一個)。

4.3 字符類

爲方便工做,SQL預約義了一些字符集,成爲字符類,可見下圖。

接下來說一下,匹配多個實例的狀況下該怎麼作?

試想,若是咱們須要匹配知足正則表達式'stick'和'sticks'的實例,使用OR匹配確實能夠作到,可是有更簡單的方法。舉原文中例子:

匹配多個實例,須要使用\\(匹配內容)

另外還有一個例子值得學習:

4.4 定位符

目前爲止本博客以上的全部例子都是匹配一個串中任意位置的文本。爲了匹配特定位置的文本,須要使用表9-4列出的定位符。

^的雙重用途 ^有兩種用法。在集合中(用[和]定義),用它來否認該集合,不然,用來指串的開始處。

舉例:

檢索以1結尾的記錄。

LIKEREGEXP的不一樣在於,LIKE匹配整個串而REGEXP匹配子串。利用定位符,經過用^開始每一個表達式,用$結束每一個表達式,可使REGEXP的做用與LIKE同樣。

5.建立計算字段

字段(field) 基本上與列(column)的意思相同,常常互換使用,不過數據庫列通常稱爲列,而術語字段一般用在計算字段的鏈接上。

存儲在數據庫表中的數據通常不是應用程序所須要的格式。下面舉幾個例子。

  • 若是想在一個字段中既顯示公司名,又顯示公司的地址,但這兩個信息通常包含在不一樣的表列中。
  • 城市、州和郵政編碼存儲在不一樣的列中(應該這樣),但郵件標籤打印程序卻須要把它們做爲一個恰當格式的字段檢索出來。
  • 列數據是大小寫混合的,但報表程序須要把全部數據按大寫表示出來。
  • 物品訂單表存儲物品的價格和數量,但不須要存儲每一個物品的總價格(用價格乘以數量便可)。爲打印發票,須要物品的總價格。須要根據表數據進行總數、平均數計算或其餘計算。

在上述每一個例子中,存儲在表中的數據都不是應用程序所須要的。咱們須要直接從數據庫中檢索出轉換、計算或格式化過的數據;而不是檢索出數據,而後再在客戶機應用程序或報告程序中從新格式化。

這就是計算字段發揮做用的所在了。與前面各章介紹過的列不一樣,計算字段並不實際存在於數據庫表中。計算字段是運行時在SELECT語句內建立的。

5.1 拼接字段Concat()

Concat()拼接串,即把多個串鏈接起來造成一個較長的串。Concat()須要一個或多個指定的串,各個串之間用逗號分隔。

從前面的輸出中能夠看到,SELECT語句拼接地址字段工做得很好。但此新計算列的名字是什麼呢?實際上它沒有名字,它只是一個值。若是僅在SQL查詢工具中查看一下結果,這樣沒有什麼很差。可是,一個未命名的列不能用於客戶機應用中,由於客戶機沒有辦法引用它。

爲了解決這個問題,SQL支持列別名。別名(alias)是一個字段或值的替換名。別名用AS關鍵字賦予。請看下面的SELECT語句:

它指示SQL建立一個包含指定計算的名爲vend_title的計算字段。從輸出中能夠看到,結果與之前的相同,但如今列名爲vend_title,任何客戶機應用均可以按名引用這個列,就像它是一個實際的表列同樣。

5.2 執行算術計算

這個就比較容易理解了,舉例以下:

demo 列是執行計算id*from_id計算後的列。

本系列瀏覽量太低,MySQL基礎部分將再也不更新,後續可能更新進階部分或進入框架階段。

相關文章
相關標籤/搜索