欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > MySQL的高阶语法

MySQL的高阶语法

2024/10/24 21:24:28 来源:https://blog.csdn.net/2402_84868182/article/details/140616332  浏览:    关键词:MySQL的高阶语法

MySQL的高阶语句:

高级语法的查询语句:

select * from 表名 where

limits

distinct 去重查询

like 模糊查询

排序语法:关键字排序

升序和降序

默认的排序方式就是升序

asc 升序 desc 降序 配合order by 语法;

select * from  表名   order  by   列名;    升序排列
select * from  表名   order  by   列名   desc  ;   降序排列
select * from  表名   order  by   列名 desc , 列名 ; 指定多个列名排序

以多个列作为排序关键字,只有第一个参数有相同的值,第二个字段才有意义。

where条件的筛选功能(比较符号)

区间判断:

and or

select * from  表名  where  列名 > 数值  and  列名  <= 数值;
select * from  表名  where  列名 > 数值  or  列名  <= 数值;

嵌套多条件:

select * from info where 列名 > 数值 or  (  列名 > 数值  and  列名 < 数值);

分组查询,sql查询的结果进行分组,使用group by 语句来实现。

group by 语句配合聚合函数一起。

聚合函数的类型:

统计 count

求和 sum

求平均数 avg

最大值 max

最小值 min

select  count(列名1),    列名2     from    表名   group  by  列名2;

用于聚合函数 用于分组

select  count(列名1), 列名2  ,列名1   from    表名   group  by  列名2;这种语法不报错但是是错误的

在聚合函数组语句中,所有的非聚合函数列数,都要在group by 语句当中,正确写法:

select  count(列名1),列名2,列名1   from    表名   group  by  列名2,列名1;
​
在group by 后面加上列名1
select count(列名1),列名2 from info  where 列名3 >=数值 group by 列名2;
select count(列名1),列名2,列名3from info  group by 列名2,列名3 having 列名3 >=数值;

以兴趣这一列作为分组,计算成绩的平均成绩,统计的结果筛选出分组的平均成绩大于等于60分。

select avg(score),hobbid from info group by hobbid having avg(score) >=60;

统计姓名,以兴趣和分数作为分组,统计出成绩大于80的,然后按找降序,对统计姓名的列进行。

select count(name),hobbid,score from info group by hobbid,score having score > 80 order by count(name) desc;

limit 1,3 1是位置偏移量(可选参数)如果不设定位置偏移量,默认就是从第一行开始,默认的值是 0

select * from 表名 1,3;

从第一行往下234行

select * from 表名 3;

123行

使用limit和降序排列,只显示最后三行?

select * from info order by id desc limit 3;

表和列的别名:

因为在实际工作中,表的名字和列的名字可能会很长,书写起来不太方便,多次声明表和列时,完整的展示太复杂,设置别名可以使书写简化了,可读性增加了,更加的简洁明了。

对列起别名

第一种:带as

select 列名1 as  别名1,列名2  as  别名2  from  表名;

第二种:不带as

select 列名 1 别名1, 列名2  别名2  from  表名;

对表名起别名

select i.列名1  别名2,i.列名2  别名2  from  info as i;
​
select i.列名1  别名2,i.列名2  别名2  from  info   i;

对表进行复制:

create  table  表名1  as  select * from  表名2;
主键的约束是复制不了的

对表进行筛选式的复制:

create table 表名1 as select * from 表名2 where score >=60;

通配符:

like 模糊查询

%:表示0个,一个或者多个字符 *

_下划线:表示单个字符

select * from 表名 where 列名   like  's%'
​
select * from 表名 where 列名   like  's_'

也可以结合起来一起用

select * from 表名 where 列名  like  's%_'

(重要)子查询:内查询,嵌套查询,select语句当中又嵌套一个select

嵌套的select才是子查询,先执行子查询的语句,外部的select再根据子条件的结果进行过滤查找。

子查询可以是多个表,也可以是同一张表。

关联语句 in ,not in

select (select)

select 列名3,列名1,列名2 from  表名  where 列名3 in ( select 列名3  from 表名 where 列名2>=数值);

取反

select 列名3,列名1,列名2 from  表名  where 列名3 not in ( select 列名3  from 表名 where 列名2>=数值);

exists:判断子查询的结果是否为空,不为空返回true,空返回false

select  count(*)  from info  where exists (select  id  from  表名  where 列名>数值);

子查询当中多表查询和别名:

两张表id部分相同,然后根据id相同的部分,查询其中一张表的id的值

select avg(a.score) from info a where a.id  in 
(select b.id from bmm b where a.id = b.id);

MySQL的视图:

视图是一个虚拟表,表的数据基于查询的结果生成。

视图可以简化复杂的查询,隐藏复杂的细节。访问数据更安全

视图表是多表数据的集合体。

视图和表之间的区别:

1、存储方式,表是实际的数据行,视图不存储数据,仅仅是查询结果的虚拟表

2、数据更新,更新表可以直接更新视图表的数据。

3、占用空间。表实际占用空间,视图表不占用空间,只是一个动态结果的展示。

视图表的数据可能是这一张表的部分查询数据,也可能是多个表的一部分查询数据。

查询当前数据库中的视图表:

show  full  tables  in  库名  where  table_type  like  'VIEW';

创建视图表

create  view  视图表  as  select  *  from  表名  where   列名  >=数值;

视图表就是查询语句的别名,有了视图表可以简化查询的语句。

表的权限是不一样的,库的权限是有控制的,所以查询视图表的权限相对低,既可以保证原表的数据安全,也简化了查询的过程。

删除视图表:

drop view +视图表名;

面试题:

连接查询:

两张表或者多个表的记录结合起来,基于这些表共同的字段,进行数据的拼接。

首先,要确定一个主表作为结果集,然后把其他表的行有选择性的选定到主表的结果上。

连接的类型:

内连接:两张表或者多张表之间符合条件的数据记录的集合。

inner join

select a.a_id,a.a_name from test1 a inner join test2 b on a.a_name=b.b_name; 

取两个表或者多个表之间的交集。

左连接:左外连接,left join 或者 left outer join

左连接以左表为基础,接收左表的所有行,以左表的记录和右表的记录进行匹配。匹配左表的所有以及右表中符合条件的行,不符合的显示null

select * from test1 a left join test2 b on a.a_name=b.b_name;

以比较条件为标准,展示结果,两个表相同的部分展示出来,做拼接。不同的结果显示null。

右连接:右外连接 right join 或者 right outer join

右连接以左表为基础,接收右表的所有行,以右表的记录和左表的记录进行匹配。匹配右表的所有以及左表中符合条件的行,不符合的显示null

select * from test1 a right join test2 b on a.a_name=b.b_name;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com