千家信息网

MySQL-视图与存储过程

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,一、MySQL基础知识增:增加单条数据:insert into 表 (列名,列名...) values (值,值,值...)增加多条数据:insert into 表 (列名,列名...) values
千家信息网最后更新 2025年02月01日MySQL-视图与存储过程

一、MySQL基础知识

增:增加单条数据:insert into 表 (列名,列名...) values (值,值,值...)增加多条数据:insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)导入其他表的数据:insert into 表 (列名,列名...) select 列名,列名... from 表删:删除具体数据:delete from 表 where 条件改:修改表中具体数据:update 表 set 列名= 值 where 条件查:查询具体内容:select 列名01 as 别名 , 列名02 from 表 where 条件

常见条件:
1、逻辑运算符
and:与;or:或;not:非
2、比较运算符
等于=;大于>;大于等于>=;小于<;小于等于<=;不等于!=或<>

示例:select * from test where id > 5 and num > 60;

3、范围
in:在其中;not in:不在其中;between:在区间内

示例:select * from test where nid between 5 and 10;

4、通配符
%:匹配任意零个字符或者任意多个字符;
_ :匹配任意一个字符

示例:select * from test where name like '李%';

5、空值
is null:空值
is not null:非空

6、限制条件
limit 3:取前三行
limit 3,5:从第三行开始取5行
limit 3 offset 5:从第五行开始取3行

7、排序
order by 列 asc:从小到大排序
order by 列 desc:从大到小排序
order by 列1 desc,列二 asc:根据列1从大到小排序,如果相同则按列二从小到大排序

8、分组
select count(列名),sum(列名),max(列名),min(列名) from 表 where 条件 group by 列名01,列名02 order by 列名
特别注意:group by 必须在where之后,order by之前

9、连表
无对应关系则不显示:
select A.xx B.oo from A, B where A.x=B.o 没有A.x=B.o对应的数据则不显示任何结果

示例:select  tb1.num,tb2.name from tb1,tb2 where tb1.sid = tb2.sid

无对应关系则不显示:
select A.xx B.oo from A inner join B where A.x=B.o A和B具有对等位置, 没有A.x=B.o对应的数据则不显示任何结果

A表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name from A left join B on A.nid = B.nid

select score.sid,score.course_id,score.num,student.sname from score left join student on score.student_id = student.sid 

B表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name from A right join B on A.nid = B.nid

select score.sid,score.course_id,score.num,student.sname from studentright join score on score.student_id = student.sid

10、导入与导出数据库

导出现有数据库数据    mysqldump -u 用户名 -p 密码 数据库名 > 导出文件路径    #结构+数据    mysqldump -u 用户名 -p 密码 -d 数据库名 > 导出文件路径    #结构导入现有数据mysqldump -u root -p 密码 数据库名 < 文件路径

二、视图

视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。

1、创建视图

格式:CREATE VIEW 视图名称 AS  SQL语句示例:    create view temp1 as     select score.sid,score.course_id,score.num,student.sname     from score     left join student on score.student_id = student.sid;

2、修改视图

格式:ALTER VIEW 视图名称 AS SQL语句示例:    alter view temp2 as     select score.sid,score.course_id,score.num,student.sname     from score     left join student on score.student_id = student.sid     where course_id in (1,2);

3、使用视图

格式:SELECT * FROM 视图名称示例:    select * from temp2;

4、删除视图

格式:DROP VIEW 视图名称示例:    drop view temp2;

三、存储过程

存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。
1、创建无参数存储过程

格式:CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体示例:        delimiter //        create procedure p1()        BEGIN            select * from score;        END//        delimiter;

2、创建带参数的参数过程
存储过程可以接收的参数有三种,in:仅参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值,out:该值可在存储过程内部被改变,并可返回,inout:调用时指定,并且可被改变和返回。

示例:        delimiter //        create procedure p2(            in i1 int,            out r1 int,            inout i2 int        )        BEGIN            DECLARE temp1 int;            DECLARE temp2 int default 5;            set temp1 = 10;            set i2 = i1 + 100;            set r1 = i1 + temp1 + temp2;        END//        delimiter;

3、执行存储过程
无参数:

call p1()

有参数:

set @t1 = 0;set @t2 = 1;call p2(1,@t1,@t2);select @t1,@t2;

4、删除存储过程

drop procedure 存储过程名;

5、pymysql执行存储过程

#!/usr/bin/env python# -*- coding:utf-8 -*-import pymysqlconn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 执行存储过程cursor.callproc('p1', args=(1, 22, 3, 4))# 获取执行完存储的参数cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")result = cursor.fetchall()conn.commit()cursor.close()conn.close()print(result)

6、条件语句
IF-THEN-ELSE语句

delimiter \\CREATE PROCEDURE p3 (        in i1 int)BEGIN    IF i1 = 1 THEN        select * from t1;    ELSEIF i = 2 THEN        select * from t2;    ELSE        select * from t3;    END IF;END\\delimiter ;

CASE-WHEN-THEN-ELSE语句

delimiter \\CREATE PROCEDURE p3 (        in i1 int)BEGIN    CASE i1          WHEN    1   THEN        select * from t1;    WHEN    2   THEN        select * from t2;    ELSE        select * from t3;    END CASE;END\\delimiter ;

7、循环语句
WHILE-DO…END-WHILE

delimiter \\CREATE PROCEDURE p4 ()BEGIN    DECLARE i int;        set i = 1;        WHILE i < 3 DO            select i;            set i = i + 1;        END WHILE;END\\delimiter ;

REPEAT...END REPEAT
此语句的特点是执行操作后检查结果

delimiter \\CREATE PROCEDURE p5 ()BEGIN    DECLARE i int;        set i = 1;        REPEAT            select i;            set i = i + 1;            until i > 3        END REPEAT;END\\delimiter ;

LOOP...END LOOP

delimiter \\CREATE PROCEDURE p5 ()BEGIN    DECLARE i int default 0;        loop_lable: loop            set i = i + 1;            if i < 3 then                iterate loop_lable;            end if;            if i > 5 then                leave loop_lable;            end if;            select i;        END loop loop_lable;END\\delimiter ;

8、存储过程的基本函数
字符串类

CHARSET(str) //返回字串字符集CONCAT (string2 [,... ]) //连接字串INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0LCASE (string2 ) //转换成小写LEFT (string2 ,length ) //从string2中的左边起取length个字符LENGTH (string ) //string长度LOAD_FILE (file_name ) //从文件读取内容LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为lengthLTRIM (string2 ) //去除前端空格REPEAT (string2 ,count ) //重复count次REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_strRPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为lengthRTRIM (string2 ) //去除后端空格STRCMP (string1 ,string2 ) //逐字符比较两字串大小,SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符UCASE (string2 ) //转换成大写RIGHT(string2,length) //取string2最后length个字符SPACE(count) //生成count个空格

数学类

ABS (number2 ) //绝对值BIN (decimal_number ) //十进制转二进制CEILING (number2 ) //向上取整CONV(number2,from_base,to_base) //进制转换FLOOR (number2 ) //向下取整FORMAT (number,decimal_places ) //保留小数位数HEX (DecimalNumber ) //转十六进制注:HEX()中可传入字符串,则返回其ASC-11码,如HEX('DEF')返回4142143也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19LEAST (number , number2 [,..]) //求最小值MOD (numerator ,denominator ) //求余POWER (number ,power ) //求指数RAND([seed]) //随机数ROUND (number [,decimals ]) //四舍五入,decimals为小数位数SIGN (number2 ) // 正数返回1,负数返回-1

日期时间类

ADDTIME (date2 ,time_interval ) //将time_interval加到date2CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区CURRENT_DATE ( ) //当前日期CURRENT_TIME ( ) //当前时间CURRENT_TIMESTAMP ( ) //当前时间戳DATE (datetime ) //返回datetime的日期部分DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetimeDATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间DATEDIFF (date1 ,date2 ) //两个日期差DAY (date ) //返回日期的天DAYNAME (date ) //英文星期DAYOFWEEK (date ) //星期(1-7) ,1为星期天DAYOFYEAR (date ) //一年中的第几天EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串MAKETIME (hour ,minute ,second ) //生成时间串MONTHNAME (date ) //英文月份名NOW ( ) //当前时间SEC_TO_TIME (seconds ) //秒数转成时间STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示TIMEDIFF (datetime1 ,datetime2 ) //两个时间差TIME_TO_SEC (time ) //时间转秒数]WEEK (date_time [,start_of_week ]) //第几周YEAR (datetime ) //年份DAYOFMONTH(datetime) //月的第几天HOUR(datetime) //小时LAST_DAY(date) //date的月的最后日期MICROSECOND(datetime) //微秒MONTH(datetime) //月MINUTE(datetime) //分返回符号,正负或0SQRT(number2) //开平方
0