當前位置:首頁 » 編程語言 » sql語句中使用new和old
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql語句中使用new和old

發布時間: 2022-09-02 19:06:13

資料庫的觸發器怎麼進行高級操作

1.new與old在資料庫的觸發器中經常會用到更新前的值和更新後的值,所以掌握new和old的語法很重要。

old:表示操作執行前的數據行。

new:表示操作執行後的數據行。

一User數據表如圖User數據表所示,若執行以下更新操作語句:updateUsersetscore=80whereuser_id=1

User數據表

則在此操作中,old表示未執行update語句前user_id=1這行記錄;而new表示執行update語句後user_id=1這行記錄。

從上面的表述中可知,new與old均表示某一行記錄,old所表示的是寫操作發生前的這一行舊數據,new則表示寫操作發生後的這一行新的數據。正因如此,可以把new與old看作面向對象編程裡面的一個對象或實例,與面向對象的方式類似,可用new.欄位名或old.欄位名的方式進行存取值。

old.欄位名:表示未執行操作前的該行對應的某欄位值。

new.欄位名:表示執行操作後的該行對應的某欄位值。

在上面User表的update操作中:old.score=60,表示update操作前score欄位的舊值是60。

new.score=80,表示update操作後score欄位的新值是80。

如果要使用new語句進行賦值,只能在before類型的觸發器中使用,不能在after類型的觸發器中使用。

更新操作前使用before先賦值,再插入資料庫中。如以下語句是正確的:.金額=0;END更新操作後,不能在after中用new賦值,因為操作已經結束,只能讀取內容。如以下語句是錯誤的:.金額=0;ENDnew與old的區別:前者可在before觸發器中賦值、取值,也可在after觸發器中取值;

後者只能用於取值,因為賦值沒有意義。

注意:INSERT語句,只有new合法;

DELETE語句,只有old才合法;

UPDATE語句,可以同時使用new和old。

2.before與afterbefore與after表示觸發器觸發的時間點是在寫操作開始之前,還是在寫操作完成後,正因為它們有時間點先後的問題,因此它們的功能與使用場合有非常大的差別。

(1)before((1)先完成觸發操作,再執行業務數據的增刪改。

(2)觸發的語句先於監視的業務語句。

(3)有機會影響即將發生的操作。

2)after((1)先完成業務數據的增刪改,再觸發。

(2)觸發的語句晚於監視的業務語句。

(3)無法影響前面的增刪改動作。

3.異常處理Mysql現有版本中不支持自定義異常,當某處需要拋出異常時,可拋出一個系統異常(類似運行異常)。如故意往不存在的表中插入數據等方式來觸發系統異常的拋出,當異常拋出時,本次正在執行的所有操作會終止執行,並回滾所有數據到操作發生前的狀態。

在觸發器中,需要拋出異常的場景有很多,以下兩個方面較為普遍:((1)新進來的數據不符合業務邏輯。

例如,①倉庫最大商品庫存數為10,訂單要求一次性購買數量20。

②銀行賬戶上只有50元,想要支付100元的賬單。

(2)許可權不足,不允許操作。

例如,①普通用戶通過非法途徑操作核心資源表。

②在非工作日修改業務數據。4.觸發器案例用mytab.sql腳本創建表環境,然後用下面語句創建觸發器。當往mytab表添加記錄時,觸發器中將拋出異常,導致所有操作終止,並回滾所有操作的數據。

DELIMITER//DROPTRIGGERIFEXISTSt_exception_trigger;CREATETRIGGERt_exception_--tab3表不存在

Ⅱ 資料庫觸發器中new表和old表是什麼意思

觸發器不會產生new表和old表,所謂new,old只是指insert
delete
update操作執行前的表和執行後的表,其實都是觸發器所在的那個表。
當你執行了一個操作的時候,有before觸發器的時候,會先運行觸發器,這個時候表的狀態是old,你在觸發器中可以取old的內容,然後也可以指定new的內容,而默認new的內容是你操作時更新的數據內容,如果沒有指定,則還是old的內容,最後執行操作,按照new的數據更新進表。

Ⅲ 資料庫SQL語句!求救!

1、說明:創建資料庫
CREATE DATABASE database-name
2、說明:刪除資料庫
drop database dbname
3、說明:備份sql server
--- 創建 備份數據的 device
USE master
EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_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/cross (outer) join:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
12、分組:Group by:
一張表,一旦分組 完成後,查詢後只能得到組相關的信息。
組相關的信息:(統計信息) count,sum,max,min,avg 分組的標准)
在SQLServer中分組時:不能以text,ntext,image類型的欄位作為分組依據
在selecte統計函數中的欄位,不能和普通的欄位放在一起;
13、對資料庫進行操作:
分離資料庫: sp_detach_db;附加資料庫:sp_attach_db 後接表明,附加需要完整的路徑名
14.如何修改資料庫的名稱:
sp_renamedb 'old_name', 'new_name'

Ⅳ SQL的基本操作

1、說明:創建資料庫

CREATE DATABASE database-name

2、說明:刪除資料庫

drop database dbname

3、說明:備份sql server

--- 創建 備份數據的 device

USE master

EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_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 when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type

顯示結果:

type vender pcs

電腦 A 1

電腦 A 1

光碟 B 2

光碟 A 2

手機 B 3

手機 C 3

23、說明:初始化表table1

TRUNCATE TABLE table1

24、說明:選擇從10到15的記錄

select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc

隨機選擇資料庫記錄的方法(使用Randomize函數,通過SQL語句實現)

存儲在資料庫中的數據來說,隨機數特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP「找個隨機數」然後列印出來。實際上常見的解決方案是建立如下所示的循環:

Randomize

RNumber = Int(Rnd*499) +1

While Not objRec.EOF

If objRec("ID") = RNumber THEN

... 這里是執行腳本 ...

end if

objRec.MoveNext

Wend

這很容易理解。首先,你取出1到500范圍之內的一個隨機數(假設500就是資料庫內記錄的總數)。然後,你遍歷每一記錄來測試ID 的值、檢查其是否匹配RNumber。滿足條件的話就執行由THEN 關鍵字開始的那一塊代碼。假如你的RNumber 等於495,那麼要循環一遍資料庫花的時間可就長了。雖然500這個數字看起來大了些,但相比更為穩固的企業解決方案這還是個小型資料庫了,後者通常在一個資料庫內就包含了成千上萬條記錄。這時候不就死定了?

採用SQL,你就可以很快地找出准確的記錄並且打開一個只包含該記錄的recordset,如下所示:

Randomize

RNumber = Int(Rnd*499) + 1

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber

set objRec = ObjConn.Execute(SQL)

Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")

不必寫出RNumber 和ID,你只需要檢查匹配情況即可。只要你對以上代碼的工作滿意,你自可按需操作「隨機」記錄。Recordset沒有包含其他內容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時間。

再談隨機數

現在你下定決心要榨乾Random 函數的最後一滴油,那麼你可能會一次取出多條隨機記錄或者想採用一定隨機范圍內的記錄。把上面的標准Random 示例擴展一下就可以用SQL應對上面兩種情況了。

為了取出幾條隨機選擇的記錄並存放在同一recordset內,你可以存儲三個隨機數,然後查詢資料庫獲得匹配這些數字的記錄:

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3

假如你想選出10條記錄(也許是每次頁面裝載時的10條鏈接的列表),你可以用BETWEEN 或者數學等式選出第一條記錄和適當數量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 SELECT 語句只顯示一種可能(這里的ID 是自動生成的號碼):

SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

注意:以上代碼的執行目的不是檢查資料庫內是否有9條並發記錄。

隨機讀取若干條記錄,測試過

Access語法:SELECT top 10 * From 表名 ORDER BY Rnd(id)

Sql server:select top n * from 表名 order by newid()

mysql select * From 表名 Order By rand() Limit n

Access左連接語法(最近開發要用左連接,Access幫助什麼都沒有,網上沒有Access的SQL說明,只有自己測試, 現在記下以備後查)

語法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...

使用SQL語句 用...代替過長的字元串顯示

語法:

SQL資料庫:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename

Access資料庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;

Conn.Execute說明

Execute方法

該方法用於執行SQL語句。根據SQL語句執行後是否返回記錄集,該方法的使用格式分為以下兩種:

1.執行SQL查詢語句時,將返回查詢得到的記錄集。用法為:

Set 對象變數名=連接對象.Execute("SQL 查詢語言")

Execute方法調用後,會自動創建記錄集對象,並將查詢結果存儲在該記錄對象中,通過Set方法,將記錄集賦給指定的對象保存,以後對象變數就代表了該記錄集對象。

2.執行SQL的操作性語言時,沒有記錄集的返回。此時用法為:

連接對象.Execute "SQL 操作性語句" [, RecordAffected][, Option]

•RecordAffected 為可選項,此出可放置一個變數,SQL語句執行後,所生效的記錄數會自動保存到該變數中。通過訪問該變數,就可知道SQL語句隊多少條記錄進行了操作。

•Option 可選項,該參數的取值通常為adCMDText,它用於告訴ADO,應該將Execute方法之後的第一個字元解釋為命令文本。通過指定該參數,可使執行更高效。

•BeginTrans、RollbackTrans、CommitTrans方法

這三個方法是連接對象提供的用於事務處理的方法。BeginTrans用於開始一個事物;RollbackTrans用於回滾事務;CommitTrans用於提交所有的事務處理結果,即確認事務的處理。

事務處理可以將一組操作視為一個整體,只有全部語句都成功執行後,事務處理才算成功;若其中有一個語句執行失敗,則整個處理就算失敗,並恢復到處里前的狀態。

BeginTrans和CommitTrans用於標記事務的開始和結束,在這兩個之間的語句,就是作為事務處理的語句。判斷事務處理是否成功,可通過連接對象的Error集合來實現,若Error集合的成員個數不為0,則說明有錯誤發生,事務處理失敗。Error集合中的每一個Error對象,代表一個錯誤信息。

資料引用:http://www.knowsky.com/398670.html

Ⅳ 如何實現NewSQL,NoSQL與OldSQL的混合部署

在大數據時代,「多種架構支持多類應用」成為資料庫行業應對大數據的基本思路,資料庫行業出現互為補充的三大陣營,適用於事務處理應用的OldSQL、適用於數據分析應用的NewSQL和適用於互聯網應用的NoSQL。但在一些復雜的應用場景中,單一資料庫架構都不能完全滿足應用場景對海量結構化和非結構化數據的存儲管理、復雜分析、關聯查詢、實時性處理和控制建設成本等多方面的需要,因此不同架構資料庫混合部署應用成為滿足復雜應用的必然選擇。不同架構資料庫混合使用的模式可以概括為:OldSQL+NewSQL、OldSQL+NoSQL、NewSQL+NoSQL三種主要模式。下面通過三個案例對不同架構資料庫的混合應用部署進行介紹。
OldSQL+NewSQL 在數據中心類應用中混合部署
採用OldSQL+NewSQL模式構建數據中心,在充分發揮OldSQL資料庫的事務處理能力的同時,藉助NewSQL在實時性、復雜分析、即席查詢等方面的獨特優勢,以及面對海量數據時較強的擴展能力,滿足數據中心對當前「熱」數據事務型處理和海量歷史「冷」數據分析兩方面的需求。OldSQL+NewSQL模式在數據中心類應用中的互補作用體現在,OldSQL彌補了NewSQL不適合事務處理的不足,NewSQL彌補了OldSQL在海量數據存儲能力和處理性能方面的缺陷。
商業銀行數據中心採用OldSQL+NewSQL混合部署方式搭建,OldSQL資料庫滿足各業務系統數據的歸檔備份和事務型應用,NewSQL MPP資料庫集群對即席查詢、多維分析等應用提供高性能支持,並且通過MPP集群架構實現應對海量數據存儲的擴展能力。

商業銀行數據中心存儲架構
與傳統的OldSQL模式相比,商業銀行數據中心採用OldSQL+NewSQL混合搭建模式,數據載入性能提升3倍以上,即席查詢和統計分析性能提升6倍以上。NewSQL MPP的高可擴展性能夠應對新的業務需求,可隨著數據量的增長採用集群方式構建存儲容量更大的數據中心。
OldSQL+NoSQL 在互聯網大數據應用中混合部署
在互聯網大數據應用中採用OldSQL+NoSQL混合模式,能夠很好的解決互聯網大數據應用對海量結構化和非結構化數據進行存儲和快速處理的需求。在諸如大型電子商務平台、大型SNS平台等互聯網大數據應用場景中,OldSQL在應用中負責高價值密度結構化數據的存儲和事務型處理,NoSQL在應用中負責存儲和處理海量非結構化的數據和低價值密度結構化數據。OldSQL+NoSQL模式在互聯網大數據應用中的互補作用體現在,OldSQL彌補了NoSQL在ACID特性和復雜關聯運算方面的不足,NoSQL彌補了OldSQL在海量數據存儲和非結構化數據處理方面的缺陷。
數據魔方是淘寶網的一款數據產品,主要提供行業數據分析、店鋪數據分析。淘寶數據產品在存儲層採用OldSQL+NoSQL混合模式,由基於MySQL的分布式關系型資料庫集群MyFOX和基於HBase的NoSQL存儲集群Prom組成。由於OldSQL強大的語義和關系表達能力,在應用中仍然占據著重要地位,目前存儲在MyFOX中的統計結果數據已經達到10TB,占據著數據魔方總數據量的95%以上。另一方面,NoSQL作為SQL的有益補充,解決了OldSQL資料庫無法解決的全屬性選擇器等問題。

淘寶海量數據產品技術架構
基於OldSQL+NoSQL混合架構的特點,數據魔方目前已經能夠提供壓縮前80TB的數據存儲空間,支持每天4000萬的查詢請求,平均響應時間在28毫秒,足以滿足未來一段時間內的業務增長需求。
NewSQL+NoSQL 在行業大數據應用中混合部署
行業大數據與互聯網大數據的區別在於行業大數據的價值密度更高,並且對結構化數據的實時處理、復雜的多表關聯分析、即席查詢、數據強一致性等都比互聯網大數據有更高的要求。行業大數據應用場景主要是分析類應用,如:電信、金融、政務、能源等行業的決策輔助、預測預警、統計分析、經營分析等。
在行業大數據應用中採用NewSQL+NoSQL混合模式,充分利用NewSQL在結構化數據分析處理方面的優勢,以及NoSQL在非結構數據處理方面的優勢,實現NewSQL與NoSQL的功能互補,解決行業大數據應用對高價值結構化數據的實時處理、復雜的多表關聯分析、即席查詢、數據強一致性等要求,以及對海量非結構化數據存儲和精確查詢的要求。在應用中,NewSQL承擔高價值密度結構化數據的存儲和分析處理工作,NoSQL承擔存儲和處理海量非結構化數據和不需要關聯分析、Ad-hoc查詢較少的低價值密度結構化數據的工作。
當前電信運營商在集中化BI系統建設過程中面臨著數據規模大、數據處理類型多等問題,並且需要應對大量的固定應用,以及占統計總數80%以上的突發性臨時統計(ad-hoc)需求。在集中化BI系統的建設中採用NewSQL+NoSQL混搭的模式,充分利用NewSQL在復雜分析、即席查詢等方面處理性能的優勢,及NoSQL在非結構化數據處理和海量數據存儲方面的優勢,實現高效低成本。

集中化BI系統數據存儲架構
集中化BI系統按照數據類型和處理方式的不同,將結構化數據和非結構化數據分別存儲在不同的系統中:非結構化數據在Hadoop平台上存儲與處理;結構化、不需要關聯分析、Ad-hoc查詢較少的數據保存在NoSQL資料庫或Hadoop平台;結構化、需要關聯分析或經常ad-hoc查詢的數據,保存在NewSQL MPP資料庫中,短期高價值數據放在高性能平台,中長期放在低成本產品中。
結語
當前信息化應用的多樣性、復雜性,以及三種資料庫架構各自所具有的優勢和局限性,造成任何一種架構的資料庫都不能完全滿足應用需求,因此不同架構資料庫混合使用,從而彌補其他架構的不足成為必然選擇。根據應用場景採用不同架構資料庫進行組合搭配,充分發揮每種架構資料庫的特點和優勢,並且與其他架構資料庫形成互補,完全涵蓋應用需求,保證數據資源的最優化利用,將成為未來一段時期內信息化應用主要採用的解決方式。
目前在國內市場上,OldSQL主要為Oracle、IBM等國外資料庫廠商所壟斷,達夢、金倉等國產廠商仍處於追趕狀態;南大通用憑借國產新型資料庫GBase 8a異軍突起,與EMC的Greenplum和HP的Vertica躋身NewSQL市場三強;NoSQL方面用戶則大多採用Hadoop開源方案。

Ⅵ sql 語句大全

1、說明:創建資料庫
CREATE DATABASE database-name
2、說明:刪除資料庫
drop database dbname
3、說明:備份sql server
--- 創建 備份數據的 device
USE master
EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_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/cross (outer) join:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
12、分組:Group by:
一張表,一旦分組 完成後,查詢後只能得到組相關的信息。
組相關的信息:(統計信息) count,sum,max,min,avg 分組的標准)
在SQLServer中分組時:不能以text,ntext,image類型的欄位作為分組依據
在selecte統計函數中的欄位,不能和普通的欄位放在一起;
13、對資料庫進行操作:
分離資料庫: sp_detach_db;附加資料庫:sp_attach_db 後接表明,附加需要完整的路徑名
14.如何修改資料庫的名稱:
sp_renamedb 'old_name', 'new_name'

Ⅶ 有關sql insert觸發器和update觸發器

DML觸發器有三類:

1, insert觸發器;

2, update觸發器;

3, delete觸發器;

觸發器的組成部分:

觸發器的聲明,指定觸發器定時,事件,表名以類型

觸發器的執行,PL/SQL塊或對過程的調用

觸發器的限制條件,通過where子句實現

類型:

應用程序觸發器,前台開發工具提供的;

資料庫觸發器,定義在資料庫內部由某種條件引發;分為:

DML觸發器;

資料庫級觸發器;

替代觸發器;

DML觸發器組件:

1,觸發器定時

2,觸發器事件

3,表名

4, 觸發器類型

5, When子句

6, 觸發器主體

可創建觸發器的對象:資料庫表,資料庫視圖,用戶模式,資料庫實例

創建DML觸發器:

Create [or replace] trigger [模式.]觸發器名

Before| after insert|delete|(update of 列名)

On 表名

[for each row]

When 條件

PL/SQL塊

For each row的意義是:在一次操作表的語句中,每操作成功一行就會觸發一次;不寫的話,表示是表級觸發器,則無論操作多少行,都只觸發一次;

When條件的出現說明了,在DML操作的時候也許一定會觸發觸發器,但是觸發器不一定會做實際的工作,比如when 後的條件不為真的時候,觸發器只是簡單地跳過了PL/SQL塊;

Insert觸發器的創建:

create or replace trigger tg_insert

before insert on student

begin

dbms_output.put_line('insert trigger is chufa le .....');

end;

/

執行的效果:

SQL> insert into student

2 values(202,'dongqian','f');

insert trigger is chufa le .....

update表級觸發器的例子:

create or replace trigger tg_updatestudent

after update on student

begin

dbms_output.put_line('update trigger is chufale .....');

end;

/

運行效果:

SQL> update student set se='f';

update trigger is chufale .....

已更新8行;

可見,表級觸發器在更新了多行的情況下,只觸發了一次;

如果在after update on student後加上

For each row的話就成為行級觸發器,運行效果:

SQL> update student set se='m';

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

已更新8行;

:new 與: old:必須是針對行級觸發器的,也就是說要使用這兩個變數的觸發器一定有for each row

這兩個變數是系統自動提供的數組變數,:new用來記錄新插入的值,old用來記錄被刪除的值;

使用insert的時候只有:new里有值;

使用delete的時候只有:old里有值;

使用update的時候:new和:old里都有值;

可以這樣使用: dbms_output.put_line('insert trigger is chufa

dbms_output.put_line('new id is : '||:new.stui

dbms_output.put_line('new name is : '||:new.st

dbms_output.put_line('new se is : '||:new.se);

可以這樣從數據字典中查看一個表上有哪幾個觸發器:

SQL> select trigger_name from user_triggers

2 where table_name=upper('student');

TRIGGER_NAME

------------------------------

TG_INSERT

TG_UPDATESTUDENT

帶有:old變數的行級delete觸發器:

create or replace trigger tg_deletestudent

before delete on student

for each row

begin

dbms_output.put_line('old is: '||:old.stuid);

dbms_output.put_line('old name: '||:old.stuname);

end;

/

運行效果:

SQL> delete from student;

old is: 202

old name: dongqian

old is: 101

old name: liudehua

old is: 102

old name: lingqingxia

old is: 103

old name: lichanggong

old is: 104

old name: zhenxiuwen

old is: 1001

old name: lilianjie

old is: 1009

old name: tongleifuck

old is: 203

old name: kfdj

old is: 209

old name: fuck

已刪除9行

When的使用:如果在begin也就是說觸發器的PL/SQL主體塊執行前加上when(old.se=』f』)的話,DML操作照做不誤,但是只會在刪除

Se=』f』的那行的時候才會執行觸發器的主體動作,執行效果:

SQL> delete from student;

old is: 209

old name: fuck

已刪除9行; 這里雖然刪了9行,但是只執行了一次觸發器的主體,做為一個行級觸發器;

混合類型觸發器:

Inserting,deleting,updating三個謂詞可以分別指示當前操作到底是哪個;

create or replace trigger hunhetrigger

before insert or update or delete on student

for each row

begin

if inserting then

dbms_output.put_line('insert le.........');

end if;

if deleting then

dbms_output.put_line('delete le .......');

end if;

end;

/

插入的時候就自動判斷當前動作為插入:

SQL> insert into student values(303,'me','f');

insert le.........

刪除的時候就自動判斷當前動作為刪除:

SQL> delete from student;

delete le .......

注意,既然觸發器內部的主體PL/SQL是語句,那麼它同樣也可以是插入刪除操作而不一定只是dbms_output列印一些信息;

這正是日誌表的原理:在用戶執行了DML語句的時候觸發主體為插入日誌表以記錄操作軌跡的觸發器;

為什麼用觸發器? 當我們有兩個表用來記錄商品的出庫入庫情況,good_store用來記錄庫存的產品類別和數量,

而good_out用來記錄出庫的產品類別和數量,那麼每當我們出庫的某個類別的產品一定數量的時候,我們應該在good_out中插入該產品的類別和

出庫數量,而同時也應該在good_store表中用update來更新庫存的相應類別的產品的數量;這就交給了我們兩個必須完成的任務:插入good_out

表後更新good_store表,這樣的手工過程使得我們覺得非常ugly,如果只做其中一個那造成數據的不一致;所以現在我們可以用觸發器,在

Good_out表的插入操作上綁定一個對good_store進行更新的觸發器;當然這個過程應該是一個事務,你不必擔心插入good_out表執行了,而綁定在這個動作上的觸發器操作不會執行,相信Oracle設計為原子性了;

注意:觸發器會使得原來的SQL語句速度變慢;

替代觸發器:

創建在視圖上的觸發器,就是替代觸發器,只能是行級觸發器;

為什麼要用替代觸發器?

假如你有一個視圖是基於多個表的欄位連接查詢得到的;現在如果你想直接對著這個視圖insert;那你一定在想,我對視圖的插入操作

怎麼來反應到組成這個視圖的各個表中呢?事實上,除了定義一個觸發器來綁定在對視圖上的插入動作上外,你沒有別的辦法通過系統的報錯而直接向視圖中插入數據;這就是我們用替代觸發器的原因;替換的意思實際上是觸發器的主體部分把對視圖的插入操作轉換成詳細的對各個表的插入;

變異表:變異表就是當前SQL語句正在修改的表,所以在一個變異表上綁定的觸發器不可以使用cout()函數,原因很簡單:SQL語句剛剛修改了表,你怎麼統計??

約束表:

維護:

Alter trigger …..disenable; 使得觸發器不可用;

Alter trigger ……enable; 開啟觸發器;

Oracle的內置程序包

擴展資料庫的功能;

為PL/SQL提供對SQL功能的訪問;

一般具有sys許可權的高級管理人員使用;

一個典型的程序包就是dbms_output,你老是用它的過程put_line();

Dbms_standard 提供語言工具;

Dbms_lob操作Oracle LOB;就是針對大型數據的操作設計的;

Dbms_lock用戶定義的鎖;

Dbms_job 允許對PL/SQL過程進行調度;

Dbms_alert 支持資料庫事件的非同步通知;

1,dbms_output的一些過程:

a):enable

b):disable

c):put只是把數據放到緩存(SQL-Plus的緩存,實際就是整個窗口)中,無輸出功能;

d):put_line可以使得以前放在緩存中所有數據輸出;並且換到下一行;

e):new_line

f):get_line

g):get_lines

2,dmbs_lob ,這個包只能是由系統管理員來操作;

Clob以字元數據存儲可達2G;

Blob以二進制數據存儲可達4G;

Nclob以unicode字元存儲;

一個文件下載列表的例子:

創建下載目錄表:

create table downfilelist

(

id varchar(20) not null primary key,

name varchar(40) not null,

filelocation bfile,

description clob

)

/

創建目錄:

create or replace directory filedir as 'f:\oracle'

/只是向Oralce注冊了目錄,實際上並不會真的建立目錄在磁碟上;Oracle無權管理和鎖定操作系統的文件系統;

向目錄表中插入數據:

insert into downfilelist

values('10001','oracle plsal編程指南',bfilename(upper('filedir'),'demo.mp3'),'this is a mp3 music')

insert into downfilelist

values('10002','java 大權', bfilename(upper('filedir'),'x.jpg'),'good super girl')

/在filedir的目錄f:\oracle下實際存儲著demo.mp3 ,x.jpg;

注意,如果你試圖查詢,效果是 :

sys>select * from downfilelist;

SP2-0678: 列或屬性類型無法通過 SQL*Plus 顯示

因為第三列是無法顯示的,是一個二進制的;

下面使用dbms_lob的一些過程來進行操作:

1,read過程

declare

tempdesc clob;

ireadcount int;

istart int;

soutputdesc varchar(100);

begin

ireadcount:=5;

istart:=1;

select description into tempdesc from downfilelist where id='10001';

dbms_lob.read(tempdesc,ireadcount,istart,soutputdesc); 把clob類型的tempdesc中的數據讀到字元類型的soutputdesc里;

dbms_output.put_line('Top 5 character is: '||soutputdesc);

end;

/注意,對unicode來說,漢字和字母所佔的位數是一樣的;

2,getlength函數

select description into tempclob from downfilelist where id=『10001』;

ilen:=dbms_lob.GetLength(tempclob);

append,……..

發現這樣的現象:select x into y的時候,y並不是獨立於x的拷貝,因為當修改y的時候x也被修改了;

3, fileexists函數

select id ,dbms_lob.fileexists(filelocation) from downfilelist;

如果在bfile類型欄位filelocation指定的系統下的目錄中存在filelocation指定的系統文件,則返回int 1,否則返回0;

這說明Oracle還是可以檢測到系統的文件情況的,如同java.io包里的類一樣;

對bfile類型數據的操作函數有fileisopen,fileopen,fileclose等等;

如果對您有幫助,請記得採納為滿意答案,謝謝!祝您生活愉快!

vaela

Ⅷ access sql語句Select中where的使用

select new.* from new,old where new.a=old.a and new.b<>old.b;