and or 最左原则
create view视图表:虚拟表或存储查询
没有表结构存储查询语句的结果表
临时表在用户退出或同数据库连接断开就会小时,而视图表不会(就像定义个全局变量)保存的是定义
格式:create view “视图表名” as “select语句“;
视图表能不改?有时能,有哦时候不能
如果视图表查询的原表修改视图表会影响。
如果视图表保存的不是原表字段改不了。
create v_store_name as
表的自我连接
分组汇总统计score字段的值是比自己本身的值小的以及score字段和name字段相同的数量
(把自己分为俩表sorce字段作比较)
自排名做score排序
select A.name, A.socre,count(B.score) rank from calss A, class B where A.score <B.score or (A.socre =B.score and A.name = B.name) group by A.name,A.score order by rank;
select A.score,A.name,count(B.score) from class A,class B where B.score >= A.score group by A.score
表的自连接实现排名
select A.name,A.score,count(B.score) RANK from class A,class B where A.score < B.score or (A.score = B.score and A.score and A.name = B.name) group by A.name order by BANK;
case语句
是sql中用来做if-then-else 之类的逻辑的关键字
select case(”字段名“)
when ”条件1“ then ”结果1“
when ”条件2“ then ”结果2“
. 。 。 。
[else ”结果N“]
end
from 表名;
例子:
select name, case name
when 'lisi' then score * 2
when 'zhaoliu' then 1000
when 'wangwu' then score + 100
else score / 2
end "new score" from class;
空值(null)和无值(' ')的区别
1,无值的长度
select lenght('1');
<>判断不是 ' 'where name <> ' ';会去除null行和无值
select count(name) from name 会忽略null行
select count(*) from name 都不会忽略
正则表达式
where store_naem regexp '.*on$';
where store_naem regexp '^B.*on$';
where store_name like 'B%on'
存储过程
经常使用的sql语句定义到存储过程中,用的时候随时调用
存储过程的优点:存储的执行后会滞留缓存中,提高执行效率
sql可以实现条件判断和循环
服务器端存储,客户端调用时,降低网络负载
可以多次调用,随时修改,不影响客户端的调用
可完成所有的数据库操作,也可控制数据库的信息访问权限
创建存储过程
delimiter $$
create procedure proc() #proc过程名,不带参数
begin
select * from store_info;
end $$
delimiter;
call proc#调用存储过程
例子:
mysql>delimiter $$ mysgl>create procedure test1() ->begin
create table class (id int char(10), age int);
insert into class values(1,'yht',28):insert into class values(2,'dxl'18)
insert into class values(3,'qzz',201)
select * from class;
详细详细内容
show create procedure kgc.test1\G
查看存储过程详细信息
show procedure status like '%test1%'\G
存储过程传参
in 传入参数,表示调用这向过程传入值(传入值可以是值或变量)
out传出参数;表示过程调用这传出值(可返回多个值)(传出值只能是变量)
inout输入输出参数,既表示调用者向过程传入值,又表示过程向调用者传出值(值只能时变量)
例子:
in参数变量
delimiter ##
create procedure test2(in myname char(10))
begin
select * from ky27 where name = myname;
end##
call test2('qzz');
out参数变量
out只能传出一行内容
inout参数变量
删除存储过程,if exist 如果存在删除,如果没报错
drop procdure if exists test1;
可以直接drop procdure test1删除存储过程
用if写一个区分90上下重命名
declared定义参数
delimiter $$
create procedure test5(in myscore int)
begin
if myscore >= 90 then
update class set name='秀儿' where score >= 90;
else
update class set naem='渣渣' where scpre < 90;
end if;
end$$
call test5(95);
支持while循环不支持for循环
一次写入一万条数据
show procedure test6
call test6
总结
视图表 view , 保存 select 查询语句的定义,本身不存储数据
create view V_表明 as select 语句;
case
select case 字段 when 条件1 then 结果1
when 条件1 then 结果1 。 。 。
else 结果
end ’case字段别名‘ from 表;
无值 ' ' 长度位零 字段 = ’‘
空值null字段为null 字段is null
正则表达式
select 字段 from 表 where 字段 regrexp '正则表达式'
存储过程 类似shell脚本的函数,可以用来保存一些常用的sql语句集合,方便直接调用
delimiter $$
create procedure 存储过程名(in/out/inout)
begin
sql语句序列;
end$$
delimiter;
call 存储过程名
call 存储过程名(指定参数的值或变量名)
存储过程支持if ...then ...else ...end if
while ....do ... end while