小结

194 阅读3分钟
mysql -uroot -p111
use kexie;
show tables;
查看表结构:desc dept;部门表 desc emp;员工表 desc salgrade;公司等级表

数据查询DQL 
投影:
单表
返回表中所有列
select * from dept;
select * from emp;
select * from salgrade;
返回表中指定列
(人名+月薪)
select ename,sal from emp;
(人名+'月薪为'+月薪)
select ename,'月薪为',sal from emp;
(人名+月薪*12select ename,sal*12 from emp;
(人名+年薪)
select ename,sal*12 '年薪' from emp;
查询emp表中 job 的种类
select job from emp;
select distinct job from emp;
 (默认是allselect all job from emp; )

多表?
查询员工姓名与其所在部门的位置
select ename,loc from emp,dept ? X;
多表需要有共同属性进行连接
select ename,loc from emp,dept where emp.deptno=dept.deptno;

选择:
查询所在部门new york的员工姓名
select ename from emp,dept where emp.deptno=dept.deptno and loc='new york';
查询姓名为S...的员工姓名
select ename from emp where ename like 'S%';
查询没有COMM津贴的员工姓名
select ename,comm from emp where comm is null;

排序:
order by
按津贴高低进行排序
select ename,comm from emp order by comm desc;
select ename,comm from emp order by comm; (默认asc)

聚集函数:
使用聚集函数count() 、sum、max、min、avg
计算没有津贴的人数
select count(*) from emp where comm is null;  //统计元组个数,不跳过空值
select count(1) from emp where comm is null; 
select count(empno) from emp where comm is null;   //empno为主键,统计一列中值的个数 
计算有津贴的人数
select count(comm) from emp;   //结果是4 说明聚集函数会自动过滤空值

group by子句  分组   区别where作用在基本表/视图  重点在group by什么 (什么分组)
求各个部门号及相应的部门人数
select deptno,count(empno) from emp group by deptno;
求部门人数大于5人的各个部门号与对应的部门人数
select deptno,count(empno) from emp group by deptno having count(empno)>5 ;

连接查询
等值查询,自身连接,外连接,多表连接
等值查询
select ename,loc from emp,dept where emp.deptno=dept.deptno;
select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno;

自身连接:表与其自己进行连接
MGR是EMPNO的外码
查询每一个员工的员工号的上级领导编号mgr (这个要理解下)
select first.empno,second.mgr from emp first,emp second where first.mgr=second.empno;

外连接:left outer joinon(条件)
select * from emp left outer join dept on(emp.deptno=dept.deptno);

嵌套查询:
in子查询
查看部门名字为sales的员工姓名
select ename,dname from emp,dept where emp.deptno=dept.deptno and dname='sales';

select ename from emp where deptno in(select deptno from dept where dname='sales');

exists子查询,不返回任何数据,只产生逻辑真假true false
查询所有员工在sales部门的员工姓名
select ename from emp where exists(
select * from dept where deptno=emp.deptno and dname='sales');

数据更新
插入数据
insert into 表(属性a,属性b,属性c,属性d...);

修改数据
updateset 修改后的属性=where 原属性= ;
update dept set loc='合肥' where loc='boston'; 
select * from dept;

删除数据
delete from dept where loc='合肥';
select * from dept;

建立视图
create view newyork_view
as
select deptno,dname from dept where loc='new york';

删除视图
drop view newyork_view;
drop view newyork1_view;

create view newyork1_view as select emp.deptno,emp.ename from dept,emp where emp.deptno=dept.deptno and loc='new york';

查询和基本表是一样的操作

更新视图
update newyork_view 
set ename='111'
where ename='king';