複習之路如下所示,希望能幫助到需要的小夥伴,程序員之路,我們要互幫互助
一、爲什麼要學習數據庫
二、數據庫的相關概念
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語句,跳出所在循環!!!