DOS下的MySQL数据库基本操作(续)
基于前面创建的数据库xxx,数据表emp和deparment,我们进行如下的学习和实践
1.统计出平均薪水:select avg(salary) from emp;
除avg();外,MySQL的内置函数还有:max(); min(); sum(); 组函数() 等等。
2.求每个部门的最高薪水
3.排序: select * from emp order by salary;(从高到低) select * from emp order by salary desec; 最后添加desc及时倒序
4.请输出 平均薪水高于 1500的部门 select deparment from emp where avg(salary)>1500; (错误的)
重点:where 只可以对字段本身进行判断操作。
having 专门和group by 配合,专门用于针对组函数的判断操作。
select avg(salary) as s,deparment from emp group by deparment having s>1500;
5.请计算出哪个部门的女生达到2人。
select deparment,count(sex) as csex
from emp where sex=2
group by deparment
having csex>=2;
6.请显示出员工id 员工名字 部门号 部门名称
select e.id,e.name,d.id,d.name from emp as e,deparment as d where d.id = e.deparment;
7.请计算出哪个部门女生达到2人。显示出部门号,部门名称,人数
select e.deparment,d.name,count(e.sex) as s from emp as e,deparment as d where sex=2 and e.deparment = d.id group by e.deparment having s>=2;
笛卡尔集合:1个集合中有9笔记录 一个3笔记录 返回的是 27笔集合。
insert into emp(name,sex,salary,m_id) value('周舟',2,10000,2);
8.请显示出员工id 员工名字 部门号 部门名称
select e.id,e.name,d.id,d.name
from emp as e left join deparment as d
on d.id = e.deparment;
注意:左连接和右连接;驱动表和匹配表的区别
左外链接——左边的表是驱动表,显示出来的数据为:驱动表和匹配表符合条件的所有数据会显示,同时,将驱动表中没有匹配上的数据都显示出来,只不过在没匹配的字段上使用 null
9.查询未分配部门的员工
select * from emp where deparment=null;(出错)
在数据库中 null != null 并且 null不= 任何数据
select * from emp where deparment is null;
is not null;不为空
10.请通过sql语句 显示出 杨十命 和陆九剑 所在部门的所有员工
第一步,先写子查询:
select deparment from emp where name='杨十命' or name='陆九剑';
第二步,再把子查询放入in或not in中:
select * from emp where deparment in (select deparment from emp where name='杨十命' or name='陆九剑');
注意:查询语句返回的数据集可以当做集合。
在有子查询的语句中,我们一般先写子查询后写外部查询
select * from emp where deparment in (2,3,null);
此处,null值可以当任何数
11.请输出 总人力成本高于4000的那个部门的所有员工
select deparment from emp group by deparment having sum(salary) > 4000
select * from emp where deparment in( select deparment from emp group by deparment having sum(salary) > 4000 );
查询低于4000的
select * from emp where deparment not in( select deparment from emp where deparment is not null group by deparment having sum(salary) > 4000 );
12.请问哪些人是领导
select * from emp where m_id in ( select id from emp );
select * from emp where id in( select m_id form emp where m_id is not null );
select e.id,e.name from emp e,emp as m where e.id = m.m_id group by e.id;
--自连接
select distinct e.id,e.name,m.id,m.name from emp e,emp as m where e.id = m.m_id;
13.因为 刘八精的领导有方,所以他的下属增加20%的工资
select e.id from emp as e,emp as m where e.id = m.m_id and e.name='刘八精';
update emp set salary=salary*1.2 where id in(7,8);
14.按照分页要求取数据
select * from emp limit 0,5;
update emp set salary=salary*1.2
where id in(7,8);
0 3
3 6
6 9
select * from emp limit 2-1,3;
15.请查询出每个部门薪水最高的那个 显示为 名字,薪水,部门号,部门名称
'1'='1' 永远为真
select * from emp where name='123' and pwd='456'; select * from emp where '1'='1';
16.关于sql语句的执行次序
select 字段——》3
from 表名——》1
where 字段的判断——》2
group by 对某些字段的分组——》4
having 对组函数的判断——》5
17.再扩展一下
select * from emp
where name='123' and id=123 or '1'='1';
何为sql注入?? 就是开发人员写好的sql语句,但是被使用者通过一定有规律的输入,而使得sql语句变样,达到入侵的效果。
这个就是sql注入。