mysql資料庫基本操作(四)
表紀錄操作
同樣,表紀錄也有增刪改查的操作,但是一般我們大概70%的操作都是在查資料,所以查的操作需要單獨說清楚,先簡單看看增刪改。
表紀錄的增、刪、改
1.增加一條紀錄的方式:
insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);
上一篇我們已經建立了一張員工表,現在簡單一點,就留下名字和年齡資訊,重新重建一張員工表:
create table emp_new( id int primary key auto_increment, name varchar(20) not null unique, birth varchar(20), salary float(7,2) );
建立好之後,我們開始增加資料,增加資料的方式有很多:
單條插入:
insert into emp_new (id,name,birth,salary) values (1,'pengfy','1993-01-01',20000); insert into emp_new values (2,'pyq','1992-12-12',10000); insert into emp_new(name,salary) values ('xiaojiang',3000);
單條插入的時候,我們可以和鍵一一對應的寫進去,也可以不寫鍵名(預設全部鍵)直接插入對應順序的值,也可以指定鍵名寫入對應的值,這裡id設為自增,不用填寫也會自己增加。
多條插入:
insert into emp_new values (4,'pyq1','1992-06-20',8000), (5,'pyq2','1994-06-20',9000);
現在我們已經插入了五條資料,可以通過select * from emp_new先看看有沒有插入成功:
2.修改一條表紀錄:
修改表記錄 update tab_name set field1=value1,field2=value2,......[where 語句] /* UPDATE語法可以用新值更新原有錶行中的各列。 SET子句指示要修改哪些列和要給予哪些值。 WHERE子句指定應更新哪些行。如沒有WHERE子句,則更新所有的行。*/
現在發現pyq的生日寫錯了,就可以通過where單獨修改pyq的生日,pengfy 的工資也太低了,老闆加了6000工資:
update emp_new set barth='1992-9-11'where id=2; #修改pyq的生日 update emp_new set salary=26000 where name='pengfy'; #修改pengfy的工資
現在看看有沒有修改成功:
其實用set也可以增加一條紀錄:
insert into emp_new set id=12,name="pyq3",salary=8800;
3.刪除一條表紀錄
delete from tab_name [where ....] /* 如果不跟where語句則刪除整張表中的資料 delete只能用來刪除一行記錄 delete語句只能刪除表中的內容,不能刪除表本身,想要刪除表,用drop TRUNCATE TABLE也可以刪除表中的所有資料,詞語句首先摧毀表,再新建表。此種方式刪除的資料不能在 事務中恢復。*/
刪除表紀錄也很簡單,按照條件刪除就行了:
我們先把最後set增加的名字為pyq3的刪除掉:
delete from emp_new where name='pyq3';
也可以刪除表中所有紀錄,刪除表中所有紀錄有兩種方法:
-- 刪除表中所有記錄。 delete from emp_new; -- 使用truncate刪除表中記錄。 truncate table emp_new;
那這二者的區別在哪裡?一起看一下:
兩份表的資料完全一樣,唯一的區別在於delete刪除是一條一條刪除的,所以在第一張圖裡面可以看到5行被影響(5 rows affected,而truncate在刪除的時候,是直接把整個表刪除後再重新建一張名字一樣的空表,所以在資料很大的時候,我們用右邊的truncate去做刪除表的動作,時間會更短。還有一點需要注意的是:之前設定id裡的auto_increment沒有被重置:alter table employee auto_increment=1;所以表中如果有資料三條,id分別為1,2,3,突然插入一個id=7,那麼下次作為主鍵的字增長的id會從7開始增加。
表紀錄之查(單表查詢)
表查詢表示式
SELECT *|field1,filed2 ... FROM tab_name WHERE 條件 GROUP BY field HAVING 篩選 ORDER BY field LIMIT 限制條數
我們重新建立一張表,是一張學校的成績單,然後輸入一些資料,有一個好習慣就是把sql命令都寫成大寫的,雖然sql不區分大小寫,但這樣可讀性更強。
CREATE TABLE Result( id INT PRIMARY KEY auto_increment, name VARCHAR (20), Chinese DOUBLE , English DOUBLE , Math DOUBLE ); INSERT INTO Result VALUES (1,"pengfy",100,99,98), (2,"pyq",80,95,80), (3,"xiaojiang",43,59,22), (4,"pyq2",80,86,82), (5,"pyq3",82,90,90);
表單建立好之後,我們就開始查詢了:
1.普通方式查詢
select [distinct] *|field1,field2,...... from tab_name -- 其中from指定從哪張表篩選,*表示查詢所有列,也可以指定一個列 -- 表明確指定要查詢的列,distinct用來剔除重複行。
我們上面再增刪改裡面也說過一條select * from table_name,就是查詢表中所有資訊,就不用演示了。現在我們來查詢所有學生的姓名和對應的英語成績:
select name,english from result;
從圖片看到,只顯示了我們需要的名字和英語成績,而且表頭的名字大小寫也和我們select命令中的顯示一致。接下來我們再試一下過濾功能,我們插入兩行和pengfy一樣的內容,然後過濾一下:
insert into result values (6,'pengfy',100,99,98), (7,'pengfy',100,99,98);
select distinct chinese,name from result;
上面演示的是過濾掉了語文成績和名字一樣的資訊,如果單獨過濾語文成績不一樣的,那麼80也會只保留從上往下的第一個,可以試一試。
2.表示式查詢
select 也可以使用表示式,並且可以使用: 欄位 as 別名或者:欄位 別名
現在我要給每個學生的成績加上10分,就可以這樣寫:
select name,chinese+10,english+10,math+10 from result;
要注意的是,這僅僅是顯示的給我們看的時候加上了10分,實際的成績是沒有變的,我們檢視實際成績還是select * from result。我們再看看學生的總分:
select name,chinese+english+math from result;
根據表示式所說的,我們可以使用別名來顯示,比如我把name和chinese+english+math顯示成中文:
select name as 姓名,chinese+english+math as 總成績 from result;
再次強調,我們改變的是我們檢視的方式,並沒有影響資料本身,否則那就不要檢視,叫修改嘍。還有需要注意的是記得在查詢不容的內容之間加上逗號,你可以試試不加逗號是怎樣的。
3.使用where子句,進行過濾查詢
我們在修改表紀錄的時候也簡單使用了where子句,那這裡同樣可以,首先我們查一下名字是pengfy 的成績:
select * from result where name='pengfy';
這就把名字為pengfy的成績全找到了,當然,我們使用id或者成績也可以找到,比如where Chinese=100,因為只有pengfy是10嘛,但我還是習慣用name,因為條件是找名字是pengfy的資訊。除了這種,我們還可以做判斷,比如找到英語成績大於90分的人:
select name,english from result where english>90;
也可以配合上面的表示式使用, 比如找到總分大於260分的人,只顯示名字和總分:
select name,chinese+english+math from result where chinese+english+math>260;
這時候你可能有疑問,為什麼不把chinese+english+math換一個別名,然後where就不用寫那麼長一大串了,先告訴你這樣會報錯的,具體為什麼,就是執行的優先順序問題,後面再講。除了這些,在where中還可以使用這些:
比較運算子: > < >= <= <> != between 80 and 100 值在10到20之間 in(80,90,100) 值是10或20或30 like 'pengfy%' /* pattern可以是%或者_, 如果是%則表示任意多字元,此例如唐僧,唐國強 如果是_則表示一個字元唐_,只有唐僧符合。兩個_則表示兩個字元:__ */ 邏輯運算子 在多個條件直接可以使用邏輯運算子 and or not
這裡可能有點問題的是like,這裡就舉一個例子,現在要找到名字是p開頭的所有資訊:
select * from result where name like 'p%';
這裡可以看到%可以代表任意長度的字元,但如果你要定長的字元,就要使用下劃線_,比如要查詢名字p開頭且4個位元組的所有資訊:
select * from result where name like 'p___';
看著這個下劃線有點長,其實是三個,一個就代表一個字元,加上p就一共4個字元。
4.Order by 指定排序的列
Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 語句後指定的別名。 -- select *|field1,field2... from tab_name order by field [Asc|Desc] -- Asc 升序、Desc 降序,其中asc為預設值 ORDER BY 子句應位於SELECT語句的結尾。
除了上面的操作,我們在現實中遇到的情況也有很多是排序顯示的,現在我們按語文成績排序來顯示:
select * from result order by chinese;
可以看到預設的是從小到大來顯示的,如果要從大到小,只需要在最後加上一個desc即可:
select * from result order by chinese desc;
我們再按總成績排個名看看,在這之前先加入一個插班生lily,Lily這個時候還沒有考試,所以還沒有成績:
insert into result (id,name) values (8,'lily'); select name,chinese+english+math as 總成績 from result order by 總成績 desc;
細心的朋友就發現了,怎麼這裡就可以弄個別名放在order後面用呢,where確不可以,還是優先順序的事。不過這裡先看一個問題,Lily是沒有成績的,但成績應該是一個數字,放一個null算怎麼回事,怎麼辦?在排序前先做一個判斷,看是不是空,是空就變為0:
select name,(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) as 總成績 from result order by 總成績 desc;
這還沒完,如果我只要名字p開頭的總成績排名怎麼辦?怎麼放置where和order呢?
select name,(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) as 總成績 -> from result where name like 'p%' -> order by 總成績 desc;
搞定了,order放在後邊。查詢的方式可不止這些,下一篇繼續查看錶單的其他方式。
&n