MySQL高级(进阶)SQL语句
#显示一个字段或者多个字段的所有内容
SELECT “字段” FROM 表名 ;
#distinct对字段去重查询 (最好只对单个字段进行去重)
SELECT DISTINCT 字段名 FROM 表名
#where 有条件查询
SELECT “字段” FROM 表名 WHERE 条件(例如:sales <=>!= 100);
#and or 查看多个条件
SELECT “字段” FROM 表名 WHERE 条件(例如:sales <=>!= 100)or/and sales <=>500 ;
SELECT “字段” FROM 表名 WHERE 条件(例如:sales <=>!= 100)or (sales >200 and sales <500 ); #查找销售额大于1000或者大于200小于500的
#in 显示已知的值的数据记录
SELECT “字段” FROM “表名” WHERE ‘字段名’ in ('xxx',''yyy');
SELECT “字段” FROM “表名” WHERE ‘字段名’not in ('xxx',''yyy');
#between 显示两个值范围内的数据
SELECT 字段 FROM 表名 WHERE 字段 BETWEEN xxx and yyy ; #包含xxx和yyy的值,也可以是时间 (SELECT 字段 FROM 表名 WHERE DATE BETWEEN '2020-12-05' and '2020-12-08')
---------通配符-------通常与LIKE一起使用
%:百分号表示零个、一个或者多个字符
_: 下划线表示单个字符
'A-Z':所有以‘A’起头,另一个任何值的字符,且以‘Z’为结尾的字符串。例如‘ABZ’和‘A2Z’
‘ABC%’:所有以ABC开头的字符串
‘%XYZ’:所有以XYZ结尾的字符串
‘%ABC%’:所有含有ABC字符的的字符串
‘_AN%’:所有第二个字母为A,第三个字母为N的字符串,例如‘SAN FRANCISCO’
SELECT STORE_NAME,DATE,SALES FROM STORE_INFO WHERE STORE_NAME LIKE 'LO%';
----------ORDER BY -----------按关键排序
SELECT “字段” FROM “表名” [WHERE '条件'] ORDER BY ‘字段’[ASC,DESC]
#ASC 是按照升序进行排序的,默认排序方式就是升序
#DESC 是按照降序进行排序的
--------------------函数-------------------------
数学函数:
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,x3...):返回集合中最大的值,也可以返回多个字段的最大的值
♢least(x1,x2,x3...):返回集合中最小的值,也可以返回多个字段的最小的值
聚合函数:
♢avg():返回指定列的平均值
♢count():返回指定列中非NULL值的个数
♢min():返回指定列的最小值
♢max():返回指定列的最大值
♢sum(x):返回指定列的所有值纸盒
♢count(*):所有字段行数,不忽略NULL行
字符串函数:
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的所有字母变成大写字母
left(x,y):返回字符串x前y个字符
right(x,y):返回字符串x后y个字符
repeat(x,y):将字符串x重复y次
space(x):返回x个空格
srcmp(x,y):比较x和y,返回的值可以为-1,0,1
reverse(x):将字符串x反转
字符串分片 select substr('123456789',4,3); 为456,第四个开始后面三个
select trim (leading ' xx ' from 'xx yy'); 从xx yy中移除xx
select trim (trailing' yy ' from 'xx yy'); 从xx yy中移除yy
--------------GROUP BY ---------------------
group by 有一个原则,凡是在group by后面出现的字段,必须在select后面出现;
凡是在select后面出现的,且未在聚合函数中出现的字段,必须出现在group by后面
SELECT STORE_NAME,SUM(SALES) FROM STORE_INFO GROUP BY STORE_NAME ORDER BY SALES DESC;
#分组也有去重功能
#group by分组之后,不再能使用where语句进行过滤
----------------HAVING------------------------
通常和group by一起使用,对group by语句之后再进行过滤
select store_name,sum(sales) from store_info where sales < 2000 group by store_name having sum(sales) > 1000;
顺序:先sales小于2000,然后进行分组,然后对sales进行求和,最后having对求和大于1000进行过滤
SQL语句执行顺序:
--------------别名---------------------
select region,replace(region,'st','stion') as new_region,store_name from location as A;
原字段 as 别名 , 可以空格代替as
-----------子查询-------------------
连接表格,在where子句或having子句中插入另一个SQL语句
select “字段1”FROM “表格1” WHERE “字段2” [比较运算符]like in between #外查询
(select "字段1" FROM“表格2” WHERE “条件”);
#内查询
select sum(sales) from store_info where store_name in (select store_name from location where region='west'); #求西部城市的销售总额
where exists 测试内查询是否有结果,有结果的话,就会执行外查询,并且返回外查询执行结果
----------------连接查询----------------------
inner join(内连接):只返回两个表中联结字段相等的行
left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右连接):返回包括右表中的所有记录和坐标中联结字段相等的记录
select * from location A inner join store_info B on A.store_name=B.store_name;
-----------------UNION---------------联集---
将两个SQL语句合并起来,两个SQL语句所产生的字段需要是同样的数据记录种类
UNION:生成结果的数据记录值将没有重复,自动排序
UNION ALL:将生成结果的记录值全合并,不管是否有重复,也不排序
派生表别名:
select A.store_name ,count(A.store_name) from (select distinct store_name from location union all select distinct store_name from store_info) as A group by A.store_name having count(A.store_name) =1; #求无交集
今日总结:
select 字段 ... from 表 where 字段1=/!=/</>/<=/>= [and/or]多条件判断
in/not in (值1,值2,... )/between 值1 and 值2
like '%xxx_'通配符
select 字段....from 表 order by 字段 ASC/DESC
数学函数 round(x,y) truncate(x,y) greatest/least(值1,值2,.... )
聚合函数 sum() avg() max() min() count()
字符串函数 concat()字段拼接 || 开启mode
substr()字符串分片 replace() length()
select 字段,聚合函数(字段) from 表 where xxxx group by 字段 having 条件
别名:select 字段 as别名 from 表 as 别名
select 字段....from 表 where 字段 运算符 (select 字段....from 表 where 字段);
表连接:inner join 、left join 、right join
交集: select 字段 from 左表 A inner join 右表 B on A.字段=B.字段;
using(字段)
select 字段 from 左表 A,右表 B where A.字段=B.字段
select 字段 from左表 where 字段 in (select 字段 fron 右表);
select A.字段 from 左表 left join on A.字段=B.字段 where B.字段 is not null
select A.字段 from (select distinct 字段 from 左表 union all select distinct 字段 from 右表)as A group by A.字段 having count (A.字段)=1;
无交集:select A.字段 from 左表 left join on A.字段 =B.字段 where B.字段 is null
select A.字段 from (select distinct 字段 from 左表 union all select distinct 字段 from 右表) as A group by A.字段 having count (A.字段) =1;