我的Oracle用户及密码:
- sys:change_on_install
- system:manager
- Scott:tiger
- sh:sh
连接到数据库命令:sqlplus scott/tiger
连接成功后,切换用户:conn sys/change_on_install AS SYSDBA。其他用户不需要AS SYSDBA。
格式化命令:
- 设置每行的长度:SET LINESIZE 300
- 设置每页的长度:SET PAGESIZE 30
调用本机命令:如Host echo hello
sql简介
sql指的是结构化查询语言。
- DML(数据操作语言):主要指的是数据库的查询与更新操作。
- DDL(数据定义语言):主要指的是数据对象的创建(表、用户)
- DCL(数据控制语言):主要是进行权限的管理操作
SCOTT用户表的结构
打开sql PLUS ,登录到SCOTT用户。
查询一个用户下的所有表:select * from tab;
查询到SCOTT用户有四张表:BONUS、DEPT、EMP、SALGRADE。
下面要查询每张表的结构:
DESC dept;
No. | 列名 | 类型 | 描述 |
---|---|---|---|
1 | DEPTNO | NUMBER(2) | 表示部门编号,最多由2位数字组成 |
2 | DNAME | VARCHAR2(14) | 表示部门名称,最多由14个字符组成(三个字符表示一个中文) |
3 | LOC | VARCHAR2(13) | 部门位置 |
DESC EMP;
No. | 列名 | 类型 | 描述 |
---|---|---|---|
1 | EMPNO | NUMBER(4) | 表示雇员编号,最多由2位数字组成 |
2 | ENAME | VARCHAR2(10) | 表示雇员姓名 |
3 | JOB | VARCHAR2(9) | 雇员职位 |
4 | MGR | NUMBER(4) | 每个雇员的领导编号 |
5 | HIREDATE | DATE | 雇佣日期,包含日期和时间 |
6 | SAL | NUMBER(7,2) | 工资,小数点最多占两位,整数最多占5位 |
7 | COMM | NUMBER(7,2) | 佣金,类似销售提成 |
8 | DEPTNO | NUMBER(2) | 部门编号,指的是每个雇员对应的部门编号信息 |
DESC salgrade;
No. | 列名 | 类型 | 描述 |
---|---|---|---|
1 | GRADE | NUMBER | 表示工资等级编号 |
2 | LOSAL | NUMBER | 此等级的最低工资 |
3 | HISAL | NUMBER | 此等级的最高工资 |
DESC bonus;
No. | 列名 | 类型 | 描述 |
---|---|---|---|
1 | ENAME | VARCHAR2(10) | 雇员姓名 |
2 | JOB | VARCHAR2(9) | 职位 |
3 | SAL | NUMBER | 工资 |
4 | COMM | NUMBER | 佣金 |
bonus表中没有数据。
sql简单查询
查询emp表的全部记录
select * from emp;
查询每个雇员的编号、姓名、职位、工资
select empno,ename,job,sal from emp;
查询所有的职位信息,使用DISTINCE不会出现重复列。但是如果查询的是多个列,那么只有在多个列数据都相同时,才能消除。
select DISTINCT job from emp;
查询每个雇员的编号、姓名、基本年薪。
select empno,sal*12 income from emp;
查询每个雇员的编号、姓名、基本年薪(每年十五个月工资,每个月200元餐补、100元交通补贴、100元的电话补贴,每年5个月高温补贴200元)。
select empno,(sal*15+(200+100+100)*12 + 200*5) income from emp;
直接查询常量
select '雇员',empno,ename from emp;
查询效果:雇员编号:XXXX,姓名:XXX,收入:XXX。“||”负责进行输出内容的连接
select '雇员编号:'||empno,'姓名:'||ename,'收入:'||sal from emp;
sql限定查询
查询基本公司高于1500的雇员
select * from emp where sal>1500;
查询smith的完整信息,注意Oracle中的数据区分大小写
select * from emp where ename='SMITH';
查询工资是5000的雇员信息
select * from emp where sal=5000;
查询不是销售人员的雇员编号、姓名、职位。”!= 或者 <>”
select empno,job from emp where job!='SALESMAN';
查询工资范围在1500到3000的雇员
select * from emp where sal>=1500 and sal<=3000;
查询工资大于2000或者是办事员的雇员
select * from emp where sal>2000 or job='CLERK';
查询所有工资小于2000。用NOT实现
select * from emp where NOT sal>=2000;
select * from emp where sal between 1500 and 3000;
查询所有在1981年雇佣的雇员
select * from emp where hiredate between '01-1月 -1981' and '31-12月 -1981';
查询所有领取佣金的雇员
select * from emp where comm is not null;
select * from emp where not comm is null;
查询雇员编号为7369、7566、7788、9999的雇员信息
select * from emp where empno = 7369 or empno = 7566 or empno = 7788 or empno = 9999;
select * from emp where empno in(7369,7566,7788,9999);
查询雇员编号不为7369、7566、7788、9999的雇员信息
select * from emp where empno not in(7369,9999);
select * from emp where not empno in(7369,9999);
注意:not in操作中不能有null值
select * from emp where empno not in(7369,null);
结果:未选定行。
使用WHERE最大的用处在于控制显示的数据行,就是别显示全部数据行。使用 NOT IN 的目的是为了查询部分数据行,如果有了null,就变成了查询全部不为空的数据,而某些数据如主键,永远不能为空,就变成了查询全部数据。在大型数据库中,就宕机了。
模糊查询,在使用Like时,可以使用通配符:
- “_”,匹配任意的一位字符;
- “%”,匹配任意位字符;
查询姓名是以字母A开头的雇员信息
select * from emp where ename like 'A%';
查询姓名是以第二个字母位A开头的雇员信息
select * from emp where ename like '_A%';
查询姓名是包含A字母的雇员信息
select * from emp where ename like '%A%';
查询排序
查询所有雇员信息,按照工资由高到低排序。
select * from emp order by sal desc;
查询所有销售人员信息,按照雇佣日期由早到晚排序。
select * from emp where job='SALESMAN' order by hiredate asc;
查询所有雇员信息,按照工资由高到低排序,如果相同,则按照雇佣日期由早到晚排序。
select * from emp order by sal desc,hiredate asc;
查询每个雇员的编号、姓名、年薪,按照年薪由低到高排序。
select empno,sal*12 income from emp order by income asc;
排序查询总结
- 使用 OREDER BY 查询的时候,排序是在最后完成的;
- ORDER BY 子句是最后执行的子句;
- 在ORDER BY 之中可以设置多个排序的字段;
- ORDER BY 有两种模式:ASC、DESC;
- ORDER BY 是唯一一个可以使用SELECT子句定义别名的子句。
练习题
选择部门30中所有员工。
select * from emp where deptno=30;
列出所有办事员(CLERK)姓名、编号和部门编号。
select ename,deptno from emp where job='CLERK';
列出佣金高于薪资60%的员工。
select * from emp where comm > sal*0.6;
找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)。
select * from emp where (job='MANAGER' and deptno=10) or (job='CLERK' and deptno=20);
找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK),以及既不是经理也不是办事员但是工资大于等于2000的所有员工的详细资料。
select * from emp where (job='MANAGER' and deptno=10) or (job='CLERK' and deptno=20) or (job not in ('MANAGER','CLERK') and sal>=2000 );
找出 收取佣金的员工的不同工作
select distinct job from emp where comm is not null;
找出不收取佣金或收取佣金低于100的员工。
select * from emp where comm is null or comm <100;
显示不带有“R”的员工的姓名
select ename from emp where not ename like '%R%';
select ename from emp where ename not like '%R%';
显示带有“A”的员工的姓名,显示的结果按照基本工资有高到低排序,如果基本工资相同,则按照雇佣年限由早到晚顺序,如果雇佣日期相同,则按照职位排序。 “`sql select * from emp where ename like ‘%A%’ order by sal desc,hiredate asc,job;