Oracle 批量修改語句及相關知識點

2021-07-25 01:42:01 字數 1655 閱讀 7502

問:

有兩張表a和b,結構相同,資料量一致,比如都有x,y和z列且都有n行,x為主鍵,完全相等,如何把錶b的y列的資料賦值給a的y列?

我寫的是1 update a set a.y=b.y where a.x=b.x報錯原因是表b未定義。  答:

update a set a.y=(select y

from b

where b.x = a.x)

where exists (select 1

from b

where a.x= b.x);

問題出處:

1.exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false

2.exists 指定乙個子查詢,檢測的存在。

3.exists(包括 not exists )子句的返回值是乙個bool值。 exists內部有乙個子查詢語句(select ... from...), 我將其稱為exist的內查詢語句。其內查詢語句返回乙個結果集。

4.exists子句根據其內查詢語句的結果集空或者非空,返回乙個布林值。

5.一種通俗的可以理解為:將外查詢表的每一行,代入內查詢作為檢驗,如果內查詢返回的結果取非空值,則exists子句返回true,這一行行可作為外查詢的結果行,否則不能作為結果。

6.分析器會先看語句的第乙個詞,當它發現第乙個詞是select關鍵字的時候,它會跳到from關鍵字,然後通過from關鍵字找到表名並把表裝入記憶體。接著是找where關鍵字,如果找不到則返回到 select找欄位解析,如果找到where,則分析其中的條件,完成後再回到select分析字段。最後形成一張我們要的虛表。

where關鍵字後面的是條件表示式。條件表示式計算完成後,會有乙個返回值,即非0或0,非0即為真(true),0即為假(false)。同理where後面的條件也有乙個返回值,真或假,來確定接下來執不執行select。

分析器先找到關鍵字select,然後跳到from關鍵字將student表匯入記憶體,並通過指標找到第一條記錄,接著找到where關鍵字計算它的條件表示式,如果為真那麼把這條記錄裝到乙個虛表當中,指標再指向下一條記錄。如果為假那麼指標直接指向下一條記錄,而不進行其它操作。一直檢索完整個表,並把檢索出來的虛擬表返回給使用者。exists是條件表示式的一部分,它也有乙個返回值(true或false)。

7.在插入記錄前,需要檢查這條記錄是否已經存在,只有當記錄不存在時才執行插入操作,可以通過使用 exists 條件句防止插入重覆記錄。

1

insert

into

tablein (aname,a***)

2select

top1'張三

', '男'

from

tablein

3where

notexists (select

*from tablein where tablein.aid =

7)

8.exists與in的使用效率的問題,通常情況下採用exists要比in效率高,因為in不走索引,但要看實際情況具體使用:

in適合於外表大而內錶小的情況;exists適合於外表小而內錶大的情況。

另外還有關於與any等函式的比較問題,具體參見:

批量kill Mysql相關語句

1 通過information schema.processlist表中的連線資訊生成需要處理掉的mysql連線的語句臨時檔案,然後執行臨時檔案中生成的指令 mysql select concat kill id,from information schema.processlist where u...

oracle語句相關

巢狀查詢 定義 1 指在乙個外層查詢中包含有另乙個內層查詢。其中外層查詢稱為主查詢,內層查詢稱為子查詢。2 sql 允許多層巢狀,由內而外地進行分析,子查詢的結果作為主查詢的查詢條件 3 子查詢中一般不使用 order by 子句,只能對最終查詢結果進行排序 子查詢 sub query where ...

Oracle批量執行SQL語句

1.在plsql之類的工具中把語句塊寫在begin end之間,如 begin insert into table values insert into table values insert into table values insert into table values end 記住在end...