MySQL多表查询
导入 2 张 数据库 表
查询姓名中包含 “小 ” 的所有的 用户
select * from hzuser where name like ‘%小%’;
排序
排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序,如果存在where子句那么order by必须放到where语句的后面
按照薪水由小到大排序(系统默认由小到大)
select * from hzuser order by usersal;
取得job为 “格格”的用户,按照薪水由小到大排序(系统默认由小到大)
select * from hzuser where job=‘格格’ order by usersal;
如果包含where语句order by必须放到where后面,如果没有where语句order by放到表的后面
select * from hzuser order by where job=‘格格’ order by usersal;
按照多个字段排序,如:首先按照job排序,再按照usersal排序
select * from hzuser order by job,usersal;
手动指定排序顺序
手动指定按照薪水由小到大排序
select * from hzuser order by usersal asc; //记忆口诀 , a 最小 就是 从小到大。 desc 就是 大到小
多个字段排序
按照job和薪水 由大到小排序
select * from hzuser order by job desc, usersal desc;
如果采用多个字段排序,如果根据第一个字段排序重复了,会根据第二个字段排序
分组查询
分组查询主要涉及到两个子句,分别是:group by和having
group by
取得每个工作岗位的工资合计,要求显示岗位名称和工资合计
select job, sum(usersal) from hzuser group by job;
如果使用了order by,order by必须放到group by后面 排序时候注意
select job, sum(usersal) from hzuser group by job order by sum(usersal) ;
having
如果想对分组数据再进行过滤需要使用having子句 (没 group by 就没having )
取得每个岗位的平均工资大于2000
select job, avg(usersal) from hzuser group by job having avg(usersal) >2000;
分组函数的执行顺序:
根据条件查询数据
分组
采用having过滤,取得正确的数据
一个完整的select语句格式如下
select 字段 from 表名 where ……. group by ………having …….(就是为了过滤分组后的数据而存在的—不可以单独的出现) order by ……… 重点
以上语句的执行顺序
1.首先执行where语句过滤原始数据
2.执行group by进行分组
3.执行having对分组数据进行操作
4.执行select选出数据
5.执行order by排序
多表连接
连接查询:也可以叫跨表查询,需要关联多个表进行查询
多表连接的几种方式:
- join on 可以做到表的连接和查询条件分离,特别是多个表进行连接的时候
示例:显示 工资 大于2000的 用户 信息,并显示所属的 阶级 名称
select hz.hname, hz.usersal, j.jname from hzuser hz join jieji j on hz.jiejinum=j.jiejinum where hz.usersal>2000; - 右连接:right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录;
select hz.hname, hz.usersal, j.jname from hzuser hz right join jieji j on hz.jiejinum=j.jiejinum; - 左连接:left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 ; 用在 商城网站
- inner join(等值连接) 只返回两个表中联结字段相等的行;
from中的子链接
在from语句中使用子查询,可以将该子查询看做一张表
查询 用户 信息,查询哪些人是 领导,要求显示出其会员编号和会员姓名
首先取得领导的编号,去除重复的
select distinct name, manager from hzuser where manager is not null;
方法一:
select hz.hzusernum, hz.name from hzuser hz, (select distinct name, manager from hzuser where manager is not null) m where hz.hzusernum=m.manager;
方法二:
select hz.hzusernum, hz.name from hzuser hz join (select distinct name, manager from hzuser where manager is not null) m on hz.hzusernum=m.manager;
union可以合并集合(相加)
1、查询job包含 ‘格格’ 和包含 '备胎’的员工
select * from hzuser where job in(‘格格’, ‘备胎’);
2、采用union来合并
select * from hzuser where job=‘格格’
union
select * from hzuser where job=‘备胎’
limit的使用
MySql提供了limit ,主要用于提取前几条或者中间某几行数据
select * from table limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。
select * from tablename limit 2,4
即取出第3条至第6条,4条记录
m 从第几条开始-- 从0开始
n 条数