1 關於SQL / About SQL html
構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數據庫系統;同時也是數據庫腳本文件的擴展名。mysql
結構化查詢語言是高級的非過程化編程語言,容許用戶在高層數據結構上工做。它不要求用戶指定對數據的存放方法,也不須要用戶瞭解具體的數據存放方式,因此具備徹底不一樣底層結構的不一樣數據庫系統, 可使用相同的結構化查詢語言做爲數據輸入與管理的接口。結構化查詢語言語句能夠嵌套,這使它具備極大的靈活性和強大的功能。sql
1.1 SQL語言 / SQL Language數據庫
結構化查詢語言包含6個部分:編程
1. 數據查詢語言(DQL: Data Query Language)安全
其語句,也稱爲「數據檢索語句」,用以從表中得到數據,肯定數據怎樣在應用程序給出。保留字SELECT是DQL(也是全部SQL)用得最多的動詞,其餘DQL經常使用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其餘類型的SQL語句一塊兒使用。服務器
2. 數據操做語言(DML: Data Manipulation Language)網絡
其語句包括動詞INSERT, UPDATE和DELETE。它們分別用於添加,修改和刪除表中的行。也稱爲動做查詢語言。數據結構
3. 事務處理語言(TPL)多線程
它的語句能確保被DML語句影響的表的全部行及時得以更新。TPL語句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
4. 數據控制語言(DCL)
它的語句經過GRANT或REVOKE得到許可,肯定單個用戶和用戶組對數據庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對錶單個列的訪問。
5. 數據定義語言(DDL)
其語句包括動詞CREATE和DROP。在數據庫中建立新表或刪除表(CREAT TABLE 或 DROP TABLE);爲表加入索引等。DDL包括許多與人數據庫目錄中得到數據有關的保留字。它也是動做查詢的一部分。
6. 指針控制語言(CCL)
它的語句,像DECLARE CURSOR, FETCH INTO和UPDATE WHERE CURRENT用於對一個或多個表單獨行的操做
1.2 SQL數據類型 / SQL Data
結構化查詢語言共有五種數據類型,字符型,文本型,數值型,邏輯型和日期型。
1. 字符型
VARCHAR VS CHAR
VARCHAR型和CHAR型數據的這個差異是細微的,可是很是重要。他們都是用來儲存字符串長度小於255的字符。
假如你向一個長度爲四十個字符的VARCHAR型字段中輸入數據Bill Gates。當你之後從這個字段中取出此數據時,你取出的數據其長度爲十個字符——字符串Bill Gates的長度。假如你把字符串輸入一個長度爲四十個字符的CHAR型字段中,那麼當你取出數據時,所取出的數據長度將是四十個字符。字符串的後面會被附加多餘的空格。
當你創建本身的站點時,你會發現使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段時,你不須要爲剪掉你數據中多餘的空格而操心。
VARCHAR型字段的另外一個突出的好處是它能夠比CHAR型字段佔用更少的內存和硬盤空間。當你的數據庫很大時,這種內存和磁盤空間的節省會變得很是重要。
2. 文本型 TEXT
使用文本型數據,你能夠存放超過二十億個字符的字符串。當你須要存儲大串的字符時,應該使用文本型數據。
注意文本型數據沒有長度,而上一節中所講的字符型數據是有長度的。一個文本型字段中的數據一般要麼爲空,要麼很大。
當你從HTML FORM的多行文本編輯框(TEXTAREA)中收集數據時,你應該把收集的信息存儲於文本型字段中。可是,不管什麼時候,只要你能避免使用文本型字段,你就應該不使用它。文本型字段既大且慢,濫用文本型字段會使服務器速度變慢。文本型字段還會吃掉大量的磁盤空間。
一旦你向文本型字段中輸入了任何數據(甚至是空值),就會有2K的空間被自動分配給該數據。除非刪除該記錄,不然你沒法收回這部分存儲空間。
3. 數值型 整數INT 小數NUMERIC 錢數MONEY
INT VS SMALLINT VS TINYINT
一般,爲了節省空間,應該儘量的使用最小的整型數據。一個TINYINT型數據只佔用一個字節;一個INT型數據佔用四個字節。這看起來彷佛差異不大,可是在比較大的表中,字節數的增加是很快的。另外一方面,一旦你已經建立了一個字段,要修改它是很困難的。所以,爲安全起見,你應該預測一下,一個字段所須要存儲的數值最大有多是多大,而後選擇適當的數據類型。
NUMERIC
爲了能對字段所存放的數據有更多的控制,你可使用NUMERIC型數據來同時表示一個數的整數部分和小數部分。NUMERIC型數據使你能表示很是大的數——比INT型數據要大得多。一個NUMERIC型字段能夠存儲從-10^38到10^38範圍內的數。NUMERIC型數據還使你能表示有小數部分的數。例如,你能夠在NUMERIC型字段中存儲小數3.14。
MONEY VS SMALLMONEY
你可使用 INT型或NUMERIC型數據來存儲錢數。可是,專門有另外兩種數據類型用於此目的。
若是你但願你的網點能掙不少錢,你可使用MONEY型數據。若是你的野心不大,你可使用SMALLMONEY型數據。MONEY型數據能夠存儲從-922,337,203,685,477.5808到922,337,203,685,477.5807的錢數。若是你須要存儲比這還大的金額,你可使用NUMERIC型數據。
SMALLMONEY型數據只能存儲從-214,748.3648到214,748.3647 的錢數。一樣,若是能夠的話,你應該用SMALLMONEY型來代替MONEY型數據,以節省空間。
4. 邏輯型 BIT
若是你使用複選框(CHECKBOX)從網頁中搜集信息,你能夠把此信息存儲在BIT型字段中。BIT型字段只能取兩個值:0或1。
Note: 在你建立好一個表以後,不能向表中添加 BIT型字段。若是你打算在一個表中包含BIT型字段,你必須在建立表時完成。
5. 日期型
DATETIME VS SMALLDATETIME
一個 DATETIME型的字段能夠存儲的日期範圍是從1753年1月1日第一毫秒到9999年12月31日最後一毫秒。
若是你不須要覆蓋這麼大範圍的日期和時間,你可使用SMALLDATETIME型數據。它與DATETIME型數據一樣使用,只不過它能表示的日期和時間範圍比DATETIME型數據小,並且不如DATETIME型數據精確。一個SMALLDATETIME型的字段可以存儲從1900年1月1日到2079年6月6日的日期,它只能精確到秒。
DATETIME型字段在你輸入日期和時間以前並不包含實際的數據,認識這一點是重要的
1.3 SQL經常使用命令 / SQL Frequent Command
可參考經常使用命令。
1.4 T-SQL簡介 / About Transact-SQL
Transact-SQL(T-SQL)是微軟和Sybase使用的一種SQL擴展語言,用於與關係型數據庫進行事務交互。T-SQL擴展了SQL的多項標準,包括過程編程,本地變量及多種支持函數,同時也對DELETE和UPDATE語句進行了修改,容許DELETE與UPDATE增長條件FROM。
在流程控制方面,加入了BEGIN和END,BREAK,CONTINUE,GOTO以及IF和ELSE,RETURN,WAITFOR和WHILE等,使其更具編程化。
2 關於數據庫 / About Database
2.1 經常使用數據庫
目前主要的幾種流行數據庫爲MySQL, SQL server, Oracle, Sysbase, Access等,詳細內容能夠參考經常使用數據庫。
2.1.1 MySQL
2.1.1.1 MySQL簡介
MySQL是最受歡迎的開源SQL數據庫管理系統,它由MySQL AB開發、發佈和支持。MySQL AB是一家基於MySQL開發人員的商業公司
MySQL是一個快速的、多線程、多用戶和健壯的SQL數據庫服務器。MySQL服務器支持關鍵任務、重負載生產系統的使用,也能夠將它嵌入到一個大配置(mass- deployed)的軟件中去。
與其餘數據庫管理系統相比,MySQL具備如下優點:
(1) MySQL是一個關係數據庫管理系統。
(2) MySQL是開源的。
(3) MySQL服務器是一個快速的、可靠的和易於使用的數據庫服務器。
(4) MySQL服務器工做在客戶/服務器或嵌入系統中。
(5) 有大量的MySQL軟件可使用
2.1.1.2 MySQL使用教程
關於MySQL數據庫的使用能夠參考教程。
2.1.1.3 MySQL數據類型
能夠參考MySQL的數據類型。
2.1.1.3.1 整型
MySQL數據類型 |
含義(有符號) |
tinyint(m) |
1個字節 範圍(-128~127) |
smallint(m) |
2個字節 範圍(-32768~32767) |
mediumint(m) |
3個字節 範圍(-8388608~8388607) |
int(m) |
4個字節 範圍(-2147483648~2147483647) |
bigint(m) |
8個字節 範圍(+-9.22*10的18次方) |
Note: 取值範圍若是加了unsigned,則最大值翻倍,如tinyint unsigned的取值範圍爲(0~256)。 int(m)裏的m是表示SELECT查詢結果集中的顯示寬度,並不影響實際的取值範圍,沒有影響到顯示的寬度,不知道這個m有什麼用。
2.1.1.3.2 浮點型(float和double)
MySQL數據類型 |
含義 |
float(m,d) |
單精度浮點型,8位精度(4字節),m總個數,d小數位 |
double(m,d) |
雙精度浮點型,16位精度(8字節),m總個數,d小數位 |
Note: 設一個字段定義爲float(5,3),若是插入一個數123.45678,實際數據庫裏存的是123.457,但總個數還以實際爲準,即6位。
2.1.1.3.3 定點數
浮點型在數據庫中存放的是近似值,而定點類型在數據庫中存放的是精確值。
decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位。
2.1.1.3.4 字符串(char, varchar, _text)
MySQL數據類型 |
含義 |
char(n) |
固定長度,最多255個字符 |
varchar(n) |
固定長度,最多65535個字符 |
tinytext |
可變長度,最多255個字符 |
text |
可變長度,最多65535個字符 |
mediumtext |
可變長度,最多2的24次方-1個字符 |
longtext |
可變長度,最多2的32次方-1個字符 |
char和varchar
1.char(n) 若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉。因此char類型存儲的字符串末尾不能有空格,varchar不限於此。
2.char(n) 固定長度,char(4)無論是存入幾個字符,都將佔用4個字節,varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),因此varchar(4),存入3個字符將佔用4個字節。
3.char類型的字符串檢索速度要比varchar類型的快。
varchar和text
1.varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),text是實際字符數+2個字節。
2.text類型不能有默認值。
3.varchar可直接建立索引,text建立索引要指定前多少個字符。varchar查詢速度快於text,在都建立索引的狀況下,text的索引彷佛不起做用。
2.1.1.3.5 二進制數據(_Blob)
1._BLOB和_text存儲方式不一樣,_TEXT以文本方式存儲,英文存儲區分大小寫,而_Blob是以二進制方式存儲,不分大小寫。
2._BLOB存儲的數據只能總體讀出。
3._TEXT能夠指定字符集,_BLO不用指定字符集。
2.1.1.3.6 日期時間類型
MySQL數據類型 |
含義 |
date |
日期 '2008-12-2' |
time |
時間 '12:25:36' |
datetime |
日期時間 '2008-12-2 22:06:44' |
timestamp |
自動存儲記錄修改時間 |
若定義一個字段爲timestamp,這個字段裏的時間數據會隨其餘字段修改的時候自動刷新,因此這個數據類型的字段能夠存放這條記錄最後被修改的時間。
2.1.1.3.7 數據類型的屬性
MySQL關鍵字 |
含義 |
NULL |
數據列可包含NULL值 |
NOT NULL |
數據列不容許包含NULL值 |
DEFAULT |
默認值 |
PRIMARY KEY |
主鍵 |
AUTO_INCREMENT |
自動遞增,適用於整數類型 |
UNSIGNED |
無符號 |
CHARACTER SET name |
指定一個字符集 |
2.1.1.4 MySQL自帶數據庫
2.1.1.4.1 information_schema
MySQL中,除了自行安裝的數據庫外,還有一個information_schema數據庫,詳細信息來源於參考連接。
information_schema數據庫是MySQL自帶的,它提供了訪問數據庫元數據的方式。什麼是元數據呢?元數據是關於數據的數據,如數據庫名或表名,列的數據類型,或訪問權限等。有些時候用於表述該信息的其餘術語包括「數據詞典」和「系統目錄」。
在 MySQL中,把information_schema看做是一個數據庫,確切說是信息數據庫。其中保存着關於MySQL服務器所維護的全部其餘數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。在information_schema中,有數個只讀表。它們其實是視圖,而不是基本表,所以,你將沒法看到與之相關的任何文件。
2.1.1.4.1.1 數據庫內的表說明
SCHEMATA表: 提供了當前mysql實例中全部數據庫的信息,show databases的結果取之此表。
TABLES表: 提供了關於數據庫中的表的信息(包括視圖)。詳細表述了某個表屬於哪一個schema,表類型,表引擎,建立時間等信息。show tables from schemaname的結果取之此表。
COLUMNS表: 提供了表中的列信息。詳細表述了某張表的全部列以及每一個列的信息。show columns from schemaname.tablename的結果取之此表。
STATISTICS表: 提供了關於表索引的信息。show index from schemaname.tablename的結果取之此表。
USER_PRIVILEGES(用戶權限)表: 給出了關於全程權限的信息,該信息源自於mysql.user受權表。是非標準表。
SCHEMA_PRIVILEGES(方案權限)表: 給出了關於方案(數據庫)權限的信息。該信息來自mysql.db受權表。是非標準表。
TABLE_PRIVILEGES(表權限)表: 給出了關於表權限的信息。該信息源自mysql.tables_priv受權表。是非標準表。
COLUMN_PRIVILEGES(列權限)表: 給出了關於列權限的信息。該信息源自mysql.columns_priv受權表。是非標準表。
CHARACTER_SETS(字符集)表: 提供了mysql實例可用字符集的信息。show character set的結果集取之此表。
COLLATIONS表: 提供了關於各字符集的對照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表: 指明瞭可用於校對的字符集。這些列等效於show collation的前兩個顯示字段。
TABLE_CONSTRAINTS表: 描述了存在約束的表。以及表的約束類型。
KEY_COLUMN_USAGE表: 描述了具備約束的鍵列。
ROUTINES表: 提供了關於存儲子程序(存儲程序和函數)的信息。此時,ROUTINES表不包含自定義函數(UDF)。名爲「mysql.proc name」的列指明瞭對應於INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表: 給出了關於數據庫中的視圖的信息。須要有show views權限,不然沒法查看視圖信息。
TRIGGERS表: 提供了關於觸發程序的信息。必須有super權限才能查看該表。
2.1.1.4.1.2 使用技巧
1. 相似MS SQL SERVER中的SP_HELPTEXT查看存儲過程、函數、視圖的功能
SHOW CREATE PROCEDURE 存儲過程名;
SHOW CREATE FUNCTION 函數名;
SHOW CREATE VIEW 視圖名;
還可使用如下辦法(但下面的辦法只包含存儲過程主體部分,不包含Create以及傳入參數申明的部分):
SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='數據庫名' AND ROUTINE_TYPE='PROCEDURE' and ROUTINE_NAME='存儲過程名';
函數也相似,只須要將查詢條件對應改爲ROUTINE_TYPE='FUNCTION'就行
2. 查看當前實例包含的數據庫列表
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;
3. 查詢數據庫中全部的表(包含視圖)
SELECT * FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA='數據庫名' and TABLE_TYPE='BASE TABLE';
SELECT * FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA='數據庫名' and TABLE_TYPE='VIEW';
4. 查詢數據庫中全部的視圖
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA='數據庫名';
5. 查詢表對應的字段
a. SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='數據庫名' and table_name='表名';
b. 橫向列出表對應的字段,方便寫Insert語句: select GROUP_CONCAT(COLUMN_name) as '字段' from INFORMATION_SCHEMA.COLUMNS WHERE table_schema='數據庫名' and table_name='表名';
6. 查詢關鍵字在哪些存儲過程或者函數中存在
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='數據庫名' AND ROUTINE_TYPE='PROCEDURE' AND ROUTINE_DEFINITION like '%關鍵字%';
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='數據庫名' AND ROUTINE_TYPE='FUNCTION' AND ROUTINE_DEFINITION like '%關鍵字%';
2.1.2 SQL Server
2.1.2.1 SQL Server簡介
SQL Server (MSSQL)是由微軟開發的數據庫管理系統,是Web上最流行的用於存儲數據的數據庫,它已普遍用於電子商務、銀行、保險、電力等與數據庫有關的行業。
目前最新版本是SQL Server 2005,它只能在Windows上運行,操做系統的系統穩定性對數據庫十分重要。並行實施和共存模型並不成熟,很難處理日益增多的用戶數和數據卷,伸縮性有限。
SQL Server 提供了衆多的Web和電子商務功能,如對XML和Internet標準的豐富支持,經過Web對數據進行輕鬆安全的訪問,具備強大的、靈活的、基於Web的和安全的應用程序管理等。並且,因爲其易操做性及其友好的操做界面,深受廣大用戶的喜好。
2.1.3 Oracle
提起數據庫,第一個想到的公司,通常都會是Oracle(甲骨文)。該公司成立於1977年,最初是一家專門開發數據庫的公司。Oracle在數據庫領域一直處於領先地位。 1984年,首先將關係數據庫轉到了桌面計算機上。而後,Oracle5率先推出了分佈式數據庫、客戶/服務器結構等嶄新的概念。Oracle 6獨創行鎖定模式以及對稱多處理計算機的支持,最新的Oracle 8主要增長了對象技術,成爲關係—對象數據庫系統。目前,Oracle產品覆蓋了大、中、小型機等幾十種機型,Oracle數據庫成爲世界上使用最普遍的關係數據系統之一。
Oracle數據庫產品具備如下優良特性。
(1) 兼容性: Oracle產品採用標準SQL,並通過美國國家標準技術所(NIST)測試。與IBM SQL/DS、DB二、INGRES、IDMS/R等兼容。
(2) 可移植性: Oracle的產品可運行於很寬範圍的硬件與操做系統平臺上。能夠安裝在70種以上不一樣的大、中、小型機上;可在VMS、DOS、UNIX、Windows等多種操做系統下工做。
(3) 可聯結性: Oracle能與多種通信網絡相連,支持各類協議(TCP/IP、DECnet、LU6.2等)。
(4) 高生產率: Oracle產品提供了多種開發工具,能極大地方便用戶進行進一步的開發。
(5) 開放性: Oracle良好的兼容性、可移植性、可鏈接性和高生產率使Oracle RDBMS具備良好的開放性。
2.1.4 Sysbase
1984年,Mark B. Hiffman和Robert Epstern建立了Sybase公司,並在1987年推出了Sybase數據庫產品。Sybase主要有三種版本:一是UNIX操做系統下運行的版本;二是Novell Netware環境下運行的版本;三是Windows NT環境下運行的版本。對UNIX操做系統,目前應用最普遍的是SYBASE 10及SYABSE 11 for SCO UNIX。
Sybase數據庫的特色:
(1) 它是基於客戶/服務器體系結構的數據庫。
(2) 它是真正開放的數據庫。
(3) 它是一種高性能的數據庫。
2.2 數據庫結構
2.2.1 數據庫 / Database
Visual Basic中使用的數據庫是關係型數據庫(Relational Database)。一個數據庫由一個或一組數據表組成。每一個數據庫都以文件的形式存放在磁盤上,即對應於一個物理文件。不一樣的數據庫,與物理文件對應的方式也不同。對於dBASE, FoxPro和Paradox格式的數據庫來講,一個數據表就是一個單獨的數據庫文件,而對於Microsoft Access、Btrieve格式的數據庫來講,一個數據庫文件能夠含有多個數據表。
2.2.2 數據表 / Table
簡稱表,由一組數據記錄組成,數據庫中的數據是以表爲單位進行組織的。一個表是一組相關的按行排列的數據;每一個表中都含有相同類型的信息。表其實是一個二維表格,例如,一個班全部學生的考試成績,能夠存放在一個表中,表中的每一行對應一個學生,這一行包括學生的學號,姓名及各門課程成績。
2.2.3 記錄 / Record
表中的每一行稱爲一個記錄,它由若干個字段組成。
2.2.4 字段 / Field
也稱域。表中的每一列稱爲一個字段。每一個字段都有相應的描述信息,如數據類型、數據寬度等。
2.2.5 索引 / Index
爲了提升訪問數據庫的效率,能夠對數據庫使用索引。當數據庫較大時,爲了查找指定的記錄,則使用索引和不使用索引的效率有很大差異。索引其實是一種特殊類型的表,其中含有關鍵字段的值(由用戶定義)和指向實際記錄位置的指針,這些值和指針按照特定的順序(也由用戶定義)存儲,從而能夠以較快的速度查找到所須要的數據記錄。
2.2.6 查詢 / Query
一條SQL(結構化查詢語言)命令,用來從一個或多個表中獲取一組指定的記錄,或者對某個表執行指定的操做。當從數據庫中讀取數據時,每每但願讀出的數據符合某些條件,而且能按某個字段排序。使用SQL,可使這一操做容易實現並且更加有效。SQL是非過程化語言(有人稱爲第四代語言),在用它查找指定的記錄時,只需指出作什麼,沒必要說明如何作。每一個語句能夠看做是一個查詢(query),根據這個查詢,能夠獲得須要的查詢結果。
2.2.7 過濾器 / Filter
過濾器是數據庫的一個組成部分,它把索引和排序結合起來,用來設置條件,而後根據給定的條件輸出所須要的數據。
2.2.8 視圖 / View
數據的視圖指的是查找到(或者處理)的記錄數和顯示(或者進行處理)這些記錄的順序。在通常狀況下,視圖由過濾器和索引控制。視圖中並不存儲數據,視圖是一種虛表。
2.3 數據庫類型
2.3.1 關係型數據庫
關係型數據庫是指採用了關係模型來組織數據的數據庫。
關係模型是在1970年由IBM的研究員E.F.Codd博士首先提出的,在以後的幾十年中,關係模型的概念獲得了充分的發展並逐漸成爲主流數據庫結構的主流模型。
簡單來講,關係模型指的就是二維表格模型,而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織。
關係模型中經常使用的概念:
關係: 能夠理解爲一張二維表,每一個關係都具備一個關係名,就是一般說的表名
元組: 能夠理解爲二維表中的一行,在數據庫中常常被稱爲記錄
屬性: 能夠理解爲二維表中的一列,在數據庫中常常被稱爲字段
域: 屬性的取值範圍,也就是數據庫中某一列的取值限制
關鍵字: 一組能夠惟一標識元組的屬性,數據庫中常稱爲主鍵,由一個或多個列組成
關係模式: 指對關係的描述。其格式爲:關係名(屬性1,屬性2, ... ... ,屬性N),在數據庫中成爲表結構
關係型數據庫的優勢:
容易理解: 二維表結構是很是貼近邏輯世界的一個概念,關係模型相對網狀、層次等其餘模型來講更容易理解
使用方便: 通用的SQL語言使得操做關係型數據庫很是方便
易於維護: 豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗餘和數據不一致的機率。
2.3.2 非關係型數據庫
非關係型數據庫提出另外一種理念,例如,以鍵值對存儲,且結構不固定,每個元組能夠有不同的字段,每一個元組能夠根據須要增長一些本身的鍵值對,這樣就不會侷限於固定的結構,能夠減小一些時間和空間的開銷。使用這種方式,用戶能夠根據須要去添加本身須要的字段,這樣,爲了獲取用戶的不一樣信息,不須要像關係型數據庫中,要對多表進行關聯查詢。僅須要根據id取出相應的value就能夠完成查詢。但非關係型數據庫因爲不多的約束,他也不可以提供像SQL所提供的where這種對於字段屬性值狀況的查詢。而且難以體現設計的完整性。他只適合存儲一些較爲簡單的數據,對於須要進行較複雜查詢的數據,SQL數據庫顯的更爲合適。
因爲非關係型數據庫自己自然的多樣性,以及出現的時間較短,所以,不想關係型數據庫,有幾種數據庫可以一統江山,非關係型數據庫很是多,而且大部分都是開源的。
這些數據庫中,其實實現大部分都比較簡單,除了一些共性外,很大一部分都是針對某些特定的應用需求出現的,所以,對於該類應用,具備極高的性能。依據結構化方法以及應用場合的不一樣,主要分爲如下幾類,
面向高性能併發讀寫的key-value數據庫:
key-value數據庫的主要特色即便具備極高的併發讀寫性能,Redis,Tokyo Cabinet,Flare就是這類的表明。
面向海量數據訪問的面向文檔數據庫:
這類數據庫的特色是,能夠在海量的數據中快速的查詢數據,典型表明爲MongoDB以及CouchDB。
面向可擴展性的分佈式數據庫:
這類數據庫想解決的問題就是傳統數據庫存在可擴展性上的缺陷,這類數據庫能夠適應數據量的增長以及數據結構的變化。
2.3.3 NoSQL
NoSQL(NoSQL = Not Only SQL ),意即「不只僅是SQL」,是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢愈加高漲。NoSQL的擁護者們提倡運用非關係型的數據存儲,相對於鋪天蓋地的關係型數據庫運用,這一律念無疑是一種全新的思惟的注入。
2.4 數據庫相關知識
2.4.1 Schema(模式)與dbo
關於Schema的理解來自於這個連接
SQL中有一個Schema的概念,實際上Schema就是數據庫對象的集合,這個集合包含了表、視圖、存儲過程、索引等,爲了區分不一樣的集合,就須要給不一樣的集合起不一樣的名字,默認狀況下一個用戶對應一個集合,用戶的schema名等於用戶名,並做爲該用戶缺省schema。因此schema集合看上去像用戶名。
若是把database看做是一個倉庫,倉庫不少房間(schema),一個schema表明一個房間,table能夠看做是每一個房間中的儲物櫃,user是每一個schema的主人,有操做數據庫中每一個房間的權利,就是說每一個數據庫映射的user有每一個schema(房間)的鑰匙。
咱們訪問一個表時,沒有指明該表屬於哪個schema中的,系統就會自動給咱們在表上加上缺省的shema名。在數據庫中一個對象的完整名稱爲schema.object,而不屬user.object。
在MySQL中建立一個Schema和建立一個Database的效果好像是同樣的,可是在sqlserver和orcal數據庫中效果又是不一樣的。
在SQL Server 2000中,user和schema總有一層隱含的關係,讓咱們不多意識到其實user和schema是兩種徹底不一樣的概念,假如咱們在某一數據庫中建立了用戶Bosco,那麼此時後臺也爲咱們默認的建立了schema【Bosco】,schema的名字和user的名字相同。
在SQL Server 2005中,爲了向後兼容,當用sp_adduser存儲過程建立一個用戶的時候,sqlserver2005同時也建立了一個和用戶名相同的schema,然而這個存儲過程是爲了向後兼容才保留的,當咱們用create user建立數據庫用戶時,咱們能夠爲該用戶指定一個已經存在的schema做爲默認的schema,若是咱們不指定,則該用戶所默認的schema即爲dbo schema,dbo房間(schema)比如一個大的公共房間,在當前登陸用戶沒有默認schema的前提下,若是你在大倉庫中進行一些操做,好比create table,若是沒有制定特定的房間(schema),那麼你的物品就只好放進公共的dbo房間(schema)了。可是若是當前登陸用戶有默認的schema,那麼所作的一切操做都是在默認的schema上進行。
在Oracle數據庫中不能新建一個schema,要想建立一個schema,只能經過建立一個用戶的方法解決,在建立一個用戶的同時爲這個用戶建立一個與用戶名同名的schem並做爲該用戶的缺省shcema。即schema的個數同user的個數相同,並且schema名字同user名字一一對應而且相同。
http://blog.csdn.net/znyyjk/article/details/52717336
https://en.wikipedia.org/wiki/Transact-SQL
http://blog.csdn.net/op_zoro/article/details/8143024
http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html
http://www.cnblogs.com/zbseoag/archive/2013/03/19/2970004.html
http://www.cnblogs.com/lrl45/p/5923444.html