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注入。

 

posted @ 2012-12-26 13:21  翔宇后生  阅读(230)  评论(0编辑  收藏  举报