MYSQL使用總結

目錄

MYSQL使用總結

MYSQL的基本概念

MYSQL服務的啓動與停止

MYSQL服務的登錄和退出

MYSQL常見命令

SQL的分類

DML數據操縱語言

插入

修改

刪除

DQL數據查詢語言

基礎查詢

條件查詢

排序查詢

分組查詢

連接查詢

子查詢

分頁查詢

聯合查詢

查詢順序

DDL數據定義語言

庫的定義

表的定義

DCL數據控制語言

TCL事務控制語言

事務的特性(ACID)

隱式提交

顯式提交

併發問題

隔離級別

數據類型

數值型

字符型

日期型

常見的約束

非空約束

唯一約束

默認約束

檢查約束

主鍵約束

外鍵約束

視圖

視圖的兩種實現

變量

系統變量

自定義變量

存儲過程

函數

內置函數

單行函數

分組函數/聚合函數/統計函數/組函數

自定義函數

流程控制結構

順序結構

分支結構

IF結構

CASE結構

循環結構

索引

explain執行計劃

點擊跳轉到explain執行計劃詳解


MYSQL使用總結

MYSQL的基本概念

DB:數據庫.是指長期儲存在計算機內的,有組織的,可共享的數據集合.

DBS:數據庫系統.由數據庫,硬件,軟件和人員組成,管理的對象是數據.

DBMS:數據庫管理系統.是一種操縱和管理數據庫的大型軟件,用於建立,使用和維護數據庫.DBMS通常分三類:關係數據庫系統RDBS,面向對象的數據庫系統OODBS,對象關係數據庫系統ORDBS.

DBA:數據庫管理員.

MYSQL是C/S架構.

MYSQL服務的啓動與停止

啓動服務
net start 服務名
停止服務
net stop 服務名

MYSQL服務的登錄和退出

登錄
mysql [-h主機名 -p端口號] -u用戶名 -p密碼
[]中的內容表示可選,本機登錄可不寫

退出
exit
ctrl+c

MYSQL常見命令

1.查看當前所有的數據庫
show databases;
2.打開指定的庫
use 庫名
3.查看當前庫的所有表
show tables;
4.查看其它庫的所有表
show tables from 庫名;
5.創建表
create table 表名(
    列名 列類型,
    列名 列類型,
    ...
);
6.查看錶結構
describe 表名;
desc 表名;
7.查看服務器的版本
方式一:登錄到mysql服務端
select version();
方式二:沒有登錄到mysql服務端,即DOS命令
mysql --version
mysql --V

SQL的分類

DDL針對數據結構與約束.

DML針對數據.

DCL針對權限.

TCL針對事務控制.


DML數據操縱語言

插入

方式一:
insert into 表名(字段名...) values(值,值,...);
字段名可以省略,默認所有列.
支持一次插入多行,且支持子查詢(insert into 表名 查詢語句;).

方式二:
insert into 表名 set 字段=值,字段=值,...;

修改

修改單表:
update 表名 set 字段=值,字段=值 [where 篩選條件];

修改多表:
update 表名1 別名1
left|right|inner join 表名2 別名2
on 連接條件
set 字段=值,字段=值
[where 篩選條件];

刪除

方式一:使用delete
刪除單表:
delete from 表名 [where 篩選條件] [limit 條目數/起始索引,條目數];
級聯刪除:
delete 別名1,別名2 from 表1 別名1
inner|left|right join 表2 別名2
on 連接條件
[where 過濾條件];

方式二:使用truncate
truncate table 表名;

兩種刪除方式的區別

  • 自增:truncate刪除後,插入新記錄,標識列(自增)從1開始.delete刪除後,插入新紀錄,標識列(自增)從斷點開始.
  • 回滾,日誌,觸發器:truncate不可以回滾,不記錄日誌,不會觸發該表的刪除觸發器.delete可以回滾,記錄日誌,可以觸發該表的刪除觸發器.
  • 篩選條件:delete可以添加篩選條件.truncate不可以添加篩選條件.
  • 效率:truncate效率較高.delete相對效率較低
  • 返回值:truncate沒有返回值.delete可以返回受影響的行數.

DQL數據查詢語言

DQL屬於DML中的一員.

基礎查詢

select 查詢列表 from 表名;
查詢列表可以是字段,常量,表達式,函數.

字符+數值,先轉換再運算,轉換不了變爲0再運算.

null+值,結果爲null.

條件查詢

select 查詢列表
from 表名
where 篩選條件;

篩選條件的分類:

  • 簡單條件運算符:<,<=,=,<=>,>,>=,!=,<>.
  • 邏輯運算符:&&,and,||,or,!,not.
  • 模糊查詢:like,搭配通配符使用(%任意多個字符,_任意單個字符)
  • 範圍查詢:between and,in.
  • 判斷null值:is null/is not null
  普通類型值 null值 可讀性
is null 不支持 支持
<=> 支持 支持

排序查詢

select 查詢列表
from 表名
where 篩選條件
order by 排序列表 [asc]|desc;

分組查詢

select 分組函數,分組後的字段
from 表
[where 篩選條件]
group by 分組的字段
[having 分組後的篩選]
[order by 排序列表];
  使用關鍵字 篩選的表 位置
分組前篩選 where 原始表 group by的前面
分組後篩選 having 分組後的結果 group by的後面

連接查詢

SQL92語法支持的連接方式

  • 內連接
  1. 等值連接
  2. 非等值連接
  3. 自連接

SQL99語法支持的連接方式

  • 內連接
  1. 等值連接
  2. 非等值連接
  3. 自連接
  • 外連接
  1. 左外連接
  2. 右外連接
  3. 全外連接(MYSQL不支持)
  • 交叉連接(笛卡爾乘積)

SQL92等值連接:

select 查詢列表
from 表1 別名,表2 別名
where 表1.key=表2.key
[and 篩選條件]
[group by 分組字段]
[having 分組後的篩選]
[order by 排序字段];

一般爲表起別名
多表的順序可以調換
n表連接至少需要n-1個連接條件
等值連接的結果是多表的交集部分

SQL92非等值連接:

select 查詢列表
from 表1 別名,表2 別名
where 非等值的連接條件
[and 篩選條件]
[group by 分組字段]
[having 分組後的篩選]
[order by 排序字段];

SQL92自連接:

select 查詢列表
from 表1 別名1,表1 別名2
where 等值的連接條件
[and 篩選條件]
[group by 分組字段]
[having 分組後的篩選]
[order by 排序字段]

SQL99內連接

select 查詢列表
from 表1 別名
[inner] join 表2 別名 on 連接條件
where 篩選條件
group by 分組列表
having 分組後的篩選
order by 排序列表
limit子句;

表的順序可以調換
內連接的結果=多表的交集
n表連接至少需要n-1個連接條件

SQL99外連接

select 查詢列表
from 表1 別名
left|right|full[outer] join 表2 別名 on 連接條件
where 篩選條件
group by 分組列表
having 分組後的篩選
order by 排序列表
limit子句;

查詢的結果=主表中的所有行,如果從表和它匹配的將顯示匹配行,如果從表沒有匹配的則顯示null
left join 左邊的是主表
right join 右邊的是主表
full join 兩邊都是主表
一般用於查詢除了交集部分的剩餘的不匹配的行

SQL99交叉連接

select 查詢列表
from 表1 別名
cross join 表2 別名;

執行效率慢,不推薦,平時也不用,可用無條件的內連接代替,執行效率快

七種JOIN連接

select 查詢列表
from 表A 別名A
inner join 表B 別名B
on 別名A.key=別名B.key;

select 查詢列表
from 表A 別名A
left join 表B 別名B
on 別名A.key=別名B.key;

select 查詢列表
from 表A 別名A
right join 表B 別名B
on 別名A.key=別名B.key;

select 查詢列表
from 表A 別名A
right join 表B 別名B
on 別名A.key=別名B.key
where 別名B.key is null;

select 查詢列表
from 表A 別名A
right join 表B 別名B
on 別名A.key=別名B.key
where 別名A.key is null;

select 查詢列表 from 表A 別名A left join 表B 別名B on 別名A.key=別名B.key
union
select 查詢列表 from 表A 別名A right join 表B 別名B on 別名A.key=別名B.key;

select 查詢列表 from 表A 別名A left join 表B 別名B on 別名A.key=別名B.key
where 別名B.key is null
union
select 查詢列表 from 表A 別名A right join 表B 別名B on 別名A.key=別名B.key
where 別名A.key is null;

子查詢

子查詢的分類:

  • 標量子查詢/單行子查詢:結果集爲一行一列.
  • 列子查詢/多行子查詢:結果集爲多行一列.
  • 行子查詢:結果集爲一行多列.
  • 表子查詢:結果集爲多行多列.

各位置支持的子查詢類型:

  • select後面
  1. 標量子查詢.
  • from後面
  1. 表子查詢
  • where或having後面
  1. 標量子查詢
  2. 列子查詢
  3. 行子查詢
  • exists後面
  1. 標量子查詢
  2. 列子查詢
  3. 行子查詢
  4. 表子查詢

分頁查詢

select 查詢列表
from 表
limit 起始角標/頁碼,條目數量;

公式:
select 查詢列表
from 表
limit (page-1)*size,size;

總頁數公式:
總頁數=(總記錄數+條目數-1)/條目數;

聯合查詢

查詢語句1
union [all]
查詢語句2
union [all]
...;

查詢的列需要一致.
列的類型,順序一致.
union默認去重,union all不去重.

查詢順序

書寫順序與大概執行順序

select 查詢列表            7
from 表1 別名              1
連接類型 join 表2 別名      2
on 連接條件                3
where 篩選條件             4
group by 分組列表          5
having 分組後篩選          6
order by 排序列表          8
limit 起始角標,條目數;      9
select語句在SQL解析器中的順序

FROM 左表
ON 連接條件
連接類型 JOIN 右表
WHERE where過濾條件
GROUP BY 分組列表
HAVING having過濾條件
SELECT 
DISTINCT 查詢列表
ORDER BY 排序列表
LIMIT 分頁數

找到左表,選取左表中第一個符合連接條件的行,去右表中找到匹配行,返回左表找第二個行,依次類推(嵌套-循環連接算法).

 


DDL數據定義語言

庫的定義

create database [if not exists] 庫名 [character set 字符集名];     創建庫
alter database 庫名 character set 字符集名;                        修改庫
drop database [if exists] 庫名;                                   刪除庫

表的定義

create table [if not exists] 表名(
    字段名 字段類型 [約束],
    字段名 字段類型 [約束],
    ...
    字段名 字段類型 [約束]
);      創建表

添加列
alter table 表名 add column 列名 類型 [first|after 字段名];
修改列的類型或約束
alter table 表名 modify column 列名 新類型 [新約束];
修改列名
alter table 表名 change column 舊列名 新列名 類型;
刪除列
alter table 表名 drop column 列名;
修改表名
alter table 表名 rename [to] 新表名;

刪除表
drop table [if exists] 表名;

複製表的結構
create table 表名 like 舊錶;
複製表的結構+數據
create table 表名
select 查詢列表 from 舊錶 [where 篩選條件];

DCL數據控制語言

系統管理員,數據庫創建者,數據庫擁有者,數據庫安全管理員關心,程序員不關心.


TCL事務控制語言

事務的特性(ACID)

  • 原子性
  • 一致性
  • 隔離性
  • 持久性

隱式提交

隱式提交:隱式地結束當前會話中活動的任何事務,就好像在執行語句之前已經執行了COMMIT一樣.

大多數的DDL語言都會導致在執行完語句之前進行隱式提交.即使DDL語句本身執行失敗,但是之前的語句依舊會被提交.

顯式提交

開啓顯式提交
set autocommit=0;
start transaction;

insert update delete也會開啓事務.

設置回滾點
savepoint 回滾點名;

結束事務
commit 提交
rollback 回滾
rollback to 回滾點名    回滾到指定回滾點

併發問題

髒讀:事務可以讀取未提交的數據.

不可重複讀:兩次執行同樣的查詢,可能會得到不一樣的結果.

幻讀:當某個事務在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行.

隔離級別

  • read uncommitted:讀未提交
  • read committed:讀已提交/不可重複讀
  • repeatable read:可重複讀
  • serializable:串行化
  髒讀 不可重複讀 幻讀
讀未提交 存在 存在 存在
讀已提交 解決 存在 存在
可重複讀 解決 解決 存在
串行化 解決 解決 解決

數據類型

數值型

如果超如範圍,會報out or range警告並插入臨界值.

都可以設置無符號或有符號,默認有符號,通過unsigned設置無符號.

  • 整型
tinyint smallint mediumint int/integer bigint
1 2 3 4 8

長度可以不指定,默認會有長度.長度只是用來顯示的,存儲佔用空間大小不變.顯示寬度如果不夠,左邊用0填充,但需要搭配zerofill使用,並且默認變成無符號數.

  • 浮點型
  1. 定點數decimal(M,D) M表示整數部分+小數部分,默認爲10  D表示小數部分,默認爲0
  2. 浮點數float(M,D) 4字節/double(M,D) 8字節

字符型

  • char定長字符char(M),M可以省略.
  • varchar變長字符varchar(M),M不可以省略.
  • binary定長二進制串
  • varbinary變長二進制串
  • enum枚舉
  • set集合
  • text文本字符
  • blob二進制大對象

日期型

  • year年
  • date日期
  • time時間
  • datetime日期時間8
  • timestamp時間戳4

常見的約束

非空約束

  • NOT NULL 字段不可爲空

唯一約束

  • UNIQUE 字段值必須唯一,不可重複

默認約束

  • DEFAULT 設置默認值

檢查約束

  • CHECK MYSQL不支持

主鍵約束

  • PRIMARY KEY 主鍵=唯一+非空 實體完整性約束

外鍵約束

  • FOREIGN KEY 外鍵 引用別的表的字段 參照完整性約束 數據的操作約束

設置外鍵約束後,插入數據要先插入主表(主鍵被引用的表),刪除數據要先刪除從表(擁有外鍵的表).

級聯刪除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
級聯置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
  支持類型 是否能起約束名
列級約束 除了外鍵 不可以
表級約束 除了非空和默認 可以,但對主鍵無效

列級約束可以在一個字段上追加多個,中間用空格隔開,沒有順序要求.

添加非空約束
alter table 表名 modify column 字段名 字段類型 not null;
刪除非空約束
alter table 表名 modify column 字段名 字段類型 ;

添加默認約束
alter table 表名 modify column 字段名 字段類型 default 值;
刪除默認約束
alter table 表名 modify column 字段名 字段類型 ;


添加主鍵約束
alter table 表名 add [constraint 約束名] primary key(字段名);
刪除主鍵約束
alter table 表名 drop primary key;

添加唯一約束
alter table 表名 add [constraint 約束名] unique(字段名);
刪除唯一約束
alter table 表名 drop index 索引名;

添加外鍵約束
alter table 表名 add [constraint 約束名] foreign key(字段名) references 主表(被引用列);
刪除外鍵約束
alter table 表名 drop foreign key 約束名;

自增長列

create table 表名(
    字段名 字段類型 約束 auto_increment
);

修改表時設置自動增長列
alter table 表 modify column 字段名 約束 auto_increment;

刪除自增長列
alter table 表 modify column 字段名 約束;

自動增長從1開始,默認步長爲1.
更改起始值,手動插入值.
更改步長,更改系統變量.
set auto_increment_increment=值;
一個表至多有一個自增長列.
自增長列必須爲數值型.
自增長列必須爲一個key.

視圖

視圖:調用時產生結果集的存儲查詢.視圖充當虛擬表.也就是說數據在執行時動態產生.

創建視圖
create view 視圖名
as
查詢語句;

修改視圖
create or replace view 視圖名
as
查詢語句;

alter view 視圖名
as
查詢語句;

刪除視圖
drop view 視圖1,視圖2,...;

查看視圖
desc 視圖名;
show create view 視圖名;

視圖一般用於查詢,而不是更新,所以包含以下特點的視圖都不允許更新:

  • 分組函數,group by,distinct,having,union.
  • join
  • 常量視圖.
  • where後的子查詢用到了from中的表.
  • 用到了不可更新的視圖.
  關鍵字 是否佔用空間 使用
視圖 view 佔用少,只保存SQL邏輯,不保存數據 一般用於查詢
table 佔用多,保存實際的數據 增刪改查

視圖的兩種實現

鏈接地址:視圖的兩種實現.


變量

系統變量

系統變量變量分爲全局系統變量(需要有super權限)和會話系統變量.

查看系統變量
show [global|session] variable like '';
查看指定的系統變量的值
select @@[global|session].變量名;          無指定則默認爲session

爲系統變量賦值
set [global|session] 變量名=值;
set @@global.變量名=值;
set 變量名=值;

系統變量跨重新啓動無效,如要永久有效則需修改配置文件.

自定義變量

用戶變量

用戶變量作用域:當前連接/會話.

用戶變量位置:begin end裏面,也可以放在begin end外.

聲明並賦值
set @變量名=值;
set @變量名:=值;
select @變量名:=值;

更新用戶變量值
set @變量名=值;
set @變量名:=值;
select @變量名:=值;
select xx into @變量名 from 表;

使用用戶變量
select @變量名;

局部變量

局部變量作用域:僅僅在begin end中有效.

局部變量位置:只能放在begin end中的第一句.

聲明局部變量
declare 變量名 類型 [default 值];

賦值或更新
set 變量名=值;
set 變量名:=值;
select @變量名:=值;
select xx into 變量名 from 表;

使用局部變量
select 變量名;

存儲過程

存儲過程可以封裝複雜業務邏輯,減少網絡流量.配合call使用.類似於子程序.

存儲過程按需編譯,編譯後放入緩存,每個客戶端連接維護自己的緩存,單個連接多次使用存儲過程,則使用編譯版本.否則和執行查詢沒什麼區別.

聲明分隔符
delimiter 分隔符

創建存儲過程
create procedure 存儲過程名(參數模式 參數名 參數類型)
begin
    存儲過程體;
end 分隔符

還原分隔符
delimiter ;

參數模式:in out inout 默認爲in,可省略
存儲過程體的每一句都需要用分號結尾

調用存儲過程
call 存儲過程名(實參列表);

查看存儲過程
show create procedure 存儲過程名;

刪除存儲過程
drop procedure 存儲過程名;

存儲過程創建後,存儲過程體和存儲過程名稱就不可以被修改了,只能更改存儲過程的特徵/信息

函數

內置函數

調用方法:select 函數名(實參列表);

單行函數

  • 字符函數:
  1. concat連接.
  2. substr截取子串
  3. upper變大寫
  4. lower變小寫
  5. replace替換
  6. length字節長度
  7. trim前後去空白
  8. lpad左填充
  9. rpad右填充
  10. instr獲取子串第一次出現的位置.
  • 數學函數:
  1. ceil向上取整
  2. round四捨五入
  3. mod取模
  4. floor向下取整
  5. truncate截斷
  6. rand獲取0-1之間的隨機小數
  • 日期函數:
  1. now返回當前日期+時間
  2. curdate返回當前日期.
  3. curtime返回當前時間
  4. year返回年
  5. month返回月
  6. monthname以英文形式返回月
  7. day返回日
  8. hour小時
  9. minute分
  10. second秒
  11. date_format將日期轉換爲字符.
  12. str_to_date將字符轉換爲日期.
  13. datediff返回兩個日期相差的天數.
  • 其他函數:
  1. ifnull(字段名,0) 字段爲null則用0替代,不爲null則用原來的值.
  2. isnull(表達式/字段) 判斷是否爲null,1或0.
  3. version當前數據庫服務器的版本.
  4. database當前打開的數據庫.
  5. user當前用戶.
  6. password('字符')返回該字符的密碼形式.
  7. md5('字符')返回該字符的MD5加密形式.
  • 流程控制函數:
if(條件表達式,表達式1,表達式2)   如果條件成立,返回表達式1,否則返回表達式2

分組函數/聚合函數/統計函數/組函數

  1. max最大,忽略null,可搭配distinct實現去重統計
  2. min最小,忽略null,可搭配distinct實現去重統計
  3. sum求和,處理數值,忽略null,可搭配distinct實現去重統計
  4. avg求平均值,處理數值,忽略null,可搭配distinct實現去重統計
  5. count計數,忽略null,可搭配distinct實現去重統計.count(字段)統計字段非空值的個數,count(*)統計結果集的個數.

和分組函數一同查詢的字段,要求是group by後出現的字段.

where字句中不能使用分組函數.

自定義函數

函數可以封裝功能邏輯,可以單獨調用.類似於函數.

聲明分隔符
delimiter 分隔符

創建函數
create function 函數名(參數名 參數類型) returns 返回類型
begin
    函數體;
    return xx;
end 分隔符

還原分隔符
delimiter ;

調用函數
select 函數名(實參列表);

查看函數
show create function 函數名;

刪除函數
drop function 函數名;

函數創建後,函數體和函數名稱就不可以被修改了,只能更改函數的特徵/信息

存儲過程和函數的區別

  • 單獨調用:存儲過程不可以單獨調用,需要使用call,函數可以單獨調用,可以寫在SQL中.
  • 封裝內容:存儲過程通常封裝業務邏輯,函數通常封裝功能邏輯.
  • 參數模式:存儲過程有參數模式,函數沒有參數模式.
  • 返回值:存儲過程可以返回多個返回值,函數有且只有一個返回值.
  • 互相調用:存儲過程可以調用函數,函數不可以調用存儲過程.
  • 遞歸調用:存儲過程中可以調用存儲過程,但不支持遞歸,函數可以調用函數,且支持遞歸.

流程控制結構

順序結構

略.哈哈

分支結構

IF結構

類似於Java中的IF結構.

IF函數

if(條件表達式,表達式1,表達式2)   如果條件成立,返回表達式1,否則返回表達式2

可以作爲表達式放在任何位置

IF結構

if 條件1 then 語句1;
elseif 條件2 then 語句2;
...
else 語句n;
end if;

只能放在begin end中

CASE結構

可以放在任何位置.
如果放在begin end 外面,作爲表達式結合着其他語句使用.
如果放在begin end 裏面,一般作爲獨立的語句使用.

類似於Java中的IF ELSE結構.

case 
when 條件1 then 語句1;
when 條件2 then 語句2;
...
else 語句n;
end [case];

類似於Java中的SWITCH結構

case 變量/表達式/字段
when 常量1 then 值1
when 常量2 then 值2
...
else 值n
end [case];

循環結構

只能放在begin end中.

WHILE循環

先判斷後執行.

[名稱:]while 循環條件 do
    循環體
end while [名稱];

REPEAT循環

先執行,後判斷.

[名稱:]repeat
    循環體
until 結束條件
end repeat [名稱];

LOOP循環

死循環.

[名稱:]loop
    循環體
end loop [名稱];

循環控制語句

  • LEAVE

leave類似於Java語言中的break語句,跳出循環.

  • ITERATE

iterate類似於Java語言中的continue語句,跳過本次循環,繼續執行下一次.


索引

創建索引

create [unique] index 索引名 on 表名(列名(長度));
alter 表名 add [unique] index 索引名 on(列名(長度));

刪除索引

drop index 索引名 on 表名;

查看索引

show index from 表名;

explain執行計劃

基本語法

explain SQL語句;

點擊跳轉到explain執行計劃詳解

發佈了71 篇原創文章 · 獲贊 201 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章