1. 程式人生 > >MySQL數據庫(3)_MySQL數據庫表記錄操作語句

MySQL數據庫(3)_MySQL數據庫表記錄操作語句

多條 信息 employ 例如 操作 ron span 進一步 group

附: MYSQL5.7版本sql_mode=only_full_group_by問題

1、查詢當前sql_mode:  select @@sql_mode

2、查詢出來的值為:

set @@sql_mode =ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;
3、修改sql_mode,重啟即可

set @@sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
; 4、上面是改變了全局sql_mode,對於新建的數據庫有效。如不重啟,對於已存在的數據庫,則需 set sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;

三、關於數據庫表記錄操作語句

增加表記錄:

<1>插入一條記錄:

  insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);
    示例:
      insert into employee_new (id,name,birthday,salary) values
                     (
1,yuan,1990-09-09,9000);   insert into employee_new values (2,alex,1989-08-08,3000);   insert into employee_new (name,salary) values (xialv,1000); <2>插入多條記錄:   insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......),                              (value1,value2,.......)                              ... ;     示例:     insert into employee_new values      (
4,alvin1,1993-04-20,3000),     (5,alvin2,1995-05-12,5000); <3>set插入:    insert [into] tab_name set 字段名=值     示例:insert into employee_new set id=12,name="alvin3";

修改表記錄

update tab_name set field1=value1,field2=value2,......[where 語句]

    /*      UPDATE語法可以用新值更新原有表行中的各列。
            SET子句指示要修改哪些列和要給予哪些值。
            WHERE子句指定應更新哪些行。如沒有WHERE子句,則更新所有的行。*/

    update employee_new set birthday="1989-10-24" WHERE id=1;

    --- 將yuan的薪水在原有基礎上增加1000元。
    update employee_new set salary=salary+4000 where name=yuan;

刪除表記錄

delete from tab_name [where ....]
            /*    
            如果不跟where語句則刪除整張表中的數據
            delete只能用來刪除一行記錄
            delete語句只能刪除表中的內容,不能刪除表本身,想要刪除表,用drop
            TRUNCATE TABLE也可以刪除表中的所有數據,詞語句首先摧毀表,再新建表。此種方式刪除的數據不能在
            事務中恢復。*/

   -- 刪除表中名稱為’alex’的記錄。
   delete from employee_new where name=alex;
   -- 刪除表中所有記錄。
   delete from employee_new;          -- 註意auto_increment沒有被重置:alter table employee auto_increment=1;
   -- 使用truncate刪除表中記錄。
   truncate table emp_new;    

刪除記錄delete、truncate、drop的區別:

<語法>
    delete from table_name;
    truncate table_name;
    drop table_name;
<執行過程> delete:DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中保存以便進行進行回滾操作 truncate:TRUNCATE一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日誌保存,刪除行是不能恢復的。並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。

<刪除範圍> delete 刪除表數據,即表記錄,保留表結構 truncate語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger),索引(index); 依賴於該表的存儲過程/函數將保留,但是變為invalid狀態 drop 刪除表結構和表數據,執行後表不存在

<表和索引所占空間> delete 執行後,表或索引所占空間還在,自增字段從原紀錄開始 truncate 執行後表和索引所占用的空間會恢復到初始大小,自增字段從新開始 drop語句將表所占用的空間全釋放掉

<刪除威力> drop > truncate > delete

<刪除速度> drop > truncate > delete 總結:小心使用drop 和truncate,尤其沒有備份的時候.否則《從刪庫到跑路》課程你修滿學分了! 使用上,想刪除部分數據行用delete,註意帶上where子句. 回滾段要足夠大 想保留表而將所有數據刪除. 如果和事務無關,用truncate即可. 如果和事務有關,或者想觸發trigger,還是用delete.

查詢表記錄(**重點**)

-- 查詢語法:

   SELECT *|field1,filed2 ...   FROM tab_name
                  WHERE 條件
                  GROUP BY field
                  HAVING 篩選
                  ORDER BY field
                  LIMIT 限制條數

/*
使用select 查詢時,盡量少用*,影響查詢速度
*/

準備工作:

---準備表

   CREATE TABLE ExamResult(

   id INT PRIMARY KEY  auto_increment,
   name VARCHAR (20),
   JS DOUBLE ,
   Django DOUBLE ,
   OpenStack DOUBLE
);

---插入數據
INSERT INTO ExamResult VALUES  (1,"yuan",98,98,98),
                               (2,"xialv",35,98,67),
                               (3,"alex",59,59,62),
                               (4,"wusir",88,89,82),
                               (5,"alvin",88,98,67),
                               (6,"yuan",86,100,55);

普通查詢:

-- (1select [distinct] *|field1,field2,......   from tab_name
            -- 其中from指定從哪張表篩選,*表示查找所有列,也可以指定一個列
            -- 表明確指定要查找的列,distinct用來剔除重復行。
            -- 查詢表中所有學生的信息。
                    select * from ExamResult;
             -- 查詢表中所有學生的姓名和對應的英語成績。
                    select name,JS from ExamResult;
             -- 過濾表中重復數據。
                    select distinct JS ,name from ExamResult;

-- (2select 也可以使用表達式,並且可以使用: 字段 as 別名或者:字段 別名
         -- 在所有學生分數上加10分特長分顯示。
                select name,JS+10,Django+10,OpenStack+10 from ExamResult;
          -- 統計每個學生的總分。
                select name,JS+Django+OpenStack from ExamResult;
          -- 使用別名表示學生總分。
                select name as 姓名,JS+Django+OpenStack as 總成績 from ExamResult;
                select name,JS+Django+OpenStack 總成績 from ExamResult;

使用where子句,進行過濾查詢

-- 查詢姓名為XXX的學生成績
            select * from ExamResult where name=yuan;
-- 查詢英語成績大於90分的同學
            select id,name,JS from ExamResult where JS>90;
-- 查詢總分大於200分的所有同學
            select name,JS+Django+OpenStack as 總成績 from
                        ExamResult where JS+Django+OpenStack>200 ;

- where字句中可以使用:
      -- 比較運算符:
               > < >= <= <> !=
                between 80 and 100 值在10到20之間
                in(80,90,100) 值是10或20或30
                like yuan%

 /*
pattern可以是%或者_,
如果是%則表示任意多字符,此例如唐僧,唐國強
如果是_則表示一個字符唐_,只有唐僧符合。兩個_則表示兩個字符:__
*/

-- 邏輯運算符
         在多個條件直接可以使用邏輯運算符 and or not

order by排序

指定排序的列,排序的列即可是表中的列名,也可以是select 語句後指定的別名。

        -- select *|field1,field2... from tab_name order by field [Asc|Desc]

        -- Asc 升序、Desc 降序,其中asc為默認值 ORDER BY 子句應位於SELECT語句的結尾。
              

        -- 對JS成績排序後輸出。
              select * from ExamResult order by JS;
         -- 對總分排序按從高到低的順序輸出
              select name ,(ifnull(JS,0)+ifnull(Django,0)+ifnull(Database,0))
                   總成績 from ExamResult order by 總成績 desc;
          -- 對姓李的學生成績排序輸出
              select name ,(ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0))
                   總成績 from ExamResult where name like a%
                                         order by 總成績 desc;

group by分組查詢

準備表和記錄

CREATE TABLE order_menu(
             id INT PRIMARY KEY auto_increment,
             product_name VARCHAR (20),
             price FLOAT(6,2),
             born_date DATE,
             class VARCHAR (20)
                                );


INSERT INTO order_menu (product_name,price,born_date,class) VALUES
                                             ("蘋果",20,20170612,"水果"),
                                             ("香蕉",80,20170602,"水果"),
                                             ("水壺",120,20170612,"電器"),
                                             ("被罩",70,20170612,"床上用品"),
                                             ("音響",420,20170612,"電器"),
                                             ("床單",55,20170612,"床上用品"),
                                             ("草莓",34,20170612,"水果");

-- 註意,按分組條件分組後每一組只會顯示第一條記錄

         -- group by字句,其後可以接多個列名,也可以跟having子句,對group by 的結果進行篩選。

                    -- 按位置字段篩選
                       select * from order_menu group by 5;

                    -- 練習:對購物表按類名分組後顯示每一組商品的價格總和
                       select class,SUM(price)from order_menu group by class;

                    -- 練習:對購物表按類名分組後顯示每一組商品價格總和超過150的商品
                       select class,SUM(price)from order_menu group by class
                                                        HAVING SUM(price)>150;



                   /*
                   having 和 where兩者都可以對查詢結果進行進一步的過濾,差別有:
                     <1>where語句只能用在分組之前的篩選,having可以用在分組之後的篩選;
                     <2>使用where語句的地方都可以用having進行替換
                     <3>having中可以用聚合函數,where中就不行。
                   */


            -- GROUP_CONCAT() 函數
            SELECT id,GROUP_CONCAT(name),GROUP_CONCAT(JS) from ExamResult GROUP BY id;

聚合函數

--<1> 統計表中所有記錄

            -- COUNT(列名):統計行的個數
                    -- 統計一個班級共有多少學生?先查出所有的學生,再用count包上
                     select count(*) from ExamResult;
                    -- 統計JS成績大於70的學生有多少個?
                     select count(JS) from ExamResult where JS>70;
                    -- 統計總分大於280的人數有多少?
                     select count(name) from ExamResult
                           where (ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0))>280;
                    -- 註意:count(*)統計所有行;     count(字段)不統計null值.

            -- SUM(列名):統計滿足條件的行的內容和
                    -- 統計一個班級JS總成績?先查出所有的JS成績,再用sum包上
                        select JS as JS總成績 from ExamResult;
                        select sum(JS) as JS總成績 from ExamResult;
                    -- 統計一個班級各科分別的總成績
                        select sum(JS) as JS總成績,
                               sum(Django) as Django總成績,
                               sum(OpenStack) as OpenStack from ExamResult;

                    -- 統計一個班級各科的成績總和
                        select sum(ifnull(JS,0)+ifnull(Django,0)+ifnull(Database,0))
                                                    as 總成績 from ExamResult;
                    -- 統計一個班級JS成績平均分
                        select sum(JS)/count(*) from ExamResult ;
                    -- 註意:sum僅對數值起作用,否則會報錯。

            -- AVG(列名):
                            -- 求一個班級JS平均分?先查出所有的JS分,然後用avg包上。
                                select avg(ifnull(JS,0)) from ExamResult;
                            -- 求一個班級總分平均分
                                select avg((ifnull(JS,0)+ifnull(Django,0)+ifnull(Database,0)))
                                                         from ExamResult ;
            -- Max、Min
                            -- 求班級最高分和最低分(數值範圍在統計中特別有用)
                              select Max((ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0)))
                              最高分 from ExamResult;
                              select Min((ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0)))
                              最低分 from ExamResult;
                            -- 求購物表中單價最高的商品名稱及價格
                              ---SELECT id, MAX(price) FROM order_menu;--id和最高價商品是一個商品嗎?
                              
                              SELECT MAX(price) FROM order_menu; 

                            -- 註意:null 和所有的數計算都是null,所以需要用ifnull將null轉換為0!
                            --      -----ifnull(JS,0)

limit記錄條數限制

 SELECT * from ExamResult limit 1;
 SELECT * from ExamResult limit 2,5;        --  跳過前兩條顯示接下來的五條紀錄
 SELECT * from ExamResult limit 2,2;

正則表達式

SELECT * FROM employee WHERE emp_name REGEXP ^yu;

SELECT * FROM employee WHERE emp_name REGEXP yun$;

SELECT * FROM employee WHERE emp_name REGEXP 

MySQL數據庫(3)_MySQL數據庫表記錄操作語句