MySQL初級
第一章.為什么要學習數據庫
實現數據持久化
使用完整的管理系統統一管理,易於查詢
第二章.數據庫相關概念
DBMS:Database Management System。數據庫時通過DBMS創建和操作的容器
DB:Database,存儲數據的倉庫。保存了一系列有組織有格式規范的數據
SQL:Structure Query Language。專門與數據庫管理系統通信的語言
SQL優點:
第三章.數據庫存儲數據的特點
1.數據放到表里,表放到庫里
2.一個數據庫里可以有多張表,每個表有自己的名字,名字唯一
3.表具有特性,定義了數據在表中如何存儲。表類似類
4.表由一個或多個列組成,叫做字段。列類似屬性
5.表中數據按行存儲。行類似對象
第四章.初識MySQL
MySQL產品介紹
DBMS:分兩類,基於共享文件系統的和基於C/S架構的
MySQL基於客戶端服務端架構
MySQL產品安裝
安裝好后要配置
MySQL產品卸載
控制面板里卸載,安裝路徑里刪除,ProgramData里刪除,刪除注冊表(預防配置影響新安裝的軟件),刪除Application Data里的MySQL
配置文件:my.ini
MySQL服務的啟動和和停止
是個daemon,各個系統里找啟動/停止服務的辦法
windows:net stop 服務名。star啟動
MySQL服務的登錄和登出
mysql -h 地址 -P 端口號 -u 用戶 -p 密碼。選型和參數之間可以沒有空格
exit退出
配置環境變量:
把安裝路徑bin加入Path環境變量
MySQL的常見命令和語法規范
show databases(;或者\g):顯示數據庫
use 數據庫名;:使用進入數據庫
show tables;:顯示當前數據庫里的表名
show tables from 數據庫:顯示某個數據庫里的表名
select database();:顯示當前位於哪個數據庫
desc 表名;:顯示表的schema
查看MySQL版本:
select version();
mysql --version
mysql -V
MySQL語法規范
1.不區分大小寫,關鍵字大寫,表名,列名小寫
2.每條命令分號結尾
3.每條命令根據需要縮進換行。建議關鍵字一行
4.注釋是#和--空格 來當行注釋,/* */多行
圖形界面客戶端:
SQLyog和Navicat
第五章.DQL語言的學習
myemployees庫的四張表
1.departments:
2.employees:
3.jobs:
4.locations:
基礎查詢
select 查詢列表 from 表名
查詢列表:表中字段,常量,表達式,函數
查詢結果是虛擬表格
1.查詢表格中的單個字段
select last_name from employees;
2.查詢表格中的多個字段
select last_name,salary,email from employees;
3.查詢表格中的所有字段
select * from employees;
細節補充:
use myemployees;
``着重號代表不轉義,關鍵字也可以在里邊使用
查詢常量:
select 100;結果的字段名是100,即常量
查詢表達式:
select 100*98;結果的列字段名是“100*98”
查詢函數:
select database();結果列的字段名是database()
結果列起別名:
方式一:
select 100*98 as result from employees;
好處:1.結果清晰2.別名區分重名字段,比如自連接
方式二:
select last_name 姓 from employees;省略as
如果別名有空格,用着重號包起來
去重:
select distinct departmeng_id from employees;
+號的作用:
列合並用contat函數而不是+號
+號只能做數值運算符,不能用在非數值字符上,否則字符被轉換成0;只有+的操作數有一個是null,結果就是null
concat作用:
字符連接用concat
select concat(last_name,first_name) as 姓名 from employees;
ifnull:
如果是第一個參數是null,返回第二個參數。可以用來在做concat的時候修飾可能是null值的列
條件查詢
select 查詢列表 from 表名 where 【篩選條件】;
篩選條件分類:
1.按條件表達式篩選:條件運算符,> < = != <> >= <=
select * from from employees where salary > 12000;
2.按邏輯表達式篩選:邏輯運算符,&& || ! and or not,連接條件表達式
select last_name, salary from employees where salary > 1000 && salary <= 20000;
3.模糊查詢:like, between and,in,is null
like:不是完全匹配,包含部分字符
select * from employees where last_name like '%a%';通配符用%
一般和通配符搭配使用。
%:任意多個字符,可以是0個
_:任意單個字符
\為轉義
'_$_' escape '$'表明轉義字符為💲,也可以是任意字符
between and:在某個范圍內,閉區間,提高語句簡潔度。兩邊的值不滿足交換律
select * from employees where saly between 10000 and 150000
in:值在一個散列集合里。提高語句簡潔度。集合里的值類型要統一或者兼容。不支持通配符
select * from employees where job_id in ('IT_PROT', 'AD_VP')
is (not)null:判斷null值。等號和不等號不能判斷null值,這個不能判斷列值是否是普通類型數值
select last_name, commission_pct from employees where commission_pct is null;
安全等於:<=>,可以判斷null值,普通類型的值也可以
排序查詢
order by 排序列表 acc | desc,排序列表可以用逗號分隔
select * from employees order by salary desc
常見函數
調用:select 函數名() from 表
分類:
單行函數:每一行處理,一對一映射
分組函數:多行統計,多對一
單行函數分類:
字符函數:
length:字符串字節長度
concat:拼接字符串
upper:換成大寫
lower:換成小寫
substring,substr:截取字符串,索引從1開始
instr:子串在字符串里的索引
trim:去前后空格,trim("a" from "aaaaBBBBBaaaaBBBBaaa")則結果為 BBBBBaaaaBBBB
lpad:左邊填充字符,最后字符長度為第二個參數指定,可能裁剪
rpad:右填充
replace:替換字符,全部替換
數學函數:
round:四舍五入;兩個參數取小數點位數
ceil:向上取整
floor:向下取整
truncate:截斷,取小數點后位數
mod:取余數,和%一樣
日期函數:
now:當前時間日期
curdate:當前日期
curtime:當前時間
獲取指定的部分,比如年月日:year,month,monthname
str_to_date:將字符串轉為日期
date_format:將日期轉為字符
datediff:算日期差距
其他函數:
verson:數據庫管理軟件版本
database:當前數據庫
user:當前用戶
流程控制函數:
if:參數類似三元運算符
case:
使用1:
case 表達式
when 常量1 then
when 常量2 then
else
end
使用2:多重if
case
when 條件1 then
when 條件2 then
else
end
分組函數
sum
avg
max
min
count
參數類型:sum,avg處理數值型數據,max,min,count處理任何類型;忽略null值
和distinct搭配:sum(distinct 列名),去重后相加,主要給count用
count函數:可用四個參數
參數為*:任何列,只要有非空的,就被統計進去
count(1):每一行加個值為1的列
*一般效率最高
和分組函數一同查詢的字段有限制:
要求是groupby的字段。否則普通字段的話返回的是一組值里的一個,沒意義
分組查詢
1.介紹
select column(不能是隨便的一列), group_func(column)
from table
where condition
group by (分組條件一般是column)
將相同column值的行聚合在一起,可以應用聚合函數,多對一,column相當於一個key帶着一個數組
2.篩選
分組前篩選:針對每一行篩選,where條件指定
分組后篩選:針對聚合結果篩選,having條件指定
篩選總結:篩選數據源不同,原始表或者分組后結果集。分組函數做條件放having字句里,為了性能盡量用分組前篩選
按函數分組:group by后接函數/表達式,這是對每一行算一下添加一個新列(單行函數)
按多個字段分組:多個字段可以組成聯合主鍵唯一標識一個特性,可以一起select出更清楚。即是多個列都一樣的行才能分成一個組內
分組查詢順序:order by后加聚合條件的列名
總結:group by支持按照單個字段分組,也支持按照多個字段分組,也支持表達式/函數分組
連接查詢
多表查詢
1.笛卡爾積
from a,b:默認就是笛卡爾乘積,沒有加任何連接條件。兩個表每一行一一匹配
通過where子句,設置連接條件,篩選里邊的行
2.連接查詢分類
按年代分類:
- sql92標准
- sql99標准
按功能分類:
內連接
- 等值連接
- 非等值連接
- 自連接
外連接
- 左外連接
- 右外連接
- 全外連接
交叉連接
3.等值連接
where指定兩個表的列表達式對比條件,列名有重復的要加表前綴
from子句中用as為表起別名(或者不加as)。起過表別名后,不能再使用原表名
結果是兩個表的交集,相應列在兩個表里都要有
有篩選的查詢:用AND附加在where條件后
多表查詢就是幾個表,找相應列符合條件,條件可以是多個表達式邏輯組合;換句話說就是幾個表挑列
n表連接,至少n-1個連接條件
4.非等值連接
where子句里用非等於號,因為兩個表里的數據不能用等於判斷,可能需要是范圍值
5.自連接
相當於等值連接,但只有一個表,一個表分飾兩個角色
sql99語法
1.介紹
select 列名
from 表1
【連接類型】join 表2
on 連接條件
內連接:inner
左外:left 【outer】
右外:right 【outer】
全外:full 【outer】
交叉連接:cross
2.等值連接
與之前類似,叫了on, join結構更清楚
3.非等值連接
與之前類似,叫了on, join結構更清楚
4.自連接
與之前類似,叫了on, join結構更清楚
5.左右外連接
查詢a表內容不在b表里的行,即一個表中有另一個表中沒有的記錄
一種主從結構,左外連接以左邊的表為主表,右外連接以右邊的表為主表
結果集為內連接結果+主表中有從表中沒有的
判斷在不在一般用主鍵
6.全外連接
MySQL不支持,用聯合查詢代替
是把交集部分查出來+左表有右表沒有+右表有左表沒有
7.交叉連接
笛卡爾乘積
select 列名
from 表1
cross join 表2
總結:join可以有七種,分別查交集,表1+交集,表2+交集,表1,表2,全部,全部-交集
子查詢
1.介紹
出現在其他語句中的select語句,叫做子查詢或者內查詢
外部查詢語句是主查詢或者內查詢
分類:
按結果集的行數不同
標量子查詢:一行一列
列子查詢:一列多行
行子查詢:一行多列
表子查詢:多行多列
2.where
子查詢結果當作條件參數
特點:
1.子查詢放在小括號內
2.子查詢放在條件的右側
3.標量子查詢配合單行操作符使用,>,<等;列子查詢配合多行操作符使用,in 、not in、any、some、all
4.子查詢優先於主查詢先執行,主查詢的條件用到了子查詢結果
非法使用子查詢:數目不對的話,會報錯;空的子查詢結果集結果是空
1.標量
子查詢結果是一個標量,一行一列
2.列
子查詢結果是一個列多行
3.行
一行多列或者多行多列
where條件里向量化,where (列1,列2) = (子查詢(每個列可以是一個函數,得到一行))
3.select
僅僅支持標量子查詢
子查詢結果當作結果集中的一列
可以把當前行相應的列值,送到子查詢里當參數,返回的是一個標量,匹配主查詢里一行,當作結果集
一般可以用表連接替代
4.from
支持表子查詢
子查詢結果當作中間表
子查詢的結果集當成一個表來連接。要用as起個別名方便后面引用
5.exists
相關子查詢,僅僅支持表子查詢
子查詢結果當作條件結果
exists(子查詢)
一個子查詢里有沒有值,有返回1,沒有返回0
用在where里,先執行主查詢,再執行子查詢,過濾,判斷是否在在行。where的本質是返回的值為1,該行保留
分頁查詢
limit子句
limt offset, size
offset從0開始
offset公式是(page-1)* size
union聯合查詢
並集
將多條查詢語句結果,合並為一個結果集(行數相加)
把or這個大的條件,拆成多個,結果集去重
可以實現全連接,但是沒辦法兩個表橫着拼接,只能豎着拼
查詢多個表,多個表沒有關系,但是查詢信息一致
要求:
1.兩個表列數一致
2.列的順序要一致,不然歧義
3.結果集去重,UNION ALL不去重
第六章.DML語言的學習
插入語句
insert
表明 列名 新值
第一種插入:
insert into 表名(列名1,……) values(值1,……)
插入的值要與列類型兼容
可以為空的列,不寫就是插入null;或者寫列名,值用null填充;列的順序可以調換
列和值數量要一致
列名可以省略,默認是所有列,順序不能變
第二種插入:
insert into 表名 set 列名=值,列名=值
對比總結:
方式1支持插入多行
方式1支持子查詢,把子查詢(比如其他表)的結果插入,一個select語句放的都是常量返回的也是一行
修改語句
update
修改單表:
update 表
set 列=新值,列=新值
where
修改多表:
級聯更新
update 表1
連接表2
set 列=值(針對連接后表的列)
where
刪除語句
delete
第一種刪除:
delete from 表名 where
第二章刪除:
truncate table 表名:刪除這個表里的數據
truncate刪除后,自增長列重新開始,delete不會
truncate沒有返回值;delete返回影響幾行
truncate不能回滾,delete可以回滾
第七章.DLL語言的學習
創建/修改/刪除/查詢庫和表
create
alter
drop
show
庫和表的管理
庫:
create database 數據庫名
create database if not exists 數據庫名,數據庫存在也不會報錯
更改庫的字符集:alter database 庫名 character set 【】
drop database ,刪庫
表:
創建:create table 表名(列名 類型 (長度) 約束,)
修改:修改列名,類型,約束,添加列,刪除列,修改表名
修改列名:alter table 表名 change column 舊列名 新列名 類型
修改類型:alter table 表名 modify column 列名 類型
添加列:alter table 表名 add column 新列名 類型
刪除列:alter table 表名 drop column 列名
重命名表:alter table 表名 rename to 新表名
刪除:
drop table 表
復制:
1.僅僅復制表結構
create table 表名 like 現有表
2.復制內容
create table 表名
select * from 表,用子查詢返回一個臨時表
只復制部分列名:子查詢where都是假
常見數據類型介紹
- 數值型
- 整型
- 小數
- 定點數
- 浮點數
- 字符型
- 較短的文本
- char
- varchar
- 較長的文本
- text
- blob
- 日期型
整型:
分類:
Tinyint:1
Smallint:2
Mediumint:3
Int,integer:4
BigInt:8
特點:
設置無符號,有符號:
int類型后邊跟unsigned,即為無符號,否則默認為有符號
超出了范圍,會有警告報錯,數值為0或者插不進去
Int (7)設置顯示結果寬度,zerofill可以用0填充顯示位並且int默認是無符號
小數:
浮點:
float:4
double:8
定點:
dec(m,d):m+2
decimal(m,d):m+2
特點:m代表整數部位+小數部位,d代表小數部位。如果超過范圍,插入臨界值
默認decimal是10,0;float和double沒有限制
定點型精度較高,如貨幣運算
所選擇的類型越簡單越好
字符型:
char(m):最長m個字符,空間固定m個字符,m默認為1
varchar(m):最長m個字符,空間根據實際字符數來取,m不可以省略
bit(m):
binary
varbinary
enum:最多兩個字節,必須是列表中的一個值。enum(“a”, “b”)。不區分大小寫
set:和枚舉類似,可以一次插入列表中的多個。 values(‘a,b,c’)
日期型:
date:4
datetime:8
timestamp:4,范圍比datetime小,和實際時區相關,時間會跟着時區變
time:3
year:1
常見約束
限制數據,保證數據可靠准確性
六大約束:
not null:非空約束
default:默認約束,有默認值
primary key:主鍵約束,具有唯一性非空
unique:唯一約束,唯一性可為空
check:檢查約束,滿足一定條件才可以,MySQL不支持
foreign key(references):外鍵約束。從表添加該約束
show index from 表名:顯示索引。主鍵,外鍵,唯一鍵自動生成索引
創建表和修改表時添加約束
約束分類:
列級
表級
外鍵約束對列級無效
非空和默認約束對表級約束無效
添加列級約束:
約束放在類型后面
添加表級約束:
列最后加約束,constraint 約束名 約束
主鍵和唯一區別:
唯一只可以插一個null
兩個列可以組合成主鍵(定義的時候一起放括號里),唯一鍵,聯合主鍵
外鍵特點:
在從表里設置外鍵關系
主表從表里要類型兼容,名稱無所謂
外鍵在主表里要是key(主鍵或者唯一鍵)
插入數據先插入主表,刪除數據時先刪除從表
不同約束可以用空格間隔約束同一個列
修改表時添加約束:
修改表時(modify),直接在列后邊加約束
表級約束:用Add加約束
修改表時刪除約束:
modify的約束用null替代或者不寫
表級約束:drop 約束類型 約束名
主鍵起約束名字也沒有效果
外鍵級聯刪除:
最后加on delete cascade
外鍵級聯置空:
on delete set null
標識列:
限制某個字段,又叫自增長列
id Int Primary Key auto_increment
變量auto_increment_increment auto_increment_offset定義步長與起始值,MySQL里不能設置起始值
起始值可以用第一條數據插入值來設定
標識列要和key搭配
一個表中只能有至多一個標識列
標識列只能是數值型
修改表時也可以設置標識列
第八章.TCL語言的學習
事物和事物處理
介紹:
事物:一組sql語句成為一個執行單元,要不全部執行,要不都不執行。一部失敗則回滾
show engines顯示存儲引擎
acid:
1.原子性:事物不可分割
2.一致性:事物導致數據從一個一致性狀態轉換為另一個一致性狀態
3.隔離性:事物並發不能互相干擾,需要隔離級別來控制
4.持久性:事物一旦提交,對數據改變是永久的
事物創建:
1.隱式事物:自動開啟,關閉,比如delete/update/create,變量autocommit可以看
2.顯示事物:先關閉自動提交,具有明顯開始結束標志
set autocommit = 0;
start transaction;
commit or rollback,autommit自動開啟
事物並發:
事物訪問相同數據,競爭訪問,在事物過程中會有以下問題:
1.臟讀:t1讀取了t2更新但是回滾的數據
2.不可重復讀:t1讀了一次,t2更新了一次,t1再讀不一樣
3.幻讀:t1讀,t2插入,t1再讀,數據數量變了
隔離級別是隔離程度,隔離級別越高,並發性越差數據一致性越好
MySQL提供四種隔離級別:
1.read uncommitted:臟讀,不可重復讀,幻讀都有
2.read commited:提交后再讀。不可重復讀,幻讀都有。
3.repeatable read:事物里已有數據不能更改。幻讀
4.serializable:沒有問題
MySQL默認隔離級別是repeatable read
Oracle只有兩個,read commited和serializable
查看隔離級別:
變量@@tx_isolation
設置隔離級別:set session transaction isolation level read uncommitted
設置全局隔離級別:set global transaction isolation level read uncommitted
回滾點:
savepoint 節點名;
rollback to 節點名
delete和truncate在事物中的區別:
truncate不能回滾
第九章.視圖的講解
介紹:
虛擬表
臨時性,通過表動態生成,查詢過一次的緩存。視圖是sql語句,而不是查詢結果
適合多次使用,sql比較復雜的情況
視圖一般不帶where之類的語句
重用sql,簡化調用的sql,保護安全
創建:
create view 視圖名
as
查詢語句;
修改:
create or replace view 視圖名
as
查詢語句;
alter view 視圖名
as
查詢語句;
刪除:
drop view 視圖名1,視圖名2
查看:
desc view1
show create view view1(顯示創建視圖過程)
視圖里實現插入:
insert into view1 values()
更改和刪除亦可,但是受到限制
具有以下元素的視圖不能被更新
- 分組函數,distinct,group by,having,union,union all
- 常量視圖
- select包含子查詢
- join
- from一個不能更新的視圖
- where子句的子查詢引用了from子句中的表
不能有中間表
視圖和表的區別
create view
create table
表占用物理空間
第十章.變量
分類:
1.系統變量
變量由系統提供的
查看所有變量
show global | session variables
查看滿足條件的系統變量
show global | session variables like ‘%變量名%’
查看指定變量的值
select @@global | session.系統變量名
為某個系統變量賦值
set global | session 系統變量名 = 值
set @@global | session.系統變量名 = 值
什么也不寫默認會話級別
1.全局變量
重啟后全局變量修改無效,要改配置文件才行
2.會話變量
2.自定義變量
使用步驟:
聲明
賦值
使用
1.用戶變量
會話期有效
set @用戶變量名=值
set @用戶變量名:=值
select @用戶變量名:=值
select 字段名 into 變量名 from 表
2.局部變量
作用域在begin end塊中,且聲明為第一句
聲明:
declare 變量名 類型 default 默認值
賦值:
set 用戶變量名=值
set 用戶變量名:=值
select @用戶變量名:=值
select 字段名 into 變量名 from 表
使用:
select 局部變量名
第十一章.存儲過程和函數
提供代碼重用性
簡化操作
存儲過程
一組預先編譯好的SQL語句集合,類似批處理語句
可以有預編譯,多條語句只需連接一次數據庫
語法:
創建:
create procedure 存儲過程名(參數列表)
begin
方法體
end
參數列表包含三部分:
參數模式 參數名 參數類型
參數模式:in out inout
存儲過程只有一句話,begin end可以省略
delimiter 結束標志,重新設置存儲過程結尾,默認是分號,但是在客戶端不好用
使用:
call 存儲過程名(實參列表)
空參列表:
不帶參數,直接調用
in模式:
參數不帶返回值
out模式:
保存返回值
inout模式:
參數既有輸入,也保存返回值
存儲過程刪除:
drop procedure 存儲過程名字
一次只能刪除一個
存儲過程查看:
show create procedure 存儲過程名
函數
和存儲過程區別:
函數有且只能有一個返回(適合處理數據);存儲過程可以有0個或多個 (適合增刪改)
創建函數:
create function 函數名(參數列表) returns 類型
begin
函數體
end
注意事項:
參數列表:參數名,參數類型
函數體:要有return語句
函數體只有一句話,省略begin end
調用函數:select 函數名(參數列表)
刪除函數:
drop function 函數名
查看函數:
show create function 函數名
第十二章.流程控制結構
介紹
順序結構
分級結構
循環結構
case:
類似switch,等值判斷
case 值
when 值1 then;
when 值2 then;
else ;
end case;
類似if,區間判斷
case
when 條件1 then;
when 條件2 then;
else;
end case;
既可以作為表達式,也可以做語句
if:
if 條件1 then ;
elseif 條件2 then;
else ;
end if;
循環:
分類:
while
loop
repeat
控制:
iterate 標簽名
leave 標簽名
標簽: while 循環條件 do
循環體
end while 標簽;
標簽: loop
循環體
end loop 標簽;
模擬死循環
標簽:repeat
循環體
until 結束循環條件
end repeat 標簽;
至少執行一次
第十三章 觸發器
為某張表綁定好代碼,當表中內容改變時(增刪改),觸發代碼執行
觸發器:事件類型,觸發時間,觸發對象
觸發類型:增刪改
觸發時間:前后
觸發對象:行記錄
MySQL高級結構沒有大括號,都是用字符符號代替
創建
create trigger 觸發器名 觸發時間 事件類型 on 表名 for each row
begin
end;
查看
show triggers 【like ‘pattern’】
show create trigger 觸發器名字
\G:結果顛倒90度
觸發器保存到information_schema.triggers表中
使用
某種情況發生,自動觸發
刪除
drop tirgger 觸發器名字
記錄
每個操作要執行,系統將操作的數據新舊狀態記錄下來
訪問使用old.字段名和new.字段名
第十四章 游標
第十五章 事件
定時器,時間到了自動執行