1. 程式人生 > >MySQL 最全總結

MySQL 最全總結

原始碼:https://blog.csdn.net/feifeiyechuan/article/details/84204378

1、資料庫操作

create database person;	-- 建立資料庫
show DATABASES;	-- 檢視資料庫
drop database person; -- 刪除資料庫
use person; -- 使用資料庫

2、資料庫型別

date         #-- 日期2014-09-18
time         -- 時間08:42:30
datetime     -- 日期時間2014-09-18 08:42:30
timestamp    -- 自動儲存修改的時間
year         -- 年份
 
tinyint      -- 1byte (-128~127)  
smallint     -- 2byte (-32768~32767)
mediumint    -- 3byte (-8388608~8388607)
int          -- 4byte (-2147483648~2147483647)
bigint       -- 8byte (+-9.22*10的18次方)
 
float(m,d)   -- 4byte 單精度浮點數,m總個數,d小數位
double(m,d)  -- 8byte 雙精度浮點數,m總個數,d小數位
decimal(m,d) -- decimal是儲存為字串的浮點數
 
char(n)      -- 固定長度,最多255個字元
varchar(n)   -- 可變長度,對多65535個字元
tinytext     -- 可變長度,最多255個字元
text         -- 可變長度,最多65535個字元
mediumtext   -- 可變長度,最多2的24次方-1個字元
longtext     -- 可變長度,最多2的32次方-1個字元

3、欄位約束

not null  -- 非空
unique  -- 唯一,也可以寫為unique key
primary key -- 主鍵,預設唯一非空
foreign key references -- 外來鍵
auto_increment -- 自增,只能用於主鍵自增
補充:新增外來鍵的兩種方法:
    方法一:建立表語句中:
      -- 給當前表的鍵sid新增外來鍵到stu表中的sid,並且定義這個外來鍵的名稱為fk_stu_score1_sid
      CONSTRAINT fk_stu_score1_sid FOREIGN KEY(sid) REFERENCES stu(sid)
      -- 也可以不用定義外來鍵的名稱
      FOREIGN KEY(sid) REFERENCES stu(sid)

    方法二:在建立表語句外
       -- 給表score1表的鍵sid新增外來鍵到表stu表的sid,並且定義這個外來鍵的名稱為fk_sid
       ALTER TABLE score1 ADD CONSTRAINT fk_sid FOREIGN KEY(sid) REFERENCES stu(sid)

4、DDL(資料定義語言)---》表格的增刪改

(1)建立表格

create table t_stu(
	sid int primary key auto_increment,
	sname varchar(20) unique not null,
	sage int not null	
)auto_increment = 001;


create table if not exists t_score(
	scid int primary key auto_increment,
	sid int not null,
	yuwen int,
	shuxue int,
	yingyu INT
)auto_increment=1;

-- 新增外來鍵
alter table t_score add constraint stuscore_sid foreign key(sid) references t_stu(sid)

-- 查看錶結構
desc t_stu;
desc t_score;

(2)刪除表

-- 刪除表格
create table gaofei(id int primary key auto_increment) -- 測試用

drop table gaofei; -- 刪除表格,刪除所有資訊

(3)修改表結構

-- =========================新建測試表===========================
create table test(
	id int primary key auto_increment,
	name varchar(20)
)auto_increment=1


-- ==================重新命名====================

  1、alter table 舊錶名 rename 新表名;
  //修改 資料表名
alter table test rename test1;


-- ==================修改欄位資料型別====================
  2、alter table 表名 modify  欄位名 新資料型別;
  //只修改資料型別
alter table test1 modify name char(20);


-- -------修改欄位名和資料型別------------
  3、alter table 表名 change 舊欄位名  新欄位名 新的資料型別;
  //只修改欄位名
  //修改欄位名和資料型別
alter table test1 change name names varchar(50);


-- -------修改欄位位置-------------------
  4、alter table 表名 modify 欄位 資料型別 after 已存在的欄位/first
  //欄位修改位置
alter table test1 modify name varchar(50) after id;


-- ==================新增新欄位====================
  5、alter table 表名 add  新欄位名 新資料型別 (約束條件‘如:not null’)(位置‘first’);
  //增加欄位
alter table test1 add age int(20);

  6、alter table 表名 add  新欄位名 新資料型別  (約束條件) after 已存在的欄位;
  //將新加的欄位放在某個已存在的欄位後
alter table test1 add places VARCHAR(20) after id;


-- ==================刪除欄位===================
  7、alter table 表名 drop 欄位名;
  //刪除已存在的欄位名
alter table test1 drop places;

5、DML(資料操作語言)------資料增刪改查

(1)新增

-- t_stu
-- 對於空值或者自增的值可以用null或者當前欄位名替代
insert into t_stu values(sid,'zss',21);

insert into t_stu values(null,'l5',21);

insert into t_stu(sname,sage) values('w5',21);

insert into t_stu(sname,sage) values('z7',22),('s8',22);  -- 新增多行資料,用逗號隔開

select * from t_stu;  -- 110測試
-- t_score
insert into t_score values(scid,1,11,12,13);
insert into t_score values(scid,5,11,16,63);
insert into t_score values(scid,3,11,82,73);
insert into t_score values(scid,4,11,92,99);

select * from t_score; -- 110測試

(2)查詢

-- select 欄位名  from 表格名 where 條件
select * from t_score; -- 110測試

select * from t_stu;  -- 110測試

(3)刪除

-- 刪除表格資料
create table gaofei(id int primary key auto_increment) -- 測試用

truncate table gaofei; -- 刪除表格所有資料,保留表結構

delete from gaofei; -- 刪除表格所有資料,保留表結構
delete from gaofei where id=1; -- 刪除指定條件的表格資料

(4)修改

-- 修改
update t_stu set sage=90;  -- 修改所有

update t_stu set sage = 99,sname='donghao' where sid > 5  -- 修改給定條件的記錄

6、比較運算子

-- 比較運算子 > < >= <= = (!= <> )兩個不等於一樣
select * from t_score;

select * from t_score where yingyu > 60; 
select * from t_score where shuxue >= 60;
select * from t_score where shuxue < 50;
select * from t_score where shuxue <= 50;
select * from t_score where shuxue = 50;
select * from t_score where shuxue != 50;
select * from t_score where shuxue <> 50;

7、邏輯運算子

-- 邏輯運算子 and:並且 or:或者 not:
select * from t_score where yingyu > 60 and shuxue > 60;

select * from t_score where yingyu > 60 or shuxue >90;

select * from t_score where not yingyu = 73;  -- 可以轉換為!=的情況
select * from t_score where not (yingyu > 60 and shuxue > 60);

8、模糊匹配 和 正則匹配

-- 模糊查詢  like
-- 萬用字元:
--  _ :一個字元位
--  % :匹配0個或多個字元
-- escape :轉義字元,匹配上面兩個使用

select * from t_stu where sname like '_aofe_';
select * from t_stu where sname like binary '%a%'; -- 區分大小寫的比較字串用binary

select * from t_stu where sname like '%g%'; -- 匹配包含a
select * from t_stu where sname like 'a%';  -- 匹配以a開頭

select * from t_stu where sname like '/_%/%%' escape '/'; -- 將/作為轉義字元


-- 正則匹配:rlike 和 regexp 
-- . :匹配任意單個字元
-- + :匹配一個或者多個字元
-- * :匹配0個或者多個字元
-- []:匹配任意一個[]內的字元
-- ^ :匹配開頭
-- $ :匹配結尾
-- {n}:匹配字元n次
--  []:匹配範圍內的一個字元
-- [^]:匹配不在範圍內的一個字元
-- a|b :匹配a或者b

select * from t_stu where sname rlike '^[gaofei]';

select * from t_stu where sname rlike 'a+';

-- select * from t_stu where sname REGEXP '\\w+';   -- 貌似沒有這種
select * from t_stu where sname binary REGEXP 'a+'; -- 區分大小寫的比較字串用binary



-- 上面兩種方式like 和relike、regexp的異同點:
-- 相同點:
-- 三個都不區分大小寫,如果需要區分,在where 後新增關鍵欄位binary

-- 異同點:
-- 除了使用運算子不同之外,兩個重要的差異: 
-- - SQL 的 LIKE 模式只用於匹配整個字串;正則表示式 REGEXP 可以匹配字串的任何部分。 
-- - LIKE 運算子是多位元組安全的。REGEXP 運算子只能正確地處理單位元組字符集,並不會考慮排序規則。

9、排序

-- 排序 order BY
-- 升序 asc  (預設)
-- 降序 desc 
select * from t_stu order by sid; 
select * from t_stu order by sid desc;

10、去重

-- distinct :查詢不重複的記錄
-- 注意:(1)distinct這個關鍵字來過濾掉多餘的重複記錄只保留一條,
-- 	但往往只用它來返回不重複記錄的條數,而不是用它來返回不重記錄的所有值。
-- 	其原因是distinct只能返回它的目標欄位,而無法返回其它欄位,
-- 			(2)distinct 必須放在欄位的最前面,否則報錯

select distinct sage from t_stu;
select distinct sage,sid from t_stu;  -- 同時按照(sage + sid)去重,只有一個不一樣的記錄就是不同的記錄

11、null 和 空字串

-- null 和 空字串的用法
-- null : 表示空值  is null    is not NULL
-- 空字串:有值 
-- --注意:當比較的欄位的值為null時,用is null查詢,如果有值的話,就用比較運算子等去查詢
select * from t_score  where shuxue is NULL;

select * from t_score where shuxue = '90';

select * from t_score where shuxue != 0 and shuxue is not null;

select * from t_score;  -- 110測試

12、between ... and ...

-- 欄位 between A and B  查詢滿足條件範圍的記錄
select * from t_score where shuxue between 50 and 90; 

select * from t_score where shuxue >= 50 and shuxue <= 90;

-- 這兩個語句一樣的效果

13、in

-- in :包含哪些值,和邏輯or類似
select * from t_score where shuxue in (90,82,30);

select * from t_score where shuxue = 90 or shuxue = 82 or shuxue = 30;

-- 這兩個語句一樣的效果

14、group by 分組查詢  ,with rollup ,  coalesce -----100 疑問  檢測到如果select 後用*或者和分組欄位不一致時也可以執行

                                       ------100 語句執行順序總結

-- ===============group by======================

-- group by 分組彙總,根據 by 指定的規則對資料進行分組
-- 注意:group by 子句中,必須要指定需要分組的列,而且必須是出現在
--      select 之後除了聚合函式之外所有的列。
-- 
-- having : 把分組之後的資料進行篩選和過濾,類似於where的作用
-- 注意:聚合函式必須要寫在having後面,絕對不能寫在where後面!!
-- 
-- 
-- where: 在分組之前,把不符合條件的資料過濾掉,where條件中絕對不能寫聚合函式!!!


-- 條件查詢的順序:
where ------>  group by  -----> having

select sname,count(1) from t_stu GROUP BY sname;

select count(1) from t_stu;

select *,count(1) from t_score GROUP BY shuxue;

-- 錯誤語法,where後面不能有聚合函式
-- !!!select *,count(1) from t_score where count(1)=1 GROUP BY shuxue;  


-- ===================rollup====================

	-- 在group by分組欄位的基礎上再進行統計資料。
select *,count(1) from t_score GROUP BY shuxue with ROLLUP;


-- ===================coalesce==================

	-- 如果需要修改rollup新生成的統計資料的名稱用coalesce
    -- coalesce(a,b,c);
        引數說明:如果a==null,則選擇b;如果b==null,則選擇c;如果a!=null,則選擇a;如果a b c 都為null ,則返回為null(沒意義)。
	-- 參考:https://www.cnblogs.com/phpper/p/9384614.html

select coalesce(shuxue,'總計') as '數學',count(1) from t_score GROUP BY shuxue with rollup;

15、子查詢  和  巢狀子查詢

-- ==================子查詢=================
/*什麼是子查詢?
	1、當一個查詢語句巢狀在另外一個查詢語句中稱之為子查詢。
    2、子查詢的結果作為外查詢的條件
	  在使用子查詢時,當子查詢的返回值只有
	  一個時用=,當子查詢的返回值有多個時用in
      子查詢能使用的操作符:
       in  
       not in 
       =  !=
	   >  <  <>
	返回1條或者多條資料都可以使用in
*/
select * from t_stu where sid = (select sid from t_score where shuxue = 92);

select * from t_stu where sid in (select sid from t_score where shuxue = 12);

select * from t_stu where sid in (select sid from t_score where shuxue in (92,12));

select * from t_stu where sid not in (select sid from t_score where shuxue in (92,12));


-- ==============巢狀子查詢================
/*
		子查詢包含一個子查詢,
    巢狀子查詢包含多個子查詢。
*/

select * from t_stu where sid in (select sid from t_score where shuxue in (select shuxue from t_score where yingyu=13))

16、子查詢和delete,update,

-- 子查詢和delete,update,子查詢可以它們的條件表示式提供結果集
delete from t_score where sid in (select sid from t_stu where sname='gaofei');

update t_stu set sname='feifei' where sid in (select sid from t_score where shuxue = 12);


17、exists 關鍵字 :
        用於檢查一個子查詢是否至少會返回一行資料(即檢測行的存在),返回值為true或false。

-- 不存在數學=100資料的時候,顯示所有的學生資訊
select * from t_stu where not exists (select * from t_score where shuxue = 100); 


-- 比較~:
select * from t_stu where sid not in (select sid from t_score where  shuxue = 100);

18、連結查詢主要有:等值連線、內連線、左外連線、右外連線、完全連線

-- ====================等值連線========================

/*
		總結:等值查詢技巧
		通常把要查詢的列放在select 後面,列中間用逗號分開,把涉及到的
		表放在from後面用逗號分開並把每個表都取別名,接著把幾個表的主外來鍵
		關係放在where後面,然後用=號連線,還可以加上其他條件。
    最後如果還可以根據需要加上分組語句。
*/
select s.sid ,s.sname from t_stu s,t_score r where s.sid = r.sid and r.shuxue = 12;
select * from t_stu s,t_score r where s.sid = r.sid and r.shuxue = 12;

-- 好程式碼:
select e1.* from emp e1,(select d.dname '部門名稱',avg(e.epay) 'avg' ,e.did from dept d,emp e where d.did=e.did group by d.dname) e2 
where e1.did=e2.did and e1.epay>e2.avg;   -- 這裡建立了一個虛擬表e2,然後將他們等值連線關聯起來,e1表的工資大於其所在部門的平均工資,因為部門已經得到了關聯。
)

-- ======================內連線=======================
-- 關鍵字inner join...on,只有左,右2個表相匹配的行才能在結果中顯示,作用和等值連線一樣。

select * from t_stu s inner join t_score r on s.sid = r.sid;


-- =====================左外連線======================
-- 關鍵字left join,左邊的表的行全部顯示,左邊連線右邊的值,右邊的表如果沒有匹配的值,顯示為null

select * from t_stu s left join t_score r on s.sid = r.sid;

-- =====================右外連線=======================
-- 關鍵字right join, 右邊的表的行全部顯示,右邊連線左邊的,左邊的表如果沒有匹配的值,顯示為null

select * from t_stu s right join t_score r on s.sid = r.sid;

-- =====================完全連線=======================
-- 關鍵字union, 用於合併兩個或多個select語句的結果集。 左,右2個表的行都全部顯示,如果沒有匹配的值,顯示為null
-- 合併的select語句的列數量、型別、順序必須完全一樣

select * from t_stu where sid in (1,2)
union
select * from t_stu where sid in (5,6)

18、日期函式

-- ==============================================================
-- 日期函式
select now(); -- 獲取當前的日期時間
select curdate();	-- 獲取當前的日期
select curtime();	-- 獲取當前的時間


-- ==============================================================

  select date_add(指定日期,interval 年月日間隔數 年月日季選擇);
    返回指定日期加上一個時間間隔後的日期
  
  select date_sub(指定時間,interval 年月日間隔數 年月日季選擇);
    函式從日期減去指定的時間間隔。

select DATE_ADD(CURDATE(),INTERVAL 1 month); -- 下個月的今天
select DATE_ADD(CURDATE(),INTERVAL 1 quarter); -- 下個季度的今天
select date_add(curdate(),interval 1 year); -- 明年的今天
select date_add(curdate(),interval 1 day); -- 明天

select DATE_sub(CURDATE(),INTERVAL 1 month); -- 上個月的今天
select DATE_sub(CURDATE(),INTERVAL 1 quarter); -- 上個季度的今天
select date_sub(curdate(),interval 1 year); -- 去年的今天
select date_sub(curdate(),interval 1 day); -- 昨天

select date_add(curdate(),interval 10 day); -- 10天后
select date_add('2018-1-1',interval 356 day); -- 2018-1-1 356天后是哪一天


-- ==============================================================
datediff()

/*
語法格式:datediff(結束時間,起始時間)
返回起始時間和結束時間之間的天數。
*/
select DATEDIFF('2019-1-4',curdate())
select datediff(curdate(),'2019-1-5')

-- !!!select datediff(CURTIME(),'00:29:10') -- 101錯誤,應該不常用,只用日期就行了
-- 這個具體的時間後邊查查 110 查查為什麼時間不行

-- ==============================================================
date() 
 /*
 語法:date(日期時間表達式)
 提取日期或時間日期表示式中的日期部分。 
*/
select date(curdate());
select date(now());
select date(curtime());  -- 為Null,因為沒有date日期
select date('2018-11-18 00:34:45');

-- ==============================================================
dayofweek(date)
     /*返回date是星期幾(1=星期天,2=星期一,……7=星期六) */
select dayofweek(curdate());

select concat('今天是星期:',dayofweek(now())-1) 'dayofweek';

-- ==============================================================
dayofmonth(date) 
    /*返回date是一月中的第幾天(在1到31範圍內)*/
select DAYOFMONTH(now());
select DAYOFMONTH(CURTIME()); -- 沒日期結果為Null

-- ==============================================================
dayofyear(date) 
    /*返回date是一年中的第幾天(在1到366範圍內)*/
select dayofyear(now());

-- ==============================================================
month(date) 
    /*返回date中的月份數值*/ 
day(date)
     /*返回date中的天數數值*/ 
year(date)
     /*返回date的年份(範圍在1000到9999)*/ 
quarter(date) 
    /*返回date是一年的第幾個季度 */

select month(now());
select day(now());
select year(now());
select quarter(now());

-- ==============================================================
week(date,first)
 /*返回date是一年的第幾周(first預設值0,first取值1表示週一是周的開始,0從週日開始)*/
select week(now(),1);

-- ==============================================================
DATE_FORMAT(date,format) 
   /*根據format字串格式化date值*/
select date_format(now(),'%y=%m=%d=%h=%m=%s');

-- ==============================================================
extract() 
   /*函式用於返回日期/時間的各個部分,比如年、季、月、日、小時、分鐘等等。*/

select extract(year from now());
select extract(month from now());
select extract(day from now());
select extract(quarter from now());
select extract(hour from now());
select extract(minute from now());
select extract(second from now());

-- ==============================================================
timestampdiff() : 計算兩個日期的時間差函式
/*select timestampdiff(年月日季選擇,起始時間,結束時間);*/
select timestampdiff(day,'2017-4-9','2017-8-9');
select datediff('2017-8-9','2017-4-9');

select timestampdiff(year,'2017-4-9','2018-8-9');

-- ==============================================================
last_day() 函式:返回月份中的最後一天
select last_day('2017-7-8');
select last_day(now());

-- ===========================小練習=============================
-- 今天是星期幾
select dayofweek(curdate() - 1);
select dayofweek(curdate()) - 1;  -- 最好用第一種方法,這種方法週日顯示的是0
-- 今天是第幾季度
select quarter(curdate());
-- 本月一共有多少天
select day(last_day(curdate()));
-- 本月的第一天是星期幾
select dayofweek(date_sub(curdate(),interval day(curdate())-1 day)) - 1;
-- 本週的週一是幾號
select date_sub(curdate(),interval dayofweek(curdate()-1)-1 day);  

19、字元函式


-- ==============================================================
concat() 
/*   concat(str1,str2,…)  concat函式可以連線一個或者多個字串
     concat_ws(x,s1,s2,...) 同concat(s1,s2,...)函式,但是每個字串直接要加上x 
*/
select concat('a','b','c');
select concat_ws('*','a','b','c');  -- 添加了分隔符


-- ==============================================================
left(str, length)
/*
     從左開始擷取字串  
     說明:left(被擷取欄位,擷取長度)
*/
select left('abc',2);

-- ==============================================================
right (str , length)
/*
     從右開始擷取字串  
     說明:left(被擷取欄位,擷取長度)
*/
select right('abc',2);


-- ==============================================================
substring
擷取字串 
/*
     substring(str, pos) 從pos位置開始擷取到末尾
     substring(str, pos, length) 從pos位置開始擷取length位字串
     說明:substring(被擷取欄位,從第幾位開始擷取) 
     substring(被擷取欄位,從第幾位開始擷取,擷取長度)
*/
select substring('abcdefg',2);
select substring('abcdefg',2,2);

-- ==============================================================
char_length(s)  
/*
返回字串s的字元數
*/
select char_length('abcdefg');

-- ==============================================================
insert(s1,x,len,s2) 
/*
將字串s2替換s1的x位置開始長度為len的字串
*/
select insert('abcdefg',2,2,'123'); -- 將2位置開始兩位字元替換為123

-- ==============================================================
upper(s) 
/*
upper(s): 將字串s的所有字母變成大寫字母
*/
select upper('abcDEfgH');

-- ==============================================================
lower(s) 
/*
lower(s): 將字串s的所有字母變成小寫字母
*/
select lower('abcDEfgH');

-- ==============================================================
trim(s) : 
/*
去掉字串s開始和結尾處的空格
並不會去除末尾的換行符,所以如果想去除換行符那麼:
	解決方法:
		UPDATE tablename SET field = REPLACE(REPLACE(field, CHAR(10), ''), CHAR(13), '');
		char(10):  換行符
		char(13):  回車符

	MySQL的trim函式沒辦法去掉回車和換行,只能去掉多餘的空格,可以用MySQL的replace函式,解決掉這個問題
	缺點:會把字串中間出現的換行也會替換掉

--100  疑問
	解決:
		UPDATE `tran` 
		SET `status` = '1' 
		WHERE trim( trim( 
		BOTH '\r\n' 
		FROM content ) ) = '我愛你'

		用了兩個trim,這樣的好處是不會替換內容中間的換行和回車,
		只會處理頭尾的空格換行回車,相當於php中trim函式的作用了。 

*/
select trim(' abc ');

reverse(s) : 
/*
將字串s的順序反過來
*/
select reverse('abcdefg');

20、數學函式

abs(1) -- 取絕對值
ceil(x) -- 向上取整
floor(x) -- 向下取整
rand() -- 返回0-1的隨機數,包含0不包含1
pi() -- 返回圓周率(3.141593)
round(x,y) -- 保留x小數點後y位的值,但截斷時要進行四捨五入
truncate(x,y) -- 返回數值x保留到小數點後y位的值(與round最大的區別是不會進行四捨五入)
pow(x,y) 或 power(x,y) -- 返回x的y次方
sqrt(x) -- 返回x的平方根
mod(x,y) -- 返回x除以y以後的餘數

select sqrt(4);
select mod(5.5,3);
select mod(5,2);
select pow(2,4);
select power(2,4);

21、索引(東西還挺多,目前不用看,一般用於提高檢索效能)

/*
  建立索引
  語法:create index 索引名稱 on 表名(欄位名);
        alter table 表名 add index 索引名稱(欄位名);
*/
-- 案例
create index suoyin on t_stu(sid);

/*刪除索引 
  語法: drop index 索引名稱 on 表名;
  */
drop index suoyin on t_stu;
/*檢視索引*/
show index from tblname;

22、檢視

檢視
(
/*
什麼是檢視 
檢視是從一個或多個表中匯出來的表,是一種虛擬存在的表。
檢視就像一個視窗,通過這個視窗可以看到系統專門提供的資料。
這樣,使用者可以不用看到整個資料庫中的資料,而之關心對自己有用的資料。
資料庫中只存放了檢視的定義,而沒有存放檢視中的資料,這些資料存放在原來的表中。
使用檢視查詢資料時,資料庫系統會從原來的表中取出對應的資料。
檢視中的資料依賴於原來表中的資料,一旦表中資料發生改變,顯示在檢視中的資料也會發生改變。
檢視的作用 :
1.使操作簡單化,可以對經常使用的查詢定義一個檢視,使使用者不必為同樣的查詢操作指定條件
2.增加資料的安全性,通過檢視,使用者只能查詢和修改指定的資料。
3.提高表的邏輯獨立性,檢視可以遮蔽原有表結構變化帶來的影響。
建立檢視時不能使用臨時表。
即使表被刪除,檢視定義仍將保留。
定義檢視的查詢不能包含 以下語句:
order by
compute 子句
compute by 子句
into 關鍵字 
*/

/*
  建立檢視
  語法:create view 檢視名稱 as 查詢語句
*/
create view view_a as select s.sid,sname,shuxue,yingyu from t_stu s,t_score r where s.sid=r.sid;


/*查詢檢視
  語法:select * from 檢視名稱;
*/
select * from view_a;

/*刪除檢視 
  語法:drop view 檢視名稱;*/
drop view view_a;

/*向檢視中新增資料
  語法:insert into 檢視名稱(欄位1,欄位2,...) values (值1,值2,....);
  不能新增資料到多個表,因為新增語句涉及到了多個基表
	新增資料的時候,如果涉及的基表除了插入欄位外還有非空沒有預設值欄位,那麼也不會成功
*/
insert into view_a(shuxue) values(66);
SELECT * FROM T_SCORE;

/*向檢視中修改資料
  可以修改單表資料,不能修改多表資料
  update 檢視名稱 set 欄位1=新值1 where 欄位2=值2;
*/
update view_a set shuxue = 100 where sid = 1;
select * from view_a;

/*
  with check option 的使用
  語法:create view 檢視名稱 as 查詢語句  with check option;
  --在建立檢視時,可以使用with check option選項,
  --其作用是限定向檢視新增或修改資料時,新增或修改的資料必須遵照建立檢視時where之後的條件

		1.對於update,有with check option,要保證update後,資料要被檢視查詢出來 
		2.對於delete,有無with check option都一樣 
		4.對於insert,有with check option,要保證insert後,資料要被檢視查詢出來 
		5.對於沒有where 子句的檢視,使用with check option是多餘的
*/
create view view_b as select s.sid,s.sname,r.shuxue,r.yingyu from t_stu s,t_score r with check option;
drop view view_b;


/*修改檢視定義
  語法: alter view 檢視名稱 as 查詢語句
*/
alter view view_b as select * from t_stu with check option;
select * from view_b;