数据库高级教程(三)
1.SQL create INDEX
用于在表中創建索引
在不讀取整個表得情況下,索引是數據庫應用程序可以更快的查找數據
索引
您可以在表中創建索引,以便更加快速高效的查詢數據,
用戶無法看到索引,他們只能用來加速搜索和查詢
注意 更新一個包含索引的表需要比更新一個無索引的表需要更多的時間。這是因為索引本身也需要更新,因此理想的做法是僅僅在常常被搜索的列(以及表中)上面創建索引
語法
在表中創建一個簡單的索引,允許使用重復的值
create ?index ?index_name
ON table_name (column_name)
注意 column_name規定需要索引的列
SQL create ?unique index ?index_name ? ON ?table_name(column _name)
create ?index實例
創建一個簡單的索引,名字為PersonIndex 在Person表中得LastName列
create ?index ?PersonIndex
ON Person (LastName)
如果希望降序索引某個列中得值,可以在列名稱后添加保留字DESC
create ?index ?PersonIndex
ON Person(LastName DESC)
如果索引不止一個列,可以在括號中列出這些列的名稱,用逗號隔開
create ?Index PersonIndex ?ON ?Person (LastName,FirstName)
2.SQL撤銷索引。表以及數據庫
Drop語句
SQL DROP INDEX
我們可以使用DROP INDEX 命令刪除表格中得索引。
用于MicrosoftSQLJet(以及 Microsoft access)語法
DROP ?INDEX ?index_name ?ON table_name
用于MS SQL Server的語法
DROP ?INDEX table_name.index_name
用于IBM DB2和Oracle的語法
DROP ?INDEX index_name
用于MySQL的語法
Alert ?table ?table_name ?DROP ?INDEX ?index_name
SQL DROP ?TABLE 語句
DROP table語句用于刪除表(表的結構,屬性以及索引也將會被刪除)
DROP table 表名稱
3.SQL DROP database語句
用于刪除數據庫
DROP database 數據庫名稱
SQL truncate ?table語句
如果我們僅僅需要出去表中得數據,但不需要刪除表本身、則可以使用該語句
TRUNCATE TABLE 表名稱 僅僅刪除表格中得數據、。
4.Alter Table 語句
用于在已有的表中添加,修改或者刪除列
語法
在表總添加列
ALERT TABLE ?table_name ?ADD colume_name datatype
刪除表中的列
ALERT TABLE table_name ?DROP COLUMN column_name(某些數據庫系統中不允許這種刪除方式)
改變表中列的數據類型
ALERT TABLE table_name ALERT column column_name dataType
原始的表
Id ? ? ? ? ? ? ? ? LastName ? ? ? ? ? ? ? ? FirstName ? ? ? ? ? ? ? ?city
1 ? ? ? ? ? ? ? ? ? adamas ? ? ? ? ? ? ? ? ? ? ?john ? ? ? ? ? ? ? ? ? ? ? ?London
2 ? ? ? ? ? ? ? ? ? Bush ? ? ? ? ? ? ? ? ? ? ? ? ? Geodge ? ? ? ? ? ? ? ? ?New York
3 ? ? ? ? ? ? ? ? Carter ? ? ? ? ? ? ? ? ? ? ? ? ? Thomas ? ? ? ? ? ? ? ? ?Beijing
SQL ?Alert Table 實例
ALERT ?TABLE ?Person ADD Birthday ? date
注意: birthday的數據類型為 date 可以存放日期
新的表中得類型,
Id ? ? ? ? ? ? ? ? LastName ? ? ? ? ? ? ? ? FirstName ? ? ? ? ? ? ? ?city ? ? ? ? ? ? ? ? ? ? ?Birthday
1 ? ? ? ? ? ? ? ? ? adamas ? ? ? ? ? ? ? ? ? ? ?john ? ? ? ? ? ? ? ? ? ? ? ?London
2 ? ? ? ? ? ? ? ? ? Bush ? ? ? ? ? ? ? ? ? ? ? ? ? Geodge ? ? ? ? ? ? ? ? ?New York
3 ? ? ? ? ? ? ? ? Carter ? ? ? ? ? ? ? ? ? ? ? ? ? Thomas ? ? ? ? ? ? ? ? ?Beijing
改變數據類型實例
改變 Person中Birthday列的數據類型
ALERT TABLE Person ALERT COLUMN Birthday year
注意 Birthday 的數據類型為year 可以存放2位或4位格式的年份。
DROP COLUMN
刪除 Person表中的Birthday的列
Id ? ? ? ? ? ? ? ? LastName ? ? ? ? ? ? ? ? FirstName ? ? ? ? ? ? ? ?city
1 ? ? ? ? ? ? ? ? ? adamas ? ? ? ? ? ? ? ? ? ? ?john ? ? ? ? ? ? ? ? ? ? ? ?London
2 ? ? ? ? ? ? ? ? ? Bush ? ? ? ? ? ? ? ? ? ? ? ? ? Geodge ? ? ? ? ? ? ? ? ?New York
3 ? ? ? ? ? ? ? ? Carter ? ? ? ? ? ? ? ? ? ? ? ? ? Thomas ? ? ? ? ? ? ? ? ?Beijing
5.SQL AUTO INCREMENT
會在新紀錄插入表中時生成一個唯一的數字。
AUTO INCREMENT 字段
我們通常希望在每次插入新紀錄時,自動創建主鍵字段的值。
用于MYSQL的語法
把Person表中的P_Id 列定義為auto-increment主鍵
create TABLE Person
(
?P_Id int NOT ?NULL AUTO_INCREMENT,
LastName varchar(255)NOT NULL,
firstName varchar (255),
address varchar (255),
city varchar (255),
PRIMARY KEY (P_Id)
)
MySQL 使用auto_INCREMENT 關鍵字來執行auto-increment任務,
默認,AUTO-INCREMENT的開始值為1,每條新紀錄遞增1,
要讓AUTO_INCREMENT序列以其他的值起始,使用語法
alter ?TABLE Person AUTO_INCREMENT=100
要在Person表中插入新紀錄,我們不需要為P_Id列規定值(會自動添加唯一的值)
insert ?into ? Person(FirstName,LastName)
values ?('Bill','Gates')
上面的SQL語句會在Person表中插入一條新紀錄,P_Id會被賦予一個唯一的值FirstName會被設置為Bill,LastName會被設置為Gates
用于SQL SERVER的語法
create TABLE Person
(
?P_Id int Primary KEY identity,
LastName varchar(255)NOT NULL,
firstName varchar (255),
address varchar (255),
city varchar (255),
)
MySQL 使用IDENTITY 關鍵字來執行auto-increment任務,
默認的 IDENTITY的開始值為1,每條新紀錄遞增1
要規定P_Id 列以20起始且遞增10,可以把identtity 改為 IDENTITY(20,10)
要在Person表中插入新紀錄,我們不需要為P_Id列規定值(會自動添加唯一的值)insert ?into ? Person(FirstName,LastName)
values ?('Bill','Gates')
上面的SQL語句會在Person表中插入一條新紀錄,P_Id會被賦予一個唯一的值FirstName會被設置為Bill,LastName會被設置為Gates用于Access的語法
把Person表中的P_Id 列定義為auto-increment主鍵
create TABLE Person
(
?P_Id int PRIMARY KEY AUTO_INCREMENT,
LastName varchar(255)NOT NULL,
firstName varchar (255),
address varchar (255),
city varchar (255),
)
MY Access 使用AUTOINCREMENT 關鍵字來執行auto-increment任務,
默認的 IDENTITY的開始值為1,每條新紀錄遞增1
要規定P_Id 列以20起始且遞增10,可以把identtity 改為 AUTOINCREMENT(20,10)
要在Person表中插入新紀錄,我們不需要為P_Id列規定值(會自動添加唯一的值)insert ?into ? Person(FirstName,LastName)
values ?('Bill','Gates')
上面的SQL語句會在Person表中插入一條新紀錄,P_Id會被賦予一個唯一的值FirstName會被設置為Bill,LastName會被設置為Gates
使用下面的create sequence ?語法
create sequence seq_Person
minvalue 1
start with ?1
increment by 1
cache ?10
上面的代碼創建名為seq_person 的序列對象 它以1起始,1遞增,且該對象緩存10個值以提高性能。chche 選項規定了為了提高訪問速度要存儲多少個序列值。
要在Person表中插入新紀錄,我們必須使用nextval函數(該函數從seq_Person序列中取回下一個值)
insert ?into Person ?(P_Id,FirstName,LastName)
values(seq_Person.nextval,'Lars','Monsen')
上面的SQL語句會在Person表中插入一條新紀錄,P_Id的賦值是來自seq_Person序列的下一個數字FirstName會被設置為Lars,LastName會被設置為Monsen
6.SQL View?
視圖是基于SQL結果集的可視化的表。
視圖包含行和列,就像一個真實的表,視圖中得字段就是來自一個或者多個數據庫中真是的表中的字段,我們可以向視圖中添加SQL函數、WHERE以及join語句。我們可以提交數據,就像這些來自于某個單一的表。
注意 數據庫中得設計和結構不會受到視圖中的函數、where或者join語句的影響。
SQL ?create view的語法
create view ?view_name ?As ?select column_name(s) from ?table_name where condition
注意 視圖總是顯示最近的數據。每當用戶查詢視圖時,數據庫引擎通過使用 SQL 語句來重建數據
實例 :
可以從某個查詢內部。某個存儲過程。或者從另一個視圖內部來使用視圖,可以通過向視圖中添加函數、join等等,我們可以向用戶精確的提交我們希望提交的數據。
樣本數據庫northwind擁有一些被默認安裝的視圖。視圖current product list會從products表列出所有正在使用的產品。這個視圖使用下列SQL創建
create view [current ?product List] ?as SELECT productID,ProductName From Products where Discontinued=No
我們可以查詢這個視圖
SELECT *FROM [current product List]
northwind 樣本數據庫中得另一個視圖會選取Products表中所有單位價格高于平均價格的產品
create view [products ?above average ?Price] ?as SELECTProductName UnitPrice From Products where UnitPrice>(SELECT AVG(unitPrice)FROM products)
我們可以向這樣查詢上面這個視圖
SELECT *FROM [product above ?average Price]
另一個來自northwind數據庫的視圖實例計算在1997年每個種類的銷售總數,注意這個視圖會從另一個名為Product Sales for 1997 的視圖那里選取數據
create TABLE ?[category ?Sales for 1997 ] as SELECT distinct categoryName,Sum(Productsales)As CategorySales from ?[Product Sales for 1997] group BY CategoryName
我們可以像這樣查詢上面這個視圖
SELECT *FROM [Category Sales For 1997]?
我們也可以查詢添加條件 現在我們需要查詢“Beverage”類的全部銷量
SELECT *FROM [Category Sales For 1997] ?where CategoryName=‘Beverages’
SQL 更新視圖
SQL create or replace view syntax?
create or replace view view_name as SELECT column_name From table_name where condition
現在我們希望向current product List 視圖中添加category列
create view [current product List] as SELECT productId,ProductName,category FROM Product where discontinued=no
SQL撤銷視圖
SQL ?DROP ?view syntax DROP view ?view_name
7. SQL Date 函數
當我們處理日期時,最難得任務恐怕是確保插入的日期的格式,與數據庫中日期列的格式相匹配,只要數據包含的時日期部分,運行查詢就不會出問題,但是如果涉及到時間,就復雜了
Mysql Date函數
函數 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?描述
NOW() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回當前日期和時間
CURDATE() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回當前的日期
CURTIME() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回當前時間
DATE() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 提取日期或日期/時間表達式中的日期部分
EXTRACT() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回日期/時間按的單獨部分
DATE_ADD() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?給日期添加指定的時間間隔
DATE_SUB() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?從日期減去指定的時間間隔
DATEDIFF() ?? 返回兩個日期之間的天數
DATE_FORMAT()? 用不同的格式顯示日期/時間
SQL Server Date函數
GETDATE () ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回當前日期和時間
DATEPART() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回日期/時間的單獨部分
DATEADD () ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在日期中添加或者減去指定的時間間隔
DATEDIFF() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回兩個日期之間的時間
CONVERT() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用不同的格式顯示日期和時間
SQL DATE的數據類型
MySQL
DATE ?YYYY--MM-DD
DATETIME ? YYYY-MM-DD HH:MM:SS
TIMESTAMP ?YYYY-MM-DD ?HH:MM:SS
YEAR ? ?YYYY
SQL Server
DATE ?YYYY--MM-DD
DATETIME ? YYYY-MM-DD HH:MM:SS
SMALLDATETIME ?YYYY-MM-DD ?HH:MM:SS
TIMESTAMP ? ? 唯一的數字
SQL 日期處理
若不涉及時間部分,則可以輕松的比較兩個日期
看下面的Order表
?OrderId ? ? ?ProductName ? ? ? ? ? ? ?OrderDate
? ?1 ? ? ? ? ? ? computer ?? 2008-12-26
? ?2 ? ? ? ? ? ? printer ? ? ? 2008-12-26
? 3 ?electrograph2008-11-12
? ?4 ? ? ? ? ? tellephone 2008-10-18
我們希望選取OrderDate為2008-12-26的記錄
SELECT *from Order where ?OrderName=‘2008-12-26’
結果為?OrderId ? ? ?ProductName ? ? ? ? ? ? ?OrderDate
? ?1 ? ? ? ? ? ? computer ?? 2008-12-26
? ?2 ? ? ? ? ? ? printer ? ? ? 2008-12-26
??
現在假設Order為下表
?OrderId ? ? ?ProductName ? ? ? ? ? ? ?OrderDate
? ?1 ? ? ? ? ? ? computer ?? 2008-12-26 ?16:23:55
? ?2 ? ? ? ? ? ? printer ? ? ? 2008-12-26 ?12:34:22
? 3 ?electrograph2008-11-12 ?14:12:08
? ?4 ? ? ? ? ? tellephone 2008-10-18 ?11:55:10
SELECT *from Order where ?OrderName=‘2008-12-26’
將查詢不到結果,這是由于改查詢不含有時間部分的日期
注意 ?如果希望查詢簡單且易維護,則請不要再日期中使用時間部分
8.SQL NULL
NULL值是遺漏的未知數據 ?默認的 表的列可以存放null值
如果表中的某個列是可選的,那么我們可以在不像該列添加值的情況下插入新紀錄或者更新已經有的記錄。這意味著該字段以null值保存
null值得處理方式與其他值不同
null用作未知的或者不適用的值得占位符。
注意 無法比較null和0,他們是不等價的。
SQL null值處理
Person表
Id ? ? ? ? ? ? ? ? LastName ? ? ? ? ? ? ? ? FirstName ? ? ? ? ? ? ? ?city ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? address
1 ? ? ? ? ? ? ? ? ? adamas ? ? ? ? ? ? ? ? ? ? ?john ? ? ? ? ? ? ? ? ? ? ? ?London ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
2 ? ? ? ? ? ? ? ? ? Bush ? ? ? ? ? ? ? ? ? ? ? ? ? Geodge ? ? ? ? ? ? ? ? ?New York ? ? ? ? ? ? ? ? ? ? ?fifth ?Avenue
3 ? ? ? ? ? ? ? ? Carter ? ? ? ? ? ? ? ? ? ? ? ? ? Thomas ? ? ? ? ? ? ? ? ?Beijing
假如 Person表中的Address列是可選的,這意味著如果在address列插入一條不帶值的記錄,address列會使用null值保存
無法使用比較運算符(< >,=,>等)來測試null值
我們必須使用is ?null和 is not null操作法
SQL ?Is NULL
我們如何僅僅選取在address列中帶有NULL值得記錄呢
則必須使用 Is NULL運算符
select ?LastName,FirstName,Address From Person where ?Address is NULL
結果集為
LastName ? ? ? ? ? ? ? ? ? ? ? FirstName ? ? ? ? ? ? ? ? ? Address
Adams ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?John
Carter ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Thomas
提示 請始終使用 is ?null 來查找null值
SQL is NOT null?
我們如何選取在address列中不帶有null值得記錄
我們必須使用使用 is not null 操作符
select ? LastName,FirstName,address from ?Persons ?where address ?is ?not ?null
9.SQL NULL 函數
SQL isnull ,NVL(),IFNULL,COALESCE函數
下面為Product表
P_Id ? ? ? ? ? ? ? ? ? ?ProductName ? ? ? ? ? ? ? ? ?UnitPrice ? ? ? ? ? ? ? ? ? ?UnitStock ? ? ? ? ? ? ?UnitOnOrder
1 ? ? ? ? ? ? ? ? ? ? ? ? computer ? ? ? ? ? ? ? ? ? ? ? ? ? ?699 ? ? ? ? ? ? ? ? ? ? ? ? ?25 ? ? ? ? ? ? ? ? ? ? ? ? ?14
2 ? ? ? ? ? ? ? ? ? ? ? ?printer ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?399 ? ? ? ? ? ? ? ? ? ? ? ? ?34 ? ? ? ? ? ? ? ? ? ? ??
3 ? ? ? ? ? ? ? ? ? ? ? ?telephone ? ? ? ? ? ? ? ? ? ? ? ? ? ?283 ? ? ? ? ? ? ? ? ? ? ? ? ?135 ? ? ? ? ? ? ? ? ? ? ? ? ?55
假如 UnitOnOrder 是可選的,而且可以包含NULL值
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)From Products
如果 UnitsOnOrder為Null,那么結果為NULL
微軟的isNull()函數用于規定如何處理Null值
NVL(),IFNULL(),和COALESCE(),函數也可以達到相同的效果
在這里,我們希望NULL值為0
下面,如果UnitsOnOrder 是Null,則不利于計算,因此如果值是Null則 isNUll返回0
SQL Server/ Ms Access
SELECT ProductName,UnitPrice*(UnitInStock+ISNull(UnitsOnOrder,0))
Oracle
Oracle沒有 isNull函數,但可以使用NVL()
SELECT ProductName,UnitPrice*(UnitInStock+NVL(UnitsOnOrder,0))
MysQL MySQL用IFNull()
SELECT ProductName,UnitPrice*(UnitInStock+IFNull(UnitsOnOrder,0))
或者可以使用 coalesce函數
SELECT ProductName,UnitPrice*(UnitInStock+Coalesce(UnitsOnOrder,0))
10.數據類型
Microsoft Access、MySQL 以及 SQL Server 所使用的數據類型和范圍。
Microsoft Access 數據類型
| Text | 用于文本或文本與數字的組合。最多 255 個字符。 | ? |
| Memo | Memo 用于更大數量的文本。最多存儲 65,536 個字符。 注釋:無法對 memo 字段進行排序。不過它們是可搜索的。 | ? |
| Byte | 允許 0 到 255 的數字。 | 1 字節 |
| Integer | 允許介于 -32,768 到 32,767 之間的數字。 | 2 字節 |
| Long | 允許介于 -2,147,483,648 與 2,147,483,647 之間的全部數字 | 4 字節 |
| Single | 單精度浮點。處理大多數小數。 | 4 字節 |
| Double | 雙精度浮點。處理大多數小數。 | 8 字節 |
| Currency | 用于貨幣。支持 15 位的元,外加 4 位小數。 提示:您可以選擇使用哪個國家的貨幣。 | 8 字節 |
| AutoNumber | AutoNumber 字段自動為每條記錄分配數字,通常從 1 開始。 | 4 字節 |
| Date/Time | 用于日期和時間 | 8 字節 |
| Yes/No | 邏輯字段,可以顯示為 Yes/No、True/False 或 On/Off。 在代碼中,使用常量 True 和 False (等價于 1 和 0) 注釋:Yes/No 字段中不允許 Null 值 | 1 比特 |
| Ole Object | 可以存儲圖片、音頻、視頻或其他 BLOBs (Binary Large OBjects) | 最多 1GB |
| Hyperlink | 包含指向其他文件的鏈接,包括網頁。 | ? |
| Lookup Wizard | 允許你創建一個可從下列列表中進行選擇的選項列表。 | 4 字節 |
MySQL 數據類型
在 MySQL 中,有三種主要的類型:文本、數字和日期/時間類型。
Text 類型:
| CHAR(size) | 保存固定長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的長度。最多 255 個字符。 |
| VARCHAR(size) | 保存可變長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的最大長度。最多 255 個字符。 注釋:如果值的長度大于 255,則被轉換為 TEXT 類型。 |
| TINYTEXT | 存放最大長度為 255 個字符的字符串。 |
| TEXT | 存放最大長度為 65,535 個字符的字符串。 |
| BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字節的數據。 |
| MEDIUMTEXT | 存放最大長度為 16,777,215 個字符的字符串。 |
| MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字節的數據。 |
| LONGTEXT | 存放最大長度為 4,294,967,295 個字符的字符串。 |
| LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字節的數據。 |
| ENUM(x,y,z,etc.) | 允許你輸入可能值的列表。可以在 ENUM 列表中列出最大 65535 個值。如果列表中不存在插入的值,則插入空值。 注釋:這些值是按照你輸入的順序存儲的。 可以按照此格式輸入可能的值:ENUM('X','Y','Z') |
| SET | 與 ENUM 類似,SET 最多只能包含 64 個列表項,不過 SET 可存儲一個以上的值。 |
Number 類型:
| TINYINT(size) | -128 到 127 常規。0 到 255 無符號*。在括號中規定最大位數。 |
| SMALLINT(size) | -32768 到 32767 常規。0 到 65535 無符號*。在括號中規定最大位數。 |
| MEDIUMINT(size) | -8388608 到 8388607 普通。0 to 16777215 無符號*。在括號中規定最大位數。 |
| INT(size) | -2147483648 到 2147483647 常規。0 到 4294967295 無符號*。在括號中規定最大位數。 |
| BIGINT(size) | -9223372036854775808 到 9223372036854775807 常規。0 到 18446744073709551615 無符號*。在括號中規定最大位數。 |
| FLOAT(size,d) | 帶有浮動小數點的小數字。在括號中規定最大位數。在 d 參數中規定小數點右側的最大位數。 |
| DOUBLE(size,d) | 帶有浮動小數點的大數字。在括號中規定最大位數。在 d 參數中規定小數點右側的最大位數。 |
| DECIMAL(size,d) | 作為字符串存儲的 DOUBLE 類型,允許固定的小數點。 |
* 這些整數類型擁有額外的選項 UNSIGNED。通常,整數可以是負數或正數。如果添加 UNSIGNED 屬性,那么范圍將從 0 開始,而不是某個負數。
Date 類型:
| DATE() | 日期。格式:YYYY-MM-DD 注釋:支持的范圍是從 '1000-01-01' 到 '9999-12-31' |
| DATETIME() | *日期和時間的組合。格式:YYYY-MM-DD HH:MM:SS 注釋:支持的范圍是從 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' |
| TIMESTAMP() | *時間戳。TIMESTAMP 值使用 Unix 紀元('1970-01-01 00:00:00' UTC) 至今的描述來存儲。格式:YYYY-MM-DD HH:MM:SS 注釋:支持的范圍是從 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC |
| TIME() | 時間。格式:HH:MM:SS 注釋:支持的范圍是從 '-838:59:59' 到 '838:59:59' |
| YEAR() | 2 位或 4 位格式的年。 注釋:4 位格式所允許的值:1901 到 2155。2 位格式所允許的值:70 到 69,表示從 1970 到 2069。 |
* 即便 DATETIME 和 TIMESTAMP 返回相同的格式,它們的工作方式很不同。在 INSERT 或 UPDATE 查詢中,TIMESTAMP 自動把自身設置為當前的日期和時間。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。
SQL Server 數據類型
Character 字符串:
| char(n) | 固定長度的字符串。最多 8,000 個字符。 | n |
| varchar(n) | 可變長度的字符串。最多 8,000 個字符。 | ? |
| varchar(max) | 可變長度的字符串。最多 1,073,741,824 個字符。 | ? |
| text | 可變長度的字符串。最多 2GB 字符數據。 | ? |
Unicode 字符串:
| nchar(n) | 固定長度的 Unicode 數據。最多 4,000 個字符。 | ? |
| nvarchar(n) | 可變長度的 Unicode 數據。最多 4,000 個字符。 | ? |
| nvarchar(max) | 可變長度的 Unicode 數據。最多 536,870,912 個字符。 | ? |
| ntext | 可變長度的 Unicode 數據。最多 2GB 字符數據。 | ? |
Binary 類型:
| bit | 允許 0、1 或 NULL | ? |
| binary(n) | 固定長度的二進制數據。最多 8,000 字節。 | ? |
| varbinary(n) | 可變長度的二進制數據。最多 8,000 字節。 | ? |
| varbinary(max) | 可變長度的二進制數據。最多 2GB 字節。 | ? |
| image | 可變長度的二進制數據。最多 2GB。 | ? |
Number 類型:
| tinyint | 允許從 0 到 255 的所有數字。 | 1 字節 |
| smallint | 允許從 -32,768 到 32,767 的所有數字。 | 2 字節 |
| int | 允許從 -2,147,483,648 到 2,147,483,647 的所有數字。 | 4 字節 |
| bigint | 允許介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之間的所有數字。 | 8 字節 |
| decimal(p,s) | 固定精度和比例的數字。允許從 -10^38 +1 到 10^38 -1 之間的數字。 p 參數指示可以存儲的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。默認是 18。 s 參數指示小數點右側存儲的最大位數。s 必須是 0 到 p 之間的值。默認是 0。 | 5-17 字節 |
| numeric(p,s) | 固定精度和比例的數字。允許從 -10^38 +1 到 10^38 -1 之間的數字。 p 參數指示可以存儲的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。默認是 18。 s 參數指示小數點右側存儲的最大位數。s 必須是 0 到 p 之間的值。默認是 0。 | 5-17 字節 |
| smallmoney | 介于 -214,748.3648 和 214,748.3647 之間的貨幣數據。 | 4 字節 |
| money | 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之間的貨幣數據。 | 8 字節 |
| float(n) | 從 -1.79E + 308 到 1.79E + 308 的浮動精度數字數據。 參數 n 指示該字段保存 4 字節還是 8 字節。float(24) 保存 4 字節,而 float(53) 保存 8 字節。n 的默認值是 53。 | 4 或 8 字節 |
| real | 從 -3.40E + 38 到 3.40E + 38 的浮動精度數字數據。 | 4 字節 |
Date 類型:
| datetime | 從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 3.33 毫秒。 | 8 bytes |
| datetime2 | 從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 100 納秒。 | 6-8 bytes |
| smalldatetime | 從 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度為 1 分鐘。 | 4 bytes |
| date | 僅存儲日期。從 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 | 3 bytes |
| time | 僅存儲時間。精度為 100 納秒。 | 3-5 bytes |
| datetimeoffset | 與 datetime2 相同,外加時區偏移。 | 8-10 bytes |
| timestamp | 存儲唯一的數字,每當創建或修改某行時,該數字會更新。timestamp 基于內部時鐘,不對應真實時間。每個表只能有一個 timestamp 變量。 | ? |
其他數據類型:
| sql_variant | 存儲最多 8,000 字節不同數據類型的數據,除了 text、ntext 以及 timestamp。 |
| uniqueidentifier | 存儲全局標識符 (GUID)。 |
| xml | 存儲 XML 格式化數據。最多 2GB。 |
| cursor | 存儲對用于數據庫操作的指針的引用。 |
| table | 存儲結果集,供稍后處理。 |
11.SQL服務器 RDBMS DBMS(Database Management System)數據庫管理系統 其為可以訪問數據庫中數據的計算機程序,是我們有能力在數據庫中提取,修改或者存貯信息。 不同的DBMS提供不同的函數供查詢,提交以及修改數據 RDBMS( Relational ?Database Management System)關系數據庫管理系統 也是數據庫管理系統,其數據庫是根據數據間的關系組織和訪問數據的。
總結
以上是生活随笔為你收集整理的数据库高级教程(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html div 边框只显示右侧,div
- 下一篇: 赛元单片机 keil 插件安装失败解决方