第一次在优快云上写东西,主要是这些天学习MySql遇到一些问题,解决了一些问题,拿出来分享一下,让后来的同志们少走一点弯路,所以我写的这个就是一些入门级的东西了.
到www.mysql.org上去下个MySql win32平台,最好是5.0以上的版本,因为MySQL只在5.0以后才开始对存储过程的支持,我在下面讲的也是我在这个上面所遇到的一些问题.
开始->运行->cmd.输入命令mysql -u root -p,然后提示你输入密码,Enter password:****正确输入完毕显示:
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 2
Server version: 5.0.45-community-nt MySQL Community Edition (GPL)
Type 'help;' or '/h' for help. Type '/c' to clear the buffer.
mysql>
恭喜安装成功了,这里的root 用户不是Linux的那个超级用户,只是MySql 的一个默认安装用户,在Linux下的MySql 中 root默认是没有密码的,所以最好去给它设一个密码,mysqladmin -u root -p oldpassword newpasswd,由于默认没有密码,所以命令中oldpassword就省了.win32下安装的过程中会提示你设置root密码,很不错.
C:/Documents and Settings/you>netstat
Active Connections
Proto Local Address Foreign Address State
TCP 0f0cac4f05aa48c:3306 localhost:3313 TIME_WAIT //MySql已经运行,占用的默认端口是3306
TCP 0f0cac4f05aa48c:3011 60.28.223.101:http CLOSE_WAIT
TCP 0f0cac4f05aa48c:3015 60.28.223.101:http CLOSE_WAIT
登陆成功以后,先随便看看,
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydata |
| mysql |
| test |
+--------------------+
4 rows in set (0.03 sec)显示出了已经存在的所有数据库.
创建一个新的用户可以用下面这个命令: grant 权限 on 数据库名.表名 to 新用户名@终端 identified by 密码.在权限设置中如果是all的话,就代表是把所有的权限都赋予这个用户了,在windows平台下设置的新用户名必须为这样的格式 'user_name',要用单引号括起来,后面终端名如 'localhost' 也要是这样的格式,密码亦如是.例如:grant all on mydata.* to 'nobleqiao'@'localhost' identified by 'password',就表示将对数据库mydata中所有表的所有权限赋予用户nobleqiao,登陆密码为'password'.权限仅限于在 localhost上.我也有一个疑惑,按照常理推断,将 数据库名.表名 设置为 *.* 应该是对所有数据库的所有表都有权限,但是这样来创建用户时总是不成功.对于上面那条命令,用户nobleqiao可以创建的数据库只能是名字为mydata,拥有操作其中的所有表有所有权限.用你创建的新用户来登陆吧.
创建一个新的数据库mysql>create database mydata;(注意分号) ,对于用户nobleqiao来说,只能创建名字为mydata的数据库喽.建完数据库,可以用mysql>show databases; 查看已经存在的数据库,看你新建的在不在里面.然后就建表啦,mysql>create table tablename( col1 type not null primary key , col2... , ........ );这些是SQL的基本命令就不举例了.mysql> show tables;
+------------------+
| Tables_in_mydata |
+------------------+
| info |
| stu |
+------------------+
2 rows in set (0.01 sec)显示你已经建立的表.对表的一些操作就是SQL的一些命令了,例如:
mysql> select * from info;
+-----+--------------+------+---------------+
| id | name | age | addr |
+-----+--------------+------+---------------+
| 001 | Yaoon Carter | 12 | Backer Street |
| 002 | Niker Carter | 17 | Backer Street |
| 011 | Acer King | 42 | Scoot land |
| 101 | Maggie Q | 20 | Los Angelise |
+-----+--------------+------+---------------+
4 rows in set (0.02 sec)
存储过程:我十分感兴趣的新东西(对我来说)
a.创建一个新的存储过程:可以先将默认的分隔符(;)修改一下,mysql> delimiter // 将分隔符改为" // ",因为存储过程中可能会有一些语句必须用 ; 作为结束符例如execute stmt;分隔符修改成哪个字符根据个人习惯吧.来举个存储过程的简单例子:
create procedure testproc(in factor char(1))
begin
select * from info
where name like 'A%';
end
b.调用方法
mysql> call testproc('a');
-> //
+-----+-----------+------+------------+
| id | name | age | addr |
+-----+-----------+------+------------+
| 011 | Acer King | 42 | Scoot land |
+-----+-----------+------+------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)其实这里的参数只是示例,没有起实质影响.调用方法就是call 存储过程名;
c.其他命令: mysql> show procedure status; 显示所有的存储过程及其相关的一些信息如: Db Name Type Definer Modified Created Security_type Comment .
mysql> show create procedure testproc; 显示名为 testproc 的存储过程的内容.
d.表名作为参数的存储过程.
简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。在其它的sql数据库中也是如此,mssql的解决方法是将整条sql语句作为变量,其中穿插变量作为表名,然后用sp_executesql调用该语句。这在mysql5.0之前是不行的,5.0之后引入了一个全新的语句,可以达到类似sp_executesql的功能(仅对procedure有效,function不支持动态查询):我现在只学到了一个用prepare的,直接来个自己写的例子先:
create procedure qproc(in uid char(10),in tname char(11))
begin
set @SqlCmd=concat('select * from ',tname,' where id= ',uid);
prepare stmt from @SqlCmd;
execute stmt;
end
看调用:mysql> delimiter ; 将分隔符改回分号(;)
mysql> call qproc('002','info');
+-----+--------------+------+---------------+
| id | name | age | addr |
+-----+--------------+------+---------------+
| 002 | Niker Carter | 17 | Backer Street |
+-----+--------------+------+---------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)调用结果就是这样喽,希望对你有帮助.
e.一个创建函数的例子(有返回参数)
create function p(in_status char(1))
returns varchar(20)
begin
declare long_status varchar(20);
if in_status='O' then set long_status='over due';
elseif in_status='U' then set long_status='Up to date';
end if;
return(long_status);
end
调用:mysql> select p('U');
+------------+
| p('U') |
+------------+
| Up to date |
+------------+
1 row in set (0.00 sec)注意这里是用select 而不是 call
同样,也可以用mysql> show function status; mysql> show create function function_name;查看相关信息.
写的东西都相当基础,这些也是我在学习过程中遇到的一些问题,自己通过查资料解决后,还是很兴奋的,希望对大家有帮助.