nodejs是需要連接配接mysql的,然後才是真正的伺服器端語言,這裡對資料庫做一個簡單的介紹。
身份證資訊放在公安部的資料庫中。
銀行卡的餘額、交易資訊、轉賬記錄,放在銀行的資料庫伺服器的資料庫中。
qq、微信等使用者資訊放在騰訊的資料庫中。
。。。。
等等等等,所有的資訊存儲都需要資料庫。
資料庫伺服器 --- 用來運作資料庫服務的一台電腦。如果資料很多,就需要很多台。 資料大多是需要備份的。
資料庫 --- 資料庫伺服器中可以存放很多資料庫。 如銀行卡資訊資料庫、qq資料庫等等。 就像一個網站的伺服器可以托管很多個網站一樣。
資料表 --- 資料庫包含很多資料表。
資料字段 --- 就是資料表中的列,并不是說一定要是整列,而是列中的關鍵字。
資料行(記錄) --- 就是資料表中的行。
上圖就是一個資料表,它是存放在資料伺服器中的某一個資料庫中的, 其中每一行就是一個記錄,即資料行, 而資料字段就是使用者編号、使用者名、性别等。 這裡使用的是漢字,如果是真實的,一定是用英文來表示的。
對比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電腦也就可以成為伺服器端了。
可能出現的問題:
資料庫可以直接使用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的環境。
如果有時候不能直接進入,就需要我們使用下面的方法登入了;
可以認為-h表示連結位址在哪, -u表示user使用者名輸入,比如這裡的使用者名是root, -p表示password輸入。
注意:如果我們直接在本地開了xampp,那麼就可以輸入 mysql -u root -p, 接着shell就會提示輸入密碼,輸入完密碼之後就可以看到效果了。
如上所示,就可以連接配接到mysql了,但我們在最後一行看到的是: mariadb,它和mysql有什麼差別呢?實際上兩者差別很小,mariadb是mysql之父離開sun(java和mysql的公司)之後自己開源的資料庫,目前發展也很好。
基本文法如下:
注意: 在結尾一定要加分号。 query ok 表示請求成功,即執行指令成功。 1 row affected 表示本次操作隻影響了資料庫中的其中一行的記錄。因為隻是建立了一個資料庫,是以database沒有分号。
即檢視所有的資料庫。
可以看到我的資料庫伺服器中存放了8個資料庫。
nodejs使用的是show dbs,比mysql更加簡潔。
即選中其中的某一個資料庫,然後就可以對其操作了,當然這個資料庫一定是屬于show databases;中的某一個。
在輸入基本指令之後,可以發現database changed , 這表示資料庫切換成功。
注意:我們不難發現,在切換了資料庫之後,mariadb後面的方括号中就是表示目前所在的資料庫。 而最考試我們沒有進入資料庫時, mariadb後面顯示的none。
我們可以看到,mysql的建立資料庫和使用資料庫是兩種操作,而mongodb隻用了use db,即如果有這個資料庫,就切換,沒有就建立。是以mongodb比mysql更崇尚簡潔。
表示顯示目前資料庫下的所有的資料表。
基本用法如下:
注意: 一旦删除了某個資料庫,這個資料庫下所有的資料表也會被删除了。
mongodb使用的是db.dropdatabase(),可見,mongodb在資料庫操作上,更多的還是獨立的sql語句,而mongodb的函數用的較多。
其中的自動名就是id、sex、name等這樣的名稱。 而字段類型表示這個字段下是什麼類型, 一般int代表整型、 float代表浮點型、char和varchar代表字元串。一般我們還可以在類型後添加長度,用()括起來。
注意: 在建立資料表的時候,我遇到的問題是建立失敗,提示資料庫時隻讀的, 解決方法是先去看stackoverflow。 上面的教程是将mysql中config下的某一行删除,然後重新使用mysql -h....這種形式登入即可。
這樣就建立了一個資料表,其中包含id字段和name字段,id字段限定輸入的是整型, name字段限定輸入的是字元型。
在建立表這方面來說,mongodb的方式是直接對一個集合插入文檔,這樣,同時也就建立了集合,并且mongodb和javascript類似,對于類型都是沒有要求的,建立文檔時,沒有規定必要的類型; 而mysql建立表實際上就是在建立表,而沒有插入記錄,并且在建立表的過程中,就是建立字段的過程,并且給每個字段具體的類型。是以,mysql比mongodb更加限制類型,嚴謹。 就像java需要類型限制,而javascript比較寬松一樣。另外,在mysql建立資料表時,才調用了函數,而其他情況下并沒有。
在建立表最後,我們常用myisam或者innodb引擎。基本文法如下:
還可以制定預設字元集。基本文法如下:
最後組合起來即可:
其中desc是描述的意思,即description。 當然這個操作必須在某個資料庫的情況下進行操作。
其中field表示字段, type表示這些字段的類型, null表示是否支援輸入為null,即無内容時,我們可以使用null來輸入,并且預設也是null。
mongodb使用的是db.<集合名>.find(),由此同樣可以看出mongodb更多使用的是函數調用,而mysql使用的簡單的語句。
即這就是我之前建立的ceshi資料表的建立語句。
mognodb中删除集合使用的時mongodb.<集合名>.drop(),即調用函數的方式。
注意:這裡的關鍵字是 修改、類型。 基本文法如下:
即将表中的一個字段修改其類型為varchar(20)。
可以看到我們通過這種方式可以将其中的id字段的類型由int(10)修改為了int(20)。
即在zhiding表中添加了類型為varchar(5)的字段sex。
剛剛我們再添加字段時,預設是添加在尾部的,如果我們希望添加到中間部分呢? 基本文法如下:
不同之處僅在于添加了after 字段名,表示在某個字段之後添加。如果希望添加在第一行,将after 字段名 直接替換成 first 即可。
可以看到有沒有column都是可以的。 并且在指令行中,是不區分大小寫的。 是以使用大小寫都是一樣的。
mysql中存放的是資料,是以說資料就要有資料類型,我們再存放資料時也要規定資料的類型,并且要滿足資料長度的要求。
在mysql中我們将資料分為以下的類型:
數值類型(整型、浮點),如int、float
字元串類型, 如 char、varchar
日期時間類型,如data
複合類型
空間類型(非科學性工作基本不用,這裡不講解)
注意:
1.在建立表字段時,性别我們可以使用無符号的微小整型(tinyint)來表示。用0表示女、用1表示男。用2表示未知。
2.同樣人類年齡也是,在建立表字段時可用用無符号的整型。因為人類的年齡還沒有負數
3.在實際使用過程中。我們業務中最大需要存儲多大的數值。我們建立表時,就選擇什麼樣的類型來存儲這樣的值。
1.浮點是非精确值,會存在不太準确的情況
2.而decimal叫做定點數。在mysql内部,本質上是用字元串存儲的。實際使用過程中如果存在金額、錢精度要求比較高的浮點數存儲,建議使用decimal(定點數)這個類型。
其中char類型表示定長字元串,如果比之規定的長,就截取; 如果比他規定的短,就用空格來填補。
而varchar不是定長的。因為 varchar 類型可以根據實際内容動态改變存儲值的長度,是以在不能确定字段需要多少字元時使用 varchar 類型可以大大地節約磁盤空間、提高存儲效率。
text類型與blob類型 對于字段長度要求超過 255 個的情況下,mysql 提供了 text 和 blob 兩種類型。根據存儲資料的大小,它們都有不同的子類型。這些大型的資料用于存儲文本塊或圖像、
聲音檔案等二進制資料類型。
一般用的比較少,多用int來存儲。
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 即可。
舉例如下所示:
字元集就是将各種文字編碼為二進制數字(十六進制也是可以的,本質一樣)的方式, 即這是讓一般文字存儲在計算機的一種通用的規則, 字元集有很多, 我們常用的有下面幾種:
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中使用下面的指令可以檢視所支援的所有表引擎。
下面介紹幾個常用的引擎和幾個不常用的引擎。
myisam --- 常用引擎,特點: 讀取效率很高。
innodb --- 常用引擎, 特點:寫入、事務等支援。
ndb --- 不常用,特點:主要在mysql 叢集伺服器中使用,不做介紹
archive --- 不常用,特點:歸檔引擎,壓縮比高達1:10,用于資料歸檔
myisam:
不支援事務,表鎖(表級鎖,加鎖會鎖住整個表),支援全文索引,操作速度快。常用于讀取多的業務。
innodb:
支援事務,主要面向線上事務處理(oltp)方面的應用。
行鎖設計,支援外鍵,即預設情況下讀取操作不加鎖
innodb是為處理巨大資料量時的最大性能設計。
說明:
行鎖。 寫入、更新操作的時候,将這一行鎖起來, 不讓其他人再操作了。
表鎖。 寫入、更新操作時,将這個表給鎖起來,不讓其他人再操作了。
事務。 可同時操作多個資料,若其中的一個資料操作失敗,就會復原到操作之前。 常用于銀行、電商、金融等系統中。
索引其實就類似于書中的目錄,有了索引就更加友善我們查找。不使用索引,mysql必須從第1條記錄開始然後讀完整個表直到找出相關的行。表越大,花費的時間越多。如果表中查詢的列有一個索引,mysql能快速到達一個位置去搜尋到資料檔案的中間,沒有必要看所有資料。mysql中的索引類型有以下幾種方式:
普通索引:
即為某個表的某個字段增加索引。
唯一索引:
即為某個表的某個字段增加唯一索引。
全文索引:
即為某個表的某個字段增加全文索引
主鍵索引:
即為某個表的某個字段增加主鍵索引。
在建立表時也可以聲明索引,如下所示:
對于資料庫的操作實際上就是增删改查。 這些基本功做好了,對資料庫的操作也就遊刃有餘了。
插入記錄有兩種基本文法。
文法一:
文法二:
顯然,兩種文法是有差別的:
文法一要求:在表中有多少個字段,就要上傳多少個值,如果其中某些字段是有預設值,不想上傳覆寫,就傳入null。 并且值的順序和字段的順序也要保持一緻。
文法二要求:對于表中的預設字段,可以不上傳, mysql會自動補齊預設值。
另外,對于第一種文法,我們也可以一次性增加多各記錄, 隻要在values後添加多個()即可,用逗号隔開,如下所示:
為了查資料,首先我們建立一個資料表。
即建立了包含id、username、age三個字段的表。
下面我們向其中添加字段:
查詢全部:
然後我們就可以查詢,查詢表中的所有記錄的基本文法如下:
指定字段查詢:
基本文法如下:
查詢字段不重複的記錄:
為了示範,我新增一條記錄,使得age有相等的兩條記錄。如下:
條件查詢where
可以看到*表示的是如果有,就傳回一條記錄,而不是其中的字段, age=50即傳回age等于50字段所在的記錄。
下面的符号也是可以的:
基本文法如下:
其中排序關鍵詞有兩個:
asc --- 升序排列,由小到大
desc --- 降序排列,由大到小
上面的例子是根據其中某一個字段來排序,現在我們可以進行多字段排序。 即第一個已經排好,則第二個不再生效,否則第二個生效。。。
通過上面的兩個例子,很容易看出他們的差別。
對于查詢或者排序後的結果集,如果我們不希望顯示全部,比如就想知道一次比賽中的前三名是誰,這就是結果集限制。
上例中我們就把年齡最大的三者篩選了出來。
上面我們是預設從第一條記錄開始的,但是如果我們希望留下中間的幾條呢,文法如下:
基本使用文法如下:
比如我們再查詢使用者購買情況時,至少需要兩張表,第一張儲存了使用者的基本資訊,包括name,password,id等。 第二章表上儲存了使用者的購買記錄。 即一旦有一個使用者購買,就将這個記錄插入表中。
于是這樣的查詢就是聯合查詢,而要做到聯合查詢就要進行表連接配接。
表連接配接分為内連接配接和外連接配接。 具體定義後面會講到。
既然需要進行表連接配接,那麼就得有兩個表!
http://www.shouce.ren/api/view/a/13995
這一部分隻是等到需要的時候再學吧。
修改一個字段,文法如下:
這裡是修改其中一個字段,我們還可以修改多個字段。
基本文法如下所示:
關鍵: 對于其中的username下的值,他們都是字元串,是以一定要寫成 username="zuzhidao", 而不是username=buzhidao, 因為系統會将buzhidao當做一個變量,而這個變量又沒有聲明和定義,是以會報錯。
删除記錄的基本文法如下:
注意:這裡一删除就是删掉一條記錄,而不難隻删除其中的一個字段。
清空表記錄基本文法如下:
這條指令會直接将一個表删除。