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 或函数等处理过的字段,则不可以直接修改视图表的数据。

你可能感兴趣的:(sql,数据库)