mysql知識碎片(筆記)

創建數據庫時修改數據庫格式
create database if not exists {dbname} character set gbk

修改數據庫編碼方式

alert Database {dbname} character set = utf8

整型
tinyint -128 到 127 unsigned 0 到 255 佔一個字節

smallint -2(15)次方 到 2(15)次方-1 unsigned 0 到 2(16)次方-1 佔2個字節

mediumint -2(23)次方 到 2(23)次方-1 unsigned 0 到 2(24)次方-1 佔3個字節

int -2(31)次方 到 2(31)次方-1 unsigned 0 到 2(32)次方-1 佔4個字節

bigint -2(63)次方 到 2(63)次方-1 unsigned 0到2(64)次方-1 佔8個字節

浮點型
float(m,d) 爲數字總位數,d是小數點後面的位數 so m>=d

double(m,d)

decimail(m,d)

double是float幾乎是存儲的兩倍 一般用float 因爲存儲範圍越大,佔得字節也就越大

float佔4個字節,double佔8個字節,decimail(M,D)佔M+2個字節(價格設置建議使用)

char(m) m個字節 m:0–255

varchar(m) m<65535
以上兩個的區別是比方說存儲一個abc,若使用char存儲,則abc所佔字符的剩餘部分用XXX補全,而varchar是隻存儲abc

tinytext 2(8)+1
text 2(16)+2個字節
mediumtext 2(24)+3個字節
longtext 2(32)+4個字節

多出來加的字節都是用來保存數據值的長度的,對長度可變的數據進行處理的時候,mysql要把數據內容和長度都保存起來

enum(‘男’,’女’,’保密’) 佔1或2個字節 ,取決於枚舉值的個數,最多65535個值

set(”,”) 1,2,3,4或8個字節,取決於set成員的數目,最多64個成員
enum相當於單選,set相當於多選

unique key 唯一約束 保證記錄唯一性 可以爲空 可以存在多個唯一約束

default”;

foreign key (表屬性) references {tablename} (表屬性) 設置外鍵
cascade 從父表刪除或更新且自動刪除或更新子表中的匹配項

修改表
添加單列
alter table {tablename} add {屬性 屬性類型}after {列明}
after後面不寫則會插入到表的最後一行,寫了after表示插入到某列之後

添加多列
alter table {tablename} add ({屬性 屬性類型},{屬性 屬性類型}…)

修改數據表列位置和屬性(比方說把 tinyint類型改成smallint)
alter table {tablename} modify {屬性 屬性類型} first/after…

修改數據表列名稱和屬性
alter table {tablename} change{屬性 屬性類型}

修改數據表名
alter table {tablename} rename {新的表名}

select中查詢中屬性的別名用as
group by 對查詢結果進行分組
having 分組條件 having中的出現的屬性 必須要在select中體現,或者having裏出現的屬性,必須要包裹在聚合函數類(如count,sum,max,min,AVG,round)

保留小數 用round(m,d) d代表要四捨五入的小數點後的位數

子查詢必須出現在圓括號內,可以包括多個關鍵字或者條件
子查詢可以返回一個標量,

比較運算符,>= <= = > < 要配合any all some使用

,>= +any/some 指的是大於最小值就可以了
<,<= +any/some 指的是小於最大值就可以了
= +any/some 指的是等於任意值

,>= +all 指的是大於最大值
<,<= +all 指的是小於最小值
<>,!= +all 指的是不等於任意值

=any 跟 in等效
!=all ,<>all 跟 not in等效

多表更新
鏈接類型
{[inner|cross]join|{left|rignt}[outer]join}
update {tablename} inner join {tablename} on {一張表的屬性} = {另一張表的屬性}(這裏是找出相等屬性值) set {表屬性} = {表屬性}(這裏將右邊屬性值賦給左邊)

select * from table1 as a inner join table2 as b on a. = b.*

內鏈接,僅顯示左表及右表符合鏈接條件的記錄
左外連接 顯示左表中的全部記錄以及右表中符合條件的記錄
右外連接 顯示右表中的全部記錄以及左表中符合條件的記錄

刪除多條記錄
delete t1 from {tablename}as t1 left join {tablename}as t2 where t1.* = t2.*

字符函數
concat()字符鏈接 concat(‘a’,’-‘,’b’) 代表a-b
concat_ws()使用制定分隔符鏈接 concat_ws(‘|’,’a’,’b’,’c’) 代表a|b|c

format()數字格式化,format(1000.00,2) 代表1,000.00 千分位

lower()英文變小寫
upper()英文變大寫

left()從左側開始截取 left(‘mysql’,2)代表my
right()從右側開始截取 right(‘mysql’,3)代表sql

length()獲取字符長度,空格也算一個長度

ltrim()刪除前導空格
rtrim()刪除後續空格
trim()刪除前導和後續空格

substring() 截取字符串
like/not like匹配相似字符

查找屬性中包含%的
select * from {tablename} where {屬性} like ‘%1%%’ escape’1’;

數值運算符
ceil()向上去整
div 整數除法
floor()向下取整
mod取餘數
power()冪運算 power(3,3)代表3的3次方=27
round()四捨五入 round(23.2367,2)代表保留這個數的小數點後兩位 23.24
truncate()數字截取 truncate(23.2367,2)結果是23.23

比較運算符
(not)between..and .. (不)在範圍之類
(not)in() (不)在列出的範圍之類
is(not)null (不)爲空

創建自定義函數

不帶參數的自定義函數
create function f1()
returns varchar(30) //定義返回數據類型
return date_format(now(),’Y年m月d日 H時i分s秒’)//函數內的操作

帶參數的自定義函數
create function f2(num1 smallint unsigned,num2 smallint unsigned)
returns float(10,2) unsigned
return (num1+num2)/2

函數體爲複合結構則使用begin..end語句
create function adduser(username varchar(20))
returns int unsigned
begin
insert test(username) values(username);
return last_insert_id();
end

刪除函數
drop function [if exists] {functioname}

創建存儲過程:
create procedure removeUserById(IN p_id int unsigned)
begin
delete from users where id = p_id
end

刪除存儲過程
drop procedure [if exists] sp_name

調用存儲過程:
call {存儲名}(參數)

用in輸入數據處理 用out輸出數據
create procedure removeUserAndReturnUserNums(IN p_id int unsigned,OUT userNums int unsigned)
begin
delete from user where id = p_id;
select count(id) from users into userNums;
end

call removeUserAndReturnUserNums(27,@num)
@num爲一個變量
然後select @num 輸出數據總條數(select count(id) from users)

在begin end結束之後局部變量也就消失了

set @i = 7;被稱爲用戶變量

局部變量用一個@標識,全局變量用兩個@(常用的全局變量一般都是已經定義好的);

申明局部變量語法:declare @變量名 數據類型;例如:declare @num int;

賦值:有兩種方法式(@num爲變量名,value爲值)

set @num=value; 或 select @num=value;

row_count()獲取被插入,刪除,更新所影響的行數
php中的mysql_affected_rows()就是調用了這個方法

把一些複雜的操作封裝成存儲過程,可以提高性能

創建存儲過程時需要通過delimiter語句修改定界符

存儲引擎特點:
myisam:存儲限制可達256tb,支出索引,表鎖(表級鎖定),數據壓縮

Innodb:存儲限制爲64tb,支持事務和索引,行鎖,支持外鍵

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章