1.登录到数据库:
普通用户: sqlplus 用户名+密码
超级用户: sqlplus/nolog connect /as sysdba
2.查看用户下有什么表
SQL>select* from tab; tab是数据词典
SQL>select* from dept;c查看
set linesize 150 设置行宽。
set pagesize 40 设置页宽。
col xxxx for 999999999999999 设置占位符
col xxxx a20 字符方式设置列宽
host cls 清屏
3.select 语句
(*检索所有列,部分列, 表达式,别名)
select ename as "员工姓名",enpno"编号",job"工作",sal"月薪",sal*12 年薪 from emp;
1.别名:省掉"" as
2.类名,有空格时,不能省掉""
select ename as "员工姓名",enpno"编号",job"工作",sal"月薪",sal*12+com 年薪 from emp;
空值问题:
1.NULL空值 任何数和null运算都为null
2.空值不是空 null!=null
null滤空函数 nvl(a,b)---当a是空的时候,返回b(其中b可以是数字或者字符串)
---字符串和日期在sql语言中用单引号括起来
select ename as "员工姓名",enpno"编号",job"工作",sal"月薪",nvl(sal*12+com,0) 年薪 from emp;
查询为空的 select * from emp where comn is 空/not null
连接符:
select 'hello'|| 'world'from emp;
select 'hello'|| 'world'from dual;这个是虚表
select sysdate from dual; 查询时间
删除重复行:
select DISINCT deptno from emp;
select DISINCT deptno, job from emp;修饰多个编号和工种
SQL 语言 和 SQL *plus命令:
一种语言
关键字不能缩写 关键字可以缩写
4.过滤和排序数据
修改日期格式:
alter session set NLS_DATE_FORMAT='yyyy-mm-dd'
过滤:
select * from emp where hiredate >'01-1月-81'
select..from .. where col>30
col in
col between A and B A<B
查询编号是10和20的
select..from .. where in(10,20)
select..from .. where in(10,20,null)
in集合中遇见null(in集合和空值在一起)
in(集合中含有空值)查询结果不受影响
not in(集合中含空值)查询结果受影响
like模糊查询 % 代表零个或多个字符(任意个字符)。
_ 代表一个字符。
select * from emp;where ename like 'S%' 查询有字母S
查询名字含有下划线的员工(查询的内容含有转义字符)
插入:insert into emp(emono,ename,sal,DESPINO)values(1,'ton_abc',8000,10);
select *fromemp where ename like '%\_%'escape "\";
order by 默认按照升序排序
按照薪水,查询员工信息 select *from emp orderby sal
如果多个列中 有desc修饰,只作用于最近的那一列
按照部门排序
select * from emp
order by deptno desc, sal desc;
order by 遇上空值
1. 任何表达式和null运算都为空
2.null!=null(is null)
3.where子句中(in集合和空值在一起)
5.单行函数
函数-1.单行
-2.多行 举例 select count(*)from enp;
单行函数:
字符类,数值,日期,转换,通用
字符:
1.大小写控制函数:lower,upper INITCAP(首字母大写) from dual
2.字符控制函数:
select concat<'hello ','world'>from dual 连接字符串
--substr(a, b) 从a中,第b位开始取
--substr(a, b, c) 从a中,第b位开始取,取5个字符
--length字符数 --lengthb字节数 --一个中文字符,两个字节
eg:select length("中国ABC")5
eg:select lengthb("中国ABC")7
--instr('母串', '子串') ,在母串中查找子串,返回子串在母串中的位置;找不到返回0;
-lpad rpad
--lpad('abcd', 10, '*' ) rpad('abcd', 10, '*' )
//从左边填充,或者从右边填充
--trim 去掉前后指定的字符,字符可以是空格,也可以不是空格 .
--trim('H' from 'Hellowrold')
--replace替换
数字:
1.select round(45.926,2)AA 保留小数点后两位
2.时间转化函数
select to_char(sysdate,yyyy-nn-dd hh24:ni:ss)from dual;
----昨天今天明天
select sysdate-1 昨天, sysdate 今天, sysdate+1 明天 from dual;
select to_char(sysdate-1, 'yyyy-mm-dd hh24:mi:ss') 昨天, sysdate 今天, sysdate+1 明天 from dual;
3.时间相减得天数
select ename, (sysdate-hiredate)/30 估计月, MONTHS_BETWEEN(sysdate, hiredate) 函数计算月
转换函数:
日期相关类型转换
---比这个日期都要大的08-9月 -81 所有员工信息 按照三种方式实现
select * from emp where hiredate > '01-1月 -81' --隐式类型转换
select * from emp where hiredate > to_date('1981-01-01 02:03:04', 'yyyy-mm-dd hh24:mi:ss') --字符串转成日期...显示类型转换
select * from emp where to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss') > '1981-01-01 02:03:04'
--查询员工的薪水:两位小数 本地货币代码 千位符
select empno, ename, to_char(sal, 'L9,999.99')from emp;
select to_number('¥1,250.00', 'L9,999.99') from dual ;
通用函数:
1.滤空函数
2.nvl2(a, b, c) 当a=null 返回c,否则返回b
SQL> select sal, sal*12+nvl2(comm, comm, 0) 年收入 from emp;
3.nullif(a,b) 当a=b时,返回null; 否则返回a
select nullif('abc', 'abcd') from dual;
4.coalesce(a, b, c, ...) ;从左到右,返回第一个不为空的....
SQL> select comm,sal, COALESCE(sal, comm) from emp;
1.case 表达式
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
2.DECODE函数
DECODE(col|expression, search1, result1
[, search2, result2,...,]
[, default])
分组函数
select avg(sal),sum(sal),max(sal),min(sal),count(sal) from emp;
组函数和null在一起
?求平均奖金
select avg(comn)方式1,sum(comn)/count(comn)方式2,sum(comn)/count(*)方式3 from emp
----组函数会自动过滤空值
----修正组函数的滤空功能 select count(nvl(comm, 0)), count(*) from emp ;
分组数据
求各个部门
select ... from emp group by deptno
select a, b, c from emp group by a, b, c,d; --ok a,b,c属于 a,b,c,d.
1 select检索的列 必须要位于 group by后面的集合列中
2 组函数设计的本意: 必须要在分组数据之上, 进行结果集的检索.... ...
求各个部门,各个工种的工资
1 select deptno, job, avg(sal), count(deptno)
2 from emp
3 group by deptno, job
4* order by 1
分组过滤
--查询各个部门的平均工资
1 进一步,查询平均工资大于2000的部门
查询平均工资大于2000的部门
select deptno, avg(sal)
from emp
group by deptno
having avg(sal) > 2000
2 having 和where子句区别
求10号部门的平均工资
---方法1 ---先分组 再过滤
select deptno, avg(sal)
from emp
group by deptno
having deptno=10
---方法2 ---先过滤在分组.....
select deptno, avg(sal)
from emp
where deptno =10
group by deptno
======> 哪一个好....sql优化 方法2好 ....
笛卡尔积:
两个表如果笛卡尔积运算
1 行数 两个表相乘
2 列数 两个表相加..
1 select count(e.EMPNO)
2 from emp e, dept d
3* where e.deptno = d.deptno
等值连接
eg:查询员工信息,员工号,姓名,月薪,部门名称
select e.empno, e.ename, e.sal, d.dname
from emp e, dept d
where e.deptno = d.deptno
不等值连接
eg:查询员工信息,员工号,姓名,月薪, 薪水级别
select e.empno, e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal>=s.losal and e.sal<=s.hisal
外连接
eg:按部门统计员工人数: 部门号 部门名称 各部门人数
---思路1: 求各个部门的人数...要把各个部门数据划分开.....要分组.....
2:各部门人数 员工表
=====>因为 部门人数 是由员工表确定的...所以还要检索员工表...
所以需要多表查询
select d.deptno, d.dname, count(e.empno)
from dept d, emp e
where d.deptno = e.deptno
group by d.deptno, d.dname
DEPTNO DNAME COUNT(E.EMPNO)
---------- -------------- --------------
10 ACCOUNTING 3
20 RESEARCH 5
30 SALES 6
---我们的期望 想把40号部门给统计出来...
----40号部门没有被统计出来的原因: 员工表中没有40号部门的员工...d.deptno = e.deptno (d.40 = e.40)
------本质:等值条件不满足...
========>外连接技术出现的原因
+左外连接: +号在..=号的右边,左外连接....
+右外连接: +号在..=号的左边,左外连接....
我想把部门表的所有列都显示出来, 就需要找到部门表..在对方写(+)
1 select d.deptno, d.dname, count(e.empno)
2 from dept d, emp e
3 where d.deptno = e.deptno(+)
4* group by d.deptno, d.dname
SQL> /
自连接
-- 查询员工信息 ,老板信息
显示: ****的老板是****
---思路1: 员工信息 查员工表
查老板信息,还要查员工表...
---思路2 员工表的老板 是老板表的员工
select e.ename, b.ename
from emp e, emp b
where e.mgr = b.empno
select e.ename || '的老板是' || b.ename
from emp e, emp b
where e.mgr = b.empno (+)
Oracle数据库(传智)学习笔记-01
最新推荐文章于 2020-08-01 10:11:01 发布