select * from(select row_number()
over(partition by IDCARD order by
DATATM desc) as rownum,*
from (SELECT
*
FROM
TABLENAME
)as H1
) as H where H.rownum =
1

什么是存储过程

简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;

ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;

博主在工作中,常常需要使用sql语句来进行查询,总结发现,灵活使用这几个要点,就可以应付大部分简单情况。

解释:红色为以什么分组   蓝色为以什么排序  紫色为表名  
目前是获取表中每个 IDCARD中时间最大的一条

有哪些特性

有输入输出参数,可以声明变量,有if/else,
case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;

函数的普遍特性:模块化,封装,代码复用;

速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

 

一.连接:根据两个或多个表中的列之间的关系,从这些表中查询数据。

 

存储过程的基本格式如下:

图片 1

-- 声明结束符
-- 创建存储过程
DELIMITER $  -- 声明存储过程的结束符
CREATE PROCEDURE pro_test()    --存储过程名称(参数列表)
BEGIN
    -- 可以写多个sql语句;      -- sql语句+流程控制
    SELECT * FROM employee;
END $  -- 结束 结束符

-- 执行存储过程
CALL pro_test();   -- CALL 存储过程名称(参数);

-- 删除存储过程
DROP PROCEDURE pro_test;

参数:
IN:   表示输入参数,可以携带数据带存储过程中
OUT: 表示输出参数,可以从存储过程中返回结果
INOUT: 表示输入输出参数,既可以输入功能,也可以输出功能

图片 2

 

1. 带有输入参数的存储过程

    需求:传入一个员工的id,查询员工信息

图片 3

DELIMITER $
CREATE PROCEDURE pro_findById(IN eid INT)  -- IN: 输入参数
BEGIN
    SELECT * FROM employee WHERE id=eid;
END $ 

-- 调用
CALL pro_findById(4);

图片 4

 

2. 带有输出参数的存储过程

DELIMITER $
CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20))  -- OUT:输出参数
BEGIN
        -- 给参数赋值
    SET str='hellojava';
END $

如何接受返回参数的值呢?这里涉及到MySQL的变量

 

MySQL变量一共有三种:

全局变量

全局变量又叫内置变量,是mysql数据库内置的变量 ,对所有连接都起作用。

查看所有全局变量: show variables

查看某个全局变量: select @@变量名

修改全局变量: set 变量名=新值

character_set_client: mysql服务器的接收数据的编码

character_set_results:mysql服务器输出数据的编码

 

会话变量

只存在于当前客户端与数据库服务器端的一次连接当中。如果连接断开,那么会话变量全部丢失!

定义会话变量: set @变量=值

查看会话变量: select @变量

局部变量

在存储过程中使用的变量就叫局部变量。只要存储过程执行完毕,局部变量就丢失。

 

回到上面这个存储过程,如何接受返回参数的值呢?

定义一个会话变量name, 使用name会话变量接收存储过程的返回值

CALL pro_testOut(@NAME);

查看变量值

SELECT @NAME;

 

3. 带有输入输出参数的存储过程

图片 5

DELIMITER $
CREATE PROCEDURE pro_testInOut(INOUT n INT)  -- INOUT: 输入输出参数
BEGIN
   -- 查看变量
   SELECT n;
   SET n =500;
END $

-- 调用
SET @n=10;

CALL pro_testInOut(@n);

SELECT @n;

图片 6

 

4. 带有条件判断的存储过程

需求:输入一个整数,如果1,则返回“星期一”,如果2,返回“星期二”,如果3,返回“星期三”。其他数字,返回“错误输入”;

图片 7

DELIMITER $
CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20))
BEGIN
    IF num=1 THEN
        SET str='星期一';
    ELSEIF num=2 THEN
        SET str='星期二';
    ELSEIF num=3 THEN
        SET str='星期三';
    ELSE
        SET str='输入错误';
    END IF;
END $

--调用
CALL pro_testIf(4,@str);

SELECT @str;

图片 8

 

5. 带有循环功能的存储过程

需求: 输入一个整数,求和。例如,输入100,统计1-100的和

图片 9

DELIMITER $
CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)
BEGIN
    -- 定义一个局部变量
    DECLARE i INT DEFAULT 1;
    DECLARE vsum INT DEFAULT 0;
    WHILE i<=num DO
          SET vsum = vsum+i;
          SET i=i+1;
    END WHILE;
    SET result=vsum;
END $

--调用
CALL pro_testWhile(100,@result);

SELECT @result;

图片 10

 

6. 使用查询的结果赋值给变量(INTO)

图片 11

DELIMITER $
CREATE PROCEDURE pro_findById2(IN eid INT,OUT vname VARCHAR(20) )
BEGIN
    SELECT empName INTO vname FROM employee WHERE id=eid;
END $

--调用
CALL pro_findById2(1,@NAME);

SELECT @NAME;

图片 12

 

  • JOIN或INNER
    JOIN: 返回左表和右表中相互匹配的行
  • LEFT
    JOIN: 返回左表和右表中相互匹配的行,及左表中不相匹配的行
  • RIGHT
    JOIN: 返回左表和右表中相互匹配的行,及右表中不相匹配的行
  • FULL
    JOIN或FULL OUTER JOIN:
    返回左表和右表中相互匹配的行,及不相匹配的行
  • 图片 13 
  • 应用举例
  • 在一些题目中没有明确的暗示情况下,使用哪一种连接方式都可以;
  • 也有一些情况,只能使用特定的连接方式。

存储过程弊端

不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;

不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;

1.join/inner
join

必须使用inner
join的情况

1  --查询所有未讲课的教师的Tname和Depart. 
2   select TNAME,DEPART 
3   from TEACHER 
4   where TNO not in(select TEACHER.TNO from COURSE inner join 
5   TEACHER on COURSE.TNO=TEACHER.TNO)
6   --或者使用 Except
7     select TNAME,DEPART from TEACHER
8     except
9     select TNAME,DEPART from COURSE join TEACHER on COURSE.TNO=TEACHER.TNO

上面的sql语句中的“select
TEACHER.TNO from COURSE inner join TEACHER on
COURSE.TNO=TEACHER.TNO”中,只能使用inner join,使用left join、right
join、full join都是错误的。

 2.left
join和right join 

使用了left
join 的情况,调换一下表的位置,就可以用right join替换;反之亦然。

1 --查询所有学生的Sname、Cname和Degree列。
2 select SNAME,CNAME,DEGREE 
3 from STUDENT left join SCORE on STUDENT.SNO=SCORE.SNO 
4 left join COURSE on SCORE.CNO=COURSE.CNO

也可以写成

1 select SNAME,CNAME,DEGREE 
2  from score  right join STUDENT on STUDENT.SNO=SCORE.SNO 
3 right join COURSE on SCORE.CNO=COURSE.CNO

发表评论

电子邮件地址不会被公开。 必填项已用*标注