Update 语句
1. 所有学生年龄改成3. update student set sale=3;
2. 讲姓名为sun的学生年龄在基础上增加20.update student set age=age+10 where name=’sun’;
3. 将年龄等于空的同学改成10。Update student set age=10 where age is null;
Delete 语句使用 和truncate
注意:1.如果不使用where 子句,将删除表中所有数据
2. delete不能删除某一列的值,如果 要删除要用update语句
3. 同insert 和delete语句一样,从一个表中记录将引起其他表中的参照完整性问题。
表1(员工表:emp):empon:编号 ename:名字 job:职位 mgr:上级的编号 hiredate:入职时间 sal:薪水 comm:奖金 deptno:部门编号
表2(部门表:dept): deptno:编号 dname:部门名字 loc:地址
表3(工资级别表:):grade:工资级别 losal:低工资 hisal:高工资
1. distinct 去掉查询返回重复行的数据
Select distinct deptno,job from emp; //返回数据完全一样
2. oracle 函数算数表达式
显示每个雇员的年工资+奖金
Select ename “姓名”,sal*12+comm*12 as “年输入” from emp
处理null值
使用nvl 函数来处理
Select ename, sal*13+nvl(comm,0)*13 from emp;//comm如果等于空就取0,如果不为空就取该数值
如何连接字符串(||)在查询时候,如果希望把多个拼接起来,作为一列返回。
3. 分页查询
Oracle 的分页查询要使用子查询:
入职时间的先后顺序,查询从第4-第6人是谁
Select t2.* from(select t1.*,rownum AS rn from(select * from emp) t1 where rownum<=6)t2 where rn >=4
mysql: select * from 表名 where 条件 limit从第几条取,取几条
select top4 * from 表名 where id not in(select top 4 id from 表名 where 条件 )//取5-8条
4. 数据分组-max,min,avg,sum,count
(1) 所有员工中最高工资和最低工资
Select max(sal),min(sal) from emp
(2) 所有员工的平均工资
Select avg(sal),sum(sal)from emp;
Select sum(comm)/count(*)from emp;
Avg(sal)不会把sal为null的进行统计,因此我们要注意,如果
你希望为空值也考虑,则可以这样做
Select sum(comm)/count(*)from emp;
(3) 统计多少员工
Select count(*) from emp
Count 可以统计某列有多少,如果该列某条数据为空不会去统计,
(4) 工资最高的员工名字,工作岗位
思路:1.可以使用子查询
(1)可以查询最大工资是多少
Select max(sal) from emp
(2)看看谁的工资最多
5. group by 和 having 子句
Group by 用于对查询的结果分组统计
Having 子句用于限制(过滤)分组显示结果
(1)显示每个部门的平均工资和最高工资
Select avg(sal),max(sal),deptno from emp group by deptno
(2) 每个部门每种岗位的平均工资和最低工资
Select avg(sal),max(sal),deptno from emp group by deptno,job
(3) 部门平均工资低于2000的部门号和它的平均工资
Select avg(sal),deptno from emp group by deptno having avg(sal)<2000
注意:
1. 分组函数只能出现选择列表(select 后面)、having 、order by 子句后面
2. 如果在select 语句同时含有group by,having,order by 那么他们的顺序是group by, having ,order by
3. 在选择列中如果有列、表达式、和分组函数,那么这些列和表达式
必须有一个出现在group by 中,否则就会出错
6. 多表查询
Select * from emp,dept //是从表dept中的第一条记录与emp表的所有记录进行组合匹配
(1)显示雇员名,雇员工资及所在部门的名字
Select emp.ename,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno
笛卡尔基,在多表查询的时候,如果不带任何条件,则会出现笛卡儿积多表查询的条件是至少不能少于表的个数-1
(2)部门号为10的部门名、员工名和工资
Select emp.ename,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno and emp.deptno=10
(3)各个员工的姓名,工资,及其工资的级别
7. 自连接查询
自连接是指在同一张表的连接查询
(1) 显示’FORD’的上级的所有信息
8. 子查询
单行子查询
(1) 与smith 同以部门的所有员工,且不包含smith
select * from emp where deptno=(Select deptno from emp where ename=’smith’) and ename != ‘smith’
多行查询
(2)部门10的工作相同的雇员的名字、岗位、工资、部门号
Select ename,job,sal,deptno from emp where job in(select distinct job from emp where deptno=10)
(2) 工资比部门30的所有员工的工资高的员工的姓名、工资和部门
Select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);
(3) 工资比部门20的任意一个(不是所有)员工的工资高的员工的姓名、工资和部门
多列查询
(1)与smith 的部门和岗位完全相同的所有雇员
9. from 子句中使用子查询(from 后面查询当作一个临时表来用)
(1)高于自己部门平均工资的员工的信息
10. 合并查询
(1) union
该该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。
Select * from emp where sal>2500 union select * from emp where job=’manager’
(2)Intersect
使用该操作符用于取得两个结果集的交集
Select * from emp where sal>2500 Intersect select * from emp where job=’manager’
(3)minus 取差集
该操作符用于两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合
11 内连接与外连接
内连接利用where 子句对两张表形成的笛卡尔积进行筛选。
左连接 left join
Select * from stu left join exam on stu.id=exam.id
如果stu的记录没有和exam 任何一条记录匹配,也要显示
右连接 right join on (同left join 相反)