数据库随堂笔记.docx
《数据库随堂笔记.docx》由会员分享,可在线阅读,更多相关《数据库随堂笔记.docx(112页珍藏版)》请在冰点文库上搜索。
数据库随堂笔记
数据库笔记day01
DB和DBMS
数据库,简称DB。
DBMS是数据库的管理软件。
关系数据库简介:
使用关系模型把数据组织到二维数据表(Table)中.
表:
一个关系数据库由多个数据表(table)组成。
分为行和列。
SQL:
结构化查询语言,所有数据库都能懂MY也能懂
SQL:
是在关系数据库上执行数据操作,检索以及维护所使用的语言,可以用来查询数据,操作数据,定义数据,控制数据。
其实就是操作数据都,都是废话
所有数据库都使用相同或者相似的语言
SQL分为:
DDL:
数据定义语言,创建数据库对象,删除数据库对象.(create,alter修改,drop删除,truncate删除表数据,保留表结构)。
DML:
操作数据语言,添加,删除,更改数据,DML操作一定会影响数据库中表的数据。
(insert将数据插入数据表中,update更新数据库中已存在的数据,Delete删除表中的数据)
TCL:
事物控制语言。
(COMMIT:
提交,确认已经进行的数据改变。
ROLLBACK:
回滚,取消已经进行的数据改变,SAVEPOINT:
保存点,使当前的失误可以回退到指定的保存点,便于取消部分改变。
)
DQL:
数据查询语言,例如:
所有大于30岁的人都是谁。
数据库中90%都是DQL。
DCL:
数据控制语言,用户授权什么的。
(GRANT授权,REVOKE:
用于收回用户已有的权限,Createuser:
创建用户)
什么是数据库对象:
数据库对象通常包含表,视图,序列,索引。
ORACLE数据类型
NUMBER(P,S)
NUMBER(4)4位整数NUMBER(7.2)五位整数两位小数,一共七位。
最多能保存38位的P
CHAR
表示固定长度的字符类型,表示的是字符串,并且是用单引号来括着的。
Char的弊端是容易造成空间浪费。
Enamechar(20)保存的值是字符串,但是只能有20个字节。
Char(N)最多是2000个字符。
VARCHAR2
变长字符串,长度最大的4000个字节,例如JobVARCHAR2(100)表示job列中最多可存储长度为100个字节的字符串,根据其中保存的数据长度,占用的空间是变化的,最大占用100个字节。
在别的DBMS中就叫VARCHAR
VARCHAR的弊端是运算时间比CHAR长一些
总结:
VARCHAR2是oracle独有的数据类型,但是VARCHAR2是永远不会变的。
VARCHAR有可能会变。
VARCHAR是边长字符串,空间利用好,但是比CHAR相比会计算时间长一些。
DATE
DATE用于定义日期时间的数据,一个DATE占7个字节,默认格式是:
DD-MON-RR,例如:
“11-APR-71”。
如果是中文环境,是“11-4月-71”这种形式。
注意:
RR表示年。
创建表
.CREATE语句
CREATETABLEemp(
idNUMBER(10),
nameVARCHAR2(20),
genderCHAR
(1),
birthDATE,
salaryNUMBER(6,2),
jobVARCHAR2(30),
deptidNUMBER
(2)
);
DROPTABLE
删除给定的表。
例如:
DROPTABLEemployee
DESC
查看表结构。
看到表的列名,以及对应的类型,长度等。
例如:
DESCemployee
DEFAULT
数据库中,无论表中的字段是什么类型在插入数据时只要没有指定该字段对应的值,默认都是插入null。
若希望指定特殊的默认值,可以使用DEFAULT关键字。
只能在创建表的时候使用。
无论什么数据类型,默认值都是NULL。
例如:
genderCHAR
(1)DEFAULT'M'
注意:
数据库中字符串是用单引号括起来的,而且内容区分大小写。
SQL语句本身不区分大小写。
NOTNULL
非空(NOTNULL)是一种约束条件,用于确保字段值不为空
nameVARCHAR2(20)NOTNULL
修改表名
RENAMEold_nameTOnew_name
例如:
RENAMEemployeeTOmyemp
增加列
向表中添加新的字段:
需要注意的是,只能向表的末尾追加新的字段,而不能在现有字段中间插入新的字段。
ALTERTABLE的意思就是修改表。
ADD就是添加的意思。
可以增加多列,拿逗号隔开即可。
例如:
ALTERTABLEmyemp
ADD(
hiredateDATEDEFAULTSYSDATE
)
删除一个字段:
ALTERTABLEmyemp
DROP(hiredate);
修改字段:
ALTERTABLEmyemp
MODIFY(
jobVARCHAR2(40)DEFAULT'CLERK'
);
修改字段时要注意,若表中有数据,类型尽量不改变,而且长度最好变长不要变小!
修改后的数据,只会对之后新增数据造成影响不会影响现有数据。
但是尽量不要改变数据类型,而且长度也往长了改。
DML语句:
向表中插入数据
INSERT语句
例如:
INSERTINTOmyemp
(id,name,job,salary)
VALUES
(1001,'rose','PROGRAMMER',5500);
需要注意的是,VALUES后面给出的值应当与上面列出的列的顺序,类型对应号。
若不指定字段,则是全列插入。
所有数据都要插入
例如:
INSERTINTOmyemp
VALUES(....);
这里所有字段的值都要给!
但强烈建议就算是全列插入,也把列都列出来。
所有数据都要插入一个都不能少。
插入操作时要遵循创建表时候的规则,比如非空约束
Insert时,插入时间的时候。
可以使用to_date()函数
To_date(‘2001,1,1’,’YYYY-MM-DD’)
这里的MM不管是大小写都是月
更新数据语法
例如:
Updateemp_zxzsetsalary=8500wherename=’JACK’;
如果没有where条件那么就所有salary都成为了8500.
注意:
oracle中字符串是严格区分大小写的,名字错了就无法修改,显示0行已更新。
删除表数据
Deletefromemp_zxzwhere条件
如果不加筛选条件,那么则是全部数据都删除。
所以必须加where条件。
Trancate语法是Trancatetableemp_zxzwhere?
Trancate会直接全部删除,它不受事物控制所以效率更高,但是trancate不能回退,一删就是大删除
COMMIT提交语句
ROLLBACK回滚
修改列名
Altertable表名renamecolumn旧名to新名
数据库笔记day02
CHAR和VARCHAR2的储存编码
默认单位是字节:
CHAR(10),等价于CHAR(10byte)
指定单位为字符:
CHAR(10CHAR),20个字节
VARCHAR2(10)==VARCHAR(10BYTE)
指定单位为字符:
VARCHAR2(10CHAR)20个字节
CHAR最大长度为2000个字节
CHAR可以不指定长度,默认为1.VARCHAR2必须指定
VARCHAR2最大长度为4000个字节
LONG和GLOB类型
LONG在java中描述的是长整形的整数。
但是在oracle中是varchar的加长版,存储边长字符串,最多打2GB的字符串数据。
。
不能使用索引。
还不能写在查询条件where中。
GLOB更长,存储订场或者变长字符串,最多达4G。
--dual伪表实际没有这张表,
--为了满足语法要求,从该表
--只能查询一条数据。
SELECT
UPPER('helloworld'),
LOWER('HELLOWORLD'),
INITCAP('HELLOWORLD')
FROM
dual
字符串函数
CONCAT和“||”
||在数据库中是连接字符串,相当于java中的”+”号
例如:
java中“HELLO”+”WORLD”=”HELLOWORLD”
DB中”HELLO”||”WORLD”=”HELLOWORLD”
SELECTename||':
'||salFROMemp;
LENGTH函数
--查看每个员工名字的字符数量
SELECTename,length(ename)FROMemp
UPPER(大写),LOWER(小写),INITCAP(首字母大写)函数
Upper(char)lower(char)initcap(char)
案例:
--查看scott的员工信息
SELECT*
FROMemp
WHERELOWER(ename)=LOWER('Scott')
Trim函数
语法:
trim(‘X’from‘XXXXXXXX’)
参数From前面的字符必须是单一字符。
Ltrim:
去除左边LTRIM(‘eeellleeee’,’e’)
Rtrim:
去除右边RTRIM(‘eeeellleee’,’e’)
若没有from以及前面的字符,则就是取出空白。
左右去空白在不指定第二个参数的情况下,默认也是去空白
--去除字符串两边的指定字符
SELECT
TRIM('e'from'eeeeeeliteeeeeee')
FROMdual
去右侧空白以及去左侧空白Ltrim(Rtrim)(‘需要去规定字母的字符串’,’去掉的字母’)
SELECT
RTRIM(
'eseseseslitesedexsetses',
'sedxt')
FROMdual
LPAD补位函数RPAD
需要输入三个内容:
第一个是内容,第二个是总长,第三个是如果不够的话补一个字符
例如:
要求显示20个字符,若sal的值不足长度,则补充若干个$以达到20个字符
selectLPAD(sal,'20','$')fromemp_zxz;$$$$$$$$$$$$$$$$$800
selectRPAD(sal,'20','$')fromemp_zxz;800$$$$$$$$$$$$$$$$$
不管是左补位还是右补位,都是从左往右截取之后看你是左补位还是右补位
--补位函数
SELECTLPAD(sal,3,'$')FROMemp
另外一种情况
selectLPAD('aaaaaa',5,'#')fromdual;输出结果是aaaaa
--截取字符串subStr
Sub(‘被截取的字符’,8(开始的位置),20(截取的个数))
如果开始的位置大于0,则从头开始。
如果开始的位置小于0,则从尾部开始
字符串的计数从1开始
SELECTSUBSTR('thinkinginjava',1,2)FROMdual;
开始位置小于1,从倒数第X个开始从前往后截取多少个。
例如:
selectsubstr('abcdefghijklmnopqrstuvwxyz',-6,3)fromdual;
就是从倒数第6个开始取3个
截取个数不能是0和负数,那样结果会是null。
如果不写截取个数,那么就是从开始位置连续取到字符串的末尾。
--查找位置
INSTR(CHAR1,CHAR2[,N[,M]]);
指定字符串CHAR2在CHAR1中从N的位置开始搜索,第m次出现的位置。
SELECT
INSTR('thinkinginjava','in',4,2)
FROM
dual
selectinstr(‘doctorwho’,’who’)fromdual-----8不写第几次出现的话默认就是第一次找到who的位置
selectinstr('doctorwhowhowho','who',9)fromdual;------12从第9个位置开始第一次出现的位置
selectinstr('doctorwhowhowho','who',9,2)fromdual;------16从第9个位置开始第2次出现的位置
selectinstr('doctorwhowhowho','who',9,3)fromdual;---------0从第9个位置开始第3次出现的位置,返回0的意思是没有找到。
如何插入多个参数:
--四舍五入
Round(n,m)取n值保留小数点后m位
SELECTROUND(45.678,2)FROMDUAL45.68
SELECTROUND(45.678,0)FROMDUAL46
SELECTROUND(45.678,-1)FROMDUAL50
若m值为-1,意思就是保留小数点前1位。
保留到m位看m-1位也就是说看m位的后一位。
Trunc截取数字的,保留原来的位数,不关心四舍五入的函数
SELECTTrunc(45.678,2)FROMDUAL---45.67
不关心四舍五入,只做保留
SELECTtrunc(45.678,-1)FROMDUAL---40
SELECTtrunc(45.678,-2)FROMDUAL----0
selecttrunc(45.678,0)fromdual;45
selecttrunc(45.678)fromdual;45如果不写保留的值,那么默认为0
MOD取余数
MOD(M,N)返回的是M/N取的余数
selectmod(5,2)fromdual-------1
selectmod(5,0)fromdual-------5
CEIL和FLOOR
1.CEIL(n)和FLOOR(n)这两个函数故名思议就是一个天花板,取大于或者等于n的最小正数值。
另外一个是地板,就是取小于或者等于n的最大整数值
例如:
selectceil(45.678)fromdual-------46.取了大于或者等于45.678的最小整数值
selectfloor(45.6678)fromdual;--------45取小于或者等于45.678的最大整数值
--sysdate当前时间的系统时间
关键字,返回一个当前系统时间的DATE值
INSERTINTOemp(empno,ename,sal,hiredate)VALUES(1001,'JACK',5000,SYSDATE)
--时间戳类型的当前系统时间
selectsysdatefromdual;-----当前系统时间
selectsystimestampfromdual;-----当前系统时间精确到毫秒
TO_DATE函数,用于将字符串按照给定的日期格式字符串
转化为日期
selectto_date(sysdate,'YY-MM-DDhh:
mi:
ss')fromdual;这样是错的,因为要sysdate已经是一个date类型了,而这个函数是将字符串转date。
所以报错
两个日期可以进行减法操作,差为相差的天数。
Selectsysdate-hirdatefromemp_zxz
TO_CHAR(date,’’)
作用是:
将其他类型(日期,数值)的数据转换为字符类型,主要应用在日期类型上。
语法:
to_char(date,’’)
案例:
selectto_char(SYSdate,'YYYY"年"MM"月"DD"日"')fromdual;-------2015年07月22日
日期常用函数:
LAST_DAY(date):
返回日期date所在月的最后一天
用法:
常用于,在按照自然月计算某些业务逻辑,或者安排周末性活动时很有用处。
例如:
selectlast_day(sysdate)fromdual;返回的是系统所在月的最后一天
selectlast_day('07-7月-2006')fromdual;返回的是2006年7月的最后一天。
ADD_MONTHS返回日期date加上i个月后的日期至
语法:
ADD_MONTHS(DATE,I)
I>0是往未来计算,加正数
I<)是往过去计算,加负数
例如:
计算员工入职4纪念
selectadd_months('01-9月-2009',4*12)fromdual;-------01-9月-13返回的是4年之后的日子
MONTHS_BETWEEN(date1,date2)
计算date1和date2两个日期值之间间隔了多少个月
原理就是date1-date2,如果date2比date1大,也就是晚,会得到负数。
并且除非两个日期间隔是整月,否则会带到小数位的结果。
例如:
计算职员已经干了多少个月
selectmonths_between('06-6月-2013','01,9月,2006')fromdual;---81.16161161
如果想得到正数月就加一个floor
selectfloor(months_between('06-6月-2013','01,9月,2006'))fromdual;
NEXT_DAY(DATE,CHAR)
1.是用来计算date日期数据的下一周几,周几是由参数char来决定的
2.在中文环境下,直接使用”星期三”这种形式,英文环境下,需要使用“WEDNESDAY”.为了避免麻烦,可以直接用数字1-7表示周日到周六
老外的规矩,1是星期天。
3.NEXT_DAY()绝对不是说明天
例如:
selectnext_day(sysdate,5)fromdual;返回的是系统时间的下周四
注意:
获取距离当前时间最近的周4,若给定的当前时间恰巧是周4,则表示的是下周的周四。
Least,greatest
意思就是在若干参数中找到最小值以及最大值,参数类型必须是一致的。
例如:
selectleast(sysdate,'30-8月-2009')fromdual;
注意:
在做时间比较的时候,离当前时间越近的越大,越远的越小。
例如:
selectgreatest(5,6)fromdual;----6
EXTRACT
Extract(datefromdatetime):
从参数datetime中提取参数date指定的数据,比如提取年月日
例如:
selectextract(yearfromsysdate)current_yearfromdual;----2015注意:
黑体是别名
selectextract(hourfromsystimestamp)fromdual;-----系统的小时。
selectextract(hourfromtimestamp'2009-10-1010:
10:
10')fromdual;----10注意时间戳在此的用法,没有加sys那么可以在后面跟上设定的值。
NULL的含义
什么是null:
null的意思就是根本不存在。
1.数据库中的重要概念:
null,及控制
2.在表中,某些字段值,数据位置或暂时不存在,取值为null
3.任何数据类型均可取值为null
NULL的操作
Null在比较的时候是不可以写等于的
例如:
name=null是不可以的,只能是nameisnull
插入null
CREATETABLEstudent(idNUMBER(4),nameCHAR(20),genderCHAR
(1));
INSERTINTOstudentVALUES(1000,'李莫愁','F');
INSERTINTOstudentVALUES(1001,'林平之',NULL);--显式插入NULL值
INSERTINTOstudent(id,name)VALUES(1002,'张无忌');--隐式插入NULL值
更新成NULL值
Updateemp_zxzsetgender=null;
NULL条件查询:
不能用=号,而是用IS
例如:
selectenamefromemp_zxzwherejobisnull;
非空约束
NOTNULL
例如:
--创建数据表student,其中gender列不允许为空
CREATETABLEstudent
(idNUMBER(4),
nameCHAR(20),
genderCHAR
(1)NOTNULL);
空值函数
NVL(expr1,expr2)将NULL转变为非null值
-----如果参数1的值是null,则取值expr2.
例如:
selectNVL(job,'boss')fromemp_zxz;----在表中工作是null的人,替换成boss
当进行一些计算的时候,比如算平均工资,有的人没有工资是null,那么计算的时候就不会将其计算在内,但是这是不准确的,因为分母少了。
所以要将null替换成0.
但是有的时候我们不想做计算,只是想看看有没有奖金而已。
NVL2(expr1.expr2.expr3)当1不是null的时候返回2,1是null的时候返回3.
案例:
计算表中所有人的工资加奖金
selectename,nvl2(comm,comm+sal,sal)fromemp_zxz;
如果comm不是null则返回comm+sal;
如果comm是null则返回sal;
--查看1981年以后入职的员工?
SELECTename,hiredateFROMempWHEREhiredate>TO_DATE('1981-01-01','YYYY-MM-DD');
日期之间可以做减法操作,差为相差的天数。
同样一个日期可以加一个数字,该数字表示累加的天数。
查看每个员工到今天为止工作了多少天?
SELECTename,trunc(MONTHS_BETWEEN(SYSDATE,hiredate)*30)FROMempzxz;
SELECTTRUNC(SYSDATE-TO_DATE('1992-08-08','YYYY-MM-DD'))FROMdual1992年8月8日到现在有少天。
YYYY年MM月DD日转换为Date
2008年08月08日
SELECTTO_DATE('2008年08月08日','YYYY"年"MM"月"DD"日"')FROMDUAL08-8月-08
注:
因为第一个字符串的格式是有中文的年月日,所以第二个也得是那样的格式。
将当前系统时间按照
YYYY-MM-DDHH24:
MI:
SS输出
SELECTTO_CHAR(SYSDATE,'YYYY-MM-DDHH24:
MI:
SS')FROMdual
SELECTTO_CHAR(TO_DATE('51-08-08','RR-MM-DD'),'YYYY-MM-DD')FROMdual—>1951-08-08
SELECTename,TO_CHAR(hiredate,'YYYY-MM-DD')FROMemp
LAST_DAY函数,用于返回给定