mysql高阶语句
mysql高阶语句对复杂条件的查询
1、使用select语句时,如何按照顺序对结果进行排序
select name from info order by score desc;
#我们查询的是name,按照成绩实现升序的操作select id,name from info order by score desc;
#从大到小排序select name, score from info where address='天津北路' order by id;
#查询 info 表中 address 列值为 '天津北路' 的记录,返回 name 和 score 列,并按照 id 列的升序进行排序。#第一个字段必须要有相同的值,第二个字段才会有意义
select name,scort,hobbid id from info order by hobbid ,id;
#升序
select name,scort,hobbid id from info order by hobbid ,id desc;
#从大到小
练习
查询id,姓名,成绩,根据爱好都是10,按照id的进行降序排序
select id,name,score from info where hobbid=10 order by id desc;
2、区间判断
根据where的条件,来对数据进行逻辑的区分
and or
and:表示逻辑且,and的所有条件都要为真
or:表示逻辑或,只要有一个条件满足即为真
select * from info where score >80 and score <=90;
select * from info where score <80 or score >90;区间嵌套
select * from info where score >80 and (score >90 and score <95);
3、对结果进行分组查询
group by 语句
group by 都是和聚合函数一起使用的
count ()统计行数
sun()求和
ayg()求平均值
max()最大值
min()最小值
select count(name),hobbid from info group by hobbid;
#统计name这列,查询hobbid,根据hobbid进行分组查询
按照爱好来进行分组,求出这些爱好的分数的平均值
select avg(score),hobbid from info group by hobbid;
根据平均值大于85的,进行查询
注意事项:
1、不要使用聚合函数的字段来进行分组
2、要有多个字段,按照非统计的字段来进行分组
3、对聚合函数的结果进行判断,要使用hvaing
练习
1、先根据where条件过滤出成绩大于等于80分,然后查询姓名,性别,按照性别来进行分组,统计姓名
select count(name),sex from info where score >=80 group by sex;2、求出男生组和女生组平均成绩
select avg(score),sex from info group by sex;3、分别求出男生组和女生组的最大值和最小值
select max(score),min(score),sex from info group by sex;4、根据地址进行分组,统计平均成绩大于85分的地址
select avg(score),address from info group by address having avg(score) >85;
4、limit限制和distinct去重**
select * from info order by score desc limit 3;
5、设置别名
select name as 姓名, score as 成绩 from info;
as也可以不加
select name 姓名, score 成绩 from info;
as就是用来起别名的命令,当表名和列名过长的适合可以使用别名进行代替,尤其是在多表联查时,可以不用申明表名
select a.hobbid,a.address,a.sex from info a,info1 b where a.name=b.name;
创建表时,根据另一张表的结果,直接创建,主键的约束无法继承
create table info1 as select * from info where score >90;
6、通配符
%:表示0个,1个多个字符
_:下划线表示的单个字符
通配符一般是和like一起使用,并且时配合where条件进行过滤
select id,name,score from info where name like "徐%";
7、子查询
内查询或者时嵌套查询,就是在查询语句当中又嵌套者另外一个select
先查询子语句,然后把子语句的结果传给主语句进行执行
子查询的表可以是一张表,也可以是不同的表
select name,score from info where id in (select id from info where score > 85);
#前后的条件要一致,多张表联查不要超过3张!!!
练习
更新info表,设置成绩的值是65,根据子查询语句,只修改地址是有南京的记录的值
update info set score=65 where address in (select address from info1 where address like "%南京%");
不能查自己,改自己
8、exists语句
exists语句,判断子查询的结果集是否为空
select count(*) from info where exists (select id from info where score >90);
count(*):不指定字段名称时,可以不使用group by
判断返回的结果是真还是假:
select count(*) from info :
9、视图表
视图表:视图是一个虚拟表,数据基于检索的查询结果,复杂的查询语句,简单化的呈现给用户,查询视图就可以获取数据,避免找到真正的表,提高了数据安全
create view test1 as select * from info where score >65;drop view test1
删除视图表
区别
view和table之间的区别:
1、存储方式,表都是实际数据,保存在硬盘,视图存储的不是数据行,而是结果的集合
2、数据更新,更新表可以更新视图,更新视图也可以更新表,一般情况下,视图仅仅用于展示数据
3、占用空间,表是实际空间,视图不占用数据库的空间,就是一个的结果
10、连接查询
连接查询:把两个或者三个表的记录行结合起来,基于这些表之间共同字段,进行数据的拼接,首先确定一个主表的结果集(主表的列),然后把其他表的行进行选择性的连接到主表的结果上
内连接
结合来个那个表之间基于一个字段或者多个字段之间,将两个表中结果进行组合
语法;inner join
select a.a_id,a.a_name from test1 a inner join test2 b on a.a_id=b.b_id;
左连接
左外连接,在from之后使用left join 或者left outer join用关键字来匹配,左连接以左侧表为基础,接受左表所有的行,并用这些行,与右侧表一起参与,显示左表以及右表符合条件的行,不满足的显示为null
select * from test1 a left join test2 b on a.a_name=b.b_name;
右连接
右外连接,在from之后使用right join 或者right outer join用关键字来匹配,右连接以右侧表为基础,接受右表所有的行,并用这些行,与左侧表一起参与,显示右表以及左表符合条件的行,不满足的显示为null
select * from test1 a left join test2 b on a.a_id=b.b_id;
总结
1、order by 降序 besc 升序
2、使用聚合函数,需要group by
3、别名
4、limit和distinct
5、子查询,先执行子查询,再把子查询的结果传给主查询
6、视图
7、连接查询