天天看點

MySQL資料庫

nodejs是需要連接配接mysql的,然後才是真正的伺服器端語言,這裡對資料庫做一個簡單的介紹。

身份證資訊放在公安部的資料庫中。

銀行卡的餘額、交易資訊、轉賬記錄,放在銀行的資料庫伺服器的資料庫中。

qq、微信等使用者資訊放在騰訊的資料庫中。

。。。。

  等等等等,所有的資訊存儲都需要資料庫。

資料庫伺服器 --- 用來運作資料庫服務的一台電腦。如果資料很多,就需要很多台。 資料大多是需要備份的。

資料庫 --- 資料庫伺服器中可以存放很多資料庫。 如銀行卡資訊資料庫、qq資料庫等等。  就像一個網站的伺服器可以托管很多個網站一樣。

資料表 --- 資料庫包含很多資料表。 

資料字段 --- 就是資料表中的列,并不是說一定要是整列,而是列中的關鍵字。

資料行(記錄) ---  就是資料表中的行。

MySQL資料庫

上圖就是一個資料表,它是存放在資料伺服器中的某一個資料庫中的, 其中每一行就是一個記錄,即資料行, 而資料字段就是使用者編号、使用者名、性别等。 這裡使用的是漢字,如果是真實的,一定是用英文來表示的。

對比mysql與mongodb:mysql是sql資料庫,它和nosql(mongodb為代表)是有概念的差別的,比如mysql用的是資料庫、資料表、記錄、字段為核心概念,而mongodb用的是資料庫、集合、文檔為核心概念,即使如此,我們可以将mysql的資料表和mongodb的集合類比,将mysql的記錄和mongodb的文檔類比。

值得注意的是,資料表和資料表之間一般是由關系的, 後面會将到。

  資料庫伺服器可以單獨安裝,但是使用xampp會更加友善一些,如下所示,其中apache和mysql就可以了。這裡的xampp軟體自動包含了apache伺服器(在本地安裝,伺服器和浏覽器一樣,都不過是一個軟體,隻是apache軟體安裝的位置稱為伺服器端,而浏覽器安裝的位置成為用戶端)、mysql伺服器(提供mysql資料庫查詢)、php(即支援php的運作,比如js需要解釋器才能運作,而這裡的php就是供php語言運作的地方)、perl(即提供perl語言運作的解釋器)。并且伺服器端和用戶端并沒有明顯的差別,伺服器端也是有作業系統的,隻是這作業系統中運作的是伺服器軟體,是以我們稱之為伺服器,而你把伺服器端軟體運作在自己的pc電腦上,那麼你的pc電腦也就可以成為伺服器端了。

MySQL資料庫

可能出現的問題:

資料庫可以直接使用xampp下內建的mysql, 但是往往運作mysql時會出現一些不可預料的錯誤,這時将錯誤粘貼下來然後在stackoverflow上搜尋, 上面的高票答案挨個試一遍即可。

但是怎麼檢視使用者名和密碼呢? 啟動mysql伺服器之後,可以進入xampp -> explorer -> phpmyadmin -> config.inc.php中可以檢視user和password的相關配置,也可以修改。

資料庫安裝完成,最重要的就是學習sql語句了。 什麼是sql呢? 它是操作資料庫的核心, structured query language, 即結構化查詢語言,是一種特殊目的的程式設計語言,是一種資料庫查詢和程式設計語言,用于存取資料以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本檔案的擴充名。 

sql最重要的是關系資料庫操作語言,學習好了mysql總的sql語句,其他的文法學起來也是萬變不離其宗。

sql語句按照其功能的不同可以分為三類:

資料定義語言(ddl ,data defintion language)語句:資料定義語句,用于定義不同的資料段、資料庫、表、列、索引等。常用的語句關鍵字包括create、drop、alter等。

資料操作語言(dml , data manipulation language)語句:資料操縱語句,用于添加、删除、更新和查詢資料庫記錄,并檢查資料的完整性。常用的語句關鍵字主要包括insert、delete、update和select等。

資料控制語言(dcl, data control language)語句:資料控制語句,用于控制不同資料段直接的許可和通路級别的語句。這些語句定義了資料庫、表、字段、使用者的通路權限和安全級别。主要的語句關鍵字包括grant、revoke等。

在xampp面闆的右上方點選shell, 然後輸入mysql,就可進入mysql的環境。

如果有時候不能直接進入,就需要我們使用下面的方法登入了;

MySQL資料庫

 可以認為-h表示連結位址在哪, -u表示user使用者名輸入,比如這裡的使用者名是root, -p表示password輸入。

注意:如果我們直接在本地開了xampp,那麼就可以輸入 mysql -u root -p, 接着shell就會提示輸入密碼,輸入完密碼之後就可以看到效果了。
MySQL資料庫

   如上所示,就可以連接配接到mysql了,但我們在最後一行看到的是: mariadb,它和mysql有什麼差別呢?實際上兩者差別很小,mariadb是mysql之父離開sun(java和mysql的公司)之後自己開源的資料庫,目前發展也很好。

基本文法如下:

MySQL資料庫

注意: 在結尾一定要加分号。 query ok 表示請求成功,即執行指令成功。 1 row affected 表示本次操作隻影響了資料庫中的其中一行的記錄。因為隻是建立了一個資料庫,是以database沒有分号。

 即檢視所有的資料庫。

MySQL資料庫

可以看到我的資料庫伺服器中存放了8個資料庫。

nodejs使用的是show dbs,比mysql更加簡潔。 

即選中其中的某一個資料庫,然後就可以對其操作了,當然這個資料庫一定是屬于show databases;中的某一個。

MySQL資料庫

在輸入基本指令之後,可以發現database changed , 這表示資料庫切換成功。

注意:我們不難發現,在切換了資料庫之後,mariadb後面的方括号中就是表示目前所在的資料庫。 而最考試我們沒有進入資料庫時, mariadb後面顯示的none。

我們可以看到,mysql的建立資料庫和使用資料庫是兩種操作,而mongodb隻用了use db,即如果有這個資料庫,就切換,沒有就建立。是以mongodb比mysql更崇尚簡潔。 

表示顯示目前資料庫下的所有的資料表。

MySQL資料庫

基本用法如下:

注意: 一旦删除了某個資料庫,這個資料庫下所有的資料表也會被删除了。

MySQL資料庫
 mongodb使用的是db.dropdatabase(),可見,mongodb在資料庫操作上,更多的還是獨立的sql語句,而mongodb的函數用的較多。

其中的自動名就是id、sex、name等這樣的名稱。 而字段類型表示這個字段下是什麼類型, 一般int代表整型、 float代表浮點型、char和varchar代表字元串。一般我們還可以在類型後添加長度,用()括起來。

MySQL資料庫

注意: 在建立資料表的時候,我遇到的問題是建立失敗,提示資料庫時隻讀的, 解決方法是先去看stackoverflow。 上面的教程是将mysql中config下的某一行删除,然後重新使用mysql -h....這種形式登入即可。

這樣就建立了一個資料表,其中包含id字段和name字段,id字段限定輸入的是整型, name字段限定輸入的是字元型。

  在建立表這方面來說,mongodb的方式是直接對一個集合插入文檔,這樣,同時也就建立了集合,并且mongodb和javascript類似,對于類型都是沒有要求的,建立文檔時,沒有規定必要的類型; 而mysql建立表實際上就是在建立表,而沒有插入記錄,并且在建立表的過程中,就是建立字段的過程,并且給每個字段具體的類型。是以,mysql比mongodb更加限制類型,嚴謹。 就像java需要類型限制,而javascript比較寬松一樣。另外,在mysql建立資料表時,才調用了函數,而其他情況下并沒有。

在建立表最後,我們常用myisam或者innodb引擎。基本文法如下:

還可以制定預設字元集。基本文法如下:

最後組合起來即可:

MySQL資料庫

其中desc是描述的意思,即description。 當然這個操作必須在某個資料庫的情況下進行操作。

MySQL資料庫

其中field表示字段, type表示這些字段的類型, null表示是否支援輸入為null,即無内容時,我們可以使用null來輸入,并且預設也是null。

 mongodb使用的是db.<集合名>.find(),由此同樣可以看出mongodb更多使用的是函數調用,而mysql使用的簡單的語句。 
MySQL資料庫

即這就是我之前建立的ceshi資料表的建立語句。

MySQL資料庫
mognodb中删除集合使用的時mongodb.<集合名>.drop(),即調用函數的方式。 
MySQL資料庫

注意:這裡的關鍵字是 修改、類型。 基本文法如下:

 即将表中的一個字段修改其類型為varchar(20)。 

MySQL資料庫

可以看到我們通過這種方式可以将其中的id字段的類型由int(10)修改為了int(20)。

MySQL資料庫

即在zhiding表中添加了類型為varchar(5)的字段sex。 

剛剛我們再添加字段時,預設是添加在尾部的,如果我們希望添加到中間部分呢? 基本文法如下:

不同之處僅在于添加了after 字段名,表示在某個字段之後添加。如果希望添加在第一行,将after 字段名 直接替換成 first 即可。

MySQL資料庫

可以看到有沒有column都是可以的。  并且在指令行中,是不區分大小寫的。 是以使用大小寫都是一樣的。

MySQL資料庫

 mysql中存放的是資料,是以說資料就要有資料類型,我們再存放資料時也要規定資料的類型,并且要滿足資料長度的要求。

 在mysql中我們将資料分為以下的類型:

數值類型(整型、浮點),如int、float

字元串類型, 如 char、varchar

日期時間類型,如data

複合類型

空間類型(非科學性工作基本不用,這裡不講解)

MySQL資料庫

注意:

1.在建立表字段時,性别我們可以使用無符号的微小整型(tinyint)來表示。用0表示女、用1表示男。用2表示未知。

2.同樣人類年齡也是,在建立表字段時可用用無符号的整型。因為人類的年齡還沒有負數

3.在實際使用過程中。我們業務中最大需要存儲多大的數值。我們建立表時,就選擇什麼樣的類型來存儲這樣的值。

MySQL資料庫

1.浮點是非精确值,會存在不太準确的情況

2.而decimal叫做定點數。在mysql内部,本質上是用字元串存儲的。實際使用過程中如果存在金額、錢精度要求比較高的浮點數存儲,建議使用decimal(定點數)這個類型。

MySQL資料庫

其中char類型表示定長字元串,如果比之規定的長,就截取; 如果比他規定的短,就用空格來填補。

而varchar不是定長的。因為 varchar 類型可以根據實際内容動态改變存儲值的長度,是以在不能确定字段需要多少字元時使用 varchar 類型可以大大地節約磁盤空間、提高存儲效率。

text類型與blob類型 對于字段長度要求超過 255 個的情況下,mysql 提供了 text 和 blob 兩種類型。根據存儲資料的大小,它們都有不同的子類型。這些大型的資料用于存儲文本塊或圖像、

聲音檔案等二進制資料類型。

MySQL資料庫

一般用的比較少,多用int來存儲。

MySQL資料庫

unsigned(無符号)

 主要用于整型和浮點類型,使用無符号。即,沒有前面面的-(負号)。存儲位數更長。tinyint整型的取值區間為,-128~127。而使用無符号後可存儲0-255個長度。

建立時在類型後面接上 unsigned 即可。

zerofill(0填充)

 0(不是空格)可以用來真補輸出的值。使用這個修飾符可以阻止 mysql 資料庫存儲負值。

建立時在類型後面接上 zerofill 即可。

default(預設)

 default屬性確定在沒有任何值可用的情況下,賦予某個常量值,這個值必須是常量,因為mysql不允許插入函數或表達式值。此外,此屬性無法用于blob或text列。如果已經為此列指定了null屬性,沒有指定預設值時預設值将為null,否則預設值将依賴于字段的資料類型。

not null (非null)

 如果将一個列定義為not null,将不允許向該列插入null值。建議在重要情況下始終使用not null屬性,因為它提供了一個基本驗證,確定已經向查詢傳遞了所有必要的值。

 建立時在整型或浮點字段語句後接上 not null 即可。

舉例如下所示:

字元集就是将各種文字編碼為二進制數字(十六進制也是可以的,本質一樣)的方式, 即這是讓一般文字存儲在計算機的一種通用的規則, 字元集有很多, 我們常用的有下面幾種:

MySQL資料庫

ascii:

ascii 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字元。标準ascii 碼也叫基礎ascii碼,使用7 位二進制數來表示所有的大寫和小寫字母,數字0 到9、标點符号, 以及在美式英語中使用的特殊控制字元 。 但是ascii能表示的字元很少,是以中文是不支援的。單位元組。 

gbk:

gbk 向下與 gb 2312 編碼相容。是中華人民共和國定義的漢字計算機編碼規範。早期版本為gb2312。  即這個僅僅是支援中文的。 但是僅僅表示中文的時候, 節約記憶體,因為他是雙位元組的  。

unicode:

unicode(統一碼、萬國碼、單一碼)unicode是國際組織制定的可以容納世界上所有文字和符号的字元編碼方案。以滿足跨語言、跨平台進行文本轉換、處理的要求。 但是不難看出, 4位元組還是非常消耗記憶體的。

utf-8:

是一種針對unicode的可變長度字元編碼,也是萬國碼。因為unicode比ascii占用大一倍的空間,而對ascii來說高位元組的0對他毫無用處。為了解決這個問題,就出現了一些中間格式的字元集,他們被稱為通用轉換格式,即utf(universal transformation format)

綜上可知,在實際工作中,我們比較常用的編碼方式就是unicode和utf-8這兩種編碼方式。

mysql的很大的一個特點就是他的插件式表引擎,根據不同的特點使用不同的存儲引擎,使得存儲性能最大化。在mysql中使用下面的指令可以檢視所支援的所有表引擎。

MySQL資料庫

下面介紹幾個常用的引擎和幾個不常用的引擎。

myisam --- 常用引擎,特點: 讀取效率很高。

innodb --- 常用引擎, 特點:寫入、事務等支援。

ndb --- 不常用,特點:主要在mysql 叢集伺服器中使用,不做介紹

archive --- 不常用,特點:歸檔引擎,壓縮比高達1:10,用于資料歸檔

myisam:

    不支援事務,表鎖(表級鎖,加鎖會鎖住整個表),支援全文索引,操作速度快。常用于讀取多的業務。

innodb:

支援事務,主要面向線上事務處理(oltp)方面的應用。

行鎖設計,支援外鍵,即預設情況下讀取操作不加鎖

 innodb是為處理巨大資料量時的最大性能設計。

說明:

行鎖。 寫入、更新操作的時候,将這一行鎖起來, 不讓其他人再操作了。

表鎖。 寫入、更新操作時,将這個表給鎖起來,不讓其他人再操作了。

事務。 可同時操作多個資料,若其中的一個資料操作失敗,就會復原到操作之前。 常用于銀行、電商、金融等系統中。

索引其實就類似于書中的目錄,有了索引就更加友善我們查找。不使用索引,mysql必須從第1條記錄開始然後讀完整個表直到找出相關的行。表越大,花費的時間越多。如果表中查詢的列有一個索引,mysql能快速到達一個位置去搜尋到資料檔案的中間,沒有必要看所有資料。mysql中的索引類型有以下幾種方式:

MySQL資料庫

普通索引:

即為某個表的某個字段增加索引。

唯一索引:

即為某個表的某個字段增加唯一索引。

全文索引:

即為某個表的某個字段增加全文索引

主鍵索引:

 即為某個表的某個字段增加主鍵索引。

在建立表時也可以聲明索引,如下所示:

對于資料庫的操作實際上就是增删改查。 這些基本功做好了,對資料庫的操作也就遊刃有餘了。

插入記錄有兩種基本文法。

文法一:

文法二:

  

顯然,兩種文法是有差別的:

文法一要求:在表中有多少個字段,就要上傳多少個值,如果其中某些字段是有預設值,不想上傳覆寫,就傳入null。 并且值的順序和字段的順序也要保持一緻。  

文法二要求:對于表中的預設字段,可以不上傳, mysql會自動補齊預設值。

 另外,對于第一種文法,我們也可以一次性增加多各記錄, 隻要在values後添加多個()即可,用逗号隔開,如下所示:

為了查資料,首先我們建立一個資料表。

MySQL資料庫

即建立了包含id、username、age三個字段的表。 

下面我們向其中添加字段:

MySQL資料庫

查詢全部:

然後我們就可以查詢,查詢表中的所有記錄的基本文法如下:

MySQL資料庫

指定字段查詢:

基本文法如下:

MySQL資料庫

查詢字段不重複的記錄:

 為了示範,我新增一條記錄,使得age有相等的兩條記錄。如下:

MySQL資料庫

條件查詢where

MySQL資料庫

可以看到*表示的是如果有,就傳回一條記錄,而不是其中的字段, age=50即傳回age等于50字段所在的記錄。

下面的符号也是可以的:

MySQL資料庫
MySQL資料庫

 基本文法如下:

其中排序關鍵詞有兩個:

asc --- 升序排列,由小到大

desc --- 降序排列,由大到小

MySQL資料庫

上面的例子是根據其中某一個字段來排序,現在我們可以進行多字段排序。 即第一個已經排好,則第二個不再生效,否則第二個生效。。。

MySQL資料庫

通過上面的兩個例子,很容易看出他們的差別。

對于查詢或者排序後的結果集,如果我們不希望顯示全部,比如就想知道一次比賽中的前三名是誰,這就是結果集限制。

MySQL資料庫

上例中我們就把年齡最大的三者篩選了出來。

 

上面我們是預設從第一條記錄開始的,但是如果我們希望留下中間的幾條呢,文法如下:

MySQL資料庫
MySQL資料庫

基本使用文法如下:

MySQL資料庫

 比如我們再查詢使用者購買情況時,至少需要兩張表,第一張儲存了使用者的基本資訊,包括name,password,id等。 第二章表上儲存了使用者的購買記錄。 即一旦有一個使用者購買,就将這個記錄插入表中。

于是這樣的查詢就是聯合查詢,而要做到聯合查詢就要進行表連接配接。

表連接配接分為内連接配接和外連接配接。 具體定義後面會講到。

既然需要進行表連接配接,那麼就得有兩個表! 

http://www.shouce.ren/api/view/a/13995

這一部分隻是等到需要的時候再學吧。

修改一個字段,文法如下:

MySQL資料庫

 這裡是修改其中一個字段,我們還可以修改多個字段。

基本文法如下所示:

MySQL資料庫

關鍵: 對于其中的username下的值,他們都是字元串,是以一定要寫成 username="zuzhidao", 而不是username=buzhidao, 因為系統會将buzhidao當做一個變量,而這個變量又沒有聲明和定義,是以會報錯。

删除記錄的基本文法如下:

注意:這裡一删除就是删掉一條記錄,而不難隻删除其中的一個字段。

清空表記錄基本文法如下:

這條指令會直接将一個表删除。