您的位置:首页 > 数据库 > MySQL

第一天学习MySql(3)-查询与存储过程

2017-03-12 13:49 357 查看

3.MySql入门-MySql其他知识

3.1级联更新/级联删除

当我们使用外键约束时,希望删除主表数据的时候,在副表中与它有关的数据也会被删除,这时候可以使用级联更新/级联删除,语法如下:

CREATE TEMPORARY TABLE database1 (
id1 INT,
CONSTRAINT database1_database2_fk FOREIGN KEY(id1) REFERENCES database2(id2)  ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TEMPORARY TABLE database2 (
id2 INT
);


ON UPDATE CASCADE:主表修改某个数据,副表中与之有关的数据也会随之修改。

ON DELETE CASCADE:主表删除某个数据,副表中与之有关的数据也会随之删除。

3.2多表查询

CREATE TEMPORARY TABLE database1 (
id1 INT,
name VARCHAR(20)
);
CREATE TEMPORARY TABLE database2 (
id2 INT,
name VARCHAR(20)
);


3.2.1交叉连接查询(笛卡尔积)

当我们需要将表1每一条数据和表2每一条数据组合起来的时候,可以用到这种查询方式。

若database1下id1有2条数据(1,2),database2下id2有3条数据(a,b,c),产生结果:

(1,a)(1,b)(1,c)(2,a)(2,b)(2,c)

SELECT database1.id1,database2.id1 FROM database1,database2;

3.2.2内连接

当我们需要查询的结果为:遍历表一某些数据和表二某些数据,找出他们其中之中满足某些条件的数据时,可以使用内连接。

select d1.*, d2.*
from  database1 d1
inner join  database2 d2
on d1.id1 = d2.id2
//另外一种写法
SELECT d1.*,d2.*
FROM database1 d1,database2 d2
WHERE d1.id1 = d2.id2;


结果为所有满足 database1.id1 = database1.id2 的组合。

3.2.3左外连接查询/右外连接查询

当我们需要查询的结果为:先找出表一中的所有数据,再遍历表二的数据,再找出表二之中满足某些条件(与表一有关)的数据时,左外连接查询/右外连接查询,若表一中某些数据在表二中找不到满足其条件的,表二会显示null,也就是一个表会显示所有内容。

SELECT d1.name,d2.name
FROM database1 d1
LEFT OUTER JOIN database2 d2
ON d1.id1=d2.id2;


上面代码显示的结果:database1全部显示,database2满足条件的组合才会显示。

右外连接与这没什么差别,只不过左右互换。

SELECT d1.name,d2.name
FROM database2 d2
LEFT OUTER JOIN database1 d1
ON d1.id1=d2.id2;


上面代码显示的结果:database2,database1满足条件的组合才会显示。

3.2.4自连接查询

自连接查询本质上也是左外连接查询/右外连接查询,只不过两个表都是写同一个表而已。

CREATE TEMPORARY TABLE worker(
id INT,
bossId INT
);
SELECT w.name AS '员工',b.name AS '上司'
FROM database1 w
LEFT OUTER JOIN database1 b
ON w.bossId=b.id;


上面代码显示的结果:同样的,员工ID会全部显示出来,如果该员工没有上司,那他只会有一条数据,并且上司列会显示null,如果有多个上司,会显示多列。

3.3 存储过程

3.3.1什么是存储过程

存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。可以简单认为是一个方法,可以实现一系列功能,可以接受参数返回参数,声明局部变量等。

优点:提高通信速率,提高安全性,提高效率。

3.3.2怎么创建并调用一个存储过程

DELIMITER $
CREATE PROCEDURE pro_name()
BEGIN
//功能语句
END $//存储过程结束


可以发现我们需要先定义一个结束符号,也就是DELIMITER $,然后再BEGIN END中写入我们需要的功能语句,最后以结束符号结束。

如何调用?

CALL pro_test();


3.3.3带输入输出参数的存储过程

参数格式:参数类型 参数名称 数据类型

其中参数类型有:IN OUT INOUT

DELIMITER $
CREATE PROCEDURE pro_test(IN n1 VARCHAR(20),OUT n2 VARCHAR(20)
,INOUT n3 VARCHAR(20))
BEGIN
SELECT n1;
SET n2 = '输出参数';
SELECT n3;
SET n3 = '输入输出参数-输出';
END $
SET @n1='输入参数';
SET @n3='输入输出参数-输入';
CALL pro_test(@n1,@n2,@n3);


使用存储过程查询数据库数据:

CREATE TEMPORARY TABLE worker(
id INT,
name VARCHAR(20)
);
DELIMITER $
CREATE PROCEDURE pro_test(IN w_id INT,OUT w_Name VARCHAR(20))
BEGIN
SELECT NAME INTO w_Name FROM worker WHERE id=w_id;
END $
CALL pro_test(1,@w_Name);


3.3.3在存储过程中使用判断条件、循环条件

条件语句:

IF 条件 THEN
功能语句;
ELSEIF THEN
功能语句;
END
功能语句;
END IF;


循环语句:

DECLARE i INT DEFAULT 1;
DECLARE num INT DEFAULT 10;
WHILE i<=num DO
功能语句;
END WHILE;


判断成绩:

ELIMITER $
CREATE PROCEDURE pro_grade(IN num INT,OUT result VARCHAR(20))
BEGIN
IF num>=80 THEN
SET str = '优秀';
ELSEIF num>=60 THEN
SET str ='良好';
ELSE
SET str = '不及格';
END IF;
END $


计算从1到num的值:

DELIMITER $
CREATE PROCEDURE pro_testByWhile(IN num INT,OUT sum INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE result INT DEFAULT 0;
WHILE i<=num DO
SET result = result + i;
SET i = i+1;
END WHILE;
SET sum = result;
END $
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: