扫一扫,加我们为好友有惊喜哦~
-->

核心课程
开班动态
专题服务

您当前所在位置:首页 > 中心动态 >>
[常州网络营销培训]MySql数据操作语句(DML语句)

1、limit:取前n个值
-- 从第0条(1)取数据,取3条数据
select * from emp order by sal desc limit 0,3;

题目:  查询公司平均薪水最高部门的财务岗位的平均薪水。
-- 获取平均薪水最高的部门
select deptno,avg(sal) from emp where deptno is not null group by deptno order by avg(sal) desc limit 0,1;

-- 获取平均薪水最高部门的员工中财务岗位的平均薪水
select avg(sal) from emp
   where job='财务'
   and deptno=(select deptno from emp where deptno is not null group by deptno order by avg(sal) desc limit 0,1);

题目:查询公司中平均薪水最高的部门的总人数。

题目:查询公司中平均薪水最高的部门中薪水最高的员工的入职年数。

2、多表查询
A、等值连接:
a表的某字段引用自b表的另一个字段,如:emp表的deptno字段引用了dept表的deptno字段!

主键(primary key PK):唯一标示一条记录的字段(唯一 + 非空)
外键(foreign key FK):emp表的deptno引用了dept表的deptno,那么emp表的deptno字段称为外键字段!

注意:主外键关系形成之后,外键字段的值一定要来自于外键表
          外键表的该字段的某条记录如果被引用了,那么不能修改或删除!
如:emp表的deptno字段的值,一定要填写dept表有的deptno
       dept表的1号部门如果被引用,1号部门不能修改1这个编号,也不能删除该记录!

emp表引用了dept表,emp表称为从表(外键表),dept表称为主表(主键表)

注意:添加约束时,要保证没有数据违反约束,如果有数据违反约束,那么报错!

emp表的mgr字段引用了emp表的empno字段!

-- 查询员工及其所在部门的信息
select * from emp e,dept d where e.deptno=d.deptno;

注意:只有两个表能够匹配的记录可以显示,不匹配的都无法显示。
如:此处只能显示有部门的员工及有员工的部门!

B、不等值连接:a表的某字段在b表的某个字段的值范围内!
-- 查询员工及其所在部门的信息
select * from emp e,dept d where e.deptno=d.deptno;

-- 查询员工及其薪水级别
select * from emp e,salgrade s where e.sal >= s.lowsal and e.sal <= s.hisal;
select * from emp e,salgrade s where e.sal BETWEEN s.lowsal and s.hisal;

-- 查询每个薪水级别的员工人数,按人数降序排序
select s.sid,count(*) from emp e,salgrade s where e.sal BETWEEN s.lowsal and s.hisal group by s.sid order by count(*) desc;

-- 查询3级薪水员工的最高薪水对应员工信息
select * from emp e,salgrade s where e.sal between s.lowsal and s.hisal and e.sal=(
select max(sal) from emp e,salgrade s where e.sal BETWEEN s.lowsal and s.hisal and s.sid=3
) and s.sid=3;

-- 查询员工及其所在部门及其员工薪水级别的信息
select * from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.lowsal and s.hisal;

-- 查询在上海工作的员工中,每个薪水级别的员工人数
select sid,count(*) from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.lowsal and s.hisal and d.loc='上海'
  group by sid order by count(*) desc;

C、自连接:emp表的mgr字段引用了emp表的empno字段
将emp表虚拟成两张表:员工表e1,上级表e2,e1.mgr = e2.empno

-- 查询每个员工的编号、姓名及其上级编号、姓名
select e1.empno,e1.ename,e1.mgr,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;

-- 查询比自己上级入职时间还早的员工的编号、姓名、入职时间及其上级的编号、姓名、入职时间
select e1.empno,e1.ename,e1.hiredate,e2.empno,e2.ename,e2.hiredate from emp e1,emp e2 where e1.mgr=e2.empno and e1.hiredate < e2.hiredate;

D、外连接:查询匹配和不匹配的信息!
-- 查询员工及其所在部门信息
select * from emp e,dept d where e.deptno=d.deptno;

-- 采用join on的写法
select * from emp e join dept d on e.deptno=d.deptno;

-- 查询在上海工作的员工信息
select * from emp e join dept d on e.deptno=d.deptno where d.loc='上海';

-- 左外连接:left outer join on,查询左边表所有的数据及右边和左边匹配的数据
-- 查询所有员工(包括无部门的员工)及其所在部门信息
select * from emp e left outer join dept d on e.deptno=d.deptno;

-- 查询所有的部门(含无员工部门)及其部门员工的信息
select * from dept d left outer join emp e on d.deptno=e.deptno;

-- 右外连接:right outer join on,查询右边表所有的信息,及左边和右边匹配的信息
-- 查询所有的部门(含无员工部门)及其部门员工的信息
select * from emp e right outer join dept d on e.deptno=d.deptno;

3、约束
A、非空:not null

B、唯一:unique key(UK)

C、主键:primary key(PK)

D、外键:foreign key(FK)

4、dml语句
注意:
a、dml语句是不可逆的操作,在进行dml之前注意备份数据或停止系统的对外访问
b、dml语句不能违反约束
c、mysql中的dml不能嵌套子查询查正在修改的表

A、增加
insert into 表 values(字段值...);
insert into 表(字段) values(值);

-- 利用emp表的结构和数据创建emp2表
create table emp2 select * from emp;

-- 增加数据
insert into emp values(48,'sunwukong',1200,200,null,'弼马温',1,NULL);
insert into emp(sal,ename,hiredate) values(2300,'赵云','2008-1-5');

-- 删除emp所有数据
delete from emp;
select * from emp;

-- 将部分字段拷贝回来
insert into emp(empno,ename,sal) select empno,ename,sal from emp2;
insert into emp select * from emp2;

B、修改
update 表 set 字段=值,字段=值... where 条件;

-- 将薪水在平均线以下的人加薪10%
select * from emp;
update emp set sal=sal * 1.1 where sal < (select avg(sal) from (select * from emp) e);

-- 将Cindy的薪水修改成'开发'平均薪水的的80%,奖金修改成'财务'的平均值
update emp set sal=(select avg(sal) * 0.8 from (select * from emp) e where job='开发')
   ,comm=(select avg(comm) from (select * from emp) e where job='财务') where ename='Cindy';

注意:如果没有where条件,修改所有人,绝大部分时间是不会没有where的,请特别注意!

C、删除
delete from emp; -- 删除emp表所有的数据,绝大部分时间是不会清空整个表的,请特别注意!!!
delete from emp where 条件;

-- 删除数据
select * from emp where TIMESTAMPDIFF(year,hiredate,NOW()) < 1;
-- 删除入职不满一年的员工
delete from emp where TIMESTAMPDIFF(year,hiredate,NOW()) < 1;

-- 删除在平均薪水以下的员工
select * from emp where sal < (select avg(sal) from emp);
-- 不能在子查询中查询正在修改的表
delete from emp where  sal < (select avg(sal) from emp);
-- 为表起别名,让mysql认为不是修改的子查询的表
delete from emp where  sal < (select avg(sal) from (select * from emp) e);

5、索引:提升查询效率的对象


精彩文章推荐
电子商务十大发展趋势 [2014-11-10]
常州招聘-机械设计师【机械设计】[2014-1-8]
【常州东方博宜学员合影】[2013-12-16]
正则表达式验证详解![2012-10-20]
常州室内设计培训——现代风格家居设计案例[2012-8-16]
常州电脑培训_软件工程师寄语[2012-8-12]
常州软件培训——数据库系统管理[2011-12-31]
DreamWeaver常用的操作技巧|常州电脑培训[2011-11-14]


返回顶部