MySQL快速入门13----SQL编程
2016-08-09 00:27
507 查看
SQL:结构化查询语言,是一门编程语言,是一种管理数据的编程语言!
首先表one中的内容为:
当id为1时的表one的内容:
加注释的时候:
方法二:--【空格】
其中分号和\g是一样的;
\G会对输出结果进行优化;
可以使用delimiter来修改结束符;
MySQL中,允许用户自己定义变量。即为用户变量(用户自定义变量)。
语法:
Set 语句可以定义并为变量赋值。
也可以使用select into 语句。为变量初始化并赋值。这样要求select语句只能返回一行,但是可以是多个字段,就意味着同时为多个变量进行赋值,变量的数量需要与查询的列数一致。
还可以把赋值语句看作一个表达式,通过select 执行完成。此时为了避免=被当作关系运算符看待,使用:=代替。(set语句可以使用= 和 :=)。
自定义变量名:
为了避免select语句中
避免用户自定义的变量与系统标识符(通常是字段名),用户自定义变量在变量名前使用@作为开始符号。
@var=10;
变量被定义后,在整个会话周期都有效(登录到退出)
系统中有许多默认的变量,如:
定义一个变量:
Set是专门的为变量赋值的形式,甚至可以子查询:
使用select into注入多个变量:
注意:select into @var 要求,只能返回一行。如果返回多行,会语法错误,或者只将最后一行的数据,注入到变量内。
使用select 为变量赋值的时候使用 :=(如果直接使用等号的话,相当于判断语句了!!!)
比较一下语句的区别:
1,作用域。用户定义的函数,是全局的(函数内可用)。存在局部作用域变量,函数内定义的变量。
2,有效期。会话结束(连接结束)。
Format(X,D),格式化千分位数值 format(1234567.456, 2) = 1,234,567.46
Ceil(X),向上取整 ceil(10.1) = 11
Floor(X),向下取整 floor (10.1) = 10
Round(X),四舍五入去整
Mod(M,N) M%N M MOD N 求余 10%3=1
Pi(),获得圆周率
Pow(M,N) M^N
Sqrt(X),算术平方根
Rand(),随机数
TRUNCATE(X,D) 截取D位小数
Current_date();当前日期
current_time();当前时间
Date(‘yyyy-mm-dd HH;ii:ss’);获取日期部分
Time(‘yyyy-mm-dd HH;ii:ss’);获取时间部分
Date_format(‘yyyy-mm-dd HH;ii:ss’,’ %D %y %a %d %m %b %j');
Unix_timestamp();获得unix时间戳
From_unixtime();//从时间戳获得时间
CHAR_LENGTH(string) //string的字符个数
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
INSTR (string ,substring ) //返回substring首次在string中出现的位置
CONCAT (string [,... ]) //连接字串
CHARSET(str) //返回字串字符集
LCASE (string ) //转换成小写
LEFT (string ,length ) //从string2中的左边起取length个字符
LOAD_FILE (file_name ) //从文件读取内容
LOCATE (substring , string [,start_position ] ) //同INSTR,但可指定开始位置
LPAD (string ,length ,pad ) //重复用pad加在string开头,直到字串长度为length
LTRIM (string ) //去除前端空格
REPEAT (string ,count ) //重复count次
RPAD (string ,length ,pad) //在str后用pad补充,直到长度为length
RTRIM (string ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比较两字串大小
IF(expr1,expr2,expr3) 双分支。
Sum();
Max();
Min();
Avg();
Group_concat()
Default();
如何得到5到10之间的随机数呢?
now()函数:
unix_timestamp函数:
获取当前时间:
字符串,substring(原字符串,开始位置,截取长度),位置从1开始:
length函数(别忘了设置set names gbk;):
lpad(需要补足的字符串,补足后的长度,补字符串):
参数列表
函数体
返回值
函数名,应该合法的标识符,并且不应该与已有的关键字冲突。
一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
参数部分,由参数名和参数类型组成。
返回值类类型
函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。
多条语句应该使用 begin end语句块包含。
注意,一定要有return 返回值语句。
删除:
查看:
修改:
创建函数,功能时返回hello,world!:
函数执行结果:
注意:函数是与当前的数据库绑定的,可以使用库名.函数名的形式调用;
带形参的函数:
循环的提前终止:
leave 终止当前循环,即跳出循环;
iterate 跳过本次循环,进入下一次循环,注意变量的增量;
循环的标签,给循环起名字(便于指定跳过哪个循环):
标签:while
end while 标签;
跳出循环的例子:
跳过某次循环的例子:
例子:随机获取姓名
一 元素
数据、数据类型、变量、函数、控制流程、运算符 、注释。。。二 注释
行注释:
方法一: #首先表one中的内容为:
mysql> select * from one; +--------+----------+--------------+ | one_id | one_data | public_field | +--------+----------+--------------+ | 1 | A | 222 | | 2 | B | 20 | | 3 | X | 30 | +--------+----------+--------------+ 3 rows in set (0.00 sec)
当id为1时的表one的内容:
mysql> select * from one where one_id = 1; +--------+----------+--------------+ | one_id | one_data | public_field | +--------+----------+--------------+ | 1 | A | 222 | +--------+----------+--------------+ 1 row in set (0.00 sec)
加注释的时候:
mysql> select * from one #where one_id = 1; -> ; +--------+----------+--------------+ | one_id | one_data | public_field | +--------+----------+--------------+ | 1 | A | 222 | | 2 | B | 20 | | 3 | X | 30 | +--------+----------+--------------+ 3 rows in set (0.00 sec)
方法二:--【空格】
mysql> select * from one -- where one_id = 1; -> ; +--------+----------+--------------+ | one_id | one_data | public_field | +--------+----------+--------------+ | 1 | A | 222 | | 2 | B | 20 | | 3 | X | 30 | +--------+----------+--------------+ 3 rows in set (0.00 sec)
块注释:
/* */mysql> select * from one /* where id = 1;*/; +--------+----------+--------------+ | one_id | one_data | public_field | +--------+----------+--------------+ | 1 | A | 222 | | 2 | B | 20 | | 3 | X | 30 | +--------+----------+--------------+ 3 rows in set (0.00 sec)
三 结束符
分号、\G、\g其中分号和\g是一样的;
\G会对输出结果进行优化;
mysql> select * from one \G; *************************** 1. row *************************** one_id: 1 one_data: A public_field: 222 *************************** 2. row *************************** one_id: 2 one_data: B public_field: 20 *************************** 3. row *************************** one_id: 3 one_data: X public_field: 30 3 rows in set (0.00 sec)
可以使用delimiter来修改结束符;
mysql> delimiter $$ mysql> select * from one$$ +--------+----------+--------------+ | one_id | one_data | public_field | +--------+----------+--------------+ | 1 | A | 222 | | 2 | B | 20 | | 3 | X | 30 | +--------+----------+--------------+ 3 rows in set (0.00 sec) mysql> delimiter ;
四 变量
MySQL中,允许用户自己定义变量。即为用户变量(用户自定义变量)。
语法:
Set 语句可以定义并为变量赋值。
Set @var = value;
也可以使用select into 语句。为变量初始化并赋值。这样要求select语句只能返回一行,但是可以是多个字段,就意味着同时为多个变量进行赋值,变量的数量需要与查询的列数一致。
还可以把赋值语句看作一个表达式,通过select 执行完成。此时为了避免=被当作关系运算符看待,使用:=代替。(set语句可以使用= 和 :=)。
Select @var:=20; Select @v1:=id, @v2=name from t1 limit 1; select * from tbl_name where @var:=30;
自定义变量名:
为了避免select语句中
避免用户自定义的变量与系统标识符(通常是字段名),用户自定义变量在变量名前使用@作为开始符号。
@var=10;
变量被定义后,在整个会话周期都有效(登录到退出)
系统中有许多默认的变量,如:
mysql> show variables like 'char%'; +--------------------------+----------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | D:\Program_win10\MySQL\share\charsets\ | +--------------------------+----------------------------------------+ 8 rows in set (0.00 sec)
定义一个变量:
set 变量名 = 变量值注意,为了区分 系统变量和字段与用户自定义变量,需要在用户变量前,增加@标识符。
mysql> set @v1 = 123; Query OK, 0 rows affected (0.00 sec) mysql> select @v1; +------+ | @v1 | +------+ | 123 | +------+ 1 row in set (0.00 sec)通过 select 语句可以获得当前的变量的值。
Set是专门的为变量赋值的形式,甚至可以子查询:
mysql> set @v2 = (select public_field from one where one_id = 1); Query OK, 0 rows affected (0.00 sec) mysql> select @v2; +------+ | @v2 | +------+ | 222 | +------+ 1 row in set (0.00 sec)
使用select into注入多个变量:
mysql> select 1,2,3 into @v3, @v4,@v5; Query OK, 1 row affected (0.00 sec) mysql> select @v3,@b4,@v5; +------+------+------+ | @v3 | @b4 | @v5 | +------+------+------+ | 1 | NULL | 3 | +------+------+------+ 1 row in set (0.00 sec)
mysql> select public_field from one where one_id = 1 into @v6; Query OK, 1 row affected (0.00 sec) mysql> select @v6; +------+ | @v6 | +------+ | 222 | +------+ 1 row in set (0.00 sec)
注意:select into @var 要求,只能返回一行。如果返回多行,会语法错误,或者只将最后一行的数据,注入到变量内。
使用select 为变量赋值的时候使用 :=(如果直接使用等号的话,相当于判断语句了!!!)
mysql> select @v7:='Apple'; +--------------+ | @v7:='Apple' | +--------------+ | Apple | +--------------+ 1 row in set (0.00 sec) mysql> select @v7; +-------+ | @v7 | +-------+ | Apple | +-------+ 1 row in set (0.00 sec)
比较一下语句的区别:
mysql> select * from one where @v3 = one_id; +--------+----------+--------------+ | one_id | one_data | public_field | +--------+----------+--------------+ | 1 | A | 222 | +--------+----------+--------------+ 1 row in set (0.00 sec) mysql> select * from one where @v3 := one_id; +--------+----------+--------------+ | one_id | one_data | public_field | +--------+----------+--------------+ | 1 | A | 222 | | 2 | B | 20 | | 3 | X | 30 | +--------+----------+--------------+ 3 rows in set (0.00 sec)
1,作用域。用户定义的函数,是全局的(函数内可用)。存在局部作用域变量,函数内定义的变量。
2,有效期。会话结束(连接结束)。
五 函数
5.1 内置函数
数值函数
Abs(X),绝对值 abs(-10.9) = 10Format(X,D),格式化千分位数值 format(1234567.456, 2) = 1,234,567.46
Ceil(X),向上取整 ceil(10.1) = 11
Floor(X),向下取整 floor (10.1) = 10
Round(X),四舍五入去整
Mod(M,N) M%N M MOD N 求余 10%3=1
Pi(),获得圆周率
Pow(M,N) M^N
Sqrt(X),算术平方根
Rand(),随机数
TRUNCATE(X,D) 截取D位小数
时间日期函数
Now(),current_timestamp(); 当前日期时间Current_date();当前日期
current_time();当前时间
Date(‘yyyy-mm-dd HH;ii:ss’);获取日期部分
Time(‘yyyy-mm-dd HH;ii:ss’);获取时间部分
Date_format(‘yyyy-mm-dd HH;ii:ss’,’ %D %y %a %d %m %b %j');
Unix_timestamp();获得unix时间戳
From_unixtime();//从时间戳获得时间
字符串函数
LENGTH (string ) //string长度,字节CHAR_LENGTH(string) //string的字符个数
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
INSTR (string ,substring ) //返回substring首次在string中出现的位置
CONCAT (string [,... ]) //连接字串
CHARSET(str) //返回字串字符集
LCASE (string ) //转换成小写
LEFT (string ,length ) //从string2中的左边起取length个字符
LOAD_FILE (file_name ) //从文件读取内容
LOCATE (substring , string [,start_position ] ) //同INSTR,但可指定开始位置
LPAD (string ,length ,pad ) //重复用pad加在string开头,直到字串长度为length
LTRIM (string ) //去除前端空格
REPEAT (string ,count ) //重复count次
RPAD (string ,length ,pad) //在str后用pad补充,直到长度为length
RTRIM (string ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比较两字串大小
流程函数:
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END 多分支IF(expr1,expr2,expr3) 双分支。
聚合函数
Count()Sum();
Max();
Min();
Avg();
Group_concat()
其他常用函数
Md5();Default();
内置函数举例:
rand返回0到1的随机数:mysql> select rand(); +--------------------+ | rand() | +--------------------+ | 0.8635645637880681 | +--------------------+ 1 row in set (0.03 sec)
如何得到5到10之间的随机数呢?
mysql> select floor(rand()*5 + 5); +---------------------+ | floor(rand()*5 + 5) | +---------------------+ | 8 | +---------------------+ 1 row in set (0.00 sec) mysql> select floor(rand()*5 + 5); +---------------------+ | floor(rand()*5 + 5) | +---------------------+ | 5 | +---------------------+ 1 row in set (0.00 sec)
now()函数:
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2016-08-09 00:14:53 | +---------------------+ 1 row in set (0.02 sec)
unix_timestamp函数:
mysql> select unix_timestamp(); +------------------+ | unix_timestamp() | +------------------+ | 1470672909 | +------------------+ 1 row in set (0.00 sec)
获取当前时间:
mysql> select now(unix_timestamp()); +-----------------------+ | now(unix_timestamp()) | +-----------------------+ | 2016-08-09 00:15:32 | +-----------------------+ 1 row in set (0.00 sec)
字符串,substring(原字符串,开始位置,截取长度),位置从1开始:
mysql> select substring('Apple', 1, 2); +--------------------------+ | substring('Apple', 1, 2) | +--------------------------+ | Ap | +--------------------------+ 1 row in set (0.00 sec)
length函数(别忘了设置set names gbk;):
mysql> select length('Apple'), length('苹果'); +-----------------+----------------+ | length('Apple') | length('苹果') | +-----------------+----------------+ | 5 | 4 | +-----------------+----------------+ 1 row in set (0.01 sec)
lpad(需要补足的字符串,补足后的长度,补字符串):
mysql> select lpad('abc', 5, '5'); +---------------------+ | lpad('abc', 5, '5') | +---------------------+ | 55abc | +---------------------+ 1 row in set (0.00 sec)
六 存储函数----自定义函数
6.1 要素
函数名参数列表
函数体
返回值
6.2 语法
Create function function_name (参数列表) returns 返回值类型 函数体
函数名,应该合法的标识符,并且不应该与已有的关键字冲突。
一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
参数部分,由参数名和参数类型组成。
返回值类类型
函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。
多条语句应该使用 begin end语句块包含。
注意,一定要有return 返回值语句。
删除:
Drop function if exists function_name;
查看:
Show function status like ‘partten’ Show create function function_name;
修改:
Alter function function_name 函数选项。
创建函数,功能时返回hello,world!:
mysql> delimiter $$ mysql> create function sayHello() returns varchar(20) -> begin -> return 'hello, world!'; -> end -> $$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
函数执行结果:
mysql> select sayHello(); +---------------+ | sayHello() | +---------------+ | hello, world! | +---------------+ 1 row in set (0.02 sec)
注意:函数是与当前的数据库绑定的,可以使用库名.函数名的形式调用;
6.3 sql中的流程控制
分支语句
If 条件1 then <span style="white-space:pre"> </span>条件1满足执行的语句 Elseif 条件2 then <span style="white-space:pre"> </span>条件2满足执行的语句 …. Else <span style="white-space:pre"> </span>上面的条件全都不满足,执行的语句 End if;其中,Elseif 和 else 都是可以省略的。
mysql> delimiter $$ mysql> create function fun1() returns varchar(20) -> begin -> if hour(now())<12 then -> return '早上好!'; -> elseif hour(now())<18 then -> return '下午好!'; -> else -> return '晚上好!'; -> end if; -> end -> $$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> select fun1() as 打招呼; +----------+ | 打招呼 | +----------+ | 下午好! | +----------+ 1 row in set (0.00 sec)
循环语句
While 条件 do 循环体 End while;
mysql> delimiter $$ mysql> drop function if exists fun2; -> create function fun2() returns int -> begin -> set @i = 0; -- 全局变量 -> set @total = 0;-- 全局变量 -> while @i<10 do -> set @i = @i+1; -> set @total = @total + @i; -> end while; -> -> return @total; -> end -> $$ Query OK, 0 rows affected (0.08 sec) Query OK, 0 rows affected (0.09 sec) mysql> delimiter ; mysql> select fun2(); +--------+ | fun2() | +--------+ | 55 | +--------+ 1 row in set (0.00 sec)
带形参的函数:
mysql> delimiter $$ mysql> drop function if exists fun2; -> create function fun3(n int) returns int -> begin -> set @i = 0; -- 全局变量 -> set @total = 0;-- 全局变量 -> while @i<n do -> set @i = @i+1; -> set @total = @total + @i; -> end while; -> -> return @total; -> end -> $$ Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> select fun3(10); +----------+ | fun3(10) | +----------+ | 55 | +----------+ 1 row in set (0.00 sec)
循环的提前终止:
leave 终止当前循环,即跳出循环;
iterate 跳过本次循环,进入下一次循环,注意变量的增量;
循环的标签,给循环起名字(便于指定跳过哪个循环):
标签:while
end while 标签;
跳出循环的例子:
mysql> delimiter $$ mysql> drop function if exists fun2; -> create function fun5(n int) returns int -> begin -> set @i = 0; -- 全局变量 -> set @total = 0;-- 全局变量 -> w:while @i<n do -> if @i= 5 then -> leave w; -> end if; -> set @i = @i+1; -> set @total = @total + @i; -> end while w; -> -> return @total; -> end -> $$ Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> select fun5(10); +----------+ | fun5(10) | +----------+ | 15 | +----------+ 1 row in set (0.02 sec)
跳过某次循环的例子:
mysql> delimiter $$ mysql> create function fun6(n int) returns int -> begin -> set @i = 0; -- 全局变量 -> set @total = 0;-- 全局变量 -> w:while @i<n do -> if @i= 5 then -> set @i = @i+1; -> iterate w; -> end if; -> set @i = @i+1; -> set @total = @total + @i; -> end while w; -> -> return @total; -> end -> $$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> select fun6(10); +----------+ | fun6(10) | +----------+ | 49 | +----------+ 1 row in set (0.00 sec)
6.4 函数内使用的变量
@var的形式,相当于全局变量,函数内和函数外是通用的。DECLARE var_name[,...] type [DEFAULT value]这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。
mysql> delimiter $$ mysql> create function fun7(n int) returns int -> begin -> declare i int default 0; -- 局部变量 -> declare total int default 0;-- 局部变量 -> w:while i<n do -> if i= 5 then -> set i = @i+1; -> iterate w; -> end if; -> set i = i+1; -> set total = total + i; -> end while w; -> -> return total; -> end -> $$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
mysql> select fun7(10); +----------+ | fun7(10) | +----------+ | 15 | +----------+ 1 row in set (0.00 sec)
例子:随机获取姓名
mysql> -- 参考学生表 mysql> create table join_student ( -> stu_id int not null auto_increment, -> stu_no char(10), -> class_id int not null, -> stu_name varchar(10), -> stu_info text, -> primary key (stu_id) -> ); Query OK, 0 rows affected (0.08 sec) mysql> mysql> -- 计算新增学号 mysql> drop function if exists sno; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> delimiter $$ mysql> create function sno (c_id int) returns char(10) -> begin -> declare last_no char(10); -> select stu_no from join_student where class_id=c_id order by stu_no desc limit 1 into last_no; -> if last_no is null then -> return concat((select c_name from join_class where id=c_id), '001'); -> else -> return concat(left(last_no, 7), lpad(right(last_no, 3) + 1, 3, '0')); -> end if; -> #return @last_no; -> end -> $$ Query OK, 0 rows affected (0.02 sec) mysql> delimiter ; mysql> -- 随机获得学生名字。 mysql> drop function if exists sname; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> delimiter $$ mysql> create function sname () returns char(2) -> begin -> declare first_name char(16) default '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨'; -> declare last_name char(10) default '甲乙丙丁戊己庚辛壬癸'; -> declare full_name char(2); -> set full_name = concat(substring(first_name, floor(rand()*16+1), 1), substring(last_name, floor(rand()*10+1), 1)); -> return full_name; -> end -> $$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> mysql> select sname(); +---------+ | sname() | +---------+ | 韩甲 | +---------+ 1 row in set (0.00 sec) mysql> select sname(); +---------+ | sname() | +---------+ | 陈庚 | +---------+ 1 row in set (0.00 sec) mysql> select sname(); +---------+ | sname() | +---------+ | 冯庚 | +---------+ 1 row in set (0.00 sec) mysql> select sname(); +---------+ | sname() | +---------+ | 蒋壬 | +---------+ 1 row in set (0.00 sec)