创建表,以及表之间的关系

use test;

create table person(

id smallint unsigned not null auto_increment,

name char(40) not null,

primary key(id));

create table shirt(

id smallint unsigned not null auto_increment,

style enum('t-shirt','polo','dress') not null,

color enum('red','blue','orange') not null,

owner smallint unsigned not null references person(id),

primary key(id));


创建视图

create view skirt_view as

select person.id as id,person.name as name,shirt.style as style,shirt.color as color from person,shirt

where person.id=shirt.owner;


创建用户

grant all privileges on *.* to 'money2'@'%' identified by 'panjun2' with grant option;

grant all privileges on *.* to 'money2'@'localhost' identified by 'panjun2' with grant option;

创建存储过程以及函数
格式:       
CREATE PROCEDURE 过程名 ([过程参数[,...]])
    [特性 ...] 过程体

CREATE FUNCTION 函数名 ([函数参数[,...]])
    RETURNS 返回类型
    [特性 ...] 函数体
   
过程参数:
    [ IN | OUT | INOUT ] 参数名 参数类型
函数参数:
    参数名 参数类型

返回类型:
    有效的MySQL数据类型即可

过程体/函数体:格式如下:
BEGIN
    有效的SQL语句
END   
在开发过程中有几点要注意:
1、存储过程注释:MySQL支持采用--或者/**/注释,其中前者是行注释,后者是段式注释
2、变量首先用declare申明,其中临时变量可以直接以@前缀修饰以供引用
3、直接采用MySQL的Administrator管理器编辑时,可以直接采用如下函数文本录入;
   但若在脚本中自动导入存储过程或函数时,由于MySQL默认以";"为分隔符,则过程体的每一句
   都被MySQL以存储过程编译,则编译过程会报错;所以要事先用DELIMITER关键字申明当前段分隔符
   用完了就把分隔符还原。  如下所示:
 

DELIMITER $$

       Stored Procedures and Functions

       DELIMITER ;

mysql> delimiter //

mysql> CREATE PROCEDURE mysp ()

    -> BEGIN

    ->   IF @@server_id=2 THEN DROP DATABASE accounting; END IF;

    -> END;

    -> //

mysql> delimiter ;

mysql> CALL mysp();


下面是2个例子,提供了一种字串加密的算法,每次以相同的入参调用都会得到不同的加密结果,
   算法相对比较简单,不具备强度。分别以函数和过程的形式分别实现如下:
(1)函数

eg:

CREATE FUNCTION fun_addmm(inpass varchar(10)) RETURNS varchar(11)

BEGIN

     declare string_in varchar(39);

     declare string_out varchar(78);

     declare offset tinyint(2);

     declare outpass varchar(30) default ';

     declare len tinyint;

     /*declare i tinyint;*/     /**/

     set len=LENGTH(inpass);

     if((len<=0) or (len>10)) then

         return "";

     end if;     set offset=(SECOND(NOW()) mod 39)+1; /*根据秒数取模*/

     /*insert into  testtb values(offset,'offset: ');*/

     set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';  /*密钥*/

     set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';     set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));

/*     insert into  testtb values(2,outpass);*/

     set string_out=CONCAT(string_out,string_out);

     set @i=0;

     REPEAT

       set @i=@i+1;

       set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));

/*       insert into  testtb values(@i+2,outpass);*/

     UNTIL (@i>=len)

     end REPEAT;     return outpass;

END

(2)过程

CREATE PROCEDURE `pro_addmm`(IN inpass varchar(10),OUT outpass varchar(11))

BEGIN

     declare string_in varchar(39);

     declare string_out varchar(78);

     declare offset tinyint(2);                

     declare len tinyint;     set outpass=';
     set len=LENGTH(inpass);

     if((len<=0) or (len>10)) then

         set outpass=';

     else

         set offset=(SECOND(NOW()) mod 39)+1;         set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';

         set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';         set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));
         set string_out=CONCAT(string_out,string_out);

         set @i=0;

         REPEAT

               set @i=@i+1;

               set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));

         UNTIL (@i>=len)

         end REPEAT;

     end if;

END
//


执行结果如下:

mysql> call pro_addmm('zhouys',@a);

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;

+---------+

| @a      |

+---------+

| U_PI6$4 |

+---------+

1 row in set (0.00 sec)

mysql> call pro_addmm('zhouys',@a);

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;

+---------+

| @a      |

+---------+

| 9P8UEGM |

+---------+

1 row in set (0.00 sec)

mysql> select fun_submm('U_PI6$4');

+----------------------+

| fun_submm('U_PI6$4') |

+----------------------+

| ZHOUYS               |

+----------------------+

1 row in set (0.00 sec)


加密算法有几个弱点:
1、不支持大小写
2、不支持中文
3、加密强度不够

如果用mysql query browser分析器来做,就不用delimiter了:

CREATE PROCEDURE `procedure1`(myid int,name varchar(20), password varchar(20))

BEGIN

  INSERT INTO user(id,name,password)

  VALUES (myid, name,password);

END

总结函数存储过程:

# Basic syntax to create a function

delimiter //

create function add_tax (price float) returns float

return price*1.1;

//

delimiter ;


调用直接用:select add_tax(100);
程序清单存储过程:

#basic

# Basic stored procedure example

delimiter //

create procedure total_orders (out total float)

begin

select sum(amount) into total from orders;

end

//

delimiter ;


调用代码为:call total_orders(@b);
mysql->select @b;

mysql默认的是本地主机是localhost,对应的IP地址就是127.0.0.1,所以你用你的IP地址登录会出错,如果你想用你的IP地址登录就要先进行授权用grant命令。  

mysql>grant   all   on   *.*   to   root@202.116.39.2   identified   by   "123456";


   
  说明:grant   与on   之间是各种权限,例如:insert,select,update等  
  on   之后是数据库名和表名,第一个*表示所有的数据库,第二个*表示所有的表  
  root可以改成你的用户名,@后可以跟域名或IP地址,identified   by   后面的是登录用的密码,可以省略,即缺省密码或者叫空密码。
 
Server   Host:localhost       Port:3306  
  Username:root  
  Password:*******  
  Default   Schema:test