mysql數據庫第二彈
mysql數據庫針對表的操作
表記錄的增刪改查
1.增加一張表
插入記錄之前必須得先有表結構!
CREATE TABLE score(
id int PRIMARY KEY auto_increment,
name VARCHAR (20),
chinese FLOAT(4,2),
Math FLOAT(4,2),
English FLOAT(4,2)
)
----插入表記錄
-- 插入一條數據 insert
INSERT [INTO] table_name (字段名稱,...) VALUES (值....);
-- 插入多條數據
INSERT [INTO] table_name (字段名稱,...) VALUES (值....), #INTO 為
(值....),
....
(值....);
INSERT INTO score(name,chinese,Math,English) VALUES
(‘李雷‘,95.5,90.5,50.5),
(‘李二蛋‘,90,66.5,45),
(‘李二狗‘,95.5,77.5,86),
(‘李小虎‘,50.5,65.5,85),
(‘李小紅‘,85.5,75.5,75),
(‘李建‘,65.5,88.5,88),
(‘李文采‘,43.5,75.5,99),
(‘馬冬梅‘,88.5,60.5,88);
insert [into] tab_name set 字段名=值 ;這也是一種插入記錄的方式不過比較笨拙!
--修改表記錄
update tab_name set field1=value1,field2=value2,......[where 語句]
/* UPDATE語法可以用新值更新原有表行中的各列。
SET子句指示要修改哪些列和要給予哪些值。
WHERE子句指定應更新哪些行。如沒有WHERE子句,則更新所有的行。*/
--刪除表記錄
delete from tab_name [where ....]
/*
如果不跟where語句則刪除整張表中的數據
delete只能用來刪除一行記錄
delete語句只能刪除表中的內容,不能刪除表本身,想要刪除表,用drop
TRUNCATE TABLE也可以刪除表中的所有數據,詞語句首先摧毀表,再新建表。此種方式刪除的數據不能在
事務中恢復。*/
delete from score where name=‘李雷‘;#刪除李雷的這條記錄。
delete from score;#刪除表內所有記錄
-- 使用truncate刪除表中記錄。
truncate from score;同樣的刪除表中的記錄,不過這種方式是先刪除整張表(包括表結構)之後再重建相同的表機構。這種方式比較快針對數據量大的表效果顯著!
------查詢表記錄
在數據庫操作當中,查詢表記錄是我們通常要做的操作並且查詢的條件方法需要根據不同的需求實現,所以比較重要。
-- 查詢語法:
SELECT *|field1,filed2 ... FROM tab_name
WHERE 條件
GROUP BY field
HAVING 篩選
ORDER BY field
LIMIT 限制條數
-- (1)select [distinct] *|field1,field2,...... from tab_name
-- 其中from指定從哪張表篩選,*表示查找所有列,也可以指定一個列
-- 表明確指定要查找的列,distinct用來剔除重復行。
例:select * from score; 查詢這張score表的所有表記錄!
-- 查詢表中所有學生的姓名和對應的英語成績。
select name,English from score;
-- 過濾表中重復數據。
select distinct English ,name from score;
-- (1) 查詢所有學生的數學成績和總成績
select name 學生姓名,Math 數學成績,chinese+Math+English 總成績 from score;
-- (2) 查詢所有學生的語文和數學成績和,按從高到低排序
select name 學生姓名,chinese+Math 語文和數學成績之和 from score order by chinese+Math desc;
--(3) 查詢班級總成績最高的學生姓名
select name,(ifnull(chinese,0)+ifnull(Math,0)+ifnull(English,0))
總成績 from score order by 總成績 desc limit 1;
------where子句的強大之處:
-- 查詢姓名為XXX的學生成績
select * from score where name=‘李雷‘;
-- 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語句的結尾。
例:查詢班級總成績最高的學生姓名
select name,(ifnull(chinese,0)+ifnull(Math,0)+ifnull(English,0))
總成績 from score order by 總成績 desc limit 1;
---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‘;#查詢以yu開頭的數據
SELECT * FROM employee WHERE emp_name REGEXP ‘yun$‘;#查詢以yun結尾的數據
SELECT * FROM employee WHERE emp_name REGEXP ‘m{2}‘;查詢符合兩個m的數據。
mysql數據庫第二彈