1.create view

视图,可以被当作是虚拟表或存储查询。
视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。
比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写sql语句会很麻烦的,
用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。

语法: create view "视图表名" as "select 语句";

create view v_region_sales as select a.region region,sum(b.sales) sales from location a
inner join store_info b on a.store_name = b.store_name group by region;

select * from v_region_sales;
drop view v_region_sales;

MySQL高级(进阶) SQL 语句二_sql语句

MySQL高级(进阶) SQL 语句二_union联集_02

2.union----联集

将两个sql语句的结果合并起来,两个sql语句所产生的字段需要是同样的数据记录种类

union:生成结果的数据记录值将没有重复,且按照字段的顺序进行排序
语法: [select 语句1] union [select 语句2] ;

union all:将生成结果的数据记录值都列出来,无论有无重复
语法: [select 语句1] union all [select 语句2];

select store_name from location union select store_name from store_info;
select store_name from location union all select store_name from store_info;

MySQL高级(进阶) SQL 语句二_存储过程_03

MySQL高级(进阶) SQL 语句二_正则_04

3.交集值

取两个SQL语句结果的交集

select a.store_name from location a inner join store_info b on a.store_name = b.store_name;

select a.store_name from location a inner join store_info b using (store_name);

#两表其中的一个表没有指定的行,而另一个表这个行有重复不适用,要求两个表确实有交集的行的时候用
select a.store_name from
(select store_name from location union all select store_name from store_info) a
group by a.store_name having count(*) > 1;

#取两个SQL语句结果的交集,且没有重复
select a.store_name from (select b.store_name from location b inner join store_info c on b.store_name = c.store_name) a
group by a.store_name;

select distinct a.store_name from location a inner join store_info b using (store_name);
select distinct store_name from location where (store_name) in (select store_name from store_info);
select distinct a.store_name from location a left join store_info b using (store_name) where b.store_name is not null;
/右连接取交集( /右表取没出现NULL值的行),distinct去重

MySQL高级(进阶) SQL 语句二_正则_05

MySQL高级(进阶) SQL 语句二_正则_06

4.无交集值

显示第一个sql语句的结果, 且与第二个sql语句没有交集的结果,且没有重复

select distinct store_name from location where (store_name) not in (select store_name from store_info);
select distinct a.store_name from location a left join store_info b using (store_name) where b.store_name is null;

select a.store_name from
(select distinct store_name from location union all select distinct store_name from store_info) a
group by a.store_name having count(*) = 1;

MySQL高级(进阶) SQL 语句二_存储过程_07

5.case

是sql用来做为 if-then-else 之类逻辑的关键字

语法:
select case ("字段名")
when "条件1" then "结果1" .
when "条件2" then "结果2"
...
[else "结果n"]
end
from "表名";

# "条件"可以是一个数值或是公式。 else 子句则并不是必须的。

select store_name, case store_name
when 'los angeles' then sales * 2
when 'boston' then 1000
else sales
end
"new sales",date
from store_info;

#"new sales" 是用于case那个字段的字段名。

MySQL高级(进阶) SQL 语句二_sql语句_08

6.空值(NULL) 和 无值('')的区别

1. 无值的长度为0,不占用空间的;而NULL值的长度是NULL,是占用空间的。
2. IS NULL或者IS NOT NULL, 是用来判断字段是不是为NULL 或者不是NULL,不能查出是不是无值的。
3.无值的判断使用 ='' 或者 <>'' 来处理。<>代表不等于。
4.在通过count()指定字段统计有多少行数时,如果遇到NULL值会自动忽略掉,遇到无值会加入到记录中进行计算。

7.正则表达式

匹配模式           描述                               实例
^ 匹配文本的开始字符 '^bd'匹配以bd开头的字符串
$ 匹配文本的结束字符 'qn$'匹配以qn结尾的字符串
. 匹配任何单个字符 's.t'匹配任何s和t之间有一一个字符的字符串
* 匹配零个或多个在它前而的字符 'fo*t'匹配t前面有任意个。
+ 匹配前面的字符1次或多次 'hom+'匹配以ho开头,后而至少-一个m 的字符串
字符串 匹配包含指定的字符串 'clo'匹配含有clo的字符串
p1|p2 匹配p1或p2 'bg|fg'匹配bg或者fg
[...] 匹配字符集合中的任意一个字符 '[abc]'匹配a或者b或者c
[^...] 匹配不在括号中的任何字符 '[^ab]' 匹配不包含a或者b的字符串
{n} 匹配前而的字符串n次 'g{2}'匹配含有2个g的字符串
{n,m} 匹配前面的字符串至少n次,至多m次 'f{1,3}'匹配f最少1次,最多3次

语法: select "字段" from "表名" where "字段" regexp {模式};
select * from store_info where store_name regexp 'os';
select * from store_info where store_name regexp '^[a-g]';
select * from store_info where store_name regexp 'ho|bo';

MySQL高级(进阶) SQL 语句二_视图表_09

8.存储过程

存储过程是一组为了完成特定功能的SQL语句集合。

存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的
名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程
时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。

存储过程的优点:

1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
2、SQL语句加上控制语句的集合,灵活性高
3、在服务器端存储,客户端调用时,降低网络负载
4、可多次重复被调用,可随时修改,不影响客户端调用
5、可完成所有的数据库操作,也可控制数据库的信息访问权限

创建存储过程

delimiter $$                    #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
create procedure proc() #创建存储过程,过程名为proc,不带参数
-> begin #过程体以关键字 begin 开始
-> select * from store_info; #过程体语句
-> end $$ #过程体以关键字end结束
delimiter ; #将语句的结束符号恢复为分号

MySQL高级(进阶) SQL 语句二_存储过程_10

调用存储过程

call proc;

MySQL高级(进阶) SQL 语句二_sql语句_11

查看存储过程

show create procedure [数据库.]存储过程名;      #查看某个存储过程的具体信息

show create procedure proc;

show procedure status [like '%proc%'] \G

MySQL高级(进阶) SQL 语句二_正则_12

存储过程的参数

IN 输入参数:表示调用者向过程传入值(传入值可以是字而量或变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

delimiter $$
create procedure procl(in inname char(16))
-> begin
-> select * from store_info where store_name = inname;
-> end $$
delimiter ;

call procl('boston');

MySQL高级(进阶) SQL 语句二_sql语句_13

删除存储过程

存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。

drop procedure if exists proc;
#仅当存在时删除,不添加if exists 时,如果指定的过程不存在,则产生一个错误

MySQL高级(进阶) SQL 语句二_存储过程_14

存储过程的控制语句

create table t (id int(10));
insert into t values (10);

(1)条件语句if-then-else .... end if
delimiter $$
create procedure proc2(in pro int)
begin
declare var int;
set var=pro*2;
if var>=10 then
update t set id=id+1;
else
update t set id=id-1;
end if;
end $$
delimiter ;

call proc2(6) ;

(2)循环语句while .... end while
delimiter $$
create procedure proc3()
-> begin
-> declare var int(10);
-> set var=0;
-> while var<6 do
-> insert into t values(var);
-> set var=var+1;
-> end while;
-> end $$

delimiter ;

call proc3;

MySQL高级(进阶) SQL 语句二_视图表_15

MySQL高级(进阶) SQL 语句二_视图表_16

MySQL高级(进阶) SQL 语句二_union联集_17