Sql编程
- 常量
- 字符串常量,如select ‘hello’ as col1
- 数值常量:整数常量(2018),小数常量(2.18)
- 日期时间常量:时间常量(‘14:30:24’),日期时间常量(‘2018-04-08 22:44:35’)
- 布尔值:true和false
- 二进制:0和1,如select b ‘11’ //b是二进制标志,x是16进制
- 十六进制: select X
create table if not exists student (
id varchar(10),
sno varchar(10),
sname varchar(10),
primary key(id)
);
create table if not exists teacher(
id int(10),
tno varchar(10),
tname varchar(10),
primary key(id)
);
- 变量
系统变量(@@开头)
用户自定义变量
- 用户会话变量(@开头):会话期间一直有效,不能客户机共享
- 局部变量
运算符
算数运算符
比较运算符
逻辑运算符
位运算符
流程语句
Begin-end语句块
delimiter $$
BEGINSET @a=1;
if (@a > 0) THEN
SELECT COUNT(*) from tb_public_effect_tmp;
ELSE
SELECT * from tb_effect_master;
end if;END $$
如何定义一个函数?
函数如何调用?
函数应用场景?
条件控制语句
- if
- case
- while
系统函数
-----数学函数
- 三角函数:pi(),radians(s),sin(x),cos(x)…
- 指数函数:sqrt(),pow(x,y)
- 对数函数:log(x)
- 近似值函数:round(x);
- 随机函数:rand(),
- 二进制,八进制,十六进制,:bin(x),oct(x),hex()
-----字符串函数
- 字符串字符集函数:convert(x using chatset)
- 获取字符串长度:char_length(x)
- 加密函数:password(x),md5(x)
- 加密-解密函数:encode(x,key) decode(password,key)
- 字符串连接函数:concat(x1.x2,),concat_ws(x,x1,x2,…)
- 修剪函数:ltrim(x),rtrim(x),trim(x)
- 截取函数:left(x,n),right(x,n)
- 字符串大小写转换函数:upper(x),uncase,lower(x),lcase(x)
- Substring (x,start,length)
- 替换函数:replace(x1,x2,x3)
- 字符串比较函数:strcmp(x1,x2)
- 字符串逆序函数:reverse(x)
-----类型转换函数
- convert(x,type)
- cast(x as type)
-----条件控制函数
- if()
- ifnull()
- case
-----系统信息函数
version() //获取版本号
Datebase() //获取当前数据库
Schema() //
user() //获取当前用户
current_time() //获取当前时间
current_date() //获取当前日期
now() //获取当前日期时间
monthnamea(x),dayname(x),weekday(x),dayofweek(x) // 获取月份星期信息
datediff(x1,x2), adddate(d,n) subdate(d,n) //获取相隔天数
-----其他常用函数
Last_insert_id()
ip地址与整数相互转换函数
基准值函数
uuid() 函数
create table student(
id int,
name varchar(20),
gender varchar(2),
age int
);
视图
视图的定义:
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
视图应用场景:
视图是虚拟表,本身不存储数据,而是按照指定的方式进行查询。比如,我们希望从前文提到的四张表,order_baisc,order_details,user和product中查找所有记录,需要写入代码指令:
想再次查询这几个表中uid为u0001的用户的记录,有需要键入一次操作指令:
也就是说,每次查询都得重新键入查询指令SQL代码,这种费时费力的体力活,对于时间就是生命的你我来说,是不划算的。所以借助视图,来执行相同或相似的查询。
如何创建视图与应用视图
>CREATE VIEW 视图名(列1,列2...)
AS SELECT (列1,列2...)
FROM ...;
可以看到,创建视图和查询相比,增加了前面的CREATE VIEW 视图名 AS,
使用视图和使用表完全一样,只需要把视图当成一张表就OK了。视图是一张虚拟表。
eg:创建order_baisc,order_details,user和product的查询视图,并通过视图查找uid为u0001的记录:
修改和创建视图可以使用代码:
CREATE OR REPLACE VIEW 视图名 AS SELECT [...] FROM [...];
eg:
查看数据库中有哪些视图 show tables
前面提到,视图就是虚拟的表,因此,查看视图的方法和查看表的方法是一样的:
查看视图详情 :
>DESC 视图名;
或者
>SHOW FIELDS FROM 视图名;
eg:
通过视图变更数据:
INSERT INTO v_order(pid,pname,price) VALUES('p010','柴油','34');
通过上图,我们可以看到,跨表插入数据系统反馈报错,提示不能修改超过一个表的数据。因此,可以通过视图插入数据,但是只能基于一个基础表进行插入,不能跨表更新数据。
WITH CHECK OPTION 限制:
如果在创建视图的时候制定了“WITH CHECK OPTION”,那么更新数据时不能插入或更新不符合视图限制条件的记录。
eg:对表product创建一个单价超过3000的视图,并加上“WITH CHECK OPTION”,之后插入一个价格为42的记录:
可以看到系统提示错误CHECK OPTION FAILED。因为视图限制了价格要高于3000.
后面再次尝试了不加“WITH CHECK OPTION”的视图,后者可以成功插入。
同样的,在不加“WITH CHECK OPTION”的情况下,通过视图修改记录,也可以成功执行:
通过视图修改,可能导致数据无故消失,因此:
没有特殊的理由,建议加上“WITH CHECK OPTION”命令。
注意点:
1. 视图不是表,不直接存储数据,是一张虚拟的表;
2. 一般情况下,在创建有条件限制的视图时,加上“WITH CHECK OPTION”命令。