Mysql高阶语句
- 准备环境(1)
- 一、MySQL高阶进阶SQL语句
- 1、select
- 2、distinct
- 3、where
- 4、and or
- 5、in
- 6、between
- 7、通配符
- 8、order by
- 9、函数
- 数学函数
- 字符串函数
- 10、group by
- 11、having
- 12、别名
- 13、子查询
- 13、EXISTS
- 二、MySQL高阶进阶SQL语句2
- 环境准备(2)
- 1、连接查询
- 多表查询
- 2、create view 视图
- 3、union联集
- 4、交集值
- 5、无交集值
- 六、case
- 七、空值(NULL) 和 无值('') 的区别
- (1)使用length函数查看字符的长度
- (2)查看表里面字符为null的行和不为null的行
- (3)查看空值的行和不为空值的行
- (4)统计所有的行数和忽略为null值的行
- 正则表达式
- (1)匹配以es结尾的字符串的字段
- (2)匹配字符串里包含to的字段
- (3)匹配字符串以A-G开头的字段
- (4)匹配字符串以 HO | Bo 开头的字段
- MySQL存储过程
- 存储过程的概念
- 存储过程的优点
- 创建存储过程
- 查看存储过程
- 存储过程的参数
- in
- out
- inout
- 删除存储过程
- 存储过程的控制语句
准备环境(1)
mysql -uroot -p
create database kgc;
use kgc;
create table location(region varchar(10),store_name char(20)); # 表一结构
create table store_info(storm_name char(20),sales int(10),date char(15)); #表二结构
# 表一数据内容
insert into location values ('East','Bostion');
insert into location values ('East','New York');
insert into location values ('West','Los Angeles');
insert into location values ('West','Houstion');
# 表二数据内容
insert into store_info values('Los Angeles',1500,'2023-01-30');
insert into store_info values('Los Angeles',300,'2023-01-30');
insert into store_info values('Houstion',200,'2023-01-30');
insert into store_info values('Bostion',700,'2023-01-30');
select * from region;
select * from fare;
一、MySQL高阶进阶SQL语句
1、select
显示表格中一个或数个字段的所有资料
语法:select 字段 from 表名
select region from store_info;
2、distinct
不显示重复的数据记录
语法:select distinct ‘字段’ from ‘表名’;
select distinct storm_name from store_info ;
3、where
有条件查询
语法:select “字段” from"表名" where ‘条件’;
select storm_name from store_info where sales > 1000;
4、and or
且 ,或
语法:select “字段” from “表名” where “条件1” {[and|or] “条件2”}+ ;
select sales from store_info where sales > 500 and sales < 1000;
select sales from store_info where sales > 500 or sales < 1000;
5、in
显示已知的值的数据记录
语法:select “字段” from “表名” where “字段” in (‘值1’, ‘值2’, …);
select * from store_info where storm_name in ('Los Angeles','Houston');
6、between
显示两个值范围内的数据记录
语法:select “字段” from “表名” where “字段” between ‘值1’ and ‘值2’;
select * from store_info where date between '2020-12-05' and '2020-12-10';
7、通配符
通常通配符都是跟 LIKE 一起使用的
% | 百分号表示零个、一个或多个字符 |
---|---|
_ | 下划线表示单个字符 |
‘A_Z’ | 所有以 ‘A’ 起头,另一个任何值的字符,且以 ‘Z’ 为结尾的字符串。例如,‘ABZ’ 和 ‘A2Z’ 都符合这一个模式,而 ‘AKKZ’ 并不符合 (因为在 A 和 Z 之间有两个字符,而不是一个字符)。 |
---|---|
‘ABC%’ | 所有以 ‘ABC’ 起头的字符串。例如,‘ABCD’ 和 ‘ABCABC’ 都符合这个模式。 |
‘%XYZ’ | 所有以 ‘XYZ’ 结尾的字符串。例如,‘WXYZ’ 和 ‘ZZXYZ’ 都符合这个模式。 |
‘%AN%’ | 所有含有 'AN’这个模式的字符串。例如,‘LOS ANGELES’ 和 ‘SAN FRANCISCO’ 都符合这个模式。 |
‘_AN%’ | 所有第二个字母为 ‘A’ 和第三个字母为 ‘N’ 的字符串。例如,‘SAN FRANCISCO’ 符合这个模式,而 ‘LOS ANGELES’ 则不符合这个模式。 |
like:用于匹配模式来查找资料
语法:select “字段” from “表名” where “字段” like{模式};
select * from store_info where storm_name like 'Los%';
select storm_name from store_info where storm_name like 'Los%';
8、order by
按关键字排序
语法:select “字段” from “表名” [where “条件”] order by “字段”[ASC, DESC];
select sales,date,storm_name from store_info order by sales desc;
-
#ASC 是按照升序进行排序的,是默认的排序方式。
-
#DESC 是按降序方式进行排序。
SELECT Store_Name,Sales,Date FROM Store_Info ORDER BY Sales DESC;==
9、函数
数学函数
abs(x) | 返回 x 的绝对值 |
---|---|
rand() | 返回 0 到 1 的随机数 |
mod(x,y) | 返回 x 除以 y 以后的余数 |
power(x,y) | 返回 x 的 y 次方 |
round(x) | 返回离 x 最近的整数 |
round(x,y) | 保留 x 的 y 位小数四舍五入后的值 |
sqrt(x) | 返回 x 的平方根 |
truncate(x,y) | 返回数字 x 截断为 y 位小数的值 |
ceil(x) | 返回大于或等于 x 的最小整数 |
floor(x) | 返回小于或等于 x 的最大整数 |
greatest(x1,x2…) | 返回集合中最大的值,也可以返回多个字段的最大的值 |
least(x1,x2…) | 返回集合中最小的值,也可以返回多个字段的最小的值 |
select abs(-1), rand(), mod(5,3), power(2,3), round(1.89);
select round(1.8937,3), truncate(1.235,2), ceil(5.2), floor(2.1), least(1.89,3,6.1,2.1);
字符串函数
trim() | 返回去除指定格式的值 |
---|---|
concat(x,y) | 将提供的参数 x 和 y 拼接成一个字符串 |
substr(x,y) | 获取从字符串 x 中的第 y 个位置开始的字符串,跟substring()函数作用相同 |
substr(x,y,z) | 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串 |
length(x) | 返回字符串 x 的长度 |
replace(x,y,z) | 将字符串 z 替代字符串 x 中的字符串 y |
upper(x) | 将字符串 x 的所有字母变成大写字母 |
lower(x) | 将字符串 x 的所有字母变成小写字母 |
left(x,y) | 返回字符串 x 的前 y 个字符 |
right(x,y) | 返回字符串 x 的后 y 个字符 |
repeat(x,y) | 将字符串 x 重复 y 次 |
space(x) | 返回 x 个空格 |
strcmp(x,y) | 比较 x 和 y,返回的值可以为-1,0,1 |
reverse(x) | 将字符串 x 反转 |
10、group by
- by后面的栏位的查询结果进行汇总分组,通常是结合聚合函数一起使用的
- group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在group by后面。
语法:select 字段1,sum(字段2) from表名 group by 字段1;
select store_name,sum(sales) from store_info select 字段1,wum(字段2) from 表名 group by 字段1;
11、having
- 用来过滤由group by语句返回的记录集,通常与group by语句联合使用。
- having语句的存在弥补了where关键字不能与聚合函数联合使用的不足。如果被select的只有函数栏,那就不需要group by子句。
语法:select 字段1,sum(字段2) from 表名 group by 字段1 having(函数条件);
select site,count(money),sum(money),date from from group by site having sum(money) >=700;
12、别名
字段别名、表格别名
select location.store_name from location,store_info where location.store_name = store_info.store_name;
13、子查询
连接表格,在WHERE 子句或HAVING 子句中插入另一个SQL 语句
SELECT 字段1 FROM 表格1 WHERE 字段2 [比较运算符] #外查询
(SELECT 字段1 FROM 表格2 WHERE 条件) #内查询
- 可以是符号的运算符
例:=、>、<、>=、<= - 也可以是文字的运算符
例:LIKE、IN、BETWEEN
select A.site,region from REGION AS A where A.site in
(select B.site from FARE AS B where money<2000);
select B.site,money,date from FARE AS B where site in
(select A.site from REGION AS A where region = 'north');
13、EXISTS
- 用来测试内查询有没有产生任何结果,类似布尔值是否为真
- 如果有的话,系统就会执行外查询中的SQL语句,若是没有,那整个SQL语句就不会产生任何结果。
语法:
SELECT 字段1 FROM 表1 WHERE EXISTS (SELECT * FROM 表2 WHERE 条件);
例:
select region from REGION where exists (select * from FARE where money = '700');
二、MySQL高阶进阶SQL语句2
环境准备(2)
use kgc;
create table location (Region char(20),Store_Name char(20));
insert into location values('East','Boston');
insert into location values('East','New York');
insert into location values('West','Los Angeles');
insert into location values('West','Houston');
create table store_info (Store_Name char(20),Sales int(10),Date char(10));
insert into store_info values('Los Angeles','1500','2020-12-05');
insert into store_info values('Houston','250','2020-12-07');
insert into store_info values('Los Angeles','300','2020-12-08');
insert into store_info values('Boston','700','2020-12-08');
select * from location;
select * from store_Info
1、连接查询
- 内连接 inner join: 只返回两个表中联结字段相等的行
- 左连接 left join:返回包括左表中的所有记录和右表中联结字段相等的记录
- 右连接 right join :返回包括右表中的所有记录和左表中联结字段相等的记录
内连接1 inner join
语法:select 字段 from 表名1 表别名1 inner join 表名2 表别名2 on 表别名1.联结字段 = 表别名2.联结字段;
例:
select * from location A inner join store_info B on A.store_name = B.store_name ;
内连接2 inner join(using)函数
语法:select 字段 from 表名1 inner join 表名2 using(联结字段);
例:
select * from location inner join store_info using(store_name}; #必须保证要查询的交集字符字段名一样才可以
左连接 left join
语法:select 字段 from 表1 表别名1 left join 表2 表别名2 on 表别名1.联结字段1 = B.联结字段2 ;
例:
select * from location A left join store_info B on A.store_name = B.store_name ;
右连接 right join
语法:select 字段 from 表1 表别名1 right join 表2 表别名2 on 表别名1.联结字段1 = 表别名2.联结字段2;
例:
select * from location A right join store_info B on A.store_name = B.store_name ;
多表查询
语法:
select 字段 from 表1,表2 where 表1.联结字段 = 表2.联结字段;
2、create view 视图
视图,可以被当作是虚拟表或存储查询
- 视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
- 临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
- 视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。
语法:create view "视图表名" AS "select 语句";
例子
create view v_aa 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;
3、union联集
将两个SQL语句的结果合并起来,两个SQL语句产生的字段需要是同样的资料种类
- UNION:生成结果的资料值将没有重复,且按照字段的顺序进行排序。
语法:
select 语句1 union select 语句2;
- union all:将生成结果的资料值都列出来,无论有无重复
语法:select 语句1 union all select 语句2;
4、交集值
取两个SQL语句结果的交集
- 内连接查询
- 左连接查询交集字符
- 右连接查询交集字符
5、无交集值
显示第一个SQL语句的结果,且与第二个SQL语句没有交集的结果,还不能重复
- 子查询无交集
- 左连接查询无交集
-右连接查询无交集
六、case
是 SQL 用来做为 if-then-else之类逻辑的关键字
语法:
select case("字段名")
--> when "条件1" then "结果1"
--> when "条件2" then "结果2"
...
[lese "结果N"]
END
FROM "表名";
# "条件" 可以是一个数值或是公式。 ELSE 子句则并不是必须的。
例子:
select store_name, case store_name
when 'Los Angeles' then sales * 2
when 'Boston' then 2000
else sales end "New sales",date from store_Info;
#"New sales" 是用于 case那个字段的字段名。
七、空值(NULL) 和 无值(‘’) 的区别
- 无值的长度为 0,不占用空间的;而 NULL 值的长度是 NULL,是占用空间的。
- IS NULL 或者 IS NOT NULL,是用来判断字段是不是为 NULL 或者不是 NULL,不能查出是不是无值的。
- 无值的判断使用='‘或者<>’'来处理。<> 代表不等于; !=也代表不等于。
- 在通过 count()指定字段统计有多少行数时,如果遇到 NULL 值会自动忽略掉,遇到无值会加入到记录中进行计算。
(1)使用length函数查看字符的长度
-
null长度就为null
-
字符1234的长度就为4
-
空值的长度为0
select length(null), length('1234'), length('');
(2)查看表里面字符为null的行和不为null的行
语法:
select 字段 from 表名 where 字段 is null;
select 字段 from 表名 where 字段 is not null;
例:
select * from cs where name is null;
select * from cs where name is not null;
(3)查看空值的行和不为空值的行
语法:
select 字段 from 表名 where 字段 = '';
select 字段 from 表名 where 字段 != '';
select 字段 from 表名 where 字段 <> '';
例:
select * from cs where name = '';
select * from cs where name <> '';
select * from cs where name != '';
(4)统计所有的行数和忽略为null值的行
语法:
select count(*) from 表名;
select count(name) from 表名;
例子
select count(*) from cs;
select count(name) from cs;
正则表达式
匹配模式 | 描述 | 实例 |
---|---|---|
^ | 匹配文本的开始字符 | ‘^bd’ 匹配以 bd 开头的字符串 |
$ | 匹配文本的结束字符 | ‘qn$’ 匹配以 qn 结尾的字符串 |
. | 匹配任何单个字符 | ‘s.t’ 匹配任何 s 和 t 之间有一个字符的字符串 |
* | 匹配零个或多个在它前面的字符 | ‘fo*t’ 匹配 t 前面有任意个 o |
+ | 匹配前面的字符 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 {模式};
(1)匹配以es结尾的字符串的字段
select * from store_info where store_name regexp 'es$';
(2)匹配字符串里包含to的字段
select * from store_info where store_name regexp 'to';
(3)匹配字符串以A-G开头的字段
select * from store_info where store_name regexp '^[A-G]';
(4)匹配字符串以 HO | Bo 开头的字段
select * from store_info where store_name regexp 'Ho|Bo';
MySQL存储过程
存储过程的概念
-
存储过程是一组为了完成特定功能的SQL语句集合。
-
存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。
存储过程的优点
- 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
- SQL语句加上控制语句的集合,灵活性高
- 在服务器端存储,客户端调用时,降低网络负载
- 可多次重复被调用,可随时修改,不影响客户端调用
- 可完成所有的数据库操作,也可控制数据库的信息访问权限
创建存储过程
语法:
delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
create procedure cs() #创建存储过程,过程名为Proc,不带参数
-> begin #过程体以关键字 begin开始
-> select * from store_info; #过程体语句
-> end $$ #过程体以关键字 end 结束
delimiter ; #将语句的结束符号恢复为分号
##调用存储过程##
call cs;
查看存储过程
存储过程的参数
- IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
- OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
- INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
in
out
inout
删除存储过程
- 存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。
语法:
DROP PROCEDURE IF EXISTS Proc; #仅当存在时删除,不添加 IF EXISTS 时,如果指定的过程不存在,则产生一个错误
存储过程的控制语句
- if
- while
if:
while:
(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;