PHP的学习与MYSQL高级

PHP

php注释的应用

注释即代码的解释和说明,注释部分会被解释器忽略不计

<?php
    /*
        多行文本注释
    */
?>
<?php
    //单行文本注释
?>

php程序初体验

每一行php代码的结尾必须加上英文的分号

打印输出 只能输出 字符 数值 字符串是用引号(英文的单引号 和双引号 )包裹起来的内容

<?php
    header("content-type:text/html;charset=utf-8");//设置页面编码为utf-8
    echo "hello world"; //输出文本内容hello world
    
    echo 123; //输出数字123
    
    echo "<br>"; //强制换行
    
    echo "<h1>标题</h1>"; //输出标题
    
    echo "<hr>"; //输出横线
?>

变量

变量就是一个数据容器 你把什么样的数据放入到容器中 那么这个容器就是哪个数据

变量的声明和初始化

以 $ 开头(坊间戏言,PHP 程序员是有多穷,才要求变量名以货币符号开头);

$变量名 = 变量值

变量的命名规则和规范: 1.变量名最好是使用数字字母和下划线来构成 2.数字不能开头 3.尽量不要使用中文 4.严格区分大小写

<?php
    header("content-type:text/html;charset=utf-8");//设置页面编码为utf-8
    
    $name="张三";
    echo $name;
    
    echo "<hr>";
    
    $姓名 = ”李四";
    echo $姓名;
    
    echo "<hr>";
    
    $a = 123;
    $A = 456;
    echo $a;
    echo "<br>";
    echo $A;
    
    echo "<hr>";
    
    $text = "文章内容文章内容文章内容文章内容文章内容文章内文章内容文章内容文章内容文章内容文章内容文章内容文章内容";
    echo $text;
    
    echo "<hr>";
    
    $content = "王五";
    echo $content;
    echo $content;
    echo $content;
    $content = "赵四";
    echo $content;

常量

常量可以理解为值不变的量,常量值被定义后,在脚本的其他地方都不可以更改

常量名不需要 $ 前缀(也不能设置),并且为了和变量做区分,通常都是以大写字母进行命名(同样大小写敏感),此外,常量名的命名规则除了不需要 $ 前缀之外,其他和变量名一样,只支持字母、数字、下划线,并且不能以数字开头。

通过define函数来定义常量

<?php
    define("LANGUAGE","PHP");
    define("SCHOOL","光明小学");
    echo LANGUAGE;
    echo SCHOOL;

数据类型

php支持8种数据类型:

4种标量类型:boolean(布尔型)、integer(整型)、float/double(浮点型)、string(字符串型)

2种复合类型:array(数组)、object(对象)

2种特殊类型:resource(资源)、null

类型说明
boolean(布尔型)这是最简单的类型。只有两个值,真(true)、假(false)
integer(整型)整型数据类型只能包含整数。这些数据类型可以是正数或负数
float/double(浮点型)浮点数据类型用于存储数字,和整型不同的是它有小数位
string(字符串型)字符串就是连续的字符序列,可以是计算机所能表示的一切字符的集合

在 PHP 中,字符串可以通过单引号或者双引号定义,用字符串类型的变量表示【mysql高级】这门课

$course = "mysql高级";
echo $course;

字符串类型判断

要判断变量数据类型是否是字符串,可以借助 is_string 函数:

if (is_string($course)) {
    echo '$course 是字符串';
}
exit;

我们这里使用了 if 语句对变量是否是字符串类型进行判断(关于 if 语句后面会介绍),最后通过 exit手动退出程序。

单引号与双引号的区别

通过上述代码还可以看到单引号字符串中引用变量不会对变量值进行解析,如果是双引号,则会对引用变量值进行解析:

if (is_string($course)) {
    echo "\"$course\" 是字符串";
}
if (is_string($course)) {
    echo "'$course' 也是字符串";
}

此外,由于我们在双引号字符串中引入了双引号,所以需要通过转义符 \ 对其进行转转义才能正常输出,双引号字符串中引用单引号则不需要转义;

由于双引号字符串会尝试对其中包含的 PHP 变量进行值解析,所以性能比单引号字符串差一些,因此日常可以用单引号字符串的地方,尽量用单引号字符串,除非某些场景必须使用双引号字符串,比如像上面那样包含转义字符(以 \ 开头的字符,比如 \n`、`\"`、`\t` 等)或者包含单引号,单引号字符串不支持转义字符(`\'除外),这一点需要注意。

当然,对于单引号字符串也可以实现类似上面双引号字符串的功能,只是编写起代码来更麻烦一些,可读性更差一些

if (is_string($course)) {
    echo '\"$course\" 是字符串';
}

字符串:使用引号引起来的内容都是字符串

var_dump() 是一个函数 可以在打印数据的同时 输出数据的类型

$a = '123';
var_dump($a);

数组

数组分为索引数组和关联数组

索引数组

所谓索引数组指的是数组的键为隐式数字,并且会自动维护,就像静态语言的数组一样。

php索引数组的索引值和其他语言一样,都是从0开始。

$courses = array('php','html','mysql');
print_r($courses);
​
$nums = [1,2,4,5];
print_r($nums);

除了像上述代码那样通过指定初始值进行数组初始化,还可以初始化一个空数组,在 PHP 中,初始化空数组时不必指定数组大小,也不必指定数据类型:

$fruits = [];

然后我们可以依次往数组中追加元素:

$fruits[] = 'Apple';
$fruits[] = 'Orange';
$fruits[] = 'banana';

我们可以通过 count 函数获取数组长度。

$len = count($fruits);

如果要获取指定索引对应的元素值,可以通过如下这种方式:

$fruit = $fruits[0];

要更新指定索引位置对应的元素值,可以通过如下方式:

$fruits[2] = 'Banana';

要删除指定索引位置对应的元素值,可以通过 unset 函数:

unset($fruits[1]);

关联数组

与索引数组不同,关联数组通常需要显式指定数组元素的键

$student = [
    'name'=>'张三',
    'age' => 14,
    'sex' => '男'
]
$student = array(
    'name'=>'张三',
    'age' => 14,
    'sex' => '男'
)

此时的键就不再是连续数字,而是初始化时设置的键名了

$student = [];

然后通过指定键值对来新增元素

$student['name'] = '李四';
$student['age'] = 18;
$student['sex'] = '男';

要获取某个元素值,比索引数组更加方便,因为可以直接通过可读性更强的键名来获取对应元素值:

$name = $student['name'];

要更新某个元素值,也可以通过指定键名来修改:

$student['age'] = 19;

要删除某个数组元素值,依然可以通过 unset 函数:

unset($student['sex']);

运算符

算术运算符

算术运算符包含加(+)、减(-)、乘(*)、除(/)、求余(%)

$a=10;
$b=2;
echo $a+$b;
echo '<br>';
echo $a-$b;
echo '<br>';
echo $a*$b;
echo '<br>';
echo $a/$b;
echo '<br>';
echo $a%$b;
​
echo $b%$a;

比较运算符

所以比较运算符指的是对变量值大小进行比较,通常也是数值间的比较。

比较运算符包括:大于(>)、小于(<)、小于等于(<=)、大于(>=)、等于(==)、不等(!=)、恒等(===)、非恒等(!==)

恒等于不只是数值上相等,而且两者的类型也一样

非恒等说明数值不等或者类型不等

自增/自减运算符

// $a=1;
// echo ++$a 是先加1再输出
// echo $a++ 是先输出$a原来的值,再加1
// echo $a;
// $a = $a+3 等价于 $a+=3
// ++$a 等价于$a+=1
​
$a=1;
echo ++$a;
echo $a;
    
echo $a++;
echo $a;
    
echo $a+=3;
echo $a;
​
// echo --$b 是先减1再输出
// echo $b-- 是先输出$b原来的值,再减1
// $b = $b-3 等价于 $b-=3
// --$b 等价于$b-=1
​
$b = 10;
echo --$b;
echo $b;
​
echo $b--;
echo $b;
​
echo $b-=3;
echo $b;

逻辑运算符

所谓逻辑运算就是与(AND或&&)、或(OR或者||)、非(NOT或!)、异或(XOR)运算,这些也是和高中数学课本中介绍的逻辑运算是一个概念

异或:当值为一真一假时返回真

控制结构

单分支结构

所谓单分支就是指存在一个条件判断和选择:

 
$score = 80;
if($score>=80 && $score<=90){
    echo '优秀';
}

双分支结构

为了处理 if 条件未命中的情况,我们可以引入一个 else 语句处理其他业务逻辑,这种满足 if 条件执行对应业务逻辑,不满足 if 条件,执行 else 设定业务逻辑的代码模式,称之为双分支结构:

$score = 70;
if($score>=80 && $score<=90){
    echo '优秀';
}else{
    echo '合格';
}

多分支结构

这种处理方式虽然可以获取一些明确的信息了,比如成绩数据,但是等级信息不明朗,只是一个粗略的「其他等级」,要在 if 条件不成立的情况下获取明确的等级信息,就需要引入多个 else if 语句增加更多的其他条件判断,最后以一个 else 语句作为兜底(默认分支),这种代码选择结构模式称之为多分支结构:

$score = 60;
if ($score >= 90) {
    echo '优秀';
} else if ($score >= 80 && $score < 90) {
    echo '良好';
} else if ($score >= 60 && $score < 80) {
    echo '合格';
} else if ($score < 60) {
    echo '差';
} else {
    echo '没有成绩';
}
​
$score = 60;
if ($score >= 90) {
    echo '优秀';
} else if ($score >= 80) {
    echo '良好';
} else if ($score >= 60) {
    echo '合格';
} else if ($score < 60) {
    echo '差';
} else {
    echo '没有成绩';
}

循环结构

所谓循环结构指的是当符合循环条件时,则循环执行循环体中的代码:

循环结构的实现一般有 while、do...while、for 循环三种,最终实现的功能一致,只是三者在循环条件的设置上各自不同罢了。

while

要通过 while 循环打印成绩信息,可以这样编写实现代码:

$score = [70,90,60,76];
$num = count($score);
$i=1;
while($i<=$num){
    echo "第 $i 个学生的成绩信息:";
    echo $score[$i-1];
    echo "<br>";
    $i++;
}

在这段代码中,首先获取数据总量 $num,然后设置一个迭代变量 $i,每次打印一个学生信息后将迭代变量 +1,直到迭代变量的值超过数据总量,则循环结束。

do...while

还可以通过 do...while 循环编写上述代码:

$score = [70,90,60,76];
$num = count($score);
$i=1;
do{
    echo "第 $i 个学生的成绩信息:";
    echo $score[$i-1];
    echo "<br>";
    $i++;
}while($i<=$num);

打印结果和 while 循环一致,由于 do...while 循环条件设置在 do 语句块之后,所以存在不管循环条件是否满足,始终执行一次循环体的情况,因此在日常编码中,并不常见。

for

最常见的当属 for 循环了,这种循环语句足够灵活,可读性也更好,我们先通过 for 循环重构上述循环代码

$score = [70,90,60,76];
$num = count($score);
for($i=1;$i<=$num;$i++){
    echo "第 $i 个学生的成绩信息:";
    echo $score[$i-1];
    echo "<br>";
}

foreach

在 PHP 中,对于数组循环遍历,尤其是关联数组遍历,还提供了另一个更加强大简单的语言结构 —— foreach,通过 foreach 语句,可以更方便地获取键值信息

$score = [70,90,60,76];
foreach($score as $key=>$val){
    echo "第 $key 个学生的成绩信息:";
    echo $val;
    echo "<br>";
}

其中 $data 表示待遍历的数组(或者实现 ArrayAccess 接口的类),$key 表示数组的键,$val 表示对应的键值,无需设置迭代变量、循环终止条件,遍历完成后,会自动退出循环

$student = [
    'name'=>'张三',
    'age' => 14,
    'sex' => '男'
];
foreach($student as $val){
    echo $val;
    echo "\n";
}
$student = [
    'name'=>'张三',
    'age' => 14,
    'sex' => '男'
];
foreach($student as $key=>$val){
    echo "$key\n:\n$val";
    echo '<br>';
}
 

php mysql数据库操作

连接数据库

mysql_connect('数据库服务器','登录数据库服务器的账号','登录数据库服务器的密码’)
// 数据库服务器:localhost 或 127.0.0.1
// 登录数据库服务器的账号:root
//登录数据库服务器的账号:root

选择数据库

mysql_select_db() 函数设置活动的 MySQL 数据库。

如果成功,则该函数返回 true。如果失败,则返回 false。

mysql_select_db(数据库名称,数据库连接)

执行Sql

mysql_query() 函数执行一条 MySQL 查询。

如果没有打开的连接,本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。

mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。

对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。

非 FALSE 的返回值意味着查询是合法的并能够被服务器执行。这并不说明任何有关影响到的或返回的行数。很有可能一条查询执行成功了但并未影响到或并未返回任何行。

mysql_query(sql语句,数据库连接);

mysql_fetch_array() 函数

mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有

MYSQL_ASSOC - 关联数组 MYSQL_NUM - 数字数组 MYSQL_BOTH - 默认。同时产生关联和数字数组

返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。

header("Content-Type:text/html;charset=utf-8");
 
#连接数据库
 
$conn=@mysql_connect('localhost','root','root') or die('连接数据库失败~');
​
#选择数据库 
 
mysql_select_db('db_school') or die('选择数据库失败~');
​
#设置中文的字符集
 
mysql_query('set names "utf8"');
$sql = "SELECT * from tb_student";
$result = mysql_query($sql,$conn);
print_r(mysql_fetch_array($result));
//print_r(mysql_fetch_array($result,MYSQL_ASSOC ));
//print_r(mysql_fetch_array($result,MYSQL_NUM ));
​
mysql_close($conn); //关闭数据库连接
mysql_fetch_array(查询结果集,MYSQL_NUM) 等价于 mysql_fetch_row(查询结果集) 返回结果为数字数组
​
mysql_fetch_array(查询结果集,MYSQL_ASSOC) 等价于 mysql_fetch_assoc(查询结果集) 返回结果为关联数组

mysql_num_rows() 函数

获取查询到的数据条数

mysql_affected_rows() 函数

mysql_affected_rows() 函数返回前一次 MySQL 操作所影响的记录行数。

取得最近一次与 link_identifier 关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数。

执行成功,则返回受影响的行的数目,如果最近一次查询失败的话,函数返回 -1。

如果最近一次操作是没有任何条件(WHERE)的 DELETE 查询,在表中所有的记录都会被删除,但本函数返回值在 4.1.2 版之前都为 0。

当使用 UPDATE 查询,MySQL 不会将原值与新值一样的列更新。这样使得 mysql_affected_rows() 函数返回值不一定就是查询条件所符合的记录数,只有真正被修改的记录数才会被返回。

REPLACE 语句首先删除具有相同主键的记录,然后插入一个新记录。该函数返回的是被删除的记录数加上被插入的记录数。

$sql = 'delete from tb_student whre studentno=1';
mysql_query($sql,$conn);
$num = mysql_affected_rows();
echo $num;
mysql_close($con);

mysql 事件

事件的概念

事件是基于特定时间周期来执行某些任务

事件是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”

通俗讲事件和mysql触发器类似 表示在某一时刻(具体的某一时刻 用时间来表示)或者在某一个时间段内 一次或多次的执行一段sql程序

优缺点

1)优点

一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。 可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。

2)缺点

定时触发,不可以程序调用

查看事件

1)查看事件是否被开启

show variables like 'event_scheduler'


select @@event_scheduler

2)设置事件开启

set global event_scheduler = 1;

set global event_scheduler = true;

set global event_scheduler = On

修改my.ini文件,在其中加上EVENT_SCHEDULER = 1

创建事件

事件可以通过createa event语句来创建,其语法格式为:

CREATE EVENT [if not exists] event_name(事件名) ON SCHEDULE schedule [ENABLE | DISABLE |DISABLE ON SLAVE]
DO event_body(事件主体)
​
其中schedule的语法格式为
AT <时间戳> [ + interval <间隔>] ....
或者
EVERY <间隔> [starts <时间戳> [+interval <间隔>]....] [ENDS <时间戳> [+ interval <间隔>]]
​
interval的语法格式为
 
quantity { YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND }

event_name:指定的事件名,前面可以添加关键字IF NOT EXISTS 来修饰

<事件主体>:DO子句中的<事件主体>部分用于指定事件启动时所要求执行的代码。如果包含多条语句,可以使用BEGIN ....END 符合结构

schedule:事件调度,用于指定事件何时发生或者每隔多久发生一次,分别对应下面两个子句

(1)AT 子句:用于指定事件在某个时刻发生。其中,timestamp表示一个具体的时间点,后面可以加上一个时间间隔,表示在这个时间间隔后事件发生;interval表示这个时间间隔,由一个数值和单位构成;quantity是间隔时间的数值。

(2)EVERY子句:用于表示事件在指定时间区间内每间隔多长时间发生一次。其中,STARTS 子句用于指定开始时间,ENDS子句用于指定结束时间

event_body:Do子句中的event_body部分用于指定事件启动时所要求执行的代码。如果包含多条语句,可以使用begin....end复合结构

enable | disable | disable on slave:为可选项,表示事件的一种属性。其中,关键字enable表示该事件是活动的,活动意味着调度器检查事件动作是否必须调用;

关键字disable表示该事件是关闭的,关闭意味着事件的声明存储到目录中,但是调度器不会检查它是否应该调用

关键字disable on slave表示事件在从机中是关闭的。

子句说明
DEFINER可选,用于定义事件执行时检查权限的用户
IF NOT EXISTS可选项,用于判断要创建的事件是否存在
EVENT event_name必选,用于指定事件名,event_name的最大长度为64个字符,如果为指定event_name,则默认为当前的MySQL用户名(不区分大小写)
ON SCHEDULE schedule必选,用于定义执行的时间和时间间隔
ON COMPLETION [NOT] PRESERVE

可选,用于定义事件是否循环执行,即是一次执行还是永久执行,默认为一次执行,

即 NOT PRESERVE

ENABLE | DISABLE | DISABLE ON SLAVE可选项,用于指定事件的一种属性。其中,关键字ENABLE表示该事件是活动的,也就是调度器检查事件是否必选调用;关键字DISABLE表示该事件是关闭的,也就是事件的声明存储到目录中,但是调度器不会检查它是否应该调用;关键字DISABLE ON SLAVE表示事件在从机中是关闭的。如果不指定这三个选择中的任意一个,则在一个事件创建之后,它立即变为活动的。
COMMENT 'comment'可选,用于定义事件的注释
DO event_body

必选,用于指定事件启动时所要执行的代码。可以是任何有效的SQL语句、存储过程或者一个计划执行的事件。如果包含多条语句,可以使用BEGIN...END复合结构

创建事件,5秒钟后开始,每10秒钟执行一次,1分钟后结束
 
mysql> delimiter $$
mysql> create event if not exists event_insert
    -> on schedule every 10 second
    -> starts current_timestamp + interval 5 second
    -> ends current_timestamp + interval 1 minute
    -> do
    -> begin
    -> INSERT INTO tb_student VALUES(NULL,'张晓勇','男','1997-12-11','山西','汉','AC1301');
    -> end $$
mysql> delimiter ;
​
创建事件,10秒钟后执行
 
mysql> delimiter $$
mysql> create event if not exists event_insert_2
    -> on schedule at current_timestamp + interval 10 second
    -> do
    -> begin
    -> INSERT INTO tb_student VALUES(NULL,'张晓勇','男','1997-12-11','山西','汉','AC1301');
    -> end $$
mysql> delimiter ; 

查看事件

select * from mysql.event

修改事件

事件被创建后可以通过alter event 语句来修改其定义和相关属性

语法格式:

ALTER 
    EVENT <事件名>
    [ON hu schedule]
    [RENAME TO <新事件名>]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [DO <事件主体>]
alter event event_insert disable;
alter event event_insert rename to e_insert;
​
开启事件

alter event event_insert_2 enable; 
​
关闭事件
 
alter event event_insert disable;

删除事件

语法格式:

DROP EVENT [IF EXISTS] event_name
 

例如
drop event if exists event_insert;

存储过程与存储函数

存储过程

存储过程:一组为了完成特定功能的sql语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程中带有参数)来调用执行它。

优点:

封装性:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的sql语句,并且数据库专业人员可以随时对存储过程进行修改,而不会影响到调用它的应用程序源代码。

可增强sql语句的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

可减少网络流量:由于存储过程是在服务器端运行,且执行速度快,那么当客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而可降低网络负载。

高性能:存储过程执行一次后,产生的二进制代码就驻留在缓冲区,在以后的调用中,只需要从缓冲区中执行二进制代码即可,从而提高了系统的效率和性能。

提高数据库的安全性和数据的完整性,使用存储过程可以完成所有数据库操作,并可通过编程方式控制数据库信息访问的权限。

创建存储过程

语法格式

create procedure <过程名>([过程参数.....]) <过程体>
​
[过程参数]格式
[in | out | inout]<参数名><类型>

<过程名>:存储过程的名称,默认在当前数据库中创建。需要在特定数据库中创建存储过程时,则要在名称前面加上数据库的名称,即db_name,sp_name.

[过程参数.....]:mysql存储过程支持三种类型的参数,即输入参数,输出参数和输入/输出参数,分别用in 、out和inout三个关键字标识。其中,输入参数可以传递给一个存储过程;输出参数用于存储过程需要返回一个操作结果的情形;而输入/输出参数既可以充当输入参数也可以充当输出参数。

注意:参数的取名不要与数据表的列名相同,尽管不会返回出错信息,但是存储过程中的sql语句会将参数名看作是列名,从而引发不可预知的结果

<过程体>:存储过程的主体部分,也称为存储过程体,包含了在过程调用的时候必须执行的sql语句。这个部分以关键字begin开始,以关键字end结束。若存储过程体重只有一条sql语句,可以省略 begin .... end标志。

定界符

语法格式:

DELIMITER $$

注意:

$$是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“?”或两个"¥"

当使用DELIMITER命令时,应该避免使用反斜杠“\”字符,因为它是mysql的转义字符

mysql> delimiter $$
mysql> create procedure up_name(in sno int,in sname varchar(6))
    -> begin
    -> update tb_student set name=sname where studentno = sno;
    -> end $$
mysql> delimiter ;
​
 
调用存储过程
 
mysql> call up_name(2147483647,'王五');
​
update tb_student set name='王五' where studentno = 2147483647;

存储过程体

局部变量

在存储过程体中可以声明局部变量,用来存放产生的临时结果。

注意:局部变量,与全局变量相对应,在局部范围内有效的变量。

语法格式

declare <变量名> [,.....] <类型> [default <默认值>]

<变量名>:指定的局部变量的名称,

注意:不要和mysql的关键字、保留字、列名重复

<类型>:指定局部变量的数据类型

default子句:用于为局部变量指定一个默认值,默认为null

declare xname varchar(5) default '李明';

注意:

局部变量只能在存储过程体begin ......end语句中声明

局部变量作用范围只是在begin ...end之间

局部变量必须在存储过程体开头处声明

局部变量和用户变量的不同之处在于:局部变量声明时没有使用@符号,并且只能在begin....end范围内使用;用户变量在声明时,需要使用@符,已经声明的用户变量存在于整个会话中。

set语句

变量声明后,可以使用set语句为局部变量赋值

语法格式

set <变量名> = <表达式1> ......
set xname = '王杰'

select .... into语句

可以使用select ... into语句把选定列的值直接存储到局部变量中,存储过程体中的select ... into只能返回一行数据

语法格式

select <列名>  into <变量名> [.....] <其它>
mysql> delimiter $$
mysql> create procedure select_name(in sno int,out sname varchar(6))
    -> begin
    -> select name into sname from tb_student where studentno=sno;
    -> end $$
mysql> delimiter ;
mysql> call select_name(2013110101,@str);
mysql> select @str;
+--------+
| @str   |
+--------+
| 王小飞 |
+--------+
1 row in set

流程控制语句

1)IF ~ THEN ~ELSE

语法格式:

if <判断语句> then <语句>
[elseif <判断语句> then <语句>]
[else <语句>]
end if
mysql> delimiter $$
mysql> create procedure select_sex(in sno int)
    -> begin
    -> declare stu_sex char(2);
    -> select sex into stu_sex from tb_student where studentno=sno;
    -> if stu_sex='男' then
    -> select stu_sex,1;
    -> elseif stu_sex='女' then
    -> select stu_sex,2;
    -> end if;
    -> end$$
mysql> delimiter ;

2)case

case <参数>
when <参数> then <语句>
[when <参数> then <语句>]
[else 语句]
end case
mysql> delimiter $$
mysql> create procedure sel_sex(in sno int)
    -> begin
    -> declare stu_sex char(2);
    -> select sex into stu_sex from tb_student where studentno=sno;
    -> case
    -> when stu_sex='男' then select stu_sex,'1';
    -> when stu_sex='女' then select stu_sex,'2';
    -> else
    -> select stu_sex;
    -> end case;
    -> end $$
mysql> delimiter ;

游标

select ...into 语句成功执行后,会返回带有值的一行数据,这行数据可以被读取到存储过程中进行处理。但是在使用select 语句进行数据检索时,若该语句成功被执行,则会返回一组称为结果集的数据行,该结果集中可能有多行数据,这些数据无法直接被一行一行地进行处理,此时就需要用到游标;

定义:

游标是一个被select语句检索出来的结果集,在存储了游标后,应用程序或用户就可以根据需要滚动或浏览其中的数据。

注意:

游标只能用于存储过程或存储函数中,不能单独在查询操作中使用;

在存储过程或存储函数中可以定义多个游标,但是在一个begin....end语句块中每一个游标的名字必须是唯一的

游标不是一条select语句,是被select语句检索出来的结果集

mysql对游标的支持是从mysql5.0开始的,之前的mysql版本无法使用游标

语法格式:

declare <游标名> cursor for <select 语句>

打开游标

open <游标名>:指定要打开的游标

读取数据

fetch <游标名> into <变量名>......[变量2]

关闭游标

close <游标名>

在结束游标使用后,必须关闭游标。

 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海屿鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值