mysql事務、視圖

like:用來模糊查詢

#查詢姓'王'的學生信息 like%:代表一個或多個任意字符(通配符)

select * from 表名 where 字段  like '王%'

#_:只匹配一個通配符(字符)

select * from 表名 where 字段 like'小_';

#%5%:只要包含5關鍵字符即可

select *from 表名 where 字段 like '%5%';

注意:%在後,就是以這個屬性結尾。%在前,就是以這個屬性開頭,兩個%就是包含這個屬性

|------mysql 沒有檢查約束

create database mydata3;

 

use mydata3;

 

create table bank

(

    username varchar(20),

    bmoney float

)

--添加約束  作用:模擬一些故障(機器或人爲)

alter table bank add constraint ck_bank_bmoney check(bmoney>=1);

 

insert into bank values('張三',1000);

 

insert into bank values('李四',1);

 

select * from bank;

 

--轉賬:把張三轉到李四賬戶,轉塊

update bank set bmoney=bmoney-1000 where username='張三';

update bank set bmoney=bmoney+1000 where username='李四';

轉賬問題,常見的一種事務問題如何解決?

它需要兩條update語句來完成,這兩條語句是一個整體

如果其中任意一條出現錯誤,則整個轉賬業務也取消,這兩個賬戶中的餘額恢復到原來的數據,從而確保轉賬前與轉賬後的餘額不變。

解決方式:用sqlserver的方式

--解決方式

/*

     declare:定義變量

     @@ERROR:跟蹤sql語句如果sql語句有異常(問題),@@error自動計數

*/

declare

     @sumError int

begin

     begin transaction;--開啓事務

     --賦值

     set @sumError=0;

     update bank set bmoney=bmoney-1000 where username='張三';

     set @sumError=@sumError+@@ERROR;

     update bank set bmoney=bmoney+1000 where username='李四';

     set @sumError=@sumError+@@ERROR;

     if(@sumError<>0)

     begin

         print 'sql語句執行有誤!回滾中.....';

         rollback transaction;--事務回滾(後悔藥)

     end

     else

     begin

         print '執行無誤,事務提交中...........';

         commit transaction;--提交事務

     end

end;

|-----在mysql中事務是自動提交的

 

SET autocommit=0;

UPDATE info SET NAME='小明' WHERE id=3;

UPDATE info SET NAME='大明' WHERE id=4;

COMMIT;

DELETE FROM info WHERE id=8;

ROLLBACK;

SET autocommit=1;

|-----視圖是一張虛擬數據表

#創建視圖

create view 視圖名稱

as

  查詢語句

#查看視圖

select * from 視圖名稱;

#對視圖進行修改,添加,刪除

update 視圖名稱 set 字段=指定條件

delete from 視圖名稱

|-----多表的情況,能否用視圖進行封裝?

DELIMITER $$

 

USE `mydata`$$

 

DROP VIEW IF EXISTS `vw_subject_01`$$

 

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vw_subject_01` AS

SELECT

  `a`.`sid`         AS `sid`,

  `a`.`sexam`       AS `sexam`,

  `a`.`sdate`       AS `sdate`,

  `b`.`SubjectName` AS `subjectname`

FROM (`score` `a`

   JOIN `subject` `b`)

WHERE (`a`.`subjectno` = `b`.`SubjectNo`)$$

 

DELIMITER ;

注意:

|-----索引可以相對提高查詢的性能,但不是絕對的!

----索引注意事項

查詢時減少使用*返回全部列,不要返回不需要的列

索引應該儘量小,在字節數小的列上建立索引

WHERE子句中有多個條件表達式時,包含索引列的表達式應置於其他條件表達式之前

避免在ORDER BY子句中使用表達式

-------數據庫的三範式:

1:保證每列的原子性   每列儘量不要再分割!

 

2:每張表只描述一件事情

 

3:如果一個關係滿足2NF,並且除了主鍵以外的其他列都不傳遞依賴於主鍵列,則滿足第三範式(3NF)

3.1:後面的主鍵列,指的不是當前數據表中的主鍵!

3.2:指的是其它數據表中的主鍵列

多表的情況,儘量不要設置主外鍵(不是說不設主鍵,主鍵要設,不設外鍵!!!)







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章