select * from student where birthday is not null;
修改数据 修改一个字段
UPDATE student SET sex = '女' WHERE xh = 'A001'; 修改多个字段
UPDATE student SET sex = '男', birthday = '1984-04-01' WHERE xh = 'A001'; 修改含有null值的数据
不要用 = null 而是用 is null;
SELECT * FROM student WHERE birthday IS null;
删除数据
DELETE FROM student;
删除所有记录,表结构还在,写日志,可以恢复的,速度慢。 Delete 的数据可以恢复。 savepoint a; --创建保存点 DELETE FROM student;
rollback to a; --恢复到保存点
一个有经验的DBA,在确保完成无误的情况下要定期创建还原点。 DROP TABLE student; --删除表的结构和数据;
delete from student WHERE xh = 'A001'; --删除一条记录;
truncate TABLE student; --删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。
----------------------------第八讲----------------------------
五:oracle表查询(1)
oracle表基本查询 介绍
在我们讲解的过程中我们利用scott用户存在的几张表(emp,dept)为大家演示如何使用select语句,select语句在软件编程中非常有用,希望大家好好的掌握。 emp 雇员表 clerk 普员工 salesman 销售 manager 经理 analyst 分析师 president 总裁 mgr 上级的编号 hiredate 入职时间 sal 月工资 comm 奖金 deptno 部门 dept部门表
deptno 部门编号 accounting 财务部
research 研发部 operations 业务部 loc 部门所在地点 salgrade 工资级别 grade 级别 losal 最低工资 hisal 最高工资
简单的查询语句 查看表结构 DESC emp; 查询所有列
SELECT * FROM dept; 切忌动不动就用select *
SET TIMING ON; 打开显示操作时间的开关,在下面显示查询时间。
CREATE TABLE users(userId VARCHAR2(10), uName VARCHAR2 (20), uPassw VARCHAR2(30));
INSERT INTO users VALUES('a0001', '啊啊啊啊', 'aaaaaaaaaaaaaaaaaaaaaaa');
--从自己复制,加大数据量 大概几万行就可以了 可以用来测试sql语句执行效率 INSERT INTO users (userId,UNAME,UPASSW) SELECT * FROM users; SELECT COUNT (*) FROM users;统计行数
查询指定列
SELECT ename, sal, job, deptno FROM emp; 如何取消重复行DISTINCT
SELECT DISTINCT deptno, job FROM emp; 查询SMITH所在部门,工作,薪水
SELECT deptno,job,sal FROM emp WHERE ename = 'SMITH';
注意:oracle对内容的大小写是区分的,所以ename='SMITH'和ename='smith'是不同的
使用算术表达式 nvl null
问题:如何显示每个雇员的年工资?
SELECT sal*13+nvl(comm, 0)*13 \年薪\ 使用列的别名
SELECT ename \姓名\年收入\ 如何处理null值 使用nvl函数来处理 如何连接字符串(||)
SELECT ename || ' is a ' || job FROM emp; 使用where子句
问题:如何显示工资高于3000的 员工? SELECT * FROM emp WHERE sal > 3000; 问题:如何查找1982.1.1后入职的员工?
SELECT ename,hiredate FROM emp WHERE hiredate >'1-1月-1982'; 问题:如何显示工资在2000到3000的员工?
SELECT ename,sal FROM emp WHERE sal >=2000 AND sal <= 3000;
如何使用like操作符
%:表示0到多个字符 _:表示任意单个字符 问题:如何显示首字符为S的员工姓名和工资?
SELECT ename,sal FROM emp WHERE ename like 'S%'; 如何显示第三个字符为大写O的所有员工的姓名和工资? SELECT ename,sal FROM emp WHERE ename like '__O%';
在where条件中使用in
问题:如何显示empno为7844, 7839,123,456 的雇员情况? SELECT * FROM emp WHERE empno in (7844, 7839,123,456); 使用is null的操作符
问题:如何显示没有上级的雇员的情况? 错误写法:select * from emp where mgr = '';
正确写法:SELECT * FROM emp WHERE mgr is null;
---------------------------------------------第九讲-----------------------------------------------------------
六:oracle表查询(2)
使用逻辑操作符号
问题:查询工资高于500或者是岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J?
SELECT * FROM emp WHERE (sal >500 or job = 'MANAGER') and ename LIKE 'J%'; 使用order by 字句 默认asc
问题:如何按照工资的从低到高的顺序显示雇员的信息? SELECT * FROM emp ORDER by sal;
问题:按照部门号升序而雇员的工资降序排列 SELECT * FROM emp ORDER by deptno, sal DESC;
使用列的别名排序 问题:按年薪排序
select ename, (sal+nvl(comm,0))*12 \年薪\年薪\ 别名需要使用“”号圈中,英文不需要“”号
分页查询
等学了子查询再说吧。。。。。。。。
Clear 清屏命令
oracle表复杂查询 说明
在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给大家
介绍较为复杂的select语句
数据分组 ——max,min, avg, sum, count 问题:如何显示所有员工中最高工资和最低工资? SELECT MAX(sal),min(sal) FROM emp e; 最高工资那个人是谁?
错误写法:select ename, sal from emp where sal=max(sal);
正确写法:select ename, sal from emp where sal=(select max(sal) from emp);
注意:select ename, max(sal) from emp;这语句执行的时候会报错,说ORA-00937:非单组分组函数。因为max是分组函数,而ename不是分组函数.......
但是select min(sal), max(sal) from emp;这句是可以执行的。因为min和max都是分组函数,就是说:如果列里面有一个分组函数,其它的都必须是分组函数,否则就出错。这是语法规定的
问题:如何显示所有员工的平均工资和工资总和?
问题:如何计算总共有多少员工问题:如何
扩展要求:
查询最高工资员工的名字,工作岗位
SELECT ename, job, sal FROM emp e where sal = (SELECT MAX(sal) FROM emp); 显示工资高于平均工资的员工信息
SELECT * FROM emp e where sal > (SELECT AVG(sal) FROM emp);
group by 和 having子句
group by用于对查询的结果分组统计, having子句用于限制分组显示结果。
问题:如何显示每个部门的平均工资和最高工资?
SELECT AVG(sal), MAX(sal), deptno FROM emp GROUP by deptno;
(注意:这里暗藏了一点,如果你要分组查询的话,分组的字段deptno一定要出现在查询的列表里面,否则会报错。因为分组的字段都不出现的话,就没办法分组了)
问题:显示每个部门的每种岗位的平均工资和最低工资?
SELECT min(sal), AVG(sal), deptno, job FROM emp GROUP by deptno, job;
问题:显示平均工资低于2000的部门号和它的平均工资?
SELECT AVG(sal), MAX(sal), deptno FROM emp GROUP by deptno having AVG(sal) < 2000;
对数据分组的总结
1 分组函数只能出现在选择列表、having、order by子句中(不能出现在where中)
2 如果在select语句中同时包含有group by, having, order by 那么它们的顺序是group by, having, order by
3 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在group
by 子句中,否则就会出错。
如SELECT deptno, AVG(sal), MAX(sal) FROM emp GROUP by deptno HAVING AVG(sal) < 2000;
这里deptno就一定要出现在group by 中 (我自己测试没有deptno 也一样可以正确执行)
多表查询 说明
多表查询是指基于两个和两个以上的表或是视图的查询。在实际应用中,查询单个表可能不能满足你的需求,(如显示sales部门位置和其员工的姓名),这种情况下需要使用到(dept表和emp表)
问题:显示雇员名,雇员工资及所在部门的名字【笛卡尔集】?
规定:多表查询的条件是 至少不能少于 表的个数-1 才能排除笛卡尔集 (如果有N张表联合查询,必须得有N-1个条件,才能避免笛卡尔集合)
SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno;
问题:显示部门号为10的部门名、员工名和工资?
SELECT d.dname, e.ename, e.sal FROM emp e, dept d WHERE e.deptno = d.deptno and e.deptno = 10;
问题:显示各个员工的姓名,工资及工资的级别? 先看salgrade的表结构和记录 SQL>select * from salgrade;
GRADE LOSAL HISAL ------------- ------------- ------------ 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999
SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
扩展要求:
问题:显示雇员名,雇员工资及所在部门的名字,并按部门排序?
SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno ORDER by e.deptno;
(注意:如果用group by,一定要把e.deptno放到查询列里面)
自连接
自连接是指在同一张表的连接查询
问题:显示某个员工的上级领导的姓名? 比如显示员工?FORD?的上级
SELECT worker.ename, boss.ename FROM emp worker,emp boss WHERE worker.mgr =