MySQL基礎知識

數據庫概念

數據庫是存放數據的倉庫。它的存儲空間很大,可以存放百萬條、千萬條、上億條數據。但是數據庫并不是隨意地將數據進行存放,是有一定的規則的,否則查詢的效率會很低。當今世界是一個充滿著數據的世界,充斥著大量的數據。即這個互聯網世界就是數據世界。數據的來源有很多,比如出行記錄、消費記錄、瀏覽的網頁發送的消息等等。除了文本類型的數據,圖像、音樂、聲音都是數據。

數據庫是一個按數據結構來存儲和管理數據的計算機軟件系統。數據庫的概念實際包括兩層意思:

(1)數據庫是一個實體,它是能夠合理保管數據的“倉庫”,用戶在該“倉庫”中存放要管理的事務數據,“數據”和“庫”兩個概念結合成為數據庫。

(2)數據庫是數據管理的新方法和技術,它能更合適的組織數據、更方便的維護數據、更嚴密的控制數據和更有效的利用數據。

數據庫類型

1.關系型數據庫

關系型數據庫,存儲的格式可以直觀地反映實體間的關系。關系型數據庫和常見的表格比較相似,關系型數據庫中表與表之間是有很多復雜的關聯關系的。 常見的關系型數據庫有MysqlSqlServer等。在輕量或者小型的應用中,使用不同的關系型數據庫對系統的性能影響不大,但是在構建大型應用時,則需要根據應用的業務需求和性能需求,選擇合適的關系型數據庫。
??關系型數據庫對于結構化數據的處理更合適,如學生成績、地址等,這樣的數據一般情況下需要使用結構化的查詢,例如join,這樣的情況下,關系型數據庫就會比NoSQL數據庫性能更優,而且精確度更高。由于結構化數據的規模不算太大,數據規模的增長通常也是可預期的,所以針對結構化數據使用關系型數據庫更好。關系型數據庫十分注意數據操作的事務性、一致性,如果對這方面的要求關系型數據庫無疑可以很好的滿足。

2.非關系型數據庫(NoSQL)

指的是分布式的、非關系型的、不保證遵循ACID原則的數據存儲系統。NoSQL數據庫技術與CAP理論、一致性哈希算法有密切關系。所謂CAP理論,簡單來說就是一個分布式系統不可能滿足可用性、一致性與分區容錯性這三個要求,一次性滿足兩種要求是該系統的上限。而一致性哈希算則指的是NoSQL數據庫在應用過程中,為滿足工作需求而在通常情況下產生的一種數據算法,該算法能有效解決工作方面的諸多問題但也存在弊端,即工作完成質量會隨著節點的變化而產生波動,當節點過多時,相關工作結果就無法那么準確。這一問題使整個系統的工作效率受到影響,導致整個數據庫系統的數據亂碼與出錯率大大提高,甚至會出現數據節點的內容遷移,產生錯誤的代碼信息。但盡管如此,NoSQL數據庫技術還是具有非常明顯的應用優勢,如數據庫結構相對簡單,在大數據量下的讀寫性能好;能滿足隨時存儲自定義數據格式需求,非常適用于大數據處理工作。
??指的是分布式的、非關系型的、不保證遵循ACID原則的數據存儲系統。NoSQL數據庫技術與CAP理論、一致性哈希算法有密切關系。所謂CAP理論,簡單來說就是一個分布式系統不可能滿足可用性、一致性與分區容錯性這三個要求,一次性滿足兩種要求是該系統的上限。而一致性哈希算則指的是NoSQL數據庫在應用過程中,為滿足工作需求而在通常情況下產生的一種數據算法,該算法能有效解決工作方面的諸多問題但也存在弊端,即工作完成質量會隨著節點的變化而產生波動,當節點過多時,相關工作結果就無法那么準確。這一問題使整個系統的工作效率受到影響,導致整個數據庫系統的數據亂碼與出錯率大大提高,甚至會出現數據節點的內容遷移,產生錯誤的代碼信息。但盡管如此,NoSQL數據庫技術還是具有非常明顯的應用優勢,如數據庫結構相對簡單,在大數據量下的讀寫性能好;能滿足隨時存儲自定義數據格式需求,非常適用于大數據處理工作。

3.分布式數據庫

所謂的分布式數據庫技術,就是結合了數據庫技術與分布式技術的一種結合。具體指的是把那些在地理意義上分散開的各個數據庫節點,但在計算機系統邏輯上又是屬于同一個系統的數據結合起來的一種數據庫技術。既有著數據庫間的協調性也有著數據的分布性。這個系統并不注重系統的集中控制,而是注重每個數據庫節點的自治性,此外為了讓程序員能夠在編寫程序時可以減輕工作量以及系統出錯的可能性,一般都是完全不考慮數據的分布情況,這樣的結果就使得系統數據的分布情況一直保持著透明性。

數據獨立性概念在分布式數據庫管理系統中同樣是十分重要的一環,但是不僅如此,分布式數據管理系統還增加了一個叫分布式透明性的新概念。這個新概念的作用是讓數據進行轉移時使程序正確性不受影響,就像數據并沒有在編寫程序時被分布一樣。

在分布式數據庫里,數據冗雜是一種被需要的特性,這點和一般的集中式數據庫系統不一樣。第一點是為了提高局部的應用性而要在那些被需要的數據庫節點復制數據。第二點是因為如果某個數據庫節點出現系統錯誤,在修復好之前,可以通過操作其他的數據庫節點里復制好的數據來讓系統能夠繼續使用,提高系統的有效性。

數據庫產品排名

  • Oracle - 目前世界上使用最為廣泛的數據庫管理系統,作為一個通用的數據庫系統,它具有完整的數據管理功能;作為一個關系數據庫,它是一個完備關系的產品;作為分布式數據庫,它實現了分布式處理的功能。在Oracle最新的12c版本中,還引入了多承租方架構,使用該架構可輕松部署和管理數據庫云。

  • MySQL - MySQL是開放源代碼的,任何人都可以在GPL(General Public License)的許可下下載并根據個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關注。

  • SQL Server - 由Microsoft開發和推廣的關系型數據庫產品,最初適用于中小企業的數據管理,但是近年來它的應用范圍有所擴展,部分大企業甚至是跨國公司也開始基于它來構建自己的數據管理系統。

  • PostgreSQL - 在BSD許可證下發行的開放源代碼的關系數據庫產品。

  • MongoDB - MongoDB是2009年問世的一個面向文檔的數據庫管理系統,由C++語言編寫,旨在為Web應用提供可擴展的高性能數據存儲解決方案。雖然在劃分類別的時候后,MongoDB被認為是NoSQL的產品,但是它更像一個介于關系數據庫和非關系數據庫之間的產品,在非關系數據庫中它功能最豐富,最像關系數據庫。

  • DB2 - IBM公司開發的、主要運行于Unix(包括IBM自家的AIX)、Linux、以及Windows服務器版等系統的關系數據庫產品。DB2歷史悠久且被認為是最早使用SQL的數據庫產品,它擁有較為強大的商業智能功能。

  • Redis - Redis是一種基于鍵值對的NoSQL數據庫,它提供了對多種數據類型(字符串、哈希、列表、集合、有序集合、位圖等)的支持,能夠滿足很多應用場景的需求。Redis將數據放在內存中,因此讀寫性能是非常驚人的。

  • ElasticSearch - ElasticSearch是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java語言開發的,并作為Apache許可條款下的開放源碼發布,是一種流行的企業級搜索引擎。

對于數據的存儲來說我們應該根據不同的要求來選擇不同的數據庫存儲,這里我們詳細介紹MySQL一些基礎語法和操作。

MySQL是一種關系型數據庫。其特點一般有以下幾點:

  • 理論基礎:集合論和關系代數
  • 具體表象:用二維表組織數據

列 — 字段

行 — 記錄

  • 編程語言:結構化查詢語言(SQL)

SQL(結構化查詢語言)詳解

我們通常可以將SQL分為三類:DDL(數據定義語言)、DML(數據操作語言)和DCL(數據控制語言)

  • DDL - 主要負責創建表、刪除表和修改表,涉及的指令有: create、drop、alter
  • DML - 主要負責數據的增(insert)、刪(delete)、改(update)、查(select)
  • DCL - 通常用于授予權限(grant)和召回權限(revoke)

注意: SQL語句中關鍵字不區分大小寫,并且一條語句結束必須寫分號

1.DDL(數據定義語言)

1.1.創建數據庫

1. create database 數據庫名;     -- 創建指定數據庫;如果該數據庫已經存在會報錯
2. create database if not exists 數據庫名;      -- 當指定數據庫不存在的時候創建數據庫;如果存在就不創建,也不會報錯
3. create database if not EXISTS 數據庫名 default charset utf8;  -- 創建數據庫的時候設置字符集編碼方式為utf8,讓數據庫支持中文數據的存儲

-- 注意: 可以在通過 character-set-server=utf8 來設置MySQL服務啟動時默認使用的字符集

-- 創建school數據庫示例:
CREATE DATABASE IF NOT EXISTS school DEFAULT charset utf8;

1.2刪除數據庫

1. drop database 數據庫名;     -- 刪除指定數據庫;如果該數據庫不存在會報錯
2. DROP DATABASE if EXISTS 數據庫名;    -- 當指定數據庫存在的時候刪除數據庫;如果數據庫不存在不會報錯

-- 刪除school數據庫示例:
DROP DATABASE IF EXISTS school;

1.3使用/切換數據庫

1. use 數據庫名;         -- 切換到指定數據庫


-- 使用school數據庫示例:
USE school;

1.4創建表

1. create table if not exists 表名(字段名1 類型1 約束1 comment 描述1, 字段2 類型2 約束2 comment 描述2,...);
-- 1)表名   - 程序員自己命名,但是一般以t或者tb作為前綴表示表名; 而且要見名知義
-- 2)字段名  - 程序員自己命名,要求見名知義
-- 3)類型   - 類型必須是當前數據庫支持的類型名,mysql中常見的類型有: int(整數), float(小數),char/varchar/text(字符串),bit(布爾),date(日期)
-- 4)約束   - 創建約束:not null - 不為空, default  - 設置默認值, unique - 值唯一, primary key - 主鍵約束 
-- 4.1)主鍵約束  - 主鍵的值可以確定列表中唯一一條記錄(通過一個主鍵值可以找到表中的唯一一條記錄),所以一般每張表都需要設置一個字段為主鍵,主鍵的值也必須是唯一的;一般需要可以通過auto_increment約束讓整型主鍵自動增加
-- 5)comment    -  添加字段說明

-- 創建學生表示例1:
CREATE TABLE IF NOT EXISTS t_student
(
stuid  int not null PRIMARY KEY auto_increment COMMENT '學號',
stu_name  varchar(20) not null COMMENT '姓名',
stuage  int COMMENT '年齡', 
stugender   bit default 1 COMMENT '性別',
stubirth   date COMMENT '生日'
);

-- 創建教師表示例2:
CREATE TABLE IF NOT EXISTS t_teacher
(
teaid int not null auto_increment COMMENT '編號',
teaname  varchar(20) not null COMMENT '姓名',
teaage int comment '年齡',
teatitle varchar(20) DEFAULT '助教' COMMENT '職稱',
PRIMARY KEY (teaid)    -- 主鍵設置可以在后面單獨設置
)

1.5刪除表

1. DROP TABLE if EXISTS 表名;   -- 刪除指定表

-- 刪除教師表示例:
DROP TABLE if EXISTS t_teacher;

1.6修改表

1.6.1添加字段/列

1. alter TABLE 表名 add COLUMN 字段名 字段類型 約束 comment 描述;   -- 在指定表中添加指定字段

-- 給學生表添加地址字段示例:
alter TABLE t_student add COLUMN stuaddr varchar(200) DEFAULT '' COMMENT '家庭住址';

1.6.2刪除字段/列

1. alter TABLE 表名 drop COLUMN 字段名;    -- 刪除指定表中的指定字段

-- 示例:
ALTER TABLE t_student DROP COLUMN stuage;

DML(數據操作語言)

2.1增(添加記錄)

1. insert into 表名 values(值1,值2,值3,...)  -- 按照表中字段的順序依次給每個字段賦值

-- 示例:
insert into t_student values(2,'李四',0,'2017-12-30','成都');


2. insert into 表名(字段1,字段2,字段3,...) values(值1,值2,值3,...);   -- 按指定順序給指定字段賦值

-- 示例:
insert into t_student(stuname, stugender, stubirth,stuaddr) values('夏明',1,'1992-3-12','大連');

-- 一次插入多條記錄  
insert into t_student(stuname, stubirth, stuaddr) values
('小花','1989-10-2','南京'),
('Tom',date(now()),'西安'),
('大黃','2000-1-20','沈陽');


-- 值的問題: sql中是數字對應的值直接寫,字符串需要使用引號引起來,bit類型的值只有0或者1, 時間可以用內容是滿足時間格式字符串也可以是通過時間函數獲取的值
-- 時間函數: now() - 當前時間  date(now()) - 當前日期   year(now()) - 當前年   month(now()) - 當前月 ....

2.2刪(刪除記錄)

1. delete from 表名;  -- 刪除指定表中所有記錄

-- 示例:
delete from t_student;



2. delete from 表名 where 條件語句;    -- 刪除滿足條件的記錄

-- 示例:
delete from t_student where stuid=9;     -- 刪除stuid等于9的記錄
delete from t_student where stuage=18 and stugender=0;    -- 刪除stuage等于18并且stugender等于0的記錄
delete from t_student where stuage in (16,17);    -- 刪除stuage是16和stuage是17的記錄
delete from t_student where stuname like 'stu%';   -- 刪除stuname的值是以stu開頭的記錄
delete from t_student where stuname like '%1';   -- 刪除stuname的值是以1結尾的記錄
delete from t_student where not age=18;      -- 刪除stuage不是18的記錄
delete from t_student where birth is NULL;   -- 刪除stubirth是NULL的記錄

-- 條件語句的寫法
-- 1)比較運算符: =(等于), <>(不等于),>(大于), <(小于),>=(大于等于), <=(小于等于)
-- 2)邏輯運算符: and(并且), or(或者), not(非)
-- 3)是否為空: is null(為空), is not null(不為空)
-- 4)范圍: between x and y(在x到y之間), not between x and y(不在x到y之間)
-- 5)字符串匹配: like 字符串(像, like后面的字符串可以使用%表示任意個任意字符, _表示任意一個字符)
-- 6)指定集合元素: in (值1,值2,...)(結果是集合中的元素)

2.3改(修改數據/記錄)

1. update 表名 set 字段1=新值1, 字段2=新值2,...;      -- 將指定表中所有行的指定列/字段的值賦值為新值

-- 示例:
update t_student set stubirth='1992-3-12';     -- 將所有記錄中的stubirth字段都設置為1992-3-12




2. update 表名 set 字段1=新值1, 字段2=新值2,... where 條件語句;  -- 將表中滿足條件的行中指定字段的值賦值為新值 

-- 示例:
update t_student set stuage=20 where not stuname like 'stu%';  -- 將所有stuname不是stu開頭的記錄的stuage字段設置為20

2.4查(獲取數據)

2.4.1 直接查詢

1. select * from 表名;    -- 獲取指定表中所有行和所有的列(所有數據)

-- 示例:
SELECT * FROM t_student;


-- 映射
2. select 字段名1,字段名2,... from 表名;   -- 獲取指定表中所有行指定的列

-- 示例:
SELECT stuname,stuid FROM t_student; 



3. select * from 表名 where 條件;    -- 獲取指定表中所有滿足條件的行所有列的數據

-- 示例:
SELECT * FROM t_student WHERE stuid>115; 
SELECT stuname,stuage FROM t_student WHERE stuid>115;

2.4.2列重命名

1. select 字段1 as 新字段1, 字段2 as 新字段2,... from 表名; 
-- 注意: 這兒的as可以省略

-- 示例:
select stuname as '姓名', stuage as '年齡' from t_student;

2.4.3對查詢結果重新賦值(一般針對布爾數據)

1. select if(字段名,值1,值2) from 表名;    -- 查詢指定字段,并且判斷字段對應的值是0還是1,如果是1結果為值1,否則為值2
-- 注意: 這兒的if的用法是MySQL專有的
-- MySQL寫法: if(字段, 新值1, 新值2)
-- 通用寫法: case 字段 when 值 then 新值1 else 新值2 end

-- 示例:
select stuname, if(stugender, '男', '女') from t_student;   -- 查詢的時候如果stugender的結果不再是0或者1而是男或者女
select stuname, case stugender when 1 then '男' else '女' end from t_student; -- 查詢的時候如果stugender的結果不再是0或者1而是男或者女

2.4.4對列進行合并

1. select concat(字段1,字段2,...) from 表名;  

-- 示例:
select concat(stuname, stuage) from t_student;    -- 將多個字段的數據合并成一個數據返回
select concat(stuname, stuage) as 'nameage' from t_student;    -- 將多個字段的數據合并成一個數據返回并且為其數據重命名
select concat(stuname, ':', stuid) as 'name_id' from t_student;  

-- 注意: 數字和字符串數據可以合并,bit類型的數據不可以合并

2.4.5模糊查詢-查詢的時候通過like條件來指定查詢對象

-- 示例:
select * from t_student where stu_name like 'stu%' and gender=0;
2.4.6排序(先按之前的任何語法進行查詢在排序)
1. select * from 表名 order by 字段;      -- 對查詢結果按照指定字段的值進行升序排序 
2. select * from 表名 order by 字段 asc;      -- 對查詢結果按照指定字段的值進行升序排序 
3. select * from 表名 order by 字段 desc;      -- 對查詢結果按照指定字段的值進行降序排序

-- 示例:
select * from t_student order by stuage;
select * from t_student order by stuage asc;
select * from t_student order by stuage desc;
select * from t_student order by age asc, gender asc;  -- 對查詢結果先按年齡進行排序;年齡相同的再按性別進行排序

2.4.7去重

1. select distinct 字段 from 表名;   -- 獲取指定字段的值并且去重

-- 示例:
select distinct stuage from t_student;

2.4.8限制和分頁

1. select * from 表名 limit 數量;  -- 值獲取指定數量的查詢結果

-- 示例:
select * from t_student limit 3;    -- 獲取查詢結果的前3條



2. select * from 表名 limit M offset N;   -- 跳過前N條數據獲取M條數據

-- 示例:
select * from t_student limit 3 offset 4;   -- 跳過前4條數據獲取3條數據



3. select * from 表名 limit M,N;   -- 跳過前M條數據獲取N條數據

-- 示例:
select * from t_student limit 3,4;    --  跳過前3條數據獲取4條數據

3.外鍵與E.R圖

。3.1約束管理

3.1.1添加約束

添加普通約束的方式有兩種,一種是創建表的時候直接給字段添加相應的約束,另一種是通過修改表的方式添加約束

1. 創建表的時候添加約束
建表的時候可以在字段類型后面加一個或者多個約束

2.通過添加約束索引的方式添加約束
alter table 表名 add constraint 索引名 約束(字段);
-- 說明: 索引名 - 自己隨便命名;  約束 - 當前想要添加的約束(但是只支持唯一約束、主鍵約束和外鍵約束)

-- 示例:
alter table t_teacher add constraint uni_tel UNIQUE(teatel);                      

3.1.2刪除約束

alter table 表名 drop index 約束索引;

-- 示例:
alter table t_teacher drop index uni_tel;

3.2外鍵約束

1.什么是外鍵:表中的某個字段的值是根據其他表中主鍵的值來確定的。那么這個字段就是外鍵 
1.1 不同類型的外鍵添加方法:
    多對一的外鍵的添加: 將外鍵添加到多的一方對應的表中 
    一對一的外鍵的添加: 將外鍵隨便添加到哪一方,同時添加值唯一約束
    多對多的外鍵的添加: 關系型數據庫中,兩張表沒法實現多多的關系,需要一個中間表。(中間表有兩個外鍵分別參照                      多多的兩個表的主鍵)
1.2 添加外鍵約束語法:
    alter table 表名1 add constraint 外鍵約束索引名 foreign key (字段1) references 表名2 (字段2);
    -- 將表1中的字段1設置為外鍵,并且讓這個外鍵的值參照表2中的字段2
    
1.3 刪除外鍵約束
    alter table 表名 drop foreign key 外鍵索引名;

3.3高級查詢

3.3.1 聚合max()/min()/sum()/avg()/count()

SELECT score FROM tb_score;
SELECT max(score) as max_score FROM tb_score;   -- 獲取tb_score表中字段score的最大值
SELECT min(score) as min_score FROM tb_score;   -- 獲取tb_score表中字段score的最小值
SELECT sum(score) as sum_score FROM tb_score;   -- 獲取tb_score表中字段score的和
SELECT AVG(score) as avg_score FROM tb_score;   -- 獲取tb_score表中字段score的平均值
SELECT COUNT(score) as count_score FROM tb_score WHERE score>80;  -- 統計tb_score表中字段score大于80的個數

3.3.2分組

SELECT 字段操作  FROM 表名 WHERE 條件 GROUP BY(字段2);
-- 將指定表中滿足條件的記錄按照字段2的進行分組(值是一樣的在一個組里面), 然后再講每個分組作為整體按照指定字段進行指定聚合操作
-- 注意:a.字段操作的位置除了分組字段不用聚合,其他字段都必須聚合   b.分組的時候where要放到分組前對需要分組的數據進行篩選

select stuid, avg(score) from tb_score group by(stuid);

-- having: 分組的時候,在分組后用having代替where來對分組后的數據進行篩選
select stuid, max(score) from tb_score group by(stuid) having max(score)>90;
select stuid, avg(score) from tb_score group by(stuid) having avg(score)>80;

3.3.3子查詢

-- 將一個查詢的結果作為另外一個查詢的條件或者查詢對象
-- 第一種子查詢: 將查詢結果作為另外一個查詢的條件

-- 獲取成績大于90分的學生姓名
select stuname from tb_student where stuid in 
(select stuid from tb_score where score>90);

-- 第二種子查詢:將一個查詢的結果作為查詢對象提供給另外一個查詢。但是第一個查詢結果需要重命名 
select score from (SELECT stuid,score from tb_score where score>80) as t2;

3.3.4連接查詢-同時查詢多張表

1. 直接連接
select * from 表名1,表名2,表名3 連接條件 查詢條件;
-- 注意: 如果既有連接條件又有查詢條件,查詢條件必須放在連接條件的后面

-- 查詢所有學生的名字和學院名字
select stuname, collname from tb_student, tb_college where tb_student.colid=tb_college.collid;

2.內連接
SELECT * FROM 表1 inner join 表2 on 表2的連接條件 inner join 表3 on 表3的連接條件 ...;
-- 注意: 中間表寫在最前面(存在關聯其他表外鍵的表)

3.外連接
-- 外連接分為左外連接、右外連接和全連接, 但是在MySQL中支持左外連接和右外連接 
-- 左外連接:將左表中對應字段的所有數據取出,然后再對應的右表中字段的值,如果右表對應的值不存在結果就為null 
-- 右外連接:將右表中對應字段的所有數據取出,然后再對應的左表中字段的值,如果左表對應的值不存在結果就為null 
select * from 表1 left join 表2 on 連接條件;
select * from 表1 right join 表2 on 連接條件;

-- 獲取所有學生的成績
select stuname, score from tb_student left join tb_score on tb_student.stuid=tb_score.sid;

4.DCL(數據控制語言)

DCL主要提供grant和revoke來授權和召回權限

4.1用戶管理

1. 添加用戶
create user 用戶名@登錄地址;    -- 創建數據用戶,登錄不需要密碼
-- 登錄地址 - 限制用戶能夠登錄MySQL的主機地址,可以賦值為: ip地址(指定地址)、localhost(數據庫本機)、%(任何位置)
create user 用戶名@登錄地址 identified by 密碼; -- 創建數據用戶,登錄需要輸入指定密碼密碼

-- 示例:
create user zhangsan@localhost;
create user lisi@localhost identified by '123456';

2. 刪除用戶
drop user 用戶名;
drop user zhangsan;

4.2權限管理

1. 授權
grant 權限類型 on 數據庫.對象 from 用戶名;
-- 常見權限類型: delete(刪除權限), select(查詢權限),update(更新權限),insert(插入權限), all PRIVILEGES(所有權限)

-- 示例:
GRANT SELECT on school.tb_student TO 'zhangshan';
GRANT UPDATE on school.tb_student TO 'zhangshan';
GRANT all PRIVILEGES ON school.* TO 'zhangshan';   -- 添加所有權限


2.召回授權
revoke 權限類型 on 數據庫.對象 from 用戶名;

-- 示例:
REVOKE DELETE on school.* FROM 'zhangshan';
REVOKE all PRIVILEGES on school.* FROM 'zhangshan';
REVOKE all PRIVILEGES on school.* FROM 'zhangshan';
REVOKE SELECT on school.tb_student FROM 'zhangshan';
REVOKE UPDATE on school.tb_student FROM 'zhangshan';

4.3事務

完成一個任務需要執行多條sql,但是要求這多個操作中只要有一個操作失敗,這個任務就失敗,數據全部還原;所有的操作都成功,整個任務才成功的時候就使用事務

-- 開啟事務環境
begin;
需要執行的多個操作對應的sql語句

-- 提交事務(只有begin到commit之間的所有的sql都執行成功,才會執行commit; 否則執行rollback)
COMMIT;
-- 事務回滾(放棄beigin到commit之間執行成功的所有sql語句的結果)
ROLLBACK;

5.視圖

視圖是關系型數據庫中將一組查詢指令構成的結果集組合成可查詢的數據表的對象。簡單的說,視圖就是虛擬的表,但與數據表不同的是,數據表是一種實體結構,而視圖是一種虛擬結構,你也可以將視圖理解為保存在數據庫中被賦予名字的SQL語句。

使用視圖可以獲得以下好處:

  1. 可以將實體數據表隱藏起來,讓外部程序無法得知實際的數據結構,讓訪問者可以使用表的組成部分而不是整個表,降低數據庫被攻擊的風險。
  2. 在大多數的情況下視圖是只讀的(更新視圖的操作通常都有諸多的限制),外部程序無法直接透過視圖修改數據。
  3. 重用SQL語句,將高度復雜的查詢包裝在視圖表中,直接訪問該視圖即可取出需要的數據;也可以將視圖視為數據表進行連接查詢。
  4. 視圖可以返回與實體數據表不同格式的數據,
1. 創建視圖
create view 視圖名 as sql查詢語句;

-- 示例:
create view vw_student
as SELECT * FROM tb_student;
2. 使用視圖  - 視圖在用的時候可以直接當成表來使用

-- 示例:
select * FROM vw_student;

select stuname, collname from vw_student, tb_college where vw_student.colid=tb_college.collid;

6.索引

索引相當于書本的目錄,為表創建索引可以加速查詢(用空間換時間)。

索引雖然很好,但是不能濫用:

  • 索引會占用額外的空間

  • 索引會讓增刪改變得更慢

如果哪個列經常被用于查詢的篩選條件那么就應該在這個列上建立索引。

主鍵上有默認索引(唯一索引)

1. 創建索引
-- 如果使用模糊查詢,查詢條件不以%開頭,那么索引有效
-- 如果使用模糊查詢,查詢條件以%開頭,那么索引無效(盡量避免)
create index 索引名 on 表名 (字段);    -- 給指定表的指定字段添加索引
create unique index 索引名 on 表名 (字段);  -- 給指定表的指定字段添加唯一索引

-- 示例:
create index idx_stuname on tb_student(stuname);
create unique index idx_stuname on tb_student(stuname);


2. 刪除索引
alter table 表名 drop index 索引名;      -- 刪除指定索引,唯一索引也是這樣刪

-- 示例: 
alter table tb_student drop index idx_stuname;


注意: 可以通過explain來查看sql的執行計劃
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第三章 數據庫系統 3.1 數據庫管理系統的類型 通常有多個分類標準。如按數據模型分類、按用戶數分類、按數據庫分布...
    步積閱讀 2,759評論 0 7
  • 主鍵 超鍵 候選鍵 外鍵主 鍵: 數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有...
    Juntech閱讀 202評論 0 0
  • 基礎模塊 1. MySQL執行一條查詢語句的內部執行過程 客戶端先通過連接器連接到MySQL服務器; 連接器權限驗...
    Yangzhe12閱讀 258評論 0 0
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發此異常。 O...
    我想起個好名字閱讀 5,407評論 0 9
  • MySQL 一、數據庫簡單介紹 按照數據庫的發展時間順序,主要出現了以下類型數據庫系統: 上面4中數據庫系統中,關...
    不知歲月惜閱讀 266評論 0 0