(转载)sql语句大全
生活随笔
收集整理的這篇文章主要介紹了
(转载)sql语句大全
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
--語?句?功?能
--數(shù)據(jù)操作
select?--從數(shù)據(jù)庫表中檢索數(shù)據(jù)行和列
insert?--向數(shù)據(jù)庫表添加新數(shù)據(jù)行
delete?--從數(shù)據(jù)庫表中刪除數(shù)據(jù)行
update?--更新數(shù)據(jù)庫表中的數(shù)據(jù)
--數(shù)據(jù)定義
create?table?--創(chuàng)建一個(gè)數(shù)據(jù)庫表
drop?table?--從數(shù)據(jù)庫中刪除表
alter?table?--修改數(shù)據(jù)庫表結(jié)構(gòu)
create?view?--創(chuàng)建一個(gè)視圖
drop?view?--從數(shù)據(jù)庫中刪除視圖
create?index?--為數(shù)據(jù)庫表創(chuàng)建一個(gè)索引
drop?index?--從數(shù)據(jù)庫中刪除索引
create?procedure?--創(chuàng)建一個(gè)存儲(chǔ)過程
?
drop?procedure?--從數(shù)據(jù)庫中刪除存儲(chǔ)過程
create?trigger?--創(chuàng)建一個(gè)觸發(fā)器
drop?trigger?--從數(shù)據(jù)庫中刪除觸發(fā)器
create?schema?--向數(shù)據(jù)庫添加一個(gè)新模式
drop?schema?--從數(shù)據(jù)庫中刪除一個(gè)模式
create?domain?--創(chuàng)建一個(gè)數(shù)據(jù)值域
alter?domain?--改變域定義
drop?domain?--從數(shù)據(jù)庫中刪除一個(gè)域
--數(shù)據(jù)控制
grant?--授予用戶訪問權(quán)限
deny?--拒絕用戶訪問
revoke?--解除用戶訪問權(quán)限
--事務(wù)控制
commit?--結(jié)束當(dāng)前事務(wù)
rollback?--中止當(dāng)前事務(wù)
set?transaction?--定義當(dāng)前事務(wù)數(shù)據(jù)訪問特征
--程序化sql
declare?--為查詢設(shè)定游標(biāo)
explan?--為查詢描述數(shù)據(jù)訪問計(jì)劃
open?--檢索查詢結(jié)果打開一個(gè)游標(biāo)
fetch?--檢索一行查詢結(jié)果
close?--關(guān)閉游標(biāo)
prepare?--為動(dòng)態(tài)執(zhí)行預(yù)備sql?語句
execute?--動(dòng)態(tài)地執(zhí)行sql?語句
describe?--描述預(yù)備好的查詢?
---局部變量
declare?@id?char(10)
--set?@id?=?'10010001'
select?@id?=?'10010001'?
---全局變量
---必須以@@開頭
--if?else
declare?@x?int?@y?int?@z?int
select?@x?=?1?@y?=?2?@z=3
if?@x?>?@y
print?'x?>?y'?--打印字符串'x?>?y'
else?if?@y?>?@z
print?'y?>?z'
else?print?'z?>?y'
--case
use?pangu
update?employee
set?e_wage?=
case
when?job_level?=?’1’?then?e_wage*1.08
when?job_level?=?’2’?then?e_wage*1.07
when?job_level?=?’3’?then?e_wage*1.06
else?e_wage*1.05
end
--while?continue?break
declare?@x?int?@y?int?@c?int
select?@x?=?1?@y=1
while?@x?<?3
begin
print?@x?--打印變量x?的值
while?@y?<?3
begin
select?@c?=?100*@x?+?@y
print?@c?--打印變量c?的值
select?@y?=?@y?+?1
end
select?@x?=?@x?+?1
select?@y?=?1
end
--waitfor
--例?等待1?小時(shí)2?分零3?秒后才執(zhí)行select?語句
waitfor?delay?’01:02:03’
select?*?from?employee
--例?等到晚上11?點(diǎn)零8?分后才執(zhí)行select?語句
waitfor?time?’23:08:00’
select?*?from?employee
***select***
select?*(列名)?from?table_name(表名)?where?column_name?operator?value
ex:(宿主)
select?*?from?stock_information?where?stockid?=?str(nid)
stockname?=?'str_name'?
stockname?like?'%?find?this?%'?
stockname?like?'[a-za-z]%'?---------?([]指定值的范圍)
stockname?like?'[^f-m]%'?---------?(^排除指定范圍)
---------?只能在使用like要害字的where子句中使用通配符)
or?stockpath?=?'stock_path'
or?stocknumber?<?1000
and?stockindex?=?24
not?stock***?=?'man'
stocknumber?between?20?and?100
stocknumber?in(10,20,30)
order?by?stockid?desc(asc)?---------?排序,desc-降序,asc-升序
order?by?1,2?---------?by列號(hào)
stockname?=?(select?stockname?from?stock_information?where?stockid?=?4)
---------?子查詢
---------?除非能確保內(nèi)層select只返回一個(gè)行的值,
---------?否則應(yīng)在外層where子句中用一個(gè)in限定符
select?distinct?column_name?form?table_name?---------?distinct指定檢索獨(dú)有的列值,不重復(fù)
select?stocknumber?,"stocknumber?+?10"?=?stocknumber?+?10?from?table_name
select?stockname?,?"stocknumber"?=?count(*)?from?table_name?group?by?stockname
---------?group?by?將表按行分組,指定列中有相同的值
having?count(*)?=?2?---------?having選定指定的組
select?*?
from?table1,?table2?
where?table1.id?*=?table2.id?--------?左外部連接,table1中有的而table2中沒有得以null表示
table1.id?=*?table2.id?--------?右外部連接?
select?stockname?from?table1
union?[all]?-----?union合并查詢結(jié)果集,all-保留重復(fù)行
select?stockname?from?table2
***insert***
insert?into?table_name?(stock_name,stock_number)?value?("xxx","xxxx")
value?(select?stockname?,?stocknumber?from?stock_table2)---value為select語句
***update***
update?table_name?set?stockname?=?"xxx"?[where?stockid?=?3]
stockname?=?default
stockname?=?null
stocknumber?=?stockname?+?4
***delete***
delete?from?table_name?where?stockid?=?3
truncate?table_name?-----------?刪除表中所有行,仍保持表的完整性
drop?table?table_name?---------------?完全刪除表
***alter?table***?---?修改數(shù)據(jù)庫表結(jié)構(gòu)
alter?table?database.owner.table_name?add?column_name?char(2)?null?.....
sp_help?table_name?----?顯示表已有特征
create?table?table_name?(name?char(20),?age?smallint,?lname?varchar(30))
insert?into?table_name?select?.........?-----?實(shí)現(xiàn)刪除列的方法(創(chuàng)建新表)
alter?table?table_name?drop?constraint?stockname_default?----?刪除stockname的default約束
***function(/*常用函數(shù)*/)***
----統(tǒng)計(jì)函數(shù)----
avg?--求平均值
count?--統(tǒng)計(jì)數(shù)目
max?--求最大值
min?--求最小值
sum?--求和
--avg
use?pangu
select?avg(e_wage)?as?dept_avgwage
from?employee
group?by?dept_id
--max
--比如求工資最高的員工姓名
use?pangu
select?e_name
from?employee
where?e_wage?=
(select?max(e_wage)
from?employee)
--stdev()
--stdev()函數(shù)返回表達(dá)式中所有數(shù)據(jù)的標(biāo)準(zhǔn)差
--stdevp()
--stdevp()函數(shù)返回總體標(biāo)準(zhǔn)差
--var()
--var()函數(shù)返回表達(dá)式中所有值的統(tǒng)計(jì)變異數(shù)
--varp()
--varp()函數(shù)返回總體變異數(shù)
----算術(shù)函數(shù)----
/***三角函數(shù)***/
sin(float_expression)?--返回以弧度表示的角的正弦
cos(float_expression)?--返回以弧度表示的角的余弦
tan(float_expression)?--返回以弧度表示的角的正切
cot(float_expression)?--返回以弧度表示的角的余切
/***反三角函數(shù)***/
asin(float_expression)?--返回正弦是float?值的以弧度表示的角
acos(float_expression)?--返回余弦是float?值的以弧度表示的角
atan(float_expression)?--返回正切是float?值的以弧度表示的角
atan2(float_expression1,float_expression2)?
--返回正切是float_expression1?/float_expres-sion2的以弧度表示的角
degrees(numeric_expression)
--把弧度轉(zhuǎn)換為角度返回與表達(dá)式相同的數(shù)據(jù)類型可為
--integer/money/real/float?類型
radians(numeric_expression)?--把角度轉(zhuǎn)換為弧度返回與表達(dá)式相同的數(shù)據(jù)類型可為
--integer/money/real/float?類型
exp(float_expression)?--返回表達(dá)式的指數(shù)值
log(float_expression)?--返回表達(dá)式的自然對數(shù)值
log10(float_expression)--返回表達(dá)式的以10?為底的對數(shù)值
sqrt(float_expression)?--返回表達(dá)式的平方根
/***取近似值函數(shù)***/
ceiling(numeric_expression)?--返回>=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為
--integer/money/real/float?類型
floor(numeric_expression)?--返回<=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為
--integer/money/real/float?類型
round(numeric_expression)?--返回以integer_expression?為精度的四舍五入值返回的數(shù)據(jù)
--類型與表達(dá)式相同可為integer/money/real/float?類型
abs(numeric_expression)?--返回表達(dá)式的絕對值返回的數(shù)據(jù)類型與表達(dá)式相同可為
--integer/money/real/float?類型
sign(numeric_expression)?--測試參數(shù)的正負(fù)號(hào)返回0?零值1?正數(shù)或-1?負(fù)數(shù)返回的數(shù)據(jù)類型
--與表達(dá)式相同可為integer/money/real/float?類型
pi()?--返回值為π?即3.1415926535897936
rand([integer_expression])?--用任選的[integer_expression]做種子值得出0-1?間的隨機(jī)浮點(diǎn)數(shù)
----字符串函數(shù)----
ascii()?--函數(shù)返回字符表達(dá)式最左端字符的ascii?碼值
char()?--函數(shù)用于將ascii?碼轉(zhuǎn)換為字符
--假如沒有輸入0?~?255?之間的ascii?碼值char?函數(shù)會(huì)返回一個(gè)null?值
lower()?--函數(shù)把字符串全部轉(zhuǎn)換為小寫
upper()?--函數(shù)把字符串全部轉(zhuǎn)換為大寫
str()?--函數(shù)把數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù)
ltrim()?--函數(shù)把字符串頭部的空格去掉
rtrim()?--函數(shù)把字符串尾部的空格去掉
left(),right(),substring()?--函數(shù)返回部分字符串
charindex(),patindex()?--函數(shù)返回字符串中某個(gè)指定的子串出現(xiàn)的開始位置
soundex()?--函數(shù)返回一個(gè)四位字符碼?
--soundex函數(shù)可用來查找聲音相似的字符串但soundex函數(shù)對數(shù)字和漢字均只返回0?值?
difference()?--函數(shù)返回由soundex?函數(shù)返回的兩個(gè)字符表達(dá)式的值的差異
--0?兩個(gè)soundex?函數(shù)返回值的第一個(gè)字符不同
--1?兩個(gè)soundex?函數(shù)返回值的第一個(gè)字符相同
--2?兩個(gè)soundex?函數(shù)返回值的第一二個(gè)字符相同
--3?兩個(gè)soundex?函數(shù)返回值的第一二三個(gè)字符相同
--4?兩個(gè)soundex?函數(shù)返回值完全相同
quotename()?--函數(shù)返回被特定字符括起來的字符串
/*select?quotename('abc',?'{')?quotename('abc')
運(yùn)行結(jié)果如下:
----------------------------------
{abc}?[abc]*/
replicate()?--函數(shù)返回一個(gè)重復(fù)character_expression?指定次數(shù)的字符串
/*select?replicate('abc',?3)?replicate(?'abc',?-2)
運(yùn)行結(jié)果如下:
-----------?-----------
abcabcabc?null
reverse()?--函數(shù)將指定的字符串的字符排列順序顛倒
replace()?--函數(shù)返回被替換了指定子串的字符串
/*select?replace('abc123g',?'123',?'def')
運(yùn)行結(jié)果如下:
-----------?-----------
abcdefg*/
space()?--函數(shù)返回一個(gè)有指定長度的空白字符串
stuff()?--函數(shù)用另一子串替換字符串指定位置長度的子串
----數(shù)據(jù)類型轉(zhuǎn)換函數(shù)----
cast()?函數(shù)語法如下
cast()?(<expression>?as?<data_?type>[?length?])
convert()?函數(shù)語法如下
convert()?(<data_?type>[?length?],?<expression>?[,?style])
select?cast(100+99?as?char)?convert(varchar(12),?getdate())
運(yùn)行結(jié)果如下
------------------------------?------------
199?jan?15?2000
----日期函數(shù)----
day()?--函數(shù)返回date_expression?中的日期值
month()?--函數(shù)返回date_expression?中的月份值
year()?--函數(shù)返回date_expression?中的年份值
dateadd(<datepart>?,<number>?,<date>)?
--函數(shù)返回指定日期date?加上指定的額外日期間隔number?產(chǎn)生的新日期
datediff(<datepart>?,<number>?,<date>)
--函數(shù)返回兩個(gè)指定日期在datepart?方面的不同之處
datename(<datepart>?,?<date>)?--函數(shù)以字符串的形式返回日期的指定部分
datepart(<datepart>?,?<date>)?--函數(shù)以整數(shù)值的形式返回日期的指定部分
getdate()?--函數(shù)以datetime?的缺省格式返回系統(tǒng)當(dāng)前的日期和時(shí)間
----系統(tǒng)函數(shù)----
app_name()?--函數(shù)返回當(dāng)前執(zhí)行的應(yīng)用程序的名稱
coalesce()?--函數(shù)返回眾多表達(dá)式中第一個(gè)非null?表達(dá)式的值
col_length(<'table_name'>,?<'column_name'>)?--函數(shù)返回表中指定字段的長度值
col_name(<table_id>,?<column_id>)?--函數(shù)返回表中指定字段的名稱即列名
datalength()?--函數(shù)返回?cái)?shù)據(jù)表達(dá)式的數(shù)據(jù)的實(shí)際長度
db_id(['database_name'])?--函數(shù)返回?cái)?shù)據(jù)庫的編號(hào)
db_name(database_id)?--函數(shù)返回?cái)?shù)據(jù)庫的名稱
host_id()?--函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱
host_name()?--函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱
identity(<data_type>[,?seed?increment])?[as?column_name])
--identity()?函數(shù)只在select?into?語句中使用用于插入一個(gè)identity?column列到新表中
/*select?identity(int,?1,?1)?as?column_name
into?newtable
from?oldtable*/
isdate()?--函數(shù)判定所給定的表達(dá)式是否為合理日期
isnull(<check_expression>,?<replacement_value>)?--函數(shù)將表達(dá)式中的null?值用指定值替換
isnumeric()?--函數(shù)判定所給定的表達(dá)式是否為合理的數(shù)值
newid()?--函數(shù)返回一個(gè)uniqueidentifier?類型的數(shù)值
nullif(<expression1>,?<expression2>)
--nullif?函數(shù)在expression1?與expression2?相等時(shí)返回null?值若不相等時(shí)則返回expression1?的值
sql中的保留字
action?add?aggregate?all?
alter?after?and?as?
asc?avg?avg_row_length?auto_increment?
between?bigint?bit?binary?
blob?bool?both?by?
cascade?case?char?character?
change?check?checksum?column?
columns?comment?constraint?create?
cross?current_date?current_time?current_timestamp?
data?database?databases?date?
datetime?day?day_hour?day_minute?
day_second?dayofmonth?dayofweek?dayofyear?
dec?decimal?default?delayed?
delay_key_write?delete?desc?describe?
distinct?distinctrow?double?drop?
end?else?escape?escaped?
enclosed?enum?explain?exists?
fields?file?first?float?
float4?float8?flush?foreign?
from?for?full?function?
global?grant?grants?group?
having?heap?high_priority?hour?
hour_minute?hour_second?hosts?identified?
ignore?in?index?infile?
inner?insert?insert_id?int?
integer?interval?int1?int2?
int3?int4?int8?into?
if?is?isam?join?
key?keys?kill?last_insert_id?
leading?left?length?like?
lines?limit?load?local?
lock?logs?long?longblob?
longtext?low_priority?max?max_rows?
match?mediumblob?mediumtext?mediumint?
middleint?min_rows?minute?minute_second?
modify?month?monthname?myisam?
natural?numeric?no?not?
null?on?optimize?option?
optionally?or?order?outer?
outfile?pack_keys?partial?password?
precision?primary?procedure?process?
processlist?privileges?read?real?
references?reload?regexp?rename?
replace?restrict?returns?revoke?
rlike?row?rows?second?
select?set?show?shutdown?
smallint?soname?sql_big_tables?sql_big_selects?
sql_low_priority_updates?sql_log_off?sql_log_update?sql_select_limit?
sql_small_result?sql_big_result?sql_warnings?straight_join?
starting?status?string?table?
tables?temporary?terminated?text?
then?time?timestamp?tinyblob?
tinytext?tinyint?trailing?to?
type?use?using?unique?
unlock?unsigned?update?usage?
values?varchar?variables?varying?
varbinary?with?write?when?
where?year?year_month?zerofill
常用sql命令和asp編程
在進(jìn)行數(shù)據(jù)庫操作時(shí),無非就是添加、刪除、修改,這得設(shè)計(jì)到一些常用的sql語句,如下:?
sql常用命令使用方法:
(1)?數(shù)據(jù)記錄篩選:
sql="select?*?from?數(shù)據(jù)表?where?字段名=字段值?order?by?字段名?[desc]"
sql="select?*?from?數(shù)據(jù)表?where?字段名?like?%字段值%?order?by?字段名?[desc]"
sql="select?top?10?*?from?數(shù)據(jù)表?where?字段名?order?by?字段名?[desc]"
sql="select?*?from?數(shù)據(jù)表?where?字段名?in?(值1,值2,值3)"
sql="select?*?from?數(shù)據(jù)表?where?字段名?between?值1?and?值2"
(2)?更新數(shù)據(jù)記錄:
sql="update?數(shù)據(jù)表?set?字段名=字段值?where?條件表達(dá)式"
sql="update?數(shù)據(jù)表?set?字段1=值1,字段2=值2?……?字段n=值n?where?條件表達(dá)式"
(3)?刪除數(shù)據(jù)記錄:
sql="delete?from?數(shù)據(jù)表?where?條件表達(dá)式"
sql="delete?from?數(shù)據(jù)表"?(將數(shù)據(jù)表所有記錄刪除)
(4)?添加數(shù)據(jù)記錄:
sql="insert?into?數(shù)據(jù)表?(字段1,字段2,字段3?…)?valuess?(值1,值2,值3?…)"
sql="insert?into?目標(biāo)數(shù)據(jù)表?select?*?from?源數(shù)據(jù)表"?(把源數(shù)據(jù)表的記錄添加到目標(biāo)數(shù)據(jù)表)
(5)?數(shù)據(jù)記錄統(tǒng)計(jì)函數(shù):
avg(字段名)?得出一個(gè)表格欄平均值
count(*|字段名)?對數(shù)據(jù)行數(shù)的統(tǒng)計(jì)或?qū)δ骋粰谟兄档臄?shù)據(jù)行數(shù)統(tǒng)計(jì)
max(字段名)?取得一個(gè)表格欄最大的值
min(字段名)?取得一個(gè)表格欄最小的值
sum(字段名)?把數(shù)據(jù)欄的值相加
引用以上函數(shù)的方法:
sql="select?sum(字段名)?as?別名?from?數(shù)據(jù)表?where?條件表達(dá)式"
set?rs=conn.excute(sql)
用?rs("別名")?獲取統(tǒng)的計(jì)值,其它函數(shù)運(yùn)用同上。
(6)?數(shù)據(jù)表的建立和刪除:
create?table?數(shù)據(jù)表名稱(字段1?類型1(長度),字段2?類型2(長度)?……?)
例:create?table?tab01(name?varchar(50),datetime?default?now())
drop?table?數(shù)據(jù)表名稱?(永久性刪除一個(gè)數(shù)據(jù)表)
在asp編程時(shí),下面這些語句是必須知道的:
1.連接數(shù)據(jù)庫
a.?asp與access數(shù)據(jù)庫連接:
<%@?language=vbs?cript%>
<%
dim?conn,mdbfile
mdbfile=server.mappath("數(shù)據(jù)庫名稱.mdb")
set?conn=server.createobject("adodb.connection")
conn.open?"driver={microsoft?access?driver?(*.mdb)};uid=admin;pwd=數(shù)據(jù)庫密碼;dbq="&mdbfile
%>
b.?asp與sql數(shù)據(jù)庫連接:
<%@?language=vbs?cript%>
<%
dim?conn
set?conn=server.createobject("adodb.connection")
con.open?"provider=sqloledb;data?source=sql服務(wù)器名稱或ip地址;uid=sa;pwd=數(shù)據(jù)庫密碼;database=數(shù)據(jù)庫名稱
%>
建立記錄集對象:
set?rs=server.createobject("adodb.recordset")
rs.open?sql語句,conn,3,2
2.?記錄集對象的方法:
rs.movenext?將記錄指針從當(dāng)前的位置向下移一行
rs.moveprevious?將記錄指針從當(dāng)前的位置向上移一行
rs.movefirst?將記錄指針移到數(shù)據(jù)表第一行
rs.movelast?將記錄指針移到數(shù)據(jù)表最后一行
rs.absoluteposition=n?將記錄指針移到數(shù)據(jù)表第n行
rs.absolutepage=n?將記錄指針移到第n頁的第一行
rs.pagesize=n?設(shè)置每頁為n條記錄
rs.pagecount?根據(jù)?pagesize?的設(shè)置返回總頁數(shù)
rs.recordcount?返回記錄總數(shù)
rs.bof?返回記錄指針是否超出數(shù)據(jù)表首端,true表示是,false為否
rs.eof?返回記錄指針是否超出數(shù)據(jù)表末端,true表示是,false為否
rs.delete?刪除當(dāng)前記錄,但記錄指針不會(huì)向下移動(dòng)
rs.addnew?添加記錄到數(shù)據(jù)表末端
rs.update?更新數(shù)據(jù)表記錄
附:
常數(shù)?常數(shù)值?說明
--------------------------------
adlockreadonly?1?缺省值,recordset對象以只讀方式啟動(dòng),無法運(yùn)行addnew、update及delete等方法
adlockprssimistic?2?當(dāng)數(shù)據(jù)源正在更新時(shí),系統(tǒng)會(huì)暫時(shí)鎖住其他用戶的動(dòng)作,以保持?jǐn)?shù)據(jù)一致性。
adlockoptimistic?3?當(dāng)數(shù)據(jù)源正在更新時(shí),系統(tǒng)并不會(huì)鎖住其他用戶的動(dòng)作,其他用戶可以對數(shù)據(jù)進(jìn)行增、刪、改的操作。
adlockbatchoptimistic?4?當(dāng)數(shù)據(jù)源正在更新時(shí),其他用戶必須將cursorlocation屬性改為adudeclientbatch才能對數(shù)據(jù)進(jìn)行增、刪、改的操作。
mssql經(jīng)典語句?
?
1.按姓氏筆畫排序:select?*?from?tablename?order?by?customername?collate?chinese_prc_stroke_ci_as?
2.數(shù)據(jù)庫加密:select?encrypt('原始密碼')
select?pwdencrypt('原始密碼')
select?pwdcompare('原始密碼','加密后密碼')?=?1--相同;否則不相同?encrypt('原始密碼')
select?pwdencrypt('原始密碼')
select?pwdcompare('原始密碼','加密后密碼')?=?1--相同;否則不相同
3.取回表中字段:declare?@list?varchar(1000),@sql?nvarchar(1000)?
select?@list=@list+','+b.name?from?sysobjects?a,syscolumns?b?where?a.id=b.id?and?a.name='表a'
set?@sql='select?'+right(@list,len(@list)-1)+'?from?表a'?
exec?(@sql)
4.查看硬盤分區(qū):exec?master..xp_fixeddrives
5.比較a,b表是否相等:if?(select?checksum_agg(binary_checksum(*))?from?a)
=
(select?checksum_agg(binary_checksum(*))?from?b)
print?'相等'
else
print?'不相等'
6.殺掉所有的事件探察器進(jìn)程:declare?hcforeach?cursor?global?for?select?'kill?'+rtrim(spid)?from?master.dbo.sysprocesses
where?program_name?in('sql?profiler',n'sql?事件探查器')
exec?sp_msforeach_worker?'?'
7.記錄搜索:開頭到n條記錄
select?top?n?*?from?表
-------------------------------
n到m條記錄(要有主索引id)select?top?m-n?*?from?表?where?id?in?(select?top?m?id?from?表)?order?by?id?desc
----------------------------------
n到結(jié)尾記錄
select?top?n?*?from?表?order?by?id?desc
8.如何修改數(shù)據(jù)庫的名稱:sp_renamedb?'old_name',?'new_name'?
9:獲取當(dāng)前數(shù)據(jù)庫中的所有用戶表select?name?from?sysobjects?where?xtype='u'?and?status>=0
10:獲取某一個(gè)表的所有字段select?name?from?syscolumns?where?id=object_id('表名')
11:查看與某一個(gè)表相關(guān)的視圖、存儲(chǔ)過程、函數(shù)select?a.*?from?sysobjects?a,?syscomments?b?where?a.id?=?b.id?and?b.text?like?'%表名%'
12:查看當(dāng)前數(shù)據(jù)庫中所有存儲(chǔ)過程select?name?as?存儲(chǔ)過程名稱?from?sysobjects?where?xtype='p'
13:查詢用戶創(chuàng)建的所有數(shù)據(jù)庫select?*?from?master..sysdatabases?d?where?sid?not?in(select?sid?from?master..syslogins?where?name='sa')
或者
select?dbid,?name?as?db_name?from?master..sysdatabases?where?sid?<>?0x01
14:查詢某一個(gè)表的字段和數(shù)據(jù)類型select?column_name,data_type?from?information_schema.columns
where?table_name?=?'表名'?
[n].[標(biāo)題]:select?*?from?tablename?order?by?customername?
[n].[標(biāo)題]:select?*?from?tablename?order?by?customername?
from:http://tb.blog.csdn.net/trackback.aspx?postid=585515
?
觸發(fā)器-mssql常用操作
?
不再新開文章.
這里只打算講解四部分了,也就最簡單、最常用的四部分。
1、觸發(fā)器。
定義:?何為觸發(fā)器?在sql?server里面也就是對某一個(gè)表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個(gè)非凡的存儲(chǔ)過程。
常見的觸發(fā)器有三種:分別應(yīng)用于insert?,?update?,?delete?事件。(sql?server?2000定義了新的觸發(fā)器,這里不提)
我為什么要使用觸發(fā)器?比如,這么兩個(gè)表:
create?table?student(?--學(xué)生表
studentid?int?primary?key,?--學(xué)號(hào)
....
)
create?table?borrowrecord(?--學(xué)生借書記錄表
borrowrecord?int?identity(1,1),?--流水號(hào)?
studentid?int?,?--學(xué)號(hào)
borrowdate?datetime,?--借出時(shí)間
returndate?datetime,?--歸還時(shí)間
...
)
用到的功能有:
1.假如我更改了學(xué)生的學(xué)號(hào),我希望他的借書記錄仍然與這個(gè)學(xué)生相關(guān)(也就是同時(shí)更改借書記錄表的學(xué)號(hào));
2.假如該學(xué)生已經(jīng)畢業(yè),我希望刪除他的學(xué)號(hào)的同時(shí),也刪除它的借書記錄。
等等。
這時(shí)候可以用到觸發(fā)器。對于1,創(chuàng)建一個(gè)update觸發(fā)器:
create?trigger?trustudent
on?student
for?update
as
if?update(studentid)
begin
update?borrowrecord?
set?studentid=i.studentid
from?borrowrecord?br?,?deleted?d?,inserted?i?
where?br.studentid=d.studentid
end?
理解觸發(fā)器里面的兩個(gè)臨時(shí)的表:deleted?,?inserted?。注重deleted?與inserted分別表示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。
一個(gè)update?的過程可以看作為:生成新的記錄到inserted表,復(fù)制舊的記錄到deleted表,然后刪除student記錄并寫入新紀(jì)錄。
對于2,創(chuàng)建一個(gè)delete觸發(fā)器
create?trigger?trdstudent
on?student
for?delete
as
delete?borrowrecord?
from?borrowrecord?br?,?delted?d
where?br.studentid=d.studentid
從這兩個(gè)例子我們可以看到了觸發(fā)器的要害:a.2個(gè)臨時(shí)的表;b.觸發(fā)機(jī)制。
這里我們只講解最簡單的觸發(fā)器。復(fù)雜的容后說明。
事實(shí)上,我不鼓勵(lì)使用觸發(fā)器。觸發(fā)器的初始設(shè)計(jì)思想,已經(jīng)被“級聯(lián)”所替代.
?
mssql數(shù)據(jù)庫導(dǎo)出和導(dǎo)入
?
sql?server導(dǎo)出導(dǎo)入數(shù)據(jù)方法
?
?一、導(dǎo)出導(dǎo)入sql?server里某個(gè)數(shù)據(jù)庫?
?
1.?在sql?server企業(yè)管理器里選中要轉(zhuǎn)移的數(shù)據(jù)庫,按鼠標(biāo)右鍵,選所有任務(wù)->備份數(shù)據(jù)庫。?
2.?備份?選數(shù)據(jù)庫-完全,?目的?備份到?按添加按鈕?文件名?在sql?server服務(wù)器硬盤下輸入一個(gè)自定義的備份數(shù)據(jù)庫文件名(后綴一般是bak)?重寫?選重寫現(xiàn)有媒體?最后按確定按鈕。?假如生成的備份數(shù)據(jù)庫文件大于1m,要用壓縮工具壓縮后再到internet上傳輸。?
3.?通過ftp或者remote?desktop或者pcanywhere等方法?把第二步生成的備份數(shù)據(jù)庫文件或者其壓縮后的文件傳到目的sql?server數(shù)據(jù)庫,假如有壓縮要解壓。?4.目的sql?server數(shù)據(jù)庫假如還沒有此數(shù)據(jù)庫,先創(chuàng)建一個(gè)新的數(shù)據(jù)庫;?然后選中這個(gè)新創(chuàng)建的數(shù)據(jù)庫,按鼠標(biāo)右鍵,選所有任務(wù)->還原數(shù)據(jù)庫?還原->從設(shè)備->選擇設(shè)備->磁盤->添加(找到要導(dǎo)入的備份數(shù)據(jù)庫文件名)->確定?還原備份集->數(shù)據(jù)庫-完全?最后按確定按鈕。完全的數(shù)據(jù)庫導(dǎo)入成功了。?(假如在已經(jīng)存在的sql?server數(shù)據(jù)庫上還原數(shù)據(jù)庫可能碰到有還有其它人正在使用它而恢復(fù)操做失敗,?可以去看?->管理->當(dāng)前活動(dòng)->鎖/對象->找到數(shù)據(jù)庫下鎖的進(jìn)程號(hào)->到查詢分析器里用kill?進(jìn)程號(hào)殺掉這些鎖,?然后再做還原)?
注重:
假如在原有的目的sql?server數(shù)據(jù)庫上從備份文件(*.bak)還原數(shù)據(jù)庫?會(huì)把已經(jīng)存在的表、存儲(chǔ)過程等數(shù)據(jù)庫對:象全部替換成最近這次導(dǎo)入的備份數(shù)據(jù)庫里的內(nèi)容。?假如一定要還原備份文件(*.bak)里部分?jǐn)?shù)據(jù),需要另外建一個(gè)新數(shù)據(jù)庫,?其邏輯名稱和數(shù)量同備份文件(*.bak)里數(shù)據(jù)庫的邏輯名稱和數(shù)量一致;?新數(shù)據(jù)庫的物理文件名稱取得一定要和備份文件(*.bak)里數(shù)據(jù)庫的物理文件不一樣才行。?
?
二、導(dǎo)出導(dǎo)入sql?server里某個(gè)表?
?
1.?沒有防火墻,同一個(gè)局域網(wǎng)里或不在同一個(gè)局域網(wǎng)里,但通過internet可以互相訪問?在sql?server企業(yè)管理器里選中目的數(shù)據(jù)庫?,按鼠標(biāo)右鍵,選所有任務(wù)->導(dǎo)入數(shù)據(jù)->?彈出數(shù)據(jù)轉(zhuǎn)換服務(wù)導(dǎo)入/導(dǎo)出向?qū)Т翱?/span>->下一步->?選數(shù)據(jù)源->?數(shù)據(jù)源(用于sql?server的microfost?ole?db提供程序)->?服務(wù)器(可選擇局域網(wǎng)內(nèi)能訪問到的所有sql?server服務(wù)器,或者直接輸入ip地址)->?選擇使用windows身份驗(yàn)證還是使用sql?serve身份驗(yàn)證(輸入數(shù)據(jù)庫的用戶名和密碼)->?數(shù)據(jù)庫(可選擇上面選中sql?server服務(wù)器上所有權(quán)限范圍內(nèi)的數(shù)據(jù)庫)->下一步->?選擇目的->目的(用于sql?server的microfost?ole?db提供程序)->?服務(wù)器(默認(rèn)為上一步里選中的導(dǎo)出服務(wù)器,也可以選其它局域網(wǎng)內(nèi)能訪問到的所有sql?server服務(wù)器,或者直接輸入ip地址)->?目的數(shù)據(jù)庫(可選擇上面選中sql?server服務(wù)器上所有權(quán)限范圍內(nèi)的數(shù)據(jù)庫)->下一步->?制定表復(fù)制或查詢->選從源數(shù)據(jù)庫復(fù)制表和視圖(也可以選擇用一條查詢指定要傳輸?shù)臄?shù)據(jù))->下一步->?選擇源表和視圖->在要導(dǎo)入的表和視圖前面選中源->目的出現(xiàn)同樣的表名(可以手工修改成別的表名)->?轉(zhuǎn)換->列映射和轉(zhuǎn)換里面可以修改源表和目的表之間字段的對應(yīng)關(guān)系,修改目的表字段的類型和長度等,?并可以選擇創(chuàng)建目的表,在目的表中增加行,除去并重新創(chuàng)建目的表,啟用標(biāo)志插入等選項(xiàng)->確定->下一步->?保存、調(diào)度和復(fù)制包->時(shí)間->立即運(yùn)行(假如要實(shí)現(xiàn)隔一段時(shí)間自動(dòng)導(dǎo)出導(dǎo)入數(shù)據(jù),選調(diào)度dts包以便以后執(zhí)行)->?保存(可以不選)->[?保存dts包(假如以后還要轉(zhuǎn)移這批相同的數(shù)據(jù),可以把本次導(dǎo)出導(dǎo)入的內(nèi)容和步驟保存起來,?存到sql?server即可,保存的時(shí)候要輸入dts的包名及具體描述)->下一步->?]->完成?正在執(zhí)行包->圖形界面顯示創(chuàng)建表及插入記錄的步驟和狀態(tài)->完成?
2.?經(jīng)過防火墻,不在同一個(gè)局域網(wǎng)里?①、導(dǎo)出表里的數(shù)據(jù)到文本文件:?在sql?server企業(yè)管理器里選中目的數(shù)據(jù)庫,按鼠標(biāo)右鍵,選所有任務(wù)->?導(dǎo)入數(shù)據(jù)->彈出數(shù)據(jù)轉(zhuǎn)換服務(wù)導(dǎo)入/導(dǎo)出向?qū)Т翱?/span>->下一步->?選數(shù)據(jù)源->?數(shù)據(jù)源(用于sql?server的microfost?ole?db提供程序)->?服務(wù)器(可選擇局域網(wǎng)內(nèi)能訪問到的所有sql?server服務(wù)器)->?選擇使用windows身份驗(yàn)證還是使用sql?serve身份驗(yàn)證(輸入數(shù)據(jù)庫的用戶名和密碼)->?數(shù)據(jù)庫(可選擇上面選中sql?server服務(wù)器上所有權(quán)限范圍內(nèi)的數(shù)據(jù)庫)->下一步->?選擇目的->目的(文本文件)->?文件名(在自己的電腦硬盤中生成一個(gè)自定義的文本文件)?->下一步->?制定表復(fù)制或查詢->選從源數(shù)據(jù)庫復(fù)制表和視圖(也可以選擇用一條查詢指定要傳輸?shù)臄?shù)據(jù))->下一步->?選擇目的文件格式->源(選擇要導(dǎo)出的表)->用默認(rèn)的帶分隔符->選第一行包含有列名稱選項(xiàng)->下一步->?保存、調(diào)度和復(fù)制包->時(shí)間->立即運(yùn)行(假如要實(shí)現(xiàn)隔一段時(shí)間自動(dòng)導(dǎo)出到文本文件,選調(diào)度dts包以便以后執(zhí)行)->?保存(可以不選)->?[保存dts包(保存的時(shí)候要輸入dts的包名及具體描述)->下一步->]->完成?正在執(zhí)行包->圖形界面顯示表到文本文件的步驟和狀態(tài)->完成?假如生成的文本文件大于1m,要用壓縮工具壓縮后再到internet上傳輸。?②、通過ftp或者remote?desktop或者pcanywhere等方法把?第①步生成的文本文件或者其壓縮后的文件傳到目的sql?server數(shù)據(jù)庫,假如有壓縮要解壓。?③、把文本文件導(dǎo)入目的sql?server數(shù)據(jù)庫?直接把文本文件導(dǎo)入目的sql?server數(shù)據(jù)庫里跟文本文件同名的新表名時(shí),默認(rèn)的會(huì)把所有字段類型都變成字符串。?所以我們要這樣做:?在源sql?server數(shù)據(jù)庫上先生成創(chuàng)建表的sql語句?在sql?server查詢分析器里->選中源數(shù)據(jù)庫里表名->按右鍵->在新窗口中編寫對象腳本->創(chuàng)建->?復(fù)制下新窗口內(nèi)創(chuàng)建表名的sql語句?到目標(biāo)sql?server數(shù)據(jù)庫上查詢分析器里執(zhí)行創(chuàng)建表名的sql語句,生成空表結(jié)構(gòu)。?(假如已經(jīng)存在這樣的表名,修改建表的sql語句,在表名后面加上導(dǎo)入時(shí)間的年月信息,例如table_0113)?調(diào)用導(dǎo)入/導(dǎo)出工具->彈出數(shù)據(jù)轉(zhuǎn)換服務(wù)導(dǎo)入/導(dǎo)出向?qū)Т翱?/span>->下一步->?選數(shù)據(jù)源->?數(shù)據(jù)源(文本文件)->?文件名(已傳到目的sql?server數(shù)據(jù)庫下要導(dǎo)入的文本文件,后綴可以不是*.txt,?但是常規(guī)文本編輯器能打開的文件,文件類型選全部)->下一步->?選擇文件格式->用默認(rèn)的帶分隔符->選第一行包含有列名稱選項(xiàng)->下一步->?制定列分割符->逗號(hào)->下一步->?選擇目的->目的(用于sql?server的microfost?ole?db提供程序)->?服務(wù)器(可選擇目標(biāo)局域網(wǎng)內(nèi)能訪問到的所有sql?server服務(wù)器)->?選擇使用windows身份驗(yàn)證還是使用sql?serve身份驗(yàn)證(輸入數(shù)據(jù)庫的用戶名和密碼)->?數(shù)據(jù)庫(可選擇上面選中sql?server服務(wù)器上所有權(quán)限范圍內(nèi)的數(shù)據(jù)庫)->下一步->?選擇源表和視圖->修改目的表名為剛才創(chuàng)建的表名->轉(zhuǎn)換(在目的表中追加行)?->下一步->?保存、調(diào)度和復(fù)制包->?時(shí)間->立即運(yùn)行(假如要實(shí)現(xiàn)隔一段時(shí)間自動(dòng)把文本文件導(dǎo)入,選調(diào)度dts包以便以后執(zhí)行)->?保存(可以不選)->?[保存dts包(保存的時(shí)候要輸入dts的包名及具體描述)->下一步->]->完成?正在執(zhí)行包->圖形界面顯示文本文件到表的步驟和狀態(tài)->完成?假如要更改導(dǎo)入時(shí)間的年月信息的表名,例如table_0113到原來的表名,?在企業(yè)管理器里把原來的表名改成table_old_0113,table_0113改名成table。?這會(huì)對應(yīng)用程序里頻繁訪問的表照成一定的中斷。?
注重:
源表上的建的索引和主鍵約束不能用上面介紹的1和2方法轉(zhuǎn)移過來,還需要手工來建索引和主鍵。?標(biāo)志種子和not?null的約束可以繼續(xù)過來。?導(dǎo)入視圖時(shí)會(huì)把源視圖里所有的真實(shí)數(shù)據(jù)導(dǎo)入成一個(gè)新表,而不是視圖。
?
?三、sql?server存儲(chǔ)過程或用戶定義的函數(shù)導(dǎo)出導(dǎo)入
?
?1、導(dǎo)出存儲(chǔ)過程或用戶定義的函數(shù)成*.sql文件?在sql?server企業(yè)管理器里選中源數(shù)據(jù)庫,?存儲(chǔ)過程->單選或者多選中要轉(zhuǎn)移的存儲(chǔ)過程->?用戶定義的函數(shù)->單選或者多選中要轉(zhuǎn)移的函數(shù)->?按鼠標(biāo)右鍵,選所有任務(wù)->生成sql腳本->確定->在自己的電腦硬盤中生成一個(gè)自定義的*.sql文件->?保存->正在生成sql腳本->成功?2、假如目的數(shù)據(jù)庫經(jīng)過防火墻,不在同一個(gè)局域網(wǎng)里,?要通過ftp或者remote?desktop或者pcanywhere等方法把第1步生成的*.sql文件傳到目的sql?server數(shù)據(jù)庫服務(wù)器上。?3、用查詢分析器進(jìn)入sql?server目的數(shù)據(jù)庫,?從菜單里選文件->打開->打開查詢文件->選中第1步生成的*.sql文件->點(diǎn)執(zhí)行查詢的綠色倒三角型快捷鍵->?查詢窗口里會(huì)出現(xiàn)執(zhí)行后的消息(有時(shí)候可能因?yàn)榇鎯?chǔ)過程和用戶定義的函數(shù)之間有一定的依靠關(guān)系,會(huì)報(bào)一些錯(cuò)。?最好先執(zhí)行用戶定義的函數(shù)的*.sql文件,再執(zhí)行存儲(chǔ)過程的*.sql文件)?
?
四、oracle數(shù)據(jù)庫里表導(dǎo)入sql?server數(shù)據(jù)庫
?
?1、在目的sql?server數(shù)據(jù)庫服務(wù)器上安裝oracle?client軟件或者oracle?odbc?driver.?在$oracle_homenetworkadmintnsnames.ora里配置oracle數(shù)據(jù)庫的別名(service?name)。?
?2、在win2000或者win2003服務(wù)器->管理工具->數(shù)據(jù)源(odbc)->?系統(tǒng)dsn(本機(jī)器上nt域用戶都可以用)->添加->oracle?odbc?driver->完成->?data?source?name?可以自定義,我一般填oracle數(shù)據(jù)庫的sid標(biāo)志,?description里可以填oracle數(shù)據(jù)庫具體描述,也可以不填->?data?source?service?name?填第1步定義的oracle數(shù)據(jù)庫別名->ok。?(用戶dsn和文件dsn也可以類似配置,但使用的時(shí)候有一些限制)
?3、sql?server的導(dǎo)入和導(dǎo)出數(shù)據(jù)工具里->選數(shù)據(jù)源->?數(shù)據(jù)源(其它(odbc數(shù)據(jù)源))->?選第2步在odbc里定義的系統(tǒng)dsn?source?name,用戶名密碼處填寫oracle系統(tǒng)的用戶名和密碼->?下一步->選擇目的,選sql?server數(shù)據(jù)庫(跟上面第二點(diǎn)講的一致,就不重復(fù)了)。
注重:
在oracle表和sql?server表之間'轉(zhuǎn)換'那步很重要,?可以改變默認(rèn)的字段數(shù)據(jù)類型,如image->text,decimal->int?
?
五、sql?server數(shù)據(jù)庫里表導(dǎo)入oracle數(shù)據(jù)庫
?
?方法一.導(dǎo)出目的選通過odbc數(shù)據(jù)源里定義的oracle數(shù)據(jù)庫,?注重oracle里表名都是大寫的.?我一般在oracle這邊先生成好表結(jié)構(gòu),再選擇sql?server源表往oracle目的表里追加數(shù)據(jù).?數(shù)據(jù)傳輸速度比方法二慢.?方法二.從sql?server數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)到oracle數(shù)據(jù)庫可以選擇用windows下oracle9i企業(yè)或者個(gè)人版數(shù)據(jù)庫做中轉(zhuǎn)。?
(?注重:oracle通過訪問sql?server的數(shù)據(jù)庫鏈接時(shí),用select?*?的時(shí)候字段名是用雙引號(hào)引起來的。)?
?
mysql數(shù)據(jù)庫導(dǎo)出和導(dǎo)入
1).mysqlimport的語法介紹:?
mysqlimport位于mysql/bin目錄中,是mysql的一個(gè)載入(或者說導(dǎo)入)數(shù)據(jù)的一個(gè)非常有效的工具。這是一個(gè)命令行工具。有兩個(gè)參數(shù)以及大量的選項(xiàng)可供選擇。這個(gè)工具把一個(gè)文本文件(text?file)導(dǎo)入到你指定的數(shù)據(jù)庫和表中。比方說我們要從文件customers.txt中把數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫meet_a_geek中的表custermers中:?
mysqlimport?meet_a_geek?customers.txt?
注重:這里customers.txt是我們要導(dǎo)入數(shù)據(jù)的文本文件,而meet_a_geek是我們要操作的數(shù)據(jù)庫,數(shù)據(jù)庫中的表名是customers,這里文本文件的數(shù)據(jù)格式必須與customers表中的記錄格式一致,否則mysqlimport命令將會(huì)出錯(cuò)。
其中表的名字是導(dǎo)入文件的第一個(gè)句號(hào)(.)前面文件字符串,另外一個(gè)例子:mysqlimport?meet_a_geek?cus.to.mers.txt
那么我們將把文件中的內(nèi)容導(dǎo)入到數(shù)據(jù)庫meet_a_geek?中的cus表中。?
上面的例子中,都只用到兩個(gè)參數(shù),并沒有用到更多的選項(xiàng),下面介紹mysqlimport的選項(xiàng)?
2).mysqlimport的常用選項(xiàng)介紹:?
選項(xiàng)?功能?
-d?or?--delete?新數(shù)據(jù)導(dǎo)入數(shù)據(jù)表中之前刪除數(shù)據(jù)數(shù)據(jù)表中的所有信息?
-f?or?--force?不管是否碰到錯(cuò)誤,mysqlimport將強(qiáng)制繼續(xù)插入數(shù)據(jù)?
-i?or?--ignore?mysqlimport跳過或者忽略那些有相同唯一要害字的行,?導(dǎo)入文件中的數(shù)據(jù)將被忽略。?
-l?or?-lock-tables?數(shù)據(jù)被插入之前鎖住表,這樣就防止了,你在更新數(shù)據(jù)庫時(shí),用戶的查詢和更新受到影響。?
-r?or?-replace?這個(gè)選項(xiàng)與-i選項(xiàng)的作用相反;此選項(xiàng)將替代表中有相同唯一要害字的記錄。?
--fields-enclosed-?by=?char?指定文本文件中數(shù)據(jù)的記錄時(shí)以什么括起的,?很多情況下數(shù)據(jù)以雙引號(hào)括起。?默認(rèn)的情況下數(shù)據(jù)是沒有被字符括起的。?
--fields-terminated-?by=char?指定各個(gè)數(shù)據(jù)的值之間的分隔符,在句號(hào)分隔的文件中,分隔符是句號(hào)。您可以用此選項(xiàng)指定數(shù)據(jù)之間的分隔符。
默認(rèn)的分隔符是跳格符(tab)?
--lines-terminated-?by=str?此選項(xiàng)指定文本文件中行與行之間數(shù)據(jù)的分隔字符串或者字符。?默認(rèn)的情況下mysqlimport以newline為行分隔符。?
您可以選擇用一個(gè)字符串來替代一個(gè)單個(gè)的字符:?
一個(gè)新行或者一個(gè)回車。?
mysqlimport命令常用的選項(xiàng)還有-v?顯示版本(version),-p?提示輸入密碼(password)等。?
3).例子:導(dǎo)入一個(gè)以逗號(hào)為分隔符的文件?
文件中行的記錄格式是這樣的:?
"1",?"ord89876",?"1?dozen?roses",?"19991226"?
我們的任務(wù)是要把這個(gè)文件里面的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫meet_a_geek中的表格orders中,我們使用這個(gè)命令:?
bin/mysqlimport?–prl?–fields-enclosed-by="?–fields-terminated-by=,?meet_a_geek?orders.txt?
這個(gè)命令可能看起來很不爽,不過當(dāng)你熟知了之后,這是非常簡單的。第一部分,bin/mysqlimport?,告訴操作系統(tǒng)你要運(yùn)行的命令是mysql/bin目錄下的mysqlimport,選項(xiàng)p是要求輸入密碼,這樣就要求你在改動(dòng)數(shù)據(jù)庫之前輸入密碼,操作起來會(huì)更安全。?我們用了r選項(xiàng)是因?yàn)槲覀兿胍驯碇械奈ㄒ灰ψ峙c文件記錄中有重復(fù)唯一要害字的記錄替換成文件中的數(shù)據(jù)。我們表單中的數(shù)據(jù)不是最新的,需要用文件中的數(shù)據(jù)去更新,因而就用r這個(gè)選項(xiàng),替代數(shù)據(jù)庫中已經(jīng)有的記錄。l選項(xiàng)的作用是在我們插入數(shù)據(jù)的時(shí)候鎖住表,這樣就阻止了用戶在我們更新表的時(shí)候?qū)Ρ磉M(jìn)行查詢或者更改的操作。
批處理是一種非交互式運(yùn)行mysql程序的方法,如同您在mysql中使用的命令一樣,你仍然將使用這些命令。?
為了實(shí)現(xiàn)批處理,您重定向一個(gè)文件到mysql程序中,首先我們需要一個(gè)文本文件,這個(gè)文本文件包含有與我們在mysql中輸入的命令相同的文本。?
比如我們要插入一些數(shù)據(jù),使用包含下面文本的文件(文件名為new_data.sql,當(dāng)然我們也可以取名為new_data.txt及任何其他的合法名字,并不一定要以后綴sql結(jié)尾):?
use?meet_a_geek;?
insert?into?customers?(customer_id,?last_name)?values(null,?"block");?
insert?into?customers?(customer_id,?last_name)?values(null,?"newton");?
insert?into?customers?(customer_id,?last_name)?values(null,?"simmons");?
注重上面的這些句子的語法都必須是正確的,并且每個(gè)句子以分號(hào)結(jié)束。?
上面的use命令選擇數(shù)據(jù)庫,insert命令插入數(shù)據(jù)。?
下面我們要把上面的文件導(dǎo)入到數(shù)據(jù)庫中,導(dǎo)入之前要確認(rèn)數(shù)據(jù)庫已經(jīng)在運(yùn)行,即是mysqld進(jìn)程(或者說服務(wù),windows?nt下面稱為”服務(wù)“,unix下面為”進(jìn)程“)已經(jīng)在運(yùn)行。?
然后運(yùn)行下面的命令:?
bin/mysql?–p?<?/home/mark/new_data.sql?
接著按提示輸入密碼,假如上面的文件中的語句沒有錯(cuò)誤,那么這些數(shù)據(jù)就被導(dǎo)入到了數(shù)據(jù)庫中。?
命令行中使用load?data?infile?從文件中導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫:?
現(xiàn)在您可能會(huì)問自己,"究竟為什么我要輸入所有的這些sql語句到文件中,然后通過程序運(yùn)行它們呢?”?
這樣看起來似乎需要大量的工作。很好,你這樣想很可能就對了。但是假如你有從所有這些命令中產(chǎn)生的log記錄呢?現(xiàn)在這樣就很棒,嗯,大多數(shù)數(shù)據(jù)庫都會(huì)自動(dòng)產(chǎn)生數(shù)據(jù)庫中的事件記錄的log。而大部分log都包含有用過的原始的sql命令。因此,假如您不能從您現(xiàn)在的數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù)到新的mysql數(shù)據(jù)庫中使用,那么您可以使用log和mysql的批處理特性,來快速且方便地導(dǎo)入您地?cái)?shù)據(jù)。當(dāng)然,這樣就省去了打字的麻煩。?
load?data?infile?
這是我們要介紹的最后一個(gè)導(dǎo)入數(shù)據(jù)到mysql數(shù)據(jù)庫中的方法。這個(gè)命令與mysqlimport非常相似,但這個(gè)方法可以在mysql命令行中使用。也就是說您可以在所有使用api的程序中使用這個(gè)命令。使用這種方法,您就可以在應(yīng)用程序中導(dǎo)入您想要導(dǎo)入的數(shù)據(jù)。?
使用這個(gè)命令之前,mysqld進(jìn)程(服務(wù))必須已經(jīng)在運(yùn)行。
啟動(dòng)mysql命令行:
bin/mysql?–p?
按提示輸入密碼,成功進(jìn)入mysql命令行之后,輸入下面的命令:
use?meet_a_geek;?
load?data?infile?"/home/mark/data.sql"?into?table?orders;?
簡單的講,這樣將會(huì)把文件data.sql中的內(nèi)容導(dǎo)入到表orders中,如mysqlimport工具一樣,這個(gè)命令也有一些可以選擇的參數(shù)。比如您需要把自己的電腦上的數(shù)據(jù)導(dǎo)入到遠(yuǎn)程的數(shù)據(jù)庫服務(wù)器中,您可以使用下面的命令:?
load?data?local?infile?"c:mydocssql.txt"?into?table?orders;?
上面的local參數(shù)表示文件是本地的文件,服務(wù)器是您所登陸的服務(wù)器。?
這樣就省去了使用ftp來上傳文件到服務(wù)器,mysql替你完成了.?
您也可以設(shè)置插入語句的優(yōu)先級,假如您要把它標(biāo)記為低優(yōu)先級(low_priority),那么mysql將會(huì)等到?jīng)]有其他人讀這個(gè)表的時(shí)候,才把插入數(shù)據(jù)??梢允褂萌缦碌拿?#xff1a;?
?load?data?low_priority?infile?"/home/mark/data.sql"?into?table?orders;?
您也可以指定是否在插入數(shù)據(jù)的時(shí)候,取代或者忽略文件與數(shù)據(jù)表中重復(fù)的鍵值。替代重復(fù)的鍵值的語法:?
load?data?low_priority?infile?"/home/mark/data.sql"?replace?into?table?orders;?
上面的句子看起來有點(diǎn)笨拙,但卻把要害字放在了讓您的剖析器可以理解的地方。?
下面的一對選項(xiàng)描述了文件的記錄格式,這些選項(xiàng)也是在mysqlimport工具中可以用的。他們在這里看起來有點(diǎn)不同。首先,要用到fields要害字,假如用到這個(gè)要害字,mysql剖析器希望看到至少有下面的一個(gè)選項(xiàng):
terminated?by?character?
?enclosed?by?character?
?escaped?by?character?
這些要害字與它們的參數(shù)跟mysqlimport中的用法是一樣的.?the?
?terminated?by?描述字段的分隔符,默認(rèn)情況下是tab字符(t)?
?enclosed?by描述的是字段的括起字符。比方以引號(hào)括起每一個(gè)字段。?
?escaped?by?描述的轉(zhuǎn)義字符。默認(rèn)的是反些杠(backslash:?).?
下面仍然使用前面的mysqlimport命令的例子,用load?data?infile語句把同樣的文件導(dǎo)入到數(shù)據(jù)庫中:?
load?data?infile?"/home/mark/orders.txt"?replace?into?table?orders?fields?terminated?by?','? enclosed?by?'"';?
load?data?infile語句中有一個(gè)mysqlimport工具中沒有特點(diǎn):?
load?data?infile?可以按指定的列把文件導(dǎo)入到數(shù)據(jù)庫中。?
當(dāng)我們要把數(shù)據(jù)的一部分內(nèi)容導(dǎo)入的時(shí)候,這個(gè)特點(diǎn)就很重要。比方說,我們要從access數(shù)據(jù)庫升級到mysql數(shù)據(jù)庫的時(shí)候,需要加入一些欄目(列/字段/field)到mysql數(shù)據(jù)庫中,以適應(yīng)一些額外的需要。?
這個(gè)時(shí)候,我們的access數(shù)據(jù)庫中的數(shù)據(jù)仍然是可用的,但是因?yàn)檫@些數(shù)據(jù)的欄目(field)與mysql中的不再匹配,因此而無法再使用mysqlimport工具。盡管如此,我們?nèi)匀豢梢允褂胠oad?data?infile,下面的例子顯示了如何向指定的欄目(field)中導(dǎo)入數(shù)據(jù):?
load?data?infile?"/home/order.txt"?into?table?orders(order_number,?order_date,?customer_id);?
如您所見,我們可以指定需要的欄目(fields)。這些指定的字段依然是以括號(hào)括起,由逗號(hào)分隔的,假如您遺漏了其中任何一個(gè),mysql將會(huì)提醒您^_^?
importing?data?from?microsoft?access?(從access中導(dǎo)入數(shù)據(jù),略)
您可以看到mysql有很多可以導(dǎo)入數(shù)據(jù)的方法,然而這些只是數(shù)據(jù)傳輸中的一半。另外的一般是從mysql數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù)。有許多的原因我們需要導(dǎo)出數(shù)據(jù)。一個(gè)重要的原因是用于備份數(shù)據(jù)庫。數(shù)據(jù)的造價(jià)經(jīng)常是昂貴的,需要謹(jǐn)慎處理它們。經(jīng)常地備份可以幫助防止寶貴數(shù)據(jù)地丟失;另外一個(gè)原因是,也許您希望導(dǎo)出數(shù)據(jù)來共享。?在這個(gè)信息技術(shù)不斷成長的世界中,共享數(shù)據(jù)變得越來越常見。?
比方說macmillan?usa維護(hù)護(hù)著一個(gè)將要出版的書籍的大型數(shù)據(jù)庫。這個(gè)數(shù)據(jù)庫在許多書店之間共享,這樣他們就知道哪些書將會(huì)很快出版。醫(yī)院越來越走向采用無紙病歷記錄,這樣這些病歷可以隨時(shí)跟著你。世界變得越來越小,信息也被共享得越來越多。有很多中導(dǎo)出數(shù)據(jù)得方法,它們都跟導(dǎo)入數(shù)據(jù)很相似。因?yàn)?#xff0c;究竟,這些都只是一種透視得方式。從數(shù)據(jù)庫導(dǎo)出的數(shù)據(jù)就是從另一端導(dǎo)入的數(shù)據(jù)。這里我們并不討論其他的數(shù)據(jù)庫各種各樣的導(dǎo)出數(shù)據(jù)的方法,您將學(xué)會(huì)如何用mysql來實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出。
使用mysqldump:?
mysqldump命令位于mysql/bin/目錄中?
mysqldump工具很多方面類似相反作用的工具mysqlimport。它們有一些同樣的選項(xiàng)。但mysqldump能夠做更多的事情。它可以把整個(gè)數(shù)據(jù)庫裝載到一個(gè)單獨(dú)的文本文件中。這個(gè)文件包含有所有重建您的數(shù)據(jù)庫所需要的sql命令。這個(gè)命令取得所有的模式(schema,后面有解釋)并且將其轉(zhuǎn)換成ddl語法(create語句,即數(shù)據(jù)庫定義語句),取得所有的數(shù)據(jù),并且從這些數(shù)據(jù)中創(chuàng)建insert語句。這個(gè)工具將您的數(shù)據(jù)庫中所有的設(shè)計(jì)倒轉(zhuǎn)。因?yàn)樗械臇|西都被包含到了一個(gè)文本文件中。這個(gè)文本文件可以用一個(gè)簡單的批處理和一個(gè)合適sql語句導(dǎo)回到mysql中。這個(gè)工具令人難以置信地簡單而快速。決不會(huì)有半點(diǎn)讓人頭疼地地方。?
因此,假如您像裝載整個(gè)數(shù)據(jù)庫meet_a_geek的內(nèi)容到一個(gè)文件中,可以使用下面的命令:?
?bin/mysqldump?–p?meet_a_geek?>?meetageek_dump_file.txt?
這個(gè)語句也答應(yīng)您指定一個(gè)表進(jìn)行dump(備份/導(dǎo)出/裝載?)。假如您只是希望把數(shù)據(jù)庫meet_a_geek中的表orders中的整個(gè)內(nèi)容導(dǎo)出到一個(gè)文件,可以使用下面的命令:?
?bin/mysqldump?–p?meet_a_geek?orders?>meetageek_orders.txt?
這個(gè)非常的靈活,您甚至可以使用where從句來選擇您需要的記錄導(dǎo)出到文件中。要達(dá)到這樣的目的,可以使用類似于下面的命令:?
?bin/mysqldump?–p?–where="order_id?>?2000"?meet_a_geek?orders?>?special_dump.txt?
mysqldump工具有大量的選項(xiàng),部分選項(xiàng)如下表:?
選項(xiàng)/option?作用/action?performed?
--add-drop-table?
?這個(gè)選項(xiàng)將會(huì)在每一個(gè)表的前面加上drop?table?if?exists語句,這樣可以保證導(dǎo)回mysql數(shù)據(jù)庫的時(shí)候不會(huì)出錯(cuò),因?yàn)槊看螌?dǎo)回的時(shí)候,都會(huì)首先檢查表是否存在,存在就刪除?
--add-locks?
?這個(gè)選項(xiàng)會(huì)在insert語句中捆上一個(gè)lock?table和unlock?table語句。這就防止在這些記錄被再次導(dǎo)入數(shù)據(jù)庫時(shí)其他用戶對表進(jìn)行的操作?
-c?or?-?complete_insert?
?這個(gè)選項(xiàng)使得mysqldump命令給每一個(gè)產(chǎn)生insert語句加上列(field)的名字。當(dāng)把數(shù)據(jù)導(dǎo)出導(dǎo)另外一個(gè)數(shù)據(jù)庫時(shí)這個(gè)選項(xiàng)很有用。?
--delayed-insert?在insert命令中加入delay選項(xiàng)?
?-f?or?-flush-logs?使用這個(gè)選項(xiàng),在執(zhí)行導(dǎo)出之前將會(huì)刷新mysql服務(wù)器的log.?
?-f?or?-force?使用這個(gè)選項(xiàng),即使有錯(cuò)誤發(fā)生,仍然繼續(xù)導(dǎo)出?
?--full?這個(gè)選項(xiàng)把附加信息也加到create?table的語句中?
?-l?or?-lock-tables?使用這個(gè)選項(xiàng),導(dǎo)出表的時(shí)候服務(wù)器將會(huì)給表加鎖。?
?-t?or?-no-create-?info?
?這個(gè)選項(xiàng)使的mysqldump命令不創(chuàng)建create?table語句,這個(gè)選項(xiàng)在您只需要數(shù)據(jù)而不需要ddl(數(shù)據(jù)庫定義語句)時(shí)很方便。?
-d?or?-no-data?這個(gè)選項(xiàng)使的mysqldump命令不創(chuàng)建insert語句。?
?在您只需要ddl語句時(shí),可以使用這個(gè)選項(xiàng)。?
?--opt?此選項(xiàng)將打開所有會(huì)提高文件導(dǎo)出速度和創(chuàng)造一個(gè)可以更快導(dǎo)入的文件的選項(xiàng)。?
?-q?or?-quick?這個(gè)選項(xiàng)使得mysql不會(huì)把整個(gè)導(dǎo)出的內(nèi)容讀入內(nèi)存再執(zhí)行導(dǎo)出,而是在讀到的時(shí)候就寫入導(dǎo)文件中。?
?-t?path?or?-tab?=?path?這個(gè)選項(xiàng)將會(huì)創(chuàng)建兩個(gè)文件,一個(gè)文件包含ddl語句或者表創(chuàng)建語句,另一個(gè)文件包含數(shù)據(jù)。ddl文件被命名為table_name.sql,數(shù)據(jù)文件被命名為table_name.txt.路徑名是存放這兩個(gè)文件的目錄。目錄必須已經(jīng)存在,并且命令的使用者有對文件的特權(quán)。?
-w?"where?clause"?or?-where?=?"where?clause?"?
?如前面所講的,您可以使用這一選項(xiàng)來過篩選將要放到導(dǎo)出文件的數(shù)據(jù)。?
假定您需要為一個(gè)表單中要用到的帳號(hào)建立一個(gè)文件,經(jīng)理要看今年(2004年)所有的訂單(orders),它們并不對ddl感愛好,并且需要文件有逗號(hào)分隔,因?yàn)檫@樣就很輕易導(dǎo)入到excel中。?為了完成這個(gè)人物,您可以使用下面的句子:?
bin/mysqldump?–p?–where?"order_date?>='2000-01-01'"?
?–tab?=?/home/mark?–no-create-info?–fields-terminated-by=,?meet_a_geek?orders?
?這將會(huì)得到您想要的結(jié)果。?
schema:模式the?set?of?statements,?expressed?in?data?definition?language,?that?completely?describe?the?structure?of?a?data?base.?
?一組以數(shù)據(jù)定義語言來表達(dá)的語句集,該語句集完整地描述了數(shù)據(jù)庫的結(jié)構(gòu)。
select?into?outfile?:?
假如您覺得mysqldump工具不夠酷,就使用select?into?outfile吧,?mysql同樣提供一個(gè)跟load?data?infile命令有相反作用的命令,這就是select?into?outfile?命令,這兩個(gè)命令有很多的相似之處。首先,它們有所有的選項(xiàng)幾乎相同?,F(xiàn)在您需要完成前面用mysqldump完成的功能,可以依照下面的步驟進(jìn)行操作:?
1.?確保mysqld進(jìn)程(服務(wù))已經(jīng)在運(yùn)行?
?2.?cd?/usr/local/mysql?
?3.?bin/mysqladmin?ping?;//?假如這個(gè)句子通不過,可以用這個(gè):mysqladmin?-u?root?-p?ping?
mysqladmin?ping用于檢測mysqld的狀態(tài),is?alive說明正在運(yùn)行,出錯(cuò)則可能需要用戶名和密碼。?
?4.?啟動(dòng)mysql?監(jiān)聽程序.?
?5.?bin/mysql?–p?meet_a_geek;//?進(jìn)入mysql命令行,并且打開數(shù)據(jù)庫meet_a_geek,需要輸入密碼?
?6.?在命令行中,輸入一下命令:?
select?*?into?outfile?'/home/mark/orders.txt'?
?fields?
?terminated?by?=?','?
?from?orders?
?where?order_date?>=?'2000-01-01'?
在你按了return(回車)之后,文件就創(chuàng)建了。這個(gè)句子就像一個(gè)規(guī)則的select語句,只是把想屏幕的輸出重定向到了文件中。這意味這您可以使用join來實(shí)現(xiàn)多表的高級查詢。這個(gè)特點(diǎn)也可以被用作一個(gè)報(bào)表產(chǎn)生器。?
比方說,您可以組合這一章中討論的方法來產(chǎn)生一個(gè)非常有趣的查詢,試試這個(gè):?
在mysql目錄建立一個(gè)名為report_g.rpt?的文本文件,加入下面的行:?
use?meet_a_geek;?
?insert?into?customers?(customer_id,?last_name,?first_name)?
?values?(null,?"kinnard",?"vicky");?
?insert?into?customers?(customer_id,?last_name,?first_name)?
?values?(null,?"kinnard",?"steven");?
?insert?into?customers?(customer_id,?last_name,?first_name)?
?values?(null,?"brown",?"sam");?
?select?last_name?into?outfile?'/home/mark/report.rpt'?
?from?customers?where?customer_id?>?1;?
然后確認(rèn)?mysql進(jìn)程在運(yùn)行,并且您在mysql目錄中,?輸入下面的命令:?
bin/mysql?<?report_g.rpt檢查您命名作為輸出的文件,這個(gè)文件將會(huì)包含所有您在customers表中輸入的顧客的姓。?如您所見,您可以使用今天學(xué)到的導(dǎo)入/導(dǎo)出(import/export)的方法來幫助得到報(bào)表。?查看全文?
關(guān)于mssql數(shù)據(jù)庫的字段
?
數(shù)據(jù)類型是數(shù)據(jù)的一種屬性,表示數(shù)據(jù)所表示信息的類型。任何一種計(jì)算機(jī)語言都定義了自己的數(shù)據(jù)類型。當(dāng)然,不同的程序語言都具有不同的特點(diǎn),所定義的數(shù)據(jù)類型的各類和名稱都或多或少有些不同。sqlserver提供了25種數(shù)據(jù)類型:
·binary[(n)]
·varbinary[(n)]
·char[(n)]
·varchar[(n)]
·nchar[(n)]
·nvarchar[(n)]
·datetime
·smalldatetime
·decimal[(p[,s])]
·numeric[(p[,s])]
·float[(n)]
·real
·int
·smallint
·tinyint
·money
·smallmoney
·bit
·cursor
·sysname
·timestamp
·uniqueidentifier
·text
·image
·ntext
(1)二進(jìn)制數(shù)據(jù)類型
二進(jìn)制數(shù)據(jù)包括binary、varbinary和image
binary數(shù)據(jù)類型既可以是固定長度的(binary),也可以是變長度的。
binary[(n)]是n位固定的二進(jìn)制數(shù)據(jù)。其中,n的取值范圍是從1到8000。其存儲(chǔ)窨的大小是n+4個(gè)字節(jié)。
varbinary[(n)]是n位變長度的二進(jìn)制數(shù)據(jù)。其中,n的取值范圍是從1到8000。其存儲(chǔ)窨的大小是n+4個(gè)字節(jié),不是n個(gè)字節(jié)。
在image數(shù)據(jù)類型中存儲(chǔ)的數(shù)據(jù)是以位字符串存儲(chǔ)的,不是由sqlserver解釋的,必須由應(yīng)用程序來解釋。例如,應(yīng)用程序可以使用bmp、tief、gif和jpeg格式把數(shù)據(jù)存儲(chǔ)在image數(shù)據(jù)類型中。
(2)字符數(shù)據(jù)類型
字符數(shù)據(jù)的類型包括char,varchar和text
字符數(shù)據(jù)是由任何字母、符號(hào)和數(shù)字任意組合而成的數(shù)據(jù)。
varchar是變長字符數(shù)據(jù),其長度不超過8kb。char是定長字符數(shù)據(jù),其長度最多為8kb。超過8kb的ascii數(shù)據(jù)可以使用text數(shù)據(jù)類型存儲(chǔ)。例如,因?yàn)閔tml文檔全部都是ascii字符,并且在一般情況下長度超過8kb,所以這些文檔可以text數(shù)據(jù)類型存儲(chǔ)在sqlserver中。
(3)unicode數(shù)據(jù)類型
unicode數(shù)據(jù)類型包括nchar,nvarchar和ntext
在microsoftsqlserver中,傳統(tǒng)的非unicode數(shù)據(jù)類型答應(yīng)使用由特定字符集定義的字符。在sqlserver安裝過程中,答應(yīng)選擇一種字符集。使用unicode數(shù)據(jù)類型,列中可以存儲(chǔ)任何由unicode標(biāo)準(zhǔn)定義的字符。在unicode標(biāo)準(zhǔn)中,包括了以各種字符集定義的全部字符。使用unicode數(shù)據(jù)類型,所戰(zhàn)勝的窨是使用非unicode數(shù)據(jù)類型所占用的窨大小的兩倍。
在sqlserver中,unicode數(shù)據(jù)以nchar、nvarchar和ntext數(shù)據(jù)類型存儲(chǔ)。使用這種字符類型存儲(chǔ)的列可以存儲(chǔ)多個(gè)字符集中的字符。當(dāng)列的長度變化時(shí),應(yīng)該使用nvarchar字符類型,這時(shí)最多可以存儲(chǔ)4000個(gè)字符。當(dāng)列的長度固定不變時(shí),應(yīng)該使用nchar字符類型,同樣,這時(shí)最多可以存儲(chǔ)4000個(gè)字符。當(dāng)使用ntext數(shù)據(jù)類型時(shí),該列可以存儲(chǔ)多于4000個(gè)字符。
(4)日期和時(shí)間數(shù)據(jù)類型
日期和時(shí)間數(shù)據(jù)類型包括datetime和smalldatetime兩種類型
日期和時(shí)間數(shù)據(jù)類型由有效的日期和時(shí)間組成。例如,有效的日期和時(shí)間數(shù)據(jù)包括“4/01/9812:15:00:00:00pm”和“1:28:29:15:01am8/17/98”。前一個(gè)數(shù)據(jù)類型是日期在前,時(shí)間在后一個(gè)數(shù)據(jù)類型是霎時(shí)間在前,日期在后。在microsoftsqlserver中,日期和時(shí)間數(shù)據(jù)類型包括datetime和smalldatetime兩種類型時(shí),所存儲(chǔ)的日期范圍是從1753年1月1日開始,到9999年12月31日結(jié)束(每一個(gè)值要求8個(gè)存儲(chǔ)字節(jié))。使用smalldatetime數(shù)據(jù)類型時(shí),所存儲(chǔ)的日期范圍是1900年1月1日開始,到2079年12月31日結(jié)束(每一個(gè)值要求4個(gè)存儲(chǔ)字節(jié))。
日期的格式可以設(shè)定。設(shè)置日期格式的命令如下:
setdateformat{format|@format_var|
其中,format|@format_var是日期的順序。有效的參數(shù)包括mdy、dmy、ymd、ydm、myd和dym。在默認(rèn)情況下,日期格式為mdy。
例如,當(dāng)執(zhí)行setdateformatymd之后,日期的格式為年月日形式;當(dāng)執(zhí)行setdateformatdmy之后,日期的格式為日月有年形式
(5)數(shù)字?jǐn)?shù)據(jù)類型
數(shù)字?jǐn)?shù)據(jù)只包含數(shù)字。數(shù)字?jǐn)?shù)據(jù)類型包括正數(shù)和負(fù)數(shù)、小數(shù)(浮點(diǎn)數(shù))和整數(shù)
整數(shù)由正整數(shù)和負(fù)整數(shù)組成,例如39、25、0-2和33967。在micrsoftsqlserver中,整數(shù)存儲(chǔ)的數(shù)據(jù)類型是 int,smallint和tinyint。int數(shù)據(jù)類型存儲(chǔ)數(shù)據(jù)的范圍大于smallint數(shù)據(jù)類型存儲(chǔ)數(shù)據(jù)的范圍,而smallint據(jù)類型存儲(chǔ)數(shù)據(jù)的范圍大于tinyint數(shù)據(jù)類型存儲(chǔ)數(shù)據(jù)的范圍。使用int數(shù)據(jù)狗昔存儲(chǔ)數(shù)據(jù)的范圍是從-2147483648到2147483647(每一個(gè)值要求4個(gè)字節(jié)存儲(chǔ)空間)。使用smallint數(shù)據(jù)類型時(shí),存儲(chǔ)數(shù)據(jù)的范圍從-32768到32767(每一個(gè)值要求2個(gè)字節(jié)存儲(chǔ)空間)。使用tinyint數(shù)據(jù)類型時(shí),存儲(chǔ)數(shù)據(jù)的范圍是從0到255(每一個(gè)值要求1個(gè)字節(jié)存儲(chǔ)空間)。
精確小婁數(shù)據(jù)在sqlserver中的數(shù)據(jù)類型是decimal和numeric。這種數(shù)據(jù)所占的存儲(chǔ)空間根據(jù)該數(shù)據(jù)的位數(shù)后的位數(shù)來確定。
在sqlserver中,近似小數(shù)數(shù)據(jù)的數(shù)據(jù)類型是float和real。例如,三分之一這個(gè)分?jǐn)?shù)記作。3333333,當(dāng)使用近似數(shù)據(jù)類型時(shí)能正確表示。因此,從系統(tǒng)中檢索到的數(shù)據(jù)可能與存儲(chǔ)在該列中數(shù)據(jù)不完全一樣。
(6)貨幣數(shù)據(jù)表示正的或者負(fù)的貨幣數(shù)量。
在microsoftsqlserver中,貨幣數(shù)據(jù)的數(shù)據(jù)類型是money和smallmoney
money數(shù)據(jù)類型要求8個(gè)存儲(chǔ)字節(jié),smallmoney數(shù)據(jù)類型要求4個(gè)存儲(chǔ)字節(jié)。
(7)非凡數(shù)據(jù)類型
非凡數(shù)據(jù)類型包括前面沒有提過的數(shù)據(jù)類型。非凡的數(shù)據(jù)類型有3種,即 timestamp、bit和uniqueidentifier。
timestamp用于表示sqlserver活動(dòng)的先后順序,以二進(jìn)投影的格式表示。timestamp數(shù)據(jù)與插入數(shù)據(jù)或者日期和時(shí)間沒有關(guān)系。
bit由1或者0組成。當(dāng)表示真或者假、on或者off時(shí),使用bit數(shù)據(jù)類型。例如,詢問是否是每一次訪問的客戶機(jī)請求可以存儲(chǔ)在這種數(shù)據(jù)類型的列中。
uniqueidentifier由16字節(jié)的十六進(jìn)制數(shù)字組成,表示一個(gè)全局唯一的。當(dāng)表的記錄行要求唯一時(shí),guid是非常有用。例如,在客戶標(biāo)識(shí)號(hào)列使用這種數(shù)據(jù)類型可以區(qū)別不同的客戶。
2.用戶定義的數(shù)據(jù)類型
用戶定義的數(shù)據(jù)類型基于在microsoftsqlserver中提供的數(shù)據(jù)類型。當(dāng)幾個(gè)表中必須存儲(chǔ)同一種數(shù)據(jù)類型時(shí),并且為保證這些列有相同的數(shù)據(jù)類型、長度和可空性時(shí),可以使用用戶定義的數(shù)據(jù)類型。例如,可定義一種稱為 postal_code的數(shù)據(jù)類型,它基于char數(shù)據(jù)類型。
當(dāng)創(chuàng)建用戶定義的數(shù)據(jù)類型時(shí),必須提供三個(gè)數(shù):數(shù)據(jù)類型的名稱、所基于的系統(tǒng)數(shù)據(jù)類型和數(shù)據(jù)類型的可空性。
(1)創(chuàng)建用戶定義的數(shù)據(jù)類型
創(chuàng)建用戶定義的數(shù)據(jù)類型可以使用transact-sql語句。系統(tǒng)存儲(chǔ)過程sp_addtype可以來創(chuàng)建用戶定義的數(shù)據(jù)類型。其語法形式如下:
sp_addtype{type},[,system_data_bype][,'null_type']
其中,type是用戶定義的數(shù)據(jù)類型的名稱。system_data_type是系統(tǒng)提供的數(shù)據(jù)類型,例如decimal、int、char 等等。null_type表示該數(shù)據(jù)類型是如何處理空值的,必須使用單引號(hào)引起來,例如'null'、'notnull'或者'nonull'。
例子:
usecust
execsp_addtypessn,'varchar(11)',"notnull'
創(chuàng)建一個(gè)用戶定義的數(shù)據(jù)類型ssn,其基于的系統(tǒng)數(shù)據(jù)類型是變長為11的字符,不答應(yīng)空。
例子:
usecust
execsp_addtypebirthday,datetime,'null'
創(chuàng)建一個(gè)用戶定義的數(shù)據(jù)類型birthday,其基于的系統(tǒng)數(shù)據(jù)類型是datetime,答應(yīng)空。
例子:
usemaster
execsp_addtypetelephone,'varchar(24),'notnull'
eexcsp_addtypefax,'varchar(24)','null'
創(chuàng)建兩個(gè)數(shù)據(jù)類型,即telephone和fax
(2)刪除用戶定義的數(shù)據(jù)類型
當(dāng)用戶定義的數(shù)據(jù)類型不需要時(shí),可刪除。刪除用戶定義的數(shù)據(jù)類型的命令是sp_droptype{'type'}。
例子:
usemaster
execsp_droptype'ssn'
注重:當(dāng)表中的列還正在使用用戶定義的數(shù)據(jù)類型時(shí),或者在其上面還綁定有默認(rèn)或者規(guī)則時(shí),這種用戶定義的數(shù)據(jù)類型不能刪除。
sqlserver的字段類型說明
以下為sql?server7.0以上版本的字段類型說明。sql?server6.5的字段類型說明請參考sql?server提供的說明。?
字段類型
?描述
?
bit?0或1的整型數(shù)字?
int?從-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型數(shù)字?
smallint?從-2^15(-32,768)到2^15(32,767)的整型數(shù)字?
tinyint?從0到255的整型數(shù)字?
?
?
decimal?從-10^38到10^38-1的定精度與有效位數(shù)的數(shù)字?
numeric?decimal的同義詞?
?
?
money?從-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的貨幣數(shù)據(jù),最小貨幣單位千分之十?
smallmoney?從-214,748.3648到214,748.3647的貨幣數(shù)據(jù),最小貨幣單位千分之十?
?
?
float?從-1.79e+308到1.79e+308可變精度的數(shù)字?
real?從-3.04e+38到3.04e+38可變精度的數(shù)字?
?
?
datetime?從1753年1月1日到9999年12日31的日期和時(shí)間數(shù)據(jù),最小時(shí)間單位為百分之三秒或3.33毫秒?
smalldatetime?從1900年1月1日到2079年6月6日的日期和時(shí)間數(shù)據(jù),最小時(shí)間單位為分鐘?
?
?
timestamp?時(shí)間戳,一個(gè)數(shù)據(jù)庫寬度的唯一數(shù)字?
uniqueidentifier?全球唯一標(biāo)識(shí)符guid?
?
?
char?定長非unicode的字符型數(shù)據(jù),最大長度為8000?
varchar?變長非unicode的字符型數(shù)據(jù),最大長度為8000?
text?變長非unicode的字符型數(shù)據(jù),最大長度為2^31-1(2g)?
?
?
nchar?定長unicode的字符型數(shù)據(jù),最大長度為8000?
nvarchar?變長unicode的字符型數(shù)據(jù),最大長度為8000?
ntext?變長unicode的字符型數(shù)據(jù),最大長度為2^31-1(2g)?
?
?
binary?定長二進(jìn)制數(shù)據(jù),最大長度為8000?
varbinary?變長二進(jìn)制數(shù)據(jù),最大長度為8000?
image?變長二進(jìn)制數(shù)據(jù),最大長度為2^31-1(2g)?
--語?句 功?能
--數(shù)據(jù)操作
select --從數(shù)據(jù)庫表中檢索數(shù)據(jù)行和列
insert --向數(shù)據(jù)庫表添加新數(shù)據(jù)行
delete --從數(shù)據(jù)庫表中刪除數(shù)據(jù)行
update --更新數(shù)據(jù)庫表中的數(shù)據(jù)?
--數(shù)據(jù)定義?
create?table --創(chuàng)建一個(gè)數(shù)據(jù)庫表
drop?table ?--從數(shù)據(jù)庫中刪除表?
alter?table ?--修改數(shù)據(jù)庫表結(jié)構(gòu)
create?view ?--創(chuàng)建一個(gè)視圖?
drop?view ?--從數(shù)據(jù)庫中刪除視圖
create?index --為數(shù)據(jù)庫表創(chuàng)建一個(gè)索引
drop?index ?--從數(shù)據(jù)庫中刪除索引?
create?procedure ?--創(chuàng)建一個(gè)存儲(chǔ)過程?
drop?procedure --從數(shù)據(jù)庫中刪除存儲(chǔ)過程
create?trigger --創(chuàng)建一個(gè)觸發(fā)器?
drop?trigger --從數(shù)據(jù)庫中刪除觸發(fā)器
create?schema --向數(shù)據(jù)庫添加一個(gè)新模式
drop?schema ?--從數(shù)據(jù)庫中刪除一個(gè)模式
create?domain --創(chuàng)建一個(gè)數(shù)據(jù)值域
alter?domain --改變域定義
drop?domain ?--從數(shù)據(jù)庫中刪除一個(gè)域
--數(shù)據(jù)控制?
grant --授予用戶訪問權(quán)限
deny --拒絕用戶訪問?
revoke --解除用戶訪問權(quán)限
--事務(wù)控制
commit --結(jié)束當(dāng)前事務(wù)
rollback ?--中止當(dāng)前事務(wù)?
set?transaction --定義當(dāng)前事務(wù)數(shù)據(jù)訪問特征
--程序化sql?
declare --為查詢設(shè)定游標(biāo)?
explan --為查詢描述數(shù)據(jù)訪問計(jì)劃
open --檢索查詢結(jié)果打開一個(gè)游標(biāo)
fetch --檢索一行查詢結(jié)果?
close --關(guān)閉游標(biāo)
prepare --為動(dòng)態(tài)執(zhí)行預(yù)備sql?語句?
execute --動(dòng)態(tài)地執(zhí)行sql?語句
describe ?--描述預(yù)備好的查詢?
---局部變量
declare?@id?char(10)?
--set?@id?=?’10010001’?
select?@id?=?’10010001’
---全局變量?
---必須以@@開頭
mssql常用匯總
?
下列語句部分是mssql語句,不可以在access中使用。
sql分類:?
ddl—數(shù)據(jù)定義語言(create,alter,drop,declare)?
dml—數(shù)據(jù)操縱語言(select,delete,update,insert)?
dcl—數(shù)據(jù)控制語言(grant,revoke,commit,rollback)
首先,簡要介紹基礎(chǔ)語句:
1、說明:創(chuàng)建數(shù)據(jù)庫
create?database?database-name?
2、說明:刪除數(shù)據(jù)庫
drop?database?dbname
3、說明:備份sql?server
---?創(chuàng)建?備份數(shù)據(jù)的?device
use?master
exec?sp_addumpdevice?'disk',?'testback',?'c:mssql7backupmynwind_1.dat'
---?開始?備份
backup?database?pubs?to?testback?
4、說明:創(chuàng)建新表
create?table?tabname(col1?type1?[not?null]?[primary?key],col2?type2?[not?null],..)
根據(jù)已有的表創(chuàng)建新表:?
a:create?table?tab_new?like?tab_old?(使用舊表創(chuàng)建新表)
b:create?table?tab_new?as?select?col1,col2…?from?tab_old?definition?only
5、說明:刪除新表drop?table?tabname?
6、說明:增加一個(gè)列
alter?table?tabname?add?column?col?type
注:列增加后將不能刪除。db2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長度。
7、說明:添加主鍵:?alter?table?tabname?add?primary?key(col)?
說明:刪除主鍵:?alter?table?tabname?drop?primary?key(col)?
8、說明:創(chuàng)建索引:create?[unique]?index?idxname?on?tabname(col….)?
刪除索引:drop?index?idxname
注:索引是不可更改的,想更改必須刪除重新建。
9、說明:創(chuàng)建視圖:create?view?viewname?as?select?statement?
刪除視圖:drop?view?viewname
10、說明:幾個(gè)簡單的基本的sql語句
選擇:select?*?from?table1?where?范圍
插入:insert?into?table1(field1,field2)?values(value1,value2)
刪除:delete?from?table1?where?范圍
更新:update?table1?set?field1=value1?where?范圍
查找:select?*?from?table1?where?field1?like?’%value1%’?---like的語法很精妙,查資料!
排序:select?*?from?table1?order?by?field1,field2?[desc]
總數(shù):select?count(*)?as?totalcount?from?table1
求和:select?sum(field1)?as?sumvalue?from?table1
平均:select?avg(field1)?as?avgvalue?from?table1
最大:select?max(field1)?as?maxvalue?from?table1
最小:select?min(field1)?as?minvalue?from?table1
11、說明:幾個(gè)高級查詢運(yùn)算詞
a:?union?運(yùn)算符?
union?運(yùn)算符通過組合其他兩個(gè)結(jié)果表(例如?table1?和?table2)并消去表中任何重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng)?all?隨?union?一起使用時(shí)(即?union?all),不消除重復(fù)行。兩種情況下,派生表的每一行不是來自?table1?就是來自?table2。?
b:?except?運(yùn)算符?
except?運(yùn)算符通過包括所有在?table1?中但不在?table2?中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng)?all?隨?except?一起使用時(shí)?(except?all),不消除重復(fù)行。?
c:?intersect?運(yùn)算符
intersect?運(yùn)算符通過只包括?table1?和?table2?中都有的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng)?all?隨?intersect?一起使用時(shí)?(intersect?all),不消除重復(fù)行。?
注:使用運(yùn)算詞的幾個(gè)查詢結(jié)果行必須是一致的。?
12、說明:使用外連接?
a、left?outer?join:?
左外連接(左連接):結(jié)果集幾包括連接表的匹配行,也包括左連接表的所有行。?
sql:?select?a.a,?a.b,?a.c,?b.c,?b.d,?b.f?from?a?left?out?join?b?on?a.a?=?b.c
b:right?outer?join:?
右外連接(右連接):結(jié)果集既包括連接表的匹配連接行,也包括右連接表的所有行。?
c:full?outer?join:?
全外連接:不僅包括符號(hào)連接表的匹配行,還包括兩個(gè)連接表中的所有記錄。
其次,大家來看一些不錯(cuò)的sql語句
1、說明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a?新表名:b)?(access可用)
法一:select?*?into?b?from?a?where?1<>1
法二:select?top?0?*?into?b?from?a
2、說明:拷貝表(拷貝數(shù)據(jù),源表名:a?目標(biāo)表名:b)?(access可用)
insert?into?b(a,?b,?c)?select?d,e,f?from?b;
3、說明:跨數(shù)據(jù)庫之間表的拷貝(具體數(shù)據(jù)使用絕對路徑)?(access可用)
insert?into?b(a,?b,?c)?select?d,e,f?from?b?in?‘具體數(shù)據(jù)庫’?where?條件
例子:..from?b?in?'"&server.mappath(".")&"data.mdb"?&"'?where..
4、說明:子查詢(表名1:a?表名2:b)
select?a,b,c?from?a?where?a?in?(select?d?from?b?)?或者:?select?a,b,c?from?a?where?a?in?(1,2,3)
5、說明:顯示文章、提交人和最后回復(fù)時(shí)間
select?a.title,a.username,b.adddate?from?table?a,(select?max(adddate)?adddate?from?table?where?table.title=a.title)?b
6、說明:外連接查詢(表名1:a?表名2:b)
select?a.a,?a.b,?a.c,?b.c,?b.d,?b.f?from?a?left?out?join?b?on?a.a?=?b.c
7、說明:在線視圖查詢(表名1:a?)
select?*?from?(select?a,b,c?from?a)?t?where?t.a?>?1;
8、說明:between的用法,between限制查詢數(shù)據(jù)范圍時(shí)包括了邊界值,not?between不包括
select?*?from?table1?where?time?between?time1?and?time2
select?a,b,c,?from?table1?where?a?not?between?數(shù)值1?and?數(shù)值2
9、說明:in?的使用方法
select?*?from?table1?where?a?[not]?in?(‘值1’,’值2’,’值4’,’值6’)
10、說明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息?
delete?from?table1?where?not?exists?(?select?*?from?table2?where?table1.field1=table2.field1?)
11、說明:四表聯(lián)查問題:
select?*?from?a?left?inner?join?b?on?a.a=b.b?right?inner?join?c?on?a.a=c.c?inner?join?d?on?a.a=d.d?where?.....
12、說明:日程安排提前五分鐘提醒?
sql:?select?*?from?日程安排?where?datediff('minute',f開始時(shí)間,getdate())>5
13、說明:一條sql?語句搞定數(shù)據(jù)庫分頁
select?top?10?b.*?from?(select?top?20?主鍵字段,排序字段?from?表名?order?by?排序字段?desc)?a,表名?b?where?b.主鍵字段?=?a.主鍵字段?order?by?a.排序字段
14、說明:前10條記錄
select?top?10?*?form?table1?where?范圍
15、說明:選擇在每一組b值相同的數(shù)據(jù)中對應(yīng)的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產(chǎn)品分析,按科目成績排名,等等.)
select?a,b,c?from?tablename?ta?where?a=(select?max(a)?from?tablename?tb?where?tb.b=ta.b)
16、說明:包括所有在?tablea?中但不在?tableb和tablec?中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表
(select?a?from?tablea?)?except?(select?a?from?tableb)?except?(select?a?from?tablec)
17、說明:隨機(jī)取出10條數(shù)據(jù)
select?top?10?*?from?tablename?order?by?newid()
18、說明:隨機(jī)選擇記錄
select?newid()
19、說明:刪除重復(fù)記錄
delete?from?tablename?where?id?not?in?(select?max(id)?from?tablename?group?by?col1,col2,...)
20、說明:列出數(shù)據(jù)庫里所有的表名
select?name?from?sysobjects?where?type='u'?
21、說明:列出表里的所有的
select?name?from?syscolumns?where?id=object_id('tablename')
22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實(shí)現(xiàn)多重選擇,類似select?中的case。
select?type,sum(case?vender
select??表名=case?when?a.colorder=1?then?d.name?else?''?end,?
???????字段序號(hào)=a.colorder,?字段名=a.name,?標(biāo)識(shí)=case?when?columnproperty(?a.id,a.name,'isidentity')=1?then?'√'else?''?end,?
????????主鍵=case?when?exists(select?1?from?sysobjects?where?xtype='pk'?and?name?in?
?????????????????????????????(??select?name?from?sysindexes?where?indid?in
?????????????????????????????(???select?indid?from?sysindexkeys?where?id?=?a.id?and?colid=a.colid??)))?then?'√'?else?''?end,?
??????????????????????????????類型=b.name,?占用字節(jié)數(shù)=a.length,?長度=columnproperty(a.id,a.name,'precision'),?
?????????????????小數(shù)位數(shù)=isnull(columnproperty(a.id,a.name,'scale'),0),?答應(yīng)空=case?when?a.isnullable=1?then?'√'else?''?end,?
??????????????????默認(rèn)值=isnull(e.text,''),?字段說明=isnull(g.[value],'')
?from?syscolumns?a?left?join?systypes?b?on?a.xtype=b.xusertype?inner?join?sysobjects?d?on?a.id=d.id??
?and?d.xtype='u'?and??d.name<>'dtproperties'?left?join?syscomments?e?on?a.cdefault=e.id?
?left?join?sysproperties?g?on?a.id=g.id?and?a.colid=g.smallid??order?by?a.id,a.colorder
--數(shù)據(jù)操作
select?--從數(shù)據(jù)庫表中檢索數(shù)據(jù)行和列
insert?--向數(shù)據(jù)庫表添加新數(shù)據(jù)行
delete?--從數(shù)據(jù)庫表中刪除數(shù)據(jù)行
update?--更新數(shù)據(jù)庫表中的數(shù)據(jù)
--數(shù)據(jù)定義
create?table?--創(chuàng)建一個(gè)數(shù)據(jù)庫表
drop?table?--從數(shù)據(jù)庫中刪除表
alter?table?--修改數(shù)據(jù)庫表結(jié)構(gòu)
create?view?--創(chuàng)建一個(gè)視圖
drop?view?--從數(shù)據(jù)庫中刪除視圖
create?index?--為數(shù)據(jù)庫表創(chuàng)建一個(gè)索引
drop?index?--從數(shù)據(jù)庫中刪除索引
create?procedure?--創(chuàng)建一個(gè)存儲(chǔ)過程
?
drop?procedure?--從數(shù)據(jù)庫中刪除存儲(chǔ)過程
create?trigger?--創(chuàng)建一個(gè)觸發(fā)器
drop?trigger?--從數(shù)據(jù)庫中刪除觸發(fā)器
create?schema?--向數(shù)據(jù)庫添加一個(gè)新模式
drop?schema?--從數(shù)據(jù)庫中刪除一個(gè)模式
create?domain?--創(chuàng)建一個(gè)數(shù)據(jù)值域
alter?domain?--改變域定義
drop?domain?--從數(shù)據(jù)庫中刪除一個(gè)域
--數(shù)據(jù)控制
grant?--授予用戶訪問權(quán)限
deny?--拒絕用戶訪問
revoke?--解除用戶訪問權(quán)限
--事務(wù)控制
commit?--結(jié)束當(dāng)前事務(wù)
rollback?--中止當(dāng)前事務(wù)
set?transaction?--定義當(dāng)前事務(wù)數(shù)據(jù)訪問特征
--程序化sql
declare?--為查詢設(shè)定游標(biāo)
explan?--為查詢描述數(shù)據(jù)訪問計(jì)劃
open?--檢索查詢結(jié)果打開一個(gè)游標(biāo)
fetch?--檢索一行查詢結(jié)果
close?--關(guān)閉游標(biāo)
prepare?--為動(dòng)態(tài)執(zhí)行預(yù)備sql?語句
execute?--動(dòng)態(tài)地執(zhí)行sql?語句
describe?--描述預(yù)備好的查詢?
---局部變量
declare?@id?char(10)
--set?@id?=?'10010001'
select?@id?=?'10010001'?
---全局變量
---必須以@@開頭
--if?else
declare?@x?int?@y?int?@z?int
select?@x?=?1?@y?=?2?@z=3
if?@x?>?@y
print?'x?>?y'?--打印字符串'x?>?y'
else?if?@y?>?@z
print?'y?>?z'
else?print?'z?>?y'
--case
use?pangu
update?employee
set?e_wage?=
case
when?job_level?=?’1’?then?e_wage*1.08
when?job_level?=?’2’?then?e_wage*1.07
when?job_level?=?’3’?then?e_wage*1.06
else?e_wage*1.05
end
--while?continue?break
declare?@x?int?@y?int?@c?int
select?@x?=?1?@y=1
while?@x?<?3
begin
print?@x?--打印變量x?的值
while?@y?<?3
begin
select?@c?=?100*@x?+?@y
print?@c?--打印變量c?的值
select?@y?=?@y?+?1
end
select?@x?=?@x?+?1
select?@y?=?1
end
--waitfor
--例?等待1?小時(shí)2?分零3?秒后才執(zhí)行select?語句
waitfor?delay?’01:02:03’
select?*?from?employee
--例?等到晚上11?點(diǎn)零8?分后才執(zhí)行select?語句
waitfor?time?’23:08:00’
select?*?from?employee
***select***
select?*(列名)?from?table_name(表名)?where?column_name?operator?value
ex:(宿主)
select?*?from?stock_information?where?stockid?=?str(nid)
stockname?=?'str_name'?
stockname?like?'%?find?this?%'?
stockname?like?'[a-za-z]%'?---------?([]指定值的范圍)
stockname?like?'[^f-m]%'?---------?(^排除指定范圍)
---------?只能在使用like要害字的where子句中使用通配符)
or?stockpath?=?'stock_path'
or?stocknumber?<?1000
and?stockindex?=?24
not?stock***?=?'man'
stocknumber?between?20?and?100
stocknumber?in(10,20,30)
order?by?stockid?desc(asc)?---------?排序,desc-降序,asc-升序
order?by?1,2?---------?by列號(hào)
stockname?=?(select?stockname?from?stock_information?where?stockid?=?4)
---------?子查詢
---------?除非能確保內(nèi)層select只返回一個(gè)行的值,
---------?否則應(yīng)在外層where子句中用一個(gè)in限定符
select?distinct?column_name?form?table_name?---------?distinct指定檢索獨(dú)有的列值,不重復(fù)
select?stocknumber?,"stocknumber?+?10"?=?stocknumber?+?10?from?table_name
select?stockname?,?"stocknumber"?=?count(*)?from?table_name?group?by?stockname
---------?group?by?將表按行分組,指定列中有相同的值
having?count(*)?=?2?---------?having選定指定的組
select?*?
from?table1,?table2?
where?table1.id?*=?table2.id?--------?左外部連接,table1中有的而table2中沒有得以null表示
table1.id?=*?table2.id?--------?右外部連接?
select?stockname?from?table1
union?[all]?-----?union合并查詢結(jié)果集,all-保留重復(fù)行
select?stockname?from?table2
***insert***
insert?into?table_name?(stock_name,stock_number)?value?("xxx","xxxx")
value?(select?stockname?,?stocknumber?from?stock_table2)---value為select語句
***update***
update?table_name?set?stockname?=?"xxx"?[where?stockid?=?3]
stockname?=?default
stockname?=?null
stocknumber?=?stockname?+?4
***delete***
delete?from?table_name?where?stockid?=?3
truncate?table_name?-----------?刪除表中所有行,仍保持表的完整性
drop?table?table_name?---------------?完全刪除表
***alter?table***?---?修改數(shù)據(jù)庫表結(jié)構(gòu)
alter?table?database.owner.table_name?add?column_name?char(2)?null?.....
sp_help?table_name?----?顯示表已有特征
create?table?table_name?(name?char(20),?age?smallint,?lname?varchar(30))
insert?into?table_name?select?.........?-----?實(shí)現(xiàn)刪除列的方法(創(chuàng)建新表)
alter?table?table_name?drop?constraint?stockname_default?----?刪除stockname的default約束
***function(/*常用函數(shù)*/)***
----統(tǒng)計(jì)函數(shù)----
avg?--求平均值
count?--統(tǒng)計(jì)數(shù)目
max?--求最大值
min?--求最小值
sum?--求和
--avg
use?pangu
select?avg(e_wage)?as?dept_avgwage
from?employee
group?by?dept_id
--max
--比如求工資最高的員工姓名
use?pangu
select?e_name
from?employee
where?e_wage?=
(select?max(e_wage)
from?employee)
--stdev()
--stdev()函數(shù)返回表達(dá)式中所有數(shù)據(jù)的標(biāo)準(zhǔn)差
--stdevp()
--stdevp()函數(shù)返回總體標(biāo)準(zhǔn)差
--var()
--var()函數(shù)返回表達(dá)式中所有值的統(tǒng)計(jì)變異數(shù)
--varp()
--varp()函數(shù)返回總體變異數(shù)
----算術(shù)函數(shù)----
/***三角函數(shù)***/
sin(float_expression)?--返回以弧度表示的角的正弦
cos(float_expression)?--返回以弧度表示的角的余弦
tan(float_expression)?--返回以弧度表示的角的正切
cot(float_expression)?--返回以弧度表示的角的余切
/***反三角函數(shù)***/
asin(float_expression)?--返回正弦是float?值的以弧度表示的角
acos(float_expression)?--返回余弦是float?值的以弧度表示的角
atan(float_expression)?--返回正切是float?值的以弧度表示的角
atan2(float_expression1,float_expression2)?
--返回正切是float_expression1?/float_expres-sion2的以弧度表示的角
degrees(numeric_expression)
--把弧度轉(zhuǎn)換為角度返回與表達(dá)式相同的數(shù)據(jù)類型可為
--integer/money/real/float?類型
radians(numeric_expression)?--把角度轉(zhuǎn)換為弧度返回與表達(dá)式相同的數(shù)據(jù)類型可為
--integer/money/real/float?類型
exp(float_expression)?--返回表達(dá)式的指數(shù)值
log(float_expression)?--返回表達(dá)式的自然對數(shù)值
log10(float_expression)--返回表達(dá)式的以10?為底的對數(shù)值
sqrt(float_expression)?--返回表達(dá)式的平方根
/***取近似值函數(shù)***/
ceiling(numeric_expression)?--返回>=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為
--integer/money/real/float?類型
floor(numeric_expression)?--返回<=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為
--integer/money/real/float?類型
round(numeric_expression)?--返回以integer_expression?為精度的四舍五入值返回的數(shù)據(jù)
--類型與表達(dá)式相同可為integer/money/real/float?類型
abs(numeric_expression)?--返回表達(dá)式的絕對值返回的數(shù)據(jù)類型與表達(dá)式相同可為
--integer/money/real/float?類型
sign(numeric_expression)?--測試參數(shù)的正負(fù)號(hào)返回0?零值1?正數(shù)或-1?負(fù)數(shù)返回的數(shù)據(jù)類型
--與表達(dá)式相同可為integer/money/real/float?類型
pi()?--返回值為π?即3.1415926535897936
rand([integer_expression])?--用任選的[integer_expression]做種子值得出0-1?間的隨機(jī)浮點(diǎn)數(shù)
----字符串函數(shù)----
ascii()?--函數(shù)返回字符表達(dá)式最左端字符的ascii?碼值
char()?--函數(shù)用于將ascii?碼轉(zhuǎn)換為字符
--假如沒有輸入0?~?255?之間的ascii?碼值char?函數(shù)會(huì)返回一個(gè)null?值
lower()?--函數(shù)把字符串全部轉(zhuǎn)換為小寫
upper()?--函數(shù)把字符串全部轉(zhuǎn)換為大寫
str()?--函數(shù)把數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù)
ltrim()?--函數(shù)把字符串頭部的空格去掉
rtrim()?--函數(shù)把字符串尾部的空格去掉
left(),right(),substring()?--函數(shù)返回部分字符串
charindex(),patindex()?--函數(shù)返回字符串中某個(gè)指定的子串出現(xiàn)的開始位置
soundex()?--函數(shù)返回一個(gè)四位字符碼?
--soundex函數(shù)可用來查找聲音相似的字符串但soundex函數(shù)對數(shù)字和漢字均只返回0?值?
difference()?--函數(shù)返回由soundex?函數(shù)返回的兩個(gè)字符表達(dá)式的值的差異
--0?兩個(gè)soundex?函數(shù)返回值的第一個(gè)字符不同
--1?兩個(gè)soundex?函數(shù)返回值的第一個(gè)字符相同
--2?兩個(gè)soundex?函數(shù)返回值的第一二個(gè)字符相同
--3?兩個(gè)soundex?函數(shù)返回值的第一二三個(gè)字符相同
--4?兩個(gè)soundex?函數(shù)返回值完全相同
quotename()?--函數(shù)返回被特定字符括起來的字符串
/*select?quotename('abc',?'{')?quotename('abc')
運(yùn)行結(jié)果如下:
----------------------------------
{abc}?[abc]*/
replicate()?--函數(shù)返回一個(gè)重復(fù)character_expression?指定次數(shù)的字符串
/*select?replicate('abc',?3)?replicate(?'abc',?-2)
運(yùn)行結(jié)果如下:
-----------?-----------
abcabcabc?null
reverse()?--函數(shù)將指定的字符串的字符排列順序顛倒
replace()?--函數(shù)返回被替換了指定子串的字符串
/*select?replace('abc123g',?'123',?'def')
運(yùn)行結(jié)果如下:
-----------?-----------
abcdefg*/
space()?--函數(shù)返回一個(gè)有指定長度的空白字符串
stuff()?--函數(shù)用另一子串替換字符串指定位置長度的子串
----數(shù)據(jù)類型轉(zhuǎn)換函數(shù)----
cast()?函數(shù)語法如下
cast()?(<expression>?as?<data_?type>[?length?])
convert()?函數(shù)語法如下
convert()?(<data_?type>[?length?],?<expression>?[,?style])
select?cast(100+99?as?char)?convert(varchar(12),?getdate())
運(yùn)行結(jié)果如下
------------------------------?------------
199?jan?15?2000
----日期函數(shù)----
day()?--函數(shù)返回date_expression?中的日期值
month()?--函數(shù)返回date_expression?中的月份值
year()?--函數(shù)返回date_expression?中的年份值
dateadd(<datepart>?,<number>?,<date>)?
--函數(shù)返回指定日期date?加上指定的額外日期間隔number?產(chǎn)生的新日期
datediff(<datepart>?,<number>?,<date>)
--函數(shù)返回兩個(gè)指定日期在datepart?方面的不同之處
datename(<datepart>?,?<date>)?--函數(shù)以字符串的形式返回日期的指定部分
datepart(<datepart>?,?<date>)?--函數(shù)以整數(shù)值的形式返回日期的指定部分
getdate()?--函數(shù)以datetime?的缺省格式返回系統(tǒng)當(dāng)前的日期和時(shí)間
----系統(tǒng)函數(shù)----
app_name()?--函數(shù)返回當(dāng)前執(zhí)行的應(yīng)用程序的名稱
coalesce()?--函數(shù)返回眾多表達(dá)式中第一個(gè)非null?表達(dá)式的值
col_length(<'table_name'>,?<'column_name'>)?--函數(shù)返回表中指定字段的長度值
col_name(<table_id>,?<column_id>)?--函數(shù)返回表中指定字段的名稱即列名
datalength()?--函數(shù)返回?cái)?shù)據(jù)表達(dá)式的數(shù)據(jù)的實(shí)際長度
db_id(['database_name'])?--函數(shù)返回?cái)?shù)據(jù)庫的編號(hào)
db_name(database_id)?--函數(shù)返回?cái)?shù)據(jù)庫的名稱
host_id()?--函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱
host_name()?--函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱
identity(<data_type>[,?seed?increment])?[as?column_name])
--identity()?函數(shù)只在select?into?語句中使用用于插入一個(gè)identity?column列到新表中
/*select?identity(int,?1,?1)?as?column_name
into?newtable
from?oldtable*/
isdate()?--函數(shù)判定所給定的表達(dá)式是否為合理日期
isnull(<check_expression>,?<replacement_value>)?--函數(shù)將表達(dá)式中的null?值用指定值替換
isnumeric()?--函數(shù)判定所給定的表達(dá)式是否為合理的數(shù)值
newid()?--函數(shù)返回一個(gè)uniqueidentifier?類型的數(shù)值
nullif(<expression1>,?<expression2>)
--nullif?函數(shù)在expression1?與expression2?相等時(shí)返回null?值若不相等時(shí)則返回expression1?的值
sql中的保留字
action?add?aggregate?all?
alter?after?and?as?
asc?avg?avg_row_length?auto_increment?
between?bigint?bit?binary?
blob?bool?both?by?
cascade?case?char?character?
change?check?checksum?column?
columns?comment?constraint?create?
cross?current_date?current_time?current_timestamp?
data?database?databases?date?
datetime?day?day_hour?day_minute?
day_second?dayofmonth?dayofweek?dayofyear?
dec?decimal?default?delayed?
delay_key_write?delete?desc?describe?
distinct?distinctrow?double?drop?
end?else?escape?escaped?
enclosed?enum?explain?exists?
fields?file?first?float?
float4?float8?flush?foreign?
from?for?full?function?
global?grant?grants?group?
having?heap?high_priority?hour?
hour_minute?hour_second?hosts?identified?
ignore?in?index?infile?
inner?insert?insert_id?int?
integer?interval?int1?int2?
int3?int4?int8?into?
if?is?isam?join?
key?keys?kill?last_insert_id?
leading?left?length?like?
lines?limit?load?local?
lock?logs?long?longblob?
longtext?low_priority?max?max_rows?
match?mediumblob?mediumtext?mediumint?
middleint?min_rows?minute?minute_second?
modify?month?monthname?myisam?
natural?numeric?no?not?
null?on?optimize?option?
optionally?or?order?outer?
outfile?pack_keys?partial?password?
precision?primary?procedure?process?
processlist?privileges?read?real?
references?reload?regexp?rename?
replace?restrict?returns?revoke?
rlike?row?rows?second?
select?set?show?shutdown?
smallint?soname?sql_big_tables?sql_big_selects?
sql_low_priority_updates?sql_log_off?sql_log_update?sql_select_limit?
sql_small_result?sql_big_result?sql_warnings?straight_join?
starting?status?string?table?
tables?temporary?terminated?text?
then?time?timestamp?tinyblob?
tinytext?tinyint?trailing?to?
type?use?using?unique?
unlock?unsigned?update?usage?
values?varchar?variables?varying?
varbinary?with?write?when?
where?year?year_month?zerofill
常用sql命令和asp編程
在進(jìn)行數(shù)據(jù)庫操作時(shí),無非就是添加、刪除、修改,這得設(shè)計(jì)到一些常用的sql語句,如下:?
sql常用命令使用方法:
(1)?數(shù)據(jù)記錄篩選:
sql="select?*?from?數(shù)據(jù)表?where?字段名=字段值?order?by?字段名?[desc]"
sql="select?*?from?數(shù)據(jù)表?where?字段名?like?%字段值%?order?by?字段名?[desc]"
sql="select?top?10?*?from?數(shù)據(jù)表?where?字段名?order?by?字段名?[desc]"
sql="select?*?from?數(shù)據(jù)表?where?字段名?in?(值1,值2,值3)"
sql="select?*?from?數(shù)據(jù)表?where?字段名?between?值1?and?值2"
(2)?更新數(shù)據(jù)記錄:
sql="update?數(shù)據(jù)表?set?字段名=字段值?where?條件表達(dá)式"
sql="update?數(shù)據(jù)表?set?字段1=值1,字段2=值2?……?字段n=值n?where?條件表達(dá)式"
(3)?刪除數(shù)據(jù)記錄:
sql="delete?from?數(shù)據(jù)表?where?條件表達(dá)式"
sql="delete?from?數(shù)據(jù)表"?(將數(shù)據(jù)表所有記錄刪除)
(4)?添加數(shù)據(jù)記錄:
sql="insert?into?數(shù)據(jù)表?(字段1,字段2,字段3?…)?valuess?(值1,值2,值3?…)"
sql="insert?into?目標(biāo)數(shù)據(jù)表?select?*?from?源數(shù)據(jù)表"?(把源數(shù)據(jù)表的記錄添加到目標(biāo)數(shù)據(jù)表)
(5)?數(shù)據(jù)記錄統(tǒng)計(jì)函數(shù):
avg(字段名)?得出一個(gè)表格欄平均值
count(*|字段名)?對數(shù)據(jù)行數(shù)的統(tǒng)計(jì)或?qū)δ骋粰谟兄档臄?shù)據(jù)行數(shù)統(tǒng)計(jì)
max(字段名)?取得一個(gè)表格欄最大的值
min(字段名)?取得一個(gè)表格欄最小的值
sum(字段名)?把數(shù)據(jù)欄的值相加
引用以上函數(shù)的方法:
sql="select?sum(字段名)?as?別名?from?數(shù)據(jù)表?where?條件表達(dá)式"
set?rs=conn.excute(sql)
用?rs("別名")?獲取統(tǒng)的計(jì)值,其它函數(shù)運(yùn)用同上。
(6)?數(shù)據(jù)表的建立和刪除:
create?table?數(shù)據(jù)表名稱(字段1?類型1(長度),字段2?類型2(長度)?……?)
例:create?table?tab01(name?varchar(50),datetime?default?now())
drop?table?數(shù)據(jù)表名稱?(永久性刪除一個(gè)數(shù)據(jù)表)
在asp編程時(shí),下面這些語句是必須知道的:
1.連接數(shù)據(jù)庫
a.?asp與access數(shù)據(jù)庫連接:
<%@?language=vbs?cript%>
<%
dim?conn,mdbfile
mdbfile=server.mappath("數(shù)據(jù)庫名稱.mdb")
set?conn=server.createobject("adodb.connection")
conn.open?"driver={microsoft?access?driver?(*.mdb)};uid=admin;pwd=數(shù)據(jù)庫密碼;dbq="&mdbfile
%>
b.?asp與sql數(shù)據(jù)庫連接:
<%@?language=vbs?cript%>
<%
dim?conn
set?conn=server.createobject("adodb.connection")
con.open?"provider=sqloledb;data?source=sql服務(wù)器名稱或ip地址;uid=sa;pwd=數(shù)據(jù)庫密碼;database=數(shù)據(jù)庫名稱
%>
建立記錄集對象:
set?rs=server.createobject("adodb.recordset")
rs.open?sql語句,conn,3,2
2.?記錄集對象的方法:
rs.movenext?將記錄指針從當(dāng)前的位置向下移一行
rs.moveprevious?將記錄指針從當(dāng)前的位置向上移一行
rs.movefirst?將記錄指針移到數(shù)據(jù)表第一行
rs.movelast?將記錄指針移到數(shù)據(jù)表最后一行
rs.absoluteposition=n?將記錄指針移到數(shù)據(jù)表第n行
rs.absolutepage=n?將記錄指針移到第n頁的第一行
rs.pagesize=n?設(shè)置每頁為n條記錄
rs.pagecount?根據(jù)?pagesize?的設(shè)置返回總頁數(shù)
rs.recordcount?返回記錄總數(shù)
rs.bof?返回記錄指針是否超出數(shù)據(jù)表首端,true表示是,false為否
rs.eof?返回記錄指針是否超出數(shù)據(jù)表末端,true表示是,false為否
rs.delete?刪除當(dāng)前記錄,但記錄指針不會(huì)向下移動(dòng)
rs.addnew?添加記錄到數(shù)據(jù)表末端
rs.update?更新數(shù)據(jù)表記錄
附:
常數(shù)?常數(shù)值?說明
--------------------------------
adlockreadonly?1?缺省值,recordset對象以只讀方式啟動(dòng),無法運(yùn)行addnew、update及delete等方法
adlockprssimistic?2?當(dāng)數(shù)據(jù)源正在更新時(shí),系統(tǒng)會(huì)暫時(shí)鎖住其他用戶的動(dòng)作,以保持?jǐn)?shù)據(jù)一致性。
adlockoptimistic?3?當(dāng)數(shù)據(jù)源正在更新時(shí),系統(tǒng)并不會(huì)鎖住其他用戶的動(dòng)作,其他用戶可以對數(shù)據(jù)進(jìn)行增、刪、改的操作。
adlockbatchoptimistic?4?當(dāng)數(shù)據(jù)源正在更新時(shí),其他用戶必須將cursorlocation屬性改為adudeclientbatch才能對數(shù)據(jù)進(jìn)行增、刪、改的操作。
mssql經(jīng)典語句?
?
1.按姓氏筆畫排序:select?*?from?tablename?order?by?customername?collate?chinese_prc_stroke_ci_as?
2.數(shù)據(jù)庫加密:select?encrypt('原始密碼')
select?pwdencrypt('原始密碼')
select?pwdcompare('原始密碼','加密后密碼')?=?1--相同;否則不相同?encrypt('原始密碼')
select?pwdencrypt('原始密碼')
select?pwdcompare('原始密碼','加密后密碼')?=?1--相同;否則不相同
3.取回表中字段:declare?@list?varchar(1000),@sql?nvarchar(1000)?
select?@list=@list+','+b.name?from?sysobjects?a,syscolumns?b?where?a.id=b.id?and?a.name='表a'
set?@sql='select?'+right(@list,len(@list)-1)+'?from?表a'?
exec?(@sql)
4.查看硬盤分區(qū):exec?master..xp_fixeddrives
5.比較a,b表是否相等:if?(select?checksum_agg(binary_checksum(*))?from?a)
=
(select?checksum_agg(binary_checksum(*))?from?b)
print?'相等'
else
print?'不相等'
6.殺掉所有的事件探察器進(jìn)程:declare?hcforeach?cursor?global?for?select?'kill?'+rtrim(spid)?from?master.dbo.sysprocesses
where?program_name?in('sql?profiler',n'sql?事件探查器')
exec?sp_msforeach_worker?'?'
7.記錄搜索:開頭到n條記錄
select?top?n?*?from?表
-------------------------------
n到m條記錄(要有主索引id)select?top?m-n?*?from?表?where?id?in?(select?top?m?id?from?表)?order?by?id?desc
----------------------------------
n到結(jié)尾記錄
select?top?n?*?from?表?order?by?id?desc
8.如何修改數(shù)據(jù)庫的名稱:sp_renamedb?'old_name',?'new_name'?
9:獲取當(dāng)前數(shù)據(jù)庫中的所有用戶表select?name?from?sysobjects?where?xtype='u'?and?status>=0
10:獲取某一個(gè)表的所有字段select?name?from?syscolumns?where?id=object_id('表名')
11:查看與某一個(gè)表相關(guān)的視圖、存儲(chǔ)過程、函數(shù)select?a.*?from?sysobjects?a,?syscomments?b?where?a.id?=?b.id?and?b.text?like?'%表名%'
12:查看當(dāng)前數(shù)據(jù)庫中所有存儲(chǔ)過程select?name?as?存儲(chǔ)過程名稱?from?sysobjects?where?xtype='p'
13:查詢用戶創(chuàng)建的所有數(shù)據(jù)庫select?*?from?master..sysdatabases?d?where?sid?not?in(select?sid?from?master..syslogins?where?name='sa')
或者
select?dbid,?name?as?db_name?from?master..sysdatabases?where?sid?<>?0x01
14:查詢某一個(gè)表的字段和數(shù)據(jù)類型select?column_name,data_type?from?information_schema.columns
where?table_name?=?'表名'?
[n].[標(biāo)題]:select?*?from?tablename?order?by?customername?
[n].[標(biāo)題]:select?*?from?tablename?order?by?customername?
from:http://tb.blog.csdn.net/trackback.aspx?postid=585515
?
觸發(fā)器-mssql常用操作
?
不再新開文章.
這里只打算講解四部分了,也就最簡單、最常用的四部分。
1、觸發(fā)器。
定義:?何為觸發(fā)器?在sql?server里面也就是對某一個(gè)表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個(gè)非凡的存儲(chǔ)過程。
常見的觸發(fā)器有三種:分別應(yīng)用于insert?,?update?,?delete?事件。(sql?server?2000定義了新的觸發(fā)器,這里不提)
我為什么要使用觸發(fā)器?比如,這么兩個(gè)表:
create?table?student(?--學(xué)生表
studentid?int?primary?key,?--學(xué)號(hào)
....
)
create?table?borrowrecord(?--學(xué)生借書記錄表
borrowrecord?int?identity(1,1),?--流水號(hào)?
studentid?int?,?--學(xué)號(hào)
borrowdate?datetime,?--借出時(shí)間
returndate?datetime,?--歸還時(shí)間
...
)
用到的功能有:
1.假如我更改了學(xué)生的學(xué)號(hào),我希望他的借書記錄仍然與這個(gè)學(xué)生相關(guān)(也就是同時(shí)更改借書記錄表的學(xué)號(hào));
2.假如該學(xué)生已經(jīng)畢業(yè),我希望刪除他的學(xué)號(hào)的同時(shí),也刪除它的借書記錄。
等等。
這時(shí)候可以用到觸發(fā)器。對于1,創(chuàng)建一個(gè)update觸發(fā)器:
create?trigger?trustudent
on?student
for?update
as
if?update(studentid)
begin
update?borrowrecord?
set?studentid=i.studentid
from?borrowrecord?br?,?deleted?d?,inserted?i?
where?br.studentid=d.studentid
end?
理解觸發(fā)器里面的兩個(gè)臨時(shí)的表:deleted?,?inserted?。注重deleted?與inserted分別表示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。
一個(gè)update?的過程可以看作為:生成新的記錄到inserted表,復(fù)制舊的記錄到deleted表,然后刪除student記錄并寫入新紀(jì)錄。
對于2,創(chuàng)建一個(gè)delete觸發(fā)器
create?trigger?trdstudent
on?student
for?delete
as
delete?borrowrecord?
from?borrowrecord?br?,?delted?d
where?br.studentid=d.studentid
從這兩個(gè)例子我們可以看到了觸發(fā)器的要害:a.2個(gè)臨時(shí)的表;b.觸發(fā)機(jī)制。
這里我們只講解最簡單的觸發(fā)器。復(fù)雜的容后說明。
事實(shí)上,我不鼓勵(lì)使用觸發(fā)器。觸發(fā)器的初始設(shè)計(jì)思想,已經(jīng)被“級聯(lián)”所替代.
?
mssql數(shù)據(jù)庫導(dǎo)出和導(dǎo)入
?
sql?server導(dǎo)出導(dǎo)入數(shù)據(jù)方法
?
?一、導(dǎo)出導(dǎo)入sql?server里某個(gè)數(shù)據(jù)庫?
?
1.?在sql?server企業(yè)管理器里選中要轉(zhuǎn)移的數(shù)據(jù)庫,按鼠標(biāo)右鍵,選所有任務(wù)->備份數(shù)據(jù)庫。?
2.?備份?選數(shù)據(jù)庫-完全,?目的?備份到?按添加按鈕?文件名?在sql?server服務(wù)器硬盤下輸入一個(gè)自定義的備份數(shù)據(jù)庫文件名(后綴一般是bak)?重寫?選重寫現(xiàn)有媒體?最后按確定按鈕。?假如生成的備份數(shù)據(jù)庫文件大于1m,要用壓縮工具壓縮后再到internet上傳輸。?
3.?通過ftp或者remote?desktop或者pcanywhere等方法?把第二步生成的備份數(shù)據(jù)庫文件或者其壓縮后的文件傳到目的sql?server數(shù)據(jù)庫,假如有壓縮要解壓。?4.目的sql?server數(shù)據(jù)庫假如還沒有此數(shù)據(jù)庫,先創(chuàng)建一個(gè)新的數(shù)據(jù)庫;?然后選中這個(gè)新創(chuàng)建的數(shù)據(jù)庫,按鼠標(biāo)右鍵,選所有任務(wù)->還原數(shù)據(jù)庫?還原->從設(shè)備->選擇設(shè)備->磁盤->添加(找到要導(dǎo)入的備份數(shù)據(jù)庫文件名)->確定?還原備份集->數(shù)據(jù)庫-完全?最后按確定按鈕。完全的數(shù)據(jù)庫導(dǎo)入成功了。?(假如在已經(jīng)存在的sql?server數(shù)據(jù)庫上還原數(shù)據(jù)庫可能碰到有還有其它人正在使用它而恢復(fù)操做失敗,?可以去看?->管理->當(dāng)前活動(dòng)->鎖/對象->找到數(shù)據(jù)庫下鎖的進(jìn)程號(hào)->到查詢分析器里用kill?進(jìn)程號(hào)殺掉這些鎖,?然后再做還原)?
注重:
假如在原有的目的sql?server數(shù)據(jù)庫上從備份文件(*.bak)還原數(shù)據(jù)庫?會(huì)把已經(jīng)存在的表、存儲(chǔ)過程等數(shù)據(jù)庫對:象全部替換成最近這次導(dǎo)入的備份數(shù)據(jù)庫里的內(nèi)容。?假如一定要還原備份文件(*.bak)里部分?jǐn)?shù)據(jù),需要另外建一個(gè)新數(shù)據(jù)庫,?其邏輯名稱和數(shù)量同備份文件(*.bak)里數(shù)據(jù)庫的邏輯名稱和數(shù)量一致;?新數(shù)據(jù)庫的物理文件名稱取得一定要和備份文件(*.bak)里數(shù)據(jù)庫的物理文件不一樣才行。?
?
二、導(dǎo)出導(dǎo)入sql?server里某個(gè)表?
?
1.?沒有防火墻,同一個(gè)局域網(wǎng)里或不在同一個(gè)局域網(wǎng)里,但通過internet可以互相訪問?在sql?server企業(yè)管理器里選中目的數(shù)據(jù)庫?,按鼠標(biāo)右鍵,選所有任務(wù)->導(dǎo)入數(shù)據(jù)->?彈出數(shù)據(jù)轉(zhuǎn)換服務(wù)導(dǎo)入/導(dǎo)出向?qū)Т翱?/span>->下一步->?選數(shù)據(jù)源->?數(shù)據(jù)源(用于sql?server的microfost?ole?db提供程序)->?服務(wù)器(可選擇局域網(wǎng)內(nèi)能訪問到的所有sql?server服務(wù)器,或者直接輸入ip地址)->?選擇使用windows身份驗(yàn)證還是使用sql?serve身份驗(yàn)證(輸入數(shù)據(jù)庫的用戶名和密碼)->?數(shù)據(jù)庫(可選擇上面選中sql?server服務(wù)器上所有權(quán)限范圍內(nèi)的數(shù)據(jù)庫)->下一步->?選擇目的->目的(用于sql?server的microfost?ole?db提供程序)->?服務(wù)器(默認(rèn)為上一步里選中的導(dǎo)出服務(wù)器,也可以選其它局域網(wǎng)內(nèi)能訪問到的所有sql?server服務(wù)器,或者直接輸入ip地址)->?目的數(shù)據(jù)庫(可選擇上面選中sql?server服務(wù)器上所有權(quán)限范圍內(nèi)的數(shù)據(jù)庫)->下一步->?制定表復(fù)制或查詢->選從源數(shù)據(jù)庫復(fù)制表和視圖(也可以選擇用一條查詢指定要傳輸?shù)臄?shù)據(jù))->下一步->?選擇源表和視圖->在要導(dǎo)入的表和視圖前面選中源->目的出現(xiàn)同樣的表名(可以手工修改成別的表名)->?轉(zhuǎn)換->列映射和轉(zhuǎn)換里面可以修改源表和目的表之間字段的對應(yīng)關(guān)系,修改目的表字段的類型和長度等,?并可以選擇創(chuàng)建目的表,在目的表中增加行,除去并重新創(chuàng)建目的表,啟用標(biāo)志插入等選項(xiàng)->確定->下一步->?保存、調(diào)度和復(fù)制包->時(shí)間->立即運(yùn)行(假如要實(shí)現(xiàn)隔一段時(shí)間自動(dòng)導(dǎo)出導(dǎo)入數(shù)據(jù),選調(diào)度dts包以便以后執(zhí)行)->?保存(可以不選)->[?保存dts包(假如以后還要轉(zhuǎn)移這批相同的數(shù)據(jù),可以把本次導(dǎo)出導(dǎo)入的內(nèi)容和步驟保存起來,?存到sql?server即可,保存的時(shí)候要輸入dts的包名及具體描述)->下一步->?]->完成?正在執(zhí)行包->圖形界面顯示創(chuàng)建表及插入記錄的步驟和狀態(tài)->完成?
2.?經(jīng)過防火墻,不在同一個(gè)局域網(wǎng)里?①、導(dǎo)出表里的數(shù)據(jù)到文本文件:?在sql?server企業(yè)管理器里選中目的數(shù)據(jù)庫,按鼠標(biāo)右鍵,選所有任務(wù)->?導(dǎo)入數(shù)據(jù)->彈出數(shù)據(jù)轉(zhuǎn)換服務(wù)導(dǎo)入/導(dǎo)出向?qū)Т翱?/span>->下一步->?選數(shù)據(jù)源->?數(shù)據(jù)源(用于sql?server的microfost?ole?db提供程序)->?服務(wù)器(可選擇局域網(wǎng)內(nèi)能訪問到的所有sql?server服務(wù)器)->?選擇使用windows身份驗(yàn)證還是使用sql?serve身份驗(yàn)證(輸入數(shù)據(jù)庫的用戶名和密碼)->?數(shù)據(jù)庫(可選擇上面選中sql?server服務(wù)器上所有權(quán)限范圍內(nèi)的數(shù)據(jù)庫)->下一步->?選擇目的->目的(文本文件)->?文件名(在自己的電腦硬盤中生成一個(gè)自定義的文本文件)?->下一步->?制定表復(fù)制或查詢->選從源數(shù)據(jù)庫復(fù)制表和視圖(也可以選擇用一條查詢指定要傳輸?shù)臄?shù)據(jù))->下一步->?選擇目的文件格式->源(選擇要導(dǎo)出的表)->用默認(rèn)的帶分隔符->選第一行包含有列名稱選項(xiàng)->下一步->?保存、調(diào)度和復(fù)制包->時(shí)間->立即運(yùn)行(假如要實(shí)現(xiàn)隔一段時(shí)間自動(dòng)導(dǎo)出到文本文件,選調(diào)度dts包以便以后執(zhí)行)->?保存(可以不選)->?[保存dts包(保存的時(shí)候要輸入dts的包名及具體描述)->下一步->]->完成?正在執(zhí)行包->圖形界面顯示表到文本文件的步驟和狀態(tài)->完成?假如生成的文本文件大于1m,要用壓縮工具壓縮后再到internet上傳輸。?②、通過ftp或者remote?desktop或者pcanywhere等方法把?第①步生成的文本文件或者其壓縮后的文件傳到目的sql?server數(shù)據(jù)庫,假如有壓縮要解壓。?③、把文本文件導(dǎo)入目的sql?server數(shù)據(jù)庫?直接把文本文件導(dǎo)入目的sql?server數(shù)據(jù)庫里跟文本文件同名的新表名時(shí),默認(rèn)的會(huì)把所有字段類型都變成字符串。?所以我們要這樣做:?在源sql?server數(shù)據(jù)庫上先生成創(chuàng)建表的sql語句?在sql?server查詢分析器里->選中源數(shù)據(jù)庫里表名->按右鍵->在新窗口中編寫對象腳本->創(chuàng)建->?復(fù)制下新窗口內(nèi)創(chuàng)建表名的sql語句?到目標(biāo)sql?server數(shù)據(jù)庫上查詢分析器里執(zhí)行創(chuàng)建表名的sql語句,生成空表結(jié)構(gòu)。?(假如已經(jīng)存在這樣的表名,修改建表的sql語句,在表名后面加上導(dǎo)入時(shí)間的年月信息,例如table_0113)?調(diào)用導(dǎo)入/導(dǎo)出工具->彈出數(shù)據(jù)轉(zhuǎn)換服務(wù)導(dǎo)入/導(dǎo)出向?qū)Т翱?/span>->下一步->?選數(shù)據(jù)源->?數(shù)據(jù)源(文本文件)->?文件名(已傳到目的sql?server數(shù)據(jù)庫下要導(dǎo)入的文本文件,后綴可以不是*.txt,?但是常規(guī)文本編輯器能打開的文件,文件類型選全部)->下一步->?選擇文件格式->用默認(rèn)的帶分隔符->選第一行包含有列名稱選項(xiàng)->下一步->?制定列分割符->逗號(hào)->下一步->?選擇目的->目的(用于sql?server的microfost?ole?db提供程序)->?服務(wù)器(可選擇目標(biāo)局域網(wǎng)內(nèi)能訪問到的所有sql?server服務(wù)器)->?選擇使用windows身份驗(yàn)證還是使用sql?serve身份驗(yàn)證(輸入數(shù)據(jù)庫的用戶名和密碼)->?數(shù)據(jù)庫(可選擇上面選中sql?server服務(wù)器上所有權(quán)限范圍內(nèi)的數(shù)據(jù)庫)->下一步->?選擇源表和視圖->修改目的表名為剛才創(chuàng)建的表名->轉(zhuǎn)換(在目的表中追加行)?->下一步->?保存、調(diào)度和復(fù)制包->?時(shí)間->立即運(yùn)行(假如要實(shí)現(xiàn)隔一段時(shí)間自動(dòng)把文本文件導(dǎo)入,選調(diào)度dts包以便以后執(zhí)行)->?保存(可以不選)->?[保存dts包(保存的時(shí)候要輸入dts的包名及具體描述)->下一步->]->完成?正在執(zhí)行包->圖形界面顯示文本文件到表的步驟和狀態(tài)->完成?假如要更改導(dǎo)入時(shí)間的年月信息的表名,例如table_0113到原來的表名,?在企業(yè)管理器里把原來的表名改成table_old_0113,table_0113改名成table。?這會(huì)對應(yīng)用程序里頻繁訪問的表照成一定的中斷。?
注重:
源表上的建的索引和主鍵約束不能用上面介紹的1和2方法轉(zhuǎn)移過來,還需要手工來建索引和主鍵。?標(biāo)志種子和not?null的約束可以繼續(xù)過來。?導(dǎo)入視圖時(shí)會(huì)把源視圖里所有的真實(shí)數(shù)據(jù)導(dǎo)入成一個(gè)新表,而不是視圖。
?
?三、sql?server存儲(chǔ)過程或用戶定義的函數(shù)導(dǎo)出導(dǎo)入
?
?1、導(dǎo)出存儲(chǔ)過程或用戶定義的函數(shù)成*.sql文件?在sql?server企業(yè)管理器里選中源數(shù)據(jù)庫,?存儲(chǔ)過程->單選或者多選中要轉(zhuǎn)移的存儲(chǔ)過程->?用戶定義的函數(shù)->單選或者多選中要轉(zhuǎn)移的函數(shù)->?按鼠標(biāo)右鍵,選所有任務(wù)->生成sql腳本->確定->在自己的電腦硬盤中生成一個(gè)自定義的*.sql文件->?保存->正在生成sql腳本->成功?2、假如目的數(shù)據(jù)庫經(jīng)過防火墻,不在同一個(gè)局域網(wǎng)里,?要通過ftp或者remote?desktop或者pcanywhere等方法把第1步生成的*.sql文件傳到目的sql?server數(shù)據(jù)庫服務(wù)器上。?3、用查詢分析器進(jìn)入sql?server目的數(shù)據(jù)庫,?從菜單里選文件->打開->打開查詢文件->選中第1步生成的*.sql文件->點(diǎn)執(zhí)行查詢的綠色倒三角型快捷鍵->?查詢窗口里會(huì)出現(xiàn)執(zhí)行后的消息(有時(shí)候可能因?yàn)榇鎯?chǔ)過程和用戶定義的函數(shù)之間有一定的依靠關(guān)系,會(huì)報(bào)一些錯(cuò)。?最好先執(zhí)行用戶定義的函數(shù)的*.sql文件,再執(zhí)行存儲(chǔ)過程的*.sql文件)?
?
四、oracle數(shù)據(jù)庫里表導(dǎo)入sql?server數(shù)據(jù)庫
?
?1、在目的sql?server數(shù)據(jù)庫服務(wù)器上安裝oracle?client軟件或者oracle?odbc?driver.?在$oracle_homenetworkadmintnsnames.ora里配置oracle數(shù)據(jù)庫的別名(service?name)。?
?2、在win2000或者win2003服務(wù)器->管理工具->數(shù)據(jù)源(odbc)->?系統(tǒng)dsn(本機(jī)器上nt域用戶都可以用)->添加->oracle?odbc?driver->完成->?data?source?name?可以自定義,我一般填oracle數(shù)據(jù)庫的sid標(biāo)志,?description里可以填oracle數(shù)據(jù)庫具體描述,也可以不填->?data?source?service?name?填第1步定義的oracle數(shù)據(jù)庫別名->ok。?(用戶dsn和文件dsn也可以類似配置,但使用的時(shí)候有一些限制)
?3、sql?server的導(dǎo)入和導(dǎo)出數(shù)據(jù)工具里->選數(shù)據(jù)源->?數(shù)據(jù)源(其它(odbc數(shù)據(jù)源))->?選第2步在odbc里定義的系統(tǒng)dsn?source?name,用戶名密碼處填寫oracle系統(tǒng)的用戶名和密碼->?下一步->選擇目的,選sql?server數(shù)據(jù)庫(跟上面第二點(diǎn)講的一致,就不重復(fù)了)。
注重:
在oracle表和sql?server表之間'轉(zhuǎn)換'那步很重要,?可以改變默認(rèn)的字段數(shù)據(jù)類型,如image->text,decimal->int?
?
五、sql?server數(shù)據(jù)庫里表導(dǎo)入oracle數(shù)據(jù)庫
?
?方法一.導(dǎo)出目的選通過odbc數(shù)據(jù)源里定義的oracle數(shù)據(jù)庫,?注重oracle里表名都是大寫的.?我一般在oracle這邊先生成好表結(jié)構(gòu),再選擇sql?server源表往oracle目的表里追加數(shù)據(jù).?數(shù)據(jù)傳輸速度比方法二慢.?方法二.從sql?server數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)到oracle數(shù)據(jù)庫可以選擇用windows下oracle9i企業(yè)或者個(gè)人版數(shù)據(jù)庫做中轉(zhuǎn)。?
(?注重:oracle通過訪問sql?server的數(shù)據(jù)庫鏈接時(shí),用select?*?的時(shí)候字段名是用雙引號(hào)引起來的。)?
?
mysql數(shù)據(jù)庫導(dǎo)出和導(dǎo)入
1).mysqlimport的語法介紹:?
mysqlimport位于mysql/bin目錄中,是mysql的一個(gè)載入(或者說導(dǎo)入)數(shù)據(jù)的一個(gè)非常有效的工具。這是一個(gè)命令行工具。有兩個(gè)參數(shù)以及大量的選項(xiàng)可供選擇。這個(gè)工具把一個(gè)文本文件(text?file)導(dǎo)入到你指定的數(shù)據(jù)庫和表中。比方說我們要從文件customers.txt中把數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫meet_a_geek中的表custermers中:?
mysqlimport?meet_a_geek?customers.txt?
注重:這里customers.txt是我們要導(dǎo)入數(shù)據(jù)的文本文件,而meet_a_geek是我們要操作的數(shù)據(jù)庫,數(shù)據(jù)庫中的表名是customers,這里文本文件的數(shù)據(jù)格式必須與customers表中的記錄格式一致,否則mysqlimport命令將會(huì)出錯(cuò)。
其中表的名字是導(dǎo)入文件的第一個(gè)句號(hào)(.)前面文件字符串,另外一個(gè)例子:mysqlimport?meet_a_geek?cus.to.mers.txt
那么我們將把文件中的內(nèi)容導(dǎo)入到數(shù)據(jù)庫meet_a_geek?中的cus表中。?
上面的例子中,都只用到兩個(gè)參數(shù),并沒有用到更多的選項(xiàng),下面介紹mysqlimport的選項(xiàng)?
2).mysqlimport的常用選項(xiàng)介紹:?
選項(xiàng)?功能?
-d?or?--delete?新數(shù)據(jù)導(dǎo)入數(shù)據(jù)表中之前刪除數(shù)據(jù)數(shù)據(jù)表中的所有信息?
-f?or?--force?不管是否碰到錯(cuò)誤,mysqlimport將強(qiáng)制繼續(xù)插入數(shù)據(jù)?
-i?or?--ignore?mysqlimport跳過或者忽略那些有相同唯一要害字的行,?導(dǎo)入文件中的數(shù)據(jù)將被忽略。?
-l?or?-lock-tables?數(shù)據(jù)被插入之前鎖住表,這樣就防止了,你在更新數(shù)據(jù)庫時(shí),用戶的查詢和更新受到影響。?
-r?or?-replace?這個(gè)選項(xiàng)與-i選項(xiàng)的作用相反;此選項(xiàng)將替代表中有相同唯一要害字的記錄。?
--fields-enclosed-?by=?char?指定文本文件中數(shù)據(jù)的記錄時(shí)以什么括起的,?很多情況下數(shù)據(jù)以雙引號(hào)括起。?默認(rèn)的情況下數(shù)據(jù)是沒有被字符括起的。?
--fields-terminated-?by=char?指定各個(gè)數(shù)據(jù)的值之間的分隔符,在句號(hào)分隔的文件中,分隔符是句號(hào)。您可以用此選項(xiàng)指定數(shù)據(jù)之間的分隔符。
默認(rèn)的分隔符是跳格符(tab)?
--lines-terminated-?by=str?此選項(xiàng)指定文本文件中行與行之間數(shù)據(jù)的分隔字符串或者字符。?默認(rèn)的情況下mysqlimport以newline為行分隔符。?
您可以選擇用一個(gè)字符串來替代一個(gè)單個(gè)的字符:?
一個(gè)新行或者一個(gè)回車。?
mysqlimport命令常用的選項(xiàng)還有-v?顯示版本(version),-p?提示輸入密碼(password)等。?
3).例子:導(dǎo)入一個(gè)以逗號(hào)為分隔符的文件?
文件中行的記錄格式是這樣的:?
"1",?"ord89876",?"1?dozen?roses",?"19991226"?
我們的任務(wù)是要把這個(gè)文件里面的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫meet_a_geek中的表格orders中,我們使用這個(gè)命令:?
bin/mysqlimport?–prl?–fields-enclosed-by="?–fields-terminated-by=,?meet_a_geek?orders.txt?
這個(gè)命令可能看起來很不爽,不過當(dāng)你熟知了之后,這是非常簡單的。第一部分,bin/mysqlimport?,告訴操作系統(tǒng)你要運(yùn)行的命令是mysql/bin目錄下的mysqlimport,選項(xiàng)p是要求輸入密碼,這樣就要求你在改動(dòng)數(shù)據(jù)庫之前輸入密碼,操作起來會(huì)更安全。?我們用了r選項(xiàng)是因?yàn)槲覀兿胍驯碇械奈ㄒ灰ψ峙c文件記錄中有重復(fù)唯一要害字的記錄替換成文件中的數(shù)據(jù)。我們表單中的數(shù)據(jù)不是最新的,需要用文件中的數(shù)據(jù)去更新,因而就用r這個(gè)選項(xiàng),替代數(shù)據(jù)庫中已經(jīng)有的記錄。l選項(xiàng)的作用是在我們插入數(shù)據(jù)的時(shí)候鎖住表,這樣就阻止了用戶在我們更新表的時(shí)候?qū)Ρ磉M(jìn)行查詢或者更改的操作。
批處理是一種非交互式運(yùn)行mysql程序的方法,如同您在mysql中使用的命令一樣,你仍然將使用這些命令。?
為了實(shí)現(xiàn)批處理,您重定向一個(gè)文件到mysql程序中,首先我們需要一個(gè)文本文件,這個(gè)文本文件包含有與我們在mysql中輸入的命令相同的文本。?
比如我們要插入一些數(shù)據(jù),使用包含下面文本的文件(文件名為new_data.sql,當(dāng)然我們也可以取名為new_data.txt及任何其他的合法名字,并不一定要以后綴sql結(jié)尾):?
use?meet_a_geek;?
insert?into?customers?(customer_id,?last_name)?values(null,?"block");?
insert?into?customers?(customer_id,?last_name)?values(null,?"newton");?
insert?into?customers?(customer_id,?last_name)?values(null,?"simmons");?
注重上面的這些句子的語法都必須是正確的,并且每個(gè)句子以分號(hào)結(jié)束。?
上面的use命令選擇數(shù)據(jù)庫,insert命令插入數(shù)據(jù)。?
下面我們要把上面的文件導(dǎo)入到數(shù)據(jù)庫中,導(dǎo)入之前要確認(rèn)數(shù)據(jù)庫已經(jīng)在運(yùn)行,即是mysqld進(jìn)程(或者說服務(wù),windows?nt下面稱為”服務(wù)“,unix下面為”進(jìn)程“)已經(jīng)在運(yùn)行。?
然后運(yùn)行下面的命令:?
bin/mysql?–p?<?/home/mark/new_data.sql?
接著按提示輸入密碼,假如上面的文件中的語句沒有錯(cuò)誤,那么這些數(shù)據(jù)就被導(dǎo)入到了數(shù)據(jù)庫中。?
命令行中使用load?data?infile?從文件中導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫:?
現(xiàn)在您可能會(huì)問自己,"究竟為什么我要輸入所有的這些sql語句到文件中,然后通過程序運(yùn)行它們呢?”?
這樣看起來似乎需要大量的工作。很好,你這樣想很可能就對了。但是假如你有從所有這些命令中產(chǎn)生的log記錄呢?現(xiàn)在這樣就很棒,嗯,大多數(shù)數(shù)據(jù)庫都會(huì)自動(dòng)產(chǎn)生數(shù)據(jù)庫中的事件記錄的log。而大部分log都包含有用過的原始的sql命令。因此,假如您不能從您現(xiàn)在的數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù)到新的mysql數(shù)據(jù)庫中使用,那么您可以使用log和mysql的批處理特性,來快速且方便地導(dǎo)入您地?cái)?shù)據(jù)。當(dāng)然,這樣就省去了打字的麻煩。?
load?data?infile?
這是我們要介紹的最后一個(gè)導(dǎo)入數(shù)據(jù)到mysql數(shù)據(jù)庫中的方法。這個(gè)命令與mysqlimport非常相似,但這個(gè)方法可以在mysql命令行中使用。也就是說您可以在所有使用api的程序中使用這個(gè)命令。使用這種方法,您就可以在應(yīng)用程序中導(dǎo)入您想要導(dǎo)入的數(shù)據(jù)。?
使用這個(gè)命令之前,mysqld進(jìn)程(服務(wù))必須已經(jīng)在運(yùn)行。
啟動(dòng)mysql命令行:
bin/mysql?–p?
按提示輸入密碼,成功進(jìn)入mysql命令行之后,輸入下面的命令:
use?meet_a_geek;?
load?data?infile?"/home/mark/data.sql"?into?table?orders;?
簡單的講,這樣將會(huì)把文件data.sql中的內(nèi)容導(dǎo)入到表orders中,如mysqlimport工具一樣,這個(gè)命令也有一些可以選擇的參數(shù)。比如您需要把自己的電腦上的數(shù)據(jù)導(dǎo)入到遠(yuǎn)程的數(shù)據(jù)庫服務(wù)器中,您可以使用下面的命令:?
load?data?local?infile?"c:mydocssql.txt"?into?table?orders;?
上面的local參數(shù)表示文件是本地的文件,服務(wù)器是您所登陸的服務(wù)器。?
這樣就省去了使用ftp來上傳文件到服務(wù)器,mysql替你完成了.?
您也可以設(shè)置插入語句的優(yōu)先級,假如您要把它標(biāo)記為低優(yōu)先級(low_priority),那么mysql將會(huì)等到?jīng)]有其他人讀這個(gè)表的時(shí)候,才把插入數(shù)據(jù)??梢允褂萌缦碌拿?#xff1a;?
?load?data?low_priority?infile?"/home/mark/data.sql"?into?table?orders;?
您也可以指定是否在插入數(shù)據(jù)的時(shí)候,取代或者忽略文件與數(shù)據(jù)表中重復(fù)的鍵值。替代重復(fù)的鍵值的語法:?
load?data?low_priority?infile?"/home/mark/data.sql"?replace?into?table?orders;?
上面的句子看起來有點(diǎn)笨拙,但卻把要害字放在了讓您的剖析器可以理解的地方。?
下面的一對選項(xiàng)描述了文件的記錄格式,這些選項(xiàng)也是在mysqlimport工具中可以用的。他們在這里看起來有點(diǎn)不同。首先,要用到fields要害字,假如用到這個(gè)要害字,mysql剖析器希望看到至少有下面的一個(gè)選項(xiàng):
terminated?by?character?
?enclosed?by?character?
?escaped?by?character?
這些要害字與它們的參數(shù)跟mysqlimport中的用法是一樣的.?the?
?terminated?by?描述字段的分隔符,默認(rèn)情況下是tab字符(t)?
?enclosed?by描述的是字段的括起字符。比方以引號(hào)括起每一個(gè)字段。?
?escaped?by?描述的轉(zhuǎn)義字符。默認(rèn)的是反些杠(backslash:?).?
下面仍然使用前面的mysqlimport命令的例子,用load?data?infile語句把同樣的文件導(dǎo)入到數(shù)據(jù)庫中:?
load?data?infile?"/home/mark/orders.txt"?replace?into?table?orders?fields?terminated?by?','? enclosed?by?'"';?
load?data?infile語句中有一個(gè)mysqlimport工具中沒有特點(diǎn):?
load?data?infile?可以按指定的列把文件導(dǎo)入到數(shù)據(jù)庫中。?
當(dāng)我們要把數(shù)據(jù)的一部分內(nèi)容導(dǎo)入的時(shí)候,這個(gè)特點(diǎn)就很重要。比方說,我們要從access數(shù)據(jù)庫升級到mysql數(shù)據(jù)庫的時(shí)候,需要加入一些欄目(列/字段/field)到mysql數(shù)據(jù)庫中,以適應(yīng)一些額外的需要。?
這個(gè)時(shí)候,我們的access數(shù)據(jù)庫中的數(shù)據(jù)仍然是可用的,但是因?yàn)檫@些數(shù)據(jù)的欄目(field)與mysql中的不再匹配,因此而無法再使用mysqlimport工具。盡管如此,我們?nèi)匀豢梢允褂胠oad?data?infile,下面的例子顯示了如何向指定的欄目(field)中導(dǎo)入數(shù)據(jù):?
load?data?infile?"/home/order.txt"?into?table?orders(order_number,?order_date,?customer_id);?
如您所見,我們可以指定需要的欄目(fields)。這些指定的字段依然是以括號(hào)括起,由逗號(hào)分隔的,假如您遺漏了其中任何一個(gè),mysql將會(huì)提醒您^_^?
importing?data?from?microsoft?access?(從access中導(dǎo)入數(shù)據(jù),略)
您可以看到mysql有很多可以導(dǎo)入數(shù)據(jù)的方法,然而這些只是數(shù)據(jù)傳輸中的一半。另外的一般是從mysql數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù)。有許多的原因我們需要導(dǎo)出數(shù)據(jù)。一個(gè)重要的原因是用于備份數(shù)據(jù)庫。數(shù)據(jù)的造價(jià)經(jīng)常是昂貴的,需要謹(jǐn)慎處理它們。經(jīng)常地備份可以幫助防止寶貴數(shù)據(jù)地丟失;另外一個(gè)原因是,也許您希望導(dǎo)出數(shù)據(jù)來共享。?在這個(gè)信息技術(shù)不斷成長的世界中,共享數(shù)據(jù)變得越來越常見。?
比方說macmillan?usa維護(hù)護(hù)著一個(gè)將要出版的書籍的大型數(shù)據(jù)庫。這個(gè)數(shù)據(jù)庫在許多書店之間共享,這樣他們就知道哪些書將會(huì)很快出版。醫(yī)院越來越走向采用無紙病歷記錄,這樣這些病歷可以隨時(shí)跟著你。世界變得越來越小,信息也被共享得越來越多。有很多中導(dǎo)出數(shù)據(jù)得方法,它們都跟導(dǎo)入數(shù)據(jù)很相似。因?yàn)?#xff0c;究竟,這些都只是一種透視得方式。從數(shù)據(jù)庫導(dǎo)出的數(shù)據(jù)就是從另一端導(dǎo)入的數(shù)據(jù)。這里我們并不討論其他的數(shù)據(jù)庫各種各樣的導(dǎo)出數(shù)據(jù)的方法,您將學(xué)會(huì)如何用mysql來實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出。
使用mysqldump:?
mysqldump命令位于mysql/bin/目錄中?
mysqldump工具很多方面類似相反作用的工具mysqlimport。它們有一些同樣的選項(xiàng)。但mysqldump能夠做更多的事情。它可以把整個(gè)數(shù)據(jù)庫裝載到一個(gè)單獨(dú)的文本文件中。這個(gè)文件包含有所有重建您的數(shù)據(jù)庫所需要的sql命令。這個(gè)命令取得所有的模式(schema,后面有解釋)并且將其轉(zhuǎn)換成ddl語法(create語句,即數(shù)據(jù)庫定義語句),取得所有的數(shù)據(jù),并且從這些數(shù)據(jù)中創(chuàng)建insert語句。這個(gè)工具將您的數(shù)據(jù)庫中所有的設(shè)計(jì)倒轉(zhuǎn)。因?yàn)樗械臇|西都被包含到了一個(gè)文本文件中。這個(gè)文本文件可以用一個(gè)簡單的批處理和一個(gè)合適sql語句導(dǎo)回到mysql中。這個(gè)工具令人難以置信地簡單而快速。決不會(huì)有半點(diǎn)讓人頭疼地地方。?
因此,假如您像裝載整個(gè)數(shù)據(jù)庫meet_a_geek的內(nèi)容到一個(gè)文件中,可以使用下面的命令:?
?bin/mysqldump?–p?meet_a_geek?>?meetageek_dump_file.txt?
這個(gè)語句也答應(yīng)您指定一個(gè)表進(jìn)行dump(備份/導(dǎo)出/裝載?)。假如您只是希望把數(shù)據(jù)庫meet_a_geek中的表orders中的整個(gè)內(nèi)容導(dǎo)出到一個(gè)文件,可以使用下面的命令:?
?bin/mysqldump?–p?meet_a_geek?orders?>meetageek_orders.txt?
這個(gè)非常的靈活,您甚至可以使用where從句來選擇您需要的記錄導(dǎo)出到文件中。要達(dá)到這樣的目的,可以使用類似于下面的命令:?
?bin/mysqldump?–p?–where="order_id?>?2000"?meet_a_geek?orders?>?special_dump.txt?
mysqldump工具有大量的選項(xiàng),部分選項(xiàng)如下表:?
選項(xiàng)/option?作用/action?performed?
--add-drop-table?
?這個(gè)選項(xiàng)將會(huì)在每一個(gè)表的前面加上drop?table?if?exists語句,這樣可以保證導(dǎo)回mysql數(shù)據(jù)庫的時(shí)候不會(huì)出錯(cuò),因?yàn)槊看螌?dǎo)回的時(shí)候,都會(huì)首先檢查表是否存在,存在就刪除?
--add-locks?
?這個(gè)選項(xiàng)會(huì)在insert語句中捆上一個(gè)lock?table和unlock?table語句。這就防止在這些記錄被再次導(dǎo)入數(shù)據(jù)庫時(shí)其他用戶對表進(jìn)行的操作?
-c?or?-?complete_insert?
?這個(gè)選項(xiàng)使得mysqldump命令給每一個(gè)產(chǎn)生insert語句加上列(field)的名字。當(dāng)把數(shù)據(jù)導(dǎo)出導(dǎo)另外一個(gè)數(shù)據(jù)庫時(shí)這個(gè)選項(xiàng)很有用。?
--delayed-insert?在insert命令中加入delay選項(xiàng)?
?-f?or?-flush-logs?使用這個(gè)選項(xiàng),在執(zhí)行導(dǎo)出之前將會(huì)刷新mysql服務(wù)器的log.?
?-f?or?-force?使用這個(gè)選項(xiàng),即使有錯(cuò)誤發(fā)生,仍然繼續(xù)導(dǎo)出?
?--full?這個(gè)選項(xiàng)把附加信息也加到create?table的語句中?
?-l?or?-lock-tables?使用這個(gè)選項(xiàng),導(dǎo)出表的時(shí)候服務(wù)器將會(huì)給表加鎖。?
?-t?or?-no-create-?info?
?這個(gè)選項(xiàng)使的mysqldump命令不創(chuàng)建create?table語句,這個(gè)選項(xiàng)在您只需要數(shù)據(jù)而不需要ddl(數(shù)據(jù)庫定義語句)時(shí)很方便。?
-d?or?-no-data?這個(gè)選項(xiàng)使的mysqldump命令不創(chuàng)建insert語句。?
?在您只需要ddl語句時(shí),可以使用這個(gè)選項(xiàng)。?
?--opt?此選項(xiàng)將打開所有會(huì)提高文件導(dǎo)出速度和創(chuàng)造一個(gè)可以更快導(dǎo)入的文件的選項(xiàng)。?
?-q?or?-quick?這個(gè)選項(xiàng)使得mysql不會(huì)把整個(gè)導(dǎo)出的內(nèi)容讀入內(nèi)存再執(zhí)行導(dǎo)出,而是在讀到的時(shí)候就寫入導(dǎo)文件中。?
?-t?path?or?-tab?=?path?這個(gè)選項(xiàng)將會(huì)創(chuàng)建兩個(gè)文件,一個(gè)文件包含ddl語句或者表創(chuàng)建語句,另一個(gè)文件包含數(shù)據(jù)。ddl文件被命名為table_name.sql,數(shù)據(jù)文件被命名為table_name.txt.路徑名是存放這兩個(gè)文件的目錄。目錄必須已經(jīng)存在,并且命令的使用者有對文件的特權(quán)。?
-w?"where?clause"?or?-where?=?"where?clause?"?
?如前面所講的,您可以使用這一選項(xiàng)來過篩選將要放到導(dǎo)出文件的數(shù)據(jù)。?
假定您需要為一個(gè)表單中要用到的帳號(hào)建立一個(gè)文件,經(jīng)理要看今年(2004年)所有的訂單(orders),它們并不對ddl感愛好,并且需要文件有逗號(hào)分隔,因?yàn)檫@樣就很輕易導(dǎo)入到excel中。?為了完成這個(gè)人物,您可以使用下面的句子:?
bin/mysqldump?–p?–where?"order_date?>='2000-01-01'"?
?–tab?=?/home/mark?–no-create-info?–fields-terminated-by=,?meet_a_geek?orders?
?這將會(huì)得到您想要的結(jié)果。?
schema:模式the?set?of?statements,?expressed?in?data?definition?language,?that?completely?describe?the?structure?of?a?data?base.?
?一組以數(shù)據(jù)定義語言來表達(dá)的語句集,該語句集完整地描述了數(shù)據(jù)庫的結(jié)構(gòu)。
select?into?outfile?:?
假如您覺得mysqldump工具不夠酷,就使用select?into?outfile吧,?mysql同樣提供一個(gè)跟load?data?infile命令有相反作用的命令,這就是select?into?outfile?命令,這兩個(gè)命令有很多的相似之處。首先,它們有所有的選項(xiàng)幾乎相同?,F(xiàn)在您需要完成前面用mysqldump完成的功能,可以依照下面的步驟進(jìn)行操作:?
1.?確保mysqld進(jìn)程(服務(wù))已經(jīng)在運(yùn)行?
?2.?cd?/usr/local/mysql?
?3.?bin/mysqladmin?ping?;//?假如這個(gè)句子通不過,可以用這個(gè):mysqladmin?-u?root?-p?ping?
mysqladmin?ping用于檢測mysqld的狀態(tài),is?alive說明正在運(yùn)行,出錯(cuò)則可能需要用戶名和密碼。?
?4.?啟動(dòng)mysql?監(jiān)聽程序.?
?5.?bin/mysql?–p?meet_a_geek;//?進(jìn)入mysql命令行,并且打開數(shù)據(jù)庫meet_a_geek,需要輸入密碼?
?6.?在命令行中,輸入一下命令:?
select?*?into?outfile?'/home/mark/orders.txt'?
?fields?
?terminated?by?=?','?
?from?orders?
?where?order_date?>=?'2000-01-01'?
在你按了return(回車)之后,文件就創(chuàng)建了。這個(gè)句子就像一個(gè)規(guī)則的select語句,只是把想屏幕的輸出重定向到了文件中。這意味這您可以使用join來實(shí)現(xiàn)多表的高級查詢。這個(gè)特點(diǎn)也可以被用作一個(gè)報(bào)表產(chǎn)生器。?
比方說,您可以組合這一章中討論的方法來產(chǎn)生一個(gè)非常有趣的查詢,試試這個(gè):?
在mysql目錄建立一個(gè)名為report_g.rpt?的文本文件,加入下面的行:?
use?meet_a_geek;?
?insert?into?customers?(customer_id,?last_name,?first_name)?
?values?(null,?"kinnard",?"vicky");?
?insert?into?customers?(customer_id,?last_name,?first_name)?
?values?(null,?"kinnard",?"steven");?
?insert?into?customers?(customer_id,?last_name,?first_name)?
?values?(null,?"brown",?"sam");?
?select?last_name?into?outfile?'/home/mark/report.rpt'?
?from?customers?where?customer_id?>?1;?
然后確認(rèn)?mysql進(jìn)程在運(yùn)行,并且您在mysql目錄中,?輸入下面的命令:?
bin/mysql?<?report_g.rpt檢查您命名作為輸出的文件,這個(gè)文件將會(huì)包含所有您在customers表中輸入的顧客的姓。?如您所見,您可以使用今天學(xué)到的導(dǎo)入/導(dǎo)出(import/export)的方法來幫助得到報(bào)表。?查看全文?
關(guān)于mssql數(shù)據(jù)庫的字段
?
數(shù)據(jù)類型是數(shù)據(jù)的一種屬性,表示數(shù)據(jù)所表示信息的類型。任何一種計(jì)算機(jī)語言都定義了自己的數(shù)據(jù)類型。當(dāng)然,不同的程序語言都具有不同的特點(diǎn),所定義的數(shù)據(jù)類型的各類和名稱都或多或少有些不同。sqlserver提供了25種數(shù)據(jù)類型:
·binary[(n)]
·varbinary[(n)]
·char[(n)]
·varchar[(n)]
·nchar[(n)]
·nvarchar[(n)]
·datetime
·smalldatetime
·decimal[(p[,s])]
·numeric[(p[,s])]
·float[(n)]
·real
·int
·smallint
·tinyint
·money
·smallmoney
·bit
·cursor
·sysname
·timestamp
·uniqueidentifier
·text
·image
·ntext
(1)二進(jìn)制數(shù)據(jù)類型
二進(jìn)制數(shù)據(jù)包括binary、varbinary和image
binary數(shù)據(jù)類型既可以是固定長度的(binary),也可以是變長度的。
binary[(n)]是n位固定的二進(jìn)制數(shù)據(jù)。其中,n的取值范圍是從1到8000。其存儲(chǔ)窨的大小是n+4個(gè)字節(jié)。
varbinary[(n)]是n位變長度的二進(jìn)制數(shù)據(jù)。其中,n的取值范圍是從1到8000。其存儲(chǔ)窨的大小是n+4個(gè)字節(jié),不是n個(gè)字節(jié)。
在image數(shù)據(jù)類型中存儲(chǔ)的數(shù)據(jù)是以位字符串存儲(chǔ)的,不是由sqlserver解釋的,必須由應(yīng)用程序來解釋。例如,應(yīng)用程序可以使用bmp、tief、gif和jpeg格式把數(shù)據(jù)存儲(chǔ)在image數(shù)據(jù)類型中。
(2)字符數(shù)據(jù)類型
字符數(shù)據(jù)的類型包括char,varchar和text
字符數(shù)據(jù)是由任何字母、符號(hào)和數(shù)字任意組合而成的數(shù)據(jù)。
varchar是變長字符數(shù)據(jù),其長度不超過8kb。char是定長字符數(shù)據(jù),其長度最多為8kb。超過8kb的ascii數(shù)據(jù)可以使用text數(shù)據(jù)類型存儲(chǔ)。例如,因?yàn)閔tml文檔全部都是ascii字符,并且在一般情況下長度超過8kb,所以這些文檔可以text數(shù)據(jù)類型存儲(chǔ)在sqlserver中。
(3)unicode數(shù)據(jù)類型
unicode數(shù)據(jù)類型包括nchar,nvarchar和ntext
在microsoftsqlserver中,傳統(tǒng)的非unicode數(shù)據(jù)類型答應(yīng)使用由特定字符集定義的字符。在sqlserver安裝過程中,答應(yīng)選擇一種字符集。使用unicode數(shù)據(jù)類型,列中可以存儲(chǔ)任何由unicode標(biāo)準(zhǔn)定義的字符。在unicode標(biāo)準(zhǔn)中,包括了以各種字符集定義的全部字符。使用unicode數(shù)據(jù)類型,所戰(zhàn)勝的窨是使用非unicode數(shù)據(jù)類型所占用的窨大小的兩倍。
在sqlserver中,unicode數(shù)據(jù)以nchar、nvarchar和ntext數(shù)據(jù)類型存儲(chǔ)。使用這種字符類型存儲(chǔ)的列可以存儲(chǔ)多個(gè)字符集中的字符。當(dāng)列的長度變化時(shí),應(yīng)該使用nvarchar字符類型,這時(shí)最多可以存儲(chǔ)4000個(gè)字符。當(dāng)列的長度固定不變時(shí),應(yīng)該使用nchar字符類型,同樣,這時(shí)最多可以存儲(chǔ)4000個(gè)字符。當(dāng)使用ntext數(shù)據(jù)類型時(shí),該列可以存儲(chǔ)多于4000個(gè)字符。
(4)日期和時(shí)間數(shù)據(jù)類型
日期和時(shí)間數(shù)據(jù)類型包括datetime和smalldatetime兩種類型
日期和時(shí)間數(shù)據(jù)類型由有效的日期和時(shí)間組成。例如,有效的日期和時(shí)間數(shù)據(jù)包括“4/01/9812:15:00:00:00pm”和“1:28:29:15:01am8/17/98”。前一個(gè)數(shù)據(jù)類型是日期在前,時(shí)間在后一個(gè)數(shù)據(jù)類型是霎時(shí)間在前,日期在后。在microsoftsqlserver中,日期和時(shí)間數(shù)據(jù)類型包括datetime和smalldatetime兩種類型時(shí),所存儲(chǔ)的日期范圍是從1753年1月1日開始,到9999年12月31日結(jié)束(每一個(gè)值要求8個(gè)存儲(chǔ)字節(jié))。使用smalldatetime數(shù)據(jù)類型時(shí),所存儲(chǔ)的日期范圍是1900年1月1日開始,到2079年12月31日結(jié)束(每一個(gè)值要求4個(gè)存儲(chǔ)字節(jié))。
日期的格式可以設(shè)定。設(shè)置日期格式的命令如下:
setdateformat{format|@format_var|
其中,format|@format_var是日期的順序。有效的參數(shù)包括mdy、dmy、ymd、ydm、myd和dym。在默認(rèn)情況下,日期格式為mdy。
例如,當(dāng)執(zhí)行setdateformatymd之后,日期的格式為年月日形式;當(dāng)執(zhí)行setdateformatdmy之后,日期的格式為日月有年形式
(5)數(shù)字?jǐn)?shù)據(jù)類型
數(shù)字?jǐn)?shù)據(jù)只包含數(shù)字。數(shù)字?jǐn)?shù)據(jù)類型包括正數(shù)和負(fù)數(shù)、小數(shù)(浮點(diǎn)數(shù))和整數(shù)
整數(shù)由正整數(shù)和負(fù)整數(shù)組成,例如39、25、0-2和33967。在micrsoftsqlserver中,整數(shù)存儲(chǔ)的數(shù)據(jù)類型是 int,smallint和tinyint。int數(shù)據(jù)類型存儲(chǔ)數(shù)據(jù)的范圍大于smallint數(shù)據(jù)類型存儲(chǔ)數(shù)據(jù)的范圍,而smallint據(jù)類型存儲(chǔ)數(shù)據(jù)的范圍大于tinyint數(shù)據(jù)類型存儲(chǔ)數(shù)據(jù)的范圍。使用int數(shù)據(jù)狗昔存儲(chǔ)數(shù)據(jù)的范圍是從-2147483648到2147483647(每一個(gè)值要求4個(gè)字節(jié)存儲(chǔ)空間)。使用smallint數(shù)據(jù)類型時(shí),存儲(chǔ)數(shù)據(jù)的范圍從-32768到32767(每一個(gè)值要求2個(gè)字節(jié)存儲(chǔ)空間)。使用tinyint數(shù)據(jù)類型時(shí),存儲(chǔ)數(shù)據(jù)的范圍是從0到255(每一個(gè)值要求1個(gè)字節(jié)存儲(chǔ)空間)。
精確小婁數(shù)據(jù)在sqlserver中的數(shù)據(jù)類型是decimal和numeric。這種數(shù)據(jù)所占的存儲(chǔ)空間根據(jù)該數(shù)據(jù)的位數(shù)后的位數(shù)來確定。
在sqlserver中,近似小數(shù)數(shù)據(jù)的數(shù)據(jù)類型是float和real。例如,三分之一這個(gè)分?jǐn)?shù)記作。3333333,當(dāng)使用近似數(shù)據(jù)類型時(shí)能正確表示。因此,從系統(tǒng)中檢索到的數(shù)據(jù)可能與存儲(chǔ)在該列中數(shù)據(jù)不完全一樣。
(6)貨幣數(shù)據(jù)表示正的或者負(fù)的貨幣數(shù)量。
在microsoftsqlserver中,貨幣數(shù)據(jù)的數(shù)據(jù)類型是money和smallmoney
money數(shù)據(jù)類型要求8個(gè)存儲(chǔ)字節(jié),smallmoney數(shù)據(jù)類型要求4個(gè)存儲(chǔ)字節(jié)。
(7)非凡數(shù)據(jù)類型
非凡數(shù)據(jù)類型包括前面沒有提過的數(shù)據(jù)類型。非凡的數(shù)據(jù)類型有3種,即 timestamp、bit和uniqueidentifier。
timestamp用于表示sqlserver活動(dòng)的先后順序,以二進(jìn)投影的格式表示。timestamp數(shù)據(jù)與插入數(shù)據(jù)或者日期和時(shí)間沒有關(guān)系。
bit由1或者0組成。當(dāng)表示真或者假、on或者off時(shí),使用bit數(shù)據(jù)類型。例如,詢問是否是每一次訪問的客戶機(jī)請求可以存儲(chǔ)在這種數(shù)據(jù)類型的列中。
uniqueidentifier由16字節(jié)的十六進(jìn)制數(shù)字組成,表示一個(gè)全局唯一的。當(dāng)表的記錄行要求唯一時(shí),guid是非常有用。例如,在客戶標(biāo)識(shí)號(hào)列使用這種數(shù)據(jù)類型可以區(qū)別不同的客戶。
2.用戶定義的數(shù)據(jù)類型
用戶定義的數(shù)據(jù)類型基于在microsoftsqlserver中提供的數(shù)據(jù)類型。當(dāng)幾個(gè)表中必須存儲(chǔ)同一種數(shù)據(jù)類型時(shí),并且為保證這些列有相同的數(shù)據(jù)類型、長度和可空性時(shí),可以使用用戶定義的數(shù)據(jù)類型。例如,可定義一種稱為 postal_code的數(shù)據(jù)類型,它基于char數(shù)據(jù)類型。
當(dāng)創(chuàng)建用戶定義的數(shù)據(jù)類型時(shí),必須提供三個(gè)數(shù):數(shù)據(jù)類型的名稱、所基于的系統(tǒng)數(shù)據(jù)類型和數(shù)據(jù)類型的可空性。
(1)創(chuàng)建用戶定義的數(shù)據(jù)類型
創(chuàng)建用戶定義的數(shù)據(jù)類型可以使用transact-sql語句。系統(tǒng)存儲(chǔ)過程sp_addtype可以來創(chuàng)建用戶定義的數(shù)據(jù)類型。其語法形式如下:
sp_addtype{type},[,system_data_bype][,'null_type']
其中,type是用戶定義的數(shù)據(jù)類型的名稱。system_data_type是系統(tǒng)提供的數(shù)據(jù)類型,例如decimal、int、char 等等。null_type表示該數(shù)據(jù)類型是如何處理空值的,必須使用單引號(hào)引起來,例如'null'、'notnull'或者'nonull'。
例子:
usecust
execsp_addtypessn,'varchar(11)',"notnull'
創(chuàng)建一個(gè)用戶定義的數(shù)據(jù)類型ssn,其基于的系統(tǒng)數(shù)據(jù)類型是變長為11的字符,不答應(yīng)空。
例子:
usecust
execsp_addtypebirthday,datetime,'null'
創(chuàng)建一個(gè)用戶定義的數(shù)據(jù)類型birthday,其基于的系統(tǒng)數(shù)據(jù)類型是datetime,答應(yīng)空。
例子:
usemaster
execsp_addtypetelephone,'varchar(24),'notnull'
eexcsp_addtypefax,'varchar(24)','null'
創(chuàng)建兩個(gè)數(shù)據(jù)類型,即telephone和fax
(2)刪除用戶定義的數(shù)據(jù)類型
當(dāng)用戶定義的數(shù)據(jù)類型不需要時(shí),可刪除。刪除用戶定義的數(shù)據(jù)類型的命令是sp_droptype{'type'}。
例子:
usemaster
execsp_droptype'ssn'
注重:當(dāng)表中的列還正在使用用戶定義的數(shù)據(jù)類型時(shí),或者在其上面還綁定有默認(rèn)或者規(guī)則時(shí),這種用戶定義的數(shù)據(jù)類型不能刪除。
sqlserver的字段類型說明
以下為sql?server7.0以上版本的字段類型說明。sql?server6.5的字段類型說明請參考sql?server提供的說明。?
字段類型
?描述
?
bit?0或1的整型數(shù)字?
int?從-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型數(shù)字?
smallint?從-2^15(-32,768)到2^15(32,767)的整型數(shù)字?
tinyint?從0到255的整型數(shù)字?
?
?
decimal?從-10^38到10^38-1的定精度與有效位數(shù)的數(shù)字?
numeric?decimal的同義詞?
?
?
money?從-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的貨幣數(shù)據(jù),最小貨幣單位千分之十?
smallmoney?從-214,748.3648到214,748.3647的貨幣數(shù)據(jù),最小貨幣單位千分之十?
?
?
float?從-1.79e+308到1.79e+308可變精度的數(shù)字?
real?從-3.04e+38到3.04e+38可變精度的數(shù)字?
?
?
datetime?從1753年1月1日到9999年12日31的日期和時(shí)間數(shù)據(jù),最小時(shí)間單位為百分之三秒或3.33毫秒?
smalldatetime?從1900年1月1日到2079年6月6日的日期和時(shí)間數(shù)據(jù),最小時(shí)間單位為分鐘?
?
?
timestamp?時(shí)間戳,一個(gè)數(shù)據(jù)庫寬度的唯一數(shù)字?
uniqueidentifier?全球唯一標(biāo)識(shí)符guid?
?
?
char?定長非unicode的字符型數(shù)據(jù),最大長度為8000?
varchar?變長非unicode的字符型數(shù)據(jù),最大長度為8000?
text?變長非unicode的字符型數(shù)據(jù),最大長度為2^31-1(2g)?
?
?
nchar?定長unicode的字符型數(shù)據(jù),最大長度為8000?
nvarchar?變長unicode的字符型數(shù)據(jù),最大長度為8000?
ntext?變長unicode的字符型數(shù)據(jù),最大長度為2^31-1(2g)?
?
?
binary?定長二進(jìn)制數(shù)據(jù),最大長度為8000?
varbinary?變長二進(jìn)制數(shù)據(jù),最大長度為8000?
image?變長二進(jìn)制數(shù)據(jù),最大長度為2^31-1(2g)?
--語?句 功?能
--數(shù)據(jù)操作
select --從數(shù)據(jù)庫表中檢索數(shù)據(jù)行和列
insert --向數(shù)據(jù)庫表添加新數(shù)據(jù)行
delete --從數(shù)據(jù)庫表中刪除數(shù)據(jù)行
update --更新數(shù)據(jù)庫表中的數(shù)據(jù)?
--數(shù)據(jù)定義?
create?table --創(chuàng)建一個(gè)數(shù)據(jù)庫表
drop?table ?--從數(shù)據(jù)庫中刪除表?
alter?table ?--修改數(shù)據(jù)庫表結(jié)構(gòu)
create?view ?--創(chuàng)建一個(gè)視圖?
drop?view ?--從數(shù)據(jù)庫中刪除視圖
create?index --為數(shù)據(jù)庫表創(chuàng)建一個(gè)索引
drop?index ?--從數(shù)據(jù)庫中刪除索引?
create?procedure ?--創(chuàng)建一個(gè)存儲(chǔ)過程?
drop?procedure --從數(shù)據(jù)庫中刪除存儲(chǔ)過程
create?trigger --創(chuàng)建一個(gè)觸發(fā)器?
drop?trigger --從數(shù)據(jù)庫中刪除觸發(fā)器
create?schema --向數(shù)據(jù)庫添加一個(gè)新模式
drop?schema ?--從數(shù)據(jù)庫中刪除一個(gè)模式
create?domain --創(chuàng)建一個(gè)數(shù)據(jù)值域
alter?domain --改變域定義
drop?domain ?--從數(shù)據(jù)庫中刪除一個(gè)域
--數(shù)據(jù)控制?
grant --授予用戶訪問權(quán)限
deny --拒絕用戶訪問?
revoke --解除用戶訪問權(quán)限
--事務(wù)控制
commit --結(jié)束當(dāng)前事務(wù)
rollback ?--中止當(dāng)前事務(wù)?
set?transaction --定義當(dāng)前事務(wù)數(shù)據(jù)訪問特征
--程序化sql?
declare --為查詢設(shè)定游標(biāo)?
explan --為查詢描述數(shù)據(jù)訪問計(jì)劃
open --檢索查詢結(jié)果打開一個(gè)游標(biāo)
fetch --檢索一行查詢結(jié)果?
close --關(guān)閉游標(biāo)
prepare --為動(dòng)態(tài)執(zhí)行預(yù)備sql?語句?
execute --動(dòng)態(tài)地執(zhí)行sql?語句
describe ?--描述預(yù)備好的查詢?
---局部變量
declare?@id?char(10)?
--set?@id?=?’10010001’?
select?@id?=?’10010001’
---全局變量?
---必須以@@開頭
mssql常用匯總
?
下列語句部分是mssql語句,不可以在access中使用。
sql分類:?
ddl—數(shù)據(jù)定義語言(create,alter,drop,declare)?
dml—數(shù)據(jù)操縱語言(select,delete,update,insert)?
dcl—數(shù)據(jù)控制語言(grant,revoke,commit,rollback)
首先,簡要介紹基礎(chǔ)語句:
1、說明:創(chuàng)建數(shù)據(jù)庫
create?database?database-name?
2、說明:刪除數(shù)據(jù)庫
drop?database?dbname
3、說明:備份sql?server
---?創(chuàng)建?備份數(shù)據(jù)的?device
use?master
exec?sp_addumpdevice?'disk',?'testback',?'c:mssql7backupmynwind_1.dat'
---?開始?備份
backup?database?pubs?to?testback?
4、說明:創(chuàng)建新表
create?table?tabname(col1?type1?[not?null]?[primary?key],col2?type2?[not?null],..)
根據(jù)已有的表創(chuàng)建新表:?
a:create?table?tab_new?like?tab_old?(使用舊表創(chuàng)建新表)
b:create?table?tab_new?as?select?col1,col2…?from?tab_old?definition?only
5、說明:刪除新表drop?table?tabname?
6、說明:增加一個(gè)列
alter?table?tabname?add?column?col?type
注:列增加后將不能刪除。db2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長度。
7、說明:添加主鍵:?alter?table?tabname?add?primary?key(col)?
說明:刪除主鍵:?alter?table?tabname?drop?primary?key(col)?
8、說明:創(chuàng)建索引:create?[unique]?index?idxname?on?tabname(col….)?
刪除索引:drop?index?idxname
注:索引是不可更改的,想更改必須刪除重新建。
9、說明:創(chuàng)建視圖:create?view?viewname?as?select?statement?
刪除視圖:drop?view?viewname
10、說明:幾個(gè)簡單的基本的sql語句
選擇:select?*?from?table1?where?范圍
插入:insert?into?table1(field1,field2)?values(value1,value2)
刪除:delete?from?table1?where?范圍
更新:update?table1?set?field1=value1?where?范圍
查找:select?*?from?table1?where?field1?like?’%value1%’?---like的語法很精妙,查資料!
排序:select?*?from?table1?order?by?field1,field2?[desc]
總數(shù):select?count(*)?as?totalcount?from?table1
求和:select?sum(field1)?as?sumvalue?from?table1
平均:select?avg(field1)?as?avgvalue?from?table1
最大:select?max(field1)?as?maxvalue?from?table1
最小:select?min(field1)?as?minvalue?from?table1
11、說明:幾個(gè)高級查詢運(yùn)算詞
a:?union?運(yùn)算符?
union?運(yùn)算符通過組合其他兩個(gè)結(jié)果表(例如?table1?和?table2)并消去表中任何重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng)?all?隨?union?一起使用時(shí)(即?union?all),不消除重復(fù)行。兩種情況下,派生表的每一行不是來自?table1?就是來自?table2。?
b:?except?運(yùn)算符?
except?運(yùn)算符通過包括所有在?table1?中但不在?table2?中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng)?all?隨?except?一起使用時(shí)?(except?all),不消除重復(fù)行。?
c:?intersect?運(yùn)算符
intersect?運(yùn)算符通過只包括?table1?和?table2?中都有的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng)?all?隨?intersect?一起使用時(shí)?(intersect?all),不消除重復(fù)行。?
注:使用運(yùn)算詞的幾個(gè)查詢結(jié)果行必須是一致的。?
12、說明:使用外連接?
a、left?outer?join:?
左外連接(左連接):結(jié)果集幾包括連接表的匹配行,也包括左連接表的所有行。?
sql:?select?a.a,?a.b,?a.c,?b.c,?b.d,?b.f?from?a?left?out?join?b?on?a.a?=?b.c
b:right?outer?join:?
右外連接(右連接):結(jié)果集既包括連接表的匹配連接行,也包括右連接表的所有行。?
c:full?outer?join:?
全外連接:不僅包括符號(hào)連接表的匹配行,還包括兩個(gè)連接表中的所有記錄。
其次,大家來看一些不錯(cuò)的sql語句
1、說明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a?新表名:b)?(access可用)
法一:select?*?into?b?from?a?where?1<>1
法二:select?top?0?*?into?b?from?a
2、說明:拷貝表(拷貝數(shù)據(jù),源表名:a?目標(biāo)表名:b)?(access可用)
insert?into?b(a,?b,?c)?select?d,e,f?from?b;
3、說明:跨數(shù)據(jù)庫之間表的拷貝(具體數(shù)據(jù)使用絕對路徑)?(access可用)
insert?into?b(a,?b,?c)?select?d,e,f?from?b?in?‘具體數(shù)據(jù)庫’?where?條件
例子:..from?b?in?'"&server.mappath(".")&"data.mdb"?&"'?where..
4、說明:子查詢(表名1:a?表名2:b)
select?a,b,c?from?a?where?a?in?(select?d?from?b?)?或者:?select?a,b,c?from?a?where?a?in?(1,2,3)
5、說明:顯示文章、提交人和最后回復(fù)時(shí)間
select?a.title,a.username,b.adddate?from?table?a,(select?max(adddate)?adddate?from?table?where?table.title=a.title)?b
6、說明:外連接查詢(表名1:a?表名2:b)
select?a.a,?a.b,?a.c,?b.c,?b.d,?b.f?from?a?left?out?join?b?on?a.a?=?b.c
7、說明:在線視圖查詢(表名1:a?)
select?*?from?(select?a,b,c?from?a)?t?where?t.a?>?1;
8、說明:between的用法,between限制查詢數(shù)據(jù)范圍時(shí)包括了邊界值,not?between不包括
select?*?from?table1?where?time?between?time1?and?time2
select?a,b,c,?from?table1?where?a?not?between?數(shù)值1?and?數(shù)值2
9、說明:in?的使用方法
select?*?from?table1?where?a?[not]?in?(‘值1’,’值2’,’值4’,’值6’)
10、說明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息?
delete?from?table1?where?not?exists?(?select?*?from?table2?where?table1.field1=table2.field1?)
11、說明:四表聯(lián)查問題:
select?*?from?a?left?inner?join?b?on?a.a=b.b?right?inner?join?c?on?a.a=c.c?inner?join?d?on?a.a=d.d?where?.....
12、說明:日程安排提前五分鐘提醒?
sql:?select?*?from?日程安排?where?datediff('minute',f開始時(shí)間,getdate())>5
13、說明:一條sql?語句搞定數(shù)據(jù)庫分頁
select?top?10?b.*?from?(select?top?20?主鍵字段,排序字段?from?表名?order?by?排序字段?desc)?a,表名?b?where?b.主鍵字段?=?a.主鍵字段?order?by?a.排序字段
14、說明:前10條記錄
select?top?10?*?form?table1?where?范圍
15、說明:選擇在每一組b值相同的數(shù)據(jù)中對應(yīng)的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產(chǎn)品分析,按科目成績排名,等等.)
select?a,b,c?from?tablename?ta?where?a=(select?max(a)?from?tablename?tb?where?tb.b=ta.b)
16、說明:包括所有在?tablea?中但不在?tableb和tablec?中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表
(select?a?from?tablea?)?except?(select?a?from?tableb)?except?(select?a?from?tablec)
17、說明:隨機(jī)取出10條數(shù)據(jù)
select?top?10?*?from?tablename?order?by?newid()
18、說明:隨機(jī)選擇記錄
select?newid()
19、說明:刪除重復(fù)記錄
delete?from?tablename?where?id?not?in?(select?max(id)?from?tablename?group?by?col1,col2,...)
20、說明:列出數(shù)據(jù)庫里所有的表名
select?name?from?sysobjects?where?type='u'?
21、說明:列出表里的所有的
select?name?from?syscolumns?where?id=object_id('tablename')
22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實(shí)現(xiàn)多重選擇,類似select?中的case。
select?type,sum(case?vender
?
?
代碼 --使用sql語句從數(shù)據(jù)庫讀出數(shù)據(jù)字典select??表名=case?when?a.colorder=1?then?d.name?else?''?end,?
???????字段序號(hào)=a.colorder,?字段名=a.name,?標(biāo)識(shí)=case?when?columnproperty(?a.id,a.name,'isidentity')=1?then?'√'else?''?end,?
????????主鍵=case?when?exists(select?1?from?sysobjects?where?xtype='pk'?and?name?in?
?????????????????????????????(??select?name?from?sysindexes?where?indid?in
?????????????????????????????(???select?indid?from?sysindexkeys?where?id?=?a.id?and?colid=a.colid??)))?then?'√'?else?''?end,?
??????????????????????????????類型=b.name,?占用字節(jié)數(shù)=a.length,?長度=columnproperty(a.id,a.name,'precision'),?
?????????????????小數(shù)位數(shù)=isnull(columnproperty(a.id,a.name,'scale'),0),?答應(yīng)空=case?when?a.isnullable=1?then?'√'else?''?end,?
??????????????????默認(rèn)值=isnull(e.text,''),?字段說明=isnull(g.[value],'')
?from?syscolumns?a?left?join?systypes?b?on?a.xtype=b.xusertype?inner?join?sysobjects?d?on?a.id=d.id??
?and?d.xtype='u'?and??d.name<>'dtproperties'?left?join?syscomments?e?on?a.cdefault=e.id?
?left?join?sysproperties?g?on?a.id=g.id?and?a.colid=g.smallid??order?by?a.id,a.colorder
轉(zhuǎn)載于:https://www.cnblogs.com/Donkey/archive/2010/07/09/1774181.html
總結(jié)
以上是生活随笔為你收集整理的(转载)sql语句大全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FAT16文件系统之DBR(二)
- 下一篇: 【转载】我是如何通过高级系统架构师软考的