mysql資料庫基本操作(四)

彭方炎QAQ發表於2019-05-21

表紀錄操作

       同樣,表紀錄也有增刪改查的操作,但是一般我們大概70%的操作都是在查資料,所以查的操作需要單獨說清楚,先簡單看看增刪改。

表紀錄的增、刪、改

     1.增加一條紀錄的方式:

insertinto] 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放在後邊。查詢的方式可不止這些,下一篇繼續檢視錶單的其他方式。

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章