1. 程式人生 > >數據庫:MySQL(單表的表記錄的操作)(二)

數據庫:MySQL(單表的表記錄的操作)(二)

基礎上 des 別名 order by data database values 生成 結果

一、表記錄的增刪改查

1、增加表記錄

<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 int
o employee_new
set id=12,name="alvin3";

2、修改表記錄

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;

3、刪除表記錄

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;

二、查詢表記錄

-- 查詢語法:

   SELECT *|field1,filed2 ...   FROM tab_name
                  WHERE 條件
                  GROUP BY field
                  HAVING 篩選
                  ORDER BY field
                  LIMIT 限制條數
技術分享
---準備表

   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);
準備表和記錄

1、簡單查詢

-- (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;

                select name JS from ExamResult; -- what will happen?---->記得加逗號

2、使用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 值在80到100之間
                      in(80,90,100) 值是80或90或100
                      like yuan%
                      /*
                      pattern可以是%或者_,
                      如果是%則表示任意多字符,此例如唐僧,唐國強
                      如果是_則表示一個字符唐_,只有唐僧符合。兩個_則表示兩個字符:__
                      */
                    -- 邏輯運算符
                        在多個條件直接可以使用邏輯運算符 and or not

3、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;

4、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;

5、聚合函數

--<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)

6、limit記錄條數限制

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

7、正則表達式

SELECT * FROM employee WHERE emp_name REGEXP ^yu;

SELECT * FROM employee WHERE emp_name REGEXP yun$;

SELECT * FROM employee WHERE emp_name REGEXP m{2};

數據庫:MySQL(單表的表記錄的操作)(二)