表A
ID | NAME | AGE | SEX | BOOK |
1 | 小丑1 | 12 | 男 | 數據結構 |
2 | 小丑2 | 22 | 女 | 人工智能 |
表B
ID | AGE | SEX | COMPUTER |
1 | 00 | applet | |
2 | 00 | thinkpad |
根據表A更新表B中的AGB 和SEX
SQL:
1 update B b 2 set (AGB,SEX) 3 =(select AGB,SEX from A a 4 where a.ID=b.ID and COMPUTER='applet') 5 where exists 6 (select 1 from A a 7 where a.ID=b.ID and COMPUTER='applet') and NAME like '小丑%‘ ;
說明:
工作中涉及到了這種需求(關聯表更新),所謂關聯表更新就是在更新一張數據庫表時,需要另外一張表的數據。那么怎樣把數據庫表中數據更新到另外一張上呢?
這就涉及到了數據表關聯。要想把兩張表關聯到一起就需要找到這兩張表的相同屬性。就像一對情侶,兩個人稱得上是情侶,那肯定有很多共同點,甚至連性別都是一樣的(開個玩笑)。
下面說明一下這條sql 語句的意思,首先update 是更新,據我目前看來update 后面只許放一張表,也就是說update 只能更新一張表。這是重點,我之前還想着同時更新兩張表,這是不可能的。
set 就沒必要解釋了,set 后面括號里可以加入任意個數據庫字段。where a.ID=b.ID 這是這句sql 語句的核心,用A表中的ID 與B表中的ID進行關聯。同時被關聯表A 也可以加入自己的where 條件。3至4行的整體意思是從被關聯表A中查找AGB,SEX字段更新到表B中。
where exists 要細致的說明一下:
(select 1 from A a where a.ID=b.ID and COMPUTER='applet')
where exists 后面必須加括號 ,這句sql 語句的意思是 篩選出 符合a.ID=b.ID and COMPUTER='applet' 的所有A中的字段值。A中ID 也可關聯B中別的屬性,這是不受限制的。
有時候不希望把B 中所有符合a.ID=b.ID and COMPUTER='applet' 條件的(AGB,SEX)全部更新,你也可以在后面加上B表的屬性條件。比如上述的 Name like '小丑%’。
這句sql 的整體意思是符合在A中ID 等於B中ID 並且 COMOUTER等於‘applet'的AGB,SEX更新到符合 B表中 NAME 前兩個字節為小丑的(AGB,SEX)字段。
另外 where exists 另一作用是 增加程序的運行效率。where exists 是個標記函數,他只返回兩個值,是或者不是,是為1,不是為0,。當返回為0時,就直接結束sql ,不會再運行上邊的select 子查詢。