數據庫:MySQL(單表的表記錄的操作)(二)
阿新 • • 發佈:2017-07-25
基礎上 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、簡單查詢
-- (1)select [distinct] *|field1,field2,...... from tab_name -- 其中from指定從哪張表篩選,*表示查找所有列,也可以指定一個列 -- 表明確指定要查找的列,distinct用來剔除重復行。 -- 查詢表中所有學生的信息。 select * from ExamResult; -- 查詢表中所有學生的姓名和對應的英語成績。 select name,JS from ExamResult; -- 過濾表中重復數據。 select distinct JS ,name from ExamResult; -- (2)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; 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(單表的表記錄的操作)(二)