MySQL进阶SQL语句以及存储的过程

本文介绍了SQL的基础查询语句,包括SELECT,DISTINCT,WHERE,AND,OR,IN,BETWEEN,LIKE,ORDERBY,GROUPBY,HAVING等,以及相关的操作如别名、子查询、联接、视图、存储过程和正则表达式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、select

显示表格种一个或数个字段的所有数据记录

语法:select "字段" from "表名";

2、distinct

不显示重复的数据记录

语法:select distinct "字段" from "表名";

3、where

有条件查询

语法:select "字段" from "表名" where "条件";

条件:!=、=、<、<=、>、>=、

SELECT Store_Name FROM Store_Info WHERE Sales>1000;
SELECT Store_Name FROM Store_Info WHERE Sales<1000;
SELECT Store_Name FROM Store_Info WHERE Sales=1000;

4、and   /   or  

and(并且)、or(或者)

语法:select  "字段" from  "表名"  where "条件1"  {[and|or] "条件2"} ;

SELECT Store_Name FROM Store_Info WHERE Sales > 1000 OR (Sales < 500 AND Sales > 200);

5、IN

显示已知的值的资料

语法:SELECT 字段 FROM 表名 WHERE 字段 IN (‘值1’,‘值2’,……);

select * from Store_info where store_name in ('los angeles','houston');

7、between

显示两个值范围内的资料

语法:select 字段 from 表名 where 字段 between ‘值1’ and ‘值2’;

select * from Store_info where date between '2020-12-06' AND '2020-12-10';

8、通配符、LIKE

通常通配符都是跟LIKE一起使用

%:百分号表示零个、一个或多个字符 _:下划线表示单个字符

like:用于匹配模式来查找资料

语法:select   字段 from 表名 where 字段 like ‘模式’;

SELECT * FROM Store_Info WHERE Store_Name like '%os%';
'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' 则不符合这个模式。

9、order by

按关键字排序

语法:select 字段 from 表名 where 条件 order by 字段 [ASC,DESC];

asc:按照升序进行排序,默认的排序方式

desc:按照降序进行排序

select store_name,sales,date from store_info order by sales desc;

函数

1、数学函数

数学函数:
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...)返回集合中最小的值,也可以返回多个字段的最小的值

2、聚合函数

聚合函数
avg(字段)返回指定列的平均值
count(字段)返回指定列中非 NULL 值的个数,(*)则不会回来NULL值
min(字段)返回指定列的最小值
max(字段)返回指定列的最大值
sum(字段)返回指定列的所有值之和

3、字符串函数

字符串函数
trim()返回去除指定格式的值
concat('x','y')将提供的参数 x 和 y 拼接成一个字符串
substr('x','y')获取从字符串 x 中的第 y 个位置开始的字符串
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,返回的值相等(0),左边大(返回-1)右边大(返回1)
reverse('x')将字符串 x 反转

4、||连接符

#如sql_mode开启了PIPES_AS_CONCAT,"||"视为字符串的连接操作符而非或运算符,
  和字符串的拼接函数Concat相类似,这和Oracle数据库使用方法一样的


SELECT Region || ' ' || Store_Name FROM location WHERE Store_Name = 'Boston';

5、group by

BY后面的栏位的查询结果进行汇总分组,通常是结合聚合函数一起使用的

GROUP BY 有一个原则,就是 SELECT 后面的所有列中,没有使用聚合函数的列,必须出现在GROUP BY后面

语法:SELECT 字段1,SUM(字段2) FROM 表名 GROUP BY 字段1;

select Store_Name,sum(Sales) from Store_Info group by Store_Name order by Sales desc;

6、having

用来过滤由GROUP BY语句返回的记录集,通常与GROUP BY语句联合使用。 HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。如果被SELECT的只有函数栏,那就不需要GROUP BY子句

语法:select 字段1,SUM(字段2) FROM 表名 GROUP BY 字段1 HAVING(函数条件);

select Store_Name,sum(Sales) from Store_Info group by Store_Name having sum(Sales)>1500;

根据group by分组后的结果再进行条件过滤

7、别名

字段别名、表格别名

select 字段 AS 字段别名 from 表 AS 表别名

语法:SELECT “表格別名”.“字段1” [AS] “字段1別名” FROM “表格名” [AS] “表格別名”;

select A.Store_Name Store,sum(A.Sales) "Totol Sales" from Store_Info A group by A.Store_Name;

8、子查询

select A.字段 from 左表 A where A.字段 in (select B.字段 from 右表 B);

9、内查询和外查询

select 字段 from 表 where 字段 运算符 (select 字段 from 表 where 字段);
外查询                                 内查询(内查询的结果会作为外查询的条件来使用)

10、exists

用来测试内查询有没有产生任何结果

如果有的话,系统会执行外查询中的SQL语句,如果没有,那整个SQL语句就不会产生任何结果

语法:

select '字段1' from '表格1' where exists (select * from '表格2' where '条件');

外查询                                     内查询(若不成立则整个语句失效)

表连接

inner join(内连接):
只返回两个表的字段相等的行记录

left join(左连接):
返回左表所有的行记录和右表字段相等的行记录 ,不相等的行返回null

right join(右连接):
返回右表所有的行记录和左表字段相等的行记录,不相等的行返回null

union:
联集,将两个select查询语句的结果合并,并去重。

union all:
联集,将两个select查询语句的结果合并,不去重。

union&union all

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

union :生成结果的数据记录值将没有重复,且按照字段的顺序进行排序

语法:
[SELECT 语句 1] UNION [SELECT 语句 2];

求交集

select A.字段 from 左表 as A inner join 右表 as B on A.字段 = B.字段;

求左表无交集

select A.字段 from 左表 as A left join 右表 as B on A.字段 = B.字段 where B.字段 is null;

求右表无交集

select B.字段 from 左表 as A left join 右表 as B on A.字段 = B.字段 where A.字段 is null;

求两个表无交集

把求左表右表无交集的方法中间加union

select A.字段  from  左表  as A left  join  右表 as B  on  A.字段 = B.字段 where B.字段 is null,
​
union,
​
select B.字段  from  左表  as A left  join  右表 as B  on  A.字段 = B.字段 where A.字段 is null;

多表查询

select A.字段 from 左表 A, 右表 B where A.字段 = B.字段;

视图表

create view  视图表名  as select distinct 字段 from 左表 union all select distinct 字段 from 右表;


select 字段 from 视图表名 group by 字段 having count(字段) = 1;



create view  视图表名  as  select语句;

面试题

视图表的数据是否能修改?

视图表保存的是select查询语句的定义

如果select语句查询的字段是没有被处理过的源表字段,则可以通过视图表修改源表数据。

如果select语句查询的字段被group by 或函数等处理过的字段,则不可以直接修改视图表的数据。

如何批量插入数据

脚本:
a=0
while [ $a -le 100000]
do
  mysql -uroot -pabc123 -e "insert into 库.表 values(……)"
   let a++
done



delimiter $$

create procedure proc7()
begin
declare i int;
set i =1;
create table test03 (id int primary key auto_increment,name varchar (20));
while i <= 100000
do insert int test03 (name) values (concat('student',i));
set i = i+1;
end while;
end$$

delimiter;

call proc7

CASE

是SQL用来做if、then、else之类逻辑的关键字

语法:

select case '字段'

when '值1/条件表达式' then '结果1(值/条件表达式)'

when '值2/条件表达式' then '结果2(值/条件表达式)'

……

else 值或表达式 and AS '字段别名'

END



from 表;

无值null&空值''

空值 null 的长度为null

占用空间;

可以通过字段is null 或字段 is not null 判断是否为null 行;count(字段) 会忽略null行

无值'' 的长度为0

不占用空间;

可以通过字段=''或字段<>''判断是否为无值的行;count(字段)不会忽略无值的行

正则表达式

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

regexp '正则表达式'

存储过程

一组为了完成特定功能的SQL语句集合

存储过程的优点

1.执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率

2.SQL语句加上控制语句的集合,灵活性高

3.在服务器端存储,客户端调用时,降低网络负载,降低服务器的压力

4.可多次重复被调用,可随时修改,不影响客户端调用

5.可完成所有的数据库操作,也可控制数据库的信息访问权限

创建存储过程

1.修改SQL语句

2.创建存储过程

3.把结束符改回分号

4.调用存储过程

查看存储过程

show create procedure 存储过程名;

show procedure status like '存储过程名'\G

存储过程参数(只能用于字段)

in 传入参数

out 传出参数

inout 传入传出参数
create procedure 存储过程名 (in 传入参数名 参数数据类型 out 传出参数名 参数数据类型)

begin

select 字段 into 传出参数 from 表 where 字段 = 传入参数;

end$$

call 存储过程名(参数值|@变量名; @变量名); #传入参数指定的值可以是纯量值,也可以是变量名;传出参数指定的值只能是变量名



create procedure 存储过程名 (inout 参数名 参数数据类型)

begin

select 字段 into 参数名 from 表 where 字段 = 参数名

end$$

set @变量名 = 传入的值;           #设置传入的值

call 存储过程名(@变量名);      #传入产出参数指定的值只能是变量名

select @变量名;                        #查看传出的值

存储过程控制语句

1)条件判断语句:

if 条件表达式 then

SQL语句序列1

else

SQL语句序列2

fi



2)循环语句:

while 条件表达式

do

​     SQL语句序列;

​     set 条件迭代;

end while;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值