考点知识总结
IZ0-051
with check option
在通过with check option 创建的视图,做dml的时候必须满足where 的条件才可以,无论是插入还是更新还是删除.不能忽略了,数据还要满足原表的constraint.
create table A as SELECT * FROM B
A表只能接收 B表的not null ,其他的constraint 不能创建
months_beetween()
months_between(to_date('2019-05-31','YYYY-MM-DD'),to_date('2019-05-01','YYYY-MM-DD')) 大日期在前小日期在后>0 ,反之<0.
intersect
两个表交集的时候不忽略空值,如果a表有一条空记录,b表也有空记录,做交集intersect的时候会显示出来.列名可以不一样,但是类型和数量必须一样.
列名定义" "
在定义列名的时候必须" "内的内容会原封不动的显示,而不加双引号" "的列名会自动变成大写.
例子:SELECT MONTH ms,AREA "Name" FROM mxq;列名ms 会自动大写, "Name" 会显示成Name
转义q'[Camera's category is Photo]'
转义为括号内的原始内容.其中方括号'[ ]'可以改成任意一对特殊符号但是必须成对出现如,'\ \','< >','| |'.
distinct
只能出现在sql语句的开头,并且只能出现一次.
NULL运算规则
任何数值加减乘除null=null.
INTERVAL
语法一
INTERVAL '123-1' YEAR(N) TO MONTH; N默认为2,为0-9的精度;
SELECT INTERVAL '123-1' YEAR(3) TO MONTH FROM DUAL ;
例1
SELECT INTERVAL '123' YEAR(3) FROM DUAL ;
如果小于3就会报错,结果为;+123-00
例2
SELECT INTERVAL '123' MONTH FROM DUAL ;结果为:+10-03 默认是2所以是10年
SELECT INTERVAL '123' MONTH(3) FROM DUAL ;结果为:+010-03 精度是3所以是010年
从例子2两个结果可看出来year后面的精度和month后面的精度都是表示年的精度.
语法二
INTERVAL '{ integer | integer time_expr | time_expr }'
{ { DAY | HOUR | MINUTE } [ ( leading_precision ) ]
| SECOND [ ( leading_precision [, fractional_seconds_precision ] ) ] }
[ TO { DAY | HOUR | MINUTE | SECOND [ (fractional_seconds_precision) ] } ]
{} 为必填,[]为可填可不填,|为或者.
例子一
select interval '5 23:45:30.457' day to second(2) from dual;结果为+05 23:45:30.46 ,leading_precision默认为2
select interval '5 23:45:30.457' day(3) to second(2) from dual;结果为+005 23:45:30.46,leading_precision为3
例子二
select interval '5 23:45:30.457' day(3) to minute from dual;报错间隔无效,'5 23:45:30.457'不是to minute格式
select interval '5 23:45' day(3) to minute from dual;结果为+005 23:45:00,DAY | HOUR | MINUTE 后面不可接精度,仔细看语法只有second后面有精度fractional_seconds_precision;
总结
1.interval 后面的格式必须符合to 后面的格式,比如 '5 23:45:30.457' 已经精确到秒,不能 to minute.
2.DAY | HOUR | MINUTE后面的精度是天的精度,TO DAY | HOUR | MINUTE|SECOND 后面 只有SECOND可以接精度.
数据类型 clob blob long
clob 最大4g varchar2(4000) 超过四千就用clob
blob 最大4g 用来储存二进制对象 类如图片,音乐等.
clob和blob还有long类型不能再group by 和 order by 语句中直接使用.
数据类型number,char,varchar2
number和char可以不用写长度char默认为1,number不写长度的时候可以存储小数位.
varchar2必须写长度,否则会报错
创建表名规则
不能使用预留字,表名不能以数字开头,不能有*.
表名1-30个字符,最多有1000列.
约束constraint
一列可以同时是主键和外键
check 不能直接使用sysdate.可以用to_date('2014-01-12','YYYY-MM-DD')这种date类型的.
序列.nextval和序列.currval不能直接使用在约束中.
列级约束和表级约束
1.直接在列后面定义约束为列级约束,
2.在定义完所有列之后,在定义约束为表级约束
default和 not null 只能为列级约束
混合主键或者unique只能定义在表级约束
CREATE TABLE WAREHOUSE (
WAREHOUSE_ID NUMBER(4),
ROOMNO NUMBER(10) CONSTRAINT R_ID CHECK(ROOMNO BETWEEN 101 AND 200), -------列级别
LOCATION VARCHAR2(25),
PROD_ID NUMBER(3),
CONSTRAINT WR_PR_PK PRIMARY KEY (WAREHOUSE_ID,PROD_ID),-----表级别
CONSTRAINT PROD_FK FOREIGN KEY (PROD_ID) REFERENCES PRODUCTS(PROD_ID)----表级别);
Multitable insert
INSERT ALL
INTO Sales_info VALUES (employee_id,week_id,sales_MON)
INTO Sales_info VALUES (employee_id,week_id,sales_TUE)
INTO Sales_info VALUES (employee_id,week_id,sales_WED)
INTO Sales_info VALUES (employee_id,week_id,sales_THUR)
INTO Sales_info VALUES (employee_id,week_id, sales_FRI)
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,
sales_WED, sales_THUR,sales_FRI
FROM Sales_source_data;
INSERT ALL
WHEN SAL>10000 THEN
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
WHEN MGR>200 THEN
INTO mgr_history VALUES(EMPID,MGR,SYSDATE)
SELECT employee_id EMPID, hire_date HIREDATE, salary SAL, manager_id MGR
FROM employees WHERE employee_id > 200;
NLS_DATE_FORMAT;
nvl2函数
FROM XZHDX
WHERE END_DATE - ST_DATE > 30
GROUP BY ZHENYING;
SELECT SUM(SHANGJIN), ZHENYING, MIN(END_DATE - ST_DATE)
FROM XZHDX
GROUP BY ZHENYING
HAVING MIN(END_DATE - ST_DATE) > 30;
先分组 然后在计算having条件