1. 程式人生 > >數據庫 MySQL part2

數據庫 MySQL part2

最大 val birt 註意 重復 rom arc log 插入

表記錄的操作

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 (id,name,birthday,salary) values
         (4,‘alvin1‘,‘1993-04-20‘,3000),
         (5,‘alvin2‘,‘1995-05-12‘,5000);

3、按值插入

語法:insert [into] tab_name set 字段名=值

insert into employee_new set id=12,name="alvin3";

語法:delete from tab_name [where ....]

如果不跟where語句則刪除整張表中的數據

delete只能用來刪除一行記錄

delete語句只能刪除表中的內容,不能刪除表本身,想要刪除表,用drop

TRUNCATE TABLE也可以刪除表中的所有數據,詞語句首先摧毀表,再新建表。此種方式刪除的數據不能在事務中恢復。

1、刪除所有記錄

delete from tab_name
truncate table tab_name  #推薦

註:auto_increment沒有被重置,清空表記錄後使用命令:alter table tab_name auto_increment=1重置表的自動遞增

2、刪除指定記錄

#刪除表中名稱為’alex’的記錄。
delete from employee_new where name=‘alex‘;

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

UPDATE語法可以用新值更新原有表行中的各列。

SET子句指示要修改哪些列和要給予哪些值。

WHERE子句指定應更新哪些行。如沒有WHERE子句,則更新所有的行。

#id為1的記錄生日改成1989-10-24
update employee_new set birthday="1989-10-24" WHERE id=1;
#將yuan的薪水在原有基礎上增加1000元。
update employee_new set salary=salary+4000 where name=‘yuan‘;

查(重點)

語法:

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、簡單查詢

#select [distinct] *|field1,field2,......   from tab_name
#其中from指定從哪張表篩選,*表示查找所有列,也可以指定一個列
#表明確指定要查找的列,distinct用來剔除重復行。

-- 查詢表中所有學生的信息。
select * from ExamResult;
-- 查詢表中所有學生的姓名和對應的英語成績。
select name,JS from ExamResult;
-- 過濾表中重復數據。
select distinct JS ,name from ExamResult;


#select 也可以使用表達式,並且可以使用: 字段 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;

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到1000之間
              in(80,90,100) 值是80或90或1000
              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;

註:ifnull當輸出的結果有NULL時候,用0補全,也可以是其他數據,如字符串

4、group by子句:分組顯示

準備表記錄

#創建表
CREATE TABLE shopping (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    product_name VARCHAR(20), 
    price FLOAT(6, 2), 
    born_date DATE, 
    class VARCHAR(20)
);


#插入表記錄
INSERT INTO shopping (product_name, price, born_date, class)
VALUES (‘蘋果‘, 20, 20170612, ‘水果‘),
    (‘香蕉‘, 80, 20170112, ‘水果‘),
    (‘冰箱‘, 1200, 20170112, ‘電器‘),
    (‘被罩‘, 70, 20170612, ‘床上用品‘),
    (‘音響‘, 420, 20170612, ‘電器‘),
    (‘電腦‘, 4200, 20170112, ‘電器‘),
    (‘桃子‘, 50, 20170112, ‘水果‘),
    (‘床單‘, 55, 20170112, ‘床上用品‘),
    (‘草莓‘, 34, 20170612, ‘水果‘);

示例

#註,按分組條件分組後每一組只會顯示第一條記錄
#group by字句,其後可以接多個列名,也可以跟having子句,對group by 的結果進行篩選。

-- 按位置字段篩選,第五個字段class分組
select * from shopping group by 5;

-- 對購物表按類名分組後顯示每一組商品的價格總和(SUM是聚合函數)
select class,SUM(price)from shopping group by class;

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


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


-- GROUP_CONCAT() 函數:自己看結果
SELECT id,GROUP_CONCAT(product_name),GROUP_CONCAT(price) from shopping GROUP BY id;

5、聚合函數

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 part2