SQL基礎-更新&刪除&視圖


一、更新數據

1、更新數據

###
更新全部數據:
    使用UPDATE關鍵字。語法如下:
    UPDATE 表名 SET 字段名=新的值;

比如:
    更新學生表中的所有學生性別為男:

    UPDATE student SET gender = '';


###
更新部分數據:
    使用UPDATE關鍵字。語法如下:
    UPDATE 表名 SET 字段名=新的值 WHERE 限定條件;

比如:
    更新學生方東美的性別為女:
    UPDATE student SET gender = '' WHERE student_name = '方東美';



###
更新部分數據的多個字段:
    使用UPDATE關鍵字。語法如下:

    UPDATE 表名
    SET 字段名1=新的值1,字段名2=新的值2,…
    WHERE 限定條件;

比如:
    更新學生方東美的性別為女,分數為85.50UPDATE student 
    SET gender = '',score = 85.50
    WHERE student_name = '方東美';



建議在更新、刪除數據時,加上where,避免更新或刪除全表數據;


mysql中:
    mysql -U  可以限制update和delete必須加上where限制條件,如果更新和刪除數據不添加where限制條件,就會報錯;
    
    可以設置別名,命令:alias mysql='mysql -U'

    也可以開啟安全模式:
          set sql_safe_updates=1;         //安全模式打開狀態
          set sql_safe_updates=0;         //安全模式關閉狀態


2、根據其他表更新數據

根據其他表更新數據:
    使用UPDATE關鍵字。語法如下:
    UPDATE 表名
    SET 字段名=(子查詢)
    [ WHERE 限定條件 ];

比如:
    在學生表中添加老師姓名字段,並使用老師表中的數據進行更新:

    alter table student add column teacher_name varchar(30);

    UPDATE student a
    SET teacher_name = ( SELECT b.teacher_name
    FROM teacher b 
    WHERE a.teacher_id = b.teacher_id);


二、刪除數據

1、刪除全部表數據

刪除全部數據:
    使用DELETE關鍵字。

語法如下:
    DELETE FROM 表名;

比如,刪除學生表中的數據,使用如下語句:
    DELETE FROM student;


2、刪除部分數據

刪除部分數據:
    使用DELETE關鍵字。

語法如下:
    DELETE FROM 表名 WHERE 篩選條件;

比如,刪除學生表方東美的數據,使用如下語句:
    DELETE FROM student WHERE student_name = '方東美';


3、根據其他表刪除數據

根據其他表刪除數據:
    使用DELETE關鍵字。

語法如下:
    DELETE FROM 表名 WHERE 子查詢;

比如,刪除學生表中老師姓名為NULL的數據,使用如下語句:
    DELETE FROM student
    WHERE teacher_id in ( SELECT teacher_id
    FROM teacher 
    WHERE teacher_name IS NULL );


三、視圖

1、建表

###
teacher表;
CREATE TABLE `teacher` (
  `teacher_id` varchar(255) DEFAULT NULL COMMENT '老師編號',
  `teacher_name` varchar(255) DEFAULT NULL COMMENT '老師姓名',
  `gender` varchar(255) DEFAULT NULL COMMENT '性別'
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='老師';

INSERT INTO `teacher` VALUES ('T0001','高齊妍',''),('T0002','李紅',''),
('T0003','李一萱',NULL),('T0004','劉金霞',''),('T0005','劉思哲',''),
('T0006','劉兆祥',''),('T0007','劉哲宇',''),('T0008','梅藝涵',''),
('T0009','梅姿君',''),('T0010','牛雨',''),('T0011','牛光瀅',''),
('T0012','黃雅',''),('T0013','任筱',''),('T0014','吳靜婷',''),
('T0015','習芸潁',''),('T0016','葉惠燕',''),('T0017','周純',''),
('T0018','周聖傑',''),('T0019','方焓',''),('T0020','方傑萍','');



###
student表:
CREATE TABLE `student` (
  `student_id` varchar(50) NOT NULL COMMENT '學生編號',
  `student_name` varchar(100) NOT NULL DEFAULT '' COMMENT '學生姓名',
  `gender` varchar(10) NOT NULL DEFAULT '' COMMENT '性別',
  `birth_day` date NOT NULL COMMENT '生日',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '年齡',
  `class_id` varchar(50) NOT NULL DEFAULT '' COMMENT '班級編號',
  `score` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '數學成績',
  `teacher_id` varchar(20) DEFAULT NULL COMMENT '老師編號'
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='學生';

INSERT INTO `student` VALUES 
('S20180001','方東美','','2006-02-04',12,'G0101',80.65,'T0003'),
('S20180002','方香','','2008-09-28',10,'G0101',75.48,NULL),
('S20180003','高紫菡','','2006-07-22',12,'G0101',74.46,'T0003'),
('S20180004','胡未遲','','2007-07-25',11,'G0101',51.27,'T0003'),
('S20180005','李詠頤','','2007-03-16',11,'G0101',88.84,'T0003'),
('S20180006','吳灝瀟','','2008-04-19',10,'G0101',69.93,NULL),
('S20180007','吳明鴻','','2007-11-18',11,'G0101',63.65,'T0003'),
('S20180008','吳鵬宇','','2007-08-24',11,'G0101',84.69,'T0003'),
('S20180009','吳少雄','','2007-08-04',11,'G0101',76.36,'T0003'),
('S20180010','習芬飄','','2005-01-27',13,'G0101',83.42,'T0003'),
('S20180011','俞倚琳','','2007-07-07',11,'G0101',97.38,'T0003'),
('S20180012','張瓊雪','','2006-06-12',12,'G0101',81.01,'T0003'),
('S20180013','陳順軍','','2006-09-12',12,'G0102',91.13,'T0004'),
('S20180014','方浩傑','','2008-03-29',10,'G0102',79.46,NULL),
('S20180015','方靜雅','','2007-01-27',11,'G0102',54.99,'T0004'),
('S20180016','胡博涵','','2008-08-11',10,'G0102',50.32,NULL);


student表數據很多,這里只寫出一部分;


2、視圖簡介

比如:查詢學生信息時,同時查詢出老師姓名:
SELECT 
a.*,b.teacher_name
FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id;

思考:如果有很多地方都需要按上面的邏輯查詢,那LEFT JOIN的腳本就需要寫
很多遍,有沒有一種簡寫的方式?

---視圖


3、創建視圖

創建視圖:
    使用CREATE VIEW關鍵字。

語法如下:
    CREATE VIEW 視圖名
    AS
    SELECT子句;

比如,查詢學生信息時,同時查詢出老師姓名:
    CREATE VIEW v_student
    AS
    SELECT 
    a.*,b.teacher_name
    FROM student a
    LEFT JOIN teacher b
    ON a.teacher_id = b.teacher_id;


查詢視圖:
    與查詢表一樣,使用SELECT子句。

比如,查詢學生信息時,同時查詢出老師姓名:
    SELECT * FROM v_student;

    SELECT student_id,student_name,teacher_id,teacher_name from v_student;

    SELECT * FROM v_student WHERE teacher_id = 'T0003';


4、視圖的嵌套

比如:
    查詢所有考試及格的學生信息

CREATE VIEW v_student_nesting
AS
SELECT * FROM v_student
WHERE score >= 60;

select * from v_student_score;


5、視圖與表的區別

1.視圖是已經編譯好了的sql,表不是

2.視圖沒有實際的物理存儲記錄,表有

3.視圖是邏輯概念,表可以進行修改

5.表是內模式,視圖是外模式

6.視圖是我們查看表的方法,視圖不讓用戶接觸數據表,用戶也就不知道表結構

7.表屬於全局模式中的表,是實表,視圖屬於局部模式的表,是虛表。

8.視圖建立、刪除只影響視圖本身,不影響表

9、視圖適合查詢,不適合增、刪、改,表可以增、刪、改、查;


6、視圖常見的使用場景

###
場景一:僅提供需要的數據;

比如:只想查詢學生編號、學生姓名、分數三個字段的信息:
    CREATE VIEW v_student1
    AS
    SELECT 
    a.student_id,a.student_name,a.score
    FROM student a;


###
場景二:對特定的用戶僅開放特定的數據,達到保護敏感數據的目的,提升了數據安全性;

比如:只想將學生編號、學生姓名、分數三個字段的信息暴露給用戶u_read:
    GRANT SELECT ON v_student1 TO u_read@localhost;


###
場景三:僅篩選需要的數據

比如:只查詢成績及格的學生信息:
    CREATE VIEW v_student3
    AS
    SELECT 
    *
    FROM student a
    WHERE a.score >= 60;


###
場景四:簡化復雜的操作

比如:在應用的多個地方,都需要查詢學生信息時,同時查詢出老師姓名:
    CREATE VIEW v_student4
    AS
    SELECT 
    a.*,b.teacher_name
    FROM student a
    LEFT JOIN teacher b
    ON a.teacher_id = b.teacher_id;
    SELECT * FROM v_student4;


###
場景五:重新格式化出新的字段

比如:查詢學生出生日期,年月日單獨一個字段展示:
    CREATE VIEW v_student5
    AS
    SELECT 
    a.student_id,a.student_name,
    year(a.birth_day) birth_year,
    month(a.birth_day) birth_month,
    day(a.birth_day) birth_day
    FROM student a;


###

場景六:使用計算表達式生成新的字段

必須要對新產生的字段給出字段名,否則可能會報錯。

比如:考試總分100分,查詢所有學生做錯的題目的分數:
    CREATE VIEW v_student6
    AS
    SELECT 
    a.student_id,a.student_name,
    a.score,100 - a.score as 'wrong_score'
    FROM student a;


###
場景七:屏蔽底層實現邏輯及頻繁的變更

比如:考試總分100分,查詢所有學生做錯的題目的分數:
    CREATE VIEW v_student7
    AS
    SELECT 
    a.student_id,a.student_name,
    a.score,100 - a.score as 'wrong_score'
    FROM student a;


###
場景八:合並多個分離的子表

比如:假如有3個學校,每個學校的學生數據在各自的表中,如何一次性查詢所有學生的信息:
    CREATE VIEW v_student8
    AS
    SELECT * FROM student1
    UNION ALL
    SELECT * FROM student2
    UNION ALL
    SELECT * FROM student3;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM