sql语句在很多中数据库中都是通用的,但是在不同的数据库中有着部分的差别,所以今天就只介绍sql在
Oracle中的基本应用,看以下例子
--建表
create table person(username varchar2(20),userage number(10),usersex char(2));
--查看表结构
desc person;
--修改表字段的值不能为null
alter table person modify(userage number(10) not null);
--查询某表的内容
select * from person;
--查看当前用户所有的表
select * from tab;
--插入数据(如果只给部分字段赋值,前后必须一一对应)
insert into person(username,userage,usersex)values('张四',20,'男');
--插入数据(不指定表的结构,就必须对所有字段都赋值)
insert into person values('杨过',30,'男');
--修改数据(如果后面没有where语句,则把所有的username都改了)
update person set username='张四'where username='张三';
--删除该表所有数据
delete person;
--删除指定的数据
delete person where username='张三';
----------------------------------------------------------------------简单查询
--查询一张表中的所有数据
select * from emp;
--查询指定的字段(结果集会按照查询的字段顺序来显示数据)
select empno,ename from emp;
--去掉结果集当中重复行
select distinct job from emp;
--条件查询(查询史密斯的部门,工作,薪水)(区分大小写)
select deptno,job,sal from emp where ename='SMITH';
--条件查询(查询部门编号为10和20的的员工)
select * from emp where deptno=10 or deptno=20;
--条件查询(查询薪水大于2000并且下雨2500)
select * from emp where sal>2000 and sal<2500;
--模糊查询 ( % 表示通配任意个字符 _ 表示通配一个字符 )
select * from emp where ename like '%K%';
--查询首字母是S的员工
select * from emp where ename like 'S%';
--查询第三个字母是O的员工
select * from emp where ename like '__O%';
--在where中使用in
--查询存在于数组中的(7369,7566)
select * from emp where empno in(7369,7566);
--显示没有上司的员工
select * from emp where mgr is null;
--以别名显示(as可以省略)
select empno as 编号,ename as 姓名,sal as 月薪 from emp where ename like 'S%';
--显示smith的编号和年薪
select empno 编号,ename 姓名,sal*12 年薪 from emp where ename='SMITH';
--显示工资小于1000或者职位为MANAGER,且名字开头为J的员工
select * from emp where (sal<1000 or job='MANAGER') and ename like 'J%';
--查询的所有数据,并且按照薪水从高到低排序 (desc 倒序排序 ; asc 顺序排序)
select * from emp order by sal desc;
select * from emp order by sal asc;
--统计所有员工的编号,姓名,年薪(月薪+奖金) nvl(comm,0) 当comm为null的时候用0替代来计算
select empno 编号,ename 姓名,sal*12+nvl(comm,0) 年薪 from emp;
--根据别名来排序
select empno 编号,ename 姓名,sal*12+nvl(comm,0) 年薪 from emp order by 年薪 desc;
----------分组函数 max min avg sum count
--查询最高月薪是多少
select max(sal) 月薪 from emp;
--查询月薪最高的员工和月薪最低的员工
select empno 编号,ename 编号,sal 月薪 from emp where sal=(select max(sal) 月薪 from emp); --最高
select empno 编号,ename 编号,sal 月薪 from emp where sal=(select min(sal) 月薪 from emp); --最低
select empno 编号,ename 编号,sal 月薪 from emp where sal=(select max(sal) 月薪 from emp) or sal=(select min(sal) 月薪 from emp);--最高和最低一起
--计算员工的平均月薪
select avg(sal) 平均月薪 from emp;
select sum(sal)/count(empno) 平均月薪 from emp;
--计算有多少员工
select count(empno) 员工数 from emp;
--计算一个月所有薪水总数
select sum(sal) 总月工资 from emp;
------------分组语句
--group by
--显示每个部门的最高工资和平均工资
--分组的条件一定要先查询出来
select max(sal) 最高月薪,avg(sal) 平均月薪,deptno 部门 from emp group by deptno;
--显示每个部门每种岗位的平均工资和最低工资
select avg(sal) 平均月薪,min(sal) 最低工资,job 岗位,deptno 部门 from emp group by job,deptno order by deptno;
--显示平均工资低于2000的部门和它的平均工资 分组之后的条件用having
select avg(sal) 平均工资,deptno 部门 from emp group by deptno having avg(sal)<2000;
--显示平均工资高于2000的部门和它的平均工资,并且财务部不参与
select deptno 部门,avg(sal) 平均月薪 from emp where deptno!=10 group by deptno having avg(sal)>2000 order by avg(sal);
-------------------------------------------------------------------------------------------------多表查询
--查询部门表
select * from dept;
--笛卡尔集,两个表的关联条件
select e.ename 姓名,e.sal 月薪,d.dname 部门名字 from emp e,dept d where e.deptno=d.deptno;
--显示部门号为10的部门名,员工名,月薪
select e.ename 姓名,e.sal 月薪,d.dname 部门名字 from emp e,dept d where e.deptno=d.deptno and e.deptno=10;
--显示各员工的姓名,工资,工资级别 没有一一对应的关联条件
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 desc;
-----思考题
1、 --选择部门30中所有的员工
2、 select * from emp where deptno = 30;
3、 --列出所有业务人员(CLERK)的姓名,编号,和部门编号。
4、 select empno,ename,deptno from emp where job = 'CLERK';
5、 --找出佣金高于薪水的员工
6、 select * from emp where comm>sal;
7、 --找出佣金高于薪水60%的员工
8、 select * from emp where comm>sal*0.6;
9、 --找出部门10中所有的经理和部门20中所有业务员的详细资料
10、 select * from emp where deptno =10 and job = 'MANAGER' or deptno =20 and job = 'CLERK';
11、-- 找出部门10中所有的经理和部门20中所有业务员,既不是经理又不是业务员但薪水大于等于2000的所有的员工信息
12、 select * from emp where deptno =10 and job = 'MANAGER' or deptno =20 and job = 'CLERK' or job!='MANAGER' and job!='CLERK'and sal>=2000;
13、-- 找出收取佣金的员工的不同工作;
14、 select distinct job from emp where comm is not null;
15、-- 找出收取佣金且收取佣金低于100的员工;
16、 select * from emp where comm<100;
19、-- 找出早于12年前的受雇员工
20、 select * from emp where hiredate <'1-1月 2012';
27、 --按名字排序员工
28、 select * from emp where ename like 'A%';
35、-- 找出名字包含“A”的员工
36、 select * from emp where ename like '%A%';