Mysql得複習之路部分

Mysql 1000行總結整理,轉載

複習之路如下所示,希望能幫助到需要的小夥伴,程序員之路,我們要互幫互助

一、爲什麼要學習數據庫
二、數據庫的相關概念      
	DBMS、DB、SQL
三、數據庫存儲數據的特點
四、初始MySQL
	MySQL產品的介紹        
	MySQL產品的安裝          ★        
	MySQL服務的啓動和停止     ★
	MySQL服務的登錄和退出     ★      
	MySQL的常見命令和語法規範  
五、DDL語言的學習  
	庫和表的管理	 √				
	常見數據類型介紹  √          
	常見約束  	  √	
六、DML語言的學習    ★             
	插入語句						
	修改語句						
	刪除語句			
七、DQL語言的學習   ★              
	基礎查詢        ★             
	條件查詢  	   ★			
	排序查詢  	   ★				
	常見函數        ★               
	分組函數        ★              
	分組查詢		   ★			
	連接查詢	 	★			
	子查詢       √                  
	分頁查詢       ★              
	union聯合查詢	√						
八、DCL語言的學習
	事務和事務處理	√
	用戶權限管理        √         
九、視圖的講解           √
十一、索引的講解         √                    
十二、存儲過程和函數   
十三、流程控制結構 

爲什麼要學習數據庫

數據持久化可以使用文件存儲,表格、csv存儲等,但是
涉及到大量數據得時候檢索、修改,卻又、維護和管理都及其不方便

數據庫的好處

1.持久化數據到本地
2.可以實現結構化存儲、查詢,方便數據得增刪改查和管理

數據庫相關概念(什麼是數據庫)

1、DB(Database):數據庫<存儲數據得倉庫>, 保存數據的容器
2、DBMS(Database Managermentt System):數據庫管理系統,
又稱爲數據庫軟件(產品),數據庫是通過DBMS創建和操作得
容器,用於管理DB中的數據
常見得數據庫管理系統:Mysql、Oracle、sql servcer等
3、SQL(Structured Query Language):結構化查詢語言,
用於和DBMS通信的語言
	- 不是某個特定的數據庫供應商專有得語言,幾乎所有
	得DBMS都支持SQL
	- 是一門簡單易學得語言,可以對數據庫進行復雜、高
	級得操作

數據庫存儲數據的特點

1、將數據放到表中,表再放到庫中
2、一個數據庫中可以有多個表,每個表都有一個的名字,
用來標識自己。表名具有唯一性。
3、表具有一些特性,這些特性定義了數據在表中如何存
儲,類似java中 “類”的設計。
4、表由列組成,我們也稱爲字段。所有表都是由一個或
多個列組成的,每一列類似java 中的”屬性”
5、表中的數據是按行存儲的,每一行類似於java中的“對象”。

MySQL產品的介紹和安裝

MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB公司
開發,目前屬於Oracle公司。 
MySQL是一種關聯數據庫管理系統,將數據保存在不同的表
中,而不是將所有數據放在一個大倉庫內,這樣就增加了速
度並提高了靈活性。
- Mysql是開源的,所以你不需要支付額外的費用。
- Mysql是可以定製的,你可以修改源碼來開發自己的Mysql系統。 
- MySQL使用標準的SQL數據語言形式。
- Mysql可以允許於多個系統上,並且支持多種語言。這些編程語言
包括C、C++、Python、Java、Perl、PHP等。
- MySQL支持大型數據庫,支持5000萬條記錄的數據倉庫,32位
系統表文件最大可支持4GB,64位系統支持最大的表文件爲8TB。

按照Windowns安裝流程,安裝mysql之後,就可以啓動mysql,和連接mysql客戶端

MySQL服務的啓動和停止

方式一:計算機——右擊管理——服務
方式二:通過管理員身份運行
net start 服務名(啓動服務)
net stop 服務名(停止服務)

MySQL服務的登錄和退出

通過windows自帶的CMD客戶端
登錄:
mysql 【-h主機名 -P端口號 】-u用戶名 -p密碼

退出:
exit
或quit
或ctrl+C

注意: windowns下連接mysql客戶端出現
’mysql’ 不是內部或外部命令,也不是可運行的程序 或批處理文件。提示進行如下步驟:

設置一下環境變量:
    1.右擊我的電腦——>屬性——>高級系統設置——>環境變量
    ——>系統變量——>Path裏添加"C:\Program Files\MySQL\
    MySQL Server 5.7\bin"<就是mysql得安裝目錄>,實際上就
    是mysql.exe的文件夾。添加完後,確定就好。
	2.CMD運行,在次嘗試連接mysql客戶端

MySQL的常見命令

1.查看當前所有的數據庫
show databases;
2.打開指定的庫
use 庫名
select database(); 查看當前所再得數據庫
3.查看當前庫的所有表
show tables;
4.查看其它庫的所有表
show tables from 庫名;
5.創建表
create table 表名(

	列名 列類型,
	列名 列類型,
	.....
);
6.查看錶結構
desc 表名;
7.查看數據庫得創建語句
show create database 數據庫名稱

8.查看mysql的版本
方式一:登錄到mysql服務端
select version();
方式二:沒有登錄到mysql服務端
mysql --version
或
mysql --V

MySQL的語法規範

1.不區分大小寫,但建議關鍵字大寫,表名、列名小寫
2.每條命令用分號結尾或者\g
3.每條命令根據需要,可以進行縮進 或換行
4.字段得名稱不要太長,不要包含空格
5.數據庫中得字段名不要和數據庫系統得某些關鍵字衝突
6.註釋
	單行註釋:#註釋文字
	單行註釋:-- 註釋文字
	多行註釋:/* 註釋文字  */

SQL的語言分類

DDL(Data Define Languge):數據定義語言
	create、drop、alter,定義數據庫
DML (Data Manipulate Language):數據操作語言
	insert 、update、delete、select
   - DQL(Data Query Language):數據查詢語言
	 select
DCL(Data Control Language):數據庫控制語言,
權限、事務等控制語句
	- TCL(Transaction Control Language):事務控制語言
	commit、rollback

DDL語句 庫和表的管理

庫的管理:
    (1) 查看數據庫
	show databases;
	(2) 創建庫
	create database 庫名;
    (3) 查看數據庫得創建語句
	show create database 庫名;
	(4) 切換數據庫
	use 庫名;
    (5) 查看當前所在得數據庫
    select database();
    (6) 查看數據庫下得table
    show tables from 庫名;
    show tables;
	(7) 刪除庫
	drop database 庫名;
表的管理、操作:
常數據類型

整型:

int 4字節、bigint	8字節
例如:
id int(8) => int(11)
int(M):指的是寬度,如果單獨使用沒有意義,需要配合使用
id int(8) zerofill unsigned:   1 -> 00000001

小數:

float,double
可以指定寬度和精度
double(M,D)
例如:double(5,2) 存儲得範圍是-999.99~999.99

字符型:

char(M)    定長字符串,速度快,但浪費空間
varchar(M) 變長字符串,速度慢,但節省空間

M表示能存儲的最大長度,此長度是字符數,非字節數。
不同的編碼,所佔用的空間不同。

char,最多255個字符,與編碼無關。
varchar,最多65535字符,與編碼有關。

text 在定義時,不需要定義長度,也不會計算總長度。
text 類型在定義時,不可給default值

日期型:

一般用整型保存時間戳,因爲PHP可以很方便的將時間戳進行格式化。
datetime    8字節    日期及時間     1000-01-01 00:00:00 到 9999-12-31 23:59:59
date        3字節    日期         1000-01-01 到 9999-12-31
timestamp   4字節    時間戳        19700101000000 到 2038-01-19 03:14:07
time        3字節    時間         -838:59:59 到 838:59:59
year        1字節    年份         1901 - 2155

null:

所有類型都可以爲null(判斷null得值,isnull或者is not null)

其他類型:

-- 枚舉(enum) ----------
	enum(val1, val2, val3...)
	ALTER TABLE class23_student MODIFY gender enum("1","2");
	INSERT INTO class23_student (my_name,gender) VALUES("wnagwu","1");
-- 集合(set) ----------
set(val1, val2, val3...)
    create table tab ( gender set('男', '女', '無') );
    insert into tab values ('男, 女');
常見約束
1. PRIMARY 主鍵
    - 能唯一標識記錄的字段,可以作爲主鍵。
    - 一個表只能有一個主鍵(單列、複合主鍵)。
    - 主鍵具有唯一性,主鍵字段的值不能爲null。
    - 聲明字段時,用 primary key 標識。
        也可以在字段列表之後聲明
            例:create table tab ( id int, stu varchar(10), primary key (id));
    - 主鍵可以由多個字段共同組成。此時需要在字段列表後聲明的方法。
            例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age));  
        
2. UNIQUE 唯一索引(唯一約束)
	 - 使得某字段的值必須唯一,不能重複。
	 - 可以爲空
	 - 一個表可以有多個唯一鍵 (單列,複合唯一)
	 
3. NULL 約束
    - null不是數據類型,是列的一個屬性。
    - 表示當前列是否可以爲null,表示什麼都沒有。
    - null, 允許爲空。默認。
    - not null, 不允許爲空。
    insert into tab values (null, 'val');
        -- 此時表示將第一個字段的值設爲null, 取決於該字段是否允許爲null

4. DEFAULT 默認值屬性
	當前字段的默認值。
    create table tab ( add_time timestamp default current_timestamp );
    -- 表示將當前時間的時間戳設爲默認值。
    current_date, current_time

5. AUTO_INCREMENT 自動增長約束
    - 自動增長必須爲索引(主鍵或unique)
    - 只能存在一個字段爲自動增長(int)。
    - 默認爲1開始自動增長。
    可以通過表屬性 auto_increment = x進行設置,
    或 alter table 表名 auto_increment = x;
    
6. COMMENT 註釋
	例:create table 表名 ( 字段名 類型 ) comment '註釋內容';

7. FOREIGN KEY 外鍵約束
	用於限制主表與從表數據完整性。
	alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id);
    -- 將表t1的t1_id外鍵關聯到表t2的id字段。
    -- 每個外鍵都有一個名字,可以通過 constraint 指定

	存在外鍵的表,稱之爲從表(子表),外鍵指向的表,稱之爲主表(父表)。
    作用:保持數據一致性,完整性,主要目的是控制存儲在外鍵表(從表)中的數據。

    MySQL中,可以對InnoDB引擎使用外鍵約束:
    語法:
    foreign key (外鍵字段) references 主表名 (關聯字段) [主表記錄刪除時的動作] [主表記錄更新時的動作]
    此時需要檢測一個從表的外鍵需要約束爲主表的已存在的值。外鍵在沒有關聯的情況下,可以設置爲null.前提是該外鍵列,沒有not null。

    可以不指定主表記錄更改或更新時的動作,那麼此時主表的操作被拒絕。
    如果指定了 on update 或 on delete:在刪除或更新時,有如下幾個操作可以選擇:
    1. cascade,級聯操作。主表數據被更新(主鍵值更新),從表也被更新(外鍵值更新)。主表記錄被刪除,從表相關記錄也被刪除。
    2. set null,設置爲null。主表數據被更新(主鍵值更新),從表的外鍵被設置爲null。主表記錄被刪除,從表相關記錄外鍵被設置成null。但注意,要求該外鍵列,沒有not null屬性約束。
    3. restrict,拒絕父表刪除和更新。

    注意,外鍵只被InnoDB存儲引擎所支持。其他引擎是不支持的。

表操作

1.創建表
	CREATE TABLE
	IF NOT EXISTS student (
		id INT,
		NAME VARCHAR (20),
		age INT,
		salary DOUBLE (5, 1),
		gender CHAR (4),
		birthday DATE
	);	
2.查看錶結構
	DESC 表名稱;
	DESC student;
3.修改表結構-新增一列
	alter table 表名稱 add 字段名 數據類型 [after 字段名 | first]
	ALTER TABLE student ADD address VARCHAR(25);
	ALTER TABLE student ADD phone VARCHAR(11) AFTER name;
4.修改表結構:刪除一列
	ALTER TABLE 表名 DROP 字段名;
	ALTER TABLE student DROP phone;
5.修改表結構:修改列得類型和位置等
	alter table 表名稱 modify 字段名 數據類型 [after 字段名 | first]
	ALTER TABLE student MODIFY birthday DATETIME;
	ALTER TABLE student MODIFY birthday DATETIME FIRST;
6.修改表結構:修改列得名稱
   ALTER TABLE 表明 CHANGE 舊字段名 新字段名 數據類型 [AFTER 字段名 | FIRST]
   ALTER TABLE student CHANGE name my_name CHAR(20) FIRST;
8.修改表名稱
    ALTER TABLE 表名稱 RENAME TO 新名稱;
	ALTER TABLE student RENAME TO class22_student;
9.刪除表(刪除表結構和數據)
	DROP TABLE IF EXISTS 表名;
	DROP TABLE class22_student;
10.複製表結構
   CREATE TABLE 表名 LIKE 要複製的表名
   CREATE TABLE class23_student LIKE class22_student;
11.複製表結構和數據
   CREATE TABLE 表名 SELECT * FROM 要複製的表名
   CREATE TABLE class24_student SELECT my_name,age FROM class22_student;

DML語言

1.添加數據

特點:

1、字段類型和值類型一致或兼容,而且一一對應
2、可以爲空的字段,可以不用插入值,或用null填充
3、不可以爲空的字段,必須插入值
4、字段個數和值的個數必須一致
5、字段可以省略,但默認所有字段,並且順序和表中的存儲順序一致

1.1 INSERT INTO 表名稱 VALUES(值列); 全列插入
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| my_name  | char(20)    | YES  |     | NULL    |       |
| birthday | datetime    | YES  |     | NULL    |       |
| id       | int(11)     | YES  |     | NULL    |       |
| phone    | varchar(11) | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| salary   | double(5,1) | YES  |     | NULL    |       |
| gender   | char(4)     | YES  |     | NULL    |       |
| address  | varchar(25) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

INSERT INTO class22_student
VALUES
	(
		"王武",
		"1999-09-08 12:12:12",
		2,
		"11111111111",
		20,
		2000.1,
		"男",
		"慶豐包子鋪"
	);
1.2 INSERT INTO 表名(列名,列名) VALUES(值,值); 部分插入
	INSERT INTO class22_student (my_name, id)
	VALUES
		("趙六", 3);
1.3 INSERT INTO 表名(列名,列名) VALUES(值,值); 多行插入	
	INSERT INTO class22_student (my_name, id)
	VALUES
		("趙六", 4),
		("趙六", 5),
		("趙六", 6),
		("趙六", 7);
2.修改數據
修改單表語法:
	UPDATE 表名稱 SET 字段名=字段值,字段名=字段值 [WHERE 條件];
樣例
	UPDATE class22_student SET gender="男";
	UPDATE class22_student SET gender="男",age=20 WHERE id=4;
3.刪除數據
方式1:delete語句 
刪除數據語法:
	DELETE FROM 表名 [WHERE 條件]
樣例:
	DELETE FROM class22_student;
	DELETE FROM class22_student where id=3;
方式2:truncate語句
	刪除數據語法:
		truncate table 表名;
	樣例:
		truncate table class22_student;

兩種方式的區別【面試題】

1.truncate不能加where條件,而delete可以加where條件
2.truncate的效率高一丟丟
3.truncate 刪除帶自增長的列的表後,如果再插入數據,數據從1開始
delete 刪除帶自增長列的表後,如果再插入數據,數據從上一次的斷點處開始
4.truncate刪除不能回滾,delete刪除可以回滾
4.查看數據
4.1 查看所有數據
SELECT * FROM 表名;
SELECT * FROM class22_student;
4.2 查看部分列
SELECT 列,列,... FROM 表名;
SELECT my_name,age,phone FROM class22_student;
4.3 簡單條件查詢
SELECT * FROM WHERE 條件;
SELECT * FROM class22_student where id>4;
SELECT 列,列,... FROM 表名 WHERE 條件;
SELECT my_name,age,phone FROM class22_student where age=20;
4.4 對字段起別名
SELECT 列 as 別名,列 as 別名,... FROM 表名 WHERE 條件;
SELECT my_name as "姓名",age as "年齡",phone as "電話" FROM class22_student where age=20;

DQL語言的學習

進階1:基礎查詢

語法:
SELECT 查詢列表 FROM 表名;

類似於Java中 :System.out.println(要打印的東西);
特點:
①通過select查詢完的結果 ,是一個虛擬的表格(虛表),不是真實存在
② 要查詢列表 可以是字段、常量值、表達式、函數

USE myemployees;
#1.查詢表中得單個字段
SELECT last_name FROM employees;

#2.查詢多個字段
SELECT last_name,salary,email FROM employees;

#3.查詢表中得所有字段
SELECT	* FROM employees;

#查詢常量值
SELECT 100;

#查詢表達式
SELECT 100%8;

#查詢函數
SELECT VERSION();
SELECT DATABASE();

#7.字段別名
/*
1.簡化
2.多表查訊時字段相同,可以使用別名取分)
*/
SELECT last_name as l_n FROM employees;
SELECT last_name l_n FROM employees;
SELECT last_name as "last name" FROM employees;

#8.字段去重
#查詢員工表中涉及到得所有得部門編號
SELECT	department_id FROM employees;
SELECT DISTINCT department_id FROM employees;

#9.+號得作用(僅僅時運算符,完成相加得功能)
#10.sql中多個字符串完成拼接
SELECT CONCAT(last_name," ",first_name) as name FROM employees;

進階2:條件查詢

條件查詢:根據條件過濾原始表的數據,查詢到想要的數據
語法:
select 
	要查詢的字段|表達式|常量值|函數
from 
	表
where 
	條件 ;

分類:
一、條件表達式
	示例:salary>10000
	條件運算符:
	> < >= <= = != <>

二、邏輯表達式
示例:salary>10000 && salary<20000

邏輯運算符:

	and(&&):兩個條件如果同時成立,結果爲true,否則爲false
	or(||):兩個條件只要有一個成立,結果爲true,否則爲false
	not(!):如果條件成立,則not後爲false,否則爲true

三、模糊查詢
示例:last_name like 'a%'

進階3:排序查詢

語法:
select
	要查詢的東西
from
	表
where 
	條件

order by 排序的字段|表達式|函數|別名 【asc|desc】

進階4:常見函數

一、單行函數
1、字符函數
	concat拼接
	substr截取子串
	upper轉換成大寫
	lower轉換成小寫
	trim去前後指定的空格和字符
	ltrim去左邊空格
	rtrim去右邊空格
	replace替換
	lpad左填充
	rpad右填充
	instr返回子串第一次出現的索引
	length 獲取字節個數
	
2、數學函數
	round 四捨五入
	rand 隨機數
	floor向下取整
	ceil向上取整
	mod取餘
	truncate截斷
3、日期函數
	now當前系統日期+時間
	curdate當前系統日期
	curtime當前系統時間
	str_to_date 將字符轉換成日期
	date_format將日期轉換成字符
4、流程控制函數
	if 處理雙分支
	case語句 處理多分支
		情況1:處理等值判斷
		情況2:處理條件判斷
	
5、其他函數
	version版本
	database當前庫
	user當前連接用戶

二、分組函數

	sum 求和
	max 最大值
	min 最小值
	avg 平均值
	count 計數

	特點:
	1、以上五個分組函數都忽略null值,除了count(*)
	2、sum和avg一般用於處理數值型
		max、min、count可以處理任何數據類型
    3、都可以搭配distinct使用,用於統計去重後的結果
	4、count的參數可以支持:
		字段、*、常量值,一般放1

	   建議使用 count(*)

##進階5:分組查詢
語法:
select 查詢的字段,分組函數
from 表
group by 分組的字段

特點:
1、可以按單個字段分組
2、和分組函數一同查詢的字段最好是分組後的字段
3、分組篩選
		針對的表	位置			關鍵字
分組前篩選:	原始表		group by的前面		where
分組後篩選:	分組後的結果集	group by的後面		having

4、可以按多個字段分組,字段之間用逗號隔開
5、可以支持排序
6、having後可以支持別名

進階6:多表連接查詢

笛卡爾乘積:如果連接條件省略或無效則會出現
解決辦法:添加上連接條件

一、傳統模式下的連接 :等值連接——非等值連接

1.等值連接的結果 = 多個表的交集
2.n表連接,至少需要n-1個連接條件
3.多個表不分主次,沒有順序要求
4.一般爲表起別名,提高閱讀性和性能

二、sql99語法:通過join關鍵字實現連接

含義:1999年推出的sql語法
支持:
等值連接、非等值連接 (內連接)
外連接
交叉連接

語法:

select 字段,...
from 表1
【inner|left outer|right outer|cross】join 表2 on  連接條件
【inner|left outer|right outer|cross】join 表3 on  連接條件
【where 篩選條件】
【group by 分組字段】
【having 分組後的篩選條件】
【order by 排序的字段或表達式】

好處:語句上,連接條件和篩選條件實現了分離,簡潔明瞭!

三、自連接

案例:查詢員工名和直接上級的名稱

sql99

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;

sql92

SELECT e.last_name,m.last_name
FROM employees e,employees m 
WHERE e.`manager_id`=m.`employee_id`;

##進階7:子查詢

含義:

一條查詢語句中又嵌套了另一條完整的select語句,其中被嵌套的select語句,稱爲子查詢或內查詢
在外面的查詢語句,稱爲主查詢或外查詢

特點:

1、子查詢都放在小括號內
2、子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側
3、子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果
4、子查詢根據查詢結果的行數不同分爲以下兩類:
① 單行子查詢
	結果集只有一行
	一般搭配單行操作符使用:> < = <> >= <= 
	非法使用子查詢的情況:
	a、子查詢的結果爲一組值
	b、子查詢的結果爲空
	
② 多行子查詢
	結果集有多行
	一般搭配多行操作符使用:any、all、in、not in
	in: 屬於子查詢結果中的任意一個就行
	any和all往往可以用其他查詢代替

##進階8:分頁查詢

應用場景:

實際的web項目中需要根據用戶的需求提交對應的分頁查詢的sql語句

語法:

select 字段|表達式,...
from 表
【where 條件】
【group by 分組字段】
【having 條件】
【order by 排序的字段】
limit 【起始的條目索引,】條目數;

特點:

1.起始條目索引從0開始

2.limit子句放在查詢語句的最後

3.公式:select * from  表 limit (page-1)*sizePerPage,sizePerPage
假如:
每頁顯示條目數sizePerPage
要顯示的頁數 page

##進階9:聯合查詢

引入:
union 聯合、合併

語法:

select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union  【all】
.....
select 字段|常量|表達式|函數 【from 表】 【where 條件】

特點:

1、多條查詢語句的查詢的列數必須是一致的
2、多條查詢語句的查詢的列的類型幾乎相同
3、union代表去重,union all代表不去重

數據庫事務

含義

通過一組邏輯操作單元(一組DML——sql語句),將數據從一種狀態切換到另外一種狀態

特點

(ACID)
原子性:要麼都執行,要麼都回滾
一致性:保證數據的狀態操作前和操作後保持一致
隔離性:多個事務同時操作相同數據庫的同一個數據時,一個事務的執行不受另外一個事務的干擾
持久性:一個事務一旦提交,則數據將持久化到本地,除非其他事務對其進行修改

相關步驟:

1、開啓事務
2、編寫事務的一組邏輯操作單元(多條sql語句)
3、提交事務或回滾事務

事務的分類:

隱式事務,沒有明顯的開啓和結束事務的標誌

比如
insert、update、delete語句本身就是一個事務

顯式事務,具有明顯的開啓和結束事務的標誌

	1、開啓事務
	取消自動提交事務的功能
	
	2、編寫事務的一組邏輯操作單元(多條sql語句)
	insert
	update
	delete
	
	3、提交事務或回滾事務

使用到的關鍵字

set autocommit=0;
start transaction;
commit;
rollback;

savepoint  斷點
commit to 斷點
rollback to 斷點

事務的隔離級別:

事務併發問題如何發生?

當多個事務同時操作同一個數據庫的相同數據時

事務的併發問題有哪些?

髒讀:一個事務讀取到了另外一個事務未提交的數據
不可重複讀:同一個事務中,多次讀取到的數據不一致
幻讀:一個事務讀取數據時,另外一個事務進行更新,導致第一個事務讀取到了沒有更新的數據

如何避免事務的併發問題?

通過設置事務的隔離級別
1、READ UNCOMMITTED
2、READ COMMITTED 可以避免髒讀
3、REPEATABLE READ 可以避免髒讀、不可重複讀和一部分幻讀
4、SERIALIZABLE可以避免髒讀、不可重複讀和幻讀

設置隔離級別:

set session|global  transaction isolation level 隔離級別名;

查看隔離級別:

select @@tx_isolation;

視圖

含義:理解成一張虛擬的表

視圖和表的區別:

	使用方式	佔用物理空間

視圖	完全相同	不佔用,僅僅保存的是sql邏輯

表	完全相同	佔用

視圖的好處:

1、sql語句提高重用性,效率高
2、和表實現了分離,提高了安全性

視圖的創建

語法:
CREATE VIEW  視圖名
AS
查詢語句;

視圖的增刪改查

1、查看視圖的數據 ★

SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';

2、插入視圖的數據
INSERT INTO my_v4(last_name,department_id) VALUES('虛竹',90);

3、修改視圖的數據

UPDATE my_v4 SET last_name ='夢姑' WHERE last_name='虛竹';


4、刪除視圖的數據
DELETE FROM my_v4;

某些視圖不能更新

包含以下關鍵字的sql語句:分組函數、distinct、group  by、having、union或者union all
常量視圖
Select中包含子查詢
join
from一個不能更新的視圖
where子句的子查詢引用了from子句中的表

視圖邏輯的更新

#方式一:
CREATE OR REPLACE VIEW test_v7
AS
SELECT last_name FROM employees
WHERE employee_id>100;

#方式二:
ALTER VIEW test_v7
AS
SELECT employee_id FROM employees;

SELECT * FROM test_v7;

視圖的刪除

DROP VIEW test_v1,test_v2,test_v3;

視圖結構的查看

DESC test_v7;
SHOW CREATE VIEW test_v7;

##存儲過程

含義:一組經過預先編譯的sql語句的集合
好處:

1、提高了sql語句的重用性,減少了開發程序員的壓力
2、提高了效率
3、減少了傳輸次數

分類:

1、無返回無參
2、僅僅帶in類型,無返回有參
3、僅僅帶out類型,有返回無參
4、既帶in又帶out,有返回有參
5、帶inout,有返回有參
注意:in、out、inout都可以在一個存儲過程中帶多個

###創建存儲過程
語法:

create procedure 存儲過程名(in|out|inout 參數名  參數類型,...)
begin
	存儲過程體

end

類似於方法:

修飾符 返回類型 方法名(參數類型 參數名,...){

	方法體;
}

注意

1、需要設置新的結束標記
delimiter 新的結束標記
示例:
delimiter $

CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名  參數類型,...)
BEGIN
	sql語句1;
	sql語句2;

END $

2、存儲過程體中可以有多條sql語句,如果僅僅一條sql語句,則可以省略begin end

3、參數前面的符號的意思
in:該參數只能作爲輸入 (該參數不能做返回值)
out:該參數只能作爲輸出(該參數只能做返回值)
inout:既能做輸入又能做輸出

#調用存儲過程
call 存儲過程名(實參列表)
##函數

###創建函數

學過的函數:LENGTH、SUBSTR、CONCAT等
語法:

CREATE FUNCTION 函數名(參數名 參數類型,...) RETURNS 返回類型
BEGIN
	函數體

END

###調用函數
SELECT 函數名(實參列表)

###函數和存儲過程的區別

		關鍵字		調用語法	返回值			應用場景
函數		FUNCTION	SELECT 函數()	只能是一個		一般用於查詢結果爲一個值並返回時,當有返回值而且僅僅一個
存儲過程	PROCEDURE	CALL 存儲過程()	可以有0個或多個		一般用於更新

##流程控制結構

###系統變量
一、全局變量

作用域:針對於所有會話(連接)有效,但不能跨重啓

查看所有全局變量
SHOW GLOBAL VARIABLES;
查看滿足條件的部分系統變量
SHOW GLOBAL VARIABLES LIKE '%char%';
查看指定的系統變量的值
SELECT @@global.autocommit;
爲某個系統變量賦值
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;

二、會話變量

作用域:針對於當前會話(連接)有效

查看所有會話變量
SHOW SESSION VARIABLES;
查看滿足條件的部分會話變量
SHOW SESSION VARIABLES LIKE '%char%';
查看指定的會話變量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
爲某個會話變量賦值
SET @@session.tx_isolation='read-uncommitted';
SET SESSION tx_isolation='read-committed';

###自定義變量
一、用戶變量

聲明並初始化:

SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;

賦值:

方式一:一般用於賦簡單的值
SET 變量名=值;
SET 變量名:=值;
SELECT 變量名:=值;


方式二:一般用於賦表 中的字段值
SELECT 字段名或表達式 INTO 變量
FROM 表;

使用:

select @變量名;

二、局部變量

聲明:

declare 變量名 類型 【default 值】;

賦值:

方式一:一般用於賦簡單的值
SET 變量名=值;
SET 變量名:=值;
SELECT 變量名:=值;


方式二:一般用於賦表 中的字段值
SELECT 字段名或表達式 INTO 變量
FROM 表;

使用:

select 變量名

二者的區別:

		作用域			定義位置		語法

用戶變量 當前會話 會話的任何地方 加@符號,不用指定類型
局部變量 定義它的BEGIN END中 BEGIN END的第一句話 一般不用加@,需要指定類型

###分支
一、if函數
語法:if(條件,值1,值2)
特點:可以用在任何位置

二、case語句

語法:

情況一:類似於switch
case 表達式
when 值1 then 結果1或語句1(如果是語句,需要加分號) 
when 值2 then 結果2或語句2(如果是語句,需要加分號)
...
else 結果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case,如果放在select後面不需要)

情況二:類似於多重if
case 
when 條件1 then 結果1或語句1(如果是語句,需要加分號) 
when 條件2 then 結果2或語句2(如果是語句,需要加分號)
...
else 結果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case,如果放在select後面不需要)

特點:
可以用在任何位置

三、if elseif語句

語法:

if 情況1 then 語句1;
elseif 情況2 then 語句2;
...
else 語句n;
end if;

特點:
只能用在begin end中!!!!!!!!!!!!!!!

三者比較:
應用場合
if函數 簡單雙分支
case結構 等值判斷 的多分支
if結構 區間判斷 的多分支

###循環

語法:

【標籤:】WHILE 循環條件  DO
	循環體
END WHILE 【標籤】;

特點:

只能放在BEGIN END裏面

如果要搭配leave跳轉語句,需要使用標籤,否則可以不用標籤

leave類似於java中的break語句,跳出所在循環!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章