千家信息网

mysql 语法结构讲义

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,本文主要给大家介绍mysql 语法结构讲义,希望可以给大家补充和更新些知识,如有其它问题需要了解的可以持续在行业资讯里面关注我的更新文章的。一:创建数据库:create {database | sch
千家信息网最后更新 2024年09月22日mysql 语法结构讲义

本文主要给大家介绍mysql 语法结构讲义,希望可以给大家补充和更新些知识,如有其它问题需要了解的可以持续在行业资讯里面关注我的更新文章的。

一:

创建数据库:

create {database | schema} [if not exists] 库名 [default] character set [=] charset_name


if not exists 如果存在,就忽略。

character set 默认字符集编码。

创建数据库: create database

修改数据库: alter database

删除数据库: drop database


1、mysql常见的数据类型;


数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。


整型:

数据类型 字节

tinyint 1

smallint 2

mediumint 3

int 4

bigint 8


浮点型:

float[(M,D)] M是数字总位数,D是小数点后面的位数。

如果M和D被省略,根据硬件允许的限制来保存值。单精度浮点数。


double[(M,D)]


日期时间型:

date 3字节 YYY-MMM-DD 日期值

time 3字节 HH:MM:SS 时间值

year 1字节 YYYY 年份值

datetime 8字节 YYYY-MM-DD 混合日期和时间值


timestamp 8字节 YYYYMMDDHHMMSS 混合日期和时间值,时间戳。


字符型:

char 0-255字节 定长字符串

varchar 0-65535字节 变长字符串

tinytext 短文本字符串

text 长文本数据

mediumtext 中等长度文本数据

longtext 极大文本数据

enum('value1','value2') 1或2个字节

取决于枚举值的个数(最多65535个数).


set('value1','value2') , 1、2、3、4或8个字节,取决于set成员的数目u(最多64个成员)


打开数据库:use 库名;

验证用户打开的数据库:

select database();


创建数据表:

create table [if not exists] 表名(列名称 数据类型,...)


查看数据表列表

show tables [from 库名] [like 'pattern' | where expr]


查看数据表结构:

show columns from 表名; 或 desc 表名


插入记录:

insert [into] 表名 [(字段名,...)] values(值,...);

insert 表名 values(值,...)


查找记录

select 字段,........ from 表名;


mysql空值和非空:

空值与非空值

NULL: 表示字段可以为空

NOT NULL:表示字段不允许为空。


mysql自动编号:

自动编号,且必须和主键组合使用

默认情况下,起始值为1,每次增量为1. auto_increment


mysql主键约束:

primary key或key

主键约束特点:

每张数据表只能存在一个主键,

主键保证记录的唯一性。

主键自动为not null


mysql唯一约束:

unique key

唯一约束特点:

唯一约束可以保证记录的唯一性

唯一约束的字段可以为空值(null)

每张数据表可以存在多个唯一约束。


mysql默认约束:

default

默认值

当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。


总结:

数字类型: 字符型,整型,浮点型, 日期时间型

数据表操作: 插入记录,查找记录。

记录操作: 创建数据表,约束的使用。


二:

数据表操作:

如何创建数据表:

主键约束(primary key)

唯一约束(unique key)

默认约束(default)

非空约束(not null)


记录插入

记录查找


约束:

约束保证数据的完整性和一致性

约束分为表级约束和列级约束


约束类型包括:

主键约束(primary key)

唯一约束(unique key)

默认约束(default)

非空约束(not null)

外键约束(foreign key)


外键约束(foreign key)

保证数据一致性,完整性

实现一对一或一对多关系


外键约束的要求:

1、父表和子表必须使用相同的存储引擎,而且禁止使用临时表。

2、数据表的存储引擎只能为INNODB。

3、外键列和参照列必须具有相似的数据类型。其中,数字的长度或是否有符号位必须相同,而字符的长度则可以不同。

4、外键列和参照列必须创建索引。如果外键列不存在索引的话,mysql将自动创建索引。


编辑数据表的默认存储引擎:

mysql配置文件

Default-storage-engine=INNODB


查看表名所使用的引擎或表详细结构: show create table 表名;

查看表的索引: show indexes from 表名\G

查看mysql下所有数据库: show databases;

查看当前库下所有的表: show tables;

查看视图基本信息: desc 视图名;

查看视图基本信息: show table status like '视图名';

查看视图详细信息: show create view 视图名

查询所有触发器的信息: show triggers


查询指定触发器的详细信息:

select * from information_schema.triggers where trigger_name='触发器名';

查看存储过程和函数的状态:

show {查询存储过程 | 查询存储函数} status [like 'pattern'];

注意: like 'pattern' : 匹配存储过程或函数名称。


查看存储过程和函数状态:

show create {procedure | function} sp_name;

procedure : 表示查询存储过程。

function : 表示查询存储函数。

sp_name : 表示存储过程或函数名。

select * from information_schema.Routines WHERE routine_name='sp_name';

注意: routine_name : 存储过程和函数名。

sp_name 存储过程或函数名。

mysql 外键约束的参照操作:

1、cascade:从父表删除或更新且自动删除或更新子表中匹配的行。

2、set null:从父表删除或更新行,并设置子表中的外键列为null.如果使用该选项,必须保证子表列没有指定not null.

3、resttict:拒绝对父表的删除或更新操作。

4、no action: 标准SQL的关键字,在mysql中restrict相同。


mysql表级约束和列级约束

列级约束:指对一个数据列建立的约束

表级约束:指对多个数据列建立的约束。

列级约束既可以在列定义时声明,也可以在列定义后声明。

表级约束只能在列定义后声明。


mysql修改数据表--添加删除列

修改数据表

添加单列:

alter table 表名 add [column] 列名 列定义 [first | after 列名]


列名(col_name)

列定义(column_definition)

添加多列:

alter table 表名 add [column] (列名 列定义,...)


删除列:

alter table 表名 drop [列] 列名


添加主键约束:

alter table 表名 add [constraint [symbol]] primary key [index_type](index_col_name)


例如:

mysql> create table user2(

-> username varchar(10) not null,

-> pid smallint unsigned

-> );

Query OK, 0 rows affected (0.02 sec)


mysql> desc user2;

mysql> alter table user2 add id smallint unsigned;

mysql> alter table user2 add constraint pk_user2_id primary key(id);


添加唯一约束:

alter table 表名 add [constraint [symbol]] unique [index | key] [index_name] [index_type] (index_col_name,....)

例:

mysql> alter table user2 add unique(username);

mysql> desc user2;

mysql> alter table user2 add foreign key(pid) references provinces(id);


添加/删除默认约束

alter table 表名 alter [column] col_name {set default literal | drop default}

例:

mysql> alter table user2 add age tinyint unsigned not null;

mysql> alter table user2 alter age set default 15;


mysql修改数据表---删除约束

删除主键约束

alter table 表名 drop primary key


例:

mysql> alter table user2 drop primary key;

mysql> desc user2;


删除唯一约束:

alter table 表名 drop {index|key} index_name

例:

mysql> alter table user2 drop index username;


删除外键约束:

alter table 表名 drop foreign key fk_symbol(外键约束名称)

例如:

mysql> show create table user2;

mysql> alter table user2 drop foreign key user2_ibfk_1;

mysql> alter table user2 drop index pid;


mysql修改数据表---修改列定义和更名数据表

修改列定义:

alter table 表名 modify [column]

col_name col_definition [first | after col_name]

例如:

mysql> alter table user2 modify id smallint unsigned not null first;

mysql> show columns from user2;

mysql> alter table user2 modify id tinyint unsigned not null;


修改列名称

alter table 表名 change [column] old_col_name new_col_name col_definition [first | after col_name]


例如:

mysql> desc user2;

mysql> alter table user2 change pid p_id tinyint unsigned not null;

mysql> desc user2;


数据表更名:

方法一:

alter table 表名 rename [to|as] new_tb1_name

方法二:

rename table 表名 to 新表名 [,表名2 to 新表名2]...

例如:

mysql> alter table user2 rename user3;

或:

mysql> rename table user3 to user2;


总结:

一、约束:

(1)按功能划分:not null,primary key,unique key, default, foreign key

(2) 按数据列的数目划分:表级约束,列级约束。


二、修改数据表;

(1)针对字段的操作:添加/删除字段,修改列定义,修改列名称等。

(2)针对约束的操作:添加/删除各种约束。

(3)针对数据表的操作:数据表更名(两种方式)


mysql 插入记录insert


插入记录:

insert [into] 表名 [(col_name,...)]

{values | value} {{expr | default},...),(...),....}


例如:

mysql> create table user(

-> id smallint unsigned primary key auto_increment,

-> username varchar(20) not null,

-> password varchar(30) not null,

-> age tinyint unsigned not null default 10,

-> sex boolean

-> );

mysql> insert user values(null,'Tom','123',24,1);

mysql> insert user values(null,'join','456',25,1);

mysql> insert user values(default,'Tom','456',26,0);

mysql> insert user values(default,'join','123',2*8+3,0),(null,'jack','5678',default,0);


插入记录:

insert [into] 表名 set col_name={expr | default}...

例如:

mysql> insert user set username='jack',password='123.cn';

插入记录:

insert [into] 表名 [(col_name,...)] select ...


mysql单表更新update和删除记录delete

update

更新记录(单表更新)

update [low_priority] [ignore] table_reference set col_name1={expr1 | default} [,col_name2={expr2 | default}]... [where where_condition]

例如:

mysql> update user set age=age+5;

mysql> update user set age=age-id,sex=0;

mysql> update user set age=age+5 where id%2=0;


delete

删除记录(单表删除)

delete from 表名 [where 搜索条件]

例如:

mysql> delete from user where id=3;

mysql> insert user values(null,'111','456','30',null);


select

查找记录

select select_expr [.select_expr..]

[

from table_references

[where 条件表达式]

[group by {col_name | position} [asc | desc],...]

[having 条件表达式]

[order by {col_name | expr | position } [asc | desc],...]

[limit {[offset]row_count | row_count offset offset}]

]


查询表达式

查询表达式表示你想要的某一列,必须至少有一列

多个列之间用英文逗号分隔。

星号(*)表示所有列,tbl_name.*可以表示命名表的所有列


查询表达式可以使用[AS]alias_name为其赋予别名。

别名可以用于group by,order by 或having子句。


where

条件表达式:

对记录进行过滤,如果没有指定where子句,则显示所有记录。

在where表达式中,可以使用mysql支持的函数或运算符。


group by

查询结果分组

[group by {col_name | position} [asc | desc ],...]


例如:

mysql> select sex from user group by sex;


having

分组条件

[having 分组条件]


例如:

mysql> select age from user group by age having age>300;

mysql> select sex,age from user group by 1 having count(id)>=2;


order by

对查询结果进行排序

[order by {col_name | expr |position } [asc | desc],....]


例如:

mysql> insert user values(null,'123','234','30',1);

mysql> select * from user order by id asc;

mysql> select * from user order by age,id desc;


limit

限制查询结果返回的数量

[LIMIT {[offset,]row_count | row_count OFFSET offset}]


例如:

mysql> select * from user limit 2,2;

mysql> select * from user limit 3;

mysql> create table test(

-> id tinyint unsigned primary key auto_increment,

-> username varchar(20)

-> );

mysql> insert test(username) select username from user where age >=30;

mysql> select * from test;


mysql三种常见的子查询:

用any,some或all修饰的比较运算符:

operand comparison_operator any(subquery)

operand comparison_operator some(subquery)

operand comparison_operator all(subquery)


any,some,all关键字

运算符 any some all

>,>= 最小值 最小值 最大值

<,<= 最大值 最大值 最小值

= 任意值 任意值

<>,!= 任意值


例如:

mysql> select goods_id,goods_name,goods_price from tdb_goods where goods_price>any(select goods_price from tdb_goods where goods_cate='超级本');


使用[not] in的子查询

语法:

operand comparison_operator [not] in (subquery)

=any 运算符与in等效

!=all 或<>all运算与not in等效。


例如:

创建商品分类:

mysql> create table if not exists tdb_goods_cates(

-> cate_id smallint unsigned primary key auto_increment,

-> cate_name varchar(40) not null

-> );

mysql> select goods_cate from tdb_goods group by goods_cate;

将这个插入到tdb_goods_cates

mysql> desc tdb_goods_cates;

mysql> insert tdb_goods_cates(cate_name) select goods_cate from tdb_goods group by goods_cate;

mysql> select * from tdb_goods_cates;


mysql多表更新

多表更新

update table_references

set col_name1(列)={表达式1 | default}

[,col_name2={表达式2 | default}]..

[where where_condition]


表的参照关系:

table_reference

{[inner内 | cross] join | {left|right} [outer] join}

table_reference

on conditional_expr 表的连接条件


连接类型:

inner join,内连接

在mysql中,join,cross join和inner join是等价的。

left [outer] join,左外连接。

right [outer] join,右外连接。


例如:

mysql> update tdb_goods inner join tdb_goods_cates on goods_cate=cate_name set goods_cate=cate_id;

create...select

创建数据表同时将查询结果写入到数据表

create table [if not exists] 表名

[(create_definition,....)]

select_statement


例如:

mysql> select brand_name from tdb_goods group by brand_name;

mysql> create table tdb_goods_brands(

-> brand_id smallint unsigned primary key auto_increment,

-> brand_name varchar(40) not null

-> )

-> select brand_name from tdb_goods group by brand_name;


mysql> select * from tdb_goods_brands;

mysql> update tdb_goods AS a inner join tdb_goods_brands AS b on a.brand_name=b.brand_name set a.brand_name=b.brand_id;


mysql> desc tdb_goods\G;

需要修改字段名和字段类型:

mysql> alter table tdb_goods

-> change goods_cate cate_id smallint unsigned not null,

-> change brand_name brand_id smallint unsigned not null;


mysql> insert tdb_goods_cates(cate_name) values

-> ('路由器'),('交换机'),('网卡');

mysql> insert tdb_goods_brands(brand_name)values('海尔'),('清华同方'),('神舟');

mysql> insert tdb_goods(goods_name,cate_id,brand_id,goods_price)values('yuan 123.cn密码集合','13','4','1849');


mysql内连接inner join

子查询与连接:

连接

mysql的select语句,多表更新,多表删除语句中支持join操作。

语法结构;

table_reference

{[inner |cross] join | {left | right} [outer] join}

table_reference

on conditional_expr 连接条件。


数据表参照:

table_reference

表名 [[as] alias] | table_subquery [as] alias

数据表可以使用:表名 AS 别名 或表名 别名 赋予别名

table_subquery可以作为子查询使用在from子句中,这样的子查询必须为其赋予别名。


连接类型:

inner join, 内连接

在mysql中,join,cross join和inner join是等价的。

left [outer] join,左外连接。

right [outer] join,右外连接。


连接条件:

使用on关键字来设定连接条件,也可以使用where来代替。

通常使用on关键字来设定连接条件。

使用where关键字来进行结果集记录的过滤。

内连接

显示左表和右表符合连接条件的记录。

例如:

mysql> select goods_id,goods_name,cate_name from tdb_goods inner join tdb_goods_cates on tdb_goods.cate_id=tdb_goods_cates.cate_id;

mysql外连接outer join


左外连接

显示左表的全部记录及右表符合连接条件的记录


右外连接

显示右表的全部记录及左表符合连接条件的记录。


左外连接:

例如:

mysql> select goods_id,goods_name,cate_name from tdb_goods left join tdb_goods_cates on tdb_goods.cate_id=tdb_goods_cates.cate_id;


右外连接:

mysql> select goods_id,goods_name,cate_name from tdb_goods right join tdb_goods_cates on tdb_goods.cate_id=tdb_goods_cates.cate_id\G;


mysql多表连接:

例如:

mysql> select goods_id,goods_name,cate_name,brand_name,goods_price from tdb_goods AS a inner join tdb_goods_cates AS b ON a.cate_id=b.cate_id

-> inner join tdb_goods_brands AS c ON a.brand_id=c.brand_id\G;


外连接:

A LEFT JOIN B join_condition


数据表B的结果集依赖数据表A

数据表A的结果集根据左连接条件依赖所有数据表(B表除外)

左外连接条件决定如何检索数据表B(在没有指定where条件的情况下)

如果数据表A的某条记录符合where条件,但是在数据表B中不存在符合连接条件的记录,将生成一个所有列为空的额外的B行。

外连接:

如果使用内连接查找的记录在连接数据表中不存在,并且在where子句中尝试以下操作:col_name is null时,如果col_name被定义为not null, mysql将在找到符合连接条件的记录后停止搜索更多的行。


mysql无限级分类表设计:


无限级分类数据表的设计

例如:

mysql> create table tdb_goods_types(

-> type_id smallint unsigned primary key

-> auto_increment,

-> type_name varchar(20) not null,

-> parent_id smallint unsigned not null default 0);


parent_id 父类的ID。


mysql> select * from tdb_goods_types;

例如:

mysql> select s.type_id,s.type_name,p.type_name from tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id=p.type_id;


mysql> select p.type_id,p.type_name,s.type_name from tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id;


mysql> select p.type_id,p.type_name,s.type_name from tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id GROUP BY p.type_name;


mysql> select p.type_id,p.type_name,s.type_name from tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id GROUP BY p.type_name ORDER BY p.type_id;


mysql> select p.type_id,p.type_name,count(s.type_name) child_count from tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id GROUP BY p.type_name ORDER BY p.type_id;


mysql多表删除:

例如:

mysql> select goods_id,goods_name from tdb_goods group by goods_name;


mysql> select goods_id,goods_name from tdb_goods group by goods_name HAVING count(goods_name)>1;


mysql> DELETE t1 from tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name from tdb_goods GROUP BY goods_name HAVING count(goods_name)>1) AS t2 ON t1.goods_name=t2.goods_name WHERE t1.goods_id>t2.goods_id;


mysql> select * from tdb_goods\G


mysql字符函数:

运算符和函数

根据功能的不同可以划分为:

1、字符函数

2、数值运算符与函数

3、比较运算与函数

4、日期时间函数

5、信息函数

6、聚合函数

7、加密函数


字符函数:

函数名

CONCAT( ) : 字符连接

CONCAT_WS( ) : 使用指定分隔符进行字符连接。

FORMAT( ) : 数字格式化

LOWER( ) : 转换成小写字母

UPPER( ) : 转换成大写字母

LEFT( ) : 获取左侧字符。

RIGHT( ) : 获取右侧字符。


例如:

mysql> select * from test;

mysql> select concat('yuan','_','MYSQL');

mysql> select * from user;


将两个字段合并为一个字段。

mysql> select concat(username,age) as fullname from user;


mysql> select concat('dajiangtai','_','Mysql');


mysql> select concat_ws('@','a','b','c');

mysql> select format(12345.678,2);


mysql> select lower('ANXIAOYU');


mysql> select upper('anxiaoyu');

mysql> select left('DaJiangTai',3);


mysql> select lower(left('DaJiangTai',3));

mysql> select length('dajiangtai');


length() : 获取字符串长度。

ltrim() : 删除前导空格。

rtrim() : 删除后续空格。

trim() : 删除前导和后续空格。

substring() : 字符串截取。

[not] like : 模式匹配。

replace() : 字符串替换。


例如:

mysql> select ltrim(' dajiangtai ');

mysql> select length(ltrim(' dajiangtai '));


mysql> select trim(leading '@' from '@@@dajiangtai@@@@');

mysql> select trim(trailing '@' from '@@@dajiangtai@@@@');


mysql> select trim(both '@' from '@@@dajiangtai@@@@');

mysql> select replace('@@@dajiang@@tai@@@','@','');


mysql> select replace('@@@dajiang@@tai@@@','@','##');

mysql> select substring('dajiangtai',3,5);


mysql> select substring('dajiangtai',3);

mysql> select substring('dajiangtai',-3);


mysql> select 'dajiangtai' like 'd%';


mysql 数值运算符和函数


ceil() : 进一取整

div : 整数除法

floor() : 舍一取整

mod : 取余数(取模)

power() : 幂运算。

round() : 四舍五入

truncate() : 数字截取


例如:

mysql> select 1+2;

mysql> select ceil(3.14);


mysql> select floor(3.14);

mysql> select 1/2;


mysql> select 1 div 2;

mysql> select 4%3;


mysql> select 4 mod 3;

mysql> select 4.2 mod 3;


mysql> select power(2,3);

mysql> select round(3.1415,3);


mysql> select truncate(12.3456,2);

mysql> select truncate(12.3456,-1);


mysql比较运算符和函数


[not] between...and... : [不] 在范围之内

[not] in() : [不] 在列出值范围内。

is [not] null : [不]为空。


例如;

mysql> select 2 between 1 and 3;

mysql> select 1 between 2 and 3;


mysql> select 2 between 2 and 3;

mysql> select 1 in (1,2,3,4);


mysql> select null is null;

mysql> select '' is null;


mysql日期时间函数


日期时间函数:

now() : 当前日期和时间

curdate() : 当前日期

curtime() : 当前时间

date_add() : 日期变化。

datediff() : 日期差值。

date_format() :日期格式化。


例如:

mysql> select now();

mysql> select curdate();


mysql> select date_add('2015-1-1',interval 365 day);

mysql> select date_add('2015-1-1',interval -365 day);


mysql> select datediff('2015-1-2','2015-2-2');

mysql> select date_format('2015-5-5','%m/%d/%y');


mysql 信息函数


connection_id() : 连接ID

database() : 当前数据库

last_insert_id() : 最后插入记录的ID号。

user() : 当前用户

version() : 版本信息。


例如:

mysql> select connection_id();

mysql> select database();


mysql> create table test(

-> id tinyint(3) unsigned not null primary key auto_increment,

-> username varchar(20) not null);


mysql> select last_insert_id();

mysql> insert test(username) values('join');


mysql> insert test(username) values('111');

mysql> insert test(username) values('123');


mysql> insert test(username) values('11');

mysql> insert test(username) values('22'),('33');


mysql> select last_insert_id();

mysql> select user();


mysql> select version();


mysql 聚合函数:

avg() : 平均值

count() : 计数。

max() :最大值。

min() : 最小值。

sum() : 求和。


例如:

mysql> select avg(id) from test;

mysql> select count(id) from test;


mysql 加密函数:

MD5() : 信息摘要算法

PASSWORD() : 密码算法


例如:

mysql> select md5('admin');

mysql> select PASSWORD('admin');

mysql> set PASSWORD=PASSWORD('root');


mysql自定义函数:

用户自定义函数(UDF) 是一种对mysql扩展的途径,其用法与内置函数相同。

自定义函数的两个必要条件:

(1), 参数

(2), 返回值。


函数可以返回任意类型的值,同样可以接收这些类型的参数。


创建自定义函数:

create function function_name

returns

{string | integer | real | decimal}

routine_body


关于函数体:

(1) 函数体由合法的SQL语句构成。

(2) 函数体可以是简单的select或insert语句。

(3) 函数体如果为复合结构则使用begin....end语句。

(4) 复合结构可以包含声明,循环,控制语句。


设置客户端编码为gbk :

mysql> set names gbk;

mysql> select date_format(now(),'%Y年%m月%d日 %H点: %i分: %s秒');


mysql> create function f1()

-> returns varchar(30)

-> return date_format(now(),'%Y年%m月%d日 %H点: %i分: %s秒');


mysql> CREATE FUNCTION Q1(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)

-> RETURNS FLOAT(10,2) UNSIGNED

-> RETURN (num1*num2)/2;

mysql> select Q1(3,4);


mysql> create function adduser(username VARCHAR(20))

-> RETURNS INT UNSIGNED

-> BEGIN

-> INSERT test(username) values(username);

-> RETURN LAST_INSERT_ID();

-> END

-> //

mysql> select adduser('hello');

-> //


删除函数:

DROP FUNCTION [IF EXISTS] function_name


mysql存储过程:

SQL命令----> mysql引擎---》语法分析----》 可执行命令---》执行结果----》 客户端。


存储过程:

存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。


存储过程优点:

增强了SQL语句的功能和灵活性。

实现较快的执行速度。

减少网络流量。


创建存储过程的语法:

create

[DEFINER={USER | CURRENT_USER}]

PROCEDURE sp_name ([proc_parameter[,...]])

[characteristic ...] routine_body


proc_parameter:

[IN | OUT | INOUT ] param_name type

参数:

IN : 表示该参数的值必须在调用存储过程中指定。

OUT : 表示该参数的值可以被存储过程改变,并且可以返回。

INOUT : 表示该参数在调用时指定,并且可以被改变和返回。


过程体:

过程体由合法的SQL语句构成。

过程体可以是"任意"的SQL语句。

过程体如果为复合结构则使用BEGIN...END语句。

复合结构可以包含声明,循环,控制结构。

例如:

mysql> create procedure sp1() select VERSION();

mysql> CALL sp1;


调用存储过程:

CALL sp_name([parameter[,...]])

CALL sp_name[( )]


mysql创建带有IN类型参数的存储过程:


例如:

mysql> delimiter //

mysql>

mysql> create procedure removeTestByid(IN id INT unsigned)

-> BEGIN

-> DELETE FROM test where id=id;

-> END

-> //


修改存储过程:

alter procedure sp_name

[characteristic ...]

COMMENT 'string'

| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL

DATA}

| SQL SECURITY {DEFINER | INVOKER}


删除存储过程:

drop procedure 名字;

例如:

mysql> insert user(username,password,age,sex) values('Tom1','123',21,1),('Tom2',

'1234',22,1);


mysql> insert user(username,password,age,sex) values('Tom3','123',30,1),('Tom4',

'1234',30,1);


mysql> insert user(username,password,age,sex) values('Tom5','12',20,1),('Tom6','

1234',32,1);


mysql> delimiter //

mysql> create procedure removeUserByid(IN p_id INT UNSIGNED)

-> BEGIN

-> DELETE FROM user where id=p_id;

-> END

-> //


mysql> delimiter ;

mysql> CALL removeUserByid(2);

mysql> SELECT * FROM user where id=2;

看了以上关于mysql 语法结构讲义,希望能给大家在实际运用中带来一定的帮助。本文由于篇幅有限,难免会有不足和需要补充的地方,如有需要更加专业的解答,可在官网联系我们的24小时售前售后,随时帮您解答问题的。




0