Oracle 笔记

Oracle笔记

2023年11月7日 星期二

今天学习了新内容Oracle
一.简介
Oracle数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系架构的数据库之一。
Oracle通常应用于大型数据系统的数据库产品。
Oracle数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。
二.优点
1.支持多用户、大事务量的事务处理
2.数据安全性和完整性控制
3.支持分布式数据处理
4.可移植性
三.数据文件
数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表名空间才行。
四.表空间
表空间是oracle对物理数据库上相关数据文件(ORA或者DBF文件的)逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间,每个表空间包含了一个逻辑上相关联的一组结构。每个数据库至少有一个表空间(称之为system表空间)。
每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。

五.用户
用户是在表空间下建立的。用户登录后只能看到和操作自己的表,oralce的用户与MySQL的数据库类似,每建立一个应用需要创建一个用户

六.定义

Oracle能在所有主流平台上运行(包括Windows)。完全支持所有的工业标准,采用完全开放策略,提供高可用性和高伸缩性的簇的解决方案。Oracle在兼容性、可移植性、可联结性、高生产率上、开放性也存在优点。Oracle产品采用标准SQL,与IBM SQL/DS,DB2,INGRES,IDMS/R等兼容。

SQLserver具有使用方便、可伸缩性好、与相关软件集成程度高等优点,逐渐成为Windows平台下进行数据库应用开发较为理想的 选择之一。

MySQL是一种关系数据库管理系统,使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策,分为社区版和商业版,其体积小、速度快、总体拥有成本低,开放源码。

Oracle和MySQL都是甲骨文的产品,SQL Server是微软的产品。


语法:
创建表空间
create tablespace (表空间名xxx) datafile (储存的位置‘c:xxx/xx/x’)  size (设置表空间大小)  autoextend on 自动增长 next (自动增长多大)-----()里需要自己添加的
删除表空间
drop tablespace (表空间名xxx)
创建用户
create user (用户名xxx) identified by (密码xxx) default tablespace (表空间名)
删除用户
drop user (用户名xxx) cascade
创建用户权限
grant dba to xxx(用户名)
撤销用户权限
revoke dba from xxx(用户名)


2023年11月8日 星期三
今天学习了Oracle
一.常用命令
1.查看当前系统时间
select sysdate from dual
2.查看当前登录人
select xxx(用户) from dual
3.查询当前用户的所有表
select * from user_tables 
4.查看某张表的结构
Select * from user_tab_cols where table_name = 'xxx' (xxx)表名
5.查看客户端的执行环境
select usernv('language') from dual 

二.创建表
和MySQL一样

字符类型

1.字符型
a)Char:固定长度的字符类型,最多存储2000个字节
b)Varchar2:可变长度的字符类型,最多存储4000个字节
c)Nvarchar2:这是一个包含unicode(中文)格式数据的变长字符串,最多可以存储4000字节的信息
d)Long:大文本类型。最大可以存储2个G

2.数值型
Number:数值类型
例如:
Number(5)最大可以存的数为99999
number(5,2) 最大可以存的数为999.99
integer:integer是number的子类型,它等同于number(38,0),用来存储整数
float:float(n)是number的子类型,数n指示为的精度,n值的范围可以从1到126

3.日期型
a)DATE:日期时间型,精确到秒
b)timestamp:精确到秒的小数点后9位

4.二进制型(大数据类型)
a)clob:存储字符,最大可以存4个G    
b)blob:存储图像、声音、视频等二进制数据,最多可以存4个G

三.修改表

1.添加列
Alter table 表名称 add(列名1 类型 [default 默认值],列名1 类型 [default 默认值]…)
语句:
alter table T_OWNERS add (remark varchar2(20),outdate date)

2.修改字段
alter table 表名称 modify(列名1 类型 [default 默认值],列名1 类型 [default 默认值]...)
语句:
    alter table T_OWNERS MODIFY(remark char(20),outdate timestamp)

3.修改列名
alter table 表名称 rename column 原列名 to 新列名
语句:
        alter table T_OWNERS rename column outdate to exitdate

四.删除列
alter table 表名称 drop column 列名1,列名2;
语句:
        alter table T_OWNERS drop column remark


五.插入数据
语法:
    insert into 表名 [(列名1,列名2,...)] values (值1,值2,....)
执行insert后一定要再执行commit提交事务

六.修改数据
语法:
    update 表名 set 列名1 = 值1,列名2 = 值2, ...where 修改条件;
执行update后一定要再执行commit提交事务

七.删除数据
语法1:
    Delte from 表名 where 删除条件;
执行delete后一定要再执行commit提交

语法2:
Truncate table 表名称
比较truncat与delete实现数据删除?
1.Delete删除的三个月会员可以rollback(回滚)
2.Delete删除可能产生的碎片,并且不释放空间
3.Truncate是先摧毁表结构,在重构表结构

八、修改表名
rename 旧表名 to 新表名

2023年11月9日 星期四

今天学习了Oracle的简单查询,做了两套题

总结:基础语法基本一样,MySQL个别的函数,语法在Oracle中无法使用
例如:limit,year()求年,月,日等在Oracle中无法使用,date类型的语法是to_date('yyyy-mm-ddd','xxxx/xx/xx')形式

一、简单条件查询
1.1、精确查询
select 要求 from 表 where 条件

1.2、模糊查询
select xx from xx where xx like'xx'

1.3、and 运算符
select xx from xx where 条件1 and 条件2

1.4、or 运算符
select xx from xx where 条件1 or 条件2

1.5、and 与or 运算符混合使用
select xx from xx where (条件1 or 条件2) and 条件3
因为and的优先级比or大,所以我们需要用()来改变优先级

1.6、空值查询
select xx from xx where xx is (not) null

1.7、范围查询
select xx from xx where xx 
between…and…来实现

>=和<=来实现

二、去掉重复记录
select distinct xx from xxx....

三、排序
asc 升序
desc 降序

四、伪列
在Oracle的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就像表中的列一样,但是在表中并不存储。伪列只有查询,不能进行增删改操作。接下来学习两种伪列:rowid和rownum
4.1、rowid
表中的每一行在数据文件中都有一个物理地址,rowid伪列返回的就是该行的物理地址。使用rowid可以快速定位表中的某一行。Rowid值可以唯一的标识表中的一行。由于rowid返回的是该行的物理地址,因此使用rowid可以显示行如何存储的
查询语句:
    Select rowid,t.* from xx
4.2、rownum
在查询的结果集中,rownum为结果集中每一行标记一个行号,第一行返回1,第二行返回2,以此类推。通过rownum伪列可以限制查询结果集中返回的行数
查询语句:
    select rownum,t.* from xx

五、聚合函数
sum,avg,max,min,count
六、分组函数
group by
七、分组后条件查询
having


2023年11月10日 星期五
今天学习了Oracle的多表查询,函数,分页查询

一、多表查询
与MySQL一样语法基本没有变化
1.多表内连接查询
例如:
select a.xxx,b.xxx,a.ooo from 表 a,表 b where a.条件=b.条件
2.左外连接查询
例如
方法一:
select a.xxx,b.*  from 表 a,表 b where a.条件=b.条件(+)
方法二:
select a.xxx,b.*  from 表 a left join 表 b on a.条件=b.条件
3.右外连接查询
同左
4.子查询
① 单行子查询
a)只返回一条记录
b)单行操作符

② 多行子查询
a)返回多条记录
b)多行操作符

二、分页查询
1.简单分页
Oracle进行分页查询,需要用到伪列rownum和嵌套查询
例如
单页多条
select rownum,x.* from 表名 x where rownum <= y;   (x是起的名,y是分多少条记录)

多页多条
select * from (select rownum m,x.* from 表名 x where rownum <= y) where x > z   (x是起的名,y是分多少条记录,z是从那一条记录起分页)
2.基于排序的分页
原理:先排序,后分页,最后再循环
select * from (select rownum m,x.* from (select * from 表名 order by 条件 desc) x where rownum <=  y) where x >z  (x是起的名,y是分多少条记录,z是从那一条记录起分页)

三、函数
1.单行函数
①字符函数
ascii     返回对应字符的十进制                                  select ascii('10') from dual
chr       出十进制返回字符                                     select chr('95') from dual
concat    拼接两个字符串,与||相同                              select 'mysql'||'orale' from dual
initcap   将字符串的第一个字母变大写                            select initcap('mysql') from dual
instr     找出某个字符串的位置                                  select instr ('日日花钱长冰酒','花钱',1,1) from dual
instrb    找出某个字符串位置和字节数                            select instrb ('日日花钱长冰酒','花钱',1,1) from dual
length    以字符给出字符串的长度                               select length ('你好') from dual
lengthb   以字节给出字符串的长度                               select lengthb('你好') from dual
lower     将字符串转为小写                                     select lower ('MYSQL') from dual
upper     将字符串转为大写                                    select upper ('oracle') from dual
lpad      使用指定的字符在另一个字符的左边填充                  select lpad ('skl',10,'sjs') from dual   
rpad      使用指定的字符在另一个字符的右边填充                  select rpad ('kkka',12,'iqoe') from dual 
ltrim     在左边裁剪掉指定的字符                              select ltrim ('mysql','my') from dual
rtrim     在右边裁剪掉指定的字符                              select rtrim ('oracle','cle') from dual
replace   执行字符串的搜索和替换                              select replace ('sksldi','s','o') from dual
translate 执行字符串的搜索和替换                              select translate('sksldi','s','o') from dual
substr    取字符串的子串                                      select substr('2585858',2,3) from dual
substrb   取字符串的子串(以字节的形式)                       select substrb('你还好吗',1,3) from dual
soundex   返回一个同音字符串                                  select soundex ('mysql') from dual
trim      裁剪掉后面或前面的字符串                            select trim ('solifajne') from dual


②数值函数
1、ABS(n)函数:返回数字的绝对值    (绝对值)

    select ABS(-7) FROM DUAL
    
    结果:7

2、SIGN(x)函数:检测x的正负.如果x<0返回-1.如果x=0返回0.如果x>0返回1.   (取整-1,0,1)

    select SIGN(-7) FROM DUAL
    结果:-1

3、CEIL(n)函数:返回大于或等于n的最小的整数值                          (取整)

    select CEIL(1.3) FROM DUAL
    
    结果:2

4、FLOOR(n)函数:返回小于或等于n的最大的整数值                        (取整)

  select FLOOR(1.3) FROM DUAL

  结果:1

5、MOD(number,divisor)函数:取余。number为被除数,divisor为除数。如果divisor为0,则返回number    (取余)

  select MOD(6,4) FROM DUAL

  结果:2

6、SQRT(X)函数:X的平方根                                        (平方根)

 select SQRT(4) FROM DUAL

 结果:2

7、COS(n)函数:返回n的余弦值                                       (余弦)

 select COS(0) FROM DUAL

 结果:1

8、ACOS(n)函数:反余弦函数,n between -1 and 1,返回值between 0 and pi,输出以弧度为单位.       (反余弦)

 select ACOS(1) FROM DUAL

 结果:0

9、COSH(n)函数:计算n的双曲余弦值.                     (双曲余弦)                           

 select COSH(0) FROM DUAL

 结果:1

10、SIN(n)函数:返回n的正弦值,n为弧度          ()          (正弦)

 select SIN(0) FROM DUAL

 结果:0

11、ASIN(n)函数:返回n的反正弦值. n的范围应该是-1到1之间,返回的结果在-pi/2到pi/2之间,以弧度为单位.  (反正弦)

 select ASIN(0) FROM DUAL

 结果:0

12、SINH(n)函数:返回n的双曲正弦值,n为弧度           (双曲正弦)

 select SINH(0) FROM DUAL

 结果:0

13、TAN(n)函数:返回n的正切值,n为弧度                 (正切)

 select TAN(0) FROM DUAL

 结果:0

14、ATAN(n)函数:计算x的反正切值.返回值在-pi/2到pi/2之间,单位是弧度.    (反正切)

select ATAN(0) FROM DUAL

结果:0

15、ATAN2(x,y)函数:返回x除以y的反正切值.结果在负的pi/2到正的pi/2之间,单位是弧度.      (x除以y的反正切)

select ATAN2(0,1) FROM DUAL

结果:0

16、TANH(n)函数:返回n的双曲正切值,n为弧度                   (双曲正切)

select TANH(0) FROM DUAL

结果:0

17、POWER(X,Y)函数:X的Y次幂                                       (X的Y次幂)

select POWER(2,3) FROM DUAL

结果:8

18、LOG(X,Y)函数:X为底Y的对数,X>0 and not 1,Y>0             (对数)

select Log(2,4) FROM DUALLN(x)函数

结果:2

19、EXP(x)函数:计算e的x次幂. e为自然对数,e=2.71828...      (e的x次幂)

select EXP(1) FROM DUAL

结果:2.71828182845905

20、LN(x)函数:返回x的自然对数. x必须是正数,并且大于0             (指数)

select LN(2.71828182845905) FROM DUAL

结果:1

21、TRUNC(X[,Y])函数:X在第Y位截断。直接截取,不四舍五入。y缺省值为0。y>0,就是四舍五入到小数点右边y位。若y<0,四舍五入到小数点左边|y|位。                                      (截取)
                                       
select TRUNC(1.126,2) FROM DUAL

结果:1.12

22、ROUND(X[,Y])函数:X在第Y位四舍五入                    (四舍五入)

select ROUND(2.123,2) FROM DUAL
结果:2.12

23、BITAND(n1,n2)函数:位与运算符。3和9转为二进制分别为0011和1001,做位与运算得到0001,转换为十进制数为1.

select BITAND(3,9) FROM DUAL            (位与运算符)
结果:1

24、BIN_TO_NUM(n1,n2,……n)函数:二进制转向十进制

select BIN_TO_NUM(1,0) FROM DUAL                  (二进制转向十进制)
结果:2


③日期函数
1、sysdate、current_date及systimestamp
sysdate

Oracle使用计算机操作系统的当前日期和时间,是通过sysdate函数实现的,在任何可以使用Oracle函数的地方都可以使用sysdate函数,可以将它视为每个表的一个隐藏列或者伪列。也就是说即使一张表没有sysdate这个字段,也可以如下这样查询。

select sysdate from 表名;

current_date

此字段返回的是当前会话的时区的系统日期,我们一般使用的是东八区的时间,如果将当前会话时间修改成东九区试试:

alter session set time_zone='+09:00'; 
select current_date, sysdate from dual;

通过例子就很明显看出两者区别了,一个依赖于时区,一个不依赖。

systimestamp

函数systimestamp,它返回的是本机的系统时间,精确到微秒,并包含了当前时区,它跟会话的时区无关。

select  systimestamp  from dual

2、两个日期的差
如何计算两个日期的差呢,可以直接进行相减,返回的数值单位是天,也可以用一个日期加减某个数值代表N天后(前)。

比如十天后发工资,那么十天后是哪一天呢?

select  sysdate+10 from dual 

再比如今年春节是2023-01-22,那么距离过年还有哪个多少天呢?

select to_date('2023-01-22','yyyy-MM-dd') - sysdate from dual  

3、添加月份、减少月份
既然天数可以加减,那么月份是否也可以这样操作了。其实就用到了这个函数:add_months,不管是向前或向后查,只不过是参数是正还是负而已。

例如:查询一下三个月后、两个月前分别是哪一天:

select add_months(sysdate,3), add_months(sysdate,-2)   from  dual 

>> 2023-01-15 23:23:40  2022-08-15 23:23:40

那么对于年份呢,只要在上面参数基础上乘以12就可以推算了。

4、greatest和least
这两个函数在数值函数中分别代表取一组数值中的最大值和最小值,在日期中也有相关应用。greatest是从一组日期数据中取距离当前最近的日期,least是在一组日期中选择最早的日期。

select greatest(to_date('2013-11-11','yyyy-MM-dd'),to_date('2013-12-11','yyyy-MM-dd'),to_date('2014-01-05','yyyy-MM-dd'),to_date('2013-11-11','yyyy-MM-dd')) from dual

>> 2014-01-05 00:00:00

select least(to_date('2013-11-11','yyyy-MM-dd'),to_date('2013-12-11','yyyy-MM-dd'),to_date('2014-01-05','yyyy-MM-dd'),to_date('2013-11-11','yyyy-MM-dd')) from dual

>> 2013-11-11 00:00:00

值得注意的是,这里必须用to_date对字符串进行转化,否则会把他们无法判断是否为日期格式,只能当成字符串去处理,容易出现结果错误的情况。

5、next_day
此函数表示从指定日期开始算,下周几是几号?此函数的第二个参数范围是[1,7],超出范围会报错,注意的是:1代表周日,7代表周六。

select next_day(to_date('2022-10-15','yyyy-MM-dd'),2) from dual

>> 2022-10-17 00:00:00

如上sql表示,假设今天是10月15日,下个周二是10月17日。如果参数超出范围会报错:

select next_day(to_date('2022-10-15','yyyy-MM-dd'),8) from dual  

> ORA-01846: 周中的日无效

6、last_day
此函数用来计算某个月的最后一天是哪天,有了这个函数就不要每个月都判断一下了。

select last_day(sysdate) from dual

>> 2022-10-31 23:36:12

select last_day(to_date('2022-11-15','yyyy-MM-dd')) from dual

>> 2022-11-30 00:00:00   

7、months_between
此函数用来计算两个日期之间相差的月份数,返回结果可能带小数。例如计算下自己的周岁,才发现还未成年呢~

  select floor(months_between(sysdate ,to_date('2005-08-24','yyyy-MM-dd'))/12) from dual

>> 17

8、组合日期函数
如上列举的日期函数中,根据参数格式都可以组合使用。

举例:小刚2022年10月28日入职新公司,两个月试用期,新员工过了试用期后的每月第一天可以做转正报告。那小刚什么时候可以做转正报告?

select last_day(add_months(to_date('2022-10-28','yyyy-MM-dd'),2))+1 from dual

>> 2023-01-01 00:00:00

思路:先用add_months计算俩月后是哪一天,再用last_day计算那个月的最后一天,再+1代表下个月的第一天。

9、round 和 trunc
在数值函数中,round和trunc函数是对小数的处理,那么在日期函数中,是否有相同或类似的应用呢?

我们用一个日期减去另一个日期的时候经常会带有小数,这是因为Oracle中保留了时、分、秒。有的时候我们不需要时、分、秒,所以就需要用到round和trunc这两个函数了。

round函数作用是:如果某天的时间在中午之前,那么使用round函数会将该天的时间设置为0点(就是午夜),如果为中午之后就设置为次日零点,这也就是时间方面的四舍五入了。

trunc的函数作用:舍去,无论某天处于什么时间,使用trunc函数后都会将改天时间置为当日0点。

select sysdate from dual

>> 2022-10-15 23:46:48
>> select to_date('2022-10-17','yyyy-MM-dd')-round(sysdate), to_date('2022-10-17','yyyy-MM-dd')-trunc(sysdate) from dual  
>> 1  2

如上,今天是10月15日 23点,因此round(sysdate)四舍五入为次日零点,即10月16日零点,因此距离17日相差1天。而trunc(sysdate)则是15日,因此相差2天。

10、使用to_date 和 to_char设置日期时间格式
基本使用

函数to_date 和 to_char作用是相反的,但是用法很类似。

to_date是将字符串转换为时间格式,而to_char是将日期转换为字符串格式。这两个函数我们平时用的实在是太多了,举例说明一下。

select to_date('2022/11/11 12:01:14','yyyy-MM-dd HH:MI:SS') from dual

>> 2022-11-11 12:01:14

select to_char(sysdate, 'yyyyMMdd HH:MI:SS') from dual

>> 20221015 11:54:17

在函数to_char使用的时候可以在format参数中插入字符串,以双引号的方式插入

select to_char(sysdate , 'yyyy"年"MM"月"dd"日"')  from  dual;

>> 2022年10月15日

最常见的to_char错误

在转换的时候,月份和分钟经常混淆。这里要注意下,MM代表的是月份,MI代表是分钟,由于Oracle中支持的时间很灵活,所以这块弄混了不会提示的。

select to_char(sysdate ,'yyyy-MI-dd  hh:mm:ss') from dual

>> 2022-57-15  11:10:36

如上,即使MI与MM互换了位置也不会报错的。如果分钟的数值是1-12内,那这个错就很难发现了。

to_date整形参数

函数to_date的参数不仅可以接受字符串的参数,还可以接受数值类型的参数,这样使Oracle处理时间更加的灵活。

select  to_date(20221222,'yyyy-MM-dd') from dual 

>> 2022-12-22 00:00:00

11、new_time 切换时区
先看下函数参数用法:new_time(date,‘this’,‘other’),函数共有3个参数:date代表的是this时区的时间,‘this’代表的是用三个字母组成的缩写代替,代表当前时区,‘other’也是用三个字母组成的缩写代替,表示其他时区。听起来比较模糊,举例理解一下。

查询一下‘2022-10-01 12:00:00’这个时间在北京和夏威夷的时间分别是多少?

select  to_date('2022-10-01 12:00:00','yyyy-MM-dd hh24:mi:ss'),new_time(to_date('2022-10-01 12:00:00','yyyy-MM-dd hh24:mi:ss'),'EST','HST') from dual

>> 2022-10-01 12:00:00  2022-10-01 07:00:00

其中,EST和HST都是全球时区的缩写,可以另行科普一下。

12、EXTRACT
函数EXTRACT可用来代替to_char函数来选择日期值中的某一部分(如从一个日期中选择月份和天)。

SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL;  

>> 2022 
>> SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL;   
>> 10
>> SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL;   
>> 16

注意:EXTRACT抽取年月日部分和抽取时分是不同的,抽取时分的时候需要这样写:

SELECT EXTRACT(hour FROM TIMESTAMP  '2022-12-22 22:34:12') FROM DUAL

>> 22
>> SELECT EXTRACT(minute FROM TIMESTAMP  '2022-12-22 22:34:12') FROM DUAL
>> 34

其实,这个函数的功能几乎可以用to_char取代,因为其功能完全可以替代,如下:

select to_char(sysdate ,'yyyy') from dual

>> 2022
>> select to_char(sysdate ,'HH') from dual
>> 12


④转换函数
1、to_char()函数:将DATE或者NUMBER转换为字符串
2、 to_date()函数:将number、char转换为date
3、 to_number()函数:将char转换为number


⑤其他函数
1、NVL(X,VALUE)

如果X为空,返回value,否则返回X

2、NVL2(x,value1,value2)

如果x非空,返回value1,否则返回value2

⑥分析函数(排名函数)
1.rank()
相同的值排名相同,排名跳跃
select rank() over(order by xxx.yyy desc) from xxx (xxx表名)(yyy列名)
结果
例如12225668形式
2.dense_rank()
相同的值排名相同排名连续
select dense_rank() over(order by xxx.yyy desc) from xxx (xxx表名)(yyy列名)
结果
例如 123344456形式
3.row_number()
select row_number() over(order by xxx.yyy desc) from xxx (xxx表名)(yyy列名)
结果
例如123456789形式
结果一样也这样排

partition by 是 SQL 语言中的一个用于实现数据分段的关键字。它的作用是对结果集进行逻辑分组,在每个分组中进行独立的计算

 查询各科成绩前三名的记录:(不考虑成绩并列情况)
select l.* from (select cid,rore,row_number()over(partition by cid order by cid,rore desc) as salary_rank from r 
) l where l.salary_rank<=3;

2023年11月11日 星期六
今天没有学习新内容用Oracle做了两套题
收获:体会了一下Oracle做题比MySQL难一些,主要是插入数据时没有办法一次性插入多行数据
只能一条一条的插入十分的麻烦,改表名的语句也和MySQL不同
直接用
rename 旧表名 to 新表名

每次改为或插入数据后都得写commit,否则最后的文件是空的
绝大部分语法还是相同的,limit没有了取而代之的时rownum


2023年11月13日 星期一
今天没有学习新内容,做了三套题
收获:MySQL中now()没有了,取而代之的是sysdate

extract(year from sysdate) "year", //获取当前时间的年

extract(month from sysdate) "moth", //获取当前时间的月

extract(day from sysdate) "day" //获取当前时间的日


2023年11月14日 星期二
今天没有学习新内容做了两套题
收获
求2023年3月12日前一周上架的商品
select next_day(to_date('2023-03-12','yyyy-mm-dd'),1)-14 from dual                                   ----上个星期天
select next_day(to_date('2023-03-12','yyyy-mm-dd'),'星期一')-14 from dual                         ----上个星期一
select next_day(to_date('2023-03-12','yyyy-mm-dd'),'星期六')-7 from dual                         ----这周星期六

select good_name from goods where create_time between (select next_day(to_date('2023-03-12','yyyy-mm-dd'),'星期一')-14 from dual) and (select next_day(to_date('2023-03-12','yyyy-mm-dd'),1)-14 from dual )
中式星期 (周一至周天)

select good_name from goods where create_time between (select next_day(to_date('2023-03-12','yyyy-mm-dd'),1)-14 from dual) and (select next_day(to_date('2023-03-12','yyyy-mm-dd'),'星期六')-7 from dual)

美式星期 (周天至周六)

2023年11月15日星期三
今天没有学习新内容做了三套题
收获
求哪个商品利润率最高
select good_name,concat((price-cost)/cost*100,'%') from goods
利润率=(商品卖价-商品成本)/成本*100%
学会了如何用具体日期转星期几

to_char('具体日期',‘day’) 


2023年11月16日 星期四
今天没有学习内容 ,做了三套题

2023年11月17日 星期五
今天做了俩套题
查询所有员工入职以来的工作期限,用“**年**月**日”的形式表示。
select ename, trunc(months_between(sysdate, edate) / 12) || '年' || trunc(mod(months_between(sysdate, edate), 12)) || '月' || trunc(mod(sysdate - add_months(edate, trunc(months_between(sysdate, edate) / 12) * 12), 30)) || '日' as "工作期限" from mm;


显示员工雇佣期 6 个月后下一个星期一的日期
select next_day(add_months(edate,6),'星期一') from mm

将各部门员工的工资修改为该员工所在部门平均工资加1000。
select dept,avg(sal)from mm group by dept

update mm a set sal=1000 +(select avg(sal)from mm b group by dept
 having a.dept=b.dept )


2023年11月18日 星期六
今天把Oracle卸载了又安装了一遍
总结:这个软件千万千万要按照步骤卸载,否则有残留会导致安装失败,只有刷机才能解决
,复习了一些Oracle的语法

2023年11月20日 星期一
今天复习,学习Oracle 的语法知识点
简单的背了一会

2023年11月22日 星期三
今天把学过的Oracle知识都回顾了一遍,发现了一些错误,或和MySQL不同的语句

sourceString:要进行转换处理的源字符串;
formatParm:格式参数,源字符串按照该参数的指定格式进行转换,是可选参数;
nlsParm:nls设置参数,是可选参数。
formatParm参数值说明:

YEAR:年份;
YYYY:四位数年份;
YYY:年份的最后三位数;
YY:年份的最后两位数;
Y:年份的最后一位数;
MONTH:月份的全称;
MON:月份的简称;
MM:两位数月份;
DAY:一周中得到第几天全称;
DD:一个月当中的第几天;
HH24:小时(24小时制);
HH12:小时(12小时制);
Mi:分;
SS:秒;

2023年11月27日 星期一
学习了Oracle的集合运算和视图
集合运算
1.union all(并集):返回各种查询的所有记录,包括重复记录
2.union (并集):返回各个查询的所有记录,不包括重复记录
3.intersect (交集):返回两个查询共有的记录
4.minus (差集):返回一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录
视图
1.创建视图语句
Create [or replace] [force] (没有表时加这个) view 视图名称 as subquery(增删改查语句) [with check option] (约束) [with read only](限制操作)(Oracle专有)

Or replace:若所创建的视图已经存在,oracle自动重建该视图;
Force:不管基表是否存在oracle都会自动创建该视图;
Subquery:一个完整的select语句,可以在该语句中定义别名;
With check option:插入或修改的数据行必须满足视图定义的约束;
With read only:该视图不能进行任何DML操作-
2.删除视图
drop view 视图名


2023年12月1日 星期五
今天学习了Oracle序列
1.什么是序列
序列是oracle提供的用于产生一系列唯一数字的数据库对象        等同于MySQL中的自增

2.创建和使用简单的序列
创建
create sequence 序列名称

查询下一个值
select 序列名称.nextal from dual
提取当前值
select 序列名称.currval from dual

Nextavl 访问序列的下一个值
Currvar 返回序列的当前值
我们在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值

3.创建复杂的序列

语法:
create sequence sequence -- 创建序列名称
    [increment by] -- 递增的序列值是n如果n是正数就递增,如果是负数就递减 默认是1
    [start with n] -- 开始的值,递增默认是 minvalue 递减是 maxvalue
    [{maxvalue n | nomaxvalue}] -- 最大值
    [{minvalue n | nominvalue}] -- 最小值
    [{cycle | nocyle}] -- 循环/不循环
    [{cache n | nocache}]; -- 缓存到内存中

例1.
创建有最大值的非循环序列
create sequence seq_test1
increment by 10
start with 10
maxvalue 300
minvalue 20
会报错

是由于我们开始值小于最小值。开始值不能小于最小值没修改

以下语句:

create sequence seq_test1
increment by 10
start with 10
maxvalue 300
minvalue 5
我们执行下列语句提取序列值,当序列值为300(最大值)的时候再次提取值,
系统会报异常信息


例2.
创建有最大值的循环序列
create sequence seq_test2
increnment by 10
start with 10
maxvalue 300
minvalue 5
cycle;
当序列当前值为300(最大值),再次提取序列的值
select seq_test2.nextval from dual;
提取的值为:
 5
由此我们得到结论,循环的序列,第一次循环是从开始值开始循环,而第二次循环是从最小值开始循环。


例3.
创建带缓存的序列
create sequence seq_test3
increment by 10
start with 10
maxvalue 300
minvalue 5
cycle
cache 50;
我们执行上边语句的意思是每次取出50个缓存值,但是执行会提示错误

上边错误提示的意思是:缓存设置的数必须小于每次循环的数
我们缓存设定的值是50,而最大值是300,那么为什么还会提示这样的信息呢?
因为我们的cache虽然是50,但是我们每次增长值是10,这样50次缓存提取出的数是500(50*10)

我们更改为下列语句:
create sequence seq_test4
increment by 10
start with 10
maxvalue 500
minvalue 10
cycle
cache 50;
下列语句依然会提示上边的错误,这是因为还存在一个minvalue,minvalue和
Maxvalue之间是490个数,也就是一个循环可以提取490,但是我们的缓存是500

我们再次修改语句:
create sequence seq_test4
increment by 10
start with 10
maxvalue 500
minvalue 9
cycle
cache 50;
把最小值减1,或把最大值加1,都可以通过


公式:cache <= ceil(maxvalue – minvalue)/abs(increment)

修改和删除序列

修改序列:使用alter sequence语句修改序列,不能更改序列的start with参数
Alter sequence 序列名称 maxvalue 5000 cycle;
删除序列:
Drop sequence 序列名称

索引

1.创建索引

create index 索引名称 on 表名(列名,列名....)

2.修改索引

重命名索引
alter index 索引名称 rename to 新索引名称

合并索引
alter index 索引名称 coalesce

修改某列
先删除再创建,创建时改一下

3.删除索引
drop index 索引名称


 

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值