網(wǎng)上有很多關(guān)于pos機(jī)sql數(shù)據(jù)庫(kù),怎么入門(mén)SQL的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)sql數(shù)據(jù)庫(kù)的問(wèn)題,今天pos機(jī)之家(m.jzsl.com.cn)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!
本文目錄一覽:
pos機(jī)sql數(shù)據(jù)庫(kù)
什么是數(shù)據(jù)庫(kù)?大家都有過(guò)下面這樣的經(jīng)歷吧?
收到曾經(jīng)為自己診治過(guò)的牙醫(yī)寄來(lái)的明信片,上面寫(xiě)著“距上次檢查已有半年,請(qǐng)您再來(lái)做個(gè)牙齒健康檢查”。在生日的前一個(gè)月,收到曾入住過(guò)的旅店或賓館發(fā)來(lái)的“生日當(dāng)月入住優(yōu)惠”的郵件或者明信片。在網(wǎng)上商城購(gòu)物之后,收到內(nèi)附“推薦商品列表”的郵件。這可能是因?yàn)檠泪t(yī)、旅店或商城的經(jīng)營(yíng)者掌握了顧客上一次的就診日期、生日和購(gòu)買(mǎi)歷史等信息,并且擁有能夠從大量匯總信息中快速獲取所需信息(比如你的住址或愛(ài)好)的設(shè)備(計(jì)算機(jī)系統(tǒng))。如果利用人工完成同樣的工作,真不知道要多長(zhǎng)時(shí)間呢。
另外,現(xiàn)在所有地區(qū)的圖書(shū)館都配備了計(jì)算機(jī),實(shí)現(xiàn)了圖書(shū)的自動(dòng)查詢。使用該系統(tǒng),可以通過(guò)檢索書(shū)名或出版年份快速查找出希望借閱的圖書(shū)的所在位置,以及是否已經(jīng)借出等信息。正是因?yàn)閾碛辛丝梢员4鎴D書(shū)名稱、出版年份以及保管位置和外借情況等信息,并且可以按需查詢的設(shè)備,才使這一切成為可能。
像這樣將大量數(shù)據(jù)保存起來(lái),通過(guò)計(jì)算機(jī)加工而成的可以進(jìn)行高效訪問(wèn)的數(shù)據(jù)集合稱為數(shù)據(jù)庫(kù)(Database,DB)。將姓名、住址、電話號(hào)碼、郵箱地址、愛(ài)好和家庭構(gòu)成等數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中,就可以隨時(shí)迅速獲取想要的信息了。
數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)
用來(lái)管理數(shù)據(jù)庫(kù)的計(jì)算機(jī)系統(tǒng)稱為數(shù)據(jù)庫(kù)管理系統(tǒng)(Database Management System,DBMS)。為什么要使用專用系統(tǒng)(DBMS)來(lái)管理數(shù)據(jù)呢?
我們通過(guò)計(jì)算機(jī)管理數(shù)據(jù)的時(shí)候,通常使用文本文件或者Excel 那樣的電子制表軟件就可以完成了,非常簡(jiǎn)單。但也有不足。下面就舉幾個(gè)有代表性的例子。
無(wú)法多人共享數(shù)據(jù)保存在已連接網(wǎng)絡(luò)的計(jì)算機(jī)中的文件,可以通過(guò)共享設(shè)定實(shí)現(xiàn)多個(gè)用戶在線閱讀或編輯。但是,當(dāng)某個(gè)用戶打開(kāi)該文件的時(shí)候,其他用戶就無(wú)法進(jìn)行編輯了。如果是網(wǎng)上商城的話,當(dāng)某個(gè)用戶購(gòu)買(mǎi)商品的時(shí)候,其他用戶就無(wú)法購(gòu)買(mǎi)了。
無(wú)法提供操作大量數(shù)據(jù)所需的格式要想瞬間從幾十萬(wàn)或者上百萬(wàn)的數(shù)據(jù)中獲取想要的數(shù)據(jù),必須把數(shù)據(jù)保存為適當(dāng)?shù)母袷剑俏谋疚募虴xcel 工作表等無(wú)法提供相應(yīng)的格式。
實(shí)現(xiàn)讀寫(xiě)自動(dòng)化需要編程能力通過(guò)編寫(xiě)計(jì)算機(jī)程序(以下簡(jiǎn)稱程序)可以實(shí)現(xiàn)數(shù)據(jù)讀取和編輯自動(dòng)化,但這必須以了解數(shù)據(jù)結(jié)構(gòu)為前提,還需具備一定的計(jì)算機(jī)編程技術(shù)。
無(wú)法應(yīng)對(duì)突發(fā)事故當(dāng)文件被誤刪、硬盤(pán)出現(xiàn)故障等導(dǎo)致無(wú)法讀取的時(shí)候,可能會(huì)造成重要數(shù)據(jù)丟失,同時(shí)數(shù)據(jù)還可能被他人輕易讀取或竊用。
DBMS 可以克服這些不足,實(shí)現(xiàn)多個(gè)用戶同時(shí)安全簡(jiǎn)單地操作大量數(shù)據(jù)(圖1-2)。這也是我們一定要使用DBMS 的原因。
圖1-2DBMS能夠?qū)崿F(xiàn)多個(gè)用戶同時(shí)安全簡(jiǎn)單地操作大量數(shù)據(jù)
數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)的種類
DBMS 主要通過(guò)數(shù)據(jù)的保存格式(數(shù)據(jù)庫(kù)的種類)來(lái)進(jìn)行分類,現(xiàn)階段主要有以下5 種類型。
1.層次數(shù)據(jù)庫(kù)(Hierarchical Database,HDB)
最古老的數(shù)據(jù)庫(kù)之一,它把數(shù)據(jù)通過(guò)層次結(jié)構(gòu)(樹(shù)形結(jié)構(gòu))的方式表現(xiàn)出來(lái)。層次數(shù)據(jù)庫(kù)曾經(jīng)是數(shù)據(jù)庫(kù)的主流,但隨著關(guān)系數(shù)據(jù)庫(kù)的出現(xiàn)和普及,現(xiàn)在已經(jīng)很少使用了。
2.關(guān)系數(shù)據(jù)庫(kù)(Relational Database,RDB)
關(guān)系數(shù)據(jù)庫(kù)是現(xiàn)在應(yīng)用最廣泛的數(shù)據(jù)庫(kù)。關(guān)系數(shù)據(jù)庫(kù)在1969 年誕生,可謂歷史悠久。和Excel 工作表一樣,它也采用由行和列組成的二維表來(lái)管理數(shù)據(jù),所以簡(jiǎn)單易懂(表1)。同時(shí),它還使用專門(mén)的SQL(Structured Query Language,結(jié)構(gòu)化查詢語(yǔ)言)對(duì)數(shù)據(jù)進(jìn)行操作。
表1關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)
這種類型的DBMS 稱為關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(Relational Database Management System,RDBMS)。比較具有代表性的RDBMS 有如下5 種。
Oracle Database:甲骨文公司的RDBMS(通常簡(jiǎn)稱為Oracle)SQL Server :微軟公司的RDBMSDB2:IBM 公司的RDBMSPostgreSQL:開(kāi)源的RDBMSMySQL :開(kāi)源的RDBMS3.面向?qū)ο髷?shù)據(jù)庫(kù)(Object Oriented Database,OODB)
編程語(yǔ)言當(dāng)中有一種被稱為面向?qū)ο笳Z(yǔ)言的語(yǔ)言。把數(shù)據(jù)以及對(duì)數(shù)據(jù)的操作集合起來(lái)以對(duì)象為單位進(jìn)行管理,因此得名。面向?qū)ο髷?shù)據(jù)庫(kù)就是用來(lái)保存這些對(duì)象的數(shù)據(jù)庫(kù)。
4.XML數(shù)據(jù)庫(kù)(XML Database,XMLDB)
最近幾年,XMLB 作為在網(wǎng)絡(luò)上進(jìn)行交互的數(shù)據(jù)的形式逐漸普及起來(lái)。XML 數(shù)據(jù)庫(kù)可以對(duì)XML 形式的大量數(shù)據(jù)進(jìn)行高速處理。
5.鍵值存儲(chǔ)系統(tǒng)(Key-Value Store,KVS)
這是一種單純用來(lái)保存查詢所使用的主鍵(Key)和值(Value)的組合的數(shù)據(jù)庫(kù)。具有編程語(yǔ)言知識(shí)的讀者可以把它想象成關(guān)聯(lián)數(shù)組或者散列(hash)。近年來(lái),隨著鍵值存儲(chǔ)系統(tǒng)被應(yīng)用到Google 等需要對(duì)大量數(shù)據(jù)進(jìn)行超高速查詢的Web 服務(wù)當(dāng)中,它正逐漸為人們所關(guān)注。
下面向大家介紹使用SQL 語(yǔ)言的數(shù)據(jù)庫(kù)管理系統(tǒng),也就是關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)的操作方法。如無(wú)特殊說(shuō)明,下面所提到的數(shù)據(jù)庫(kù)以及DBMS 都是指RDBMS。
數(shù)據(jù)庫(kù)的結(jié)構(gòu)
RDBMS 的常見(jiàn)系統(tǒng)結(jié)構(gòu)
使用RDBMS 時(shí),最常見(jiàn)的系統(tǒng)結(jié)構(gòu)就是客戶端/ 服務(wù)器類型(C/S類型)這種結(jié)構(gòu)(圖1)。
圖1使用RDBMS時(shí)的系統(tǒng)結(jié)構(gòu)
服務(wù)器指的是用來(lái)接收其他程序發(fā)出的請(qǐng)求,并對(duì)該請(qǐng)求進(jìn)行相應(yīng)處理的程序(軟件),或者是安裝了此類程序的設(shè)備(計(jì)算機(jī))。在計(jì)算機(jī)上持續(xù)執(zhí)行處理,并等待接收下一條請(qǐng)求。RDBMS 也是一種服務(wù)器,它能夠從保存在硬盤(pán)上的數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)并返回,還可以把數(shù)據(jù)變更為指定內(nèi)容。
與之相對(duì),向服務(wù)器發(fā)出請(qǐng)求的程序(軟件),或者是安裝了該程序的設(shè)備(計(jì)算機(jī))稱為客戶端。訪問(wèn)由RDBMS 管理的數(shù)據(jù)庫(kù),進(jìn)行數(shù)據(jù)讀寫(xiě)的程序稱為RDBMS 客戶端。RDBMS 客戶端將想要獲取什么樣的數(shù)據(jù),或者想對(duì)哪些數(shù)據(jù)進(jìn)行何種變更等信息通過(guò)SQL 語(yǔ)句發(fā)送給RDBMS 服務(wù)器。RDBMS 根據(jù)該語(yǔ)句的內(nèi)容返回所請(qǐng)求的數(shù)據(jù),或者對(duì)存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行更新。
客戶端就如同委托方,而服務(wù)器就像是受托方。由于兩者關(guān)系類似受托方執(zhí)行委托方發(fā)出的指令,故而得名。
這樣就可以使用SQL 語(yǔ)句來(lái)實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫(kù)的讀寫(xiě)操作了。
另外,RDBMS 既可以和其客戶端安裝在同一臺(tái)計(jì)算機(jī)上,也可以分別安裝在不同的計(jì)算機(jī)上。這樣一來(lái),不僅可以通過(guò)網(wǎng)絡(luò)使二者相互關(guān)聯(lián),還可以實(shí)現(xiàn)多個(gè)客戶端訪問(wèn)同一個(gè)RDBMS(圖2)。
圖2 通過(guò)網(wǎng)絡(luò)可以實(shí)現(xiàn)多個(gè)客戶端訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù)
客戶端沒(méi)有必要使用同樣的程序,只要能將SQL 發(fā)送給RDBMS,就可以操作數(shù)據(jù)庫(kù)了。并且,多個(gè)客戶端還可以同時(shí)對(duì)同一個(gè)數(shù)據(jù)庫(kù)進(jìn)行讀寫(xiě)操作。
另外,RDBMS 除了需要同時(shí)接收多個(gè)客戶端的請(qǐng)求之外,還需要操作存有大量數(shù)據(jù)的數(shù)據(jù)庫(kù),因此通常都會(huì)安裝在比客戶端性能更優(yōu)越的計(jì)算機(jī)上。操作數(shù)據(jù)量特別巨大的數(shù)據(jù)庫(kù)時(shí),還可以將多臺(tái)計(jì)算機(jī)組合使用。
雖然RDBMS 的系統(tǒng)結(jié)構(gòu)多種多樣,但是從客戶端發(fā)來(lái)的SQL 語(yǔ)句基本上都是一樣的。
什么是SQLSQL是為操作數(shù)據(jù)庫(kù)而開(kāi)發(fā)的語(yǔ)言。
它原本是為了提高數(shù)據(jù)庫(kù)查詢效率而開(kāi)發(fā)的語(yǔ)言,但是現(xiàn)在不僅可以進(jìn)行數(shù)據(jù)查詢,就連數(shù)據(jù)的插入和刪除等操作也基本上都可以通過(guò)SQL 來(lái)完成了。
國(guó)際標(biāo)準(zhǔn)化組織(ISO)為SQL 制定了相應(yīng)的標(biāo)準(zhǔn),以此為基準(zhǔn)的SQL 稱為標(biāo)準(zhǔn)SQL。
以前,完全基于標(biāo)準(zhǔn)SQL 的RDBMS 很少,通常需要根據(jù)不同的RDBMS來(lái)編寫(xiě)特定的SQL 語(yǔ)句。這樣一來(lái),就會(huì)造成能夠在Oracle 中使用的SQL 語(yǔ)句卻無(wú)法在SQL Server 中使用,反之亦然。近來(lái),對(duì)標(biāo)準(zhǔn)SQL 的支持取得了一些進(jìn)展,因此希望準(zhǔn)備學(xué)習(xí)SQL 的人們能夠從現(xiàn)在開(kāi)始就牢記標(biāo)準(zhǔn)SQL 的書(shū)寫(xiě)方式。
學(xué)會(huì)標(biāo)準(zhǔn)SQL 就可以在各種RDBMS 中書(shū)寫(xiě)SQL 語(yǔ)句了。
SQL 語(yǔ)句及其種類
SQL 用關(guān)鍵字、表名、列名等組合而成的一條語(yǔ)句(SQL 語(yǔ)句)來(lái)描述操作的內(nèi)容。關(guān)鍵字是指那些含義或使用方法已事先定義好的英語(yǔ)單詞,存在包含“對(duì)表進(jìn)行查詢”或者“參考這個(gè)表”等各種意義的關(guān)鍵字。
根據(jù)對(duì)RDBMS 賦予的指令種類的不同,SQL 語(yǔ)句可以分為以下三類。
● DDL
DDL(Data Definition Language,數(shù)據(jù)定義語(yǔ)言) 用來(lái)創(chuàng)建或者刪除存儲(chǔ)數(shù)據(jù)用的數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)中的表等對(duì)象。DDL 包含以下幾種指令。
CREATE: 創(chuàng)建數(shù)據(jù)庫(kù)和表等對(duì)象DROP: 刪除數(shù)據(jù)庫(kù)和表等對(duì)象ALTER: 修改數(shù)據(jù)庫(kù)和表等對(duì)象的結(jié)構(gòu)●DML
DML(Data Manipulation Language,數(shù)據(jù)操縱語(yǔ)言) 用來(lái)查詢或者變更表中的記錄。DML 包含以下幾種指令。
SELECT:查詢表中的數(shù)據(jù)INSERT:向表中插入新數(shù)據(jù)UPDATE:更新表中的數(shù)據(jù)DELETE:刪除表中的數(shù)據(jù)●DCL
DCL(Data Control Language,數(shù)據(jù)控制語(yǔ)言) 用來(lái)確認(rèn)或者取消對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行的變更。除此之外,還可以對(duì)RDBMS 的用戶是否有權(quán)限操作數(shù)據(jù)庫(kù)中的對(duì)象(數(shù)據(jù)庫(kù)表等)進(jìn)行設(shè)定。DCL 包含以下幾種指令。
COMMIT: 確認(rèn)對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行的變更ROLLBACK: 取消對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行的變更GRANT: 賦予用戶操作權(quán)限REVOKE: 取消用戶的操作權(quán)限SQL 根據(jù)功能不同可以分為三類,其中使用最多的是DML。
SQL 的基本書(shū)寫(xiě)規(guī)則
書(shū)寫(xiě)SQL 語(yǔ)句時(shí)必須要遵守一些規(guī)則。這些規(guī)則都非常簡(jiǎn)單,接下來(lái)我們來(lái)逐一認(rèn)識(shí)一下。
■ SQL 語(yǔ)句要以分號(hào)(;)結(jié)尾
一條SQL 語(yǔ)句可以描述一個(gè)數(shù)據(jù)庫(kù)操作。在RDBMS 當(dāng)中,SQL 語(yǔ)句也是逐條執(zhí)行的。
眾所周知,我們?cè)诰渥拥木湮布幼?biāo)點(diǎn)表示結(jié)束,中文句子以句號(hào)(。)結(jié)尾,英文以點(diǎn)號(hào)(.)結(jié)尾,而SQL 語(yǔ)句則使用分號(hào)(;)結(jié)尾。
■ SQL 語(yǔ)句不區(qū)分大小寫(xiě)
SQL 不區(qū)分關(guān)鍵字的大小寫(xiě) 。例如,不管寫(xiě)成SELECT 還是select,解釋都是一樣的。表名和列名也是如此。
雖然可以根據(jù)個(gè)人喜好選擇大寫(xiě)還是小寫(xiě)(或大小寫(xiě)混雜),但為了理解起來(lái)更加容易,可以用以下規(guī)則來(lái)書(shū)寫(xiě)SQL 語(yǔ)句。
關(guān)鍵字大寫(xiě)表名的首字母大寫(xiě)其余(列名等)小寫(xiě)但是插入到表中的數(shù)據(jù)是區(qū)分大小寫(xiě)的。例如,在操作過(guò)程中,數(shù)據(jù)Computer、COMPUTER 或computer,三者是不一樣的。
■ 常數(shù)的書(shū)寫(xiě)方式是固定的
SQL 語(yǔ)句常常需要直接書(shū)寫(xiě)字符串、日期或者數(shù)字。例如,書(shū)寫(xiě)向表中插入字符串、日期或者數(shù)字等數(shù)據(jù)的SQL 語(yǔ)句。
在SQL 語(yǔ)句中直接書(shū)寫(xiě)的字符串、日期或者數(shù)字等稱為常數(shù)。常數(shù)的書(shū)寫(xiě)方式如下所示。
SQL 語(yǔ)句中含有字符串的時(shí)候,需要像\'abc\'這樣,使用單引號(hào)(\')將字符串括起來(lái),用來(lái)標(biāo)識(shí)這是一個(gè)字符串。
SQL 語(yǔ)句中含有日期的時(shí)候,同樣需要使用單引號(hào)將其括起來(lái)。日期的格式有很多種(\'26 Jan 2010\' 或者\(yùn)'10/01/26\' 等),也可以使用\'2010-01-26\' 這種\' 年- 月- 日\(chéng)' 的格式。
在SQL 語(yǔ)句中書(shū)寫(xiě)數(shù)字的時(shí)候,不需要使用任何符號(hào)標(biāo)識(shí),直接寫(xiě)成1000 這樣的數(shù)字即可。
■ 單詞需要用半角空格或者換行來(lái)分隔
SQL 語(yǔ)句的單詞之間需使用半角空格或換行符來(lái)進(jìn)行分隔。如下這種未加分隔的語(yǔ)句會(huì)發(fā)生錯(cuò)誤,無(wú)法正常執(zhí)行。
○ CREATE TABLE Product
× CREATETABLE Product
× CREATE TABLEProduct
但是不能使用全角空格作為單詞的分隔符,否則會(huì)發(fā)生錯(cuò)誤,出現(xiàn)無(wú)法預(yù)期的結(jié)果。
表的內(nèi)容的創(chuàng)建
在我們學(xué)習(xí)針對(duì)表的查詢,以及數(shù)據(jù)變更等SQL 語(yǔ)句之前。我們要先創(chuàng)建學(xué)習(xí)這些SQL 語(yǔ)句所需的數(shù)據(jù)庫(kù)和表。
表2 舉例用的商品表
該表是某家小商店銷售商品的一覽表。商品的數(shù)量不多,不過(guò)我們可以把它想象成大量數(shù)據(jù)中的一部分(畢竟這只是為了學(xué)習(xí)SQL 而創(chuàng)建的表)。像0003 號(hào)商品的登記日期以及0006 號(hào)商品的進(jìn)貨單價(jià)這樣的空白內(nèi)容,我們可以認(rèn)為是由于店主疏忽而忘記輸入了。
我們可以看到表2 由6 列8 行所組成。最上面一行是數(shù)據(jù)的項(xiàng)目名,真正的數(shù)據(jù)是從第2 行開(kāi)始的。
備忘
接下來(lái),我們會(huì)逐步學(xué)習(xí)創(chuàng)建數(shù)據(jù)庫(kù)和表所使用的SQL 語(yǔ)句的書(shū)寫(xiě)方式。在這之前,請(qǐng)先準(zhǔn)備好學(xué)習(xí)環(huán)境(PostgreSQL)。
數(shù)據(jù)庫(kù)的創(chuàng)建(CREATE DATABASE語(yǔ)句)
前面提到,在創(chuàng)建表之前,一定要先創(chuàng)建用來(lái)存儲(chǔ)表的數(shù)據(jù)庫(kù)。運(yùn)行CREATE DATABASE 語(yǔ)句就可以在RDBMS 上創(chuàng)建數(shù)據(jù)庫(kù)了。CREATEDATABASE 語(yǔ)句的語(yǔ)法如下所示。
這里我們僅指定了使用該語(yǔ)法所需的最少項(xiàng)目,實(shí)際開(kāi)發(fā)數(shù)據(jù)庫(kù)時(shí)還需要指定各種其他項(xiàng)目。
語(yǔ)法1-1創(chuàng)建數(shù)據(jù)庫(kù)的CREATE DATABASE語(yǔ)句
CREATE DATABASE <數(shù)據(jù)庫(kù)名稱>;
這里我們將數(shù)據(jù)庫(kù)命名為shop,然后執(zhí)行代碼清單1-1 中的SQL語(yǔ)句。
代碼清單1-1 創(chuàng)建數(shù)據(jù)庫(kù)shop的CREATE DATABASE語(yǔ)句
CREATE DATABASE shop;
此外,數(shù)據(jù)庫(kù)名稱、表名以及列名都要使用半角字符(英文字母、數(shù)字、符號(hào)),具體內(nèi)容隨后會(huì)進(jìn)行介紹。
表的創(chuàng)建(CREATE TABLE語(yǔ)句)
創(chuàng)建好數(shù)據(jù)庫(kù)之后,接下來(lái)我們使用CREATE TABLE 語(yǔ)句在其中創(chuàng)建表。CREATE TABLE 語(yǔ)句的語(yǔ)法如下所示
語(yǔ)法1-2創(chuàng)建表的CREATE TABLE語(yǔ)句
CREATE TABLE <表名>(<列名1> <數(shù)據(jù)類型> <該列所需約束>,<列名2> <數(shù)據(jù)類型> <該列所需約束>,<列名3> <數(shù)據(jù)類型> <該列所需約束>,<列名4> <數(shù)據(jù)類型> <該列所需約束>,...<該表的約束1>, <該表的約束2>,……);
該語(yǔ)法清楚地描述了我們要?jiǎng)?chuàng)建一個(gè)包含< 列名1>、< 列名2>、 ……的名稱為< 表名> 的表,非常容易理解。每一列的數(shù)據(jù)類型(后述)是必須要指定的,還要為需要的列設(shè)置約束(后述)。約束可以在定義列的時(shí)候進(jìn)行設(shè)置,也可以在語(yǔ)句的末尾進(jìn)行設(shè)置。
在數(shù)據(jù)庫(kù)中創(chuàng)建表1-2 中的商品表(Product 表)的CREATE TABLE 語(yǔ)句,如代碼清單1-2 所示。
代碼清單1-2創(chuàng)建Product表的CREATE TABLE語(yǔ)句
CREATE TABLE Product(product_id CHAR(4) NOT NULL,product_name VARCHAR(100) NOT NULL,product_type VARCHAR(32) NOT NULL,sale_price INTEGER ,purchase_price INTEGER ,regist_date DATE ,PRIMARY KEY (product_id));
命名規(guī)則
我們只能使用半角英文字母、數(shù)字、下劃線(_)作為數(shù)據(jù)庫(kù)、表和列的名稱 。例如,不能將product_id 寫(xiě)成product-id,因?yàn)闃?biāo)準(zhǔn)SQL 并不允許使用連字符作為列名等名稱。$、#、? 這樣的符號(hào)同樣不能作為名稱使用。
盡管有些RDBMS 允許使用上述符號(hào)作為列的名稱,但這也僅限于在該RDBMS 中使用,并不能保證在其他RDBMS 中也能使用。雖然大家可能會(huì)覺(jué)得限制有點(diǎn)太多了,但還是請(qǐng)遵守規(guī)則使用半角英文字母、數(shù)字和下劃線(_)吧。
此外, 名稱必須以半角英文字母開(kāi)頭 。以符號(hào)開(kāi)頭的名稱并不多見(jiàn),但有時(shí)會(huì)碰到類似1product 或者2009_sales 這樣以數(shù)字開(kāi)頭的名稱。雖然可以理解,但這在標(biāo)準(zhǔn)SQL 中是被禁止的。請(qǐng)大家使用product1 或者sales_2009 這樣符合規(guī)則的名稱。
最后還有一點(diǎn),在同一個(gè)數(shù)據(jù)庫(kù)中不能創(chuàng)建兩個(gè)相同名稱的表,在同一個(gè)表中也不能創(chuàng)建兩個(gè)名稱相同的列。如果出現(xiàn)這樣的情況,RDBMS會(huì)返回錯(cuò)誤信息。
接下來(lái)我們根據(jù)上述規(guī)則,使用代碼清單1-2 中的CREATE TABLE 語(yǔ)句來(lái)創(chuàng)建表2 中的商品表。表名為Product,表中的列名如表3 所示。
表3商品表和Product表列名的對(duì)應(yīng)關(guān)系
數(shù)據(jù)類型的指定
Product 表所包含的列,定義在CREATE TABLE Product( )的括號(hào)中。列名右邊的INTEGER 或者CHAR 等關(guān)鍵字,是用來(lái)聲明該列的數(shù)據(jù)類型的,所有的列都必須指定數(shù)據(jù)類型。
數(shù)據(jù)類型表示數(shù)據(jù)的種類,包括數(shù)字型、字符型和日期型等。每一列都不能存儲(chǔ)與該列數(shù)據(jù)類型不符的數(shù)據(jù)。聲明為整數(shù)型的列中不能存儲(chǔ)\'abc\' 這樣的字符串,聲明為字符型的列中也不能存儲(chǔ)1234 這樣的數(shù)字。
數(shù)據(jù)類型的種類很多,各個(gè)RDBMS 之間也存在很大差異。根據(jù)業(yè)務(wù)需要實(shí)際創(chuàng)建數(shù)據(jù)庫(kù)時(shí),一定要根據(jù)不同的RDBMS 選用最恰當(dāng)?shù)臄?shù)據(jù)類型。在學(xué)習(xí)SQL 的時(shí)候,使用最基本的數(shù)據(jù)類型就足夠了。下面我們就來(lái)介紹四種基本的數(shù)據(jù)類型。
● INTEGER型
用來(lái)指定存儲(chǔ)整數(shù)的列的數(shù)據(jù)類型(數(shù)字型),不能存儲(chǔ)小數(shù)。
● CHAR型
CHAR 是CHARACTER(字符)的縮寫(xiě),是用來(lái)指定存儲(chǔ)字符串的列的數(shù)據(jù)類型(字符型)。可以像CHAR(10) 或者CHAR(200) 這樣,在括號(hào)中指定該列可以存儲(chǔ)的字符串的長(zhǎng)度(最大長(zhǎng)度)。字符串超出最大長(zhǎng)度的部分是無(wú)法輸入到該列中的。RDBMS 不同,長(zhǎng)度單位也不一樣,既存在使用字符個(gè)數(shù)的情況,也存在使用字節(jié)長(zhǎng)度的情況。
字節(jié)是計(jì)算機(jī)內(nèi)部的數(shù)據(jù)單位。一個(gè)字符通常需要1到3個(gè)字節(jié)來(lái)表示(根據(jù)字符的種類和表現(xiàn)方式有所不同)。
字符串以定長(zhǎng)字符串的形式存儲(chǔ)在被指定為CHAR 型的列中。所謂定長(zhǎng)字符串,就是當(dāng)列中存儲(chǔ)的字符串長(zhǎng)度達(dá)不到最大長(zhǎng)度的時(shí)候,使用半角空格進(jìn)行補(bǔ)足。例如,我們向CHAR(8) 類型的列中輸入\'abc\'的時(shí)候,會(huì)以\'abc \'(abc 后面有5 個(gè)半角空格)的形式保存起來(lái)。
另外,雖然之前我們說(shuō)過(guò)SQL 不區(qū)分英文字母的大小寫(xiě),但是表中存儲(chǔ)的字符串卻是區(qū)分大小寫(xiě)的。也就是說(shuō),\'ABC\' 和\'abc\' 代表了兩個(gè)不同意義的字符串。
● VARCHAR型
同CHAR 類型一樣,VARCHAR 型也是用來(lái)指定存儲(chǔ)字符串的列的數(shù)據(jù)類型(字符串類型),也可以通過(guò)括號(hào)內(nèi)的數(shù)字來(lái)指定字符串的長(zhǎng)度(最大長(zhǎng)度)。但該類型的列是以 可變長(zhǎng)字符串 的形式來(lái)保存字符串的。定長(zhǎng)字符串在字符數(shù)未達(dá)到最大長(zhǎng)度時(shí)會(huì)用半角空格補(bǔ)足,但可變長(zhǎng)字符串不同,即使字符數(shù)未達(dá)到最大長(zhǎng)度,也不會(huì)用半角空格補(bǔ)足。例如,我們向VARCHAR(8) 類型的列中輸入字符串\'abc\'的時(shí)候,保存的就是字符串\'abc\'。
該類型的列中存儲(chǔ)的字符串也和CHAR 類型一樣,是區(qū)分大小寫(xiě)的。
特定的SQL
Oracle中使用VARCHAR2型(Oracle中也有VARCHAR這種數(shù)據(jù)類型,但并不推薦使用)。
● DATE型
用來(lái)指定存儲(chǔ)日期(年月日)的列的數(shù)據(jù)類型(日期型)。
特定的SQL
除了年月日之外,Oracle中使用的DATE型還包含時(shí)分秒。
約束的設(shè)置
約束是除了數(shù)據(jù)類型之外,對(duì)列中存儲(chǔ)的數(shù)據(jù)進(jìn)行限制或者追加條件的功能。Product 表中設(shè)置了兩種約束。
Product 表的product_id 列、product_name 列和product_type 列的定義如下所示。
product_id CHAR(4) NOT NULL,product_name VARCHAR(100) NOT NULL,product_type VARCHAR(32) NOT NULL,
數(shù)據(jù)類型的右側(cè)設(shè)置了NOT NULL 約束。NULL 是代表空白(無(wú)記錄)的關(guān)鍵字。在NULL 之前加上了表示否定的NOT,就是給該列設(shè)置了不能輸入空白,也就是必須輸入數(shù)據(jù)的約束(如果什么都不輸入就會(huì)出錯(cuò))。
NULL這個(gè)詞是無(wú)或空的意思,NULL是使用SQL時(shí)的常見(jiàn)關(guān)鍵字,請(qǐng)大家牢記。
這樣一來(lái),Product 表的product_id(商品編號(hào))列、product_name(商品名稱)列和product_type(商品種類)列就都成了必須輸入的項(xiàng)目。
另外,在創(chuàng)建Product 表的CREATE TABLE 語(yǔ)句的后面,還有下面這樣的記述。
PRIMARY KEY (product_id)
這是用來(lái)給product_id 列設(shè)置主鍵約束的。所謂鍵,就是在指定特定數(shù)據(jù)時(shí)使用的列的組合。鍵種類多樣,主鍵(primary key)就是可以特定一行數(shù)據(jù)的列B。也就是說(shuō),如果把product_id 列指定為主鍵,就可以通過(guò)該列取出特定的商品數(shù)據(jù)了。
反之,如果向product_id 列中輸入了重復(fù)數(shù)據(jù),就無(wú)法取出唯一的特定數(shù)據(jù)了(因?yàn)闊o(wú)法確定唯一的一行數(shù)據(jù))。這樣就可以為某一列設(shè)置主鍵約束了。
表的刪除(DROP TABLE語(yǔ)句)
此前介紹的都是關(guān)于Product 表的內(nèi)容的創(chuàng)建,下面我們就來(lái)介紹一下刪除表的方法。刪除表的SQL 語(yǔ)句非常簡(jiǎn)單, 只需要一行DROP TABLE 語(yǔ)句即可。
語(yǔ)法1-3刪除表時(shí)使用的DROP TABLE語(yǔ)句
DROP TABLE <表名>;
如果想要?jiǎng)h除Product 表,只需要像代碼清單1-3 那樣書(shū)寫(xiě)SQL語(yǔ)句即可。
代碼清單1-3刪除Product表
DROP TABLE Product;
DROP 在英語(yǔ)中是“丟掉”“舍棄”的意思。需要特別注意的是,刪除的表是無(wú)法恢復(fù)的。即使是被誤刪的表,也無(wú)法恢復(fù),只能重新創(chuàng)建,然后重新插入數(shù)據(jù)。
其實(shí)很多RDBMS 都預(yù)留了恢復(fù)的功能,但還是請(qǐng)大家認(rèn)為是無(wú)法恢復(fù)的。
如果不小心刪除了重要的業(yè)務(wù)表,那就太悲劇了。特別是存儲(chǔ)了大量數(shù)據(jù)的表,恢復(fù)起來(lái)費(fèi)時(shí)費(fèi)力,請(qǐng)大家務(wù)必注意!
表定義的更新(ALTER TABLE語(yǔ)句)
有時(shí)好不容易把表創(chuàng)建出來(lái)之后才發(fā)現(xiàn)少了幾列,其實(shí)這時(shí)無(wú)需把表刪除再重新創(chuàng)建,只需使用變更表定義的ALTER TABLE 語(yǔ)句就可以了。ALTER 在英語(yǔ)中就是“改變”的意思。下面就給大家介紹該語(yǔ)句通常的使用方法。
首先是添加列時(shí)使用的語(yǔ)法。
語(yǔ)法1-4添加列的ALTER TABLE語(yǔ)句
ALTER TABLE <表名> ADD COLUMN <列的定義>;
特定的SQL
Oracle 和SQL Server 中不用寫(xiě)COLUMN。
ALTER TABLE <表名> ADD <列名> ;
另外,在Oracle 中同時(shí)添加多列的時(shí)候,可以像下面這樣使用括號(hào)。
ALTER TABLE <表名> ADD (<列名>,<列名>,……);
例如,我們可以使用代碼清單1-4 中的語(yǔ)句在Product 表中添加這樣一列,product_name_pinyin(商品名稱(拼音)),該列可以存儲(chǔ)100 位的可變長(zhǎng)字符串。
代碼清單1-4添加一列可以存儲(chǔ)100位的可變長(zhǎng)字符串的product_name_pinyin列
DB2 PostgreSQL MySQLALTER TABLE Product ADD COLUMN product_name_pinyin VARCHAR(100);OracleALTER TABLE Product ADD (product_name_pinyin VARCHAR2(100));SQL ServerALTER TABLE Product ADD product_name_pinyin VARCHAR(100);
反之,刪除表中某列使用的語(yǔ)法如下所示。
語(yǔ)法1-5刪除列的ALTER TABLE語(yǔ)句
ALTER TABLE <表名> DROP COLUMN <列名>;
特定的SQL
Oracle 中不用寫(xiě)COLUMN。
ALTER TABLE <表名> DROP <列名> ;
另外,在Oracle 中同時(shí)刪除多列的時(shí)候,可以像下面這樣使用括號(hào)來(lái)實(shí)現(xiàn)。
ALTER TABLE <表名> DROP (<列名>,<列名>,……);
例如,我們可以使用代碼清單1-5 中的語(yǔ)句來(lái)刪除之前添加的product_name_pinyin 列。
代碼清單1-5刪除product_name_pinyin列
SQL Server DB2 PostgreSQL MySQLALTER TABLE Product DROP COLUMN product_name_pinyin;OracleALTER TABLE Product DROP (product_name_pinyin);
ALTER TABLE 語(yǔ)句和DROP TABLE 語(yǔ)句一樣,執(zhí)行之后無(wú)法恢復(fù)。誤添的列可以通過(guò)ALTER TABLE 語(yǔ)句刪除,或者將表全部刪除之后重新再創(chuàng)建。
向Product表中插入數(shù)據(jù)
最后讓我們來(lái)嘗試一下向表中插入數(shù)據(jù)。向Product 表中插入數(shù)據(jù)的SQL 語(yǔ)句如代碼清單1-6 所示。
代碼清單1-6向Product表中插入數(shù)據(jù)的SQL語(yǔ)句
SQL Server PostgreSQL-- DML :插入數(shù)據(jù)BEGIN TRANSACTION;—————————①I(mǎi)NSERT INTO Product VALUES (\'0001\', \'T恤衫\', \'衣服\',1000, 500, \'2009-09-20\');INSERT INTO Product VALUES (\'0002\', \'打孔器\', \'辦公用品\',500, 320, \'2009-09-11\');INSERT INTO Product VALUES (\'0003\', \'運(yùn)動(dòng)T恤\', \'衣服\',4000, 2800, NULL);INSERT INTO Product VALUES (\'0004\', \'菜刀\', \'廚房用具\(yùn)',3000, 2800, \'2009-09-20\');INSERT INTO Product VALUES (\'0005\', \'高壓鍋\', \'廚房用具\(yùn)',6800, 5000, \'2009-01-15\');INSERT INTO Product VALUES (\'0006\', \'叉子\', \'廚房用具\(yùn)',500, NULL, \'2009-09-20\');INSERT INTO Product VALUES (\'0007\', \'擦菜板\', \'廚房用具\(yùn)',880, 790, \'2008-04-28\');INSERT INTO Product VALUES (\'0008\', \'圓珠筆\', \'辦公用品\',100, NULL,\'2009-11-11\');COMMIT;
特定的SQL
DBMS 不同,代碼清單1-6中的DML語(yǔ)句也略有不同。
在MySQL 中運(yùn)行時(shí),需要把①中的BEGIN TRANSACTION;改寫(xiě)成
START TRANSACTION;
在Oracle 和DB2中運(yùn)行時(shí),無(wú)需使用①中的BEGIN TRANSACTION;(請(qǐng)予以刪除)。
使用插入行的指令語(yǔ)句INSERT,就可以把表1-2 中的數(shù)據(jù)都插入到表中了。開(kāi)頭的BEGIN TRANSACTION 語(yǔ)句是開(kāi)始插入行的指令語(yǔ)句,結(jié)尾的COMMIT 語(yǔ)句是確定插入行的指令語(yǔ)句。
怎么入門(mén)SQL?近年來(lái),和其他系統(tǒng)領(lǐng)域一樣,數(shù)據(jù)庫(kù)領(lǐng)域也實(shí)現(xiàn)了飛速發(fā)展,應(yīng)用范圍不斷擴(kuò)大,不但出現(xiàn)了具有新功能的數(shù)據(jù)庫(kù),而且操作的數(shù)據(jù)量也大幅增長(zhǎng)。
估計(jì)很多讀者今后都會(huì)慢慢積累各個(gè)領(lǐng)域、各種規(guī)模的系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)(或者可能已經(jīng)開(kāi)始從事開(kāi)發(fā)方面的工作了),到那時(shí),所有的系統(tǒng)必定都需要使用數(shù)據(jù)庫(kù)。它們使用的數(shù)據(jù)庫(kù),即便不是關(guān)系數(shù)據(jù)庫(kù),也一定是以關(guān)系數(shù)據(jù)庫(kù)為基礎(chǔ)的數(shù)據(jù)庫(kù)。從這個(gè)意義上看,如果掌握了關(guān)系數(shù)據(jù)庫(kù)和 SQL,就能成為任何系統(tǒng)開(kāi)發(fā)都需要的數(shù)據(jù)庫(kù)專家了。
下面分享一本口碑不錯(cuò)的SQL入門(mén)書(shū),它介紹了時(shí)下最流行的數(shù)據(jù)庫(kù)——關(guān)系數(shù)據(jù)庫(kù),這也是理解其他數(shù)據(jù)庫(kù)的基礎(chǔ)。在系統(tǒng)領(lǐng)域,通常所講的數(shù)據(jù)庫(kù)指的就是關(guān)系數(shù)據(jù)庫(kù),其重要性可見(jiàn)一斑。
日本知名數(shù)據(jù)庫(kù)工程師寫(xiě)給初學(xué)者的實(shí)用指南!107張圖表+209段代碼+88個(gè)法則,讓菜鳥(niǎo)完美進(jìn)階!基于標(biāo)準(zhǔn)SQL編寫(xiě),明示各RDBMS(PostgreSQL/DB2/MySQL/Oracle/SQL Server)的差異!本書(shū)是編程學(xué)習(xí)系列的 SQL 和關(guān)系數(shù)據(jù)庫(kù)篇。該系列注重對(duì)初學(xué)者編程能力的培養(yǎng),本書(shū)秉承了這一宗旨。本書(shū)不僅可以用于自學(xué),也可以作為大學(xué)、??茖W(xué)校和企業(yè)新人的培訓(xùn)用書(shū)。書(shū)中提供了大量的示例程序和詳實(shí)的操作步驟說(shuō)明,大家可以親自動(dòng)手解決具體的問(wèn)題,切實(shí)提高自身的編程能力。
另外,在各章的結(jié)尾處還安排了習(xí)題來(lái)幫助大家復(fù)習(xí)該章的知識(shí)要點(diǎn),習(xí)題的答案和講解收錄在附錄中。
本文內(nèi)容節(jié)選自《SQL基礎(chǔ)教程(第2版)》。
以上就是關(guān)于pos機(jī)sql數(shù)據(jù)庫(kù),怎么入門(mén)SQL的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)sql數(shù)據(jù)庫(kù)的知識(shí),希望能夠幫助到大家!









