您的位置:首页 > 数据库 > MySQL

MySQL快速入门13----SQL编程

2016-08-09 00:27 507 查看
SQL:结构化查询语言,是一门编程语言,是一种管理数据的编程语言!



一 元素

数据、数据类型、变量、函数、控制流程、运算符 、注释。。。

二 注释

行注释:

方法一: #
首先表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) = 10

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位小数

时间日期函数

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息