1. 程式人生 > >SQL Server基礎知識1

SQL Server基礎知識1

一、SQL Server 2000常見的版本  
企業版(Enterprise Edition)
標準版(Standard Edition)
個人版(Personal Edition)
開發者版(Developer Edition)

二、SQL Server 系統資料庫簡介 
SQL Server 2000有4個系統資料庫 
1. Master資料庫是SQL Server系統最重要的資料庫,它記錄了SQL Server系統的所有系統資訊。這些系統資訊包括所有的登入資訊、系統設定資訊、SQL Server的初始化資訊和其它系統資料庫及使用者資料庫的相關資訊。 
2. Model資料庫是所有使用者資料庫和Tempdb資料庫的模板資料庫,它含有Master資料庫所有系統表的子集,這些系統資料庫是每個使用者定義資料庫需要的。 
3. Msdb

資料庫是代理服務資料庫,為其警報、任務排程和記錄操作員的操作提供儲存空間。 
4. Tempdb是一個臨時資料庫,它為所有的臨時表、臨時儲存過程及其它臨時操作提供儲存空間。

三、SQL Server 系統表簡介 
1. Sysobjects表

   SQL Server 的主系統表sysobjects出現在每個資料庫中,它對每個資料庫物件含有一行記錄。
   如:檢查mydb資料庫是否存在student表
  use mydb
   select * from sysobjects where name='student' --表列舉的系統表

2. Syscolumns表
   系統表syscolumns出現在master資料庫和每個使用者自定義的資料庫中,它對基表或者檢視的每個列和儲存過程中的每個引數含有一行記錄。
   如:列出student表中的所有的欄位資訊
  select * from syscolumns where id=object_id('student') --列列舉的系統表

  --name欄位:列名
   --id欄位:所屬的表代號
   --xusertype欄位:外來鍵,對應systypes表的xusertype欄位,該列的型別
   --length欄位:列的長度
   --colorder欄位:欄位的顯示順序
   --isnullable欄位:是否允許為空 0-不允許 1-允許
  
3. Sysdatabases表
   系統表sysdatabases對SQL Server 系統上的每個系統資料庫和使用者自定義的資料庫含有一行記錄,它只出現在master資料庫中。
   如:檢查資料庫中是否已存在mydb資料庫
  use master
   select * from sysdatabases where name='mydb' --資料庫列舉的系統表
4. systypes表
   儲存有SQLServer資料庫中所有的資料型別
   如:列出資料庫中所有的型別
  select * from systypes --型別列舉系統表
   --name欄位:型別名稱
   --xusertype欄位:型別代號
  
   --綜合示例:獲取SqlServer中表結構
  SELECT syscolumns.name,systypes.name,syscolumns.isnullable,
   syscolumns.length 
   FROM syscolumns, systypes 
   WHERE syscolumns.xusertype = systypes.xusertype
   AND syscolumns.id = object_id('student')

四、資料型別:
整數資料型別 INT SMALLINT TINYINT BIGINT
浮點資料型別 REAL FLOAT DECIMAL NUMERIC
二進位制資料型別 BINARY VARBINARY
邏輯資料型別 BIT
字元資料型別 CHAR NCHAR VARCHAR NVARCHAR
文字和圖形資料型別 TEXT NTEXT IMAGE
日期和時間資料型別 DATETIME SMALLDATETIME
貨幣資料型別 MONEY SMALLMONEY

五、完整性與約束
完整性分為:實體完整性與引用完整性
列屬性
  NULL-允許在插入資料時省略該列的值
  NOT NULL-不允許在插入資料時省略該列的值
  IDENTITY
    屬性可以使表的列包含系統自動生成的數字。IDENTITY 屬性適用於INT SMALLINT TINYINT DECIMAL列。
約束:在SQL Server 中有5 種約束
  主關鍵字約束Primary Key Constraint 
   外關鍵字約束Foreign Key Constraint 
   惟一性約束Unique Constraint 
   檢查約束CheckConstraint 
   預設約束Default Constraint
  
1.主關鍵字約束指定表的一列或幾列的組合的值在表中具有惟一性,每個表中只能有一列被指定為主關鍵字。
   IMAGE 和TEXT 型別的列不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性
   語法如下:
  CONSTRAINT constraint_name PRIMARY KEY [CLUSTERED | NONCLUSTERED] column_name1[, column_name2,…,column_name16
   如:
    create table products (
    p_id char(8) not null,
    p_name char(10) not null ,
    price money default 0.01 ,
    quantity smallint null ,
   constraint pk_p_id primary key (p_id, p_name)
    )


2.外關鍵字約束:外關鍵字約束定義了表之間的關係,確保表間的引用完整性。也可以設定主從表之間的級聯更新與級聯刪除
   不能使用一個定義為TEXT 或IMAGE 資料型別的列建立外關鍵字
   外關鍵字最多由16 個列組成
   語法如下
   CONSTRAINT constraint_name
   FOREIGN KEY (column_name1[, column_name2,…,column_name16])
   REFERENCES ref_table [( ref_column1)[,(ref_column2),…, (ref_column16)] ]
   [ ON DELETE { CASCADE | NO ACTION } ]
   [ ON UPDATE { CASCADE | NO ACTION } ] ]

   如:
   create table orders(
    order_id char(8),
    p_id char(8),
    p_name char(10) ,
   constraint pk_order_id primary key (order_id) ,
    foreign key(p_id, p_name) references products(p_id, p_name)
    )

3.惟一性約束:用以防止在列中輸入重複的值。惟一性約束指定的列可以有NULL 屬性,主關鍵字列不能再設定惟一性約束。
   語法如下
   CONSTRAINT constraint_name UNIQUE [CLUSTERED | NONCLUSTERED] column_name1[, column_name2,…,column_name16]
   如:
    create table employees (
    emp_id char(8),
    emp_name char(10) ,
    emp_cardid char(18),
   constraint pk_emp_id primary key (emp_id),
    constraint uk_emp_cardid unique (emp_cardid)
    )


4.檢查約束:檢查約束對輸入列或整個表中的值設定檢查條件,以限制輸入值保證資料庫的資料完整性。
語法如下
  CONSTRAINT constraint_name CHECK [NOT FOR REPLICATION] (logical_expression)
如:建立一個訂貨表其中定貨量必須不小於10
create table orders(
   order_id char(8),
   p_id char(8),
   p_name char(10) ,
   quantity smallint,
  constraint pk_order_id primary key (order_id),
   constraint chk_quantity check (quantity>=10) ,
   )

5.預設約束
   語法如下
   CONSTRAINT constraint_name DEFAULT constant_expression [FOR column_name]
六、常用函式
CEILING(numeric) 返回>=表示式的最小整數,返回的資料型別與表示式相同,可為INTEGER MONEY,REAL FLOAT 型別
FLOOR(numeric) 返回<=表示式的最小整數,返回的資料型別與表示式相同.可為INTEGER MONEYREAL FLOAT 型別
ROUND(integer) 返回以integer_expression 為精度的四捨五入值,返回的資料型別與表示式相同,可為INTEGER MONEY REAL FLOAT 型別
PI          返回值為即3.1415926535897936
RAND(integer)   用任選的[integer_expression]做種子值得出0-1 間的隨機浮點數
ASCII()函式返回最左端字元的ASCII碼值 ASCII(<character_expression>)
CHAR()函式用於將ASCII 碼轉換為字元 CHAR(<integer_expression>)
LOWER()函式把字串全部轉換為小寫   LOWER(<character _expression>)
UPPER()函式把字串全部轉換為大寫   UPPER(<character _expression>)
STR()函式把數值型資料轉換為字元型資料 STR(<float _expression>[ length[ <decimal>]])
LTRIM()函式把字串頭部的空格去掉 LTRIM(<character _expression>)
RTRIM()函式把字串尾部的空格去掉 RTRIM(<character _expression>)
LEFT()函式返回部分字串 LEFT(<character_expression> <integer_expression>)
RIGHT()函式返回部分字串 RIGHT(<character_expression> <integer_expression>)
SUBSTRING()函式返回部分字串 SUBSTRING(<expression> <starting_ position> length)
CHARINDEX()函式返回字串中某個指定的子串出現的開始位置 CHARINDEX <’substring_expression’> <expression>
REPLICATE()函式返回一個重複character_expression 指定次數的字串 REPLICATE(character_expression integer_expression)
REVERSE()函式將指定的字串的字元排列順序顛倒 REVERSE(<character_expression>)
REPLACE()函式返回被替換了指定子串的字串 REPLACE (<string_expression1> ,<string_expression2>, <string_expression3>)
SPACE()函式返回一個有指定長度的空白字串 SPACE(<integer_expression>)
CAST()函式語法如下 CAST(<expression> AS <data_ type>[ length ])
DAY() 返回date_expression 中的日期值 DAY(<date_expression>)
MONTH()返回date_expression 中的月份值 MONTH(<date_expression>)
YEAR()返回date_expression 中的年份值 YEAR(<date_expression>)
DATEADD 函式返回指定日期date 加上指定的額外日期間隔number 產生的新日期 DATEADD(<datepart>,<number>,<date>)
DATEDIFF()返回date2 超過date1的差距值,其結果值是一個帶有正負號的整數值 DATEDIFF(<datepart>,<date1>,<date2>)
DATEPART() 以整數值的形式返回日期的指定部分 DATEPART(<datepart>,<date>)
  DATEPART(dd,date)等同於DAY(date)
   DATEPART(mm,date)等同於MONTH(date)
   DATEPART(yy,date)等同於YEAR(date)
GETDATE()以DATETIME 的預設格式返回系統當前的日期和時間
ISDATE ()判斷所給定的表示式是否為合理日期,如果是則返回1,不是則返回0. ISDATE(<expression>)

七、Transact-SQL語言 
主要組成部分 
   資料定義語言(DDL,Data Definition Language)
   資料操縱語言(DML,Data Manipularion Language)
   資料控制語言(DCL,Data Control Language)
   系統儲存過程(System Stored Procedure)
   一些附加的語言元素
1.資料定義語言(DDL):資料定義語言是指用來定義和管理資料庫以及資料庫中的各種物件的語句。包括CREATE、ALTER和DROP等語句。
建立表:
    CREATE TABLE publishers
    (
      pub_id char(4) NOT NULL CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756') OR pub_id LIKE '99[0-9][0-9]'),
      pub_name varchar(40) NULL,
      city varchar(20) NULL,
      state char(2) NULL,
      country varchar(30) NULL DEFAULT('USA')
    )

修改表:
    A. 更改表以新增新列 
    ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL 
    B. 更改表以除去列 
     ALTER TABLE doc_exb DROP COLUMN column_b 
    C. 更改表以新增具有約束的列 
    ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL CONSTRAINT exb_unique UNIQUE 
    D.更改表以新增未驗證的約束 
    ALTER TABLE doc_exd WITH NOCHECK ADD CONSTRAINT exd_check CHECK (column_a > 1) 
    F. 新增具有預設值的可為空的列 
    ALTER TABLE MyTable ADD AddDate smalldatetime NULL CONSTRAINT AddDateDflt DEFAULT getdate() WITH VALUES 

綜合示例:
    建立一個定貨表再插入一個定貨商編號列
   create table orders
    (
    order_id char(8) ,
    p_id char(8) foreign key references products(p_id),
    order_quantity smallint check (order_quantity>=10),
    constraint pk_order_id primary key (order_id),
    )
    alter table orders add order_firm_id char(8) null 
    constraint fk_order_firm_id foreign key references order_firm(order_firm_id)
    更改上例中的檢查約束並刪除一個外關鍵字約束
   alter table orders add constraint chk_order_quantity check (order_quantity>=100)
    drop constraint chk_order_quantity
   
2.資料操縱語言:用來查詢、新增、修改和刪除資料庫中資料的語句,這些語句包括SELECT、INSERT、UPDATE、DELETE等。
  
  簡單查詢:
    選擇列
    a .用SELECT 子句來指定查詢所需的列多個列之間用逗號分開
   select p_id, p_name, cost from products
    b .可以使用符號* 來選取表的全部列
   select * from employee
    c. 在查詢結果中新增列
    查詢產品的編號、名稱、庫存數量和成本,並計算每種產品的總成本價值
   select p_id, p_name, quantity, cost, cost*quantity as sum_cost from products
   選擇行
    a .使用WHERE 子句
    使用者在查詢資料庫時,往往並不需要了解全部資訊,而只需要其中一部分滿足某些條件的資訊。在這種情況下,就需要在SELECT 語句中加入條件以選擇資料行這時就用到WHERE 子句。WHERE 子句中的條件是由表示式以及邏輯聯結詞AND、OR、NOT 等組成。
    如:查詢工資介於2000 元和3000 元之間的員工姓名
   select e_name
    from employee
    where e_wage between 2000 and 3000
    b .使用DICTINCT 關鍵字
    使用者在對資料庫進行查詢時,會出現重複結果,這時就需要使用DISTINCT 關鍵字消除重複部分。
    如:列出工資大於7000 的員工所屬的部門編號
   select distinct dept_id
    from employee
    where e_wage > 7000
    c .使用IN 關鍵字
    在使用WHERE 子句進行查詢時,若條件表示式中出現若干條件相同的情況,就會使表示式顯得冗長,不便於使用者使用,這時可用IN 關鍵字來簡化。
    查詢在編號為1001 和1002 的部門中工作的員工姓名
   select e_name
    from employee
    where dept_id in (’1001’,’1002’)
    d .使用萬用字元
    在WHERE 子句中可以使用謂詞LIKE 來進行字串的匹配檢查,其中將大量使用萬用字元
    如:查詢公司中所有姓王且全名為兩個字的員工的姓名所在部門編號
   select e_name, dept_id
    from employee
    where e_name like ’王__’
    % 任意多個字元
     _ 一個任意字元
     [] 其中的一個字元
     {^} 非其中的一個字元
  對查詢結果排序
    a .使用ORDER 子句
    當用戶要對查詢結果進行排序時,就需要在SELECT 語句中加入ORDER BY 子句。在ORDER BY 子句中可以使用一個或多個排序要求,其優先順序次序為從左到右。
    如:查詢工作級別為2 的員工姓名查詢結果按工資排序
   select e_name
    from employee
    where job_level = ’2’
    order by e_wage
     order by可以實現以多個欄位的排序,主排序欄位、次排序欄位......
    對查詢結果排序
    b .選取前幾行資料
    在SELECT 語句中使用TOP n 或TOP n PERCENT,來選取查詢結果的前n 行或前百分之n 的資料。此語句經常和ORDER 子句一起使用。
    如:查詢工資最高的三名員工的姓名和工資
   select top 3 e_name, e_wage
    from employee
    order by e_wage desc
    top n 查詢前n條資料
     top n percent 查詢前百份之n的資料
  統計函式
   AVG()函式返回有關列值的算術平均值此。函式只適用數值型的列。
   COUNT()函式返回與選擇表示式匹配的列中不為NULL 值的資料個數。
   MAX()函式返回某一列的最大值,此函式適用於數值型、字元型和日期型的列。
   MIN()函式返回某一列的最小值,此函式適用於數值型、字元型和日期型的列。
   SUM()函式用來返回諸如列值這樣的實體的總和。此函式只適用於數值型的列。
   
查詢結果分組
    a .使用GROUP 子句
    查詢各部門中的最高工資數額
   select dept_id, max(e_wage) as max_wage 
    /* 使用as 字元來指定統計列的名稱 */
    from employee
    group by dept_id
    b.使用HAVING 子句
    HAVING 子句用來選擇特殊的組,它將組的一些屬性與常數值進行比較,如果一個組滿足HAVING 子句中的邏輯表示式,它就可以包含在查詢結果中。
    如:查詢有多個員工的工資不低於6000 的部門編號
   select dept_id, count(*)
    from employee
    where e_wage >= 6000
    group by dept_id
    having count(*) > 1
     在select語句中where,group by,having子句和統計函式的執行次序如下:
    Where子句從資料來源中去掉不符合其搜尋條件的資料行;
     group by 子句蒐集資料行到各個組中;統計函式為各個組計算統計值;
     having子句去掉不符合其組搜尋條件的各組資料行。
  新增資料
   INSERT [INTO]
    { table_name| view_name}
    { [(column_list)]
    { VALUES ( { DEFAULT | NULL | expression }[,...n] )
    | derived_table
    | execute_statement } }
    | DEFAULT VALUES
    當插入varchar或text型別的資料時,其後的空格將被去掉,如果插入一個只含空格的字串,則會被認為插入了一個長度為0的字串。
   Identity列不能指定資料,在values列表中應跳過此列。
   DELETE語法:
   delete from 表名 [where 條件]
    如果省去了where子句則會刪掉表中的所有資料,但表的結構依然存在。
  TRUNCATE TABLE 命令
    如果要刪除表中的所有資料,那麼使用TRUNCATE TABLE 命令比用DELETE 命令快得多。因為DELETE 命令除了刪除資料外,還會對所刪除的資料在事務處理日誌中作記錄。而TRUNCATE TABLE只做刪除與表有關的所有資料頁的操作。
    命令語法如下:
   TRUNCATE TABLE table_name
  更新資料
   UPDATE
    { table_name | view_name}
    SET
    {column_name = {expression | DEFAULT | NULL}
    | @variable = expression
    | @variable = column = expression } [,...n]
    {{[FROM {<table_source>} [,...n] ]
    [WHERE <search_condition>] }

  
連線查詢
   可以用兩種方式來指定連線條件
   用WHERE 子句指定連線條件
    在FROM 子句中用JOIN 指定連線條件
   笛卡爾積:
   用WHERE 子句指定連線條件
   select distinct orders.p_id, p_name from orders, products where orders.p_id = products.p_id
   在FROM 子句中用JOIN 指定連線條件
   select distinct orders.order_id, p_name from orders join products on orders.p_id = products.p_id
   自連線查詢
  select a.emp_id, a.e_name, b.emp_id, b.e_name, a.hire_date from employee a join employee b on a.emp_id!=b.emp_id and a.hire_date = b.hire_date
   where a.e_name < b.e_name order by a.hire_date
  外部連線分為左外部連線和右外部連線
    主表在左邊則稱為左外部連線
    主表在右邊則稱為右外部連線
   select a.order_id, b.f_name,c.p_name from orders a left join firms b on a.firm_id = b.firm_id right join products c on c.p_id = a.p_id order by a.o_date
   
合併查詢
   合併查詢就是使用UNION 操作符,將來自不同查詢的資料組合起來,形成一個具有綜合資訊的查詢結果。
    UNION 操作會自動將重複的資料行剔除
    參加合併查詢的各子查詢的使用的表結構應該相同
    各子查詢中的資料數目和對應的資料型別都必須相同
巢狀查詢
   在一個SELECT 語句的WHERE 子句或HAVING 子句中巢狀另一個SELECT 語句的查詢,稱為巢狀查詢又稱子查詢。
  無關子查詢--外查詢和內查詢之間沒有任何邏輯上的聯絡
   相關子查詢--外查詢和內查詢彼此依賴 
  語法:
    SELECT <目標表達式1>[,… ] FROM <表或檢視名1>
    WHERE [表示式] 
    (SELECT <目標表達式2>[,…] FROM <表或檢視名2>)
    [GROUP BY <分組條件>
    HAVING [<表示式>比較運算子] 
    (SELECT <目標表達式2>[,… ] FROM <表或檢視名2> ])
   (車延祿)
   無關子查詢
   select f_name from firms where firm_id in (select firm_id from orders where orders.p_id = (select p_id from products where p_name = '光纖'))
   相關子查詢
   select p_name from products where exists (select p_id from orders where orders.p_id = products.p_id and orders.o_quantity > 7000)