Mysql命令和存储过程及其调用

Mysql命令和存储过程及其调用
Mysql命令和存储过程及其调用

MYSQL常用命令

1.导出整个数据库

mysqldump -u 用户名-p --default-character-set=latin1 数据库名> 导出的文件名(数据库默认编码是latin1)

mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

2.导出一个表

mysqldump -u 用户名-p 数据库名表名> 导出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

3.导出一个数据库结构

mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql

-d 没有数据–add-drop-table 在每个create语句之前增加一个drop table

4.导入数据库

A:常用source 命令

进入mysql数据库控制台,

如mysql -u root -p

mysql>use 数据库

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

mysql>source wcnc_db.sql

B:使用mysqldump命令

mysqldump -u username -p dbname < filename.sql

C:使用mysql命令

mysql -u username -p -D dbname < filename.sql

一、启动与退出

1、进入MySQL:启动MySQL Command Line Client(MySQL的DOS界面),直接输入安装时的密码即可。此时的提示符是:mysql>

2、退出MySQL:quit或exit

二、库操作

1、、创建数据库

命令:create database <数据库名>

例如:建立一个名为xhkdb的数据库

mysql> create database xhkdb;

2、显示所有的数据库

命令:show databases (注意:最后有个s)

mysql> show databases;

3、删除数据库

命令:drop database <数据库名>

例如:删除名为xhkdb的数据库

mysql> drop database xhkdb;

4、连接数据库

命令:use <数据库名>

例如:如果xhkdb数据库存在,尝试存取它:

mysql> use xhkdb;

屏幕提示:Database changed

5、查看当前使用的数据库

mysql> select database();

6、当前数据库包含的表信息:

mysql> show tables; (注意:最后有个s)

三、表操作,操作之前应连接某个数据库

1、建表

命令:create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]);

mysql> create table MyClass(

> id int(4) not null primary key auto_increment,

> name char(20) not null,

> sex int(4) not null default '0',

> degree double(16,2));

2、获取表结构

命令:desc 表名,或者show columns from 表名

mysql>DESCRIBE MyClass

mysql> desc MyClass;

mysql> show columns from MyClass;

3、删除表

命令:drop table <表名>

例如:删除表名为MyClass 的表

mysql> drop table MyClass;

4、插入数据

命令:insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )]

例如,往表MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99,编号为3 的名为Wang 的成绩为96.5.

mysql> insert into MyClass values(1,'Tom',96.45),(2,'Joan',82.99), (2,'Wang', 96.59);

5、查询表中的数据

1)、查询所有行

命令:select <字段1,字段2,...> from < 表名> where < 表达式>

例如:查看表MyClass 中所有数据

mysql> select * from MyClass;

2)、查询前几行数据

例如:查看表MyClass 中前2行数据

mysql> select * from MyClass order by id limit 0,2;

或者:

mysql> select * from MyClass limit 0,2;

6、删除表中数据

命令:delete from 表名where 表达式

例如:删除表MyClass中编号为1 的记录

mysql> delete from MyClass where id=1;

7、修改表中数据:update 表名set 字段=新值,… where 条件

mysql> update MyClass set name='Mary' where id=1;

7、在表中增加字段:

命令:alter table 表名add字段类型其他;

例如:在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0

mysql> alter table MyClass add passtest int(4) default '0'

8、更改表名:

命令:rename table 原表名to 新表名;

例如:在表MyClass名字更改为YouClass

mysql> rename table MyClass to YouClass;

更新字段内容

update 表名set 字段名= 新内容

update 表名set 字段名= replace(字段名,'旧内容','新内容');

文章前面加入4个空格

update article set content=concat('',content);

字段类型

1.INT[(M)] 型:正常大小整数类型

2.DOUBLE[(M,D)] [ZEROFILL] 型:正常大小(双精密)浮点数字类型

3.DATE 日期类型:支持的范围是1000-01-01到9999-12-31。MySQL以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列

4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度

5.BLOB TEXT类型,最大长度为65535(2^16-1)个字符。

6.VARCHAR型:变长字符串类型

5.导入数据库表

(1)创建.sql文件

(2)先产生一个库如auction.c:mysqlbin>mysqladmin -u root -p creat auction,会提示输入密码,然后成功创建。

(2)导入auction.sql文件

c:mysqlbin>mysql -u root -p auction < auction.sql。

通过以上操作,就可以创建了一个数据库auction以及其中的一个表auction。

6.修改数据库

(1)在mysql的表中增加字段:

alter table dbname add column userid int(11) not null primary key auto_increment;

这样,就在表dbname中添加了一个字段userid,类型为int(11)。

7.mysql数据库的授权

mysql>grant select,insert,delete,create,drop

on *.* (或test.*/user.*/..)

to 用户名@localhost

identified by '密码';

如:新建一个用户帐号以便可以访问数据库,需要进行如下操作:

mysql> grant usage

-> ON test.*

-> TO testuser@localhost;

Query OK, 0 rows affected (0.15 sec)

此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到数据库并可以连接到test 数据库。下一步,我们必须指定testuser这个用户可以执行哪些操作:

mysql> GRANT select, insert, delete,update

-> ON test.*

-> TO testuser@localhost;

Query OK, 0 rows affected (0.00 sec)

此操作使testuser能够在每一个test数据库中的表执行SELECT,INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户程序:

mysql> exit

Bye9!

1:使用SHOW语句找出在服务器上当前存在什么数据库:

mysql> SHOW DATABASES;

2:2、创建一个数据库MYSQLDATA

mysql> Create DATABASE MYSQLDATA;

3:选择你所创建的数据库

mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)

4:查看现在的数据库中存在什么表

mysql> SHOW TABLES;

5:创建一个数据库表

mysql> Create TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));

6:显示表的结构:

mysql> DESCRIBE MYTABLE;

7:往表中加入记录

mysql> insert into MYTABLE values ("hyq","M");

8:用文本方式将数据装入数据库表中(例如D:/mysql.txt)

mysql> LOAD DATA LOCAL INFILE "D:/mysql.txt" INTO TABLE MYTABLE;

9:导入.sql文件命令(例如D:/mysql.sql)

mysql>use database;

mysql>source d:/mysql.sql;

10:删除表

mysql>drop TABLE MYTABLE;

11:清空表

mysql>delete from MYTABLE;

12:更新表中数据

mysql>update MYTABLE set sex="f" where name='hyq';

以下是无意中在网络看到的使用MySql的管理心得,

摘自:https://www.360docs.net/doc/e39799666.html,/article/htmldata/2004_12/3/57/article_1060_1.html

在windows中MySql以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start mysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqld start"命令,注意启动者应具有管理员权限。

刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、root帐户设置密码,可用如下命令进行:

use mysql;

delete from User where User="";

update User set Password=PASSWORD('newpassword') where User='root';

如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动数据库服务,此时登录时可用如下类似命令:

mysql -uroot -p;

mysql -uroot -pnewpassword;

mysql mydb -uroot -p;

mysql mydb -uroot -pnewpassword;

上面命令参数是常用参数的一部分,详细情况可参考文档。此处的mydb是要登录的数据库的名称。在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。MySql的用户管理是通过User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下:

grant all on mydb.* to NewUserName@HostName identified by "password" ;

grant usage on *.* to NewUserName@HostName identified by "password";

grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";

grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password";

若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password字段应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应字段,也可以使用REVOKE操作。

下面给出本人从其它资料(https://www.360docs.net/doc/e39799666.html,)获得的对常用权限的解释:

全局管理权限:

FILE: 在MySQL服务器上读写文件。

PROCESS: 显示或杀死属于其它用户的服务线程。

RELOAD: 重载访问控制表,刷新日志等。

SHUTDOWN: 关闭MySQL服务。

数据库/数据表/数据列权限:

Alter: 修改已存在的数据表(例如增加/删除列)和索引。

Create: 建立新的数据库或数据表。

Delete: 删除表的记录。

Drop: 删除数据表或数据库。

INDEX: 建立或删除索引。

Insert: 增加表的记录。

Select: 显示/搜索表的记录。

Update: 修改表中已存在的记录。

特别的权限:

ALL: 允许做任何事(和root一样)。

USAGE: 只允许登录--其它什么也不允许做。

---------------------

MYSQL常用命令

有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密

码、增加用户等方面来学习一些MYSQL的常用命令。

有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。

一、连接MYSQL

格式:mysql -h主机地址-u用户名-p用户密码

1、例1:连接到本机上的MYSQL

首先在打开DOS窗口,然后进入目录mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL 中了,MYSQL的提示符是:mysql>

2、例2:连接到远程主机上的MYSQL

假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

mysql -h110.110.110.110 -uroot -pabcd123

(注:u与root可以不用加空格,其它也一样)

3、退出MYSQL命令:exit (回车)

二、修改密码

格式:mysqladmin -u用户名-p旧密码password 新密码

1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令

mysqladmin -uroot -password ab12

注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。

2、例2:再将root的密码改为djg345

mysqladmin -uroot -pab12 password djg345

MYSQL常用命令(下)

一、操作技巧

1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。

2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。

二、显示命令

1、显示数据库列表。

show databases;

刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。

2、显示库中的数据表:

use mysql;//打开库,学过FOXBASE的一定不会陌生吧

show tables;

3、显示数据表的结构:

describe 表名;

4、建库:

create database 库名;

5、建表:

use 库名;

create table 表名(字段设定列表);

6、删库和删表:

drop database 库名;

drop table 表名;

7、将表中记录清空:

delete from 表名;

8、显示表中的记录:

select * from 表名;

三、一个建库和建表以及插入数据的实例

drop database if exists school; //如果存在SCHOOL则删除

create database school; //建立库SCHOOL

use school; //打开库SCHOOL

create table teacher //建立表TEACHER

(

id int(3) auto_increment not null primary key,

name char(10) not null,

address varchar(50) default '深圳',

year date

); //建表结束

//以下为插入字段

insert into teacher values('','glchengang','深圳一中','1976-10-10');

insert into teacher values('','jack','深圳一中','1975-12-23');

注:在建表中(1)将ID设为长度为3的数字字段:int(3)并让它每个记录自动加

一:auto_increment并不能为空:not null而且让他成为主字段primary key

(2)将NAME设为长度为10的字符字段

(3)将ADDRESS设为长度50的字符字段,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。

(4)将YEAR设为日期字段。

如果你在mysql提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:\下,并在DOS状态进入目录\mysql\bin,然后键入以下命令:

mysql -uroot -p密码< c:\school.sql

如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。

四、将文本数据转到数据库中

1、文本数据应符合的格式:字段数据之间用tab键隔开,null值用\n来代替.

例:

3 rose 深圳二中1976-10-10

4 mike 深圳一中1975-12-23

2、数据传入命令load data local infile "文件名" into table 表名;

注意:你最好将文件复制到\mysql\bin目录下,并且要先用use命令打表所在的库。

五、备份数据库:(命令在DOS的\mysql\bin目录下执行)

mysqldump --opt school>school.bbb

注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。

一.SELECT语句的完整语法为:

SELECT[ALL|DISTINCT|DISTINCTROW|TOP]

{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}

FROM tableexpression[,…][IN externaldatabase]

[WHERE…]

[GROUP BY…]

[HAVING…]

[ORDER BY…]

[WITH OWNERACCESS OPTION]

说明:

用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。

1 FROM子句

FROM 子句指定了SELECT语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由INNER JOIN、LEFT JOIN 或RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。

例:下列SQL语句返回所有有定单的客户:

SELECT OrderID,Customer.customerID

FROM Orders Customers

WHERE Orders.CustomerID=Customers.CustomeersID

2 ALL、DISTINCT、DISTINCTROW、TOP谓词

(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。

例:SELECT ALL FirstName,LastName

FROM Employees

(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。

(3) DISTINCTROW 如果有重复的记录,只返回一个

(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用TOP N PERCENT子句(其中N 表示百分比)

例:返回5%定货额最大的定单

SELECT TOP 5 PERCENT*

FROM [ Order Details]

ORDER BY UnitPrice*Quantity*(1-Discount) DESC

3 用AS 子句为字段取别名

如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望

把它放到一个新的列里显示,则用AS保留。

例:返回FirstName字段取别名为NickName

SELECT FirstName AS NickName ,LastName ,City

FROM Employees

例:返回新的一列显示库存价值

SELECT ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock FROM Products

二 .WHERE 子句指定查询条件

1 比较运算符

比较运算符含义

= 等于

> 大于

< 小于

>= 大于等于

<= 小于等于

<> 不等于

!> 不大于

!< 不小于

例:返回96年1月的定单

SELECT OrderID, CustomerID, OrderDate

FROM Orders

WHERE OrderDate>#1/1/96# AND OrderDate<#1/30/96#

注意:

Mcirosoft JET SQL 中,日期用…#?定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号??,尾空格在比较中被忽略。

例:

WHERE OrderDate>#96-1-1#

也可以表示为:

WHERE OrderDate>Datevalue(…1/1/96?)

使用NOT 表达式求反。

例:查看96年1月1日以后的定单

WHERE Not OrderDate<=#1/1/96#

2 范围(BETWEEN 和NOT BETWEEN)

BETWEEN …AND…运算符指定了要搜索的一个闭区间。

例:返回96年1月到96年2月的定单。

WHERE OrderDate Between #1/1/96# And #2/1/96#

3 列表(IN ,NOT IN)

IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。

例:要找出住在London、Paris或Berlin的所有客户

SELECT CustomerID, CompanyName, ContactName, City

FROM Customers

WHERE City In(…London?,? Paris?,? Berlin?)

4 模式匹配(LIKE)

LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。

LIKE运算符里使用的通配符

通配符含义

?任何一个单一的字符

* 任意长度的字符

# 0~9之间的单一数字

[字符列表] 在字符列表里的任一值

[!字符列表] 不在字符列表里的任一值

- 指定字符范围,两边的值分别为其上下限

例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户

SELECT CustomerID ,CompanyName,City,Phone

FROM Customers

WHERE Phone Like …(171)555-####?

LIKE运算符的一些样式及含义

样式含义不符合

LIKE …A*? A后跟任意长度的字符Bc,c255

LIKE?5[*]? 5*5 555

LIKE?5?5? 5与5之间有任意一个字符55,5wer5

LIKE?5##5? 5235,5005 5kd5,5346

LIKE?[a-z]? a-z间的任意一个字符5,%

LIKE?[!0-9]?非0-9间的任意一个字符0,1

LIKE?[[]? 1,*

三 .用ORDER BY子句排序结果

ORDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。

ORDER子句中定义了多个字段,则按照字段的先后顺序排序。

例:

SELECT ProductName,UnitPrice, UnitInStock

FROM Products

ORDER BY UnitInStock DESC , UnitPrice DESC, ProductName

ORDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。例:下面的语句产生与上列相同的效果。

SELECT ProductName,UnitPrice, UnitInStock

FROM Products

ORDER BY 1 DESC , 2 DESC,3

四 .运用连接关系实现多表查询

例:找出同一个城市中供应商和客户的名字

SELECT https://www.360docs.net/doc/e39799666.html,panyName, https://www.360docs.net/doc/e39799666.html,

FROM Customers, Suppliers

WHERE Customers.City=Suppliers.City

例:找出产品库存量大于同一种产品的定单的数量的产品和定单

SELECT ProductName,OrderID, UnitInStock, Quantity

FROM Products, [Order Deails]

WHERE Product.productID=[Order Details].ProductID

AND UnitsInStock>Quantity

另一种方法是用Microsof JET SQL 独有的JNNER JOIN

语法:

FROM table1 INNER JOIN table2

ON table1.field1 comparision table2.field2

其中comparision 就是前面WHERE子句用到的比较运算符。

SELECT FirstName,lastName,OrderID,CustomerID,OrderDate

FROM Employees

INNER JOIN Orders ON Employees.EmployeeID=Orders.EmployeeID

注意:

INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。

在一个JOIN语句中连接多个ON子句

语法:

SELECT fields

FROM table1 INNER JOIN table2

ON table1.field1 compopr table2.field1 AND

ON table1.field2 compopr table2.field2 OR

ON table1.field3 compopr table2.field3

也可以

SELECT fields

FROM table1 INNER JOIN

(table2 INNER JOIN [( ]table3

[INNER JOER] [( ]tablex[INNER JOIN]

ON table1.field1 compopr table2.field1

ON table1.field2 compopr table2.field2

ON table1.field3 compopr table2.field3

外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。

FROM table [LEFT|RIGHT]JOIN table2

ON table1.field1comparision table.field2

用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据

例:不管有没有定货量,返回所有商品

SELECT ProductName ,OrderID

FROM Products

LEFT JOIN Orders ON Products.PrductsID=Orders.ProductID

右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。

空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。

SELECT *

FROM talbe1

LEFT JOIN table2 ON table1.a=table2.c

1 连接查询中使用Iif函数实现以0值显示空值

Iif表达式:Iif(IsNull(Amount,0,Amout)

例:无论定货大于或小于¥50,都要返回一个标志。

Iif([Amount]>50,?Big order?,?Small order?)

五. 分组和总结查询结果

在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。

GROUP BY 子句的语法

SELECT fidldlist

FROM table

WHERE criteria

[GROUP BY groupfieldlist [HAVING groupcriteria]]

注:Microsoft Jet数据库Jet 不能对备注或OLE对象字段分组。

GROUP BY字段中的Null值以备分组但是不能被省略。

在任何SQL合计函数中不计算Null值。

GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。

例:在…WA?地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。SELECT Title ,Count(Title) as Total

FROM Employees

WHERE Region = …WA?

GROUP BY Title

HAVING Count(Title)>1

JET SQL 中的聚积函数

聚集函数意义

SUM ( ) 求和

AVG ( ) 平均值

COUNT ( ) 表达式中记录的数目

COUNT (* ) 计算记录的数目

MAX 最大值

MIN 最小值

VAR 方差

STDEV 标准误差

FIRST 第一个值

LAST 最后一个值

六. 用Parameters声明创建参数查询

Parameters声明的语法:

PARAMETERS name datatype[,name datatype[, …]]

其中name 是参数的标志符,可以通过标志符引用参数.

Datatype说明参数的数据类型.

使用时要把PARAMETERS 声明置于任何其他语句之前.

例:

PARAMETERS[Low price] Currency,[Beginning date]datatime

SELECT OrderID ,OrderAmount

FROM Orders

WHERE OrderAMount>[low price]

AND OrderDate>=[Beginning date]

七. 功能查询

所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.

1 更新查询

UPDATE子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.

更新查询语法:

UPDATE 表名

SET 新值

WHERE 准则

例:英国客户的定货量增加5%,货运量增加3%

UPDATE OEDERS

SET OrderAmount = OrderAmount *1.1

Freight = Freight*1.03

WHERE ShipCountry = …UK?

2 删除查询

DELETE子句可以使用户删除大量的过时的或冗于的数据.

注:删除查询的对象是整个记录.

DELETE子句的语法:

DELETE [表名.*]

FROM 来源表

WHERE 准则

例: 要删除所有94年前的定单

DELETE *

FROM Orders

WHERE OrderData<#94-1-1#

3 追加查询

INSERT子句可以将一个或一组记录追加到一个或多个表的尾部.

INTO 子句指定接受新记录的表

valueS 关键字指定新记录所包含的数据值.

INSERT 子句的语法:

INSETR INTO 目的表或查询(字段1,字段2,…)

valueS(数值1,数值2,…)

例:增加一个客户

INSERT INTO Employees(FirstName,LastName,title)

valueS(…Harry?,?Washington?,?Trainee?)

4 生成表查询

可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.

SELECT INTO子句用来创建生成表查询语法:

SELECT 字段1,字段2,…

INTO 新表[IN 外部数据库]

FROM 来源数据库

WHERE 准则

例:为定单制作一个存档备份

SELECT *

INTO OrdersArchive

FROM Orders

八. 联合查询

UNION运算可以把多个查询的结果合并到一个结果集里显示.

UNION运算的一般语法:

[表]查询1 UNION [ALL]查询2 UNION …

例:返回巴西所有供给商和客户的名字和城市

SELECT CompanyName,City

FROM Suppliers

WHERE Country = …Brazil?

UNION

SELECT CompanyName,City

FROM Customers

WHERE Country = …Brazil?

注:

缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项

UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.

每一个查询参数中可以使用GROUP BY 子句或HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.

九. 交叉查询

交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.

Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:

TRANSFORM aggfunction

SELECT 语句

GROUP BY 子句

PIVOT pivotfield[IN(value1 [,value2[,…]]) ]

Aggfounction指SQL聚积函数,

SELECT语句选择作为标题的的字段,

GROUP BY 分组

说明:

Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值. value代表创建列标题的固定值.

例:显示在1996年里每一季度每一位员工所接的定单的数目:

TRANSFORM Count(OrderID)

SELECT FirstName&??&LastName AS FullName

FROM Employees INNER JOIN Orders

ON Employees.EmployeeID = Orders.EmployeeID

WHERE DatePart(“yyyy”,OrderDate)= …1996?

GROUP BY FirstName&??&LastName

ORDER BY FirstName&??&LastName

POVOT DatePart(“q”,OrderDate)&?季度?

十 .子查询

子查询可以理解为套查询.子查询是一个SELECT语句.

1 表达式的值与子查询返回的单一值做比较

语法:

表达式comparision [ANY|ALL|SOME](子查询)

说明:

ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True 或False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True 结果,ANY测试的返回True值(既WHERE子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生True结果,才回返回True 值.

例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品

SELECT * FROM Products

WHERE UnitPrice>ANY

(SELECT UnitPrice FROM[Order Details] WHERE Discount>0.25)

2 检查表达式的值是否匹配子查询返回的一组值的某个值

语法:

[NOT]IN(子查询)

例:返回库存价值大于等于1000的产品.

SELECT ProductName FROM Products

WHERE ProductID IN

(SELECT PrdoctID FROM [Order DEtails]

WHERE UnitPrice*Quantity>= 1000)

3检测子查询是否返回任何记录

语法:

[NOT]EXISTS (子查询)

例:用EXISTS检索英国的客户

SELECT ComPanyName,ContactName

FROM Orders

WHERE EXISTS

(SELECT *

FROM Customers

WHERE Country = …UK? AND

Customers.CustomerID= Orders.CustomerID)

1 CREATE PROCEDURE(创建)

CREATE PROCEDURE存储过程名(参数列表)

BEGIN

SQL语句代码块

END

注意:

由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN 参数。要指定为其它参数,可在参数名之前使用关键词OUT或INOUT

在mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。

当使用delimiter命令时,你应该避免使用反斜杠(…"?)字符,因为那是MySQL的转义字符。

如:

mysql> delimiter //

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)

-> BEGIN

-> SELECT COUNT(*) INTO param1 FROM t;

-> END

-> //

Query OK, 0 rows affected (0.00 sec)

1.2 ALTER PROCEDURE(修改)

ALTER PROCEDURE存储过程名SQL语句代码块

这个语句可以被用来改变一个存储程序的特征。

1.3 DROP PROCEDURE(删除)

DROP PROCEDURE IF EXISTS存储过程名

eg:DROP PROCEDURE IF EXISTS proc_employee (proc_employee存储过程名)

这个语句被用来移除一个存储程序。不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

1.4 SHOW CREATE PROCEDURE(类似于SHOW CREATE TABLE,查看一个已存在的存储过程)SHOW CREATE PROCEDURE存储过程名

1.5 SHOW PROCEDURE STATUS(列出所有的存储过程)

SHOW PROCEDURE STATUS

1.6 CALL语句(存储过程的调用)

CALL存储过程名(参数列表)

CALL语句调用一个先前用CREATE PROCEDURE创建的程序。

CALL语句可以用声明为OUT或的INOUT参数的参数给它的调用者传回值。

存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

1.7 BEGIN ... END(复合语句)

[begin_label:]

BEGIN

[statement_list]

END

[end_label]

存储子程序可以使用BEGIN ... END复合语句来包含多个语句。

statement_list代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。

复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的。

1.8 DECLARE语句(用来声明局部变量)

DECLARE语句被用来把不同项目局域到一个子程序:局部变量

DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。

1.9 存储程序中的变量

1.1 DECLARE局部变量

DECLARE var_name[,...] type [DEFAULT value]

这个语句被用来声明局部变量。

要给变量提供一个默认值,请包含一个DEFAULT子句。

值可以被指定为一个表达式,不需要为一个常数。

如果没有DEFAULT子句,初始值为NULL。

局部变量的作用范围在它被声明的BEGIN ... END块内。

它可以被用在嵌套的块中,除了那些用相同名字声明变量的块。

1.2 变量SET语句

SET var_name = expr [, var_name = expr]

在存储程序中的SET语句是一般SET语句的扩展版本。

被参考变量可能是子程序内声明的变量,或者是全局服务器变量。

在存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这允许SET a=x, b=y, ...这样的扩展语法。

其中不同的变量类型(局域声明变量及全局和集体变量)可以被混合起来。

这也允许把局部变量和一些只对系统变量有意义的选项合并起来。

1.3 SELECT ... INTO语句

SELECT col_name[,...] INTO var_name[,...] table_expr

这个SELECT语法把选定的列直接存储到变量。

因此,只有单一的行可以被取回。

SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

注意,用户变量名在MySQL 5.1中是对大小写不敏感的。

重要: SQL变量名不能和列名一样。如果SELECT ... INTO这样的SQL语句包含一个对列的参考,并包含一个与列相同名字的局部变量,MySQL当前把参考解释为一个变量的名字。

1.10 MySQL存储过程参数类型(in、out、inout)

此小节内容来自:

参见地址:https://www.360docs.net/doc/e39799666.html,/nonels/archive/2009/04/22/233324.html

MySQL存储过程参数(in)

MySQL存储过程“in”参数:跟C语言的函数参数的值传递类似,MySQL存储过程内部可能会修改此参数,但对in类型参数的修改,对调用者(caller)来说是不可见的(not visible)。

MySQL存储过程参数(out)

MySQL存储过程“out”参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为null,无论调用者是否给存储过程参数设置值

MySQL存储过程参数(inout)

MySQL存储过程inout参数跟out类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过inout参数传递值给存储过程。

总结

如果仅仅想把数据传给MySQL存储过程,那就使用“in”类型参数;如果仅仅从MySQL存储过程返回值,那就使用“out”类型参数;如果需要把数据传给MySQL存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout”类型参数。

1.11 例子:

1.1 创建存储过程

带(输出参数)返回值的存储过程:

--删除存储过程

DROP PROCEDURE IF EXISTS proc_employee_getCount

--创建存储过程

CREATE PROCEDURE proc_employee_getCount(out n int)

BEGIN

SELECT COUNT(*) FROM employee ;

END

--MYSQL调用存储过程

CALL proc_employee_getCount(@n);

带输入参数的存储过程:

--删除存储过程

DROP PROCEDURE IF EXISTS proc_employee_findById;

--创建存储过程

CREATE PROCEDURE proc_employee_findById(in n int)

BEGIN

SELECT * FROM employee where id=n;

END

--定义变量

SET @n=1;

--调用存储过程

CALL proc_employee_findById(@n);

操作存储过程时应注意:

1. 删除存储过程时只需要指定存储过程名即可,不带括号;

2. 创建存储过程时,不管该存储过程有无参数,都需要带括号;

3. 在使用SET定义变量时应遵循SET的语法规则;

SET @变量名=初始值;

4. 在定义存储过程参数列表时,应注意参数名与数据库中字段名区别开来,否则将出现无法预期的结果1.12 Java代码调用存储过程(JDBC)

相关API:java.sql.CallableStatement

使用到java.sql.CallableStatement接口,该接口专门用来调用存储过程;

该对象的获得依赖于java.sql.Connection;

通过Connection实例的prepareCall()方法返回CallableStatement对象

prepareCall()内部为一固定写法{call存储过程名(参数列表1,参数列表2)}可用?占位

eg:connection.prepareCall("{call proc_employee(?)}");

C++和Mysql

#include

#include

#include

#include

#include

#include

using namespace std;

int main()

{

const char user[]="root";//username

const char pswd[]="root";//password

const char host[]="localhost";//or"127.0.0.1"

const char table[]="test";//database

unsigned int port=3306;//server port

MYSQL myCont;

MYSQL_RES*result;

MYSQL_ROW sql_row;

MYSQL_FIELD*fd;

char column[32][32];

int res;

mysql_init(&myCont);

if(mysql_real_connect(&myCont,host,user,pswd,table,port,NULL,0))

{

cout<<"connect succeed!"<

mysql_query(&myCont,"SET NAMES GBK");//设置编码格式,否则在cmd下无法显示中文res=mysql_query(&myCont,"select * from samples");//查询

if(!res)

{

result=mysql_store_result(&myCont);//保存查询到的数据到result

if(result)

{

int i,j;

cout<<"number of result:"<<(unsigned long)mysql_num_rows(result)<

{

strcpy(column[i],fd->name);

}

j=mysql_num_fields(result);

for(i=0;i

{

printf("%s\t",column[i]);

}

printf("\n");

while(sql_row=mysql_fetch_row(result))//获取具体的数据

{

for(i=0;i

{

printf("%s\n",sql_row[i]);

}

printf("\n");

}

}

}

else

{

cout<<"query sql failed!"<

}

}

存储过程的典型例子

可能有不少朋友使用SQL SERVER做开发也已经有段日子,但还没有或者很少在项目中使用存储过程,或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时,就会发现存储过程给我们带来了好处了,修改方便,不能去改我们的应用程序,只需要改存储过程的内容,而且还可以使我们的程序速度得到提高。 QUOTE: SQL SERVER 联机丛书中的定义: 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。 要使用存储过程,首先我们必需熟悉一些基本的T-SQL语句,因为存储过程是由于一组T-SQL语句构成的,并且,我们需要了解一些关于函数、过程的概念,因为我们需要在应用程序中调用存储过程,就像我们调用应用程序的函数一样,不过调用的方法有些不同。 下面我们来看一下存储过程的建立和使用方法。 一、创建存储过程 和数据表一样,在使用之前我们需要创建存储过程,它的简明语法是: QUOTE: CREATE PROC 存储过程名称 [参数列表(多个以“,”分隔)] AS SQL 语句 例: QUOTE: CREATE PROC upGetUserName @intUserId INT, @ostrUserName NVARCHAR(20) OUTPUT -- 要输出的参数 AS BEGIN -- 将uName的值赋给 @ostrUserName 变量,即要输出的参数 SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId END 其中 CREATE PROC 语句(完整语句为CREATE PROCEDURE)的意思就是告诉SQL SERVER,

第9章 存储过程与存储函数

第9章存储过程与存储函数 一、选择题 1.MySQL中存储过程的建立以关键字()开始,后面仅跟存储过程的名称和参数。A.CREATE FUNCTION B.CREATE TRIGGER C.CREATE PROCEDURE D.CREATE VIEW 2.下列关于存储过程名描述错误的是()。 A.MySQL的存储过程名称不区分大小写。 B.MySQL的存储过程名称区分大小写。 C.存储过程名不能与MySQL数据库中的内置函数重名。 D.存储过程的参数名不要跟字段名一样。 3.下面声明变量正确的是()。 A.DECLARE x char(10) DEFAULT 'outer ' B.DECLARE x char DEFAULT 'outer ' C.DECLARE x char(10) DEFAULT outer D.DECLARE x DEFAULT 'outer ' 4.从tb_sutdent表中将名称为mrsoft的用户赋值给host,以下SQL语句正确的是()。A.SELECT host INTO name FROM tb_sutdent WHERE name ='mrsoft'; B.SELECT name INTO host FROM tb_sutdent WHERE name= 'LeonSK '; C.SELECT name INTO host FROM tb_sutdent WHERE name='mrsoft'; D.SELECT name INTO host FROM tb_sutdent WHERE name=‘mrsoft’; 5.光标的一般使用步骤,以下正确的是()。 A.声明光标使用光标打开光标关闭光标 B.打开光标声明光标使用光标关闭光标 C.声明光标打开光标选择光标关闭光标 D.声明光标打开光标使用光标关闭光标 6.下列控制流程语句中,MySQL存储过程不支持()。 A.WHILE B.FOR C.LOOP D.REPEAT 25

C#调用存储过程简单完整例子讲解

C#调用存储过程简单完整例子https://www.360docs.net/doc/e39799666.html,/itblog/article/details/752869 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO DECLARE @iRet INT, @PKDisp VARCHAR(20) SET @iRet = '1' Select @iRet = CASE WHEN @PKDisp = '一' THEN 1 WHEN @PKDisp = '二' THEN 2 WHEN @PKDisp = '三' THEN 3 WHEN @PKDisp = '四' THEN 4 WHEN @PKDisp = '五' THEN 5 ELSE 100 END DECLARE @i INT SET @i = 1 WHILE @i<10 BEGIN set @i=@i+1 PRINT @i END DECLARE @d INT set @d = 1 IF @d = 1 BEGIN -- 打印 PRINT '正确' END ELSE BEGIN PRINT '错误' END

CREATE PROC P_TEST @Name VARCHAR(20), @Rowcount INT OUTPUT AS BEGIN SELECT * FROM T_Customer WHERE NAME=@Name SET @Rowcount=@@ROWCOUNT END GO ---------------------------------------------------------------------------------------- --存储过程调用如下: ---------------------------------------------------------------------------------------- DECLARE @i INT EXEC P_TEST 'A',@i OUTPUT SELECT @i --结果 /* Name Address Tel ---------- ---------- -------------------- A Address Telphone (所影响的行数为 1 行) ----------- 1 (所影响的行数为 1 行) */ ---------------------------------------------------------------------------------------- --DotNet 部分(C#) --WebConfig 文件: ---------------------------------------------------------------------------------------- ......

SQL存储过程实例

题目1 1、学校图书馆借书信息管理系统建立三个表: 学生信息表:student 图书表:book 借书信息表:borrow 请编写SQL语句完成以下的功能: 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、 学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示: 2)查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:

3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期; 参考查询结果如下图所示: 4)查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所 示: 附加:建表语句:

标准答案:

题目2 程序员工资表:ProWage 创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱? 例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程后的结果如图:

请编写T-SQL来实现如下功能: 1)创建存储过程,查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000 元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。 2)创建存储过程,查询程序员平均工资在4500元,如果不到则每个程序员每次加200元, 至到所有程序员平均工资达到4500元。 建表语句

JAVA通过MyBatis调用MySql存储过程和函数

JAV A通过MyBatis调用MySql存储过程和函数 1.引言 无论是采用SPRING MVC框架开发WEB画面,还是开发需按一定时间间隔执行的批处理,都可能要调用数据库的存储过程或函数。其间调用参数设置不正会浪费大量调试时间初学者甚至放弃使用存储过程。本文记录了通过MyBatis调用MySql存储过程和函数的具体参数设置内容,供参考。 2.MySql存储过程例 /*全公司员工下一年度带薪休假一发赋予处理*/ CREATE DEFINER=`DBuser`@`%` PROCEDURE `paid_vacation_compute `( OUT p_返回值 INT(11) , INOUT p_员工号 CHAR(3) , p_操作者ID VARCHAR(3)) PROC_START: BEGIN /* 变量声明 */ DECLARE done INT; #异常退出控制变量 DECLARE empNo CHAR(3); #员工号 DECLARE dateHire date; #分公司就职日 DECLARE workYears INT; #集团内工作年数 DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假) DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假) DECLARE elapseYear INT; #入集团经过年度数 /* 游标声明 */ #上年带薪休假数据 DECLARE staffPaidVacationDaysCur CURSOR FOR SELECT a.EMP_NO, #员工号 a.DATE_HIRE, #入职日期 a.WORK_YEARS, #工作年限 b.REMAIN_DAYS # 上年带薪休假应休但未休残日数 FROM T_EMPLOYEE AS a, T_PAID_VACATION AS b WHERE a. EMP_NO = b. EMP_NO /* 程序退出规定声明 */ DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;

数据库系统原理与开发-数据库存储过程

6.3 数据库存储过程

【本节的主要内容】 ?了解存储过程的概念 ?掌握存储过程创建、删除的方法?掌握存储过程的执行方法 ?掌握PostgreSQL的PL/SQL基本语法?理解存储过程的优缺点

一、什么是存储过程 ?存储过程(Stored Procedure)是一种数据库的对象; ?由一组能完成特定功能的SQL 语句集构成; ?是把经常会被重复使用的SQL语句逻辑块封装起来,经编译后,存储在数据库服务器端; ?当被再次调用时,而不需要再次编译; ?当客户端连接到数据库时,用户通过指定存储过程的名字并给出参数,数据库就可以找到相应的存储过程予以调用。

二、创建存储过程 ?不同的数据库系统创建存储过程的语法存在差异; ?许多数据库为创建存储过程和函数提供不同命令; ?如ORACLE、MySQL、SQL SERVER等数据库,使用CREATE PRECEDURE命令创建存储过程,使用CREATE FUNCTION命令创建函数。 ?PostgreSQL使用CREATE FUNCTION命令创建存储过程。

4 三、创建存储过程的语法 CREATE [ OR REPLACE ] FUNCTION name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ) [ RETURNS retype | RETURNS TABLE ( column_name column_type [, ...] ) ]AS $$ //$$用于声明存储过程的实际代码的开始DECLARE -- 声明段BEGIN --函数体语句END; $$ LANGUAGE lang_name; //$$ 表明代码的结束, LANGUAGE 后面指明所用的编程语言 (1)name :要创建的存储过程名;(3)argmode :存储过程参数的模式可以为IN 、OUT 或INOUT ,缺省值是IN 。(4)argname :形式参数的名字。 (5)RETURNS :返回值;RETURNS TABLE :返回二维表 (2)OR REPLACE :覆盖同名的存储过程;

MySQL存储过程实例教程

MySQL存储过程实例教程 MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的。 实例261:存储过程的创建 这是一个创建存储过程的实例 录像位置:光盘mingrisoft9?lt;/p> 实例说明 为了保证数据的完整性、一致性,提高应用的性能,常采用存储过程技术。MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用。本实例将介绍在MySQL 5.0以后的版本中创建存储过程。 技术要点 一个存储过程包括名字、参数列表,以及可以包括很多SQL语句的SQL语句集。下面为一个存储过程的定义过程: create procedure proc_name (in parameter integer)begindeclare variable varchar(20);if parameter=1 thenset variable='MySQL';elseset variable='PHP';end if;insert into tb (name) values (variable);end; MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。MySQL的存储过程名称不区分大小写,例如PROCE1()和proce1()代表同一个存储过程名。存储过程名不能与MySQL数据库中的内建函数重名。 存储过程的参数一般由3部分组成。第一部分可以是in、out或inout。in表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。第二部分为参数名。第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。 MySQL存储过程的语句块以begin开始,以end结束。语句体中可以包含变量的声明、控制语句、SQL查询语句等。由于存储过程内部语句要以分号结束,所以在定义存储过程前应将语句结束标志“;”更改为其他字符,并且该字符在存储过程中出现的几率也应该较低,可以用关键字delimiter更改。例如: mysql>delimiter // 存储过程创建之后,可用如下语句进行删除,参数proc_name指存储过程名。 drop procedure proc_name 实现过程

一个完整的数据库示例--说明

一、表的结构及完整性约束 新建一个数据库jxsk,包括S、C、SC、T、TC五个表,结构如下:C表: S表: SC表: T表:

TC表: 二、安全性控制及视图机制 1、三类角色:depart、teacher、student depart的权限: teacher的权限:

student的权限: 2、有2个院系用户:d_jsj,d_xx,同属于depart角色。

有1个教师用户:t ,属于teacher 角色。

有一个学生用户:s,属于student角色。 3、创建计算机系教师视图t_view_jsj、计算机系学生视图s_view_jsj,并授予d_jsj 用户在这两个视图上的select、delete、update、insert权限。 计算机系教师视图t_view_jsj: create view t_view_jsj as select tno,tn,sex,age,prof,sal,comm,dept from t where dept='计算机' with check option

授予d_jsj用户在计算机系教师视图t_view_jsj 上的select、delete、update、insert 权限: grant select,update,delete,insert on t_view_jsj to d_jsj 计算机系学生视图t_view_jsj: create view s_view_jsj as select sno,sn,sex,age,dept,resume,native from s where dept='计算机' with check option 授予d_jsj用户在计算机系学生视图s_view_jsj 上的select、delete、update、insert 权限: grant select,update,delete,insert on s_view_jsj to d_jsj …… 4、创建一个视图,显示学号,姓名,院系,课程名,成绩。 create view score_view(学号,姓名,院系,课程名,成绩) as select s.sno,sn,dept,cn,score from s,sc,c where s.sno=sc.sno and https://www.360docs.net/doc/e39799666.html,o=https://www.360docs.net/doc/e39799666.html,o 三、完整性控制--触发器、规则 1、要求当删除C表中某课程信息时,同时删除SC和TC中与此课程相关的记录。create trigger c_delete_trigger on c after delete as delete from sc where cno in (select cno from deleted) delete from tc where cno in (select cno from deleted) go

MySQL存储过程简单入门

MySQL存储过程语法 1、概念 存储过程就是能完成一定操作的一组SQL语句。 2、作用 大大提高效率(存储过程本身执行速度非常快,而且,调用存储过程大大减少数据库交互次数);提高重用性。 3、使用方法 1、创建: create procedure sp_name() begin …… end 注意:可能有参数。 2、调用: call sp_name() 注意:括号不能省略。 3、删除: drop procedure sp_name 注意:没有括号,不能在一个存储过程中删除另一个存储过程,只能调用。 4、语句: 条件语句, if 条件then statement else statement end if while循环语句, [label:] while expression do statement end while [label]; loop循环语句, [label:] loop statement end loop [label];

repeat until循环语句, [label] repeat statement until expression end repeat [label]; 5、常用命令: show procedure status:显示数据库所有存储过程基本信息。 show create procedure sp_name:显示一个存储过程详细信息。 关于运算符和基本函数与Java有些区别,用时注意就行。 4、实例 1、创建: create procedure proc_name (in parameter integer) begin declare variable varchar(20); if parameter=1 then set variable='MySQL'; else set variable='PHP'; end if; insert into tb (name) values (variable); end; 注意:代码不区分大小写;存储过程之间以及存储过程与内建函数不能同名; 存储过程参数(in传入,out传出,inout可传入,修改后传出,缺省是in); 由于存储过程内部要以分号结束,需要delimiter进行更改。 2、实现: ⑴、mysql –u用户名–p用户密码 ⑵、delimiter //(将结束符号“;”改成“//”,避免与存储过程冲突) ⑶、use 数据库名 ⑷、……(创建存储过程) ⑸、call proc_name(5)//(调用存储过程) -------------------------------------------- call proc_name(@para)//(对应存储过程定义中out的输出) select @para// ⑹、show procedure status//与show create procedure proc_name// 3、程序代码调用:(out型的部分代码) try{ //调取out型的存储过程P(计算记录总数) stmt = conn.prepareCall("{call p(?)}"); //读取所有OUT型的存储过程的返回参数数据 stmt.registerOutParameter(1, Types.INTEGER); stmt.execute(); int i= stmt.getInt(1);

实验六 MySql存储过程

实验六MySql存储过程 一、实验目的 1、熟悉MySql的存储过程 二、实验内容 1、建立一张学生表,属性有学号、姓名、年龄三个字段。 2、建立一个存储过程,实现学生的全查询 3、分别用IN 和OUT实现姓名的调用 4、声明一个变量,把变量加1,再把变量加入到学生表的学号字段中。 5、建立一个存储过程,外部调用这个存储过程,当外部传入的值是0时,则在学生表中插入一个学号是17的学生,如果是1时,则在学生表中插入一个学号是18的学生,如果都不是,则在学生表中插入一个学号是19的学生. 6、建立一个存储过程,做一个循环语句,循环插入5个学生。(至少用三种循环的存储过程方法) 三、试验结果截图 1.建立一张学生表,属性有学号、姓名、年龄三个字段。 2.建立一个存储过程,实现学生的全查询

3.分别用IN 和OUT实现姓名的调用 4.声明一个变量,把变量加1,再把变量加入到学生表的学号字段中。

5.建立一个存储过程,外部调用这个存储过程,当外部传入的值是0时,则在学生表中插入一个学号是17的学生,如果是1时,则在学生表中插入一个学号是18的学生,如果都不是,则在学生表中插入一个学号是19的学生.

6建立一个存储过程,做一个循环语句,循环插入5个学生。(至少用三种循环的存储过程方法) 所有代码: 1. create table stu( stuno int, stuna varchar(20), stuage int ); insert into stu values(001,'zhangsan',22);

insert into stu values(002,'lisi',23); insert into stu values(003,'wangwu',23); insert into stu values(004,'maliu',24); insert into stu values(005,'zhaoqi',25); insert into stu values(006,'gaoba',23); insert into stu values(007,'ddddd',22); insert into stu values(008,'ttttt',21); 2. create procedure select_all() select * from stu; 3. delimiter // create procedure searchno( in no int, out na varchar(20), out age int ) begin select stuna from stu where stuno=no into na; select stuage from stu where stuno=no into age; end // delimiter ; call searchno(n,@na,@age); select @na,@age; 4. delimiter // create procedure noupdate( in n int) begin update stu set stuno=stuno+n; end // delimiter ; 5. delimiter // create procedure addstu( in sno int ) begin case sno when 0 then insert into stu values(17,'no17',20); when 1 then insert into stu values(18,'no18',20); else insert into stu values(19,'no19',20); end case; end //

MySQL存储过程实例教程2

MySQL存储过程详解 1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 (4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。 (5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。 2.关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。 3.MySQL存储过程的创建 (1). 格式

MySQL存储过程练习

存储过程实验 一、实验要求: 1.理解存储过程的概念 2.掌握存储过程的语法格式、使用方法 3.掌握存储过程的创建、执行 二、实验内容: (注意:做一下实验需要首先建立数据及其相应的表,并输入一些记录) 1.实验1:创建一个存储过程,实现查询表student中的记录信息,并执行存储过 程 (1)创建存储过程: begin select * from student end (2)执行存储过程:运行 sp_liststudent (3)执行结果如下:

2.实验2.创建一个存储过程,根据给定的学生学号返回该学生的姓名(1)创建存储过程:

CREATE PROCEDURE test5( IN id int) BEGIN SELECT * from student s WHERE s.id=id; END (2)执行存储过程:CALL test5(2) 执行结果如下: 3.实验3. 创建一个存储过程,根据班级的编号,统计该班人数,并将人数以输出 变量返回给用户。 (1)创建存储过程: CREATE PROCEDURE test00( IN roomidint) BEGIN SELECT COUNT(*) from student s WHERE s.roomid=9; END (2)执行存储过程:CALL test00(2) (3)执行结果如下:

4.实验4:创建一个存储过程查询学号为“020101”的学生的平均分是否超过了85 分,若超过则输出“ X X考出了高分”,否则输出“XX 考的一般”。 (1)创建存储过程: CREATE PROCEDURE test05() BEGIN IF (SELECT score from student WHERE id=1)>85 THEN SELECT '考得好'; ELSE SELECT '考得不好'; END IF; END

存储过程_将图片存入数据库

一、写一个存储过程,将图片存入数据库中 基本情况介绍: 数据库版本:oracle 11g 数据库用户:scott 数据库密码:tiger JDK:1.6 要导入的图片:D:\picture\1.jpg --创建存储图片的表 CREATE TABLE IMAGE_LOB (T_ID V ARCHAR2 (5) NOT NULL,T_IMAGE BLOB NOT NULL); --创建存储图片的目录 CREATE OR REPLACE DIRECTORY IMAGES AS 'D:\picture'; 存储过程如下: CREATE OR REPLACE PROCEDURE IMG_INSERT (TID V ARCHAR2,FILENAME V ARCHAR2) AS F_LOB BFILE;--文件类型 B_LOB BLOB; BEGIN iNSERT INTO IMAGE_LOB (T_ID, T_IMAGE) V ALUES (TID,EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB; --插入空的blob F_LOB:= BFILENAME ('IMAGES', FILENAME); --获取指定目录下的文件 DBMS_LOB.FILEOPEN(F_LOB, DBMS_LOB.FILE_READONL Y); --以只读的方式打开文件 DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB,DBMS_LOB.GETLENGTH (F_LOB)); --传递对象 DBMS_LOB.FILECLOSE (F_LOB); --关闭原始文件 COMMIT; END;

存储过程的实例

存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。 --------------------基本语法-------------------- 一.创建存储过程 create procedure sp_name() begin ......... end 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法: drop procedure sp_name// 2.注意事项 (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 四.其他常用命令 1.show procedure status 显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等2.show create procedure sp_name 显示某一个mysql存储过程的详细信息 --------------------数据类型及运算符-------------------- 一、基本数据类型: 略 二、变量: 自定义变量:DECLARE a INT ; SET a=100; 可用以下语句代替:DECLARE a INT DEFAULT 100; 变量分为用户变量和系统变量,系统变量又分为会话和全局级变量 用户变量:用户变量名一般以@开头,滥用用户变量会导致程序难以理解及管理 1、在mysql客户端使用用户变量 mysql> SELECT 'Hello World' into @x; mysql> SELECT @x; mysql> SET @y='Goodbye Cruel World'; mysql> select @y; mysql> SET @z=1+2+3; mysql> select @z; 2、在存储过程中使用用户变量 mysql> CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World'); mysql> SET @greeting='Hello'; mysql> CALL GreetWorld( );

mysql存储过程.详细说明,java代码调用过程

Mysql存储过程调用 说明: 由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。要指定为其它参数,可在参数名之前使用关键词OUT或INOUT 在mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。 当使用delimiter命令时,你应该避免使用反斜杠(‘"’)字符,因为那是MySQL的转义字符。 1、创建过程格式: Mysql> drop procedure if exists user_findById; Mysql> delimiter // Create procedure user_findById(in n int) Begin Select * from user where id= n; End // 调用过程: Mysql> set @n=1; --定义变量 Call user_findById(@n);--调用过程 // --显示结果 ======================================================

例2: Mysql> drop procedure if exists user_count; Mysql> delimiter // Create procedure user_count(out count int) Begin Select count(*) into count from user; End // --结束 注意: MySQL存储过程 “in”参数: 跟 C语言的函数参数的值传递类似, MySQL存储过程内部可能会修改此,参数,但对 in类型参数的修改,对调用者(caller)来说是不可见的(not visible)。 “out”参数: 从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值inout参数跟 out类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout参数传递值给存储过程。 总结:如果仅仅想把数据传给MySQL存储过程,那就使用“in”类型 参数;如果仅仅从MySQL存储过程返回值,那就使用“out”类型参数;如果需要把数据传给MySQL存储过程,还要经过一些计算后再传回给我们,

MySQL的存储过程导出和导入

MySQL的存储过程导出和导入 表结构等已经在目标数据库中存在,不想拷贝数据库过去,MySQL的存储过程导出和导入,Mysqldump工具可以实现,具体用法为: [root@localhost bin]# mysqldump -uroot -p -hlocalhost -P3306 -n -d -t -R DBName > procedure_name.sql 参数说明: -n: --no-create-db -d: --no-data -t: --no-create-info -R: --routines Dump stored routines (functions and procedures) Mysqldump是客户端工具用来备份数据库或在不同数据库之间进行数据迁移。备份内容包含创建活装载表的SQL语句: 主要参数介绍: 1.连接选项 -u,--user=name -p,--password=name -h,--host=name -P,--port=# 2.输出内容选项 --add-drop-database --add-drop-table -n;--no-create-db -d;--no-data -t;--no-create-info 3.输出格式选项 --compact -c --complete-insert -T(指定数据表中的数据备份为单纯的数据文件和建表SQL两个文件) 注意:xx.sql建表文件是以linux的root用户创建,而xx.txt文件则是一linux的mysql 用户创建,因此这两个文件的存放路径一定要保证mysql用户有读写创建文件的权限。 --fields-terminated-by=name(域分隔符) --fields-enclosed-by=name(域引用符) --fields-optionally-enclosed-by=name(域引用可选字符) --fields-escaped-by=name(转义字符) 4.字符集选项 --default--character-set=xx 5.其他选项

数据库存储过程练习附答案

存储过程、触发器练习 1、在学生选课数据库中,创建一存储过程deptmale,查询指定系的男生人数,其中系为输入参数,人数为输出参数。 create proc p_dept @dept char(20),@mannum int output as select @allcre=count(sno) from student where sdept=@dept and ssex='男' declare @num int exec p_dept '计算机系',@num output print @num 2、在s_c数据库中,创建一个存储过程totalcredit,根据输入的学生姓名,计算其总学分。(使用输出参数)。并执行该存储过程。 create proc p_cou @name char(10),@allcre int output as select @allcre=sum(ccredit)from student,course,sc where student.sno=sc.sno and https://www.360docs.net/doc/e39799666.html,o=https://www.360docs.net/doc/e39799666.html,o and sname=@name group by sc.sno declare @asum int exec p_cou '刘晨',@asum output print @asum 3、创建一更新触发器upd_grade,设置sc表的grade字段不能被更新,并显示信息“学生成绩不能被修改,请与教务处联系”。 CREATE TRIGGER mes_sc ON sc FOR UPDATE AS IF UPDATE(grade) BEGIN ROLLBACK TRAN PRINT '学生成绩不能被修改,请与教务处联系' END

mysql存储过程

目录 1.1 CREATE PROCEDURE (创建)----------------------------------------------------2 1.2 ALTER PROCEDURE (修改)-------------------------------------------------------2 1.3 DROP PROCEDURE (删除)-------------------------------------------------------2 1.4 SHOW CREA TE PROCEDURE(类似于SHOW CREA TE TABLE,查看一个已存在的存储过程)--------------------------------------------------------------------------------2 1.5 SHOW PROCEDURE STATUS (列出所有的存储过程)----------------------3 1.6 CALL语句(存储过程的调用)---------------------------------------------------------3 1.7 BEGIN ... END(复合语句)--------------------------------------------------------------3 1.8 DECLARE语句(用来声明局部变量)-------------------------------------------------3 1.9 存储程序中的变量---------------------------------------------------------------------------3 1.10 MySQL 存储过程参数类型(in、out、inout)----------------------------------------4 1.11 例子:-----------------------------------------------------------------------------------------4 1.12 Java代码调用存储过程(JDBC)------------------------------------------------------------5 1.13 声明:----------------------------------------------------------------------------------------6 冯靖 联系方式 sxyx2008@https://www.360docs.net/doc/e39799666.html, https://www.360docs.net/doc/e39799666.html,/sxyx2008

相关文档
最新文档