mysql數據庫
mysql常用語句
連接數據庫:mysql -u root -p
斷開數據庫: exit
庫操作
1)新增數據庫 create database 數據庫名稱 [庫選項];
庫選項:用來約束數據庫
如:字符集設定 charset 具體字符集(數據存儲的編碼格式)常用GBK UTF8
注意:數據庫名稱不能用關鍵字或保留字,若非要用關鍵字可以用反引號
2)查看字符集編碼 echo $LANG
3)查看數據庫
<1>查看所有數據庫 show databases;
<2>查看指定部分數據庫(模糊查詢) show databases like 'pattern' (pattern是匹配模式,%表示匹配多個字符,_表示匹配一個字符)
<3>查看數據庫的創建語句 show create database 數據庫名稱;
4)更新數據庫(數據庫的名字不能修改,數據庫的修改僅限於庫選項)
alter database 數據庫名稱 [庫選項] charset 字符集;
5)刪除數據庫 drop database 數據庫名稱;
當執行這句話後, 1.數據庫內部看不到對應的數據庫
2.對應的數據庫文件夾被刪除,級聯刪除,裏面的數據表全部被刪除(不要隨意刪除數據庫和修改)
表操作
在某個數據庫下建表,首先 use 數據庫名稱;
1)新增表
create table [if nei exits] 表名
(
字段名稱 類型,
字段名稱 類型
)[表選型];
if not exits:如果表名不存在,就創建,否則不執行創建代碼,檢查功能
表選型:控制表的表現
charset 具體字符集; 保證表中數據存儲的字符集
存儲引擎:engine 具體存儲引擎(innodb,myisam)
例: create table bit
( name varchar(10),
room varchar(10)
)charset utf8;
2)查看數據表
<1>查看所有表 show tables;
<2>查看部分表 show tables like 'parrent'
<3>查看錶的創建語句 show create table 表名\G
<4>查看錶結構 desc 表名;
3)修改數據表
表本身存在,還包含了字段:表的修改分爲兩個部分:
1>修改表本身
修改表名 rename table 原本表名 to 新表名;
修改表選項 alter table bit_student charset gbk;
修改表字段:新增,修改,重命名,刪除
1.1 新增字段 alter table 表名 add 字段名 數據類型 [位置];
位置:字段名可以放在表中的任意位置 first 第一個位置 after:在哪個字段之後
1.2 修改字段:通常修改屬性或數據結構
alter table 表名 modify 字段名 數據類型 [屬性][位置]
1.3 重命名字段: alter table 表名 change 舊字段 新字段名 數據類型 [屬性][位置]
1.4 刪除字段:alter table 表名 drop 字段名 (如果表中已經有數據,那麼刪除字段會清空該字段的所有數據)
1.5 刪除表: drop table 表名1,表名2.... (可以一次性刪除多張表)
2>數據操作
新增數據: insert into 表名[(列1,列2,...)] values(v1,v2...) (非數值數據都要用單引號括起來)
查看數據: select */字段列表 from 表名 [where條件列表]
查找所有數據: select * from 表名
更新數據: update 表名 set 字段=值 [where條件]
刪除數據:delete from 表名 [where條件] (刪除時不可逆的)
查看服務器識別的字符集: show charset;
mysql的數據類型
1)數值型
整數型 tinyint(1字節)、smallint(2字節)、mediumint(3字節)、int(4字節)、bigint(8字節)
小數型 浮點(小數點浮動,精度有限,會丟失精度) float、double 定點(小數點固定,精度固定,不會丟失精度) decimal
SQL中數值類型默認都是有符號的,當需要使用無符號數據,需要給數據類型限定如: int unsigned
浮點型數據是一種精度型數據,因爲超出指定範圍後,會丟失精度(四捨五入)
float:單精度,佔4字節,精度範圍7位左右
double:雙精度,佔8字節,精度範圍15位左右
浮點的使用方法:直接float表示沒有小數部分,float(M,D) M表示總長度,D表示小數部分
浮點數的插入:整數部分不能超出長度,但小數部分可以超出(因爲系統會自動四捨五入)
定點型:絕對保證整數部分不會被四捨五入(不會丟失精度),小數部分有可能丟失
DECIMAL:變長,大致每9個數字,採用4字節存儲
DECIMAL(M,D):M最大是65,D最大是30 默認是(10,2)
定點數的插入:定點數的整數部分不能超出長度,小數部分可以超出長度,系統自動四捨五入
2)時間日期類型
datetime:時間日期格式'yyyy-mm-dd HH:ii:ss' 表示範圍從1000到9999
date:日期 'yyyy-mm-dd'
time:時間段 指定某個區間之間 -時間 +時間
timestamp:時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss 格式和datetime完全一致
時間出:只要當前所在記錄被更新,該字段一定會自動更新成當前時間
3)字符串類型
定長字符串
char:表在定義結構的時候,就已經確定了最終數據的存儲長度
char(L):L達標length,可以存儲的長度,單位爲字符,最大長度值可以爲255
如:char(4):在utf8環境下,需要4*3=12個字節
變長字符串
varchar,在分配空間的時候,按照最大的空間分配,但實際上最終用了多少根據具體的數據來確定
varchar(L):L表示字符長度,理論長度65536個字符,但是,假設分配的長度是100,實際存放的是5個,那怎麼取得5個字符,它會多出一個表示實際上存儲多少個字符的長度成員。但實際上,文本長度超過255,既不是用定長也不是用變長,使用text
如何選擇定長或變長字符串?
定長的磁盤空間比較浪費,但是效率高;變長的磁盤空間比較節省,但是效率低
文本字符串
如果數據量非常大,通常超過255,就會使用文本字符串
文本字符串根據存儲的數據格式進行分類:text和blob
text:存儲文字
blob:存儲二進制
列屬性
列屬性:真正約束字段的數據類型,但是數據類型約束很單一,需要一些額外的約束更好的保證數據的合法性
列屬性有:NULL/not null,default,primary key,unique,auto_increment,comment
數據庫默認字段基本都是字段爲空,但實際開發中,儘可能保證字段不爲空,因爲數據爲空沒有辦法參與運算
列描述
列描述:comment,沒有實際含義,專門用來描述字段,會根據表創建語句保存,用來給程序員或DBA來進行了解
默認值 default
默認值:某一種數據會經常出現某個具體的值,可以在一開始就指定好,在需要真實數據時,用戶可以選擇的使用默認值
數據在插入的時候不給字段賦值,就使用默認值
主鍵 primary key
用某個字段來唯一表示所有記錄時,設置主鍵。用來唯一的約束該字段裏面的數據,不能重複,不能爲空 一個表中最多只能有一個主鍵
1.增加主鍵
1)創建表的時候直接在字段上指定主鍵
2)在創建表的時候,在所有字段之後
3)當表創建好以後,可以再次追加主鍵
主鍵約束:主鍵對應的字段不能重複,一旦重複,操作失敗
刪除主鍵:alter table 表名 drop primary key;
自增長
自增長:當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操作,得到一個新的不同的值,通常和主鍵搭配使用,作爲邏輯主鍵
自增長的特點:auto_increment
1.任何一個字段要做自增長,前提是本身是一個索引(key一欄有值)
2.自增字段必須是整數
3.一張表最多只能有一個自增長
唯一鍵
一張表中往往有很多字段需要唯一性,數據不能重複,但是一張表中只能有一個主鍵:唯一鍵就能解決表中有多個字段需要唯一性約束的問題
唯一鍵的本質和主鍵差不多,唯一鍵允許爲空,而且可以多個爲空,空字段不做唯一性比較
增加唯一鍵
索引
索引:系統根據某種算法,將已有的數據(未來可能新增的數據),單獨建立一個文件:文件能夠實現快速的匹配數據,並且能夠快速的找到對應的記錄。
索引的意義:1.提升查詢數據的效率 2.約束數據的有效性(唯一性等)
增加索引的前提條件:索引本身會產生索引文件(有時可能比數據文件還大),非常海飛磁盤空間
如果某個字段經常作爲查詢字段,可以爲該字段建立索引
如果某個字段需要進行數據的有效性約束,也需要使用索引(主鍵,唯一性)
mysql中提供了多種索引:
1.主鍵索引:primary key
2.唯一索引:quique
3.普通索引:index
4.全局索引
創建索引:create index index_name on tbl_name (index_col_name,...);
索引的使用原則:
1.在大表上建立索引纔有意義
2.在where子句或是連接條件上經常使用的列上建立索引
3.索引的層次不要超過4層
索引的缺點
1.建立索引,系統要佔用大約爲表的1.2倍的硬盤和內存空間來保存索引
2.更新數據的時候,系統必須用額外的時間來對索引進行更新
關係
將實體與實體的關係反應到最終數據庫表的設計上,將表與表的關係分成三種:1對1,1對多,多對多
一對一:一張表的一條記錄一定只能在另外一張表的一條記錄進行對應,反之亦然
一對多:一張表中有一條記錄可以對應另外一張表中的多條記錄,但是反過來,另外一張表中的一條記錄只能對應第一張表的一條記錄,這種關係就是一對多
多對多:一張表(A)中的一條記錄能夠對應另外一張表(B)中的多條記錄;同時B表中的一條記錄也能夠對應A表中的多條記錄,多對多的關係
範式
範式:Normal Format是離散數學上的概念,爲了解決一種數據的存儲與優化的問題,保證數據在存儲之後,凡是能夠通過關係尋找出來的,堅決不再重複存儲,終極目標是減少數據冗餘
範式:是一種分層結構的規範,分爲6層,每一層比上一層更加嚴格,若要滿足下一層範式,前提是滿足上一層範式
六層範式:1NF,2NF...6NF 1NF是最底層,要求最低,6NF是最高層,最嚴格
範式在數據庫的設計中具有指導意義,但不是強制規範
1NF:指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性
2NF:是對記錄的唯一性約束,要求記錄有唯一標識
3NF:要滿足第三範式,必須滿足第二範式。 第三範式,理論上說,應該一張表中的所有字段都依賴主鍵(邏輯主鍵除外),如果表設計中存在一個字段,並不直接依賴主鍵,而是通過某個非主鍵字段依賴,最終實現依賴主鍵:把這種不是直接依賴主鍵,而是依賴非主鍵字段關係稱之爲依賴傳遞。第三範式就是要解決傳遞依賴的問題
數據的高級操作
數據操作:增刪改查
新增數據
基本語法 insert into 表名 [(字段列表)] values(值列表);
在數據插入的時候,假設主鍵對應的值已經存在:插入失敗
主鍵衝突
當主鍵存在衝突的時候(duplicate key),可以選擇性的進行處理:更新或替換
1.主鍵衝突:更新操作
insert into 表名(字段列表) values(值列表)on duplicate key update 字段=新值;
2.主鍵衝突:替換
replace into 表名(包含字段) values(值列表); 主鍵如果沒有衝突,就直接插入
蠕蟲複製
蠕蟲複製:從已有的數據中獲取數據,然後將數據又進行新增操作,將數據成倍增加
表創建,從已有表創建新表(複製表結構,不復制數據)
create table 表名 like 數據庫.表名;
蠕蟲複製:先查出數據,然後將查出的數據新增一遍
insert into 表名[(字段列表)] select 字段列表/* from 數據表名;
蠕蟲複製的意義:
1.從已有表中拷貝數據到新表中
2.可以迅速的讓表中的數據膨脹到一定的數量級,用來測試表的壓力及效率
更新數據
基本語法 update 表名 set 字段=值 [where 條件];
高級新增語法 表名 set 字段=值 [where 條件] [limit 更新數量];
刪除數據
通過limit來限制刪除數量
delete from 表名 [where 條件] [limit 數量];
如果表中存在主鍵自增長,當刪除後,自增長並不會還原,繼續按照原來的值增長
思路:數據的刪除不會改變表結構,只能刪除表後,重建表
truncate 表名; --先刪除該表,後新增該表 清空表後
查詢數據
完整語法 select [select選項] 字段列表[字段別名]/* from 數據源 [where 條件] [group by 子句] [having 子句] [order by 子句] [limit 子句];
slelect選項:select 對查出來的結果進行處理方式
all:默認的,保留所有結果
distinct:去重,查出來的結果,將重複(所有的字段都相同)結果去重
字段別名:當數據查詢出來的時候,有時候名字不一定滿足需求(多表查詢時,會有同名字段),需要對字段進行重命名,就叫別名
語法
字段名 [as] 別名
數據源
數據的來源,關係型數據庫的來源都是數據表,本質上只要保證數據類似二維表,最終都可以作爲數據源
數據源分爲多種:單表數據源,多表數據源,查詢語句
從一張表中取出一條記錄,去另外一張表中匹配所有記錄,並且全部保留(記錄和字段),將這種結果稱爲:笛卡爾積
子查詢:數據的來源是一條查詢語句(查詢的結果是二維表)
select * from (select 語句) as 表名;
where子句
where子句用來判斷數據,篩選數據
where子句返回結果,0或者1,0表示false,1表示true
判斷條件:比較運算符:>,<,>=,<=,!=,<>,=,like,between and,in ,not in
邏輯運算:&& || !
where原理:where是唯一一個直接從磁盤獲取數據的時候就開始判斷條件,從磁盤取出一條記錄,開始進行where判斷,判斷的結果如果成立就保存到內存,如果失敗就直接放棄
select * from 表名 where 1; 表示所有條件都滿足
group by 子句
分組的意思:根據某個字段進行分組(相同的放一組,不同的分到不同的組)
基本語法:group by 字段名;
分組的意義是爲了統計數據(按組統計:按分組字段進行統計)
SQL提供了一系列統計函數:count():統計分組後的記錄數,每一組多少條記錄
max():統計分組後,每組中的最大值
min():統計分組後,每組中的最小值
avg():統計分組後,每組中的平均值
sum():統計分組後,每組的和
分組後自動排序:根據分組字段排序,默認是升序
group by 字段[asc|desc];對分組的結果合併後的整體進行排序
having 子句
與where子句一樣,進行條件判斷
where是針對磁盤數據進行判斷,進入內存之後會進行分組操作,分組結果需要having來處理
order by 子句
order by:排序,根據某個字段進行升序或降序排序
基本語法: order by 字段名1,字段名2... [asc|desc]
limit 子句
1.limit 數量; 子句限制數據量
2.limit 起始位置,長度; 經常用於分頁
連接查詢
連接查詢:將多張表(可以大於2張)記錄進行記錄的連接(按照某個指定的條件進行數據拼接)
連接查詢的意義:在用戶查看數據的時候,需要顯示的數據來自多張表
連接查詢分類:SQL中連接查詢分爲:內連接,外鏈接,自然連接和交叉連接
交叉連接:cross join,從一張表中循環取出每一條記錄,每條記錄都從另外一張表中匹配,匹配一定保留,而連接本身字段會增加,最終形成的結果叫笛卡爾積
基本語法:左表 cross join 右表;<----> from 左表,右表;
select * from dept cross join dept;
dept cross join dept是數據源。笛卡爾積沒有意義,所以交叉連接沒用,交叉連接存在的價值,保證連接結果的完整性
內連接
內連接:[inner] join,從左表中取每一條記錄,去右表中與所有的記錄進行匹配,匹配必須是某個條件在左表中與右表相同最終纔會保留結果,否則不保留
基本語法:左表 [inner] join 右表 on 左表.字段=右表.字段
on表示連接條件,條件字段就是代表相同業務含義
字段別名以及表別名的使用,在查詢數據的時候,不同表有同名字段,這個時候需要加上表名才能區分,而表名太長,通常可以使用別名
外連接
外連接:outer join,以某張表爲主,取出裏面的所有記錄,然後每條與例外一張表進行連接;不管能不能匹配上條件,最終都會保留,能匹配正確保留,不能匹配,就將其他表中的字段都置爲NULL
外連接分爲兩種:是已某張表爲主:有主表
left join:左外連接,以左表爲主表
right join:右外連接,以右表爲主表
基本語法:左表 left/right join 右表 on 左表.字段=右表.字段;
自然連接
自然連接:natural join,自然連接就是自動匹配連接條件:系統以字段名字作爲匹配模式,同名字段就作爲條件,多個同名字段都作爲條件
自然連接:分爲自然內連接和自然外連接
select * from EMP natural join DEPT;--比較出EMP和DEPT中的同名字段相等的匹配出來,連接之後會合並同名字段
基本上不用自然連接
外鍵
如果一個實體的某個字段,指向另外一個實體的主鍵,就稱這個實體的這個字段爲另外一個實體的外鍵
基本語法:foregin key (本表字段) references 主鍵表(主鍵字段);
級聯操作
on update 主表更新時,從表的外鍵才做出相應的改變
on delete 刪除時,從表的外鍵才做出相應的改變
on後面表示級聯操作:在主表發生變化時,與之關聯的從表數據如何處理
cascade,如果主表被刪除或更新,從表就做出相應的操作
set null,設置爲null,表示從表不指向任何主表的記錄
restrict,拒絕主表相關的操作
視圖
視圖是一個虛擬的表,其內容由查詢定義,視圖並不實際存在,行和列有定義視圖的查詢所引用的表
創建視圖: create view 視圖名 ;
刪除視圖: drop view 視圖名;
視圖和表的區別:
1.表要佔用磁盤空間,視圖不需要
2.視圖不能添加索引
3.使用視圖可以簡化查詢
4.視圖可以提高安全性
事務
事務用於保證數據的一致性
SQL執行分成兩步:1.執行階段 2.將結果提交到數據庫
如果用戶選擇提交數據纔將數據提交到數據庫。默認是自動提交,關閉自動提交
set autocommit=0;
1.開啓事務:告訴系統一下寫操作不要直接寫入數據表,先存放到事務日誌
start transction 提交失敗時回到start狀態
2.進行事務操作,一些列操作
3.提交事務或回滾事務
commit rollback
變量定義
1.set @name:='張三'; select @name;
MYSQL中允許從表中獲取數據,然後賦值給變量
select @變量:=字段名 from 數據源; --從字段中取值賦給變量
select 字段名 from 數據源 into @變量;
2.declare 變量名 類型 [default 默認值];
說明:1.它必須先定義 2.賦值 set 變量:=值; 3.它只能在編程環境下使用
編程環境:存儲過程,函數,觸發器
if判斷
--單分支
if 條件 then
--代碼
end if;
--雙分支
if 條件 then
--代碼1
else
--代碼2
end if;
--多分支
if 條件 then
--代碼1
elseif 條件 then
--代碼2
else
--代碼3
end if;
存儲過程:類似函數,把一段代碼封裝起來,當要執行這段代碼時,調用存儲過程來實現
語法:create procedure 過程名(參數,...)
begin
--代碼
end‘’
例:接收4個數字,如果輸入1則輸出spring,2summer,3autumn,4winter,輸入其他出錯
case判斷
case 變量
when 值 then 語句;
when 值 then 語句;
else 語句;
end case;
例:接收4個數字,如果輸入1則輸出spring,2summer,3autumn,4winter,輸入其他出錯
循環
MYSQL支持的循環有loop,while,repeat循環
(1)loop循環
標籤名:loop
leave 標籤名 --退出循環
end loop;
例:使用loop循環,計算1到n的和
(2)while循環
while 條件 do
--代碼
end while;
例:使用while循環,計算1到n的和
(3)repeat循環
repeat
--代碼
until 條件 end repeat;
例:使用repeat循環,計算1到n的和
觸發器
事先爲某張表綁定好一段代碼,當表中的某些內容發生改變時(增刪改)系統會自動觸發代碼
觸發器:事件類型,觸發時間,觸發對象
事件類型:增刪改
觸發時間:before和after
觸發對象:表中的每一行記錄
創建觸發器:
delimiter 自定義符號;後序代碼中只有碰到自定義符號纔算結束
基本語法:
create trigger 觸發器名字 觸發時間 事件類型 on 表名 for each row
begin --代表左括號
--裏面是觸發器的內容,每行內容必須使用;結束
end
delimiter ;
存儲過程
存儲過程簡稱爲過程(procedure),是一種沒有返回值的函數
創建存儲過程
delimiter $$
create procedure 過程名字([參數列表])
begin
--過程體
end$$
delimiter ;
說明:(1)存儲過程中,可以有各種編程元素:變量,流程控制,函數調用
(2)還可以有:增刪改查各種sql語句
(3)其中select會作爲存儲過程之後的結果集返回
(4)形參可以設定數據的進出方向
查看存儲過程:show procedure status\G
調用過程:call 過程名();
刪除過程:drop procedure 名字;
存儲過程參數
過程的類型限定:
in:數據只是從外部傳遞給內部使用(值傳遞),可以是數值也可以是變量,缺省是in
Out:不允許過程內部使用(不用外部數據),給外部使用(引用傳遞,外部數據會被先清空纔會進入內部)
inout:外部數據可以在內部使用,內部修改也可以給外部使用
基本使用:
create procedure 過程名(in 形參名字 數據類型,out 形參名字 數據類型,inout 形參名字 數據類型)
begin
...
end