#三表联合查询:查询患者信息:患者表,关联详情表,关联家庭表
select p.*,d.*,f.* from patient p
join patient_detail d on d.id = p.patient_detail_id
join patient_family f on f.id = p.patient_family_id
where p.id = #{id}
#条件书写(记录过滤):where 字段 条件
操作符、两者之间、满足之一、模糊、空值、否定
where name='张三';
where salary>=5000 and salary<=10000;
where salary between 5000 and 10000;
where position='Manager' or position='Analyst';
where position in('Manager','Analyst',null); //使用in时,列表项中有空值对结果没有影响
where ename like '%张%'; //模糊查询
where position like '_a%'; //模糊查询
where bonus is null; //没有奖金
where bonus is not null; //有奖金
where salary not between 5000 and 10000;//薪水不在5000到10000之间
where deptno!=20 and deptno!=30; //不是20号部门和30号部门
where deptno not in(20,30); //不是20号部门和30号部门,列表项中有空值有影响
#操作符
= 等于
> 大于
>= 大于等于
< 小于
<= 小于等于
!=或<> 不等于
and 并且
or 或者
#介于两者之间
between 低值 and 高值 肯定形式:[低值,高值]
#满足之一
in(列表项):判断等于列表项中任意一项,即满足一个即可
#模糊查询
like 占位符:_表示1个字符,%表示0到多个字符
#空值判断
测试空值时,肯定使用is null,否定使用is not null
#否定 not
空值null
a.空值参与算术运算结果为空
b.空值参与连接操作结果为空
c.任何数据类型都可以取空值(insert)
排序书写:order by 字段 规则
#排序书写:order by 字段 规则(升序asc|降序desc)
order by salary asc;//升序(小到大):薪水从低到高进行排序
order by deptno asc,salary desc;//字段名 按照部门号升序,同一个部门按照薪水降序查询信息
order by d asc,s desc; //列别名
order by 1 asc,2 desc; //数字
order by convert(ename using gbk); //按照首个字母排序
分组书写:group by 字段名
#分组书写:group by 字段名
#查询每个部门的最高薪水和最低薪水,要求没有部门的不算在内
select deptno,max(salary),min(salary) from emp_xu where deptno is not null
group by deptno;
#查询每个部门的薪水总和和平均薪水,要求没有部门的不算在内
select deptno,sum(salary),avg(ifnull(salary,0)) avg_salary from emp_xu where deptno is not null
group by deptno;
#按照职位分组,每个职位的最高薪水、最低薪水、人数总和,要求没有职位的不算在内
select position,max(salary),min(salary),count(*) from emp_xu where position is not null
group by position;
#select后面内容,要么被组函数包围,要么出现在group by后面的。
#group_concat:处理分组中一对多数据
select position,group_concat(ename) from emp_xu where position is not null group by position;
再过滤书写:having 字段 条件
#再过滤书写:having:对分组之后的数据再进行过滤
#查询平均薪水大于5000的部门和其平均薪水,没有部门不算在内
select deptno,avg(ifnull(salary,0)) avg_salary from emp_xu where deptno is not null
group by deptno
having avg_salary>5000;
#查询薪水总和大于20000的部门号和其薪水总和,要求没有部门的不算在内
select deptno,sum(salary) from emp_xu where deptno is not null
group by deptno
having sum(salary)>20000;
#查询哪些职位的人数超过2个人,没有职位的不算在内,计算每个职位的平均薪水并且按照平均薪水升序排列
select position,count(*),avg(ifnull(salary,0)) avg_salary from emp_xu
where position is not null
group by position
having count(*)>2
order by avg_salary asc;
#总结:基础查询(6个子句)
写法顺序:select->from->where->group by->having->order by
执行顺序:(分析)from(指定表)->where(记录过滤)->group by(分组)->having(分组后过滤)->select(结果集)->order by(排序)
指定表:from 表名
form 表A; //指定一张表
form 表A join 表B on 条件; //指定两张表
form 表A join 表B on 条件 join 表C on 条件; //指定三张表