[转]SQL语句大全
生活随笔
收集整理的這篇文章主要介紹了
[转]SQL语句大全
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[轉]SQL語句大全
SQL語句大全
--語?句?功?能
--數據操作
SELECT?--從數據庫表中檢索數據行和列
INSERT?--向數據庫表添加新數據行
DELETE?--從數據庫表中刪除數據行
UPDATE?--更新數據庫表中的數據
--數據定義
CREATE?TABLE?--創建一個數據庫表
DROP?TABLE?--從數據庫中刪除表
ALTER?TABLE?--修改數據庫表結構
CREATE?VIEW?--創建一個視圖
DROP?VIEW?--從數據庫中刪除視圖
CREATE?INDEX?--為數據庫表創建一個索引
DROP?INDEX?--從數據庫中刪除索引
CREATE?PROCEDURE?--創建一個存儲過程
?
DROP?PROCEDURE?--從數據庫中刪除存儲過程
CREATE?TRIGGER?--創建一個觸發器
DROP?TRIGGER?--從數據庫中刪除觸發器
CREATE?SCHEMA?--向數據庫添加一個新模式
DROP?SCHEMA?--從數據庫中刪除一個模式
CREATE?DOMAIN?--創建一個數據值域
ALTER?DOMAIN?--改變域定義
DROP?DOMAIN?--從數據庫中刪除一個域
--數據控制
GRANT?--授予用戶訪問權限
DENY?--拒絕用戶訪問
REVOKE?--解除用戶訪問權限
--事務控制
COMMIT?--結束當前事務
ROLLBACK?--中止當前事務
SET?TRANSACTION?--定義當前事務數據訪問特征
--程序化SQL
DECLARE?--為查詢設定游標
EXPLAN?--為查詢描述數據訪問計劃
OPEN?--檢索查詢結果打開一個游標
FETCH?--檢索一行查詢結果
CLOSE?--關閉游標
PREPARE?--為動態執行準備SQL?語句
EXECUTE?--動態地執行SQL?語句
DESCRIBE?--描述準備好的查詢?
---局部變量
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?小時2?分零3?秒后才執行SELECT?語句
waitfor?delay?’01:02:03’
select?*?from?employee
--例?等到晚上11?點零8?分后才執行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列號
stockname?=?(select?stockname?from?stock_information?where?stockid?=?4)
---------?子查詢
---------?除非能確保內層select只返回一個行的值,
---------?否則應在外層where子句中用一個in限定符
select?distinct?column_name?form?table_name?---------?distinct指定檢索獨有的列值,不重復
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合并查詢結果集,all-保留重復行
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***?---?修改數據庫表結構
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?.........?-----?實現刪除列的方法(創建新表)
alter?table?table_name?drop?constraint?Stockname_default?----?刪除Stockname的default約束
***function(/*常用函數*/)***
----統計函數----
AVG?--求平均值
COUNT?--統計數目
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()函數返回表達式中所有數據的標準差
--STDEVP()
--STDEVP()函數返回總體標準差
--VAR()
--VAR()函數返回表達式中所有值的統計變異數
--VARP()
--VARP()函數返回總體變異數
----算術函數----
/***三角函數***/
SIN(float_expression)?--返回以弧度表示的角的正弦
COS(float_expression)?--返回以弧度表示的角的余弦
TAN(float_expression)?--返回以弧度表示的角的正切
COT(float_expression)?--返回以弧度表示的角的余切
/***反三角函數***/
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)
--把弧度轉換為角度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT?類型
RADIANS(numeric_expression)?--把角度轉換為弧度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT?類型
EXP(float_expression)?--返回表達式的指數值
LOG(float_expression)?--返回表達式的自然對數值
LOG10(float_expression)--返回表達式的以10?為底的對數值
SQRT(float_expression)?--返回表達式的平方根
/***取近似值函數***/
CEILING(numeric_expression)?--返回>=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT?類型
FLOOR(numeric_expression)?--返回<=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT?類型
ROUND(numeric_expression)?--返回以integer_expression?為精度的四舍五入值返回的數據
--類型與表達式相同可為INTEGER/MONEY/REAL/FLOAT?類型
ABS(numeric_expression)?--返回表達式的絕對值返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT?類型
SIGN(numeric_expression)?--測試參數的正負號返回0?零值1?正數或-1?負數返回的數據類型
--與表達式相同可為INTEGER/MONEY/REAL/FLOAT?類型
PI()?--返回值為π?即3.1415926535897936
RAND([integer_expression])?--用任選的[integer_expression]做種子值得出0-1?間的隨機浮點數
----字符串函數----
ASCII()?--函數返回字符表達式最左端字符的ASCII?碼值
CHAR()?--函數用于將ASCII?碼轉換為字符
--如果沒有輸入0?~?255?之間的ASCII?碼值CHAR?函數會返回一個NULL?值
LOWER()?--函數把字符串全部轉換為小寫
UPPER()?--函數把字符串全部轉換為大寫
STR()?--函數把數值型數據轉換為字符型數據
LTRIM()?--函數把字符串頭部的空格去掉
RTRIM()?--函數把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING()?--函數返回部分字符串
CHARINDEX(),PATINDEX()?--函數返回字符串中某個指定的子串出現的開始位置
SOUNDEX()?--函數返回一個四位字符碼?
--SOUNDEX函數可用來查找聲音相似的字符串但SOUNDEX函數對數字和漢字均只返回0?值?
DIFFERENCE()?--函數返回由SOUNDEX?函數返回的兩個字符表達式的值的差異
--0?兩個SOUNDEX?函數返回值的第一個字符不同
--1?兩個SOUNDEX?函數返回值的第一個字符相同
--2?兩個SOUNDEX?函數返回值的第一二個字符相同
--3?兩個SOUNDEX?函數返回值的第一二三個字符相同
--4?兩個SOUNDEX?函數返回值完全相同
QUOTENAME()?--函數返回被特定字符括起來的字符串
/*select?quotename('abc',?'{')?quotename('abc')
運行結果如下:
----------------------------------
{abc}?[abc]*/
REPLICATE()?--函數返回一個重復character_expression?指定次數的字符串
/*select?replicate('abc',?3)?replicate(?'abc',?-2)
運行結果如下:
-----------?-----------
abcabcabc?NULL
REVERSE()?--函數將指定的字符串的字符排列順序顛倒
REPLACE()?--函數返回被替換了指定子串的字符串
/*select?replace('abc123g',?'123',?'def')
運行結果如下:
-----------?-----------
abcdefg*/
SPACE()?--函數返回一個有指定長度的空白字符串
STUFF()?--函數用另一子串替換字符串指定位置長度的子串
----數據類型轉換函數----
CAST()?函數語法如下
CAST()?(<expression>?AS?<data_?type>[?length?])
CONVERT()?函數語法如下
CONVERT()?(<data_?type>[?length?],?<expression>?[,?style])
select?cast(100+99?as?char)?convert(varchar(12),?getdate())
運行結果如下
------------------------------?------------
199?Jan?15?2000
----日期函數----
DAY()?--函數返回date_expression?中的日期值
MONTH()?--函數返回date_expression?中的月份值
YEAR()?--函數返回date_expression?中的年份值
DATEADD(<datepart>?,<number>?,<date>)?
--函數返回指定日期date?加上指定的額外日期間隔number?產生的新日期
DATEDIFF(<datepart>?,<number>?,<date>)
--函數返回兩個指定日期在datepart?方面的不同之處
DATENAME(<datepart>?,?<date>)?--函數以字符串的形式返回日期的指定部分
DATEPART(<datepart>?,?<date>)?--函數以整數值的形式返回日期的指定部分
GETDATE()?--函數以DATETIME?的缺省格式返回系統當前的日期和時間
----系統函數----
APP_NAME()?--函數返回當前執行的應用程序的名稱
COALESCE()?--函數返回眾多表達式中第一個非NULL?表達式的值
COL_LENGTH(<'table_name'>,?<'column_name'>)?--函數返回表中指定字段的長度值
COL_NAME(<table_id>,?<column_id>)?--函數返回表中指定字段的名稱即列名
DATALENGTH()?--函數返回數據表達式的數據的實際長度
DB_ID(['database_name'])?--函數返回數據庫的編號
DB_NAME(database_id)?--函數返回數據庫的名稱
HOST_ID()?--函數返回服務器端計算機的名稱
HOST_NAME()?--函數返回服務器端計算機的名稱
IDENTITY(<data_type>[,?seed?increment])?[AS?column_name])
--IDENTITY()?函數只在SELECT?INTO?語句中使用用于插入一個identity?column列到新表中
/*select?identity(int,?1,?1)?as?column_name
into?newtable
from?oldtable*/
ISDATE()?--函數判斷所給定的表達式是否為合理日期
ISNULL(<check_expression>,?<replacement_value>)?--函數將表達式中的NULL?值用指定值替換
ISNUMERIC()?--函數判斷所給定的表達式是否為合理的數值
NEWID()?--函數返回一個UNIQUEIDENTIFIER?類型的數值
NULLIF(<expression1>,?<expression2>)
--NULLIF?函數在expression1?與expression2?相等時返回NULL?值若不相等時則返回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編程
在進行數據庫操作時,無非就是添加、刪除、修改,這得設計到一些常用的SQL語句,如下:?
SQL常用命令使用方法:
(1)?數據記錄篩選:
sql="select?*?from?數據表?where?字段名=字段值?order?by?字段名?[desc]"
sql="select?*?from?數據表?where?字段名?like?%字段值%?order?by?字段名?[desc]"
sql="select?top?10?*?from?數據表?where?字段名?order?by?字段名?[desc]"
sql="select?*?from?數據表?where?字段名?in?(值1,值2,值3)"
sql="select?*?from?數據表?where?字段名?between?值1?and?值2"
(2)?更新數據記錄:
sql="update?數據表?set?字段名=字段值?where?條件表達式"
sql="update?數據表?set?字段1=值1,字段2=值2?……?字段n=值n?where?條件表達式"
(3)?刪除數據記錄:
sql="delete?from?數據表?where?條件表達式"
sql="delete?from?數據表"?(將數據表所有記錄刪除)
(4)?添加數據記錄:
sql="insert?into?數據表?(字段1,字段2,字段3?…)?valuess?(值1,值2,值3?…)"
sql="insert?into?目標數據表?select?*?from?源數據表"?(把源數據表的記錄添加到目標數據表)
(5)?數據記錄統計函數:
AVG(字段名)?得出一個表格欄平均值
COUNT(*|字段名)?對數據行數的統計或對某一欄有值的數據行數統計
MAX(字段名)?取得一個表格欄最大的值
MIN(字段名)?取得一個表格欄最小的值
SUM(字段名)?把數據欄的值相加
引用以上函數的方法:
sql="select?sum(字段名)?as?別名?from?數據表?where?條件表達式"
set?rs=conn.excute(sql)
用?rs("別名")?獲取統的計值,其它函數運用同上。
(6)?數據表的建立和刪除:
CREATE?TABLE?數據表名稱(字段1?類型1(長度),字段2?類型2(長度)?……?)
例:CREATE?TABLE?tab01(name?varchar(50),datetime?default?now())
DROP?TABLE?數據表名稱?(永久性刪除一個數據表)
在ASP編程時,下面這些語句是必須知道的:
1.連接數據庫
a.?ASP與Access數據庫連接:
<%@?language=VBs?cript%>
<%
dim?conn,mdbfile
mdbfile=server.mappath("數據庫名稱.mdb")
set?conn=server.createobject("adodb.connection")
conn.open?"driver={microsoft?access?driver?(*.mdb)};uid=admin;pwd=數據庫密碼;dbq="&mdbfile
%>
b.?ASP與SQL數據庫連接:
<%@?language=VBs?cript%>
<%
dim?conn
set?conn=server.createobject("ADODB.connection")
con.open?"PROVIDER=SQLOLEDB;DATA?SOURCE=SQL服務器名稱或IP地址;UID=sa;PWD=數據庫密碼;DATABASE=數據庫名稱
%>
建立記錄集對象:
set?rs=server.createobject("adodb.recordset")
rs.open?SQL語句,conn,3,2
2.?記錄集對象的方法:
rs.movenext?將記錄指針從當前的位置向下移一行
rs.moveprevious?將記錄指針從當前的位置向上移一行
rs.movefirst?將記錄指針移到數據表第一行
rs.movelast?將記錄指針移到數據表最后一行
rs.absoluteposition=N?將記錄指針移到數據表第N行
rs.absolutepage=N?將記錄指針移到第N頁的第一行
rs.pagesize=N?設置每頁為N條記錄
rs.pagecount?根據?pagesize?的設置返回總頁數
rs.recordcount?返回記錄總數
rs.bof?返回記錄指針是否超出數據表首端,true表示是,false為否
rs.eof?返回記錄指針是否超出數據表末端,true表示是,false為否
rs.delete?刪除當前記錄,但記錄指針不會向下移動
rs.addnew?添加記錄到數據表末端
rs.update?更新數據表記錄
附:
常數?常數值?說明
--------------------------------
adLockReadOnly?1?缺省值,Recordset對象以只讀方式啟動,無法運行AddNew、Update及Delete等方法
adLockPrssimistic?2?當數據源正在更新時,系統會暫時鎖住其他用戶的動作,以保持數據一致性。
adLockOptimistic?3?當數據源正在更新時,系統并不會鎖住其他用戶的動作,其他用戶可以對數據進行增、刪、改的操作。
adLockBatchOptimistic?4?當數據源正在更新時,其他用戶必須將CursorLocation屬性改為adUdeClientBatch才能對數據進行增、刪、改的操作。
MSSQL經典語句?
?
1.按姓氏筆畫排序:Select?*?From?TableName?Order?By?CustomerName?Collate?Chinese_PRC_Stroke_ci_as?
2.數據庫加密: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.查看硬盤分區: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.殺掉所有的事件探察器進程: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到結尾記錄
Select?Top?N?*?From?表?Order?by?ID?Desc
8.如何修改數據庫的名稱:sp_renamedb?'old_name',?'new_name'?
9:獲取當前數據庫中的所有用戶表select?Name?from?sysobjects?where?xtype='u'?and?status>=0
10:獲取某一個表的所有字段select?name?from?syscolumns?where?id=object_id('表名')
11:查看與某一個表相關的視圖、存儲過程、函數select?a.*?from?sysobjects?a,?syscomments?b?where?a.id?=?b.id?and?b.text?like?'%表名%'
12:查看當前數據庫中所有存儲過程select?name?as?存儲過程名稱?from?sysobjects?where?xtype='P'
13:查詢用戶創建的所有數據庫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:查詢某一個表的字段和數據類型select?column_name,data_type?from?information_schema.columns
where?table_name?=?'表名'?
[n].[標題]:Select?*?From?TableName?Order?By?CustomerName?
[n].[標題]:Select?*?From?TableName?Order?By?CustomerName?
from:http://tb.blog.csdn.net/TrackBack.aspx?PostId=585515
?
觸發器-MSSQL常用操作
?
不再新開文章.
這里只打算講解四部分了,也就最簡單、最常用的四部分。
1、觸發器。
定義:?何為觸發器?在SQL?Server里面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。觸發器是一個特殊的存儲過程。
常見的觸發器有三種:分別應用于Insert?,?Update?,?Delete?事件。(SQL?Server?2000定義了新的觸發器,這里不提)
我為什么要使用觸發器?比如,這么兩個表:
Create?Table?Student(?--學生表
StudentID?int?primary?key,?--學號
....
)
Create?Table?BorrowRecord(?--學生借書記錄表
BorrowRecord?int?identity(1,1),?--流水號?
StudentID?int?,?--學號
BorrowDate?datetime,?--借出時間
ReturnDAte?Datetime,?--歸還時間
...
)
用到的功能有:
1.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是同時更改借書記錄表的學號);
2.如果該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。
等等。
這時候可以用到觸發器。對于1,創建一個Update觸發器:
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?
理解觸發器里面的兩個臨時的表:Deleted?,?Inserted?。注意Deleted?與Inserted分別表示觸發事件的表“舊的一條記錄”和“新的一條記錄”。
一個Update?的過程可以看作為:生成新的記錄到Inserted表,復制舊的記錄到Deleted表,然后刪除Student記錄并寫入新紀錄。
對于2,創建一個Delete觸發器
Create?trigger?trdStudent
On?Student
for?Delete
As
Delete?BorrowRecord?
From?BorrowRecord?br?,?Delted?d
Where?br.StudentID=d.StudentID
從這兩個例子我們可以看到了觸發器的關鍵:A.2個臨時的表;B.觸發機制。
這里我們只講解最簡單的觸發器。復雜的容后說明。
事實上,我不鼓勵使用觸發器。觸發器的初始設計思想,已經被“級聯”所替代.
?
MSSQL數據庫導出和導入
?
SQL?Server導出導入數據方法
?
?一、導出導入SQL?Server里某個數據庫?
?
1.?在SQL?Server企業管理器里選中要轉移的數據庫,按鼠標右鍵,選所有任務->備份數據庫。?
2.?備份?選數據庫-完全,?目的?備份到?按添加按鈕?文件名?在SQL?Server服務器硬盤下輸入一個自定義的備份數據庫文件名(后綴一般是bak)?重寫?選重寫現有媒體?最后按確定按鈕。?如果生成的備份數據庫文件大于1M,要用壓縮工具壓縮后再到Internet上傳輸。?
3.?通過FTP或者remote?desktop或者pcanywhere等方法?把第二步生成的備份數據庫文件或者其壓縮后的文件傳到目的SQL?Server數據庫,如果有壓縮要解壓。?4.目的SQL?Server數據庫如果還沒有此數據庫,先創建一個新的數據庫;?然后選中這個新創建的數據庫,按鼠標右鍵,選所有任務->還原數據庫?還原->從設備->選擇設備->磁盤->添加(找到要導入的備份數據庫文件名)->確定?還原備份集->數據庫-完全?最后按確定按鈕。完全的數據庫導入成功了。?(如果在已經存在的SQL?Server數據庫上還原數據庫可能遇到有還有其它人正在使用它而恢復操做失敗,?可以去看?->管理->當前活動->鎖/對象->找到數據庫下鎖的進程號->到查詢分析器里用kill?進程號殺掉這些鎖,?然后再做還原)?
注意:
如果在原有的目的SQL?Server數據庫上從備份文件(*.bak)還原數據庫?會把已經存在的表、存儲過程等數據庫對:象全部替換成最近這次導入的備份數據庫里的內容。?如果一定要還原備份文件(*.bak)里部分數據,需要另外建一個新數據庫,?其邏輯名稱和數量同備份文件(*.bak)里數據庫的邏輯名稱和數量一致;?新數據庫的物理文件名稱取得一定要和備份文件(*.bak)里數據庫的物理文件不一樣才行。?
?
二、導出導入SQL?Server里某個表?
?
1.?沒有防火墻,同一個局域網里或不在同一個局域網里,但通過Internet可以互相訪問?在SQL?Server企業管理器里選中目的數據庫?,按鼠標右鍵,選所有任務->導入數據->?彈出數據轉換服務導入/導出向導窗口->下一步->?選數據源->?數據源(用于SQL?Server的Microfost?OLE?DB提供程序)->?服務器(可選擇局域網內能訪問到的所有SQL?Server服務器,或者直接輸入IP地址)->?選擇使用windows身份驗證還是使用SQL?Serve身份驗證(輸入數據庫的用戶名和密碼)->?數據庫(可選擇上面選中SQL?Server服務器上所有權限范圍內的數據庫)->下一步->?選擇目的->目的(用于SQL?Server的Microfost?OLE?DB提供程序)->?服務器(默認為上一步里選中的導出服務器,也可以選其它局域網內能訪問到的所有SQL?Server服務器,或者直接輸入IP地址)->?目的數據庫(可選擇上面選中SQL?Server服務器上所有權限范圍內的數據庫)->下一步->?制定表復制或查詢->選從源數據庫復制表和視圖(也可以選擇用一條查詢指定要傳輸的數據)->下一步->?選擇源表和視圖->在要導入的表和視圖前面選中源->目的出現同樣的表名(可以手工修改成別的表名)->?轉換->列映射和轉換里面可以修改源表和目的表之間字段的對應關系,修改目的表字段的類型和長度等,?并可以選擇創建目的表,在目的表中增加行,除去并重新創建目的表,啟用標志插入等選項->確定->下一步->?保存、調度和復制包->時間->立即運行(如果要實現隔一段時間自動導出導入數據,選調度DTS包以便以后執行)->?保存(可以不選)->[?保存DTS包(如果以后還要轉移這批相同的數據,可以把本次導出導入的內容和步驟保存起來,?存到SQL?Server即可,保存的時候要輸入DTS的包名及詳細描述)->下一步->?]->完成?正在執行包->圖形界面顯示創建表及插入記錄的步驟和狀態->完成?
2.?經過防火墻,不在同一個局域網里?①、導出表里的數據到文本文件:?在SQL?Server企業管理器里選中目的數據庫,按鼠標右鍵,選所有任務->?導入數據->彈出數據轉換服務導入/導出向導窗口->下一步->?選數據源->?數據源(用于SQL?Server的Microfost?OLE?DB提供程序)->?服務器(可選擇局域網內能訪問到的所有SQL?Server服務器)->?選擇使用windows身份驗證還是使用SQL?Serve身份驗證(輸入數據庫的用戶名和密碼)->?數據庫(可選擇上面選中SQL?Server服務器上所有權限范圍內的數據庫)->下一步->?選擇目的->目的(文本文件)->?文件名(在自己的電腦硬盤中生成一個自定義的文本文件)?->下一步->?制定表復制或查詢->選從源數據庫復制表和視圖(也可以選擇用一條查詢指定要傳輸的數據)->下一步->?選擇目的文件格式->源(選擇要導出的表)->用默認的帶分隔符->選第一行包含有列名稱選項->下一步->?保存、調度和復制包->時間->立即運行(如果要實現隔一段時間自動導出到文本文件,選調度DTS包以便以后執行)->?保存(可以不選)->?[保存DTS包(保存的時候要輸入DTS的包名及詳細描述)->下一步->]->完成?正在執行包->圖形界面顯示表到文本文件的步驟和狀態->完成?如果生成的文本文件大于1M,要用壓縮工具壓縮后再到Internet上傳輸。?②、通過FTP或者remote?desktop或者pcanywhere等方法把?第①步生成的文本文件或者其壓縮后的文件傳到目的SQL?Server數據庫,如果有壓縮要解壓。?③、把文本文件導入目的SQL?Server數據庫?直接把文本文件導入目的SQL?Server數據庫里跟文本文件同名的新表名時,默認的會把所有字段類型都變成字符串。?所以我們要這樣做:?在源SQL?Server數據庫上先生成創建表的sql語句?在SQL?Server查詢分析器里->選中源數據庫里表名->按右鍵->在新窗口中編寫對象腳本->創建->?復制下新窗口內創建表名的sql語句?到目標SQL?Server數據庫上查詢分析器里執行創建表名的sql語句,生成空表結構。?(如果已經存在這樣的表名,修改建表的sql語句,在表名后面加上導入時間的年月信息,例如table_0113)?調用導入/導出工具->彈出數據轉換服務導入/導出向導窗口->下一步->?選數據源->?數據源(文本文件)->?文件名(已傳到目的SQL?Server數據庫下要導入的文本文件,后綴可以不是*.txt,?但是常規文本編輯器能打開的文件,文件類型選全部)->下一步->?選擇文件格式->用默認的帶分隔符->選第一行包含有列名稱選項->下一步->?制定列分割符->逗號->下一步->?選擇目的->目的(用于SQL?Server的Microfost?OLE?DB提供程序)->?服務器(可選擇目標局域網內能訪問到的所有SQL?Server服務器)->?選擇使用windows身份驗證還是使用SQL?Serve身份驗證(輸入數據庫的用戶名和密碼)->?數據庫(可選擇上面選中SQL?Server服務器上所有權限范圍內的數據庫)->下一步->?選擇源表和視圖->修改目的表名為剛才創建的表名->轉換(在目的表中追加行)?->下一步->?保存、調度和復制包->?時間->立即運行(如果要實現隔一段時間自動把文本文件導入,選調度DTS包以便以后執行)->?保存(可以不選)->?[保存DTS包(保存的時候要輸入DTS的包名及詳細描述)->下一步->]->完成?正在執行包->圖形界面顯示文本文件到表的步驟和狀態->完成?如果要更改導入時間的年月信息的表名,例如table_0113到原來的表名,?在企業管理器里把原來的表名改成table_old_0113,table_0113改名成table。?這會對應用程序里頻繁訪問的表照成一定的中斷。?
注意:
源表上的建的索引和主鍵約束不能用上面介紹的1和2方法轉移過來,還需要手工來建索引和主鍵。?標志種子和not?null的約束可以繼承過來。?導入視圖時會把源視圖里所有的真實數據導入成一個新表,而不是視圖。
?
?三、SQL?Server存儲過程或用戶定義的函數導出導入
?
?1、導出存儲過程或用戶定義的函數成*.sql文件?在SQL?Server企業管理器里選中源數據庫,?存儲過程->單選或者多選中要轉移的存儲過程->?用戶定義的函數->單選或者多選中要轉移的函數->?按鼠標右鍵,選所有任務->生成SQL腳本->確定->在自己的電腦硬盤中生成一個自定義的*.sql文件->?保存->正在生成SQL腳本->成功?2、如果目的數據庫經過防火墻,不在同一個局域網里,?要通過FTP或者remote?desktop或者pcanywhere等方法把第1步生成的*.sql文件傳到目的SQL?Server數據庫服務器上。?3、用查詢分析器進入SQL?Server目的數據庫,?從菜單里選文件->打開->打開查詢文件->選中第1步生成的*.sql文件->點執行查詢的綠色倒三角型快捷鍵->?查詢窗口里會出現執行后的消息(有時候可能因為存儲過程和用戶定義的函數之間有一定的依賴關系,會報一些錯。?最好先執行用戶定義的函數的*.sql文件,再執行存儲過程的*.sql文件)?
?
四、ORACLE數據庫里表導入SQL?Server數據庫
?
?1、在目的SQL?Server數據庫服務器上安裝ORACLE?Client軟件或者ORACLE?ODBC?Driver.?在$ORACLE_HOMEnetworkadmintnsnames.ora里配置ORACLE數據庫的別名(service?name)。?
?2、在WIN2000或者win2003服務器->管理工具->數據源(ODBC)->?系統DSN(本機器上NT域用戶都可以用)->添加->ORACLE?ODBC?Driver->完成->?data?source?name?可以自定義,我一般填ORACLE數據庫的sid標志,?description里可以填ORACLE數據庫詳細描述,也可以不填->?data?source?service?name?填第1步定義的ORACLE數據庫別名->OK。?(用戶DSN和文件DSN也可以類似配置,但使用的時候有一些限制)
?3、SQL?Server的導入和導出數據工具里->選數據源->?數據源(其它(ODBC數據源))->?選第2步在ODBC里定義的系統DSN?source?name,用戶名密碼處填寫ORACLE系統的用戶名和密碼->?下一步->選擇目的,選SQL?Server數據庫(跟上面第二點講的一致,就不重復了)。
注意:
在ORACLE表和SQL?Server表之間'轉換'那步很重要,?可以改變默認的字段數據類型,如image->text,decimal->int?
?
五、SQL?Server數據庫里表導入ORACLE數據庫
?
?方法一.導出目的選通過ODBC數據源里定義的ORACLE數據庫,?注意ORACLE里表名都是大寫的.?我一般在ORACLE這邊先生成好表結構,再選擇SQL?SERVER源表往ORACLE目的表里追加數據.?數據傳輸速度比方法二慢.?方法二.從SQL?Server數據庫導入數據到ORACLE數據庫可以選擇用Windows下ORACLE9i企業或者個人版數據庫做中轉。?
(?注意:ORACLE通過訪問SQL?Server的數據庫鏈接時,用select?*?的時候字段名是用雙引號引起來的。)?
?
MySQL數據庫導出和導入
1).MySQLimport的語法介紹:?
MySQLimport位于MySQL/bin目錄中,是MySQL的一個載入(或者說導入)數據的一個非常有效的工具。這是一個命令行工具。有兩個參數以及大量的選項可供選擇。這個工具把一個文本文件(text?file)導入到你指定的數據庫和表中。比方說我們要從文件Customers.txt中把數據導入到數據庫Meet_A_Geek中的表Custermers中:?
MySQLimport?Meet_A_Geek?Customers.txt?
注意:這里Customers.txt是我們要導入數據的文本文件,而Meet_A_Geek是我們要操作的數據庫,數據庫中的表名是Customers,這里文本文件的數據格式必須與Customers表中的記錄格式一致,否則MySQLimport命令將會出錯。
其中表的名字是導入文件的第一個句號(.)前面文件字符串,另外一個例子:MySQLimport?Meet_A_Geek?Cus.to.mers.txt
那么我們將把文件中的內容導入到數據庫Meet_A_Geek?中的Cus表中。?
上面的例子中,都只用到兩個參數,并沒有用到更多的選項,下面介紹MySQLimport的選項?
2).MySQLimport的常用選項介紹:?
選項?功能?
-d?or?--delete?新數據導入數據表中之前刪除數據數據表中的所有信息?
-f?or?--force?不管是否遇到錯誤,MySQLimport將強制繼續插入數據?
-i?or?--ignore?MySQLimport跳過或者忽略那些有相同唯一關鍵字的行,?導入文件中的數據將被忽略。?
-l?or?-lock-tables?數據被插入之前鎖住表,這樣就防止了,你在更新數據庫時,用戶的查詢和更新受到影響。?
-r?or?-replace?這個選項與-i選項的作用相反;此選項將替代表中有相同唯一關鍵字的記錄。?
--fields-enclosed-?by=?char?指定文本文件中數據的記錄時以什么括起的,?很多情況下數據以雙引號括起。?默認的情況下數據是沒有被字符括起的。?
--fields-terminated-?by=char?指定各個數據的值之間的分隔符,在句號分隔的文件中,分隔符是句號。您可以用此選項指定數據之間的分隔符。
默認的分隔符是跳格符(Tab)?
--lines-terminated-?by=str?此選項指定文本文件中行與行之間數據的分隔字符串或者字符。?默認的情況下MySQLimport以newline為行分隔符。?
您可以選擇用一個字符串來替代一個單個的字符:?
一個新行或者一個回車。?
MySQLimport命令常用的選項還有-v?顯示版本(version),-p?提示輸入密碼(password)等。?
3).例子:導入一個以逗號為分隔符的文件?
文件中行的記錄格式是這樣的:?
"1",?"ORD89876",?"1?Dozen?Roses",?"19991226"?
我們的任務是要把這個文件里面的數據導入到數據庫Meet_A_Geek中的表格Orders中,我們使用這個命令:?
bin/MySQLimport?–prl?–fields-enclosed-by="?–fields-terminated-by=,?Meet_A_Geek?Orders.txt?
這個命令可能看起來很不爽,不過當你熟悉了之后,這是非常簡單的。第一部分,bin/MySQLimport?,告訴操作系統你要運行的命令是MySQL/bin目錄下的MySQLimport,選項p是要求輸入密碼,這樣就要求你在改動數據庫之前輸入密碼,操作起來會更安全。?我們用了r選項是因為我們想要把表中的唯一關鍵字與文件記錄中有重復唯一關鍵字的記錄替換成文件中的數據。我們表單中的數據不是最新的,需要用文件中的數據去更新,因而就用r這個選項,替代數據庫中已經有的記錄。l選項的作用是在我們插入數據的時候鎖住表,這樣就阻止了用戶在我們更新表的時候對表進行查詢或者更改的操作。
批處理是一種非交互式運行MySQL程序的方法,如同您在MySQL中使用的命令一樣,你仍然將使用這些命令。?
為了實現批處理,您重定向一個文件到MySQL程序中,首先我們需要一個文本文件,這個文本文件包含有與我們在MySQL中輸入的命令相同的文本。?
比如我們要插入一些數據,使用包含下面文本的文件(文件名為New_Data.sql,當然我們也可以取名為New_Data.txt及任何其他的合法名字,并不一定要以后綴sql結尾):?
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");?
注意上面的這些句子的語法都必須是正確的,并且每個句子以分號結束。?
上面的USE命令選擇數據庫,INSERT命令插入數據。?
下面我們要把上面的文件導入到數據庫中,導入之前要確認數據庫已經在運行,即是MySQLd進程(或者說服務,Windows?NT下面稱為”服務“,unix下面為”進程“)已經在運行。?
然后運行下面的命令:?
bin/MySQL?–p?<?/home/mark/New_Data.sql?
接著按提示輸入密碼,如果上面的文件中的語句沒有錯誤,那么這些數據就被導入到了數據庫中。?
命令行中使用LOAD?DATA?INFILE?從文件中導入數據到數據庫:?
現在您可能會問自己,"究竟為什么我要輸入所有的這些SQL語句到文件中,然后通過程序運行它們呢?”?
這樣看起來好像需要大量的工作。很好,你這樣想很可能就對了。但是假如你有從所有這些命令中產生的log記錄呢?現在這樣就很棒,嗯,大多數數據庫都會自動產生數據庫中的事件記錄的log。而大部分log都包含有用過的原始的SQL命令。因此,如果您不能從您現在的數據庫中導出數據到新的MySQL數據庫中使用,那么您可以使用log和MySQL的批處理特性,來快速且方便地導入您地數據。當然,這樣就省去了打字的麻煩。?
LOAD?DATA?INFILE?
這是我們要介紹的最后一個導入數據到MySQL數據庫中的方法。這個命令與MySQLimport非常相似,但這個方法可以在MySQL命令行中使用。也就是說您可以在所有使用API的程序中使用這個命令。使用這種方法,您就可以在應用程序中導入您想要導入的數據。?
使用這個命令之前,MySQLd進程(服務)必須已經在運行。
啟動MySQL命令行:
bin/MySQL?–p?
按提示輸入密碼,成功進入MySQL命令行之后,輸入下面的命令:
USE?Meet_A_Geek;?
LOAD?DATA?INFILE?"/home/mark/data.sql"?INTO?TABLE?Orders;?
簡單的講,這樣將會把文件data.sql中的內容導入到表Orders中,如MySQLimport工具一樣,這個命令也有一些可以選擇的參數。比如您需要把自己的電腦上的數據導入到遠程的數據庫服務器中,您可以使用下面的命令:?
LOAD?DATA?LOCAL?INFILE?"C:MyDocsSQL.txt"?INTO?TABLE?Orders;?
上面的LOCAL參數表示文件是本地的文件,服務器是您所登陸的服務器。?
這樣就省去了使用ftp來上傳文件到服務器,MySQL替你完成了.?
您也可以設置插入語句的優先級,如果您要把它標記為低優先級(LOW_PRIORITY),那么MySQL將會等到沒有其他人讀這個表的時候,才把插入數據。可以使用如下的命令:?
?LOAD?DATA?LOW_PRIORITY?INFILE?"/home/mark/data.sql"?INTO?TABLE?Orders;?
您也可以指定是否在插入數據的時候,取代或者忽略文件與數據表中重復的鍵值。替代重復的鍵值的語法:?
LOAD?DATA?LOW_PRIORITY?INFILE?"/home/mark/data.sql"?REPLACE?INTO?TABLE?Orders;?
上面的句子看起來有點笨拙,但卻把關鍵字放在了讓您的剖析器可以理解的地方。?
下面的一對選項描述了文件的記錄格式,這些選項也是在MySQLimport工具中可以用的。他們在這里看起來有點不同。首先,要用到FIELDS關鍵字,如果用到這個關鍵字,MySQL剖析器希望看到至少有下面的一個選項:
TERMINATED?BY?character?
?ENCLOSED?BY?character?
?ESCAPED?BY?character?
這些關鍵字與它們的參數跟MySQLimport中的用法是一樣的.?The?
?TERMINATED?BY?描述字段的分隔符,默認情況下是tab字符(t)?
?ENCLOSED?BY描述的是字段的括起字符。比方以引號括起每一個字段。?
?ESCAPED?BY?描述的轉義字符。默認的是反些杠(backslash:?).?
下面仍然使用前面的MySQLimport命令的例子,用LOAD?DATA?INFILE語句把同樣的文件導入到數據庫中:?
LOAD?DATA?INFILE?"/home/mark/Orders.txt"?REPLACE?INTO?TABLE?Orders?FIELDS?TERMINATED?BY?','? ENCLOSED?BY?'"';?
LOAD?DATA?INFILE語句中有一個MySQLimport工具中沒有特點:?
LOAD?DATA?INFILE?可以按指定的列把文件導入到數據庫中。?
當我們要把數據的一部分內容導入的時候,這個特點就很重要。比方說,我們要從Access數據庫升級到MySQL數據庫的時候,需要加入一些欄目(列/字段/field)到MySQL數據庫中,以適應一些額外的需要。?
這個時候,我們的Access數據庫中的數據仍然是可用的,但是因為這些數據的欄目(field)與MySQL中的不再匹配,因此而無法再使用MySQLimport工具。盡管如此,我們仍然可以使用LOAD?DATA?INFILE,下面的例子顯示了如何向指定的欄目(field)中導入數據:?
LOAD?DATA?INFILE?"/home/Order.txt"?INTO?TABLE?Orders(Order_Number,?Order_Date,?Customer_ID);?
如您所見,我們可以指定需要的欄目(fields)。這些指定的字段依然是以括號括起,由逗號分隔的,如果您遺漏了其中任何一個,MySQL將會提醒您^_^?
Importing?Data?from?Microsoft?Access?(從Access中導入數據,略)
您可以看到MySQL有很多可以導入數據的方法,然而這些只是數據傳輸中的一半。另外的一般是從MySQL數據庫中導出數據。有許多的原因我們需要導出數據。一個重要的原因是用于備份數據庫。數據的造價常常是昂貴的,需要謹慎處理它們。經常地備份可以幫助防止寶貴數據地丟失;另外一個原因是,也許您希望導出數據來共享。?在這個信息技術不斷成長的世界中,共享數據變得越來越常見。?
比方說Macmillan?USA維護護著一個將要出版的書籍的大型數據庫。這個數據庫在許多書店之間共享,這樣他們就知道哪些書將會很快出版。醫院越來越走向采用無紙病歷記錄,這樣這些病歷可以隨時跟著你。世界變得越來越小,信息也被共享得越來越多。有很多中導出數據得方法,它們都跟導入數據很相似。因為,畢竟,這些都只是一種透視得方式。從數據庫導出的數據就是從另一端導入的數據。這里我們并不討論其他的數據庫各種各樣的導出數據的方法,您將學會如何用MySQL來實現數據導出。
使用MySQLdump:?
MySQLdump命令位于MySQL/bin/目錄中?
MySQLdump工具很多方面類似相反作用的工具MySQLimport。它們有一些同樣的選項。但MySQLdump能夠做更多的事情。它可以把整個數據庫裝載到一個單獨的文本文件中。這個文件包含有所有重建您的數據庫所需要的SQL命令。這個命令取得所有的模式(Schema,后面有解釋)并且將其轉換成DDL語法(CREATE語句,即數據庫定義語句),取得所有的數據,并且從這些數據中創建INSERT語句。這個工具將您的數據庫中所有的設計倒轉。因為所有的東西都被包含到了一個文本文件中。這個文本文件可以用一個簡單的批處理和一個合適SQL語句導回到MySQL中。這個工具令人難以置信地簡單而快速。決不會有半點讓人頭疼地地方。?
因此,如果您像裝載整個數據庫Meet_A_Geek的內容到一個文件中,可以使用下面的命令:?
?bin/MySQLdump?–p?Meet_A_Geek?>?MeetAGeek_Dump_File.txt?
這個語句也允許您指定一個表進行dump(備份/導出/裝載?)。如果您只是希望把數據庫Meet_A_Geek中的表Orders中的整個內容導出到一個文件,可以使用下面的命令:?
?bin/MySQLdump?–p?Meet_A_Geek?Orders?>MeetAGeek_Orders.txt?
這個非常的靈活,您甚至可以使用WHERE從句來選擇您需要的記錄導出到文件中。要達到這樣的目的,可以使用類似于下面的命令:?
?bin/MySQLdump?–p?–where="Order_ID?>?2000"?Meet_A_Geek?Orders?>?Special_Dump.txt?
MySQLdump工具有大量的選項,部分選項如下表:?
選項/Option?作用/Action?Performed?
--add-drop-table?
?這個選項將會在每一個表的前面加上DROP?TABLE?IF?EXISTS語句,這樣可以保證導回MySQL數據庫的時候不會出錯,因為每次導回的時候,都會首先檢查表是否存在,存在就刪除?
--add-locks?
?這個選項會在INSERT語句中捆上一個LOCK?TABLE和UNLOCK?TABLE語句。這就防止在這些記錄被再次導入數據庫時其他用戶對表進行的操作?
-c?or?-?complete_insert?
?這個選項使得MySQLdump命令給每一個產生INSERT語句加上列(field)的名字。當把數據導出導另外一個數據庫時這個選項很有用。?
--delayed-insert?在INSERT命令中加入DELAY選項?
?-F?or?-flush-logs?使用這個選項,在執行導出之前將會刷新MySQL服務器的log.?
?-f?or?-force?使用這個選項,即使有錯誤發生,仍然繼續導出?
?--full?這個選項把附加信息也加到CREATE?TABLE的語句中?
?-l?or?-lock-tables?使用這個選項,導出表的時候服務器將會給表加鎖。?
?-t?or?-no-create-?info?
?這個選項使的MySQLdump命令不創建CREATE?TABLE語句,這個選項在您只需要數據而不需要DDL(數據庫定義語句)時很方便。?
-d?or?-no-data?這個選項使的MySQLdump命令不創建INSERT語句。?
?在您只需要DDL語句時,可以使用這個選項。?
?--opt?此選項將打開所有會提高文件導出速度和創造一個可以更快導入的文件的選項。?
?-q?or?-quick?這個選項使得MySQL不會把整個導出的內容讀入內存再執行導出,而是在讀到的時候就寫入導文件中。?
?-T?path?or?-tab?=?path?這個選項將會創建兩個文件,一個文件包含DDL語句或者表創建語句,另一個文件包含數據。DDL文件被命名為table_name.sql,數據文件被命名為table_name.txt.路徑名是存放這兩個文件的目錄。目錄必須已經存在,并且命令的使用者有對文件的特權。?
-w?"WHERE?Clause"?or?-where?=?"Where?clause?"?
?如前面所講的,您可以使用這一選項來過篩選將要放到導出文件的數據。?
假定您需要為一個表單中要用到的帳號建立一個文件,經理要看今年(2004年)所有的訂單(Orders),它們并不對DDL感興趣,并且需要文件有逗號分隔,因為這樣就很容易導入到Excel中。?為了完成這個人物,您可以使用下面的句子:?
bin/MySQLdump?–p?–where?"Order_Date?>='2000-01-01'"?
?–tab?=?/home/mark?–no-create-info?–fields-terminated-by=,?Meet_A_Geek?Orders?
?這將會得到您想要的結果。?
schema:模式The?set?of?statements,?expressed?in?data?definition?language,?that?completely?describe?the?structure?of?a?data?base.?
?一組以數據定義語言來表達的語句集,該語句集完整地描述了數據庫的結構。
SELECT?INTO?OUTFILE?:?
如果您覺得MySQLdump工具不夠酷,就使用SELECT?INTO?OUTFILE吧,?MySQL同樣提供一個跟LOAD?DATA?INFILE命令有相反作用的命令,這就是SELECT?INTO?OUTFILE?命令,這兩個命令有很多的相似之處。首先,它們有所有的選項幾乎相同。現在您需要完成前面用MySQLdump完成的功能,可以依照下面的步驟進行操作:?
1.?確保MySQLd進程(服務)已經在運行?
?2.?cd?/usr/local/MySQL?
?3.?bin/MySQLadmin?ping?;//?如果這個句子通不過,可以用這個:MySQLadmin?-u?root?-p?ping?
MySQLadmin?ping用于檢測MySQLd的狀態,is?alive說明正在運行,出錯則可能需要用戶名和密碼。?
?4.?啟動MySQL?監聽程序.?
?5.?bin/MySQL?–p?Meet_A_Geek;//?進入MySQL命令行,并且打開數據庫Meet_A_Geek,需要輸入密碼?
?6.?在命令行中,輸入一下命令:?
SELECT?*?INTO?OUTFILE?'/home/mark/Orders.txt'?
?FIELDS?
?TERMINATED?BY?=?','?
?FROM?Orders?
?WHERE?Order_Date?>=?'2000-01-01'?
在你按了Return(回車)之后,文件就創建了。這個句子就像一個規則的SELECT語句,只是把想屏幕的輸出重定向到了文件中。這意味這您可以使用JOIN來實現多表的高級查詢。這個特點也可以被用作一個報表產生器。?
比方說,您可以組合這一章中討論的方法來產生一個非常有趣的查詢,試試這個:?
在MySQL目錄建立一個名為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;?
然后確認?MySQL進程在運行,并且您在MySQL目錄中,?輸入下面的命令:?
bin/MySQL?<?Report_G.rpt檢查您命名作為輸出的文件,這個文件將會包含所有您在Customers表中輸入的顧客的姓。?如您所見,您可以使用今天學到的導入/導出(import/export)的方法來幫助得到報表。?查看全文?
關于MSSQL數據庫的字段
?
數據類型是數據的一種屬性,表示數據所表示信息的類型。任何一種計算機語言都定義了自己的數據類型。當然,不同的程序語言都具有不同的特點,所定義的數據類型的各類和名稱都或多或少有些不同。SQLServer提供了25種數據類型:
·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)二進制數據類型
二進制數據包括Binary、Varbinary和Image
Binary數據類型既可以是固定長度的(Binary),也可以是變長度的。
Binary[(n)]是n位固定的二進制數據。其中,n的取值范圍是從1到8000。其存儲窨的大小是n+4個字節。
Varbinary[(n)]是n位變長度的二進制數據。其中,n的取值范圍是從1到8000。其存儲窨的大小是n+4個字節,不是n個字節。
在Image數據類型中存儲的數據是以位字符串存儲的,不是由SQLServer解釋的,必須由應用程序來解釋。例如,應用程序可以使用BMP、TIEF、GIF和JPEG格式把數據存儲在Image數據類型中。
(2)字符數據類型
字符數據的類型包括Char,Varchar和Text
字符數據是由任何字母、符號和數字任意組合而成的數據。
Varchar是變長字符數據,其長度不超過8KB。Char是定長字符數據,其長度最多為8KB。超過8KB的ASCII數據可以使用Text數據類型存儲。例如,因為Html文檔全部都是ASCII字符,并且在一般情況下長度超過8KB,所以這些文檔可以Text數據類型存儲在SQLServer中。
(3)Unicode數據類型
Unicode數據類型包括Nchar,Nvarchar和Ntext
在MicrosoftSQLServer中,傳統的非Unicode數據類型允許使用由特定字符集定義的字符。在SQLServer安裝過程中,允許選擇一種字符集。使用Unicode數據類型,列中可以存儲任何由Unicode標準定義的字符。在Unicode標準中,包括了以各種字符集定義的全部字符。使用Unicode數據類型,所戰勝的窨是使用非Unicode數據類型所占用的窨大小的兩倍。
在SQLServer中,Unicode數據以Nchar、Nvarchar和Ntext數據類型存儲。使用這種字符類型存儲的列可以存儲多個字符集中的字符。當列的長度變化時,應該使用Nvarchar字符類型,這時最多可以存儲4000個字符。當列的長度固定不變時,應該使用Nchar字符類型,同樣,這時最多可以存儲4000個字符。當使用Ntext數據類型時,該列可以存儲多于4000個字符。
(4)日期和時間數據類型
日期和時間數據類型包括Datetime和Smalldatetime兩種類型
日期和時間數據類型由有效的日期和時間組成。例如,有效的日期和時間數據包括“4/01/9812:15:00:00:00PM”和“1:28:29:15:01AM8/17/98”。前一個數據類型是日期在前,時間在后一個數據類型是霎時間在前,日期在后。在MicrosoftSQLServer中,日期和時間數據類型包括Datetime和Smalldatetime兩種類型時,所存儲的日期范圍是從1753年1月1日開始,到9999年12月31日結束(每一個值要求8個存儲字節)。使用Smalldatetime數據類型時,所存儲的日期范圍是1900年1月1日開始,到2079年12月31日結束(每一個值要求4個存儲字節)。
日期的格式可以設定。設置日期格式的命令如下:
SetDateFormat{format|@format_var|
其中,format|@format_var是日期的順序。有效的參數包括MDY、DMY、YMD、YDM、MYD和DYM。在默認情況下,日期格式為MDY。
例如,當執行SetDateFormatYMD之后,日期的格式為年月日形式;當執行SetDateFormatDMY之后,日期的格式為日月有年形式
(5)數字數據類型
數字數據只包含數字。數字數據類型包括正數和負數、小數(浮點數)和整數
整數由正整數和負整數組成,例如39、25、0-2和33967。在MicrsoftSQLServer中,整數存儲的數據類型是 Int,Smallint和Tinyint。Int數據類型存儲數據的范圍大于Smallint數據類型存儲數據的范圍,而Smallint據類型存儲數據的范圍大于Tinyint數據類型存儲數據的范圍。使用Int數據狗昔存儲數據的范圍是從-2147483648到2147483647(每一個值要求4個字節存儲空間)。使用Smallint數據類型時,存儲數據的范圍從-32768到32767(每一個值要求2個字節存儲空間)。使用Tinyint數據類型時,存儲數據的范圍是從0到255(每一個值要求1個字節存儲空間)。
精確小婁數據在SQLServer中的數據類型是Decimal和Numeric。這種數據所占的存儲空間根據該數據的位數后的位數來確定。
在SQLServer中,近似小數數據的數據類型是Float和Real。例如,三分之一這個分數記作。3333333,當使用近似數據類型時能準確表示。因此,從系統中檢索到的數據可能與存儲在該列中數據不完全一樣。
(6)貨幣數據表示正的或者負的貨幣數量。
在MicrosoftSQLServer中,貨幣數據的數據類型是Money和Smallmoney
Money數據類型要求8個存儲字節,Smallmoney數據類型要求4個存儲字節。
(7)特殊數據類型
特殊數據類型包括前面沒有提過的數據類型。特殊的數據類型有3種,即 Timestamp、Bit和Uniqueidentifier。
Timestamp用于表示SQLServer活動的先后順序,以二進投影的格式表示。Timestamp數據與插入數據或者日期和時間沒有關系。
Bit由1或者0組成。當表示真或者假、ON或者OFF時,使用Bit數據類型。例如,詢問是否是每一次訪問的客戶機請求可以存儲在這種數據類型的列中。
Uniqueidentifier由16字節的十六進制數字組成,表示一個全局唯一的。當表的記錄行要求唯一時,GUID是非常有用。例如,在客戶標識號列使用這種數據類型可以區別不同的客戶。
2.用戶定義的數據類型
用戶定義的數據類型基于在MicrosoftSQLServer中提供的數據類型。當幾個表中必須存儲同一種數據類型時,并且為保證這些列有相同的數據類型、長度和可空性時,可以使用用戶定義的數據類型。例如,可定義一種稱為 postal_code的數據類型,它基于Char數據類型。
當創建用戶定義的數據類型時,必須提供三個數:數據類型的名稱、所基于的系統數據類型和數據類型的可空性。
(1)創建用戶定義的數據類型
創建用戶定義的數據類型可以使用Transact-SQL語句。系統存儲過程sp_addtype可以來創建用戶定義的數據類型。其語法形式如下:
sp_addtype{type},[,system_data_bype][,'null_type']
其中,type是用戶定義的數據類型的名稱。system_data_type是系統提供的數據類型,例如Decimal、Int、Char 等等。null_type表示該數據類型是如何處理空值的,必須使用單引號引起來,例如'NULL'、'NOTNULL'或者'NONULL'。
例子:
Usecust
Execsp_addtypessn,'Varchar(11)',"NotNull'
創建一個用戶定義的數據類型ssn,其基于的系統數據類型是變長為11的字符,不允許空。
例子:
Usecust
Execsp_addtypebirthday,datetime,'Null'
創建一個用戶定義的數據類型birthday,其基于的系統數據類型是DateTime,允許空。
例子:
Usemaster
Execsp_addtypetelephone,'varchar(24),'NotNull'
Eexcsp_addtypefax,'varchar(24)','Null'
創建兩個數據類型,即telephone和fax
(2)刪除用戶定義的數據類型
當用戶定義的數據類型不需要時,可刪除。刪除用戶定義的數據類型的命令是sp_droptype{'type'}。
例子:
Usemaster
Execsp_droptype'ssn'
注意:當表中的列還正在使用用戶定義的數據類型時,或者在其上面還綁定有默認或者規則時,這種用戶定義的數據類型不能刪除。
SQLSERVER的字段類型說明
以下為SQL?SERVER7.0以上版本的字段類型說明。SQL?SERVER6.5的字段類型說明請參考SQL?SERVER提供的說明。?
字段類型
?描述
?
bit?0或1的整型數字?
int?從-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型數字?
smallint?從-2^15(-32,768)到2^15(32,767)的整型數字?
tinyint?從0到255的整型數字?
?
?
decimal?從-10^38到10^38-1的定精度與有效位數的數字?
numeric?decimal的同義詞?
?
?
money?從-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的貨幣數據,最小貨幣單位千分之十?
smallmoney?從-214,748.3648到214,748.3647的貨幣數據,最小貨幣單位千分之十?
?
?
float?從-1.79E+308到1.79E+308可變精度的數字?
real?從-3.04E+38到3.04E+38可變精度的數字?
?
?
datetime?從1753年1月1日到9999年12日31的日期和時間數據,最小時間單位為百分之三秒或3.33毫秒?
smalldatetime?從1900年1月1日到2079年6月6日的日期和時間數據,最小時間單位為分鐘?
?
?
timestamp?時間戳,一個數據庫寬度的唯一數字?
uniqueidentifier?全球唯一標識符GUID?
?
?
char?定長非Unicode的字符型數據,最大長度為8000?
varchar?變長非Unicode的字符型數據,最大長度為8000?
text?變長非Unicode的字符型數據,最大長度為2^31-1(2G)?
?
?
nchar?定長Unicode的字符型數據,最大長度為8000?
nvarchar?變長Unicode的字符型數據,最大長度為8000?
ntext?變長Unicode的字符型數據,最大長度為2^31-1(2G)?
?
?
binary?定長二進制數據,最大長度為8000?
varbinary?變長二進制數據,最大長度為8000?
image?變長二進制數據,最大長度為2^31-1(2G)?
--語?句 功?能
--數據操作
SELECT --從數據庫表中檢索數據行和列
INSERT --向數據庫表添加新數據行
DELETE --從數據庫表中刪除數據行
UPDATE --更新數據庫表中的數據?
--數據定義?
CREATE?TABLE --創建一個數據庫表
DROP?TABLE ?--從數據庫中刪除表?
ALTER?TABLE ?--修改數據庫表結構
CREATE?VIEW ?--創建一個視圖?
DROP?VIEW ?--從數據庫中刪除視圖
CREATE?INDEX --為數據庫表創建一個索引
DROP?INDEX ?--從數據庫中刪除索引?
CREATE?PROCEDURE ?--創建一個存儲過程?
DROP?PROCEDURE --從數據庫中刪除存儲過程
CREATE?TRIGGER --創建一個觸發器?
DROP?TRIGGER --從數據庫中刪除觸發器
CREATE?SCHEMA --向數據庫添加一個新模式
DROP?SCHEMA ?--從數據庫中刪除一個模式
CREATE?DOMAIN --創建一個數據值域
ALTER?DOMAIN --改變域定義
DROP?DOMAIN ?--從數據庫中刪除一個域
--數據控制?
GRANT --授予用戶訪問權限
DENY --拒絕用戶訪問?
REVOKE --解除用戶訪問權限
--事務控制
COMMIT --結束當前事務
ROLLBACK ?--中止當前事務?
SET?TRANSACTION --定義當前事務數據訪問特征
--程序化SQL?
DECLARE --為查詢設定游標?
EXPLAN --為查詢描述數據訪問計劃
OPEN --檢索查詢結果打開一個游標
FETCH --檢索一行查詢結果?
CLOSE --關閉游標
PREPARE --為動態執行準備SQL?語句?
EXECUTE --動態地執行SQL?語句
DESCRIBE ?--描述準備好的查詢?
---局部變量
declare?@id?char(10)?
--set?@id?=?’10010001’?
select?@id?=?’10010001’
---全局變量?
---必須以@@開頭
MSSQL常用匯總
?
下列語句部分是Mssql語句,不可以在access中使用。
SQL分類:?
DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE)?
DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT)?
DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,簡要介紹基礎語句:
1、說明:創建數據庫
CREATE?DATABASE?database-name?
2、說明:刪除數據庫
drop?database?dbname
3、說明:備份sql?server
---?創建?備份數據的?device
USE?master
EXEC?sp_addumpdevice?'disk',?'testBack',?'c:mssql7backupMyNwind_1.dat'
---?開始?備份
BACKUP?DATABASE?pubs?TO?testBack?
4、說明:創建新表
create?table?tabname(col1?type1?[not?null]?[primary?key],col2?type2?[not?null],..)
根據已有的表創建新表:?
A:create?table?tab_new?like?tab_old?(使用舊表創建新表)
B:create?table?tab_new?as?select?col1,col2…?from?tab_old?definition?only
5、說明:刪除新表drop?table?tabname?
6、說明:增加一個列
Alter?table?tabname?add?column?col?type
注:列增加后將不能刪除。DB2中列加上后數據類型也不能改變,唯一能改變的是增加varchar類型的長度。
7、說明:添加主鍵:?Alter?table?tabname?add?primary?key(col)?
說明:刪除主鍵:?Alter?table?tabname?drop?primary?key(col)?
8、說明:創建索引:create?[unique]?index?idxname?on?tabname(col….)?
刪除索引:drop?index?idxname
注:索引是不可更改的,想更改必須刪除重新建。
9、說明:創建視圖:create?view?viewname?as?select?statement?
刪除視圖:drop?view?viewname
10、說明:幾個簡單的基本的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]
總數: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、說明:幾個高級查詢運算詞
A:?UNION?運算符?
UNION?運算符通過組合其他兩個結果表(例如?TABLE1?和?TABLE2)并消去表中任何重復行而派生出一個結果表。當?ALL?隨?UNION?一起使用時(即?UNION?ALL),不消除重復行。兩種情況下,派生表的每一行不是來自?TABLE1?就是來自?TABLE2。?
B:?EXCEPT?運算符?
EXCEPT?運算符通過包括所有在?TABLE1?中但不在?TABLE2?中的行并消除所有重復行而派生出一個結果表。當?ALL?隨?EXCEPT?一起使用時?(EXCEPT?ALL),不消除重復行。?
C:?INTERSECT?運算符
INTERSECT?運算符通過只包括?TABLE1?和?TABLE2?中都有的行并消除所有重復行而派生出一個結果表。當?ALL?隨?INTERSECT?一起使用時?(INTERSECT?ALL),不消除重復行。?
注:使用運算詞的幾個查詢結果行必須是一致的。?
12、說明:使用外連接?
A、left?outer?join:?
左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。?
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:?
右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。?
C:full?outer?join:?
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
其次,大家來看一些不錯的sql語句
1、說明:復制表(只復制結構,源表名:a?新表名:b)?(Access可用)
法一:select?*?into?b?from?a?where?1<>1
法二:select?top?0?*?into?b?from?a
2、說明:拷貝表(拷貝數據,源表名:a?目標表名:b)?(Access可用)
insert?into?b(a,?b,?c)?select?d,e,f?from?b;
3、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑)?(Access可用)
insert?into?b(a,?b,?c)?select?d,e,f?from?b?in?‘具體數據庫’?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、說明:顯示文章、提交人和最后回復時間
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限制查詢數據范圍時包括了邊界值,not?between不包括
select?*?from?table1?where?time?between?time1?and?time2
select?a,b,c,?from?table1?where?a?not?between?數值1?and?數值2
9、說明:in?的使用方法
select?*?from?table1?where?a?[not]?in?(‘值1’,’值2’,’值4’,’值6’)
10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息?
delete?from?table1?where?not?exists?(?select?*?from?table2?where?table1.field1=table2.field1?)
11、說明:四表聯查問題:
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開始時間,getdate())>5
13、說明:一條sql?語句搞定數據庫分頁
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值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select?a,b,c?from?tablename?ta?where?a=(select?max(a)?from?tablename?tb?where?tb.b=ta.b)
16、說明:包括所有在?TableA?中但不在?TableB和TableC?中的行并消除所有重復行而派生出一個結果表
(select?a?from?tableA?)?except?(select?a?from?tableB)?except?(select?a?from?tableC)
17、說明:隨機取出10條數據
select?top?10?*?from?tablename?order?by?newid()
18、說明:隨機選擇記錄
select?newid()
19、說明:刪除重復記錄
Delete?from?tablename?where?id?not?in?(select?max(id)?from?tablename?group?by?col1,col2,...)
20、說明:列出數據庫里所有的表名
select?name?from?sysobjects?where?type='U'?
21、說明:列出表里的所有的
select?name?from?syscolumns?where?id=object_id('TableName')
22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現多重選擇,類似select?中的case。
select?type,sum(case?vender
SELECT??表名=case?when?a.colorder=1?then?d.name?else?''?end,?
???????字段序號=a.colorder,?字段名=a.name,?標識=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,?占用字節數=a.length,?長度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),?
?????????????????小數位數=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),?允許空=case?when?a.isnullable=1?then?'√'else?''?end,?
??????????????????默認值=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
?
??SQL語句大全
--語?句?功?能
--數據操作
SELECT?--從數據庫表中檢索數據行和列
INSERT?--向數據庫表添加新數據行
DELETE?--從數據庫表中刪除數據行
UPDATE?--更新數據庫表中的數據
--數據定義
CREATE?TABLE?--創建一個數據庫表
DROP?TABLE?--從數據庫中刪除表
ALTER?TABLE?--修改數據庫表結構
CREATE?VIEW?--創建一個視圖
DROP?VIEW?--從數據庫中刪除視圖
CREATE?INDEX?--為數據庫表創建一個索引
DROP?INDEX?--從數據庫中刪除索引
CREATE?PROCEDURE?--創建一個存儲過程
?
DROP?PROCEDURE?--從數據庫中刪除存儲過程
CREATE?TRIGGER?--創建一個觸發器
DROP?TRIGGER?--從數據庫中刪除觸發器
CREATE?SCHEMA?--向數據庫添加一個新模式
DROP?SCHEMA?--從數據庫中刪除一個模式
CREATE?DOMAIN?--創建一個數據值域
ALTER?DOMAIN?--改變域定義
DROP?DOMAIN?--從數據庫中刪除一個域
--數據控制
GRANT?--授予用戶訪問權限
DENY?--拒絕用戶訪問
REVOKE?--解除用戶訪問權限
--事務控制
COMMIT?--結束當前事務
ROLLBACK?--中止當前事務
SET?TRANSACTION?--定義當前事務數據訪問特征
--程序化SQL
DECLARE?--為查詢設定游標
EXPLAN?--為查詢描述數據訪問計劃
OPEN?--檢索查詢結果打開一個游標
FETCH?--檢索一行查詢結果
CLOSE?--關閉游標
PREPARE?--為動態執行準備SQL?語句
EXECUTE?--動態地執行SQL?語句
DESCRIBE?--描述準備好的查詢?
---局部變量
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?小時2?分零3?秒后才執行SELECT?語句
waitfor?delay?’01:02:03’
select?*?from?employee
--例?等到晚上11?點零8?分后才執行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列號
stockname?=?(select?stockname?from?stock_information?where?stockid?=?4)
---------?子查詢
---------?除非能確保內層select只返回一個行的值,
---------?否則應在外層where子句中用一個in限定符
select?distinct?column_name?form?table_name?---------?distinct指定檢索獨有的列值,不重復
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合并查詢結果集,all-保留重復行
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***?---?修改數據庫表結構
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?.........?-----?實現刪除列的方法(創建新表)
alter?table?table_name?drop?constraint?Stockname_default?----?刪除Stockname的default約束
***function(/*常用函數*/)***
----統計函數----
AVG?--求平均值
COUNT?--統計數目
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()函數返回表達式中所有數據的標準差
--STDEVP()
--STDEVP()函數返回總體標準差
--VAR()
--VAR()函數返回表達式中所有值的統計變異數
--VARP()
--VARP()函數返回總體變異數
----算術函數----
/***三角函數***/
SIN(float_expression)?--返回以弧度表示的角的正弦
COS(float_expression)?--返回以弧度表示的角的余弦
TAN(float_expression)?--返回以弧度表示的角的正切
COT(float_expression)?--返回以弧度表示的角的余切
/***反三角函數***/
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)
--把弧度轉換為角度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT?類型
RADIANS(numeric_expression)?--把角度轉換為弧度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT?類型
EXP(float_expression)?--返回表達式的指數值
LOG(float_expression)?--返回表達式的自然對數值
LOG10(float_expression)--返回表達式的以10?為底的對數值
SQRT(float_expression)?--返回表達式的平方根
/***取近似值函數***/
CEILING(numeric_expression)?--返回>=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT?類型
FLOOR(numeric_expression)?--返回<=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT?類型
ROUND(numeric_expression)?--返回以integer_expression?為精度的四舍五入值返回的數據
--類型與表達式相同可為INTEGER/MONEY/REAL/FLOAT?類型
ABS(numeric_expression)?--返回表達式的絕對值返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT?類型
SIGN(numeric_expression)?--測試參數的正負號返回0?零值1?正數或-1?負數返回的數據類型
--與表達式相同可為INTEGER/MONEY/REAL/FLOAT?類型
PI()?--返回值為π?即3.1415926535897936
RAND([integer_expression])?--用任選的[integer_expression]做種子值得出0-1?間的隨機浮點數
----字符串函數----
ASCII()?--函數返回字符表達式最左端字符的ASCII?碼值
CHAR()?--函數用于將ASCII?碼轉換為字符
--如果沒有輸入0?~?255?之間的ASCII?碼值CHAR?函數會返回一個NULL?值
LOWER()?--函數把字符串全部轉換為小寫
UPPER()?--函數把字符串全部轉換為大寫
STR()?--函數把數值型數據轉換為字符型數據
LTRIM()?--函數把字符串頭部的空格去掉
RTRIM()?--函數把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING()?--函數返回部分字符串
CHARINDEX(),PATINDEX()?--函數返回字符串中某個指定的子串出現的開始位置
SOUNDEX()?--函數返回一個四位字符碼?
--SOUNDEX函數可用來查找聲音相似的字符串但SOUNDEX函數對數字和漢字均只返回0?值?
DIFFERENCE()?--函數返回由SOUNDEX?函數返回的兩個字符表達式的值的差異
--0?兩個SOUNDEX?函數返回值的第一個字符不同
--1?兩個SOUNDEX?函數返回值的第一個字符相同
--2?兩個SOUNDEX?函數返回值的第一二個字符相同
--3?兩個SOUNDEX?函數返回值的第一二三個字符相同
--4?兩個SOUNDEX?函數返回值完全相同
QUOTENAME()?--函數返回被特定字符括起來的字符串
/*select?quotename('abc',?'{')?quotename('abc')
運行結果如下:
----------------------------------
{abc}?[abc]*/
REPLICATE()?--函數返回一個重復character_expression?指定次數的字符串
/*select?replicate('abc',?3)?replicate(?'abc',?-2)
運行結果如下:
-----------?-----------
abcabcabc?NULL
REVERSE()?--函數將指定的字符串的字符排列順序顛倒
REPLACE()?--函數返回被替換了指定子串的字符串
/*select?replace('abc123g',?'123',?'def')
運行結果如下:
-----------?-----------
abcdefg*/
SPACE()?--函數返回一個有指定長度的空白字符串
STUFF()?--函數用另一子串替換字符串指定位置長度的子串
----數據類型轉換函數----
CAST()?函數語法如下
CAST()?(<expression>?AS?<data_?type>[?length?])
CONVERT()?函數語法如下
CONVERT()?(<data_?type>[?length?],?<expression>?[,?style])
select?cast(100+99?as?char)?convert(varchar(12),?getdate())
運行結果如下
------------------------------?------------
199?Jan?15?2000
----日期函數----
DAY()?--函數返回date_expression?中的日期值
MONTH()?--函數返回date_expression?中的月份值
YEAR()?--函數返回date_expression?中的年份值
DATEADD(<datepart>?,<number>?,<date>)?
--函數返回指定日期date?加上指定的額外日期間隔number?產生的新日期
DATEDIFF(<datepart>?,<number>?,<date>)
--函數返回兩個指定日期在datepart?方面的不同之處
DATENAME(<datepart>?,?<date>)?--函數以字符串的形式返回日期的指定部分
DATEPART(<datepart>?,?<date>)?--函數以整數值的形式返回日期的指定部分
GETDATE()?--函數以DATETIME?的缺省格式返回系統當前的日期和時間
----系統函數----
APP_NAME()?--函數返回當前執行的應用程序的名稱
COALESCE()?--函數返回眾多表達式中第一個非NULL?表達式的值
COL_LENGTH(<'table_name'>,?<'column_name'>)?--函數返回表中指定字段的長度值
COL_NAME(<table_id>,?<column_id>)?--函數返回表中指定字段的名稱即列名
DATALENGTH()?--函數返回數據表達式的數據的實際長度
DB_ID(['database_name'])?--函數返回數據庫的編號
DB_NAME(database_id)?--函數返回數據庫的名稱
HOST_ID()?--函數返回服務器端計算機的名稱
HOST_NAME()?--函數返回服務器端計算機的名稱
IDENTITY(<data_type>[,?seed?increment])?[AS?column_name])
--IDENTITY()?函數只在SELECT?INTO?語句中使用用于插入一個identity?column列到新表中
/*select?identity(int,?1,?1)?as?column_name
into?newtable
from?oldtable*/
ISDATE()?--函數判斷所給定的表達式是否為合理日期
ISNULL(<check_expression>,?<replacement_value>)?--函數將表達式中的NULL?值用指定值替換
ISNUMERIC()?--函數判斷所給定的表達式是否為合理的數值
NEWID()?--函數返回一個UNIQUEIDENTIFIER?類型的數值
NULLIF(<expression1>,?<expression2>)
--NULLIF?函數在expression1?與expression2?相等時返回NULL?值若不相等時則返回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編程
在進行數據庫操作時,無非就是添加、刪除、修改,這得設計到一些常用的SQL語句,如下:?
SQL常用命令使用方法:
(1)?數據記錄篩選:
sql="select?*?from?數據表?where?字段名=字段值?order?by?字段名?[desc]"
sql="select?*?from?數據表?where?字段名?like?%字段值%?order?by?字段名?[desc]"
sql="select?top?10?*?from?數據表?where?字段名?order?by?字段名?[desc]"
sql="select?*?from?數據表?where?字段名?in?(值1,值2,值3)"
sql="select?*?from?數據表?where?字段名?between?值1?and?值2"
(2)?更新數據記錄:
sql="update?數據表?set?字段名=字段值?where?條件表達式"
sql="update?數據表?set?字段1=值1,字段2=值2?……?字段n=值n?where?條件表達式"
(3)?刪除數據記錄:
sql="delete?from?數據表?where?條件表達式"
sql="delete?from?數據表"?(將數據表所有記錄刪除)
(4)?添加數據記錄:
sql="insert?into?數據表?(字段1,字段2,字段3?…)?valuess?(值1,值2,值3?…)"
sql="insert?into?目標數據表?select?*?from?源數據表"?(把源數據表的記錄添加到目標數據表)
(5)?數據記錄統計函數:
AVG(字段名)?得出一個表格欄平均值
COUNT(*|字段名)?對數據行數的統計或對某一欄有值的數據行數統計
MAX(字段名)?取得一個表格欄最大的值
MIN(字段名)?取得一個表格欄最小的值
SUM(字段名)?把數據欄的值相加
引用以上函數的方法:
sql="select?sum(字段名)?as?別名?from?數據表?where?條件表達式"
set?rs=conn.excute(sql)
用?rs("別名")?獲取統的計值,其它函數運用同上。
(6)?數據表的建立和刪除:
CREATE?TABLE?數據表名稱(字段1?類型1(長度),字段2?類型2(長度)?……?)
例:CREATE?TABLE?tab01(name?varchar(50),datetime?default?now())
DROP?TABLE?數據表名稱?(永久性刪除一個數據表)
在ASP編程時,下面這些語句是必須知道的:
1.連接數據庫
a.?ASP與Access數據庫連接:
<%@?language=VBs?cript%>
<%
dim?conn,mdbfile
mdbfile=server.mappath("數據庫名稱.mdb")
set?conn=server.createobject("adodb.connection")
conn.open?"driver={microsoft?access?driver?(*.mdb)};uid=admin;pwd=數據庫密碼;dbq="&mdbfile
%>
b.?ASP與SQL數據庫連接:
<%@?language=VBs?cript%>
<%
dim?conn
set?conn=server.createobject("ADODB.connection")
con.open?"PROVIDER=SQLOLEDB;DATA?SOURCE=SQL服務器名稱或IP地址;UID=sa;PWD=數據庫密碼;DATABASE=數據庫名稱
%>
建立記錄集對象:
set?rs=server.createobject("adodb.recordset")
rs.open?SQL語句,conn,3,2
2.?記錄集對象的方法:
rs.movenext?將記錄指針從當前的位置向下移一行
rs.moveprevious?將記錄指針從當前的位置向上移一行
rs.movefirst?將記錄指針移到數據表第一行
rs.movelast?將記錄指針移到數據表最后一行
rs.absoluteposition=N?將記錄指針移到數據表第N行
rs.absolutepage=N?將記錄指針移到第N頁的第一行
rs.pagesize=N?設置每頁為N條記錄
rs.pagecount?根據?pagesize?的設置返回總頁數
rs.recordcount?返回記錄總數
rs.bof?返回記錄指針是否超出數據表首端,true表示是,false為否
rs.eof?返回記錄指針是否超出數據表末端,true表示是,false為否
rs.delete?刪除當前記錄,但記錄指針不會向下移動
rs.addnew?添加記錄到數據表末端
rs.update?更新數據表記錄
附:
常數?常數值?說明
--------------------------------
adLockReadOnly?1?缺省值,Recordset對象以只讀方式啟動,無法運行AddNew、Update及Delete等方法
adLockPrssimistic?2?當數據源正在更新時,系統會暫時鎖住其他用戶的動作,以保持數據一致性。
adLockOptimistic?3?當數據源正在更新時,系統并不會鎖住其他用戶的動作,其他用戶可以對數據進行增、刪、改的操作。
adLockBatchOptimistic?4?當數據源正在更新時,其他用戶必須將CursorLocation屬性改為adUdeClientBatch才能對數據進行增、刪、改的操作。
MSSQL經典語句?
?
1.按姓氏筆畫排序:Select?*?From?TableName?Order?By?CustomerName?Collate?Chinese_PRC_Stroke_ci_as?
2.數據庫加密: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.查看硬盤分區: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.殺掉所有的事件探察器進程: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到結尾記錄
Select?Top?N?*?From?表?Order?by?ID?Desc
8.如何修改數據庫的名稱:sp_renamedb?'old_name',?'new_name'?
9:獲取當前數據庫中的所有用戶表select?Name?from?sysobjects?where?xtype='u'?and?status>=0
10:獲取某一個表的所有字段select?name?from?syscolumns?where?id=object_id('表名')
11:查看與某一個表相關的視圖、存儲過程、函數select?a.*?from?sysobjects?a,?syscomments?b?where?a.id?=?b.id?and?b.text?like?'%表名%'
12:查看當前數據庫中所有存儲過程select?name?as?存儲過程名稱?from?sysobjects?where?xtype='P'
13:查詢用戶創建的所有數據庫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:查詢某一個表的字段和數據類型select?column_name,data_type?from?information_schema.columns
where?table_name?=?'表名'?
[n].[標題]:Select?*?From?TableName?Order?By?CustomerName?
[n].[標題]:Select?*?From?TableName?Order?By?CustomerName?
from:http://tb.blog.csdn.net/TrackBack.aspx?PostId=585515
?
觸發器-MSSQL常用操作
?
不再新開文章.
這里只打算講解四部分了,也就最簡單、最常用的四部分。
1、觸發器。
定義:?何為觸發器?在SQL?Server里面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。觸發器是一個特殊的存儲過程。
常見的觸發器有三種:分別應用于Insert?,?Update?,?Delete?事件。(SQL?Server?2000定義了新的觸發器,這里不提)
我為什么要使用觸發器?比如,這么兩個表:
Create?Table?Student(?--學生表
StudentID?int?primary?key,?--學號
....
)
Create?Table?BorrowRecord(?--學生借書記錄表
BorrowRecord?int?identity(1,1),?--流水號?
StudentID?int?,?--學號
BorrowDate?datetime,?--借出時間
ReturnDAte?Datetime,?--歸還時間
...
)
用到的功能有:
1.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是同時更改借書記錄表的學號);
2.如果該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。
等等。
這時候可以用到觸發器。對于1,創建一個Update觸發器:
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?
理解觸發器里面的兩個臨時的表:Deleted?,?Inserted?。注意Deleted?與Inserted分別表示觸發事件的表“舊的一條記錄”和“新的一條記錄”。
一個Update?的過程可以看作為:生成新的記錄到Inserted表,復制舊的記錄到Deleted表,然后刪除Student記錄并寫入新紀錄。
對于2,創建一個Delete觸發器
Create?trigger?trdStudent
On?Student
for?Delete
As
Delete?BorrowRecord?
From?BorrowRecord?br?,?Delted?d
Where?br.StudentID=d.StudentID
從這兩個例子我們可以看到了觸發器的關鍵:A.2個臨時的表;B.觸發機制。
這里我們只講解最簡單的觸發器。復雜的容后說明。
事實上,我不鼓勵使用觸發器。觸發器的初始設計思想,已經被“級聯”所替代.
?
MSSQL數據庫導出和導入
?
SQL?Server導出導入數據方法
?
?一、導出導入SQL?Server里某個數據庫?
?
1.?在SQL?Server企業管理器里選中要轉移的數據庫,按鼠標右鍵,選所有任務->備份數據庫。?
2.?備份?選數據庫-完全,?目的?備份到?按添加按鈕?文件名?在SQL?Server服務器硬盤下輸入一個自定義的備份數據庫文件名(后綴一般是bak)?重寫?選重寫現有媒體?最后按確定按鈕。?如果生成的備份數據庫文件大于1M,要用壓縮工具壓縮后再到Internet上傳輸。?
3.?通過FTP或者remote?desktop或者pcanywhere等方法?把第二步生成的備份數據庫文件或者其壓縮后的文件傳到目的SQL?Server數據庫,如果有壓縮要解壓。?4.目的SQL?Server數據庫如果還沒有此數據庫,先創建一個新的數據庫;?然后選中這個新創建的數據庫,按鼠標右鍵,選所有任務->還原數據庫?還原->從設備->選擇設備->磁盤->添加(找到要導入的備份數據庫文件名)->確定?還原備份集->數據庫-完全?最后按確定按鈕。完全的數據庫導入成功了。?(如果在已經存在的SQL?Server數據庫上還原數據庫可能遇到有還有其它人正在使用它而恢復操做失敗,?可以去看?->管理->當前活動->鎖/對象->找到數據庫下鎖的進程號->到查詢分析器里用kill?進程號殺掉這些鎖,?然后再做還原)?
注意:
如果在原有的目的SQL?Server數據庫上從備份文件(*.bak)還原數據庫?會把已經存在的表、存儲過程等數據庫對:象全部替換成最近這次導入的備份數據庫里的內容。?如果一定要還原備份文件(*.bak)里部分數據,需要另外建一個新數據庫,?其邏輯名稱和數量同備份文件(*.bak)里數據庫的邏輯名稱和數量一致;?新數據庫的物理文件名稱取得一定要和備份文件(*.bak)里數據庫的物理文件不一樣才行。?
?
二、導出導入SQL?Server里某個表?
?
1.?沒有防火墻,同一個局域網里或不在同一個局域網里,但通過Internet可以互相訪問?在SQL?Server企業管理器里選中目的數據庫?,按鼠標右鍵,選所有任務->導入數據->?彈出數據轉換服務導入/導出向導窗口->下一步->?選數據源->?數據源(用于SQL?Server的Microfost?OLE?DB提供程序)->?服務器(可選擇局域網內能訪問到的所有SQL?Server服務器,或者直接輸入IP地址)->?選擇使用windows身份驗證還是使用SQL?Serve身份驗證(輸入數據庫的用戶名和密碼)->?數據庫(可選擇上面選中SQL?Server服務器上所有權限范圍內的數據庫)->下一步->?選擇目的->目的(用于SQL?Server的Microfost?OLE?DB提供程序)->?服務器(默認為上一步里選中的導出服務器,也可以選其它局域網內能訪問到的所有SQL?Server服務器,或者直接輸入IP地址)->?目的數據庫(可選擇上面選中SQL?Server服務器上所有權限范圍內的數據庫)->下一步->?制定表復制或查詢->選從源數據庫復制表和視圖(也可以選擇用一條查詢指定要傳輸的數據)->下一步->?選擇源表和視圖->在要導入的表和視圖前面選中源->目的出現同樣的表名(可以手工修改成別的表名)->?轉換->列映射和轉換里面可以修改源表和目的表之間字段的對應關系,修改目的表字段的類型和長度等,?并可以選擇創建目的表,在目的表中增加行,除去并重新創建目的表,啟用標志插入等選項->確定->下一步->?保存、調度和復制包->時間->立即運行(如果要實現隔一段時間自動導出導入數據,選調度DTS包以便以后執行)->?保存(可以不選)->[?保存DTS包(如果以后還要轉移這批相同的數據,可以把本次導出導入的內容和步驟保存起來,?存到SQL?Server即可,保存的時候要輸入DTS的包名及詳細描述)->下一步->?]->完成?正在執行包->圖形界面顯示創建表及插入記錄的步驟和狀態->完成?
2.?經過防火墻,不在同一個局域網里?①、導出表里的數據到文本文件:?在SQL?Server企業管理器里選中目的數據庫,按鼠標右鍵,選所有任務->?導入數據->彈出數據轉換服務導入/導出向導窗口->下一步->?選數據源->?數據源(用于SQL?Server的Microfost?OLE?DB提供程序)->?服務器(可選擇局域網內能訪問到的所有SQL?Server服務器)->?選擇使用windows身份驗證還是使用SQL?Serve身份驗證(輸入數據庫的用戶名和密碼)->?數據庫(可選擇上面選中SQL?Server服務器上所有權限范圍內的數據庫)->下一步->?選擇目的->目的(文本文件)->?文件名(在自己的電腦硬盤中生成一個自定義的文本文件)?->下一步->?制定表復制或查詢->選從源數據庫復制表和視圖(也可以選擇用一條查詢指定要傳輸的數據)->下一步->?選擇目的文件格式->源(選擇要導出的表)->用默認的帶分隔符->選第一行包含有列名稱選項->下一步->?保存、調度和復制包->時間->立即運行(如果要實現隔一段時間自動導出到文本文件,選調度DTS包以便以后執行)->?保存(可以不選)->?[保存DTS包(保存的時候要輸入DTS的包名及詳細描述)->下一步->]->完成?正在執行包->圖形界面顯示表到文本文件的步驟和狀態->完成?如果生成的文本文件大于1M,要用壓縮工具壓縮后再到Internet上傳輸。?②、通過FTP或者remote?desktop或者pcanywhere等方法把?第①步生成的文本文件或者其壓縮后的文件傳到目的SQL?Server數據庫,如果有壓縮要解壓。?③、把文本文件導入目的SQL?Server數據庫?直接把文本文件導入目的SQL?Server數據庫里跟文本文件同名的新表名時,默認的會把所有字段類型都變成字符串。?所以我們要這樣做:?在源SQL?Server數據庫上先生成創建表的sql語句?在SQL?Server查詢分析器里->選中源數據庫里表名->按右鍵->在新窗口中編寫對象腳本->創建->?復制下新窗口內創建表名的sql語句?到目標SQL?Server數據庫上查詢分析器里執行創建表名的sql語句,生成空表結構。?(如果已經存在這樣的表名,修改建表的sql語句,在表名后面加上導入時間的年月信息,例如table_0113)?調用導入/導出工具->彈出數據轉換服務導入/導出向導窗口->下一步->?選數據源->?數據源(文本文件)->?文件名(已傳到目的SQL?Server數據庫下要導入的文本文件,后綴可以不是*.txt,?但是常規文本編輯器能打開的文件,文件類型選全部)->下一步->?選擇文件格式->用默認的帶分隔符->選第一行包含有列名稱選項->下一步->?制定列分割符->逗號->下一步->?選擇目的->目的(用于SQL?Server的Microfost?OLE?DB提供程序)->?服務器(可選擇目標局域網內能訪問到的所有SQL?Server服務器)->?選擇使用windows身份驗證還是使用SQL?Serve身份驗證(輸入數據庫的用戶名和密碼)->?數據庫(可選擇上面選中SQL?Server服務器上所有權限范圍內的數據庫)->下一步->?選擇源表和視圖->修改目的表名為剛才創建的表名->轉換(在目的表中追加行)?->下一步->?保存、調度和復制包->?時間->立即運行(如果要實現隔一段時間自動把文本文件導入,選調度DTS包以便以后執行)->?保存(可以不選)->?[保存DTS包(保存的時候要輸入DTS的包名及詳細描述)->下一步->]->完成?正在執行包->圖形界面顯示文本文件到表的步驟和狀態->完成?如果要更改導入時間的年月信息的表名,例如table_0113到原來的表名,?在企業管理器里把原來的表名改成table_old_0113,table_0113改名成table。?這會對應用程序里頻繁訪問的表照成一定的中斷。?
注意:
源表上的建的索引和主鍵約束不能用上面介紹的1和2方法轉移過來,還需要手工來建索引和主鍵。?標志種子和not?null的約束可以繼承過來。?導入視圖時會把源視圖里所有的真實數據導入成一個新表,而不是視圖。
?
?三、SQL?Server存儲過程或用戶定義的函數導出導入
?
?1、導出存儲過程或用戶定義的函數成*.sql文件?在SQL?Server企業管理器里選中源數據庫,?存儲過程->單選或者多選中要轉移的存儲過程->?用戶定義的函數->單選或者多選中要轉移的函數->?按鼠標右鍵,選所有任務->生成SQL腳本->確定->在自己的電腦硬盤中生成一個自定義的*.sql文件->?保存->正在生成SQL腳本->成功?2、如果目的數據庫經過防火墻,不在同一個局域網里,?要通過FTP或者remote?desktop或者pcanywhere等方法把第1步生成的*.sql文件傳到目的SQL?Server數據庫服務器上。?3、用查詢分析器進入SQL?Server目的數據庫,?從菜單里選文件->打開->打開查詢文件->選中第1步生成的*.sql文件->點執行查詢的綠色倒三角型快捷鍵->?查詢窗口里會出現執行后的消息(有時候可能因為存儲過程和用戶定義的函數之間有一定的依賴關系,會報一些錯。?最好先執行用戶定義的函數的*.sql文件,再執行存儲過程的*.sql文件)?
?
四、ORACLE數據庫里表導入SQL?Server數據庫
?
?1、在目的SQL?Server數據庫服務器上安裝ORACLE?Client軟件或者ORACLE?ODBC?Driver.?在$ORACLE_HOMEnetworkadmintnsnames.ora里配置ORACLE數據庫的別名(service?name)。?
?2、在WIN2000或者win2003服務器->管理工具->數據源(ODBC)->?系統DSN(本機器上NT域用戶都可以用)->添加->ORACLE?ODBC?Driver->完成->?data?source?name?可以自定義,我一般填ORACLE數據庫的sid標志,?description里可以填ORACLE數據庫詳細描述,也可以不填->?data?source?service?name?填第1步定義的ORACLE數據庫別名->OK。?(用戶DSN和文件DSN也可以類似配置,但使用的時候有一些限制)
?3、SQL?Server的導入和導出數據工具里->選數據源->?數據源(其它(ODBC數據源))->?選第2步在ODBC里定義的系統DSN?source?name,用戶名密碼處填寫ORACLE系統的用戶名和密碼->?下一步->選擇目的,選SQL?Server數據庫(跟上面第二點講的一致,就不重復了)。
注意:
在ORACLE表和SQL?Server表之間'轉換'那步很重要,?可以改變默認的字段數據類型,如image->text,decimal->int?
?
五、SQL?Server數據庫里表導入ORACLE數據庫
?
?方法一.導出目的選通過ODBC數據源里定義的ORACLE數據庫,?注意ORACLE里表名都是大寫的.?我一般在ORACLE這邊先生成好表結構,再選擇SQL?SERVER源表往ORACLE目的表里追加數據.?數據傳輸速度比方法二慢.?方法二.從SQL?Server數據庫導入數據到ORACLE數據庫可以選擇用Windows下ORACLE9i企業或者個人版數據庫做中轉。?
(?注意:ORACLE通過訪問SQL?Server的數據庫鏈接時,用select?*?的時候字段名是用雙引號引起來的。)?
?
MySQL數據庫導出和導入
1).MySQLimport的語法介紹:?
MySQLimport位于MySQL/bin目錄中,是MySQL的一個載入(或者說導入)數據的一個非常有效的工具。這是一個命令行工具。有兩個參數以及大量的選項可供選擇。這個工具把一個文本文件(text?file)導入到你指定的數據庫和表中。比方說我們要從文件Customers.txt中把數據導入到數據庫Meet_A_Geek中的表Custermers中:?
MySQLimport?Meet_A_Geek?Customers.txt?
注意:這里Customers.txt是我們要導入數據的文本文件,而Meet_A_Geek是我們要操作的數據庫,數據庫中的表名是Customers,這里文本文件的數據格式必須與Customers表中的記錄格式一致,否則MySQLimport命令將會出錯。
其中表的名字是導入文件的第一個句號(.)前面文件字符串,另外一個例子:MySQLimport?Meet_A_Geek?Cus.to.mers.txt
那么我們將把文件中的內容導入到數據庫Meet_A_Geek?中的Cus表中。?
上面的例子中,都只用到兩個參數,并沒有用到更多的選項,下面介紹MySQLimport的選項?
2).MySQLimport的常用選項介紹:?
選項?功能?
-d?or?--delete?新數據導入數據表中之前刪除數據數據表中的所有信息?
-f?or?--force?不管是否遇到錯誤,MySQLimport將強制繼續插入數據?
-i?or?--ignore?MySQLimport跳過或者忽略那些有相同唯一關鍵字的行,?導入文件中的數據將被忽略。?
-l?or?-lock-tables?數據被插入之前鎖住表,這樣就防止了,你在更新數據庫時,用戶的查詢和更新受到影響。?
-r?or?-replace?這個選項與-i選項的作用相反;此選項將替代表中有相同唯一關鍵字的記錄。?
--fields-enclosed-?by=?char?指定文本文件中數據的記錄時以什么括起的,?很多情況下數據以雙引號括起。?默認的情況下數據是沒有被字符括起的。?
--fields-terminated-?by=char?指定各個數據的值之間的分隔符,在句號分隔的文件中,分隔符是句號。您可以用此選項指定數據之間的分隔符。
默認的分隔符是跳格符(Tab)?
--lines-terminated-?by=str?此選項指定文本文件中行與行之間數據的分隔字符串或者字符。?默認的情況下MySQLimport以newline為行分隔符。?
您可以選擇用一個字符串來替代一個單個的字符:?
一個新行或者一個回車。?
MySQLimport命令常用的選項還有-v?顯示版本(version),-p?提示輸入密碼(password)等。?
3).例子:導入一個以逗號為分隔符的文件?
文件中行的記錄格式是這樣的:?
"1",?"ORD89876",?"1?Dozen?Roses",?"19991226"?
我們的任務是要把這個文件里面的數據導入到數據庫Meet_A_Geek中的表格Orders中,我們使用這個命令:?
bin/MySQLimport?–prl?–fields-enclosed-by="?–fields-terminated-by=,?Meet_A_Geek?Orders.txt?
這個命令可能看起來很不爽,不過當你熟悉了之后,這是非常簡單的。第一部分,bin/MySQLimport?,告訴操作系統你要運行的命令是MySQL/bin目錄下的MySQLimport,選項p是要求輸入密碼,這樣就要求你在改動數據庫之前輸入密碼,操作起來會更安全。?我們用了r選項是因為我們想要把表中的唯一關鍵字與文件記錄中有重復唯一關鍵字的記錄替換成文件中的數據。我們表單中的數據不是最新的,需要用文件中的數據去更新,因而就用r這個選項,替代數據庫中已經有的記錄。l選項的作用是在我們插入數據的時候鎖住表,這樣就阻止了用戶在我們更新表的時候對表進行查詢或者更改的操作。
批處理是一種非交互式運行MySQL程序的方法,如同您在MySQL中使用的命令一樣,你仍然將使用這些命令。?
為了實現批處理,您重定向一個文件到MySQL程序中,首先我們需要一個文本文件,這個文本文件包含有與我們在MySQL中輸入的命令相同的文本。?
比如我們要插入一些數據,使用包含下面文本的文件(文件名為New_Data.sql,當然我們也可以取名為New_Data.txt及任何其他的合法名字,并不一定要以后綴sql結尾):?
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");?
注意上面的這些句子的語法都必須是正確的,并且每個句子以分號結束。?
上面的USE命令選擇數據庫,INSERT命令插入數據。?
下面我們要把上面的文件導入到數據庫中,導入之前要確認數據庫已經在運行,即是MySQLd進程(或者說服務,Windows?NT下面稱為”服務“,unix下面為”進程“)已經在運行。?
然后運行下面的命令:?
bin/MySQL?–p?<?/home/mark/New_Data.sql?
接著按提示輸入密碼,如果上面的文件中的語句沒有錯誤,那么這些數據就被導入到了數據庫中。?
命令行中使用LOAD?DATA?INFILE?從文件中導入數據到數據庫:?
現在您可能會問自己,"究竟為什么我要輸入所有的這些SQL語句到文件中,然后通過程序運行它們呢?”?
這樣看起來好像需要大量的工作。很好,你這樣想很可能就對了。但是假如你有從所有這些命令中產生的log記錄呢?現在這樣就很棒,嗯,大多數數據庫都會自動產生數據庫中的事件記錄的log。而大部分log都包含有用過的原始的SQL命令。因此,如果您不能從您現在的數據庫中導出數據到新的MySQL數據庫中使用,那么您可以使用log和MySQL的批處理特性,來快速且方便地導入您地數據。當然,這樣就省去了打字的麻煩。?
LOAD?DATA?INFILE?
這是我們要介紹的最后一個導入數據到MySQL數據庫中的方法。這個命令與MySQLimport非常相似,但這個方法可以在MySQL命令行中使用。也就是說您可以在所有使用API的程序中使用這個命令。使用這種方法,您就可以在應用程序中導入您想要導入的數據。?
使用這個命令之前,MySQLd進程(服務)必須已經在運行。
啟動MySQL命令行:
bin/MySQL?–p?
按提示輸入密碼,成功進入MySQL命令行之后,輸入下面的命令:
USE?Meet_A_Geek;?
LOAD?DATA?INFILE?"/home/mark/data.sql"?INTO?TABLE?Orders;?
簡單的講,這樣將會把文件data.sql中的內容導入到表Orders中,如MySQLimport工具一樣,這個命令也有一些可以選擇的參數。比如您需要把自己的電腦上的數據導入到遠程的數據庫服務器中,您可以使用下面的命令:?
LOAD?DATA?LOCAL?INFILE?"C:MyDocsSQL.txt"?INTO?TABLE?Orders;?
上面的LOCAL參數表示文件是本地的文件,服務器是您所登陸的服務器。?
這樣就省去了使用ftp來上傳文件到服務器,MySQL替你完成了.?
您也可以設置插入語句的優先級,如果您要把它標記為低優先級(LOW_PRIORITY),那么MySQL將會等到沒有其他人讀這個表的時候,才把插入數據。可以使用如下的命令:?
?LOAD?DATA?LOW_PRIORITY?INFILE?"/home/mark/data.sql"?INTO?TABLE?Orders;?
您也可以指定是否在插入數據的時候,取代或者忽略文件與數據表中重復的鍵值。替代重復的鍵值的語法:?
LOAD?DATA?LOW_PRIORITY?INFILE?"/home/mark/data.sql"?REPLACE?INTO?TABLE?Orders;?
上面的句子看起來有點笨拙,但卻把關鍵字放在了讓您的剖析器可以理解的地方。?
下面的一對選項描述了文件的記錄格式,這些選項也是在MySQLimport工具中可以用的。他們在這里看起來有點不同。首先,要用到FIELDS關鍵字,如果用到這個關鍵字,MySQL剖析器希望看到至少有下面的一個選項:
TERMINATED?BY?character?
?ENCLOSED?BY?character?
?ESCAPED?BY?character?
這些關鍵字與它們的參數跟MySQLimport中的用法是一樣的.?The?
?TERMINATED?BY?描述字段的分隔符,默認情況下是tab字符(t)?
?ENCLOSED?BY描述的是字段的括起字符。比方以引號括起每一個字段。?
?ESCAPED?BY?描述的轉義字符。默認的是反些杠(backslash:?).?
下面仍然使用前面的MySQLimport命令的例子,用LOAD?DATA?INFILE語句把同樣的文件導入到數據庫中:?
LOAD?DATA?INFILE?"/home/mark/Orders.txt"?REPLACE?INTO?TABLE?Orders?FIELDS?TERMINATED?BY?','? ENCLOSED?BY?'"';?
LOAD?DATA?INFILE語句中有一個MySQLimport工具中沒有特點:?
LOAD?DATA?INFILE?可以按指定的列把文件導入到數據庫中。?
當我們要把數據的一部分內容導入的時候,這個特點就很重要。比方說,我們要從Access數據庫升級到MySQL數據庫的時候,需要加入一些欄目(列/字段/field)到MySQL數據庫中,以適應一些額外的需要。?
這個時候,我們的Access數據庫中的數據仍然是可用的,但是因為這些數據的欄目(field)與MySQL中的不再匹配,因此而無法再使用MySQLimport工具。盡管如此,我們仍然可以使用LOAD?DATA?INFILE,下面的例子顯示了如何向指定的欄目(field)中導入數據:?
LOAD?DATA?INFILE?"/home/Order.txt"?INTO?TABLE?Orders(Order_Number,?Order_Date,?Customer_ID);?
如您所見,我們可以指定需要的欄目(fields)。這些指定的字段依然是以括號括起,由逗號分隔的,如果您遺漏了其中任何一個,MySQL將會提醒您^_^?
Importing?Data?from?Microsoft?Access?(從Access中導入數據,略)
您可以看到MySQL有很多可以導入數據的方法,然而這些只是數據傳輸中的一半。另外的一般是從MySQL數據庫中導出數據。有許多的原因我們需要導出數據。一個重要的原因是用于備份數據庫。數據的造價常常是昂貴的,需要謹慎處理它們。經常地備份可以幫助防止寶貴數據地丟失;另外一個原因是,也許您希望導出數據來共享。?在這個信息技術不斷成長的世界中,共享數據變得越來越常見。?
比方說Macmillan?USA維護護著一個將要出版的書籍的大型數據庫。這個數據庫在許多書店之間共享,這樣他們就知道哪些書將會很快出版。醫院越來越走向采用無紙病歷記錄,這樣這些病歷可以隨時跟著你。世界變得越來越小,信息也被共享得越來越多。有很多中導出數據得方法,它們都跟導入數據很相似。因為,畢竟,這些都只是一種透視得方式。從數據庫導出的數據就是從另一端導入的數據。這里我們并不討論其他的數據庫各種各樣的導出數據的方法,您將學會如何用MySQL來實現數據導出。
使用MySQLdump:?
MySQLdump命令位于MySQL/bin/目錄中?
MySQLdump工具很多方面類似相反作用的工具MySQLimport。它們有一些同樣的選項。但MySQLdump能夠做更多的事情。它可以把整個數據庫裝載到一個單獨的文本文件中。這個文件包含有所有重建您的數據庫所需要的SQL命令。這個命令取得所有的模式(Schema,后面有解釋)并且將其轉換成DDL語法(CREATE語句,即數據庫定義語句),取得所有的數據,并且從這些數據中創建INSERT語句。這個工具將您的數據庫中所有的設計倒轉。因為所有的東西都被包含到了一個文本文件中。這個文本文件可以用一個簡單的批處理和一個合適SQL語句導回到MySQL中。這個工具令人難以置信地簡單而快速。決不會有半點讓人頭疼地地方。?
因此,如果您像裝載整個數據庫Meet_A_Geek的內容到一個文件中,可以使用下面的命令:?
?bin/MySQLdump?–p?Meet_A_Geek?>?MeetAGeek_Dump_File.txt?
這個語句也允許您指定一個表進行dump(備份/導出/裝載?)。如果您只是希望把數據庫Meet_A_Geek中的表Orders中的整個內容導出到一個文件,可以使用下面的命令:?
?bin/MySQLdump?–p?Meet_A_Geek?Orders?>MeetAGeek_Orders.txt?
這個非常的靈活,您甚至可以使用WHERE從句來選擇您需要的記錄導出到文件中。要達到這樣的目的,可以使用類似于下面的命令:?
?bin/MySQLdump?–p?–where="Order_ID?>?2000"?Meet_A_Geek?Orders?>?Special_Dump.txt?
MySQLdump工具有大量的選項,部分選項如下表:?
選項/Option?作用/Action?Performed?
--add-drop-table?
?這個選項將會在每一個表的前面加上DROP?TABLE?IF?EXISTS語句,這樣可以保證導回MySQL數據庫的時候不會出錯,因為每次導回的時候,都會首先檢查表是否存在,存在就刪除?
--add-locks?
?這個選項會在INSERT語句中捆上一個LOCK?TABLE和UNLOCK?TABLE語句。這就防止在這些記錄被再次導入數據庫時其他用戶對表進行的操作?
-c?or?-?complete_insert?
?這個選項使得MySQLdump命令給每一個產生INSERT語句加上列(field)的名字。當把數據導出導另外一個數據庫時這個選項很有用。?
--delayed-insert?在INSERT命令中加入DELAY選項?
?-F?or?-flush-logs?使用這個選項,在執行導出之前將會刷新MySQL服務器的log.?
?-f?or?-force?使用這個選項,即使有錯誤發生,仍然繼續導出?
?--full?這個選項把附加信息也加到CREATE?TABLE的語句中?
?-l?or?-lock-tables?使用這個選項,導出表的時候服務器將會給表加鎖。?
?-t?or?-no-create-?info?
?這個選項使的MySQLdump命令不創建CREATE?TABLE語句,這個選項在您只需要數據而不需要DDL(數據庫定義語句)時很方便。?
-d?or?-no-data?這個選項使的MySQLdump命令不創建INSERT語句。?
?在您只需要DDL語句時,可以使用這個選項。?
?--opt?此選項將打開所有會提高文件導出速度和創造一個可以更快導入的文件的選項。?
?-q?or?-quick?這個選項使得MySQL不會把整個導出的內容讀入內存再執行導出,而是在讀到的時候就寫入導文件中。?
?-T?path?or?-tab?=?path?這個選項將會創建兩個文件,一個文件包含DDL語句或者表創建語句,另一個文件包含數據。DDL文件被命名為table_name.sql,數據文件被命名為table_name.txt.路徑名是存放這兩個文件的目錄。目錄必須已經存在,并且命令的使用者有對文件的特權。?
-w?"WHERE?Clause"?or?-where?=?"Where?clause?"?
?如前面所講的,您可以使用這一選項來過篩選將要放到導出文件的數據。?
假定您需要為一個表單中要用到的帳號建立一個文件,經理要看今年(2004年)所有的訂單(Orders),它們并不對DDL感興趣,并且需要文件有逗號分隔,因為這樣就很容易導入到Excel中。?為了完成這個人物,您可以使用下面的句子:?
bin/MySQLdump?–p?–where?"Order_Date?>='2000-01-01'"?
?–tab?=?/home/mark?–no-create-info?–fields-terminated-by=,?Meet_A_Geek?Orders?
?這將會得到您想要的結果。?
schema:模式The?set?of?statements,?expressed?in?data?definition?language,?that?completely?describe?the?structure?of?a?data?base.?
?一組以數據定義語言來表達的語句集,該語句集完整地描述了數據庫的結構。
SELECT?INTO?OUTFILE?:?
如果您覺得MySQLdump工具不夠酷,就使用SELECT?INTO?OUTFILE吧,?MySQL同樣提供一個跟LOAD?DATA?INFILE命令有相反作用的命令,這就是SELECT?INTO?OUTFILE?命令,這兩個命令有很多的相似之處。首先,它們有所有的選項幾乎相同。現在您需要完成前面用MySQLdump完成的功能,可以依照下面的步驟進行操作:?
1.?確保MySQLd進程(服務)已經在運行?
?2.?cd?/usr/local/MySQL?
?3.?bin/MySQLadmin?ping?;//?如果這個句子通不過,可以用這個:MySQLadmin?-u?root?-p?ping?
MySQLadmin?ping用于檢測MySQLd的狀態,is?alive說明正在運行,出錯則可能需要用戶名和密碼。?
?4.?啟動MySQL?監聽程序.?
?5.?bin/MySQL?–p?Meet_A_Geek;//?進入MySQL命令行,并且打開數據庫Meet_A_Geek,需要輸入密碼?
?6.?在命令行中,輸入一下命令:?
SELECT?*?INTO?OUTFILE?'/home/mark/Orders.txt'?
?FIELDS?
?TERMINATED?BY?=?','?
?FROM?Orders?
?WHERE?Order_Date?>=?'2000-01-01'?
在你按了Return(回車)之后,文件就創建了。這個句子就像一個規則的SELECT語句,只是把想屏幕的輸出重定向到了文件中。這意味這您可以使用JOIN來實現多表的高級查詢。這個特點也可以被用作一個報表產生器。?
比方說,您可以組合這一章中討論的方法來產生一個非常有趣的查詢,試試這個:?
在MySQL目錄建立一個名為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;?
然后確認?MySQL進程在運行,并且您在MySQL目錄中,?輸入下面的命令:?
bin/MySQL?<?Report_G.rpt檢查您命名作為輸出的文件,這個文件將會包含所有您在Customers表中輸入的顧客的姓。?如您所見,您可以使用今天學到的導入/導出(import/export)的方法來幫助得到報表。?查看全文?
關于MSSQL數據庫的字段
?
數據類型是數據的一種屬性,表示數據所表示信息的類型。任何一種計算機語言都定義了自己的數據類型。當然,不同的程序語言都具有不同的特點,所定義的數據類型的各類和名稱都或多或少有些不同。SQLServer提供了25種數據類型:
·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)二進制數據類型
二進制數據包括Binary、Varbinary和Image
Binary數據類型既可以是固定長度的(Binary),也可以是變長度的。
Binary[(n)]是n位固定的二進制數據。其中,n的取值范圍是從1到8000。其存儲窨的大小是n+4個字節。
Varbinary[(n)]是n位變長度的二進制數據。其中,n的取值范圍是從1到8000。其存儲窨的大小是n+4個字節,不是n個字節。
在Image數據類型中存儲的數據是以位字符串存儲的,不是由SQLServer解釋的,必須由應用程序來解釋。例如,應用程序可以使用BMP、TIEF、GIF和JPEG格式把數據存儲在Image數據類型中。
(2)字符數據類型
字符數據的類型包括Char,Varchar和Text
字符數據是由任何字母、符號和數字任意組合而成的數據。
Varchar是變長字符數據,其長度不超過8KB。Char是定長字符數據,其長度最多為8KB。超過8KB的ASCII數據可以使用Text數據類型存儲。例如,因為Html文檔全部都是ASCII字符,并且在一般情況下長度超過8KB,所以這些文檔可以Text數據類型存儲在SQLServer中。
(3)Unicode數據類型
Unicode數據類型包括Nchar,Nvarchar和Ntext
在MicrosoftSQLServer中,傳統的非Unicode數據類型允許使用由特定字符集定義的字符。在SQLServer安裝過程中,允許選擇一種字符集。使用Unicode數據類型,列中可以存儲任何由Unicode標準定義的字符。在Unicode標準中,包括了以各種字符集定義的全部字符。使用Unicode數據類型,所戰勝的窨是使用非Unicode數據類型所占用的窨大小的兩倍。
在SQLServer中,Unicode數據以Nchar、Nvarchar和Ntext數據類型存儲。使用這種字符類型存儲的列可以存儲多個字符集中的字符。當列的長度變化時,應該使用Nvarchar字符類型,這時最多可以存儲4000個字符。當列的長度固定不變時,應該使用Nchar字符類型,同樣,這時最多可以存儲4000個字符。當使用Ntext數據類型時,該列可以存儲多于4000個字符。
(4)日期和時間數據類型
日期和時間數據類型包括Datetime和Smalldatetime兩種類型
日期和時間數據類型由有效的日期和時間組成。例如,有效的日期和時間數據包括“4/01/9812:15:00:00:00PM”和“1:28:29:15:01AM8/17/98”。前一個數據類型是日期在前,時間在后一個數據類型是霎時間在前,日期在后。在MicrosoftSQLServer中,日期和時間數據類型包括Datetime和Smalldatetime兩種類型時,所存儲的日期范圍是從1753年1月1日開始,到9999年12月31日結束(每一個值要求8個存儲字節)。使用Smalldatetime數據類型時,所存儲的日期范圍是1900年1月1日開始,到2079年12月31日結束(每一個值要求4個存儲字節)。
日期的格式可以設定。設置日期格式的命令如下:
SetDateFormat{format|@format_var|
其中,format|@format_var是日期的順序。有效的參數包括MDY、DMY、YMD、YDM、MYD和DYM。在默認情況下,日期格式為MDY。
例如,當執行SetDateFormatYMD之后,日期的格式為年月日形式;當執行SetDateFormatDMY之后,日期的格式為日月有年形式
(5)數字數據類型
數字數據只包含數字。數字數據類型包括正數和負數、小數(浮點數)和整數
整數由正整數和負整數組成,例如39、25、0-2和33967。在MicrsoftSQLServer中,整數存儲的數據類型是 Int,Smallint和Tinyint。Int數據類型存儲數據的范圍大于Smallint數據類型存儲數據的范圍,而Smallint據類型存儲數據的范圍大于Tinyint數據類型存儲數據的范圍。使用Int數據狗昔存儲數據的范圍是從-2147483648到2147483647(每一個值要求4個字節存儲空間)。使用Smallint數據類型時,存儲數據的范圍從-32768到32767(每一個值要求2個字節存儲空間)。使用Tinyint數據類型時,存儲數據的范圍是從0到255(每一個值要求1個字節存儲空間)。
精確小婁數據在SQLServer中的數據類型是Decimal和Numeric。這種數據所占的存儲空間根據該數據的位數后的位數來確定。
在SQLServer中,近似小數數據的數據類型是Float和Real。例如,三分之一這個分數記作。3333333,當使用近似數據類型時能準確表示。因此,從系統中檢索到的數據可能與存儲在該列中數據不完全一樣。
(6)貨幣數據表示正的或者負的貨幣數量。
在MicrosoftSQLServer中,貨幣數據的數據類型是Money和Smallmoney
Money數據類型要求8個存儲字節,Smallmoney數據類型要求4個存儲字節。
(7)特殊數據類型
特殊數據類型包括前面沒有提過的數據類型。特殊的數據類型有3種,即 Timestamp、Bit和Uniqueidentifier。
Timestamp用于表示SQLServer活動的先后順序,以二進投影的格式表示。Timestamp數據與插入數據或者日期和時間沒有關系。
Bit由1或者0組成。當表示真或者假、ON或者OFF時,使用Bit數據類型。例如,詢問是否是每一次訪問的客戶機請求可以存儲在這種數據類型的列中。
Uniqueidentifier由16字節的十六進制數字組成,表示一個全局唯一的。當表的記錄行要求唯一時,GUID是非常有用。例如,在客戶標識號列使用這種數據類型可以區別不同的客戶。
2.用戶定義的數據類型
用戶定義的數據類型基于在MicrosoftSQLServer中提供的數據類型。當幾個表中必須存儲同一種數據類型時,并且為保證這些列有相同的數據類型、長度和可空性時,可以使用用戶定義的數據類型。例如,可定義一種稱為 postal_code的數據類型,它基于Char數據類型。
當創建用戶定義的數據類型時,必須提供三個數:數據類型的名稱、所基于的系統數據類型和數據類型的可空性。
(1)創建用戶定義的數據類型
創建用戶定義的數據類型可以使用Transact-SQL語句。系統存儲過程sp_addtype可以來創建用戶定義的數據類型。其語法形式如下:
sp_addtype{type},[,system_data_bype][,'null_type']
其中,type是用戶定義的數據類型的名稱。system_data_type是系統提供的數據類型,例如Decimal、Int、Char 等等。null_type表示該數據類型是如何處理空值的,必須使用單引號引起來,例如'NULL'、'NOTNULL'或者'NONULL'。
例子:
Usecust
Execsp_addtypessn,'Varchar(11)',"NotNull'
創建一個用戶定義的數據類型ssn,其基于的系統數據類型是變長為11的字符,不允許空。
例子:
Usecust
Execsp_addtypebirthday,datetime,'Null'
創建一個用戶定義的數據類型birthday,其基于的系統數據類型是DateTime,允許空。
例子:
Usemaster
Execsp_addtypetelephone,'varchar(24),'NotNull'
Eexcsp_addtypefax,'varchar(24)','Null'
創建兩個數據類型,即telephone和fax
(2)刪除用戶定義的數據類型
當用戶定義的數據類型不需要時,可刪除。刪除用戶定義的數據類型的命令是sp_droptype{'type'}。
例子:
Usemaster
Execsp_droptype'ssn'
注意:當表中的列還正在使用用戶定義的數據類型時,或者在其上面還綁定有默認或者規則時,這種用戶定義的數據類型不能刪除。
SQLSERVER的字段類型說明
以下為SQL?SERVER7.0以上版本的字段類型說明。SQL?SERVER6.5的字段類型說明請參考SQL?SERVER提供的說明。?
字段類型
?描述
?
bit?0或1的整型數字?
int?從-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型數字?
smallint?從-2^15(-32,768)到2^15(32,767)的整型數字?
tinyint?從0到255的整型數字?
?
?
decimal?從-10^38到10^38-1的定精度與有效位數的數字?
numeric?decimal的同義詞?
?
?
money?從-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的貨幣數據,最小貨幣單位千分之十?
smallmoney?從-214,748.3648到214,748.3647的貨幣數據,最小貨幣單位千分之十?
?
?
float?從-1.79E+308到1.79E+308可變精度的數字?
real?從-3.04E+38到3.04E+38可變精度的數字?
?
?
datetime?從1753年1月1日到9999年12日31的日期和時間數據,最小時間單位為百分之三秒或3.33毫秒?
smalldatetime?從1900年1月1日到2079年6月6日的日期和時間數據,最小時間單位為分鐘?
?
?
timestamp?時間戳,一個數據庫寬度的唯一數字?
uniqueidentifier?全球唯一標識符GUID?
?
?
char?定長非Unicode的字符型數據,最大長度為8000?
varchar?變長非Unicode的字符型數據,最大長度為8000?
text?變長非Unicode的字符型數據,最大長度為2^31-1(2G)?
?
?
nchar?定長Unicode的字符型數據,最大長度為8000?
nvarchar?變長Unicode的字符型數據,最大長度為8000?
ntext?變長Unicode的字符型數據,最大長度為2^31-1(2G)?
?
?
binary?定長二進制數據,最大長度為8000?
varbinary?變長二進制數據,最大長度為8000?
image?變長二進制數據,最大長度為2^31-1(2G)?
--語?句 功?能
--數據操作
SELECT --從數據庫表中檢索數據行和列
INSERT --向數據庫表添加新數據行
DELETE --從數據庫表中刪除數據行
UPDATE --更新數據庫表中的數據?
--數據定義?
CREATE?TABLE --創建一個數據庫表
DROP?TABLE ?--從數據庫中刪除表?
ALTER?TABLE ?--修改數據庫表結構
CREATE?VIEW ?--創建一個視圖?
DROP?VIEW ?--從數據庫中刪除視圖
CREATE?INDEX --為數據庫表創建一個索引
DROP?INDEX ?--從數據庫中刪除索引?
CREATE?PROCEDURE ?--創建一個存儲過程?
DROP?PROCEDURE --從數據庫中刪除存儲過程
CREATE?TRIGGER --創建一個觸發器?
DROP?TRIGGER --從數據庫中刪除觸發器
CREATE?SCHEMA --向數據庫添加一個新模式
DROP?SCHEMA ?--從數據庫中刪除一個模式
CREATE?DOMAIN --創建一個數據值域
ALTER?DOMAIN --改變域定義
DROP?DOMAIN ?--從數據庫中刪除一個域
--數據控制?
GRANT --授予用戶訪問權限
DENY --拒絕用戶訪問?
REVOKE --解除用戶訪問權限
--事務控制
COMMIT --結束當前事務
ROLLBACK ?--中止當前事務?
SET?TRANSACTION --定義當前事務數據訪問特征
--程序化SQL?
DECLARE --為查詢設定游標?
EXPLAN --為查詢描述數據訪問計劃
OPEN --檢索查詢結果打開一個游標
FETCH --檢索一行查詢結果?
CLOSE --關閉游標
PREPARE --為動態執行準備SQL?語句?
EXECUTE --動態地執行SQL?語句
DESCRIBE ?--描述準備好的查詢?
---局部變量
declare?@id?char(10)?
--set?@id?=?’10010001’?
select?@id?=?’10010001’
---全局變量?
---必須以@@開頭
MSSQL常用匯總
?
下列語句部分是Mssql語句,不可以在access中使用。
SQL分類:?
DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE)?
DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT)?
DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,簡要介紹基礎語句:
1、說明:創建數據庫
CREATE?DATABASE?database-name?
2、說明:刪除數據庫
drop?database?dbname
3、說明:備份sql?server
---?創建?備份數據的?device
USE?master
EXEC?sp_addumpdevice?'disk',?'testBack',?'c:mssql7backupMyNwind_1.dat'
---?開始?備份
BACKUP?DATABASE?pubs?TO?testBack?
4、說明:創建新表
create?table?tabname(col1?type1?[not?null]?[primary?key],col2?type2?[not?null],..)
根據已有的表創建新表:?
A:create?table?tab_new?like?tab_old?(使用舊表創建新表)
B:create?table?tab_new?as?select?col1,col2…?from?tab_old?definition?only
5、說明:刪除新表drop?table?tabname?
6、說明:增加一個列
Alter?table?tabname?add?column?col?type
注:列增加后將不能刪除。DB2中列加上后數據類型也不能改變,唯一能改變的是增加varchar類型的長度。
7、說明:添加主鍵:?Alter?table?tabname?add?primary?key(col)?
說明:刪除主鍵:?Alter?table?tabname?drop?primary?key(col)?
8、說明:創建索引:create?[unique]?index?idxname?on?tabname(col….)?
刪除索引:drop?index?idxname
注:索引是不可更改的,想更改必須刪除重新建。
9、說明:創建視圖:create?view?viewname?as?select?statement?
刪除視圖:drop?view?viewname
10、說明:幾個簡單的基本的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]
總數: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、說明:幾個高級查詢運算詞
A:?UNION?運算符?
UNION?運算符通過組合其他兩個結果表(例如?TABLE1?和?TABLE2)并消去表中任何重復行而派生出一個結果表。當?ALL?隨?UNION?一起使用時(即?UNION?ALL),不消除重復行。兩種情況下,派生表的每一行不是來自?TABLE1?就是來自?TABLE2。?
B:?EXCEPT?運算符?
EXCEPT?運算符通過包括所有在?TABLE1?中但不在?TABLE2?中的行并消除所有重復行而派生出一個結果表。當?ALL?隨?EXCEPT?一起使用時?(EXCEPT?ALL),不消除重復行。?
C:?INTERSECT?運算符
INTERSECT?運算符通過只包括?TABLE1?和?TABLE2?中都有的行并消除所有重復行而派生出一個結果表。當?ALL?隨?INTERSECT?一起使用時?(INTERSECT?ALL),不消除重復行。?
注:使用運算詞的幾個查詢結果行必須是一致的。?
12、說明:使用外連接?
A、left?outer?join:?
左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。?
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:?
右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。?
C:full?outer?join:?
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
其次,大家來看一些不錯的sql語句
1、說明:復制表(只復制結構,源表名:a?新表名:b)?(Access可用)
法一:select?*?into?b?from?a?where?1<>1
法二:select?top?0?*?into?b?from?a
2、說明:拷貝表(拷貝數據,源表名:a?目標表名:b)?(Access可用)
insert?into?b(a,?b,?c)?select?d,e,f?from?b;
3、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑)?(Access可用)
insert?into?b(a,?b,?c)?select?d,e,f?from?b?in?‘具體數據庫’?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、說明:顯示文章、提交人和最后回復時間
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限制查詢數據范圍時包括了邊界值,not?between不包括
select?*?from?table1?where?time?between?time1?and?time2
select?a,b,c,?from?table1?where?a?not?between?數值1?and?數值2
9、說明:in?的使用方法
select?*?from?table1?where?a?[not]?in?(‘值1’,’值2’,’值4’,’值6’)
10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息?
delete?from?table1?where?not?exists?(?select?*?from?table2?where?table1.field1=table2.field1?)
11、說明:四表聯查問題:
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開始時間,getdate())>5
13、說明:一條sql?語句搞定數據庫分頁
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值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select?a,b,c?from?tablename?ta?where?a=(select?max(a)?from?tablename?tb?where?tb.b=ta.b)
16、說明:包括所有在?TableA?中但不在?TableB和TableC?中的行并消除所有重復行而派生出一個結果表
(select?a?from?tableA?)?except?(select?a?from?tableB)?except?(select?a?from?tableC)
17、說明:隨機取出10條數據
select?top?10?*?from?tablename?order?by?newid()
18、說明:隨機選擇記錄
select?newid()
19、說明:刪除重復記錄
Delete?from?tablename?where?id?not?in?(select?max(id)?from?tablename?group?by?col1,col2,...)
20、說明:列出數據庫里所有的表名
select?name?from?sysobjects?where?type='U'?
21、說明:列出表里的所有的
select?name?from?syscolumns?where?id=object_id('TableName')
22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現多重選擇,類似select?中的case。
select?type,sum(case?vender
?
?
代碼 --使用Sql語句從數據庫讀出數據字典SELECT??表名=case?when?a.colorder=1?then?d.name?else?''?end,?
???????字段序號=a.colorder,?字段名=a.name,?標識=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,?占用字節數=a.length,?長度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),?
?????????????????小數位數=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),?允許空=case?when?a.isnullable=1?then?'√'else?''?end,?
??????????????????默認值=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
?
?
posted on 2009-12-19 12:12 DotNet編程 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/furenjun/archive/2009/12/19/sql.html
總結
以上是生活随笔為你收集整理的[转]SQL语句大全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不知道对象的传递那些参数
- 下一篇: 使用stsadm命令部署和激活webpa