6

MySQL高级(进阶) SQL 语句二

 2 years ago
source link: https://blog.51cto.com/u_15382727/5083909
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

MySQL高级(进阶) SQL 语句二

推荐 原创

呼噜呼噜懒洋洋 2022-03-08 22:30:29 博主文章分类:Mysql ©著作权

文章标签 存储过程 sql语句 union联集 正则 视图表 文章分类 Linux 系统/运维 阅读数1068

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 语句二_存储过程

MySQL高级(进阶) SQL 语句二_正则_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 语句二_存储过程_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 语句二_union联集_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 语句二_正则_11

查看存储过程

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

show create procedure proc;

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

MySQL高级(进阶) SQL 语句二_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 语句二_视图表_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 语句二_sql语句_17

  • 打赏
  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK