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、比较运算符
等于=;大于>;大于等于>=;小于<;小于等于<=;不等于!=或<>
我们提供的服务有:成都网站制作、网站设计、微信公众号开发、网站优化、网站认证、三门峡ssl等。为1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的三门峡网站制作公司
示例:
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 student
right 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 pymysql
conn = 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中出现的位置,不存在返回0
LCASE (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开头,直到字串长度为length
LTRIM (string2 ) //去除前端空格
REPEAT (string2 ,count ) //重复count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length
RTRIM (string2 ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,
注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1
TRIM([[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)返回19
LEAST (number , number2 [,..]) //求最小值
MOD (numerator ,denominator ) //求余
POWER (number ,power ) //求指数
RAND([seed]) //随机数
ROUND (number [,decimals ]) //四舍五入,decimals为小数位数
SIGN (number2 ) // 正数返回1,负数返回-1
日期时间类
ADDTIME (date2 ,time_interval ) //将time_interval加到date2
CONVERT_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格式显示datetime
DATE_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) //分返回符号,正负或0
SQRT(number2) //开平方
文章标题:MySQL-视图与存储过程
标题链接:http://myzitong.com/article/jdghgs.html