MySQL之基礎功能
一.檢視
檢視:是一個虛擬表,其內容由查詢定義。同真實的表一樣,檢視包含一系列帶有名稱的列和行資料
檢視有如下特點:
1. 檢視的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關係。
2. 檢視是由基本表(實表)產生的表(虛表)。
3. 檢視的建立和刪除不影響基本表。
4. 對檢視內容的更新(新增、刪除和修改)直接影響基本表。
5. 當檢視來自多個基本表時,不允許新增和刪除資料。
1.建立檢視
1 |
create view
檢視名稱
as
sql 查詢語句
|
2.使用檢視
1 |
select
*
from
檢視名稱;
|
3.更新檢視
1 |
alter
view
檢視名稱
AS
SQL查詢語句
|
4. 刪除檢視
1 |
drop
view
檢視名稱;
|
2.觸發器-trigger
觸發器:監視某種情況,並觸發某種操作。
觸發器建立語法四要素:1.監視地點(table)
2.監視事件(insert/update/delete)
3.觸發時間(after/before)
4.觸發事件(insert/update/delete)
1.建立觸發器語法
1 2 3 4 5 6 7 |
create
trigger
triggerName
after
/before
insert
/
update
/
delete
on
表名
for
each row #這句話是固定的
begin
#需要執行的sql語句
end
注意1:
after
/before: 只能選一個 ,
after
表示 後置觸發, before 表示前置觸發
注意2:
insert
/
update
/
delete
:只能選一個
|
建立兩張表
#商品表 create table goods( id int primary key auto_increment, name varchar(20), num int ); |
#訂單表 create table order_table( oid int primary key auto_increment, gid int, much int ); |
新增3條商品資料
1 |
insert
into
goods(
name
,num)
values
(
'商品1'
,10),(
'商品2'
,10),(
'商品3'
,10);
|
如果我們在沒使用觸發器之前:假設我們現在賣了3個商品1,我們需要做兩件事
1.往訂單表插入一條記錄
1 |
insert
into
order_table(gid,much)
values
(1,3);
|
2.更新商品表商品1的剩餘數量
1 |
update
goods
set
num=num-3
where
id=1;
|
現在,我們來建立一個觸發器:
1 2 3 4 5 |
create
trigger
tg1
after
insert
on
order_table
for
each row
begin
update
goods
set
num = num -3
where
id = 1;
end
|
這時候我們只要執行:
1 |
insert
into
order_table(gid,much)
values
(1,3);
|
會發現商品1的數量變為7了,說明在我們插入一條訂單的時候,
觸發器自動幫我們做了更新操作。
但現在會有一個問題,因為我們觸發器裡面num和id都是寫死的,所以不管我們買哪個商品,最終更新的都是商品1的數量。比如:我們往訂單表再插入一條記錄:
1 |
insert
into
order_table(gid,much)
values
(2,3);
|
執行完後會發現商品1的數量變4了,而商品2的數量沒變,這樣顯然不是我們想要的結果。我們需要改改我們之前建立的觸發器。
我們如何在觸發器引用行的值,也就是說我們要得到我們新插入的訂單記錄中的gid或much的值。
對於insert而言,新插入的行用new來表示,行中的每一列的值用new.列名來表示。
所以現在我們可以這樣來改我們的觸發器:
1 2 3 4 5 |
create
trigger
tg2
after
insert
on
order_table
for
each row
begin
update
goods
set
num = num-new.much
where
id = new.gid;
end
|
第二個觸發器建立完畢,我們先把第一個觸發器刪掉
1 |
drop
trigger
tg1;
|
再來測試一下,插入一條訂單記錄:
1 |
insert
into
order_table(gid,much)
values
(2,3)
|
執行完發現商品2的數量變為7了,現在就對了。
現在還存在兩種情況:
1.當用戶撤銷一個訂單的時候,我們這邊直接刪除一個訂單,我們是不是需要把對應的商品數量再加回去呢?
對於delete而言:原本有一行,後來被刪除,想引用被刪除的這一行,用old來表示舊錶中的值,old.列名可以引用原(舊)表中的值。
那我們的觸發器就該這樣寫:
1 2 3 4 5 |
create
trigger
tg3 afert
delete
on
order_table
for
each row
bigin
update
goods
set
num = num + old.much
where
id = old.gid;
-- (注意這邊的變化)
end
|
2.當用戶修改一個訂單的數量時,我們觸發器修改怎麼寫?
1 2 3 4 5 |
create
trigger
tg4
after
update
on
order_table
for
each row
begin
update
goods
set
num = num+old.much-new.much
where
id = old.gid;
end
|
3.儲存過程
MySQL資料庫在5.0版本後開始支援儲存過程,那麼什麼是儲存過程呢?怎麼建立、檢視和刪除儲存過程呢?儲存過程有什麼優點?
儲存過程:類似於函式(方法),簡單的說儲存過程是為了完成某個資料庫中的特定功能而編寫的語句集合,該語句集包括SQL語句(對資料的增刪改查)、條件語句和迴圈語句等。
1. 檢視現有的儲存過程
1 show
procedure
status;
2 .刪除儲存過程
1 drop
procedure
儲存過程名稱;
3. 呼叫 儲存過程
1 call 儲存過程名稱(引數入/出型別 引數名 資料型別);
4.建立儲存過程
1.體會封裝
1 2 3 4 5 #1.體會封裝
create
procedure
p1 ()
begin
select
*
from
account;
end
2.SQL 體會引數
1 2 3 4 5 6 7 8 9 create
procedure
p2(
in
i
int
,
out
n
varchar
(50))
begin
select
name
into
n
from
account
where
id = i;
end
-- 呼叫
set
@
name
=
null
;
CALL p2(1,@
name
);
select
@
name
;
注意1: mysql中有三種出入引數型別:分別為:1. in 入參型別 2.out 出參型別 3. inout 出入參型別
注意2: into 關鍵字 可以 將前面欄位的查詢結果 執行 給 into 後面的變數.
-- 建立儲存過程 in 入參 create procedure p_in (IN num int ) begin select num; set num=100; select num; end; -- 呼叫 set @num=1; call p_in(@num); select @num; -- 總結: IN 引數只是將變數在儲存過程內部做了修改,並沒有影響到外部,@num仍為1。in引數out出參示例 inout出入參示例
3.SQL 體會控制
1 2 3 4 5 6 7 8 9 #3.SQL 體會控制
create
procedure
p3(
in
x
int
,
in
c
char
(1))
begin
if c =
'd'
then
select
*
from
account
where
money >x;
else
select
*
from
account
where
money <x;
end
if;
end
4.體會迴圈:計算1-100累加的和,並且返回計算結果.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #4.體會迴圈:計算1-100累加的和,並且返回計算結果.
create
procedure
p4(inout n
int
)
begin
DECLARE
sum
int
default
0;
-- 設定總和變數,並且指定初始值0
declare
i
int
;
-- 宣告變數
set
i = 0;
-- 通過set為變數設定值
while i<=n DO
-- 開始迴圈
set
sum
=
sum
+i;
set
i = i+1;
end
while;
-- 結束迴圈
select
sum
;
-- 提供結果
set
n =
sum
;
--將計算結果提供給 輸出變數 n;
end
;
-- 呼叫:
set
@n = 100;
call p4(@n);
select
@n;
儲存過程優點:
1、儲存過程增強了SQL語言靈活性。儲存過程可以使用控制語句編寫,可以完成複雜的判斷和較複雜的運算,有很強的靈活性;
2、減少網路流量,降低了網路負載。儲存過程在伺服器端建立成功後,只需要呼叫該儲存過程即可,而傳統的做法是每次都將大量的SQL語句通過網路傳送至資料庫伺服器端然後再執行
3、儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯。一般SQL語句每執行一次就編譯一次,所以使用儲存過程可提高資料庫執行速度。
儲存過程缺點:1、擴充套件功能不方便
2、不便於系統後期維護
4.函式
MySQL提供的內建函式:
一、數學函式 ROUND(x,y) 返回引數x的四捨五入的有y位小數的值 RAND() 返回0到1內的隨機值,可以通過提供一個引數(種子)使RAND()隨機數生成器生成一個指定的值。 二、聚合函式(常用於GROUP BY從句的SELECT查詢中) AVG(col)返回指定列的平均值 COUNT(col)返回指定列中非NULL值的個數 MIN(col)返回指定列的最小值 MAX(col)返回指定列的最大值 SUM(col)返回指定列的所有值之和 GROUP_CONCAT(col) 返回由屬於一組的列值連線組合而成的結果 三、字串函式 CHAR_LENGTH(str) 返回值為字串str 的長度,長度的單位為字元。一個多位元組字元算作一個單字元。 CONCAT(str1,str2,...) 字串拼接 如有任何一個引數為NULL ,則返回值為 NULL。 CONCAT_WS(separator,str1,str2,...) 字串拼接(自定義連線符) CONCAT_WS()不會忽略任何空字串。 (然而會忽略所有的 NULL)。 FORMAT(X,D) 將數字X 的格式寫為'#,###,###.##',以四捨五入的方式保留小數點後 D 位, 並將結果以字串的形式返回。若 D 為 0, 則返回結果不帶有小數點,或不含小數部分。 例如: SELECT FORMAT(12332.1,4); 結果為: '12,332.1000' INSERT(str,pos,len,newstr) 在str的指定位置插入字串 pos:要替換位置其實位置 len:替換的長度 newstr:新字串 例如: SELECT INSERT('abcd',1,2,'tt'); 結果為: 'ttcd' SELECT INSERT('abcd',1,4,'tt'); 結果為: 'tt' 特別的: 如果pos超過原字串長度,則返回原字串 如果len超過原字串長度,則由新字串完全替換 INSTR(str,substr) 返回字串 str 中子字串的第一個出現位置。 LEFT(str,len) 返回字串str 從開始的len位置的子序列字元。 例如: SELECT INSTR('abc','c'); 結果為: 3 SELECT INSTR('abc','d'); 結果為: 0 LOWER(str) 變小寫 UPPER(str) 變大寫 REVERSE(str) 返回字串 str ,順序和字元順序相反。 例如: SELECT REVERSE('1234567') 結果為:7654321 SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len) 不帶有len 引數的格式從字串str返回一個子字串,起始於位置 pos。帶有len引數的格式從字串str返回一個長度同len字元相同的子字串,起始於位置 pos。 使用 FROM的格式為標準 SQL 語法。也可能對pos使用一個負值。假若這樣,則子字串的位置起始於字串結尾的pos 字元,而不是字串的開頭位置。在以下格式的函式中可以對pos 使用一個負值。 mysql> SELECT SUBSTRING('Quadratically',5); -- 從第5位開始擷取 -> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4); -- 從第4位開始擷取 -> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6); --從第5位開始擷取,擷取6個長度 -> 'ratica' mysql> SELECT SUBSTRING('Sakila', -3); -- 從倒數第3位開始擷取 -> 'ila' mysql> SELECT SUBSTRING('Sakila', -5, 3); -- 從倒數第5位開始擷取,擷取3個長度 -> 'aki' 四、日期和時間函式 CURDATE()或CURRENT_DATE() 返回當前的日期 CURTIME()或CURRENT_TIME() 返回當前的時間 DAYOFWEEK(date) 返回date所代表的一星期中的第幾天(1~7) DAYOFMONTH(date) 返回date是一個月的第幾天(1~31) DAYOFYEAR(date) 返回date是一年的第幾天(1~366) DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE); FROM_UNIXTIME(ts,fmt) 根據指定的fmt格式,格式化UNIX時間戳ts HOUR(time) 返回time的小時值(0~23) MINUTE(time) 返回time的分鐘值(0~59) MONTH(date) 返回date的月份值(1~12) MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE); NOW() 返回當前的日期和時間 QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE); WEEK(date) 返回日期date為一年中第幾周(0~53) YEAR(date) 返回日期date的年份(1000~9999) 重點: DATE_FORMAT(date,format) 根據format字串格式化date值 mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); -> 'Sunday October 2009' mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00', -> '%D %y %a %d %m %b %j'); -> '4th 00 Thu 04 10 Oct 277' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', -> '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52' mysql> SELECT DATE_FORMAT('2006-06-00', '%d'); -> '00' 五、加密函式 MD5() 計算字串str的MD5校驗和 例如: SELECT MD5('1234') 結果為:81dc9bdb52d04dc20036dbd8313ed055 PASSWORD(str) 返回字串str的加密版本,這個加密過程是不可逆轉的 例如: SELECT PASSWORD('1234') 結果為:*A4B6157319038724E3560894F7F932C8886EBFCF 六、控制流函式 CASE WHEN[test1] THEN [result1]...ELSE [default] END 如果testN是真,則返回resultN,否則返回default CASE [test] WHEN[val1] THEN [result]...ELSE [default]END 如果test和valN相等,則返回resultN,否則返回default IF(test,t,f) 如果test是真,返回t;否則返回f IFNULL(arg1,arg2) 如果arg1不是空,返回arg1,否則返回arg2 例如: SELECT IFNULL('bbb','abc'); 結果為: bbb SELECT IFNULL(null,'abc'); 結果為: abc NULLIF(arg1,arg2) 如果arg1=arg2返回NULL;否則返回arg1 例如: SELECT NULLIF('bbb','bbb');結果為: null SELECT NULLIF('aaa','bbb');結果為: aaamysql的內建函式
1、自定義函式
1 2 3 4 5 6 7 8 9 CREATE
FUNCTION
fun1(i1
int
,i2
int
)
RETURNS
INT
//設定返回型別
BEGIN
DECLARE
sum
int
default
0;
set
sum
= i1+i2;
RETURN
(
sum
); //返回結果
end
2.呼叫自定義函式
1 2 3 4 5 #直接呼叫自定義函式
select
fun1(1,5);
#在sql語句中使用自定義函式
select
fun1(引數1,引數2),
name
from
表名
3.刪除自定義函式
1 DROP
FUNCTION
fun_name;
4.函式與儲存過程的區別:
5.事物處理
一、 什麼是事務
一組sql語句批量執行,要麼全部執行成功,要麼全部執行失敗
二、為什麼出現這種技術
為什麼要使用事務這個技術呢? 現在的很多軟體都是多使用者,多程式,多執行緒的,對同一個表可能同時有很多人在用,為保持資料的一致性,所以提出了事務的概念。這樣很抽象,舉個例子:
A 給B 要劃錢,A 的賬戶-1000元, B 的賬戶就要+1000元,這兩個update 語句必須作為一個整體來執行,不然A 扣錢了,B 沒有加錢這種情況很難處理。
三、事物的特性
80年代中國人結婚四大件:手錶、自行車、縫紉機、收音機(三轉一響)。要把事務娶回家同樣需要四大件,所以事務很刻薄(ACID),四大件清單:原子性(Atom)、一致性(Consistent)、隔離性(Isolate)、永續性(Durable)。ACID就是資料庫事務正確執行的四個特性的縮寫。
- 原子性:要麼不談,要談就要結婚!
對於其資料修改,要麼全都執行,要麼全都不執行。
- 一致性:戀愛時,什麼方式愛我;結婚後還得什麼方式愛我;
資料庫原來有什麼樣的約束,事務執行之後還需要存在這樣的約束,所有規則都必須應用於事務的修改,以保持所有資料的完整性。
- 隔離性:鬧完洞房後,是倆人的私事。
一個事務不能知道另外一個事務的執行情況(中間狀態)
- 永續性:一旦領了結婚證,無法後悔。
即使出現致命的系統故障也將一直保持。不要告訴我係統說commit成功了,回頭電話告訴我,伺服器機房斷電了,我的事務涉及到的資料修改可能沒有進入資料庫。
另外需要注意:
- 在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。
- 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
- 事務用來管理 insert,update,delete 語句
四、事務控制語句:
BEGIN 或 START TRANSACTION;顯式地開啟一個事務;
COMMIT;也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對資料庫進行的所有修改稱為永久性的;
ROLLBACK;有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改;
- SAVEPOINT : 儲存點,可以把一個事物分割成幾部分.在執行ROLLBACK 時 可以指定在什麼位置上進行回滾操作.
注意: SET AUTOCOMMIT=0 ;禁止自動提交 和 SET AUTOCOMMIT=1 開啟自動提交.
五、例子: 魯班轉賬給后羿
1.建立表
相關推薦
MySQL之基礎功能
一.檢視 檢視:是一個虛擬表,其內容由查詢定義。同真實的表一樣,檢視包含一系列帶有名稱的列和行資料 檢視有如下特點: 1. 檢視的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關係。 2. 檢視是由基本表(實表)產生的表(虛表)。 3. 檢視的建立和刪除不影響基本表。
mysql之基礎知識整理
MySQL複製原理 三個程序,兩種檔案。 binlog dump、IO thread、SQL thread binlog 、relay log 以下圖片擷取自《高效能MySQL》 binlog日誌格式的種類和
ROS入門之基礎功能詳解(二)
前言:本部分主要介紹ros一些基礎功能的使用,包括建立和編譯工作空間,建立和編譯功能包,建立和編譯節點,建立和編譯訊息,建立和編譯服務以及建立launch檔案。 一、建立和編譯工作空間 1.檢視正在使用的工作空間: echo $ROS_PACKAGE_PATH -------------
高效能MySQL之基礎架構
一、背景 為什麼我們需要先學習MYSQL的基礎架構先呢? 原因很簡單,當我們需要了解一件事物的時候,我們只有站在巨集觀的層面,才能層層剝絲抽繭的去理解問題。舉個例子,我們要看一個框架的原始碼,一開始就想進去研究,卻發現找不著北,原因很簡單,因為我們沒有鳥瞰全貌,我們根本不知道入口在哪裡。因此我們學習MYS
脈沖雲基礎功能之版本控制
脈沖雲 版本控制 脈沖雲開發平臺 版本控制:如果說什麽是軟件開發項目一定要使用的基礎工具,那麽版本控制系統應該算最重要的部分。不管是個人開發或是團隊協作開發,都可以通過版本控制系統獲得巨大的好處。 沒有版本控制系統的話,代碼可能被別人或自己不小心覆蓋或遺失、也不知道是誰因為什麽原因改了這段代碼、
Django基礎之admin功能
用戶名 分享圖片 數據庫 spa 創建 基礎 post gpo nag Django默認開起了後臺 1、訪問admin後臺 2、用戶和密碼進行登錄 ==========================================================
mysql之存儲過程基礎
基本 mysq () BE pro tro cal 處理 語句 存儲過程 procedure 可以理解為一個處理增刪改,沒有返回值得函數 創建存儲過程的基本語法 create procedure 過程名 (【參數列表】) begin --過程體 end 存儲過程主體只有一條
MySQL(三)DQL之基礎查詢
auto lec image images dql src 有一個 運算符 mysq 1、語法 SELECT 要查詢的東西 FROM 表名 ; 類似於Java中:System.out.println(要打印的東西); 2、特點 ①通過select查詢完的結果,是一個
【python3 自動化之mysql操作】python3下的mysql入門基礎
1、所需資源:pycharm,python3.6,module:pymysql 2、pycharm配置mysql: 新新增一個mysql資料庫 ip:192.168.112.54 埠:3306 賬號:root &nb
Flask學習之基礎知識與功能
一:flask的背景介紹 Flask是一個基於Python開發並且依賴jinja2模板和Werkzeug WSGI服務的一個微型框架,對於Werkzeug本質是Socket服務端,其用於接收http請求並對請求進行預處理,然後觸發Flask框架,開發人員基於Flask框架提供的功能對請求進行相應的處理,並返
1.偏頭痛楊的mysql教學系列之基礎概念篇
前戲 mysql是目前最流行的關係型資料庫之一,在阿里前幾年的去IOE化後整風運動後, mysql從中小型資料庫解決方案成長為了大型網際網路應用關係型資料庫解決方案的中流砥柱。 因為mysql免費且開源,還可以無限擴充套件成N個數據庫叢集,玩分庫分表。 MYSQ
實踐 | MES系統之設備管理的基礎功能
都在 mes follow 行數 根據 型號 做出 圖表 數據處理 MES是現在和將來企業生產不可或缺的一部分,它是生產活動的物質技術基礎,決定著企業生產效率和質量。對於制造企業來說,加強設備管理顯得尤為重要。只有設備管理加強了,才能維持正常的生產秩序,提高企業的活力和生產
mysql 之單表查詢基礎sql
建立測試表 CREATE TABLE `student` ( `id` INT , `stuName` VARCHAR (60), `age` INT , `sex` VARCHAR (30), `gradeName` VARCHAR (60) ); INSER
Android四大元件之服務(一)-----服務基礎功能簡述
服務(Service)是android的四大元件之一,在Android專案中擔任著後臺執行的大任,主要去完成那些不需要和使用者互動而且還要求長時間執行在後臺的工作。服務的執行不會對使用者使用app造成任何影響,這個元件屬於很常用的元件,幾乎每一款app產品都會用到,比如後臺
(2.6)Mysql之SQL基礎——存儲引擎的查看與修改
char arc lte %s table sel mysql ike like (2.6)Mysql之SQL基礎——存儲引擎的查看與修改 可以使用 show engines; 查看數據庫支持的所有的存儲引擎; 目錄: 1、數據庫級別存儲引擎 1.1查看現在
IT忍者神龜之jquery easyui DataGrid 例項,增、刪、查、改基礎功能
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ include file="/common/taglibs.jsp"%&g
(2.8)Mysql之SQL基礎——索引的分類與使用
中標 var chang mysq type add har 滿足 空間 (2.8)Mysql之SQL基礎——索引的分類與使用 按邏輯分類: 1、主鍵索引(聚集索引)(也是唯一索引,不允許有空值) 2、普通索引或單列索引 3、多列索引(復合索引) 4、唯一索引或非唯一索
(2.8)Mysql之SQL基礎——索引的查詢與刪除
sele rom db_name name test unique 查詢 img alt (2.8)Mysql之SQL基礎——索引的查詢與刪除 1、索引查詢 (1)按庫查詢 select * from information_schema.statistics wher
(2.16)Mysql之SQL基礎——函數
統計行數 最大 默認 插入 fun ike insert 一行 div (2.16)Mysql之SQL基礎——函數 關鍵詞:mysql函數,mysql自定義函數,mysql聚合函數,mysql字符串函數,mysql日期函數 1、自定義函數
Qt入門之基礎篇 ( 二 ) :Qt項目建立、編譯、運行和發布過程解析
qt 5 對話 讓我 進度 qmake ctr deploy 設定 設置 轉載請註明出處:CN_Simo。 題解: 本篇內容主講Qt應用從創建到發布的整個過程,旨在幫助讀者能夠快速走進Qt的世界。 本來計劃是講解Qt源碼靜態編譯,如此的話讀者可能並不能清楚地知