Oracle数据库(传智)学习笔记-01

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 (+)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值