2.1 什么是數(shù)據(jù)庫?
數(shù)據(jù)庫(Database)是以特定組織方式存儲以及管理數(shù)據(jù)的倉庫,我們?nèi)粘I钪薪?jīng)常會接觸到數(shù)據(jù)庫,通過瀏覽器打開網(wǎng)站查閱的新聞,打開微信查看的朋友圈,你從銀行賬戶中查詢到的金額等等,這些數(shù)據(jù)都存儲在數(shù)據(jù)庫中。
這么說可能你還是有些疑惑。換個說法:你知道 Excel 電子表格嗎?
電子表格和數(shù)據(jù)庫之間有很多的相似點:都可以存儲和訪問數(shù)據(jù),都可以按照需求篩選出自己需要的記錄,也可以通過某些特定函數(shù)完成數(shù)據(jù)的統(tǒng)計。電子表格是一個后綴名為 .xls
或者 .xlsx
的文件。數(shù)據(jù)庫同樣是一個后綴名為 .sql
的文件。
2.2 有了 Excel 還需要數(shù)據(jù)庫嗎?
那你可能會問:既然有了Excel 了,為什么還要有數(shù)據(jù)庫呢?它們兩個有什么差別?
不知道你有沒有經(jīng)歷過這樣一個場景:當你在電子表格中操作數(shù)據(jù)還未完成時,電腦突然宕機,導致前功盡棄。但是數(shù)據(jù)庫確具有完善的安全管理機制,在這種場景下能將數(shù)據(jù)進行完美恢復,并將數(shù)據(jù)損失降到最小。
另外,數(shù)據(jù)庫是可以在線共享的,它允許多人同時操作同一張表格,卻不會導致數(shù)據(jù)混亂。電子表格卻無法實現(xiàn)多人同時編輯同一張表格,即使可以也需要設(shè)置復雜的共享操作。
并且,數(shù)據(jù)庫在存儲硬件允許的情況下,可以存放海量的數(shù)據(jù),并且支持比較復雜的計算和查詢,而且效率也是遠超電子表格,當然數(shù)據(jù)庫的功能遠不止這些,我們在后面的章節(jié)會一一把數(shù)據(jù)庫的優(yōu)點向大家展示。
2.3 數(shù)據(jù)庫管理系統(tǒng)
有了數(shù)據(jù)庫,當然要對數(shù)據(jù)庫進行管理,自然而然的數(shù)據(jù)庫管理系統(tǒng)就應(yīng)運而生了。數(shù)據(jù)庫管理系統(tǒng)就類似于 WPS 和 Office。這兩個軟件都可以管理后綴名為 .xls 或者 .xlsx 的電子表格。而數(shù)據(jù)庫管理系統(tǒng)就是用來管理后綴名為 .sql 的數(shù)據(jù)庫文件的一個軟件。
不同于 WPS 和 Office 的劃江而治,數(shù)據(jù)庫管理系統(tǒng)可以說是百花爭艷,比如說付費的有甲骨文公司的 Oracle、IBM的DB2、微軟的 SQL Server,開源的有 MySQL 和 PostgreSQL。都是比較成熟的數(shù)據(jù)管理系統(tǒng)產(chǎn)品。
在選擇數(shù)據(jù)庫時需要結(jié)合具體項目業(yè)務(wù)及投入成本等因素綜合考慮,比如銀行、金融、物流等數(shù)據(jù)量大、對安全性要求高且投入較大的項目使用Oracle和SQLL Server會更好,Mysql 和 PostgreSQL 則更適合互聯(lián)網(wǎng)方向的中小型項目,對于初學者可以選擇 SQLL Server 或者 Mysql 來入門。
為了讓大家更全面了解各個主流數(shù)據(jù)庫的差異,后續(xù)各小節(jié)會對同一功能 SQL 查詢在不同數(shù)據(jù)庫上進行對比驗證,如沒有特殊說明,本課程執(zhí)行 SQL 語句的具體數(shù)據(jù)庫版本默認為 MariaDB 10.3.12(MySQL的一個分支)或者 SQL Server 2012、Oracle 11.2.0.1、PostgreSQL 11.6。
2.4 安裝 MariaDB 10.3.21
在使用數(shù)據(jù)庫之前,和大家一起了解下數(shù)據(jù)庫 MariaDB 10.3.21 的安裝過程:
首先 Vmware 上新建虛擬機安裝 CentOS7.5,root 用戶登錄:
進入 /etc/yum.repos.d
生成 MariaDB.repo
文件 :
[root@zh01 ~]# cd /etc/yum.repos.d/
[root@zh01 yum.repos.d]# cat Mariadb.repo
[Mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
運行安裝命令安裝 MariaDB :
yum -y install MariaDB-server MariaDB-client
安裝成功之后啟動 MariaDB 服務(wù),并設(shè)為開機自啟:
systemctl start mariadb #啟動服務(wù)
systemctl enable mariadb #設(shè)置開機啟動
登錄到 MariaDB 數(shù)據(jù)庫:
mysql -uroot -p
輸入上面命令后,系統(tǒng)會提示我們輸入密碼,此時 root 默認密碼為空,直接回車即可。
如果要退出 MariaDB,輸入 exit;
后回車即可。
進行MariaDB的相關(guān)簡單配置,在 Linux 命令行輸入命令:
mysql_secure_installation
回車后,系統(tǒng)會提示我們進行以下內(nèi)容的設(shè)置:
Enter current password for root (enter for none):<–初次運行直接回車
Set root password? [Y/n] <– 是否設(shè)置root用戶密碼,輸入y并回車或直接回車
New password: <– 設(shè)置root用戶的密碼
Re-enter new password: <– 再輸入一次你設(shè)置的密碼
Remove anonymous users? [Y/n] <– 是否刪除匿名用戶,回車
Disallow root login remotely? [Y/n] <–是否禁止root遠程登錄,回車(后面授權(quán)配置)
Remove test database and access to it? [Y/n] <– 是否刪除test數(shù)據(jù)庫,回車
Reload privilege tables now? [Y/n] <– 是否重新加載權(quán)限表,回車
初始化MariaDB完成,再次登陸需要輸入設(shè)置的密碼。
配置 MariaDB 的字符集,使得 MariaDB 服務(wù)端支持中文 :
vi /etc/my.cnf
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
systemctl restart mariadb #重新啟動
2.5 什么是表?
表-Table,是數(shù)據(jù)庫存貯數(shù)據(jù)的基本單元。你可以把表設(shè)想為電子表格中的 Sheet 頁。而表就是數(shù)據(jù)庫中的 Sheet 頁。
上面的例子可能不太形象,換個說法。如果把數(shù)據(jù)庫比作一列貨運火車,那么Schema(模式,也叫架構(gòu))就是這列火車的一節(jié)節(jié)的車廂,每間車廂中放置有很多包裝箱,這些包裝箱就是表。
在同一個車廂中,包裝箱編號不能重名,但不同車廂中的包裝箱編號可以重名,Schema和表也同樣具有這個特點。同一間車廂存放著相同規(guī)格的包裝箱,就像同一個模式下的表具有相同的特性(表如何存儲,什么樣的數(shù)據(jù),數(shù)據(jù)如何分解等)。也可以將 Schema 看做操作系統(tǒng)上的目錄,里面的文件就是表,只是 Schema 里面不能創(chuàng)建 Schema,而目錄里面是可以繼續(xù)創(chuàng)建目錄。
火車 | ———>> | 數(shù)據(jù)庫 |
---|---|---|
車廂 | ———>> | Schema |
包裝箱 | ———>> | 表 |
貨物 | ———>> | 表中存放數(shù)據(jù) |
一張表只能存一種相關(guān)的實體,比如可以存放學生信息,課程信息,學生選課記錄等。 學生信息和課程信息不能存放在一張表中,這樣會導致查詢很困難,而且數(shù)據(jù)混亂。
值得注意的是,Schema 除包含表之外,還可以包含與表相關(guān)的視圖,索引,數(shù)據(jù)類型,函數(shù)以及操作符等數(shù)據(jù)庫對象。另外 Schema 在不同數(shù)據(jù)庫中它的含義稍有差別,在 SQL Server 和 PostgreSQL 中默認 Schema 分別為 dbo 和 public ,它們和用戶權(quán)限有很大關(guān)系,在你創(chuàng)建數(shù)據(jù)庫對象時,如果沒有指定 Schema,數(shù)據(jù)庫對象歸屬于這些默認的 Schema。而在 MySQL 中,Schema 就是指的數(shù)據(jù)庫,在Oracle 中一個 Schema 對應(yīng)著一個用戶。
2.6 什么是列、行和數(shù)據(jù)類型
如果說一張表就是一個實體,那么表中的列就是這個實體的屬性,比如學生(實體)表中有年齡,性別和學號等列來表示學生的屬性,一行就是指一條記錄,一名學生的相關(guān)屬性數(shù)據(jù)就可以存放成一行數(shù)據(jù)。從上面可以看出數(shù)據(jù)庫中的行和列與Excel中的行和列很類似。
數(shù)據(jù)庫的數(shù)據(jù)類型是和列并存的,它指定了列在計算中以什么數(shù)據(jù)形式存儲,雖然常用的數(shù)據(jù)類型就幾種,但在各種數(shù)據(jù)庫中卻存在名稱上或用法上的細微差異,下表列出了四種數(shù)據(jù)庫主要數(shù)據(jù)類型對比:
SQLServer | MySQL | ORACLE | PostgreSQL |
---|---|---|---|
int | int | NUMBER | int4 |
varchar | varchar | VARCHAR2 | varchar |
nvarchar | varchar | NVARCHAR2 | varchar |
datetime | datetime | DATE | timestamp |
decimal | decimal | NUMBER | numeric |
text | longtext | CLOB | text |
tinyint | tinyint | NUMBER | int2 |
bit | tinyint | NUMBER | bool |
float | float | FLOAT | foloat8 |
2.7 SQL 語句
現(xiàn)在大家已經(jīng)知道了數(shù)據(jù)庫,表,行列數(shù)據(jù)的概念了。那么問題就來了:我該怎么操作數(shù)據(jù)庫,表,行列數(shù)據(jù)呢?
這時,就不得不說一下本門課程的重點 SQL 語句了。Sql是操作和管理數(shù)據(jù)庫的工具,是人們與數(shù)據(jù)庫交互的一種計算機語言,它由關(guān)鍵字(如select ,from,where,order by ,create等)、表名、字段等組合成的一條語句,Sql 語句分為以下幾種類型:
- DDL(Data Definition Language,數(shù)據(jù)定義語言) 日常使用的創(chuàng)建數(shù)據(jù)庫或表的Create 語句,刪除數(shù)據(jù)庫或表的Drop語句,以及修改數(shù)據(jù)庫或表的alter 語句都屬于該類型,比如我們在SQL Server上的數(shù)據(jù)庫中創(chuàng)建一張學生表:
- DML(Data Manipulation Language,數(shù)據(jù)操作語言)對表的增刪改查都屬于 DM L語句,比如我們查詢年齡大于29歲的學生:
- 除此之外,還有 DCL(Data Control Language,數(shù)據(jù)控制語言),它主要完成對數(shù)據(jù)庫變更操作的確認和取消,以及用戶對數(shù)據(jù)庫對象權(quán)限的設(shè)定。比如 update 語句后面出現(xiàn) commit 表示確認更新完成,出現(xiàn) rollback 代表取消更新,數(shù)據(jù)保持不變。
2.8 測試數(shù)據(jù)獲取
本專欄相關(guān)表結(jié)構(gòu)和數(shù)據(jù)可以通過以下鏈接獲取:https://github.com/zhujianhui/sql_zhuanlan