目錄
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語法支持的連接方式
- 內連接
- 等值連接
- 非等值連接
- 自連接
SQL99語法支持的連接方式
- 內連接
- 等值連接
- 非等值連接
- 自連接
- 外連接
- 左外連接
- 右外連接
- 全外連接(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後面
- 標量子查詢.
- from後面
- 表子查詢
- where或having後面
- 標量子查詢
- 列子查詢
- 行子查詢
- exists後面
- 標量子查詢
- 列子查詢
- 行子查詢
- 表子查詢
分頁查詢
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使用,並且默認變成無符號數.
- 浮點型
- 定點數decimal(M,D) M表示整數部分+小數部分,默認爲10 D表示小數部分,默認爲0
- 浮點數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 函數名(實參列表);
單行函數
- 字符函數:
- concat連接.
- substr截取子串
- upper變大寫
- lower變小寫
- replace替換
- length字節長度
- trim前後去空白
- lpad左填充
- rpad右填充
- instr獲取子串第一次出現的位置.
- 數學函數:
- ceil向上取整
- round四捨五入
- mod取模
- floor向下取整
- truncate截斷
- rand獲取0-1之間的隨機小數
- 日期函數:
- now返回當前日期+時間
- curdate返回當前日期.
- curtime返回當前時間
- year返回年
- month返回月
- monthname以英文形式返回月
- day返回日
- hour小時
- minute分
- second秒
- date_format將日期轉換爲字符.
- str_to_date將字符轉換爲日期.
- datediff返回兩個日期相差的天數.
- 其他函數:
- ifnull(字段名,0) 字段爲null則用0替代,不爲null則用原來的值.
- isnull(表達式/字段) 判斷是否爲null,1或0.
- version當前數據庫服務器的版本.
- database當前打開的數據庫.
- user當前用戶.
- password('字符')返回該字符的密碼形式.
- md5('字符')返回該字符的MD5加密形式.
- 流程控制函數:
if(條件表達式,表達式1,表達式2) 如果條件成立,返回表達式1,否則返回表達式2
分組函數/聚合函數/統計函數/組函數
- max最大,忽略null,可搭配distinct實現去重統計
- min最小,忽略null,可搭配distinct實現去重統計
- sum求和,處理數值,忽略null,可搭配distinct實現去重統計
- avg求平均值,處理數值,忽略null,可搭配distinct實現去重統計
- 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語句;