技術 > sql
目錄
No. 1
  sql全稱是“結構化查詢語言(structured query language)”,最早的是ibm的聖約瑟研究實驗室為其關係數據庫管理係統system r開發的一種查詢語言,它的前身是square語言。sql語言結構簡潔,功能強大,簡單易學,所以自從ibm公司1981年推出以來,sql語言,得到了廣泛的應用。如今無論是像oracle ,sybase,informix,sql server這些大型的數據庫管理係統,還是像visual foxporo,powerbuilder這些微機上常用的數據庫開發係統,都支持sql語言作為查詢語言。
  sql是高級的非過程化編程語言,允許用戶在高層數據結構上工作。他不要求用戶指定對數據的存放方法,也不需要用戶瞭解具體的數據存放方式,所以具有完全不同底層結構的不同數據庫係統可以使用相同的sql語言作為數據輸入與管理的接口。它以記錄集合作為操縱對象,所有sql語句接受集合作為輸入,返回集合作為輸出,這種集合特性允許一條sql語句的輸出作為另一條sql語句的輸入,所以sql語言可以嵌套,這使他具有極大的靈活性和強大的功能,在多數情況下,在其他語言中需要一大段程序實現的一個單獨事件衹需要一個sql語句就可以達到目的,這也意味着用sql語言可以寫出非常復雜的語句。
  sql同時也是數據庫文件格式的擴展名。
  sql語言包含4個部分:
  數據查詢語言(_select_語句)
  數據操縱語言(insert, update, _delete_語句)
  數據定義語言(如create, drop等語句)
  數據控製語言(如commit, rollback等語句)
  取自"http://zh.wikipedia.org/wiki/sql"
  sql(structured query language)是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關聯式資料庫係統。美國國傢標準局(ansi)與國際標準化組織(iso)已經製定了 sql 標準。ansi 是一個美國工業和商業集團組織,發展美國的商務和通訊標準。ansi 同時也是 iso 和 international electrotechnical commission(iec)的成員之一。ansi 發佈與國際標準組織相應的美國標準。1992年,iso 和 iec 發佈了 sql 的國際標準,稱為 sql-92。ansi 隨之發佈的相應標準是 ansi sql-92。ansi sql-92 有時被稱為 ansi sql。儘管不同的關聯式資料庫使用的 sql 版本有一些差異,但大多數都遵循 ansi sql 標準。sql server 使用 ansi sql-92 的擴展集,稱為 t-sql,其遵循 ansi 製定的 sql-92 標準。
  sql 語言包括兩種主要程式設計語言類別的陳述式: 資料定義語言 (ddl)與資料操作語言 (dml)。下面我們將介紹這兩類語言。
  ddl
  
  ddl 用於定義和管理物件,例如資料庫、資料表以及檢視表( 第18章 將會解釋何謂檢視表)。ddl 陳述式通常包括每個物件的create、alter 以及 drop 命令。舉例來說,create table、alter table 以及 drop table 這些陳述式便可以用來建立新資料表、修改其屬性(如新增或刪除資料行)、刪除資料表等,下面我們會一一介紹。
  create table 陳述式
  
  使用 ddl 在 mydb 資料庫建立一個名為 customer_data 的範例資料表,本章後面的例子我們會使用到這個資料表。如前所述,create table 陳述式可以用來建立資料表。這個範例資料表被定義成四個資料行,如下所示:
  use mydb
  create table customer_data
  (customer_id smallint,
  first_name char(20),
  last_name char(20),
  phone char(10))
  go
  這個陳述式能産生 customer_data 資料表,這個資料表會一直是空的直到資料被填入資料表內。
  alter table 陳述式
  
  alter table 陳述式用來變更資料表的定義與屬性。在下面的例子中,我們利用 alter table 在已經存在的 customer_data 資料表中新增 middle_initial 資料行。
  alter table customer_data
  add middle_initial char(1)
  go
  現在資料表的定義包括了五個資料行,而不是之前的四個資料行。關於使用alter table 的更多細節,請參閱 第15章 。
  drop table 陳述式
  
  drop table 陳述式用來刪除資料表定義以及所有的資料、索引、觸發程序、條件約束以及資料表的權限。要刪除我們的 customer_data 資料表,可利用下列命令:
  drop table customer_data
  go
  關於 drop table 陳述式的詳細內容,請參閱 第15章 。
  dml
  
  dml 利用 insert、_select_、update 及 _delete_ 等陳述式來操作資料庫物件所包含的資料。
  insert 陳述式
  
  insert 陳述式用來在資料表或檢視表中插入一列資料。例如,如果要在customer_data 資料表中新增一個客戶,可使用類似以下的 insert 陳述式:
  insert into customer_data
  (customer_id, first_name, last_name, phone)
  values (777, "frankie", "stein", "4895873900")
  請註意 sql 陳述式中第二行的資料行名稱清單,清單上資料行名稱的次序决定了資料數值將被放在哪個資料行。舉例來說,第一個資料數值將被放在清單列出的第一個資料行 customer_id、第二個資料數值放在第二個資料行,依此類推。由於我們在建立資料表時,定義資料資料行填入數值的次序與現在相同,因此我們不必特意指定欄位名稱。我們可以用以下的 insert 陳述式代替:
  insert into customer_data
  values (777, "frankie", "stein", "4895873900")
  註意
  如果使用這種形式的 insert 陳述式,但被插入的數值次序上與建立資料表時不同,數值將被放入錯誤的資料行。如果資料的型別與定義不符,則會收到一個錯誤訊息。
  --------------------------------------------------------------------------------
  _select_ 陳述式
  
  _select_ 陳述式用來檢索資料表中的資料,而哪些資料被檢索由列出的資料行與陳述式中的 where 子句决定。例如,要從之前建立的 customer_data 資料表中檢索 customer_id 以及 first_name 資料行的資料,並且衹想取出每列中 first_name 資料行值為 frankie 的資料,那黱可以利用以下的 _select_ 陳述式:
  _select_ customer_id, first_name from customer_data
  where first_name = "frankie"
  如果有一列符合 _select_ 陳述式中的標準,則結果將顯示如下:
  customer_id first_name
  ------------- ------------
  777 frankie
  update 陳述式
  
  update 陳述式用來更新或改變一列或多列中的值。例如,一位名稱為 frankie stein 的客戶想要在記錄中改變他的姓氏為 franklin,可使用以下 update 陳述式:
  update customer_data
  set first_name = "franklin"
  where last_name = "stein" and customer_id= 777
  我們在 where 子句中加入 customer_id 的項目來確定其他名稱為 stein 的客戶不會被影響-衹有customer_id為777的客戶,姓氏會有所改變。
  --------------------------------------------------------------------------------
  說明
  當您使用 update 陳述式時,要確定在 where 子句提供充分的篩選條件,如此纔不會不經意地改變了一些不該改變的資料。
  --------------------------------------------------------------------------------
  _delete_ 陳述式
  
  _delete_ 陳述式用來刪除資料表中一列或多列的資料,您也可以刪除資料表中的所有資料列。要從 customer_data 資料表中刪除所有的列,您可以利用下列陳述式:
  _delete_ from customer_data
  或
  _delete_ customer_data
  資料表名稱前的 from 關鍵字在 _delete_ 陳述式中是選擇性的。除此之外,這兩個陳述式完全相同。
  要從 customer_data 資料表中刪除 customer_id 資料行的值小於100的列,可利用下列陳述式:
  _delete_ from customer_data
  where customer_id < 100
  現在我們已經快速瀏覽了 sql 提供的 ddl 與 dml 陳述式,接著,下面將介紹 t-sql
  sql中的五種數據類型
  簡要描述一下sql中的五種數據類型:字符型,文本型,數值型,邏輯型和日期型
  字符型
  varchar vs char
  varchar型和char型數據的這個差別是細微的,但是非常重要。他們都是用來儲存字符串長度小於255的字符。
  假如你嚮一個長度為四十個字符的varchar型字段中輸入數據bill gates。當你以後從這個字段中取出此數據時,你取出的數據其長度為十個字符——字符串bill gates的長度。 現在假如你把字符串輸入一個長度為四十個字符的char型字段中,那麽當你取出數據時,所取出的數據長度將是四十個字符。字符串的後面會被附加多餘的空格。
  當你建立自己的站點時,你會發現使用varchar型字段要比char型字段方便的多。使用varchar型字段時,你不需要為剪掉你數據中多餘的空格而操心。
  varchar型字段的另一個突出的好處是它可以比char型字段占用更少的內存和硬盤空間。當你的數據庫很大時,這種內存和磁盤空間的節省會變得非常重要
  文本型
  text
  使用文本型數據,你可以存放超過二十億個字符的字符串。當你需要存儲大串的字符時,應該使用文本型數據。
  註意文本型數據沒有長度,而上一節中所講的字符型數據是有長度的。一個文本型字段中的數據通常要麽為空,要麽很大。
  當你從html form的多行文本編輯框(textarea)中收集數據時,你應該把收集的信息存儲於文本型字段中。但是,無論何時,衹要你能避免使用文本型字段,你就應該不適用它。文本型字段既大且慢,濫用文本型字段會使服務器速度變慢。文本型字段還會吃掉大量的磁盤空間。
  一旦你嚮文本型字段中輸入了任何數據(甚至是空值),就會有2k的空間被自動分配給該數據。除非刪除該記錄,否則你無法收回這部分存儲空間。
  數值型
  sql支持許多種不同的數值型數據。你可以存儲整數 int 、小數 numeric、和錢數 money。
  int vs smallint vs tinyint
  他們的區別衹是字符長度:
  int型數據的表數範圍是從-2,147,483,647到2,147,483,647的整數
  smallint 型數據可以存儲從-32768到32768的整數
  tinyint 型的字段衹能存儲從0到255的整數,不能用來儲存負數
  通常,為了節省空間,應該盡可能的使用最小的整型數據。一個tinyint型數據衹占用一個字節;一個int型數據占用四個字節。這看起來似乎差別不大,但是在比較大的表中,字節數的增長是很快的。另一方面,一旦你已經創建了一個字段,要修改它是很睏難的。因此,為安全起見,你應該預測以下,一個字段所需要存儲的數值最大有可能是多大,然後選擇適當的數據類型。
  numeric
  為了能對字段所存放的數據有更多的控製,你可以使用numeric型數據來同時表示一個數的整數部分和小數部分。numeric型數據使你能表示非常大的數——比int型數據要大得多。一個numeric型字段可以存儲從-1038到1038範圍內的數。numeric型數據還使你能表示有小數部分的數。例如,你可以在numeric型字段中存儲小數3.14。
  當定義一個numeric型字段時,你需要同時指定整數部分的大小和小數部分的大小。如:muneric(23,0)
  一個 numeric型數據的整數部分最大衹能有28位,小數部分的位數必須小於或等於整數部分的位數,小數部分可以是零。
  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型數據,以節省空間。
  邏輯型
  bit
  如果你使用復選框( checkbox)從網頁中搜集信息,你可以把此信息存儲在bit型字段中。bit型字段衹能取兩個值:0或1。
  當心,在你創建好一個表之後,你不能嚮表中添加 bit型字段。如果你打算在一個表中包含bit型字段,你必須在創建表時完成。
  日期型
  datetime vs smalldatetime
  一個 datetime型的字段可以存儲的日期範圍是從1753年1月1日第一毫秒到9999年12月31日最後一毫秒。
  如果你不需要覆蓋這麽大範圍的日期和時間,你可以使用smalldatetime型數據。它與datetime型數據同樣使用,衹不過它能表示的日期和時間範圍比datetime型數據小,而且不如datetime型數據精確。一個smalldatetime型的字段能夠存儲從1900年1月1日到2079年6月6日的日期,它衹能精確到秒。
  datetime型字段在你輸入日期和時間之前並不包含實際的數據,認識這一點是重要的。
簡介
  sql全稱是“結構化查詢語言(Structured Query Language)”
  sql(Structured Query Language)是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數據庫係統。
  sql同時也是數據庫腳本文件的擴展名。
  sql是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶瞭解具體的數據存放方式,所以具有完全不同底層結構的不同數據庫係統可以使用相同的sql語言作為數據輸入與管理的接口。它以記錄集合作為操作對象,所有sql語句接受集合作為輸入,返回集合作為輸出,這種集合特性允許一條sql語句的輸出作為另一條sql語句的輸入,所以sql語句可以嵌套,這使他具有極大的靈活性和強大的功能,在多數情況下,在其他語言中需要一大段程序實現的功能衹需要一個sql語句就可以達到目的,這也意味着用sql語言可以寫出非常復雜的語句。
  結構化查詢語言(Structured Query Language)最早是IBM的聖約瑟研究實驗室為其關係數據庫管理係統SYSTEM R開發的一種查詢語言,它的前身是SQUARE語言。sql語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,sql語言得到了廣泛的應用。如今無論是像Oracle、Sybase、Informix、sql Server這些大型的數據庫管理係統,還是像Visual Foxporo、PowerBuilder這些PC上常用的數據庫開發係統,都支持sql語言作為查詢語言。
  美國國傢標準局(ANSI)與國際標準化組織(ISO)已經製定了sql標準。ANSI是一個美國工業和商業集團組織,負責開發美國的商務和通訊標準。ANSI同時也是ISO和International Electrotechnical Commission(IEC)的成員之一。ANSI 發佈與國際標準組織相應的美國標準。1992年,ISO和IEC發佈了sql國際標準,稱為sql-92。ANSI隨之發佈的相應標準是ANSI sql-92。ANSI sql-92有時被稱為ANSI sql。儘管不同的關係數據庫使用的sql版本有一些差異,但大多數都遵循 ANSI sql 標準。sql Server使用ANSI sql-92的擴展集,稱為T-sql,其遵循ANSI製定的 sql-92標準。
  sql語言包含4個部分:
  ※ 數據定義語言(DDL),例如:CREATE、DROP、ALTER等語句。
  ※ 數據操作語言(DML),例如:INSERT、UPDATE、DELETE語句。
  ※ 數據查詢語言(DQL),例如:SELECT語句。
  ※ 數據控製語言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等語句。
  sql語言包括三種主要程序設計語言類別的陳述式:數據定義語言(DDL),數據操作語言(DML)及數據控製語言(DCL)。
SQL發展歷史
  1970: E.J. Codd 發表了關係數據庫理論(relational database theory);
  1974-79: IBM 以Codd的理論為基礎開發了“Sequel”,並重命名為"sql";
  1979: Oracle 發佈了商業版sql
  1981-84: 出現了其他商業版本,分別來自 IBM(DB2),Data General(DG/sql),Relational Technology(INGRES);
  sql/86:ANSI 跟 ISO的第一個標準;
  sql/89:增加了引用完整性(referential integrity);
  sql/92(aka sql2):被數據庫管理係統(DBMS)生産商廣發接受;
  1997+:成為動態網站(Dynamic web content)的後臺支持;
  sql/99:Core level跟其他8種相應的level,包括遞歸查詢,程序跟流程控製,基本的對象(object)支持包括oids;
  sql/2003:包含了XML相關內容,自動生成列值(column values);
  2005-09-30:“Data is the next generation inside...sql is the new HTML”! Tim O'eilly提出了Web 2.0理念,稱數據將是核心,sql將成為“新的
  HTML";
  sql/2006:定義了sql與XML(包含XQuery)的關聯應用;
  2006:Sun公司將以sql基礎的數據庫管理係統嵌入Java V6
DDL
  DDL 用於定義和管理物件,例如資料庫、資料表以及檢視表( 第18章 將會解釋何謂檢視表)。DDL 陳述式通常包括每個物件的CREATE、ALTER 以及 DROP 命令。舉例來說,CREATE TABLE、ALTER TABLE 以及 DROP TABLE 這些陳述式便可以用來建立新資料表、修改其屬性(如新增或刪除資料行)、刪除資料表等,下面我們會一一介紹。
  CREATE TABLE 陳述式
  使用 DDL 在 MyDB 資料庫建立一個名為 Customer_Data 的範例資料表,本章後面的例子我們會使用到這個資料表。如前所述,CREATE TABLE 陳述式可以用來建立資料表。這個範例資料表被定義成四個資料行,如下所示:
  Use MyDB
  CREATE TABLE Customer_Data
  (customer_id smallint,
  first_name char(20),
  last_name char(20),
  phone char(10))
  GO
  這個陳述式能産生 Customer_Data 資料表,這個資料表會一直是空的直到資料被填入資料表內。
  ALTER TABLE 陳述式
  ALTER TABLE 陳述式用來變更資料表的定義與屬性。在下面的例子中,我們利用 ALTER TABLE 在已經存在的 Customer_Data 資料表中新增 middle_initial 資料行。
  ALTER TABLE Customer_Data
  ADD middle_initial char(1)
  GO
  DROP TABLE 陳述式
  DROP TABLE 陳述式用來刪除資料表定義以及所有的資料、索引、觸發程序、條件約束以及資料表的權限。要刪除我們的 Customer_Data 資料表,可利用下列命令:
  DROP TABLE Customer_Data
  GO
DML
  DML 利用 INSERT、SELECT、UPDATE 及 DELETE 等陳述式來操作資料庫物件所包含的資料。
  INSERT 陳述式
  
  INSERT 陳述式用來在資料表或檢視表中插入一列資料。例如,如果要在Customer_Data 資料表中新增一個客戶,可使用類似以下的 INSERT 陳述式:
  INSERT INTO Customer_Data
  (customer_id, first_name, last_name, phone)
  VALUES (777, 'Frankie', 'Stein', '4895873900')
  請註意 sql 陳述式中第二行的資料行名稱清單,清單上資料行名稱的次序决定了資料數值將被放在哪個資料行。舉例來說,第一個資料數值將被放在清單列出的第一個資料行 customer_id、第二個資料數值放在第二個資料行,依此類推。由於我們在建立資料表時,定義資料資料行填入數值的次序與現在相同,因此我們不必特意指定欄位名稱。我們可以用以下的 INSERT 陳述式代替:
  INSERT INTO Customer_Data
  VALUES (777, 'Frankie', 'Stein', '4895873900')
  註意
  如果使用這種形式的 INSERT 陳述式,但被插入的數值次序上與建立資料表時不同,數值將被放入錯誤的資料行。如果資料的型別與定義不符,則會收到一個錯誤訊息。
  UPDATE 陳述式
  UPDATE 陳述式用來更新或改變一列或多列中的值。例如,一位名稱為 Frankie Stein 的客戶想要在記錄中改變他的姓氏為 Franklin,可使用以下 UPDATE 陳述式:
  UPDATE Customer_Data
  SET first_name = "Franklin"
  WHERE last_name = "Stein" and customer_id= 777
  我們在 WHERE 子句中加入 customer_id 的項目來確定其他名稱為 Stein 的客戶不會被影響-衹有customer_id為777的客戶,姓氏會有所改變。
  --------------------------------------------------------------------------------
  說明
  當您使用 UPDATE 陳述式時,要確定在 WHERE 子句提供充分的篩選條件,如此纔不會不經意地改變了一些不該改變的資料。
  --------------------------------------------------------------------------------
  DELETE 陳述式
  DELETE 陳述式用來刪除資料表中一列或多列的資料,您也可以刪除資料表中的所有資料列。要從 Customer_Data 資料表中刪除所有的列,您可以利用下列陳述式:
  DELETE FROM Customer_Data
  或
  DELETE Customer_Data
  資料表名稱前的 FROM 關鍵字在 DELETE 陳述式中是選擇性的。除此之外,這兩個陳述式完全相同。
  要從 Customer_Data 資料表中刪除 customer_id 資料行的值小於100的列,可利用下列陳述式:
  DELETE FROM Customer_Data
  WHERE customer_id < 100
  現在我們已經快速瀏覽了 sql 提供的 DDL 與 DML 陳述式,接著,下面將介紹 T-sql
DCL
  DCL是用來管理數據庫的語言。包含管理權限及數據更改。
  --------------------------------------------------------------------------------
SELECT 陳述式
  SELECT 陳述式用來檢索資料表中的資料,而哪些資料被檢索由列出的資料行與陳述式中的 WHERE 子句决定。例如,要從之前建立的 Customer_Data 資料表中檢索 customer_id 以及 first_name 資料行的資料,並且衹想取出每列中 first_name 資料行值為 Frankie 的資料,那麼可以利用以下的 SELECT 陳述式:
  SELECT customer_id, first_name FROM Customer_Data
  WHERE first_name = "Frankie"
  如果有一列符合 SELECT 陳述式中的標準,則結果將顯示如下:
  customer_id first_name
  ------------- ------------
  777 Frankie
SQL中的五種數據類型
  簡要描述一下sql中的五種數據類型:字符型,文本型,數值型,邏輯型和日期型
  字符型
  VARCHAR VS CHAR
  VARCHAR型和CHAR型數據的這個差別是細微的,但是非常重要。他們都是用來儲存字符串長度小於255的字符。
  假如你嚮一個長度為四十個字符的VARCHAR型字段中輸入數據BIll GAtES。當你以後從這個字段中取出此數據時,你取出的數據其長度為十個字符——字符串Bill Gates的長度。 現在假如你把字符串輸入一個長度為四十個字符的CHAR型字段中,那麽當你取出數據時,所取出的數據長度將是四十個字符。字符串的後面會被附加多餘的空格。
  當你建立自己的站點時,你會發現使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段時,你不需要為剪掉你數據中多餘的空格而操心。
  VARCHAR型字段的另一個突出的好處是它可以比CHAR型字段占用更少的內存和硬盤空間。當你的數據庫很大時,這種內存和磁盤空間的節省會變得非常重要
  但是VARCHAR型字段在讀取得效率上卻比不上CHAR,對於已經限定字符長度的字段來說用char則優於varchar,因為可以獲得更快得讀取速度。例如日期字段固定格式為yyyy-MM-dd型得字段,固定長度是10了,那麽用CHAR則讀取速度會更快。
  文本型
  TEXT
  使用文本型數據,你可以存放超過二十億個字符的字符串。當你需要存儲大串的字符時,應該使用文本型數據。
  註意文本型數據沒有長度,而上一節中所講的字符型數據是有長度的。一個文本型字段中的數據通常要麽為空,要麽很大。
  當你從HTML fORM的多行文本編輯框(TEXTAREA)中收集數據時,你應該把收集的信息存儲於文本型字段中。但是,無論何時,衹要你能避免使用文本型字段,你就應該不適用它。文本型字段既大且慢,濫用文本型字段會使服務器速度變慢。文本型字段還會吃掉大量的磁盤空間。
  一旦你嚮文本型字段中輸入了任何數據(甚至是空值),就會有2K的空間被自動分配給該數據。除非刪除該記錄,否則你無法收回這部分存儲空間。
  數值型
  sql支持許多種不同的數值型數據。你可以存儲整數 INT 、小數 NUMERIC、和錢數 MONEY。
  INT VS SMALLINT VS TINYINT
  他們的區別衹是字符長度:
  INT型數據的表數範圍是從-2,147,483,647到2,147,483,647的整數
  SMALLINT 型數據可以存儲從-32768到32768的整數
  TINYINT 型的字段衹能存儲從0到255的整數,不能用來儲存負數
  通常,為了節省空間,應該盡可能的使用最小的整型數據。一個TINYINT型數據衹占用一個字節;一個INT型數據占用四個字節。這看起來似乎差別不大,但是在比較大的表中,字節數的增長是很快的。另一方面,一旦你已經創建了一個字段,要修改它是很睏難的。因此,為安全起見,你應該預測以下,一個字段所需要存儲的數值最大有可能是多大,然後選擇適當的數據類型。
  NUMERIC
  為了能對字段所存放的數據有更多的控製,你可以使用NUMERIC型數據來同時表示一個數的整數部分和小數部分。NUMERIC型數據使你能表示非常大的數——比INT型數據要大得多。一個NUMERIC型字段可以存儲從-1038到1038範圍內的數。NUMERIC型數據還使你能表示有小數部分的數。例如,你可以在NUMERIC型字段中存儲小數3.14。
  當定義一個NUMERIC型字段時,你需要同時指定整數部分的大小和小數部分的大小。如:MUNERIC(23,0)
  一個 NUMERIC型數據的整數部分最大衹能有28位,小數部分的位數必須小於或等於整數部分的位數,小數部分可以是零。
  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型數據,以節省空間。
  邏輯型
  BIT
  如果你使用復選框( CHECKBOX)從網頁中搜集信息,你可以把此信息存儲在BIT型字段中。BIT型字段衹能取兩個值:0或1。
  當心,在你創建好一個表之後,你不能嚮表中添加 BIT型字段。如果你打算在一個表中包含BIT型字段,你必須在創建表時完成。
  日期型
  DATETIME VS SMALLDATETIME
  一個 DATETIME型的字段可以存儲的日期範圍是從1753年1月1日第一毫秒到9999年12月31日最後一毫秒。
  如果你不需要覆蓋這麽大範圍的日期和時間,你可以使用SMALLDATETIME型數據。它與DATETIME型數據同樣使用,衹不過它能表示的日期和時間範圍比DATETIME型數據小,而且不如DATETIME型數據精確。一個SMALLDATETIME型的字段能夠存儲從1900年1月1日到2079年6月6日的日期,它衹能精確到秒。
  DATETIME型字段在你輸入日期和時間之前並不包含實際的數據,認識這一點是重要的。
安全問題
  由於 sql 指令在部份進階使用時,語法會依照特定條件來變換,而且若是表格中的字段過多時,許多開發人員都會習慣以字串組立的方式建立 sql 指令,而且又使用係統管理員級的帳戶連到數據庫,因此讓黑客有機會利用 sql 的組立方式進行攻擊,像是在指令中添加部份刺探性或破壞性的指令 (例如 DROP TABLE、DROP DATABASE 或是 DELETE * FROM myTable 等具破壞性的指令),讓數據庫的資料或實體服務器被破壞,導致服務中斷或是係統癱瘓等後果,此種攻擊手法稱為sql Injection。目前實務上較有效的防禦方法,就是全面改用參數化查詢,或是檢查輸入資料,過濾掉可能的危險指令或資料來防範。
sql查詢語句精華使用簡要
  簡單的Transact-sql查詢衹包括選擇列表、FROM子句和WHERE子句。它們分別說明所查詢列、查詢的表或視圖、以及搜索條件等。
  例如,下面的語句查詢testtable表中姓名為“張三”的nickname字段和email字段。
  SELECT nickname,email
  FROM testtable
  WHERE name='張三'
  (一) 選擇列表
  選擇列表(select_list)指出所查詢列,它可以是一組列名列表、星號、表達式、變量(包括局部變量和全局變量)等構成。
  1、選擇所有列
  例如,下面語句顯示testtable表中所有列的數據:
  SELECT *
  FROM testtable
  2、選擇部分列並指定它們的顯示次序
  查詢結果集合中數據的排列順序與選擇列表中所指定的列名排列順序相同。
  例如:
  SELECT nickname,email
  FROM testtable
  3、更改列標題
  在選擇列表中,可重新指定列標題。定義格式為:
  列標題=列名
  列名 列標題
  如果指定的列標題不是標準的標識符格式時,應使用引號定界符,例如,下列語句使用漢字顯示列標題:
  SELECT 昵稱=nickname,電子郵件=email
  FROM testtable
  4、刪除重複行
  SELECT語句中使用ALL或DISTINCT選項來顯示表中符合條件的所有行或刪除其中重複的數據行,默認為ALL。使用DISTINCT選項時,對於所有重複的數據行在SELECT返回的結果集合中衹保留一行。
  5、限製返回的行數
  使用TOP n [PERCENT]選項限製返回的數據行數,TOP n說明返回n行,而TOP n PERCENT時,說明n是表示一百分數,指定返回的行數等於總行數的百分之幾。
  例如:
  SELECT TOP 2 *
  FROM testtable
  SELECT TOP 20 PERCENT *
  FROM testtable
  (二) FROM子句
  FROM子句指定SELECT語句查詢及與查詢相關的表或視圖。在FROM子句中最多可指定256個表或視圖,它們之間用逗號分隔。
  在FROM子句同時指定多個表或視圖時,如果選擇列表中存在同名列,這時應使用對象名限定這些列所屬的表或視圖。例如在usertable和citytable表中同時存在cityid列,在查詢兩個表中的cityid時應使用下面語句格式加以限定:
  SELECT username,citytable.cityid
  FROM usertable,citytable
  WHERE usertable.cityid=citytable.cityid
  在FROM子句中可用以下兩種格式為表或視圖指定別名:
  表名 as 別名
  表名 別名
  例如上面語句可用表的別名格式表示為:
  SELECT username,b.cityid
  FROM usertable a,citytable b
  WHERE a.cityid=b.cityid
  SELECT不僅能從表或視圖中檢索數據,它還能夠從其它查詢語句所返回的結果集合中查詢數據。
  例如:
  SELECT a.au_fname+a.au_lname
  FROM authors a,titleauthor ta
  (SELECT title_id,title
  FROM titles
  WHERE ytd_sales>10000
  ) AS t
  WHERE a.au_id=ta.au_id
  AND ta.title_id=t.title_id
  此例中,將SELECT返回的結果集合給予一別名t,然後再從中檢索數據。
  (三) 使用WHERE子句設置查詢條件
  WHERE子句設置查詢條件,過濾掉不需要的數據行。例如下面語句查詢年齡大於20的數據:
  SELECT *
  FROM usertable
  WHERE age>20
  WHERE子句可包括各種條件運算符:
  比較運算符(大小比較):>、>=、=、<、<=、<>、!>、!<
  範圍運算符(表達式值是否在指定的範圍):BETWEEN…AND…
  NOT BETWEEN…AND…
  列表運算符(判斷表達式是否為列表中的指定項):IN (項1,項2……)
  NOT IN (項1,項2……)
  模式匹配符(判斷值是否與指定的字符通配格式相符):LIKE、NOT LIKE
  空值判斷符(判斷表達式是否為空):IS NULL、NOT IS NULL
  邏輯運算符(用於多條件的邏輯連接):NOT、AND、OR
  1、範圍運算符例:age BETWEEN 10 AND 30相當於age>=10 AND age<=30
  2、列表運算符例:country IN ('Germany','China')
  3、模式匹配符例:常用於模糊查找,它判斷列值是否與指定的字符串格式相匹配。可用於char、varchar、text、ntext、datetime和smalldatetime等類型查詢。
  可使用以下通配字符:
  百分號%:可匹配任意類型和長度的字符,如果是中文,請使用兩個百分號即%%。
  下劃綫_:匹配單個任意字符,它常用來限製表達式的字符長度。
  方括號[]:指定一個字符、字符串或範圍,要求所匹配對象為它們中的任一個。[^]:其取值也[] 相同,但它要求所匹配對象為指定字符以外的任一個字符。
  例如:
  限製以Publishing結尾,使用LIKE '%Publishing'
  限製以A開頭:LIKE '[A]%'
  限製以A開頭外:LIKE '[^A]%'
  4、空值判斷符例WHERE age IS NULL
  5、邏輯運算符:優先級為NOT、AND、OR
  (四)查詢結果排序
  使用ORDER BY子句對查詢返回的結果按一列或多列排序。ORDER BY子句的語法格式為:
  ORDER BY {column_name [ASC|DESC]} [,…n]
  其中ASC表示升序,為默認值,DESC為降序。ORDER BY不能按ntext、text和image數據類型進行排序。
  例如:
  SELECT *
  FROM usertable
  ORDER BY age desc,userid ASC
  另外,可以根據表達式進行排序。
  二、 聯合查詢
  UNION運算符可以將兩個或兩個以上上SELECT語句的查詢結果集合合併成一個結果集合顯示,即執行聯合查詢。UNION的語法格式為:
  select_statement
  UNION [ALL] selectstatement
  [UNION [ALL] selectstatement][…n]
  其中selectstatement為待聯合的SELECT查詢語句。
  ALL選項表示將所有行合併到結果集合中。不指定該項時,被聯合查詢結果集合中的重複行將衹保留一行。
  聯合查詢時,查詢結果的列標題為第一個查詢語句的列標題。因此,要定義列標題必須在第一個查詢語句中定義。要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列標題或者列序號。
  在使用UNION 運算符時,應保證每個聯合查詢語句的選擇列表中有相同數量的表達式,並且每個查詢選擇表達式應具有相同的數據類型,或是可以自動將它們轉換為相同的數據類型。在自動轉換時,對於數值類型,係統將低精度的數據類型轉換為高精度的數據類型。
  在包括多個查詢的UNION語句中,其執行順序是自左至右,使用括號可以改變這一執行順序。例如:
  查詢1 UNION (查詢2 UNION 查詢3)
  三、連接查詢
  通過連接運算符可以實現多個表查詢。連接是關係數據庫模型的主要特點,也是它區別於其它類型數據庫管理係統的一個標志。
  在關係數據庫管理係統中,表建立時各數據之間的關係不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數據類型。為不同實體創建新的表,爾後通過連接進行查詢。
  連接可以在SELECT 語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時有助於將連接操作與WHERE子句中的搜索條件區分開來。所以,在Transact-sql中推薦使用這種方法。
  sql-92標準所定義的FROM子句的連接語法格式為:
  FROM join_table join_type join_table
  [ON (join_condition)]
  其中join_table指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表操作,對同一個表操作的連接又稱做自連接。
  join_type 指出連接類型,可分為三種:內連接、外連接和交叉連接。內連接(INNER JOIN)使用比較運算符進行表間某(些)列數據的比較操作,並列出這些表中與連接條件相匹配的數據行。根據所使用的比較方式不同,內連接又分為等值連接、自然連接和不等連接三種。外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內連接不同的是,外連接不衹列出與連接條件相匹配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。
  交叉連接(CROSS JOIN)沒有WHERE 子句,它返回連接表中所有數據行的笛卡爾積,其結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
  連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構成。
  無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接連接。例如:
  SELECT p1.pub_id,p2.pub_id,p1.pr_info
  FROM pub_info AS p1 INNER JOIN pub_info AS p2
  ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
  (一)內連接
  內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種:
  1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重複列。
  2、不等連接: 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
  3、自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重複列。
  例,下面使用等值連接列出authors和publishers表中位於同一城市的作者和出版社:
  SELECT *
  FROM authors AS a INNER JOIN publishers AS p
  ON a.city=p.city
  又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重複列(city和state):
  SELECT a.*,p.pub_id,p.pub_name,p.country
  FROM authors AS a INNER JOIN publishers AS p
  ON a.city=p.city
  (二)外連接
  內連接時,返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件的行。而采用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。如下面使用左外連接將論壇內容和作者信息連接起來:
  SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
  ON a.username=b.username
  下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:
  SELECT a.*,b.*
  FROM city as a FULL OUTER JOIN user as b
  ON a.username=b.username
  (三)交叉連接
  交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。例,titles表中有6類圖書,而publishers表中有8傢出版社,則下列交叉連接檢索到的記錄數將等於6*8=48行。
  SELECT type,pub_name
  FROM titles CROSS JOIN publishers
  ORDER BY type
  [Post=0][/Post]
相關詞
oracle數據庫照明百科辭典HID程序共用體Transact
空間技術Server查詢計算機互聯網縮寫圖書更多結果...