公司开发新的软件,项目经理决定使用mysql作为项目中的数据库,由于之前一直使用的是sql server,因此赶紧恶补了mysql的一些知识。为了防止以后忘记,特此记录下来。


  1. mysql数据库的优点

  接到这个通知,脑子里第一个想法是为什么使用mysql,由于一直使用C#作为开发语言,因此公司开发人员多数都习惯用sql server数据库。那么,为什么领导层放弃sql server改使用mysql呢,以下是我整理的mysql数据库的一些优点。

  ●  容易使用。MySQL是一个相对简单并且高性能的数据库系统,和oracle这样的大型数据库系统相比,MysQL复杂程度较低,易于学习和维护。

   ●  速度快。MySQL的运行速度很快。

   ●  支持标准查询语言。MysQL仍然可以使用结构化查询语言SQL———种所有的流行数据库系统都能够使用的数据库操作语言。

   ●  支持ODBC协议。MySQL支持Microso记开发的开放式数据库连接协议(ODBC)。

   ●  多用户连接。许多的客户机可以同时连接服务器,并月多个客户机可以同时使用多个数据库。MySQL还能够实现对用户的访问控制。

   ●  可移植性。MySQL可以运行在各种不同版本的unix以及Linux操作系统上,还可以运行在win32的环境之上。从硬件上看MySQL可以运行在从家用PC到高档服务器以内的各种机型。

   ●  计放式的开发与分发。只要到MySQL的官方网站,或者义他相关的N站,即可下载MySQL的组件。如果对MySQL的某一个组件不满,则可以将源代码拿来自己修改,或者增添自己想要的功能。

   ●  非常周到的技术支持。MySQL的任何版本都包含有内容详尽的参考指南。如果和MySQL的开发者之间达成协议,就可以从开发者那里得到技术支持。此外,通过邮件列表也可以随时在网上向MySLQ巳开发组成员提问,通常很快就全得到回答。

   ●  价格便宜


2. 安装mysql数据库,我使用的是无需安装的版本,wKiom1MmxjayxHfkAABAXwp0FCs423.jpg

具体安装过程网上有很多资料,这里就不详细列出来了。


3. mysql注释

  创建的mysql脚本,为了明白各个字段代表的意义,一般都会添加注释。mysql中添加注释和sql server不完全相同,sql server中是(--),mysql中是(-- )即在横杠后面需要加空格。      


4  mysql中存储过程

●   使用存储过程有很多优点,以下是简单描述:

第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。   
  
第二:存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。    
第三:存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。    
第四:存储过程主要是在服务器上运行,减少对客户机的压力。  
第五:存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。  
第六:存储过程可以在单个存储过程中执行一系列   SQL   语句。  
第七:存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

其实存储过程还可以控制权限,比如一个表不直接允许用户直接访问,但要求允许用户访问和修改其中一个或多个字段,那就可以通过一个存储过程来实现并允许该用户使用该存储过程。  

   还有,如果多条SQL语句执行过程中,过程环节返回了数据作为后面环节的输入数据,如果直接通过SQL语句执行,势必导致大量的数据通过网络返回到客户机,并在客户机运算;如果封装在存储过程中,则将运算放在服务器进行,不但减少了客户机的压力,同时也减少了网络流量,提高了执行的效率。


●  使用存储过程的各种返回值。

CREATETABLE[dbo].[Order](
[o_id][bigint]IDENTITY(1,1) NOTFORREPLICATIONNOTNULL,
[o_buyerid][int]NOTNULL
)


1).OUPUT参数返回值
例: 向Order表插入一条记录,返回其标识

CREATEPROCEDURE[dbo].[nb_order_insert](
@o_buyeridint ,
@o_idbigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERTINTO[Order](o_buyerid )
VALUES (@o_buyerid )
SET@o_id=@@IDENTITY
END
END


存储过程中获得方法:

DECLARE@o_buyeridint
DECLARE@o_idbigint
EXEC[nb_order_insert]@o_buyerid ,o_id bigint


2).RETURN过程返回值

CREATEPROCEDURE[dbo].[nb_order_insert](
@o_buyeridint ,
@o_idbigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT*FROM[Shop]WHERE[s_id]=@o_shopid))
BEGIN
INSERTINTO[Order](o_buyerid )
VALUES (@o_buyerid )
SET@o_id=@@IDENTITY
RETURN1 — 插入成功返回1
END
ELSE
RETURN0 — 插入失败返回0
END


存储过程中的获取方法

DECLARE@o_buyeridint
DECLARE@o_idbigint
DECLARE@resultbit
EXEC@result=[nb_order_insert]@o_buyerid ,o_id bigint


3).SELECT 数据集返回值

CREATEPROCEDURE[dbo].[nb_order_select](
@o_idint
)
AS
BEGIN
SET NOCOUNT ON;
SELECT o_id,o_buyerid FROM[Order]
WHERE o_id =@o_id
GO


存储过程中的获取方法
(1)、使用临时表的方法

CREATETABLE[dbo].[Temp](
[o_id][bigint]IDENTITY(1,1) NOTFORREPLICATIONNOTNULL,
[o_buyerid][int]NOTNULL
)
INSERT[Temp]EXEC[nb_order_select]@o_id
– 这时 Temp 就是EXEC执行SELECT 后的结果集
SELECT*FROM[Temp]
DROP[Temp] — 删除临时表


(2)、速度不怎么样.(不推荐)

SELECT*fromopenrowset(’provider_name','Trusted_Connection=yes’,'exec nb_order_select’)