MySQL 最全總結
阿新 • • 發佈:2018-11-19
原始碼: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;