轉載請註明出處。
環境:MSSQL2000
環境:MSSQL2000
數據庫操作常用功能——無非三種:創建、察看(查找)、修改。
一、SQL的創建功能
包括對數據庫、表、索引、數據還有存儲過程觸發器的創建——create。
新建數據庫:
create database 數據庫名。
新建表:
create table 表名 (列名1 類型,列名2 類型,…)
Tips:創建表之前應該先選擇對應數據庫:
USE 數據庫名
新建索引:
create [unique|cluster] index 索引名 on 表名(索引列1,索引列2…)
Tip1:unique|cluster——唯一索引|聚集索引
Tip2:創建索引後:改變表中數據索引自動更新,索引建立後查詢表時索引自動被使用,索引數目不限制但索引越多更新數據越慢(對於僅用於查詢的表可以多用索引,對於數據更新頻繁的儘量少建立索引)
eg:對錶s的var列創建唯一索引s_var_only
create unique index s_var_only on s(var)
新建視圖:(把一個SELECT語句返回的結果作爲一個新的邏輯表並且以一個名字進行保存,視圖也可以用在SELECT語句中)
create view 視圖名 as SELECT語句
新建存儲過程(屬於Transact-SQL程序,只瞭解簡單功能):
create procedure 過程名(@變量1,@變量2,@輸出變量 output, …) as 語句
eg1:定義顯示錶s中所有數據的存儲過程show_s
create procedure show_s
as
select * from s
eg2:定義帶參數的向表s中添加數據的存儲過程add_s
create procedure add_s
( @var1 char(6),
@var2 char(6)
)
as
insert into s(s_var1,s_var2) values(@var1,@var2)
eg3:定義帶輸出存儲過程out_s
create procedure out_s
( @var_in char(2),
@var_out char(4) output
)
as
select @var_out from s where s_var=@var_in
新建觸發器(可看作特殊的存儲過程,簡單瞭解):
create trigger 觸發器名
on 對應表名
for 觸發條件[eg:insert,updata,delete]
as 語句
eg:當表s數據變動時顯示錶的所有數據
create tigger onChange
on s
for insert,updata,delete
as
select * from s
二、SQL的察看功能——select
select 列名1 [as '別名'], 列名2
from 表名1,表名2
where 檢索條件
group by 列名 [having 對組的檢索條件]
order by 列名 [asc|desc] Tips:對結果按指定的列進行升序|降序排列
注意:1. where group order三句可選擇使用(不是必須)
2. 查詢可以嵌套(子查詢)
eg:查找表s中和列names中值爲'張三'的年齡(age列)相同的人的名字(names列)
select names form s
where age=( select age from s where names='張三')
3. group by 語句表示按列名中的項目分組(比如:把一個表每個年齡人數統計下,這個查詢中年齡是二十的應該不只一個,需要分組後再統計。由於分組後 姓名列會出現‘一個年齡對應多個姓名’的情況,這樣是SQL無法處理的,會報錯,也就是說如果按照列AGE進行分組 那麼如果不對姓名列處理是無法顯示出來的。處理辦法一般是加入統計查詢函數[max,min,avg,sum,count]等 將多對一得情況改成統計數據顯示。)
eg:查詢表S每個年齡人數統計下
select age, count(distinct names) from s group by age
Tip1:將結果按照年齡分組然後統計出來每個組裏的人數
Tip2:distinct 關鍵字表示消去重複字段,即重名的不會統計
eg:用於對比(無法用group 語句):表S裏20歲的都有誰
select names from group where age=20
4.select超級綜合使用舉例。
要求:有一學生成績表s,表中有姓名names 科目class 成績score 三列,列出恰好有3門成績不及格的人的名字和他們的總成績並且按照降序排列。
select names,sum(score) as 'sum'
from s
where score<60
group by names
having count(class)=3
order by sum(score) desc
執行過程分析:
1.from 從表S中取出所有項目
2.找出不及格(分數低於60)的學生
3.按照名字分組(一人可以有很多科目同時一科目也會有很多人學習)
4.分組後按照科目的數目進行統計並且找出來剛好有3個科目的學生
5.把結果降序排列
數據庫實例分析:
成績表: names class score
a c 12
a java 64
a sql 23
a c++ 42
b c 46
b java 82
b sql 42
b c++ 91
c c 72
c java 64
c sql 82
c c++ 0
經過第1步後整個表被取出。經過第2步篩選出不及格的項目,如下:
names class score
a c 12
a sql 23
a c++ 42
b c 46
b sql 42
c c++ 0
然後進入第三步 按照名字分組(注意此時分組後SQL無法處理原本只能一個成績對應一個名字和一個科目 現在一個名字對應好多成績好多科目 此處只是按照邏輯寫出來,SQL無法顯示) 分組後變成:
names class"堆" score"堆"
a---->c,sql,c++ 12,23,42
b---->s,sql 46,42
c---->c++ 0
接着是HAVING語句對分組結果進行處理,統計處每個names對應的class堆中的項目數(此處 class中項目數和names是一一對應的 如果以這個作爲一個表SQL可以處理,同時分組的邏輯表仍然存在)。然後選出 class數目=3 的一項(下列標有星號*的)
names class數
a 3 **
b 2
c 1
繼續,從邏輯堆裏取出 score堆進行統計總成績 sum=12+23+42=77,按照別名輸出結果。
names sum
a 77
最後進行排序。因爲只有一個所以結果同上。
5.數據表的連接查詢(從多個表中取出需要的項目進行綜合)
內連接:(只顯示兩個表對於連接條件共有的部分)
select 表1.所需列1 , 表2.所需列2
from 表1,表2
where 連接條件 and 查詢條件
eg1:多表連接:有兩個表,學生情況表s(包括學號sno和姓名names)和導師任課情況表t(包括導師名字names和學生學號sno),查找 導師'張三' 說帶的學生。
select names from s,t
where s.sno=t.sno and t.names='張三'
eg2:自身連接:找出教師工資表( 包括姓名names工資sal)s中 比'張三'工資低的老師
select names from s as x,s as y
where x.sal>y.sal and y.names='張三'
外連接:(顯示主表 將從表與主表匹配 主表沒被匹配的項目 填成NULL)
select 表1.所需列1 , 表2.所需列2
from 表1 left|right (outer) join 表2
on 連接條件
Tips:外連接分左右連接 left對應寫在左邊的表1 爲主表
外連接時連接條件用ON 不用WHERE
Tips:另外還有full (outer)join 和 cross Join 。full不分主從全不顯示出來(匹配的寫不匹配的也全部寫出來,就像一個學生沒考試然後還有不是學生的也去考試了,這樣學生表和成績表的交集會被寫出 同時也寫出成績表中不是學生那人的情況和學生表中買考試那人都要列出來。) cross將一個表的每一個記錄和另一個表的每一個記錄都進行匹配。這兩都不常用。
eg:有兩表 一個學生表s(names,學號sno)一個某科考試成績表c(學號sno,成績score),假設有學生沒有考試那麼成績表中沒有記錄。 現在要顯示所有學生的成績。(那麼如果該學生沒有考試成績表中就不會有他的成績信息,以學生表爲主表用成績表去匹配)
select names score
from s left outer join c
on S.SNO=C.SNO
6.部分匹配(通配符)查詢LIKE
select 列1,列2
from 表名
where 列名 LIKE 通配符條件
Tips:通配符'%'匹配多個 , '_'匹配一個, '[]'在某一範圍的一個字符 '[^ ]'不再某一範圍的一個字符
eg1:在成績表s中找姓張的同學的成績
select names,score
from s
where names like '張_'
eg2:在成績表S中找成績是九十多的
select names ,score from sc
where score like '9[0-9]'
7.確定範圍 (‘between and’| in)
eg:找到成績是90 80 70 的同學
select names,score from s
where score in (90,80,70)
三、SQL的修改功能——alter | drop
修改數據表de列定義(增、改、刪)
alter table 表名
add|alter 列定義| 完整性約束
Tips:完整性約束:
constraint 約束名 約束類型
約束名:
用於刪除約束的時候: drop constraint 約束名
約束類型:
空/非空 NULL/NOT NULL
檢測約束 check
constraint 約束名 check(約束條件)
外鍵約束 (使表在外部鍵上取值是主表中某個值)
constraint 約束名 foreign key peferences 主表名(列名)
唯一 unique (可空 但不可重複。最多隻有一個空)
主鍵 primary key (不可重複不可空)
tips:主鍵和唯一性約束異同:
一個基本表中只能一個主鍵但可多個唯一性約束
主鍵不允許又空值存在,唯一性約束後可以有空值
一個列不能同時作爲主鍵並加上唯一性約束
eg1:表s增加一個列class
alter table s
add class char(6)
eg2:表s增加一個完整約束 要求score在0到100之間
alter table s
add
constraint s_chk check(score between 0 and 100)
eg3:修改表s中列names 加寬到10字符
alter table s
alter column names char(10)
tip:修改不允許毀壞原有數據 比如原來數據15字符不能修改爲10字符
刪除列:
alter table 表名
drop column 列名
刪除表約束:
alter table 表名
drop constraint 約束名
刪除數據表:
drop table 表名
刪除索引:
drop index 表名.索引名
tips: 不能刪除由 create table.alter table創建的primary key 和unique。也不能刪除系統表中的索引。
修改表中數據:
插入單條數據:
insert into 表名(列名1,列名2…) values(值1,值2…)
插入多條數據:
insert into 表名(列名1,列名2…) 子查詢
eg:求出表S中sal平均值存入SALAGV中
insert into salagv
select names,agv(sal)
from s
group by names
修改數據:
update 表名
set 列名=表達式
where 條件
eg1:表S中工資SAL 全部漲100
update s
set sal=sal+100
eg2:表S中工資少於1000的提高20%
update s
set sal=sal*1.2
where sal<1000
刪除一行記錄:
delete
from 表名
where 條件
eg:刪除張三的記錄
delete
from s
where names='張三'
刪除多條記錄:
eg: delete
from t
刪除後t表爲空表,當定義仍存在
修改視圖:
alter view 視圖名稱 (視圖列表)
as 子查詢
刪除視圖:
drop view 視圖名
更新視圖:
視圖爲一張虛表,對其操作都將最終轉換成對基本表的操作。視圖可以保證數據的邏輯獨立性。