MySQL(二)

来源:http://www.cnblogs.com/nield-bky/archive/2016/11/24/6100011.html
-Advertisement-
Play Games

MYSQL(二) MYSQL(二) 上一篇文章講的是mysql的基本操作,這一篇會有一點難以理解,本節主要內容mysql視圖,存儲過程,函數,事務,觸發器,以及動態執行sql 視圖view 視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在資料庫 ...


MYSQL(二)

上一篇文章講的是mysql的基本操作,這一篇會有一點難以理解,本節主要內容mysql視圖,存儲過程,函數,事務,觸發器,以及動態執行sql

視圖view

視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在資料庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。對其中所引用的基礎表來說,視圖的作用類似於篩選。定義視圖的篩選可以來自當前或其它資料庫的一個或多個表,或者其它視圖。通過視圖進行查詢沒有任何限制,通過它們進行數據修改時的限制也很少。視圖是存儲在資料庫中的查詢的SQL 語句,它主要出於兩種原因:安全原因, 視圖可以隱藏一些數據。

1、創建視圖

--格式:CREATE VIEW 視圖名稱 AS  SQL語句
CREATE VIEW v1 AS SELET nid, name FROM tab1 WHERE nid > 4

2、刪除視圖

--格式:DROP VIEW 視圖名稱
DROP VIEW v1

3、修改視圖

-- 格式:ALTER VIEW 視圖名稱 AS SQL語句
ALTER VIEW v1 AS
SELET A.nid,B. NAME FROM tab1
LEFT JOIN B ON A.id = B.nid
LEFT JOIN C ON A.id = C.nid
WHERE tab1.id > 2

也就只是改了把create改成alter,中間的語句更換了。

4、使用視圖

使用視圖時,將其當作表進行操作即可,由於視圖是虛擬表,所以無法使用其對真實表進行創建、更新和刪除操作,僅能做查詢用。

select * from v1

存儲過程procedure

1、我們為什麼要用存儲過程呢 ?

我們都知道應用程式分為兩種,一種是基於web,一種是基於桌面,他們都和資料庫進行交互來完成數據的存取工作。假設現在有一種應用程式包含了這兩 種,現在要修改其中的一個查詢sql語句,那麼我們可能要同時修改他們中對應的查詢sql語句,當我們的應用程式很龐大很複雜的時候問題就出現這,不易維 護!另外把sql查詢語句放在我們的web程式或桌面中很容易遭到sql註入的破壞。而存儲常式正好可以幫我們解決這些問題。

2、創建存儲過程

創建存儲過程這塊主要有兩種,一種是帶參數的,一種是不帶參數的,先講不帶參數的再說不帶參數的

不帶參數案例:

複製代碼
-- 創建存儲過程
delimiter //        --自定義語句結尾符號,因為這裡要執行好多句sql語句,所以就得自定義,以防止出錯
create procedure p1()
BEGIN
    select * from tab1;
END//
delimiter ;         --自定義局域結尾符號結束

-- 執行存儲過程
call p1()
複製代碼

帶參數案例這塊主要有三個類

  • in          僅用於傳入參數用
  • out        僅用於返回值用
  • inout     既可以傳入又可以當作返回值
複製代碼
-- 創建存儲過程
delimiter \\
create procedure p1(
    in i1 int,                        -- 傳入參數i1
    in i2 int,                        -- 傳入參數i2
    inout i3 int,                     -- 即傳入又能得到返回值
    out r1 int                        -- 得到返回值
)
BEGIN
    DECLARE temp1 int;
    DECLARE temp2 int default 0;  
    set temp1 = 1;
    set r1 = i1 + i2 + temp1 + temp2; 
    set i3 = i3 + 100;
end\\
delimiter ;

-- 執行存儲過程
DECLARE @t1 INT default 3;           --  設置變數預設值為3
DECLARE @t2 INT;                     --  設置變數
CALL p1 (1, 2 ,@t1, @t2);            --  執行存儲過程,並傳入參數,t2自動取消
SELECT @t1,@t2;                      --  查看存儲過程輸出結果
複製代碼

2、刪除存儲過程

drop procedure p1;

3、python用pymysql模塊調用存儲過程,因為我們學習這些就是為了語言調用

複製代碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='day39b_')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 執行存儲過程
row = cursor.callproc('p1',(1,2,3))
# 存儲過程的查詢結果
selc = cursor.fetchall()
print(selc)
# 獲取存儲過程返回
effect_row = cursor.execute('select @_p1_0,@_p1_1,@_p1_2')
# 曲存儲過程的返回值
ret = cursor.fetchone()
print(ret)
# 提交,不然無法保存新建或者修改的數據
conn.commit()
# 關閉游標
cursor.close()
# 關閉連接
conn.close()
複製代碼

函數function

 在mysql中有很多內置函數,比如我們經常用的求平均值,求和,個數,各式各樣,先給大家來一部門內置函數,然後再說說自定義函數吧,函數也可以傳參數,也可以接收返回值,但是函數沒辦法得到執行語句得到的結果,存儲過程可以。

 內置函數

更多參考請參考中文文檔http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions

1、自定義創建函數

複製代碼
delimiter \\
create function f1(
    i1 int,
    i2 int)
returns int
BEGIN
    declare num int;
    set num = i1 + i2;
    return(num);
END \\
delimiter ;
複製代碼

2、刪除函數

drop function f1;

3、執行函數

複製代碼
# 獲取返回值
declare @i VARCHAR(32);
select UPPER('alex') into @i;
SELECT @i;

# 在查詢中使用
select f1(11,nid) ,name from tb2;
複製代碼

事務

 事務用於將某些操作的多個SQL作為原子性操作,一旦有某一個出現錯誤,即可回滾到原來的狀態,從而保證資料庫數據完整性。例如:當兩張銀行卡之間進行轉賬,甲方錢轉出去了,突然光纜壞了,乙方還沒收到錢,錢跑哪裡去了,就為了防止這種情況,事務就出來了,事務可以防止這種事情發生。

應用事務實例:

複製代碼
delimiter \\
create PROCEDURE p1(
    OUT p_return_code tinyint
)
BEGIN 
  DECLARE exit handler for sqlexception 
  BEGIN 
    -- ERROR 
    set p_return_code = 1; 
    rollback; 
  END; 
 
  DECLARE exit handler for sqlwarning 
  BEGIN 
    -- WARNING 
    set p_return_code = 2; 
    rollback; 
  END; 
 
  START TRANSACTION; 
    DELETE from tb1;                   -- sql語句都放在這個裡面
    insert into tb2(name)values('seven');
  COMMIT; 
 
  -- SUCCESS 
  set p_return_code = 0; 
 
  END\\
delimiter ;
複製代碼

執行存儲過程:

DECLARE @i TINYINT;
call p1(@i);
select @i;

觸發器TRIGGER

 觸發器,簡單來說就是當你在執行這條語句之前或者之後觸發一次增刪改查,觸發器用於定製用戶對錶的行進行【增/刪/改】前後的行為。

1、基本語法

複製代碼
# 插入前
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 插入後
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 刪除前
CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 刪除後
CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 更新前
CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 更新後
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN
    ...
END
複製代碼

事例一插入前:

複製代碼
-- 在往tab1插入數據之前往tab2中插入一條name = 張岩林,當然是在判斷往tab1中插入的名字是不是等於aylin
delimiter //
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN

IF NEW. NAME == 'aylin' THEN
    INSERT INTO tb2 (NAME)
VALUES
    ('張岩林')
END
END//
delimiter ;
複製代碼

事例二插入後:

複製代碼
delimiter //
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
    IF NEW. num = 666 THEN
        INSERT INTO tb2 (NAME)
        VALUES
            ('張岩林'),
            ('很帥') ;
    ELSEIF NEW. num = 555 THEN
        INSERT INTO tb2 (NAME)
        VALUES
            ('aylin'),
            ('非常帥') ;
    END IF;
END//
delimiter ;
複製代碼

同樣的刪,改,查都是同樣的道理

特別的:NEW表示即將插入的數據行,OLD表示即將刪除的數據行。

2、刪除觸發器

DROP TRIGGER tri_after_insert_tb1;

3、使用觸發器

觸發器無法由用戶直接調用,而知由於對錶的【增/刪/改】操作被動引發的。

insert into tb1(name) values(‘張岩林’)

下章給大家更新資料庫索引,這方面東西比較多,所以樓主決定把他從新寫一篇博客,看完的記得點贊喲!!

-此文章轉載-轉載自:http://www.cnblogs.com/aylin/p/5746501.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.Runtime是用C和彙編寫的 對於C語言,函數的調用在編譯的時候會決定調用哪個函數。對於OC的函數,屬於動態調用過程,在編譯的時候並不能決定真正調用哪個函數,只有在真正運行的時候才會根據函數的名稱找到對應的函數來調用。 二.Runtime常用頭文件 #import<objc/runtime.h ...
  • UITableView或UIScrollVIew上的UIButton的高亮效果 原文地址:http://www.jianshu.com/p/b4331f06bd34 最近做項目的時候發現,UIScrollView上的UIButton點擊的時候沒有高亮狀態,但是確實觸發了點擊事件,不過這樣會造成一個假 ...
  • 本文原文地址:http://www.cnblogs.com/qianLL/p/6095988.html 有時候 我們接收數據的時候 後臺給的數據室一串HTML 的字元串 但是 我們要顯示出來 這是 我們會發現文字可以自適應大小,但是有些圖片並不能自適應大小 這是 我們就需要去修改img的CSS樣式 ...
  • Android中GridView組件用來以網格方式排列視圖,與矩陣類似,當屏幕上有很多元素(文字、圖片或其他元素)需要顯示時,可以使用該組件。下麵我們通過代碼實現如下圖例(為了方便截圖,將事件處理(土司)設置到屏幕頂部) Layout下gridview.xml佈局文件: anroid:numColu ...
  • 30篇針對Android開發者的Kotlin語言的論文(KAD)的第一篇。在這系列論文中,作者將談及該語言的最要的部分和怎樣將它們應用到Android開發中。 ...
  • 本文並非最終版本,如想關註更新或更正的內容,詳見文末的聯繫方式,如有疏忽和遺漏,歡迎指正。 本文相關目錄:(鏈接為簡書鏈接) ====================== 所屬文集: "1.2 Objective C" ====================== "1.2.0 開發須知" "1.2 ...
  • 使用ViewPager切換Fragment,我原先使用系統自帶的適配器FragmentPagerAdapter。 切換fragment時,頻繁調用oncreatview()。 查看FragmentPagerAdapter的源碼,發現兩個關鍵的地方 attach和detach的頻繁使用導致了fragm ...
  • 作為開發者我們需要經常站在用戶角度考慮問題,比如在應用商城下載軟體時,當用戶點擊下載按鈕,則會有下載進度提示頁面出現,現在我們通過線程休眠的方式模擬下載進度更新的演示,如圖(這裡為了截圖方便設置對話進度條位於屏幕上方): layout界面代碼(僅部署一個按鈕): Java代碼實現(通過線程實現模擬下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...