目录
一、子查询
子查询也被称作内查询或者嵌套查询
是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。
子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。
select name,score from info where id in (select id from info where score >80);
以上同表示例:
主语句:select name,score from info where id
子语句(集合): select id from info where score >80
1.1语法
语法:
<表达式> [NOT] IN <子查询>
<表达式> IN <子查询>
当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE。
若启用了 NOT 关键字,则返回值相反。
需要注意的是,子查询只能返回一列数据,如果需 求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。 多数情况下,子查询都是与 SELECT 语句一起使用的
1.2select
#查询分数大于80的记录
mysql> select name,score from info3 where id in (select id info3 where score>80);
+-----------+-------+
| name | score |
+-----------+-------+
| jiangshou | 88.00 |
| lisi | 83.00 |
| tianqi | 92.00 |
| wangwu | 99.00 |
+-----------+-------+
4 rows in set (0.00 sec)
1.3insert
子查询的结果集可以通过 INSERT 语句插入到其 他的表中,将t1里的记录全部删除,重新插入info表的记录
mysql> insert into t1 select * from info where id in (select id from info);
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+----+-----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+-----------+-------+----------+-------+
| 1 | shidapeng | 90.00 | nanjing | NULL |
| 2 | shangzhen | 80.00 | beijing | NULL |
| 3 | tangyan | 98.00 | shanghai | NULL |
| 6 | chengu | 88.00 | nanjing | NULL |
| 7 | caicai | 70.00 | hangzhou | NULL |
| 8 | zhaokun | 80.00 | hangzhou | NULL |
| 9 | xiawenjie | 80.00 | hangzhou | NULL |
+----+-----------+-------+----------+-------+
7 rows in set (0.00 sec)
1.3update
UPDATE 内的子查询,在 set 更新内容时,可以是单独的一列,也可以是多列。
mysql> update info3 set score=100 where id in (select * from info4 where id>1);
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from info3;
+------+-----------+--------+------------+--------+
| id | name | score | address | hobbid |
+------+-----------+--------+------------+--------+
| 5 | hanmei | 100.00 | nanjing | 3 |
| 7 | jixiaoman | 100.00 | guizhou | 5 |
| 6 | lilei | 100.00 | kunshan | 3 |
| 3 | lisi | 100.00 | shandong | 4 |
| 1 | luiyi | 100.00 | beijing | 2 |
| 4 | tangsan | 100.00 | laowo | 5 |
| 2 | wangwu | 100.00 | shengzheng | 2 |
+------+-----------+--------+------------+--------+
7 rows in set (0.00 sec)
mysql> update info3 set score=101 where id not in (select * fromm info4 where id>1);
Query OK, 5 rows affected (0.00 sec)
Rows matched: 5 Changed: 5 Warnings: 0
mysql> select * from info3;
+------+-----------+--------+------------+--------+
| id | name | score | address | hobbid |
+------+-----------+--------+------------+--------+
| 5 | hanmei | 101.00 | nanjing | 3 |
| 7 | jixiaoman | 101.00 | guizhou | 5 |
| 6 | lilei | 101.00 | kunshan | 3 |
| 3 | lisi | 100.00 | shandong | 4 |
| 1 | luiyi | 101.00 | beijing | 2 |
| 4 | tangsan | 101.00 | laowo | 5 |
| 2 | wangwu | 100.00 | shengzheng | 2 |
+------+-----------+--------+------------+--------+
7 rows in set (0.00 sec)
1.4delete
在 IN 前面还可以添加 NOT,其作用与IN相反,表示否定(即不在子查询的结果集里面)
删除分数不是大于等于80的记录
mysql> delete from t1 where id not in (select id where score>=80);
Query OK, 1 row affected (0.00 sec)
mysql> select id,name,score from t1;
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 2 | shangzhen | 80.00 |
| 8 | zhaokun | 80.00 |
| 9 | xiawenjie | 80.00 |
+----+-----------+-------+
3 rows in set (0.00 sec)
1.5 exists
EXISTS 这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空, 则返回 TRUE;反之,则返回 FALSE。
#查询如果存在分数等于80的记录则计算info的字段数
mysql> select * from info3 where exists(select id from info3 where ere score=80);
+------+-----------+-------+----------+--------+
| id | name | score | address | hobbid |
+------+-----------+-------+----------+--------+
| 6 | husan | 23.00 | nanjing | 3 |
| 5 | jiangshou | 88.00 | laowo | 3 |
| 3 | lisi | 60.00 | shenzhen | 4 |
| 7 | liulei | 18.00 | nanjing | 5 |
| 1 | liuyi | 80.00 | beijing | 2 |
| 4 | tianqi | 92.00 | hangzhou | 5 |
| 2 | wangwu | 99.00 | shanghai | 2 |
+------+-----------+-------+----------+--------+
7 rows in set (0.00 sec)
mysql> select count(*) from info3 where exists (select id from innfo3 where score=80);
+----------+
| count(*) |
+----------+
| 7 |
+----------+
1 row in set (0.00 sec)
1.6别名as
#将结果集做为一张表进行查询的时候,我们也需要用到别名,示例: 需求:从info表中的id和name字段的内容做为"内容" 输出id的部分 mysql> select id from (select id,name from info); ERROR 1248 (42000): Every derived table must have its own alias #此时会报错,原因为: select * from 表名 此为标准格式,而以上的查询语句,"表名"的位置其实是一个完整结果集,mysql并不能直接识别,而此时给与结果集设置一个别名,以”select a.id from a“的方式查询将此结果集视为一张"表",就可以正常查询数据了,
mysql> select a.id from (select id,name from info3) a;
+------+
| id |
+------+
| 6 |
| 5 |
| 3 |
| 7 |
| 1 |
| 4 |
| 2 |
+------+
7 rows in set (0.00 sec)
二、MySQL视图
2.1功能
简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性 本质而言视图是一种select(结果集的呈现)
2.2区别
①、视图是已经编译好的sql语句。而表不是
②、视图没有实际的物理记录。而表有。 show table status\G
③、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
④、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
⑤、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
⑥、视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的
2.3联系
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
2.4 创建视图(单表)
mysql> create view v_sore as select * from info3 where score>=80;
Query OK, 0 rows affected (0.00 sec)
mysql> desc v_sore;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(20) | YES | | NULL | |
| hobbid | int(5) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
mysql> desc info3;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | NO | PRI | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(20) | YES | | NULL | |
| hobbid | int(5) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> select * from v_sore;
+------+-----------+-------+----------+--------+
| id | name | score | address | hobbid |
+------+-----------+-------+----------+--------+
| 5 | jiangshou | 88.00 | laowo | 3 |
| 1 | liuyi | 80.00 | beijing | 2 |
| 4 | tianqi | 92.00 | hangzhou | 5 |
| 2 | wangwu | 99.00 | shanghai | 2 |
+------+-----------+-------+----------+--------+
4 rows in set (0.00 sec)
mysql> show table status\G
.
.
.
.
.
*************************** 8. row ***************************
Name: v_sore
Engine: NULL
Version: NULL
Row_format: NULL
Rows: NULL
Avg_row_length: NULL
Data_length: NULL
Max_data_length: NULL
Index_length: NULL
Data_free: NULL
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: NULL
Checksum: NULL
Create_options: NULL
Comment: VIEW
8 rows in set (0.01 sec)
2.5 创建视图(多表)
需求:需要创建一个视图,需要输出id、学生姓名、分数以及年龄
mysql> select * from test01;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 20 |
| 2 | lisi | 30 |
| 3 | wangwu | 28 |
+------+----------+------+
3 rows in set (0.00 sec)
mysql> select * from info3;
+------+-----------+-------+----------+--------+
| id | name | score | address | hobbid |
+------+-----------+-------+----------+--------+
| 6 | husan | 70.00 | nanjing | 3 |
| 5 | jiangshou | 88.00 | laowo | 3 |
| 3 | lisi | 83.00 | shenzhen | 4 |
| 7 | liulei | 18.00 | nanjing | 5 |
| 1 | liuyi | 80.00 | beijing | 2 |
| 4 | tianqi | 92.00 | hangzhou | 5 |
| 2 | wangwu | 99.00 | shanghai | 2 |
+------+-----------+-------+----------+--------+
7 rows in set (0.00 sec)
mysql> create view v_info3(id,name,score,age) as select a.id,a.name,a.score,b.age from info3 a,test01 b where a.name=b.name;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from v_info3;
+------+--------+-------+------+
| id | name | score | age |
+------+--------+-------+------+
| 3 | lisi | 60.00 | 30 |
| 2 | wangwu | 99.00 | 28 |
+------+--------+-------+------+
2 rows in set (0.00 sec)
2.6修改原表数据
修改原表,视图会发送变化。
mysql> select * from v_info3;
+------+--------+-------+------+
| id | name | score | age |
+------+--------+-------+------+
| 3 | lisi | 60.00 | 30 |
| 2 | wangwu | 99.00 | 28 |
+------+--------+-------+------+
2 rows in set (0.00 sec)
mysql> update info3 set score=83 where name='lisi';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from v_info3;
+------+--------+-------+------+
| id | name | score | age |
+------+--------+-------+------+
| 3 | lisi | 83.00 | 30 |
| 2 | wangwu | 99.00 | 28 |
+------+--------+-------+------+
2 rows in set (0.00 sec)
2.7修改视图数据
修改视图,原表也会发生随之改变。
#修改视图之前的表
mysql> select * from info3;
+------+-----------+-------+----------+--------+
| id | name | score | address | hobbid |
+------+-----------+-------+----------+--------+
| 6 | husan | 70.00 | nanjing | 3 |
| 5 | jiangshou | 88.00 | laowo | 3 |
| 3 | lisi | 83.00 | shenzhen | 4 |
| 7 | liulei | 18.00 | nanjing | 5 |
| 1 | liuyi | 80.00 | beijing | 2 |
| 4 | tianqi | 92.00 | hangzhou | 5 |
| 2 | wangwu | 99.00 | shanghai | 2 |
+------+-----------+-------+----------+--------+
7 rows in set (0.00 sec)
#修改视图之前的视图
mysql> select * from v_info3;
+------+--------+-------+------+
| id | name | score | age |
+------+--------+-------+------+
| 3 | lisi | 83.00 | 30 |
| 2 | wangwu | 99.00 | 28 |
+------+--------+-------+------+
2 rows in set (0.00 sec)
#将wangwu的score改成38
mysql> pumysql> update v_info3 set score=38 where name='wangwu';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
#修改之后的视图
mysql> select * from v_info3;
+------+--------+-------+------+
| id | name | score | age |
+------+--------+-------+------+
| 3 | lisi | 83.00 | 30 |
| 2 | wangwu | 38.00 | 28 |
+------+--------+-------+------+
2 rows in set (0.00 sec)
#修改之后的表
mysql> select * from info3;
+------+-----------+-------+----------+--------+
| id | name | score | address | hobbid |
+------+-----------+-------+----------+--------+
| 6 | husan | 70.00 | nanjing | 3 |
| 5 | jiangshou | 88.00 | laowo | 3 |
| 3 | lisi | 83.00 | shenzhen | 4 |
| 7 | liulei | 18.00 | nanjing | 5 |
| 1 | liuyi | 80.00 | beijing | 2 |
| 4 | tianqi | 92.00 | hangzhou | 5 |
| 2 | wangwu | 38.00 | shanghai | 2 |
+------+-----------+-------+----------+--------+
7 rows in set (0.00 sec)
三、NULL值
在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。
NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有 值的。
mysql> select length(null),length(''),length(123);
+--------------+------------+-------------+
| length(null) | length('') | length(123) |
+--------------+------------+-------------+
| NULL | 0 | 3 |
+--------------+------------+-------------+
1 row in set (0.00 sec)
四、连接查询
MySQL 的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的 共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接
4.1内连接
MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表
4.1.1语法
SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name table2.column_name;
4.1.2实例
mysql> select * from info;
+------+----------+-------+-----------+--------+
| id | name | score | address | hobbid |
+------+----------+-------+-----------+--------+
| 4 | houliu | 80.00 | nanjing | 2 |
| 3 | lisi | 99.99 | nanjing | 2 |
| 1 | wangwu | 80.00 | beijing | 1 |
| 2 | zhangsan | 99.00 | shanghaui | 3 |
| 5 | zhaoliu | 83.00 | biejing | 3 |
+------+----------+-------+-----------+--------+
5 rows in set (0.00 sec)
mysql> select * from infos;
+----------+-------+----------+
| name | score | address |
+----------+-------+----------+
| wangwu | 80.00 | beijing |
| zhangsan | 99.00 | shanghai |
| lisi | 80.00 | nanjing |
| wusan | 88.00 | dongbei |
| litian | 85.00 | dongbei |
+----------+-------+----------+
5 rows in set (0.00 sec)
#通过inner join 的方式将两张表指定的相同字段的记录行输出出来
mysql> select a.id,a.name,a.score from info a inner join infos b on a.name=b.name;
+------+----------+-------+
| id | name | score |
+------+----------+-------+
| 1 | wangwu | 80.00 |
| 2 | zhangsan | 99.00 |
| 3 | lisi | 99.99 |
+------+----------+-------+
3 rows in set (0.00 sec)
4.2左连接
左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参 考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
mysql> select * from infos;
+----------+-------+----------+
| name | score | address |
+----------+-------+----------+
| wangwu | 80.00 | beijing |
| zhangsan | 99.00 | shanghai |
| lisi | 80.00 | nanjing |
| wusan | 88.00 | dongbei |
| litian | 85.00 | dongbei |
+----------+-------+----------+
5 rows in set (0.00 sec)
mysql> select * from info;
+------+----------+-------+-----------+--------+
| id | name | score | address | hobbid |
+------+----------+-------+-----------+--------+
| 4 | houliu | 80.00 | nanjing | 2 |
| 3 | lisi | 99.99 | nanjing | 2 |
| 1 | wangwu | 80.00 | beijing | 1 |
| 2 | zhangsan | 99.00 | shanghaui | 3 |
| 5 | zhaoliu | 83.00 | biejing | 3 |
+------+----------+-------+-----------+--------+
5 rows in set (0.00 sec)
#通过使用left join实现左连接
mysql> select * from info left join infos on info.name=infos.name;
+------+----------+-------+-----------+--------+----------+-------+----------+
| id | name | score | address | hobbid | name | score | address |
+------+----------+-------+-----------+--------+----------+-------+----------+
| 1 | wangwu | 80.00 | beijing | 1 | wangwu | 80.00 | beijing |
| 2 | zhangsan | 99.00 | shanghaui | 3 | zhangsan | 99.00 | shanghai |
| 3 | lisi | 99.99 | nanjing | 2 | lisi | 80.00 | nanjing |
| 4 | houliu | 80.00 | nanjing | 2 | NULL | NULL | NULL |
| 5 | zhaoliu | 83.00 | biejing | 3 | NULL | NULL | NULL |
+------+----------+-------+-----------+--------+----------+-------+----------+
5 rows in set (0.00 sec)
左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为 NULL。
4.3右连接
右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配
mysql> select * from infos;
+----------+-------+----------+
| name | score | address |
+----------+-------+----------+
| wangwu | 80.00 | beijing |
| zhangsan | 99.00 | shanghai |
| lisi | 80.00 | nanjing |
| wusan | 88.00 | dongbei |
| litian | 85.00 | dongbei |
+----------+-------+----------+
5 rows in set (0.00 sec)
mysql> select * from info;
+------+----------+-------+-----------+--------+
| id | name | score | address | hobbid |
+------+----------+-------+-----------+--------+
| 4 | houliu | 80.00 | nanjing | 2 |
| 3 | lisi | 99.99 | nanjing | 2 |
| 1 | wangwu | 80.00 | beijing | 1 |
| 2 | zhangsan | 99.00 | shanghaui | 3 |
| 5 | zhaoliu | 83.00 | biejing | 3 |
+------+----------+-------+-----------+--------+
5 rows in set (0.00 sec)
#利用right join 实现右连接
mysql> select * from info right join infos on info.name=infos.name;
+------+----------+-------+-----------+--------+----------+-------+----------+
| id | name | score | address | hobbid | name | score | address |
+------+----------+-------+-----------+--------+----------+-------+----------+
| 1 | wangwu | 80.00 | beijing | 1 | wangwu | 80.00 | beijing |
| 2 | zhangsan | 99.00 | shanghaui | 3 | zhangsan | 99.00 | shanghai |
| 3 | lisi | 99.99 | nanjing | 2 | lisi | 80.00 | nanjing |
| NULL | NULL | NULL | NULL | NULL | wusan | 88.00 | dongbei |
| NULL | NULL | NULL | NULL | NULL | litian | 85.00 | dongbei |
+------+----------+-------+-----------+--------+----------+-------+----------+
5 rows in set (0.01 sec)
#在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足
五、存储过程
存储过程在数据库中L 创建并保存,它不仅仅是 SQ语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。存储过程的应用范围很广,例如封装特定的功能、 在不同的应用程序或平台上执行相同的函数等等。
5.1储蓄优点
(1)执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
(2)SQL语句加上控制语句的集合,灵活性高
(3)在服务器端存储,客户端调用时,降低网络负载
(4)可多次重复被调用,可随时修改,不影响客户端调用
(5)可完成所有的数据库操作,也可控制数据库的信息访问权限
5.2语法
CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式 <过程名>:尽量避免与内置的函数或字段重名
<过程体>:语句 [ IN | OUT | INOUT ] <参数名><类型>
##创建存储过程##
DELIMITER $$ #将语句的结束符号从分号;临时改为两个$$(可以自定义)
CREATE PROCEDURE Proc() #创建存储过程,过程名为Proc,不带参数
-> BEGIN #过程体以关键字 BEGIN 开始
-> create table mk (id int (10), name char(10),score int (10));
-> insert into mk values (1, 'wang',13);
-> select * from mk; #过程体语句
-> END $$ #过程体以关键字 END 结束
DELIMITER ; #将语句的结束符号恢复为分号
5.3调用存储过程
CALL Proc();
I 存储过程的主体都分,被称为过程体
II 以BEGIN开始,以END结束,若只有一条sQL语句,则可以省略BEGIN-END
III 以DELIMITER开始和结束
mysgl>DEL工M工TER $$ $$是用户自定义的结束符 省略存储过程其他步骤 mysql>DELIMITER ; 分号前有空格
5.4查看存储过程
格式:
#查看某个存储过程的具体信息
SHOW CREATE PROCEDURE [数据库.]存储过程名;
mysql> show create procedure proc\G
*************************** 1. row ***************************
Procedure: proc
sql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER="root"@"%" PROCEDURE "proc"()
begin
create table mk (id int(10),name char(20),score int(10));
insert into mk values(1,'zhangsan',14);
select * from mk;
end
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
5.4.1查看存储过程
SHOW PROCEDURE STATUS
5.4.2查看指定存储过程信息
mysql> SHOW PROCEDURE STATUS like '%proc%'\G
*************************** 1. row ***************************
Db: text
Name: proc
Type: PROCEDURE
Definer: root@%
Modified: 2023-07-20 10:50:16
Created: 2023-07-20 10:50:16
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
5.4存储过程的参数
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
即表示调用者向过程传入值,又表示过程向调用者传出值(只能是变量)
举例
5.4.1创建存储过程
mysql> delimiter @@
mysql> create procedure proc (in inname varchar(40)) #行参
-> begin
-> select * from info where name=inname;
-> end @@
mysql> delimiter @@
mysql> call proc2('wangwu'); #实参
+--------+-------+---------+
| name | score | address |
+--------+-------+---------+
| wangwu | 80.00 | beijing |
+--------+-------+---------+
1 row in set (0.00 sec)
5.4.2 修改存储过程
ALTER PROCEDURE <过程名>[<特征>... ]
ALTER PROCEDURE GetRole MODIFIES SQL DATA SQL SECURITY INVOKER;
MODIFIES sQLDATA:表明子程序包含写数据的语句
SECURITY:安全等级
invoker:当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。
##删除存储过程##
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
DROP PROCEDURE IF EXISTS Proc;