1. 程式人生 > 其它 >5、檢視(VIEW)

5、檢視(VIEW)

什麼是檢視?

  • 檢視是一種虛擬存在的表,基於 SQL 語句的結果集的視覺化的表。本身是不具有資料的,佔用很少的記憶體空間。
  • 檢視建立在已有表的基礎上, 檢視賴以建立的這些表稱為基表。檢視的建立和刪除不影響對應的基表。
  • 在資料庫中,檢視不會儲存資料,資料真正儲存在資料表中。
  • 檢視包含行和列,就像一個真實的表。檢視中的欄位是來自一個或多個數據庫中的真實的表中的欄位。我們可以向檢視新增 SQL 函式、WHERE 以及 JOIN 語句,我們也可以提交資料,就像這些來自於某個單一的表。向檢視提供資料內容的語句為 SELECT 語句, 可以將檢視理解為儲存起來的SELECT語句

建立檢視

1 CREATE
[OR REPLACE] 2 [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 3 VIEW 檢視名稱 [(欄位列表)] 4 AS 查詢語句 5 [WITH [CASCADED|LOCAL] CHECK OPTION];

精簡版:

CREATE VIEW 檢視名稱 AS 查詢語句;

檢視檢視

-- 檢視資料庫的表物件、檢視物件
SHOW TABLES;
-- 檢視檢視的結構
DESC / DESCRIBE 檢視名稱;
-- 檢視檢視的屬性資訊(顯示資料表的儲存引擎、版本、資料行數和資料大小等)
SHOW TABLE STATUS LIKE '
檢視名稱'; -- 檢視檢視的詳細定義資訊 SHOW CREATE VIEW 檢視名稱;

刪除檢視

-- 刪除檢視只是刪除檢視的定義,並不會刪除基表的資料
DROP VIEW IF EXISTS 檢視名稱;

示例:列出流水錶詳細資訊

  • 建立賬號表
    CREATE TABLE account(
      account_id VARCHAR(36)   PRIMARY KEY, -- 使用UUID生成隨機的唯一值
      account_name VARCHAR(15)   NOT NULL,
      balance      DECIMAL(10,2)  NOT NULL, 
      reg_date     DATE          
    NOT NULL );
  • 插入兩條記錄到賬號表
    INSERT INTO account(account_id,account_name,balance,reg_date) VALUES(UUID(),'張三',1000,CURDATE());
    INSERT INTO account(account_id,account_name,balance,reg_date) VALUES(UUID(),'李四',2000,CURDATE());

    

  • 建立流水錶
    create table transrecord(
        trans_id   varchar(36) primary key,  -- 使用UUID_SHORT函式生成隨機的唯一值
         sender_id     varchar(36),
        receiver_id    varchar(36),
        trans_balance  decimal(10,2),
        trans_datetime  datetime
    );
  • 插入測試記錄到賬號表 
    INSERT INTO transrecord(trans_id,sender_id,receiver_id,trans_balance,trans_datetime)
    VALUES(
    UUID_SHORT(),
    'aec59761-ab3b-11ec-b6ed-0a0027000018', -- 張三
    'aec8301d-ab3b-11ec-b6ed-0a0027000018', -- 李四
    200,
    SYSDATE());
    
    INSERT INTO transrecord(trans_id,sender_id,receiver_id,trans_balance,trans_datetime)
            VALUES(
    UUID_SHORT(),
    'aec8301d-ab3b-11ec-b6ed-0a0027000018', -- 李四
    'aec59761-ab3b-11ec-b6ed-0a0027000018', -- 張三
    100,
    SYSDATE());

  

  •  示例列出流水錶詳細資訊
    -- 流水號傳送者ID傳送者姓名收款者ID 收款者姓名轉賬金額轉賬時間
    SELECT a.trans_id,
    a.sender_id,b.account_name,
    a.receiver_id,c.account_name,
    a.trans_balance,a.trans_datetime
    FROM transrecord a INNER JOIN account b ON a.sender_id=b.account_id
    INNER JOIN account c ON a.receiver_id=c.account_id;

         

  • 查詢指定使用者的轉出詳情
    SELECT a.trans_id,
    a.sender_id,b.account_name,
    a.receiver_id,c.account_name,
    a.trans_balance,a.trans_datetime
    FROM transrecord a INNER JOIN account b ON a.sender_id=b.account_id
    INNER JOIN account c ON a.receiver_id=c.account_id
    where a.sender_id='aec8301d-ab3b-11ec-b6ed-0a0027000018';

  • 查詢指定使用者的轉入詳情--轉入

    SELECT a.trans_id,
    a.sender_id,b.account_name,
    a.receiver_id,c.account_name,
    a.trans_balance,a.trans_datetime
    FROM transrecord a INNER JOIN account b ON a.sender_id=b.account_id
    INNER JOIN account c ON a.receiver_id=c.account_id
    where a.receiver_id='aec8301d-ab3b-11ec-b6ed-0a0027000018';

     

示例:查詢流水賬詳情

建立檢視

create or replace view view_transrecord
as 
select  a.trans_id as transId,
a.sender_id as senderId,
b.account_name as sendName,
a.receiver_id as receiverId,
c.account_name as receiverName,
a.trans_balance as transBalance,
a.trans_datetime as transDatetime
FROM transrecord a INNER JOIN account b ON a.sender_id=b.account_id
INNER JOIN account c ON a.receiver_id=c.account_id;

①查詢流水賬詳情

select *from view_transrecord;

②查詢指定使用者的轉出詳情

select *from view_transrecord
where senderId = 'aec8301d-ab3b-11ec-b6ed-0a0027000018';

③查詢指定使用者的轉入詳情

select *from view_transrecord
where receiverID = 'aec59761-ab3b-11ec-b6ed-0a0027000018';