MYSQL学习笔记!

MYSQL学习笔记!_第1张图片
Paste_Image.png
数据类型-整数类型
tinyint(1), smallint(2), mediumint(3),int(4), bigint(8)。括号中表示该类型所占空间的长度(字节数)
整数类型通用设定形式: 类型名[(M)] [unsigned] [zerofill]。
MYSQL学习笔记!_第2张图片
Paste_Image.png
数据类型-小数类型

单精度浮点型:
float,范围大约是-3.4E+38到-1.1E-38、0和1.1E-38到3.4E+38
双精度浮点型:
double,范围大约是-1.7E+308到-2.2E-308、0和2.2E-308到 1.7E+308。 real是double的别名。
定点型:
decimal,也可以写成:dec,numeric,fixed(当然后3者尽量不用)。decimal类型整数最大65位,小数最大30位(均以10进制计)
数据类型-字符类型

定长字符串char:
不足设定值,则右侧自动填空格;最大255个字符,有编码问题
变长字符串varchar:
最大65532个字节,实际还得考虑一行的其他字段所占的长度,因为一行的最大长度是65534个字节,有编码问题
定长二进制字符串binary:
类似char,只是按“字节”存字符数据,最大255个字节,无编码问题
变长二进制字符串varbinary:
类似varchar,只是按“字节”存字符数据,最大65532个字节,无编码问题
文本列类型text:
用于存储普通文本,不受行的最大长度的限制,同类还有:tinytext, mediuntext, longtext
二进制列类型blob:
用于存储二进制字节内容,不受行的最大长度的限制,同类的还有:tinyblob, mediumblob, longblob
枚举类型enum:
enum('value1', 'value2', ... )
set类型
set('value1', 'value2', ...)

date类型: 
支持的范围为'1000-01-01'到'9999-12-31'
time类型: 
支持的范围是'-838:59:59'到'838:59:59'
datetime类型:
支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
timestamp类型:
时间戳,就是表示“当前时刻”,用于INSERT或UPDATE操作时自动获得当前时间
year类型: 四位字符串,范围为'1901'到'2155'


mysql编程-内置函数
数值函数:
abs(x),         //x代表一个数字,下同。
ceiling(x),
floor(x), 
pi(), 
pow(x,y), 
rand():select * from table order by rand() limit 10; //随机从表中取10条记录
round(x), 
sqrt(x);
字符串函数: (以下x表示一个数字,str表示一个字符串)
ascii(str):返回str的ascii码 
bin(x):获取数字x的二进制字符串形式
cast(exp as char): 将exp转换为char类型
char(x1,x2, ...): 返回若干个数字对应的字符串
char_length(str): 返回字符数,length(x)返回字节数

concat(str1,str2,...): 连接字符串,任何字符串和null进行连接的结果都将是null 
concat_ws(sep,str1,str2,....) 連接字符串,用sep分割。
group_concat(str1,str2,...)   连接字符串,任何字符串和null进行连接的结果都将是null 

format(x, d): 将数字x格式化为“##,###,###.###”的字符形式,并保留d位 
instr(str, substr): 取得str中第一次出现substr的位置(位置从1开始算起) 
lcase(str)
lower(str):小写
ucase(str)
upper(str):大写
left(str, x): 取得s左边 x 个字符
right(str,x):取得右边 x 个字符
lpad(str,len,padstr): 用字符串 padstr 对 str 最左边填充,直到长度为 len 个字符长度
rpad(str, len, padstr):用字符串 padstr 对 str 最右边填充,直到长度为 len 个字符长度
ltrim(str):左边去空格
rtrim(str)右边去空格
trim(str)两边去空格

repeat(str, count): 返回重复str字符count次。
replace(str,a,b):字符串 str中 查找所有 a 字符,替换成 b 字符。

insert(str,x,y,instr):将str,从x位置开始,y长的字符串替换为字符串 instr ;
案例: select inset('abcdefg',4,4,'1234') 结果:abc1234

reverse(str):反转字符
strcmp(str1, str2): 比较字符串s1和s2的ASCII码值的大小。
如果s1比s2下,那么返回-1;如果s1和s2相等,那么返回0;如果s1和s2大,那么返回1

mid(str, x, y): 截取字符串str,从 x 位置开始,取 y 个

substring(str,x,y):截取字符串str,从x位置开始( x 为正从左开始,x 为负从右开始),取y(四舍五入取整数)个
substring_index(str,x,y); 用 x 拆分字符串 str ,取 y (y为正从左,为负从右开始)个拆分的值

时间日期函数: (以下t, t1, t2均表示一个时间/日期数据)
addtime(t1,t2):将时间t2加到时间t1上
curdate(), current_date();
curtime(), current_time();
date(t): 取得t的日期部分(即年月日)
day(t):取得t的日期数(1-31)
dayname(t): 取得星期名(英文单词)
dayofweek(t): 取得星期数(1-7)
datediff(t1, t2): 取得t1和t2相差的天数,t1大则为正数
时间日期函数: (以下t, t1, t2均表示一个时间/日期数据)

FROM_UNIXTIME(time,'%Y-%m-%d %H:%i:%s') : 如果数据库 time 字段存的是int型,要转换成date 或者 datetime 或者 time类型
select *,FROM_UNIXTIME(create_time,'%Y-%m-%d %H:%i:%s') add_time from user;
date_add(t, interval 数字n 单位u): 将时间t加上n个单位u(比如3个day,5个hour),实际上如果n为负数,就是减去。常用单位有:year, month, day, hour, minute, second, week
date_format(t, '格式字符f'):格式字符f常用有:%Y, %y,%m, $d, %H, %h, %i, %s
extract(时间项u from t):从t中取得时间的某项值,比如年份数,月份数;时间项u的常用词有:year, month, day, hour, minute, second, week
localtime(): 同now();
maketime(时,分,秒):
month(t):取得月份数(1-12)
year(t):取得年份数



CURDATE或CURRENT_DATE 返回当前的日期

CURTIME或CURRENT_TIME 返回当前的时间

DATE_ADD(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);

DATE_FORMAT(date,fmt) 依照指定的fmt格式格式化日期date值

DATE_SUB(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);

DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)

DAYOFMONTH(date) 返回date是一个月的第几天(1~31)

DAYOFYEAR(date) 返回date是一年的第几天(1~366)

DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);

FROM_UNIXTIME(ts,fmt) 根据指定的fmt格式,格式化UNIX时间戳ts

HOUR(time) 返回time的小时值(0~23)

MINUTE(time) 返回time的分钟值(0~59)

MONTH(date) 返回date的月份值(1~12)

MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);

NOW 返回当前的日期和时间

QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);

WEEK(date) 返回日期date为一年中第几周(0~53)

YEAR(date) 返回日期date的年份(1000~9999)
聚合函数:(以下col表示一列,通常就是字段名)
avg(col):取得一列的平均值
count(col):取得一列的非null值的个数
min(col):取得一列的最小值;
max(col):取得一列的最大值;
sum(col):取得一列的总和
其他函数
md5(str): md5加密函数
password(str): 加密函数
sha1(str): 加密函数
user(), current_user();
database();
version();
//创建函数:
create function getPingfanghe(x float, y float)
returns float
begin
    #此函数体范围内,就是所谓的“编程环境”

    set @result = x*x + y*y; #“定义”会话变量并赋值
    return @result;
end;

create function getPingfanghe2(x float, y float)
returns float
begin
    #此函数体范围内,就是所谓的“编程环境”
    #此范围就可以使用普通变量,已经各种流程控制结构
    declare result float default 0; #定义普通变量并设定初值
    set result = x*x + y*y;
    return result;
end;
//创建过程:
//此存储过程意图用于传入两个数据并将该两个数据插入表enum_test中。
create procedure  pro1 (n int, xuanxiang varchar(20) )
begin
    insert into enum_test (id, xuanxiang)values(n, xuanxiang);
end;
//再来写一个具有out作用的存储过程:
create procedure getXiebian( z1 float, z2 float, out xiebian float)
begin
    set @pingfanghe = getPingfanghe(z1, z2);#调用函数去计算平方和
    set xiebian = pow(@pingfanghe, 0.5);
end;
//该存储过程调用的时候,第3个参数必须是一个变量
//写一个存储过程中使用select:
create procedure  gettables()
begin
    select * from enum_test;
    select * from set_test;
    select * from tab5;
end; 
//定义一个触发器,让该触发器可以在tab5插入数据的时候,
//自动将其实不部分数据插入另一个表中以供“外方合作单位”使用。
//tab5的字段为:id, f1, f2, f4, id2;
//要插入的另一个表的字段为:id, f1, f2
create trigger getSubData  after insert on tab5 for  each  row 
begin
    #set @id = new.id;  #new在触发器中是特定关键字,
                        #代表“刚刚插入的数据行”,这里代表其中的该行数据的id值
    #set @v1 = new.f1;  #新插入数据的f1字段的值
    #set @v2 = new.f2;  #新插入数据的f1字段的值
    insert into tab5_sub (f1, f2)values(new.f1,new.f2);
end;

mysql 关联查询join的两种写法

//第一种
SELECT u.id,u.username from  db_admin_user u  
inner join db_admin_role_user j on u.id=j.user_id 
inner join db_admin_role r on  j.role_id=r.id  
where u.id<10


//第二种
SELECT u.id,u.username from  db_admin_user u  
inner join(db_admin_role_user j ,db_admin_role r) 
on (u.id=j.user_id and j.role_id=r.id) where u.id<10

什么是事务
通常,在此之前,我们说,一条语句使用一个分号(;)来结束,并得到执行。
那么我们说,这个“一次性执行”的过程,可以称为“一个事务”。
简单来说,“一条sql语句,就是一个事务”。
则:
数据库(自然包括mysql数据库)中的事务,是指,可以将“多条语句”的执行,当作“一条语句”来看到的一种内部机制。
即:“事务”是一种可以保证“多条语句一次性执行完成”或“一条都不执行”的机制。

事务的特点
原子性:一个事务中的所有语句,应该做到:要么全做,要么一个都不做;
一致性:让数据保持逻辑上的“合理性”,比如:一个商品出库时,既要让商品库中的该商品数量减1,又要让对应用户的购物车中的该商品加1;
隔离性:如果多个事务同时并发执行,但每个事务就像各自独立执行一样。
持久性:一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化)。
事务模式:
事务模式:就是让每条执行语句是否当作“一个事务”来看到的设定项。

mysql默认安装好之后,其事务模式是:一条语句当作一个事务。
比如:
原来数据:


MYSQL学习笔记!_第3张图片
Paste_Image.png

执行插入:


Paste_Image.png

结果:
MYSQL学习笔记!_第4张图片
Paste_Image.png

我们可以将其修改为:事务需要“认可”模式:
set autocommit = 0; //false,关闭该模式,即此时不再是一条语句一个事务了。
//结果是:必须使用commit语句才能够生效。

MYSQL学习笔记!_第5张图片
Paste_Image.png

然后插入:


Paste_Image.png

刷新:可见,没有变化。
然后再执行commit:
再刷新;


MYSQL学习笔记!_第6张图片
Paste_Image.png
MYSQL学习笔记!_第7张图片
Paste_Image.png

注意:autocommit的设置值,只是影响通常情况下都每条语句的默认行为(自动提交还是等着commit提交)

不管autocommit的值是什么(1,0),我们也仍然可以使用事务的完整流程模式来实现事务,如下:
事务的基本实现流程:
1,声明事务开始:start transaction;
2, 设定多条要执行的具体语句,比如:insert, update, delete, select。。。其实就是执行,只是这些执行的语句,并不“生效”——其只是内存状态下的执行,而不是物理状态的执行。
3,判断是否需要执行该些语句:
if( 判断是否有错误){
//执行——才针对执行了物理性改变——即生效。
commit;
}
eslse{
//回滚——不执行任何语句。
rollback;
}
判断是否有错误通常分这两种环境:
1,如果是cmd中,直接观察是否出错。
2,如果是php程序中,那就需要使用 mysql_error()函数来判断是否有错。

下来来使用事务完整转账这件事情(假设为cmd模式):
start transaction;

第一步:

update cunkuan set 存款=存款-4000 where id=2;

第一步做完,突然断电了?

第二步:

update cunkuan set 存款=存款+4000 where id=1;
则如果这两条语句都没有错误,就可以:
commit;
但,如果其中发生了错误,则可以:
rollback;


MYSQL学习笔记!_第8张图片
Paste_Image.png

mysql编程
基本语法形式
语句块模式:

MYSQL学习笔记!_第9张图片
Paste_Image.png

在mysql编程中,begin....end;基本代替了原来编程语句中的{...}语法。
但又有所区别:
一个bigin...end;块,可以给定一个“标识符”,并且可以使用leave语句来“退出”该语句块。
基本流程控制语句:
if语句:


MYSQL学习笔记!_第10张图片
Paste_Image.png

case语句:(类似php中的switch)

MYSQL学习笔记!_第11张图片
Paste_Image.png

while循环语句:

MYSQL学习笔记!_第12张图片
Paste_Image.png

mysql中的变量
变量它有一定的使用场景限制(其实包括前面的流程控制语句也这样):
在通常的执行各种create,insert,delete,update,select等语句的“环境”中,并不使用常规变量,也不能使用流程控制语句。
其实,这些语句只能在编程环境中用——通常的增删改查,可以称为命令环境。
编程环境:存储函数中,存储过程中,触发器中。
普通变量的声明语法:
declare 变量名 变量类型 [default 初始值]
变量的赋值语法:
set 变量名 = 变量值
mysql还有一种变量形式,可以称为“会话变量”
会话变量的形式为: @变量名;
会话变量无需单独声明,而是直接赋值就可以,类似php
会话变量的赋值: set 变量名 = 值;
会话变量可以在普通命令行环境中或编程环境中使用。
语法1:set 变量名 = 表达式;#此语法中的变量必须先使用declare声明

Paste_Image.png

语法2:set @变量名 = 表达式; #此方式可以无需declare语法声明,而是直接赋值,类似php定义变量并赋值。


Paste_Image.png

语法3:select @变量名 := 表达式;#此语句会给该变量赋值,同时还会作为一个select语句输出“结果集”。


MYSQL学习笔记!_第13张图片
Paste_Image.png

语法4:select 表达式 into @变量名;#此语句虽然看起来是select语句,但其实并不输出“结果集”,而只是给变量赋值。
MYSQL学习笔记!_第14张图片
Paste_Image.png
MYSQL学习笔记!_第15张图片
Paste_Image.png

当然,也可以进行运算:

MYSQL学习笔记!_第16张图片
Paste_Image.png

稍微总结一下:
有两种环境;
常规mysql命令环境,可以执行:增删改查。。。
编程环境:其实就是在特定的语句语法内部:存储过程内,存储函数内,触发器内。
两种变量:
普通变量:不带@符,直接写名字,必须先声明,后使用(赋值之类),只能用于编程环境
会话变量:带@符,无需声明,直接使用(先赋值),可以用于2种环境。
流程控制语句: 只能用于编程环境
存储函数
定义形式:

MYSQL学习笔记!_第17张图片
Paste_Image.png

调用形式:
跟系统函数的调用形式一样,直接使用名字,并带括号,以及根据需要带实参。
比如:
select 3, now(), f1(); //f1为自定义的存储函数。
select 3, now(), f2(3, ‘abc’, @v1); //带3个实参,其中@v1是一个前面赋值了的变量。

举例:
先得改变语句结束符:

Paste_Image.png
MYSQL学习笔记!_第18张图片
Paste_Image.png
MYSQL学习笔记!_第19张图片
Paste_Image.png
MYSQL学习笔记!_第20张图片
Paste_Image.png

删除:drop function [if exists] 存储函数名;

存储过程
存储过程就是一个没有返回值数据值的“函数”。
虽然存储过程不返回单个数据值,但可以“返回”结果集——这里的返回起始就是select语句的正常结果表现。

定义形式:

MYSQL学习笔记!_第21张图片
Paste_Image.png

其中,
in,out,inout用于修饰一个形参的“数据流向”:
in:只作为外部输入数据,调用环境传入存储过程内部,默认值。
out:只作为输出数据,即存储过程传出到调用环境。
inout:具有双重。
存储过程调用形式:
call 存储过程名(实参1,实参2,.....);

举例:

MYSQL学习笔记!_第22张图片
Paste_Image.png
MYSQL学习笔记!_第23张图片
Paste_Image.png
MYSQL学习笔记!_第24张图片
Paste_Image.png

注:
实际,在php中,其实是这样:
$sql = “call pro1(8, 'dd') ”;
mysql_query( $sql );

MYSQL学习笔记!_第25张图片
Paste_Image.png

删除:drop procedure [if exists] 存储过程名;
触发器
什么叫触发器:
就是mysql中的一种“一触即发”的机器(机制)。
其实只是预先定义好的一段代码。该段代码无需人工调用,而是会在‘预计’好的某个情形下自动执行。
通常就这几个情形:
对某个数据表的增(或删或改)之前(或之后)。 //每个表可见只有6种情形。

触发器内部也跟存储过程或存储函数一样,属于“编程环境”。

定义形式:
create trigger 触发器名字 before(或after) insert(或update或delete) on 表名 for each row
begin
要执行的代码,语句块,编程环境,但这里也不能使用select语句。
end;

MYSQL学习笔记!_第26张图片
Paste_Image.png

在触发器内部,其中有两个关键字具有特定含义和数据获取作用:
new:代表新插入的一条数据,在insert事件的时候有效。
old:代表旧的一条数据,在update或delete的时候有效。

3个编程总结:
共同点:
可以使用普通变量;
可以使用流程控制结构;
他们其实都是“一段代码”而已,存储在数据库中。
存储函数:
需要返回一个数据值;
不能有select语句;
调用时直接当作一个“数据”来使用,即可以用于select或别的各种数据操作语句中。
存储过程:
不能返回数据
可以有select语句;
形参可以设定为数据的进出方向:in, out, inout
调用是使用call语句。
触发器:
不能返回数据;
也不能有select语句;
也没有参数,也不能调用,而是在触发的情况下自动调用(执行)。

你可能感兴趣的:(MYSQL学习笔记!)