预备知识:增加列,修改表名,修改列属性,删除列语句,修改列名
(1)alter table emp add column name varchar(10);
(2)alter table emp rename test1;
(3)alter table emp modify name char(10);
(4)alter table emp drop column name;
(5)alter table emp change address address1 char(4); #必须增加
第三章:多表查询学习心得
1.数据叠加: Union all /Union
(1) 注意点:使用时前者,简单叠加包含重复项,必须保持两次select的列数相同,叠加的列数据类型匹配;后者过滤重复项;Union 等同于针对Union all输出结果的distinct操作,如下:
(2) 代码区:select deptno from emp union all select deptno from dept;
select deptno from emp union select deptno from dept;
select dintinct deptno from (select deptno from emp union all select deptno from dept);
(3) 特色代码:select '-----' 是啥,null from dept; #此代码作用是???;
2.查找两个表中相同行/查找只存在于一个表的数据
(1)注意点:使用not in时,子查询表不能含null,否则返回空表,解决方案见代码(new_dept含空值)
(2)代码区:
#视图的使用,create view V as select ename,job,sal from emp where job = 'CLERK';#此时不出任何结果:select * from V;
#视图与表连接:select e.empno,e.ename,e.job,e.sal,e.deptno from emp e,V
where e.ename = v.ename and e.job = v.job and e.sal = v.sal
或使用 join...on...达同样效果
#select deptno from dept where deptno not in (select deptno from emp);
#select deptno from dept where not exists(select deptno from new_dept where dept.deptno = new_dept.deptno); #必须添加条件否则仍为空表;
3.从一个表检索与另一个表不相关的行
(1)注意点:直接使用left join 得到的是以左表为基准的所有列的信息,左表有那是右表没有对应信息的直接为Null
(2)实例:查找哪些部门没有员工
#下图为只左连接的结果,以dept为基准,获取所有的列,deptno = 40没有员工信息
结果代码:select d.* from dept d left join emp e on d.deptno = e.deptno where e.deptno is null;
4.新增连接查询而不影响其它连接查询
(1) 注意点:三表连接
(2)实例:查找员工信息,包括所在部门位置,以及收到奖金的日期
select e.ename,d.loc,eb.received from emp e join dept d on e.deptno = d.deptno left join emp_bonus eb on e.empno = eb.empno order by 2;
#或者使用标量子查询
select e.ename,d.loc,(select eb.received from emp_bonus eb where e.empno = eb.empno)received
from emp e,dept d
where e.deptno = d.deptno;