高級數據操作(上)
阿新 • • 發佈:2017-09-03
ack var 學生 _id 建議 des 完全 asc 場景
數據的操作也叫做CRUD
C:Create
R:Read
U:Update
D:Delete
一.插入數據
標準語法:
1 insert into 表名[字段列表] values(值列表);
思考:
1,如何以最快的速度向數據表中插入100萬條數據?
(1)蠕蟲復制
含義:在已有的數據的基礎之上,將原來的數據進行復制,插入到對應的表中(也可以插入到自己的表中);
1 -- 蠕蟲復制 2 insert into 表名 select *|字段列表 from 表名; 3 4 create table ruchong1( 5 a int, 6 b int 7 ); 8 9 10 insert into ruchong1 values(12,23),(9,18),(34,56),(13,35); 11 12 create table ruchong2( 13 a int , 14 b int 15 ); 16 17 insert into ruchong2 select * from ruchong1; --重復插入10多次就行了
作用:
1, 以最快的速度將一張表的數據復制到另一張表中,前提是後面查詢結果的結構與前面插入數據表的結構是一樣的!
2, 短期內產生大量的數據,以測試服務器的壓力!
(2)主鍵重復
常見的一個場景:
在進行數據插入的時候,主鍵已經存在,但是又需要將最新的數據更新到記錄中,怎麽辦?
比如,更新手機號碼的機主信息:
1 create table tel_info( 2 tel_no char(11) primary key, 3 tel_name varchar(20), 4 tel_id char(18) 5 ); 6 7 insert into tel_info values(‘13612345678‘,‘張三‘,‘440921199411080845‘); 8 insert into tel_info values(‘13612345678‘,‘李四‘,‘440921199411080883‘);-- 出錯了
此時,有兩種解決方案:
1 -- 方案一: 2 -- 如果主鍵沖突,直接更新: 3 insert into 表名(字段列表) values(值列表) on duplicate key update 字段1=值1,字段2=值2...; 4 5 -- 執行流程:先執行插入語句,如果遇到主鍵重復,就變成執行一條更新語句。 6 7 insert into tel_info values(‘13612345678‘,‘李四‘,‘440921199411080883‘) on duplicate key update tel_name = ‘李四‘,tel_id=‘440921199411080883‘; 8 -- 方案二: 9 -- 如果主鍵沖突,就直接刪除原記錄,再插入 10 replace into 表名(字段列表) values(值列表); 11 12 replace into tel_info values(‘13612345678‘,‘張三‘,‘440921199411080845‘); 13 14 --執行流程:先判斷主鍵有沒有重復,如果沒有,就執行正常的插入語句,如果有就先執行刪除之前的再插入新的! 15
二.修改數據
1 -- 修改數據: 2 -- 標準語法: 3 4 update 表名 set 字段1 = 值1, 字段2 = 值2..where 條件; 5 6 7 -- 其他語法: 8 update 表名 set 段1 = 值1, 字段2 = 值2..where 條件 order by 字段名[asc|desc] limit 數據量; 9 -- asc是升序 默認值 10 -- desc 是降序 11 create table user_info( 12 user_id int unsigned primary key auto_increment, 13 user_name varchar(20), 14 user_tel char(11), 15 is_vip enum(‘Y‘,‘N‘), 16 last_buy_time int unsigned, 17 user_score int unsigned 18 ); 19 20 -- 應用場景:商家做活動,給前最先到的100名的vip用戶的積分增加500分! 21 22 update user_info set user_score = user_score + 500 where is_vip=‘Y‘ order by last_buy_time asc limit 100 23 24 /* 也就是說,修改數據的時候可以使用order by關鍵字進行排序然後再限制修改的數量! 25 註意:where修改條件、order by子句以及limit子句的順序不能發生改變! 26 27 同樣的,刪除數據的時候也可以加上order by子句和limit子句: 28 */
三.刪除數據
1 -- 標準語法: 2 delete from 表名 where 刪除條件 3 4 -- 其他語法: 5 delete from 表名 where 刪除條件 order by 字段名[asc|desc] limit 數量;
四.查詢數據
1 -- 查詢數據是業務邏輯中使用的最多的也是最復雜的! 2 -- 以前的語法: 3 select *|字段列表 from 表名 where 查詢條件; 4 -- 比較完整的語法: 5 6 7 select [select選項] *|字段列表 [as 別名] from 數據源 [where子句] [group by子句][having子句][order by子句][limit子句]; 8 9 /* 10 註意: 11 1, from後面的子句往往叫做五子查詢,也叫做五子句 12 2, 五子查詢的選項都可以沒有,但是如果有,必須按順序寫! 13 */
五.select選項與別名
(1)select選項
1 /* 2 就是查詢到數據之後,該如何保留查詢結果! 3 一共有兩個值: 4 all:也是默認值,保留所有的查詢結果! 5 distinct:去重,去掉重復的記錄,這裏的重復是指所有的字段的值完全一樣! 6 7 一般來說,如果查詢的是所有的字段,用缺省值(省略即可)就行, 8 如果查詢的是部分字段,可以進行去重操作! 9 */ 10 11 insert into ruchong2 values(23,24),(35,36),(10,35);
1 select b from ruchong2;
1 select distinct b from ruchong2; -- 去重
(2)別名
1 -- 所謂的別名就是給字段或者其他表達式等標識符起一個別名.基本語法: 2 -- 別名 3 字段名|表達式|表|子查詢語句[as] 別名 4 -- 其中as可以省略,但是建議寫上
1, 為什麽給字段起別名呢?
因為在進行聯表查詢的時候,兩張表可能會出現相同的字段名:
比如上面的學生表中的學生字段和成績表中的學生字段!這樣將來PHP在提取記錄的時候,後面的數組元素會覆蓋前面的(下標值是一樣的),所以,有必須給她們兩個中至少一個起一個別名!
2,為什麽要給表達式起別名?
1 create table score( 2 chinese float, 3 Math float, 4 English float, 5 PHP float 6 ); 7 8 insert into score values 9 (78.5,89,76,93), 10 (77,69,70,98), 11 (76.5,79,96,90), 12 (75.5,99,96,93); 13 14 select Chinese+Math+English+PHP from score;
1 select Chinese+Math+English+PHP as sum from score;
高級數據操作(上)