mysql高阶语句

1.对结果排序
SELECT id,name,score FROM info; #由于对id设置了主键约束,默认排序按id的大小升序排序
select name,score from info order by score; #默认按升序(从小到大排序)
select name,score from info order by score DESC; #加了DESC就是降序排序(从大到小)
select name,score from info order by id,hobbid; #可以用多个字段进行排序,但是必须是第一个字段有相同的值时,第二个字段才有意义
2.区间判断,结合where
and 表示逻辑且,and的所有条件都要为真
or 表示逻辑或,只要有一个条件满足即为真
select * from info where score > 80 and score <=90; #在80~90分内
select * from info where score < 80 or score >90; #小于80分或者大于90分


区间嵌套
select * from info where score > 80 and ( score > 90 and score <95 );
#先满足外面的大于80,再满足括号里的在90~95内
3.分组查询group by
group by 都是和聚合函数一起使用的
count ( ) 统计行数
sum ( ) 求和
avg ( ) 取平均值
max ( ) 最大值
min ( ) 最小值
select count(name),hobbid from info group by hobbid; #统计每个爱好有多少人
#注意
不要使用聚合函数的字段来进行分组
要是有多个字段,按照非统计的字段来进行分组
#分组后面不能再跟where来过滤,只能用having语句,但是可以在分组之前使用where语句
select avg(score) ,hobbid from info group by hobbid HAVING avg(score) > 80;
#根据hobbid分组,计算平均分数,再用having语句来进行过滤,过滤出平均分数大于80的
4.limit和distinct
SELECT * from info ORDER BY score DESC LIMIT 3; #显示前三名高分
select distinct hobbid from info;
5.设置别名
select name as 姓名,score as 成绩 from info;
as就是用来起别名的命令,当表名和列名过长的时候,可以使用别名进行替代
尤其是在多表联查时,可以不用申明表名
select sex 性别,score 成绩 from info;
#as不一定要加
创建表时,根据另一张表的结果,直接创建
create table info1 as select * from info where score > 90;
#不能继承完整的表结构

6.通配符
% 表示0个,1个,多个字符
_ 表示单个字符
通配符一般是和like一起使用,并且配合where条件进行过滤
select id,name,score from info where name like '_徐';
#必须徐前面有1个字节才能匹配
select id,name,address from info where address like '%西路%';
#模糊匹配,address包含西路


7.子查询
又叫内查询或者叫嵌套查询,就是在查询语句当中又嵌套这另外一个select
先查询子语句,然后把子语句的结果再传给外面进行执行
select where ... ( select ... )
子查询的表可以是同一张表,也可以是不同的表
select name,score
from info
where id in ( select id from info where score > 85 ); #id的范围是分数大于85的
#如果在in 前面加上not就是取反
#多表联查不要超过3张


exists语句,判断子查询的结果集是否为空
不指定字段名称时,可以不使用group by
select count(*) from info where exists( select id from info where score > 85);
#判断返回的结果是真还是假
9.视图表
视图是一个虚拟表,数据是基于检索的查询结果
作用是把复杂的查询语句简单化的呈现给用户
查询视图就可以获取数据,避免找到真正的表,提高了数据安全。
create view test1 as select * from info where score > 65; #生成视图表
drop view test1; #删除视图表
view和table之间的区别
- 存储方式,表都是实际数据,保存在硬盘,视图存储的不是数据行,而是结果的集合。
- 数据更新,更新表可以更新视图,更新视图也可以更新表,一般情况下,视图仅仅用于展示数据。
- 占用空间,表是实际空间,视图不占用数据库的空间,就是一个结果。
9.连接查询
create table test1 (
a_id int(11) default null,
a_name varchar(32) default null,
a_level int(11) default null);
create table test2 (
b_id int(11) default null,
b_name varchar(32) default null,
b_level int(11) default null);
insert into test1 values (1,'aaaa',10);
insert into test1 values (2,'bbbb',20);
insert into test1 values (3,'cccc',30);
insert into test1 values (4,'dddd',40);
insert into test2 values (2,'bbbb',20);
insert into test2 values (3,'cccc',30);
insert into test2 values (5,'eeee',50);
insert into test2 values (6,'ffff',60);
内连接 inner join
把两个或者三个表的记录行结合起来,基于这些表之间共同的字段,进行数据的拼接,首先确定一个主表的结果集(主表的列),然后把其他表的行进行选择性的连接到主表的结果上。
select a.a_id,a.a_name from testl a INNER JOIN test2 b on a.a_id=b.b_id;

左连接 left join
左外连接,在from之后使用left join 或者 LEET OUTER JOIN 用关键字来匹配左连接以左侧表为基础,接受左表所有的行,并用这些行,与右表一起参与,显示左表以及右表符合条件的行,不满足的显示为null。
select * from testl a left join test2 b on a.a_level=b.b_level;
#在left左边就是左表,左表显示全部,右表就显示两个表相交的部分

右连接 right join
右外连接,在from之后使用right join 或者 RIGHT OUTER JOIN 用关键字来匹配,右连接以右侧表为基础,接受右表所有的行,并用这些行,与左表一起参与,显示右表以及左表符合条件的行,不满足的显示为null。
select * from test1 a RIGHT JOIN test2 b on a.a_level=b.b_level;
