MySQL进阶SQL语句
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 或函数等处理过的字段,则不可以直接修改视图表的数据。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!