青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

SQL使用記錄

問題:Update字段來自子查詢或者來自其他表字段

Update 語句

Update 語句用于修改表中的數據。

語法:

UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
SQL update select語句
最常用的update語法是:
UPDATE <table_name> SET <column_name1> = <value>, SET <column_name2> = <value>
如果我的更新值Value是從一條select語句拿出來,而且有很多列的話,用這種語法就很麻煩
第一,要select出來放在臨時變量上,有很多個哦
第二,再將變量進行賦值。
列多起來非常麻煩,能不能像Insert那樣,把整個Select語句的結果進行插入呢?就好象下面
insert into table1 (c1, c2, c3) (select v1, v2, v3 from table2)
 
答案是可以的,具體的語法如下:
UPDATE <table_name> <alias>
SET (<column_name>,<column_name> ) = (
SELECT (<column_name>, <column_name>)
FROM <table_name>
WHERE <alias.column_name> = <alias.column_name>)
WHERE <column_name> <condition> <value>;
 
下面是這樣一個例子:
兩個表a、b,想使b中的memo字段值等于a表中對應id的name值 
表a:id, name 
1 王 
2 李 
3 張 
表b:id,ClientName   
            1 
(MS SQL Server)語句:update b   set   ClientName    = a.name    from a,b    where a.id = b.id  
(Oralce)語句:update b   set   (ClientName)    =   (SELECT name FROM a WHERE b.id = a.id)
update set from 語句格式
當where和set都需要關聯一個表進行查詢時,整個update執行時,就需要對被關聯的表進行兩次掃描,顯然效率比較低。
對于這種情況,Sybase和SQL SERVER的解決辦法是使用UPDATE...SET...FROM...WHERE...的語法,實際上就是從源表獲取更新數據。
 
在 SQL 中,表連接(left join、right join、inner join 等)常常用于 select 語句,其實在 SQL 語法中,這些連接也是可以用于 update 和 delete 語句的,在這些語句中使用 join 還常常得到事半功倍的效果。
Update T_OrderForm SET T_OrderForm.SellerID =B.L_TUserID
FROM T_OrderForm A LEFT JOIN T_ProductInfo   B ON B.L_ID=A.ProductID
用來同步兩個表的數據!
 
Oralce和DB2都支持的語法:
UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)
MS SQL Server不支持這樣的語法,相對應的寫法為:
UPDATE A  SET A1 = B1, A2 = B2, A3 = B3  FROM A LEFT JOIN B ON A.ID = B.ID
個人感覺MS SQL Server的Update語法功能更為強大。MS SQL SERVER的寫法:
UPDATE A SET A1 = B1, A2 = B2, A3 = B3 FROM A, B WHERE A.ID = B.ID
OracleDB2中的寫法就比較麻煩了,如下:
UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)
WHERE ID IN (SELECT B.ID FROM B WHERE A.ID = B.ID)


但對于MySql以上卻不行

Single-table語法:

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT row_count]

Multiple-table語法:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]

UPDATE語法可以用新值更新原有表行中的各列。SET子句指示要修改哪些列和要給予哪些值。WHERE子句指定應更新哪些行。如果沒有WHERE子句,則更新所有的行。如果指定了ORDER BY子句,則按照被指定的順序對行進行更新。LIMIT子句用于給定一個限值,限制可以被更新的行的數目。

 

如果您在一個表達式中通過tbl_name訪問一列,則UPDATE使用列中的當前值。例如,以下語句把年齡列設置為比當前值多一:

UPDATE persondata SET age=age+1;

UPDATE賦值被從左到右評估。例如,以下語句對年齡列加倍,然后再進行增加:

UPDATE persondata SET age=age*2, age=age+1;

如果您把一列設置為其當前含有的值,則MySQL會注意到這一點,但不會更新。

update表的某些字段為null

update person set number=null,name=null;

如果您把被已定義為NOT NULL的列更新為NULL,則該列被設置到與列類型對應的默認值,并且累加警告數。對于數字類型,默認值為0;對于字符串類型,默認值為空字符串('');對于日期和時間類型,默認值為“zero”值。

 

多個表的UPDATE操作

UPDATE items,month SET items.price=month.price WHERE items.id=month.id;

以上的例子顯示出了使用逗號操作符的內部聯合,但是multiple-table UPDATE語句可以使用在SELECT語句中允許的任何類型的聯合,比如LEFT JOIN,但是您不能把ORDER BYLIMITmultiple-table UPDATE同時使用。

MYSQL聯合多表更新和刪除
多表更新
在 MySQL 3.23 中,你可以使用 LIMIT # 來確保只有給定的記錄行數目被更改。 

如果一個 ORDER BY 子句被使用(從 MySQL 4.0.0 開始支持),記錄行將以指定的次序被更新。這實際上只有連同 LIMIT 一起才有用。 

從 MySQL 4.0.4 開始,你也可以執行一個包含多個表的 UPDATE 的操作: 

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

注意:多表 UPDATE 不可以使用 ORDER BY 或 LIMIT。 


多表刪除
第一個多表刪除格式從 MySQL 4.0.0 開始被支持。第二個多表刪除格式從 MySQL 4.0.2 開始被支持。 

僅僅在 FROM 或 USING 子句 之前 列出的表中的匹配記錄行被刪除。效果就是,你要以從多個表中同時刪除記錄行,并且同樣可以有其它的表用于檢索。 

在表名后的 .* 僅僅是為了兼容 Access: 

DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id   or    DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id

在上面的情況下,我們僅僅從 t1 和 t2 表中刪除匹配的記錄行。 

如果一個 ORDER BY 子句被使用(從 MySQL 4.0.0 開始支持), 記錄行將以指定的次序刪除。這實際上只有連同 LIMIT 一起才有用。示例如下: 

DELETE FROM somelog  WHERE user = 'jcole'  ORDER BY timestamp LIMIT 1

這將刪除匹配 WHERE 子句的,并且最早被插入(通過 timestamp 來確定)的記錄行。 

DELETE 語句的LIMIT rows 選項是 MySQL 特有的,它告訴服務器在控制權被返回到客戶端之前可被刪除的最大記錄行數目。這可以用來確保一個特定的 DELETE 命令不會占用太長的時間。你可以簡單地重復使用 DELETE 命令,直到被影響的記錄行數目小于 LIMIT 值。 

從 MySQL 4.0 開始,在 DELETE 語句中可以指定多個表,用以從一個表中刪除依賴于多表中的特殊情況的記錄行。然而,在一個多表刪除中,不能使用 ORDER BY 或 LIMIT。
假設有兩個表,tab1,tab2,分別有產品名稱和產品價格,現在我想用tab2的價格替換tab1的價格,我寫的語句是Update tab1 set tab1.產品價格=tab2.產品價格 where tab1.產品名稱=tab2.產品名稱 
結果出現錯誤,提示為:列前綴 'tab2' 與查詢中所用的表名或別名不匹配。請問應該怎樣寫,

SQL語句是不支持多表同時更新的。 

應該這樣寫 

update tab1 set tab1.產品價格 = (select tab2.產品價格 from tab2 where tab2.產品名稱 = tab1.產品名稱) where tabl1.產品名稱 in (select tab2.產品名稱 from tab2) 


后面的where tab1.產品名稱 in (select tab2.產品名稱 from tab2) 這句保證了如果tab1的產品在tab2沒有記錄時不會出錯。


在 開發中,數據庫來回換,而有些關鍵性的語法又各不相同,這是一件讓開發人員很頭痛的事情.本文總結了Update語句更新多表時在SQL Server,Oracle,MySQL三種數據庫中的用法.我也試了SQLite數據庫,都沒成功,不知是不支持多表更新還是咋的. 

在本例中: 

我們要用表gdqlpj中的gqdltks,bztks字段數據去更新landleveldata中的同字段名的數據,條件是當landleveldata 中的GEO_Code字段值與gdqlpj中的lxqdm字段值相等時進行更新. 

SQL Server語法: 
UPDATE 
          { 
           table_name WITH ( < table_hint_limited > [ ...n ] ) 
           | view_name 
           | rowset_function_limited 
          } 
          SET 
          { column_name = { expression | DEFAULT | NULL } 
          | @variable = expression 
          | @variable = column = expression } [ ,...n ] 

      { { [ FROM { < table_source > } [ ,...n ] ] 

          [ WHERE 
              < search_condition > ] } 
          | 
          [ WHERE CURRENT OF 
          { { [ GLOBAL ] cursor_name } | cursor_variable_name } 
          ] } 
          [ OPTION ( < query_hint > [ ,...n ] ) ] 

SQL Server示例: 
update a 
set a.gqdltks=b.gqdltks,a.bztks=b.bztks 
from landleveldata a,gdqlpj b 
where a.GEO_Code=b.lxqdm 

Oracle語法: 
UPDATE    updatedtable 
      SET (col_name1[,col_name2...])= 
(SELECT    col_name1,[,col_name2...]   
FROM    srctable [WHERE where_definition]) 

Oracel 示例: 
update landleveldata a 
set (a.gqdltks, a.bztks)= 
(select b.gqdltks, b.bztks    from gdqlpj b 
    where a.GEO_Code=b.lxqdm) 

MySQL語法: 
UPDATE table_references 
      SET col_name1=expr1 [, col_name2=expr2 ...] 
      [WHERE where_definition] 

MySQL 示例: 
update landleveldata a, gdqlpj b 
set a.gqdltks= b.gqdltks, 
a.bztks= b.bztks 
    where a.GEO_Code=b.lxqdm

MySQL SELECT同時UPDATE同一張表
MySQL不允許SELECT FROM后面指向用作UPDATE的表,有時候讓人糾結。當然,有比創建無休止的臨時表更好的辦法。本文解釋如何UPDATE一張表,同時在查詢子句中使用SELECT.

問題描述

假設我要UPDATE的表跟查詢子句是同一張表,這樣做有許多種原因,例如用統計數據更新表的字段(此時需要用group子句返回統計值),從某一條記錄的字段update另一條記錄,而不必使用非標準的語句,等等。舉個例子:
  1. create table apples(variety char(10) primary key, price int);  
  2.   
  3. insert into apples values('fuji', 5), ('gala', 6);  
  4.   
  5. update apples  
  6.     set price = (select price from apples where variety = 'gala')  
  7.     where variety = 'fuji';  

錯誤提示是:ERROR 1093 (HY000): You can't specify target table 'apples' for update in FROM clause. MySQL手冊UPDATE documentation這下面有說明 : “Currently, you cannot update a table and select from the same table in a subquery.”
在這個例子中,要解決問題也十分簡單,但有時候不得不通過查詢子句來update目標。好在我們有辦法。

解決辦法

既然MySQL是通過臨時表來實現FROM子句里面的嵌套查詢,那么把嵌套查詢裝進另外一個嵌套查詢里,可使FROM子句查詢和保存都是在臨時表里進行,然后間接地在外圍查詢被引用。下面的語句是正確的:
  1. update apples  
  2.    set price = (  
  3.       select price from (  
  4.          select * from apples  
  5.       ) as x  
  6.       where variety = 'gala')  
  7.    where variety = 'fuji';  

如果你想了解更多其中的機制,請閱讀MySQL Internals Manual相關章節。

沒有解決的問題

一個常見的問題是,IN()子句優化廢品,被重寫成相關的嵌套查詢,有時(往往?)造成性能低下。把嵌套查詢裝進另外一個嵌套查詢里并不能阻止它重寫成相關嵌套,除非我下狠招。這種情況下,最好用JOIN重構查詢(rewrite such a query as a join)。

另一個沒解決的問題是臨時表被引用多次。“裝進嵌套查詢”的技巧無法解決這些問題,因為它們在編譯時被創建,而上面討論的update問題是在運行時。(譯者注:個人認為跟文章討論的主題沒幾毛錢關系)

轉載請注明出處 http://blog.csdn.net/afeiqiang/article/details/8589535

原文地址 http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/

posted on 2015-03-17 15:43 Daywei 閱讀(777) 評論(0)  編輯 收藏 引用 所屬分類: DB

<2015年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統計

常用鏈接

留言簿

隨筆分類

隨筆檔案

文章檔案

牛人博客

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久激情一区| 国产欧美日韩伦理| 日韩视频一区二区三区在线播放免费观看| 欧美在线播放高清精品| 欧美一区二区三区免费看| 欧美一级播放| 久久天天躁狠狠躁夜夜爽蜜月| 久久精品一本久久99精品| 久久久噜噜噜久久中文字幕色伊伊| 久久亚洲图片| 亚洲激情网址| 亚洲精品少妇网址| 亚洲视频网站在线观看| 午夜欧美理论片| 久久久久久久久岛国免费| 久久久久国产一区二区| 久久国产精品72免费观看| 久久亚洲影音av资源网| 久久久精彩视频| 欧美激情一区二区三区成人 | 亚洲国产日韩一区二区| 亚洲欧洲日产国产网站| 亚洲一品av免费观看| 久久激情视频免费观看| 欧美国产日韩免费| 亚洲一区欧美激情| 欧美凹凸一区二区三区视频| 国产精品国产一区二区| 精品福利电影| 亚洲欧美日韩国产成人| 经典三级久久| 亚洲一区高清| 亚洲第一精品影视| 欧美一级专区| 欧美午夜免费电影| 91久久综合| 久久蜜桃av一区精品变态类天堂| 亚洲韩国青草视频| 亚洲欧美日韩专区| 欧美日韩国产成人在线| 国产一区二区三区直播精品电影 | 狠狠色综合播放一区二区| 在线日韩视频| 欧美一区二区视频在线| 亚洲第一福利视频| 欧美一区二视频| 国产乱码精品一区二区三区av| avtt综合网| 亚洲日本免费| 欧美黄色大片网站| 在线精品视频一区二区| 久久久成人精品| 亚洲欧美精品在线观看| 日韩亚洲欧美综合| 美女图片一区二区| 国产女主播视频一区二区| 亚洲一区久久| 亚洲高清资源| 欧美国产日韩一区二区在线观看| 精品69视频一区二区三区| 欧美一级视频一区二区| 亚洲少妇自拍| 欧美小视频在线| 亚洲一区二区三区777| 亚洲高清电影| 久久天天躁夜夜躁狠狠躁2022| 国产一区二区三区四区三区四| 午夜精品电影| 亚洲欧美中日韩| 欧美一区二区福利在线| 美女视频黄a大片欧美| 欧美一区二区久久久| 国产精品久久久久久久久免费樱桃| 在线观看亚洲视频啊啊啊啊| 久久国产精品第一页| 亚洲一区二区三区免费在线观看| 国产精品video| 亚洲一区二区三区精品在线| 欧美激情偷拍| 欧美伦理视频网站| 亚洲调教视频在线观看| 亚洲综合三区| 国产一级揄自揄精品视频| 久久精品在这里| 久久久www成人免费毛片麻豆| 亚洲激情第一页| 亚洲社区在线观看| 国内视频一区| 最新日韩精品| 国产伦精品一区二区三区高清| 久久久久国产免费免费| 老司机免费视频一区二区三区 | 久久综合色影院| 99re8这里有精品热视频免费| 一本到12不卡视频在线dvd| 国产精品久久91| 巨乳诱惑日韩免费av| 欧美激情亚洲综合一区| 亚洲欧美怡红院| 蜜臀a∨国产成人精品| 亚洲一区影院| 久久青草欧美一区二区三区| 亚洲欧洲中文日韩久久av乱码| 一区二区激情| 亚洲国产网站| 欧美亚洲日本网站| 亚洲人成欧美中文字幕| 亚洲欧美清纯在线制服| 亚洲美女av电影| 亚洲欧美在线看| 亚洲性视频h| 玖玖玖免费嫩草在线影院一区| 亚洲午夜av在线| 两个人的视频www国产精品| 先锋影音久久久| 欧美屁股在线| 欧美国产日韩一区二区在线观看| 国产精品久久久久aaaa樱花| 亚洲福利专区| 最新日韩在线视频| 久久久精品日韩欧美| 亚洲欧美日韩爽爽影院| 欧美激情精品久久久久久| 久久综合给合久久狠狠色 | 夜夜爽www精品| 亚洲美女视频在线观看| 久久精品一区二区三区不卡| 欧美日韩一区二区视频在线| 欧美黄网免费在线观看| 尹人成人综合网| 久久av一区二区三区| 欧美一区二区女人| 国产精品久久影院| 亚洲视频一区二区| 亚洲图片欧美一区| 欧美日韩中文精品| 99riav国产精品| 亚洲一区二区三| 国产精品va在线播放我和闺蜜| 亚洲精品一区二区网址 | 99国产麻豆精品| 欧美国产日韩一二三区| 欧美激情在线免费观看| 亚洲国产精品电影| 久久亚洲不卡| 亚洲国产高清aⅴ视频| 亚洲人www| 欧美日本韩国一区二区三区| 亚洲精品一区二区三区不| 中文亚洲免费| 国产精品网站在线| 性欧美大战久久久久久久久| 欧美在线综合视频| 激情懂色av一区av二区av| 久久亚洲精品视频| 欧美激情网友自拍| 亚洲免费一级电影| 国内精品久久国产| 免费成人高清在线视频| 亚洲精品欧美精品| 性感少妇一区| 黄色资源网久久资源365| 老司机亚洲精品| 夜夜爽99久久国产综合精品女不卡| 亚洲男人第一网站| 国际精品欧美精品| 欧美激情亚洲自拍| 午夜精品三级视频福利| 欧美aaaaaaaa牛牛影院| 一区二区欧美精品| 国内成人在线| 欧美久久精品午夜青青大伊人| 亚洲午夜激情在线| 欧美成人精品| 亚洲欧美激情视频在线观看一区二区三区| 国产农村妇女毛片精品久久麻豆 | 亚洲九九精品| 国产日本欧美在线观看 | 国产一区免费视频| 欧美精品午夜视频| 欧美一区二区女人| 亚洲免费观看高清完整版在线观看熊| 欧美一区二区视频97| 日韩一区二区精品在线观看| 国产日韩视频| 欧美午夜一区二区福利视频| 蜜臀久久久99精品久久久久久| 亚洲性线免费观看视频成熟| 免费不卡在线观看av| 亚洲欧美视频在线观看| 亚洲精选久久| 91久久黄色| 免费人成网站在线观看欧美高清| 一区二区三区国产盗摄| 欧美国产日韩一区二区| 久久久久久久久综合| 亚洲网站在线观看| 亚洲美女精品成人在线视频| 亚洲大胆女人| 影音先锋成人资源站|