1. 程式人生 > >高級數據操作(上)

高級數據操作(上)

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;

高級數據操作(上)