数据库
一、查询 select
以如下几张表为例
emp表:
dept表:
salgrade表:
- (1) 查询所有的员工信息
- select * from emp;
- (2)查询所有的员工名字
- select ename from emp;
- (3)去重 distinct
- select distinct deptno from emp;
- (4)取别名,""原样输出 ,别名是小写的,有特殊符号存在,前后必须添加""。 给字段取别名 (as) 别名,给表取别名: 表名 别名, 注意:表取别名不能出现as
- select ename as "username", empno "员工 编号" from emp;
- select ename 员工名称 from emp e;
- (5)虚表 没有数据,没有字段
- select 123*456,'hehe' from dual;
- (6)字符串的拼接 ||
- select 'SXT-'||ename "尚学堂员工姓名",comm from emp;
- (7)null 和 数字运算,结果还是null
- select ename ,comm "原奖金",comm+100 "新奖金" from emp;
- null 和 字符串拼接,结果是原串
- select ename ,comm "原奖金",comm||'100' "新奖金" from emp;
- 处理null值, nvl(值1,值2) 当值1为null,函数的结果为值2,当值1不为null,函数的结果为值1
- select nvl(null,0) from dual;
二、条件查询
select 数据 from 表名 where 行过滤条件;
执行流程: from where select
- (1)查询30部门的员工的 名称和工种
- select ename, job from emp where deptno=30;
- (2)=、 !=、 <>、 >、 <、 >=、 <=的使用 查询除了'SMITH'之外的所有人信息
- select * from emp where ename != 'SMITH';
- (3) and | or的使用 查询工资在1500~2500之间的员工工种和姓名和工资
- select * from emp where sal>=1500 and sal<=2500;
- 查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门编号,工资,工种
- select * from emp where job = 'CLERK' or deptno=20;
- (4)not 取反 查询所有可以领奖金的员工信息
- select * from emp where not comm is null;
- (5)集合
- Union,并集(去重)
- select * from emp where sal>1500 Union select * from emp where comm is not null;
- Union all全集 不去冲
- select * from emp where sal>1500 Union all select * from emp where comm is not null;
- Minus差集 没有员工存在的部门编号
- select deptno from dept Minus select distinct deptno from emp;
- Intersect,交集(找出重复) 查询工资大于1500 并且 含有佣金的人员姓名
- select * from emp where sal>1500 Intersect select * from emp where comm is not null;
- select * from emp where ename like 'A%';
- 求所有的员工中姓名包含A的员工信息
- select * from emp where ename like '%A%';
- 使用like做到精确匹配
- select * from emp where ename like 'ALLEN';
- 查询所有的员工中姓名第二个字符为A的员工信息
- select * from emp where ename like '_A%';
- (7)转义字符的使用 查询名字中带有%员工信息 escape('')指明转义字符
- select * from emp where ename like '%A%%' escape('A');
- (8)排序 order by 字段1 desc降序|asc升序默认,字段2 desc降序|asc升序默认...;
- select * from emp order by sal desc;
三、函数
1、单行函数
(1)、日期函数
- 1)当前时间sysdate/current_date
- select sysdate from dual;
- select current_date from dual;
- 2)、修改日期(天数+-) 2天以后是几号
- select sysdate+2 from dual;
- 3)、修改月份 查询所有员工的试用期期到期(转正的日期) 3个月试用期
- select hiredate "入职日期",add_months(hiredate,3) "转正日期" from emp;
- 4)、月份之差 查询所有员工到目前为止一共工作了几个月
- select hiredate,sysdate,months_between(sysdate,hiredate) from emp;
- 5)、最后一天 查询当前月的最后一天
- select last_day(hiredate) from emp;
- 6)、下一个星期的时间 下一个星期三是几号
- select next_day(sysdate,'星期三') from dual;
(2)、转换函数
- 1)to_date(c,m) 字符串以指定格式转换为日期 '2019/8/23 16:49:44'
- select to_date('2017年8月23日 16:49:44','yyyy"年"mm"月"dd"日" hh24:mi:ss')+1 from dual;
- 2)to_char(d,m) 日期以指定格式转换为字符串
- select to_char(sysdate,'yyyy-mm-dd hh24:mi-ss') from dual;
(3)、其他函数
- 1)decode 判断decode(判定字段,校验字段值1,结果1,校验字段2,结果2。。默认值) 给每个部门后后面添加一个伪列,如果10部门,伪列显示为十,二十,三十...
- select deptno,dname,loc,decode(deptno,10,'十',20,'二十',30,'三十','四十') from dept;
- 2)case when then else end
- select ename,sal "原薪资",deptno,(case deptno when 20 then sal*1.1 else sal end) "涨薪后的薪水" from emp;
2、组函数
- 1)count : 统计记录数 count() -->* 或一个列名 统计一下一共有多少个员工
- select count(*) from emp;
- 2)max min: 最大值 最小值 查询本公司的最高工资和最低工资
- select max(sal),min(sal) from emp;
- 3)sum: 求和 计算本公司每个月一共要在工资上花费多少钱
- select sum(sal) from emp;
- 4)avg: 平均值 20部门的平均薪资
- select avg(sal) from emp where deptno=20;