SQL

SQL

约束

1:主键约束  
	索引类型的存在,方便用户用来检索,主键的特性有两点: 不能为空 不能重复 ;oracle 一个表中可以有一个列(唯一 )或多个列(复合主键)一起作为主键存在
    使用复合主键之间需要注意,数据库会把多个复合主键的值拼凑一起,然后检查是都重复,而不是单独检查 
    由于一个创建表的sql中primary KEY 只能出现一次,所以用复合主键的时候不能再列后面声明主键
2:唯一约束    UNIQUE   
3:非空约束    NOT NULL 是列级约束,所以必须声明在列后面,而其他约束都是表级约束
4:外键约束   
	外键约束一般定义在具有父子关系的表中,外键约束是的子表中的列,对应于父表的主键,用于约束,子表的添加:子表添加的时候父表必须有对应的主键值 
    父表的删除: 父表在删除的时候,如果对应的子表有数据无法删除,可以在外键中设置级联删除  使用  ON DELETE CASCADE 关键字 在删除父表数据的时候会删除对应子表数据;如果删除父表数据   想保留对应子表数据,可以在外键中设置 ON DELETE SET NULL,当删除父表记录时,对应子表外键会变成null;
5:检查约束(重点)  
	CHECK 检查约束,可以用来约束具体的值,可以用于字符串及数字,并可以使用in或between AND 等进行约束,如果表加了约束之后,进行插入数据的时候会变得缓慢,所以在大量数据插入的时候,我们一般选择在插入数据之后才声明约束

约束状态:

很多时候由于业务需要,会进行大量的老数据与新数据的合并,当前表存在约束,造成无法合并
数据库两类约束状态:
	1:启用 ENABLE    2:禁用   DISABLE
   	1:验证  VALIDATE    2: 非验证   NOVALIDATE   
数据库 两类四种状态组合的情况:
	1:默认 ENABLE VALIDATE  默认约束组合,会校验新增数据,并且表中不存在违反约束的数据
	2: ENABLE  NOVALIDATE  会校验新增数据, 但表中老数据可以存在违反约束的数据
    3: DISABLE VALIDATE     对新增数据不做验证, 但是对表中已有数据进行校验,是一种自相矛盾的组合,会导致DML失败
    4: DISABLE NOVALIDATE   对新增数据不做校验,对表中原有数据也不做校验
    改变数据库的约束状态可以使用如下sql:
              ALTER TABLE  表名  MODIFY  CONSTRAINT  约束名  DISABLE  NOVALIDATE                  

SELECT 中的 WHERE , GROUP BY , HAVING , ORDER BY
1: 四个字句顺序不能颠倒
2: WHERE 针对的是表和列发挥作用,查出加过
3: 如果对中间结果再次筛选,需要用 HAVING
伪列

ROWNUM 伪列  限制查询结果集的数量,可以使用伪列进行行的排列,其生成在order BY 之前 ;伪列的生成是从1开始开始,如果取值大于1 则会取到空的
结果集,可以使用子查询, 先生成全部伪列,然后外层进行取值来进行分页操作  (page-1)*5 每页展示5条
RANk() OVER ( partition BY ....... ORDER BY  ......   )             dense_RANk() OVER ( partition BY ....... ORDER BY  ......   )       row_number() OVER ( partition BY ....... ORDER BY  ......   )      
partition BY   用于给结果集进行分组,如果没有进行制定则整个结果集作为一个分组
ORDER BY    ORDER BY  本身是堆整张表进行排序,单如果用在这里是针对分组进行排名
 三种分组用法相同,不同之处是: row_number() 显示的是行数,而非名次
 SELECT  ROWNUM B,ENAME,SAL FROM(SELECT ROWNUM A,ENAME,SAL FROM SCOTT.EMP)WHERE A>3 and ROWNUM <6;  分页

关键字

去重: DISTINCT
UNION 用于表拼接,会去掉两表中完全一样的数据,如果需要 则使用 UNION ALL
Oracle dual虚拟表 临时表 计算器
一般的数据库查询 SELECT
1:列上的值是用来当做变量的值来运算
2:where 后面是表达式,如果表达式为真,则取出对应行
恒为真条件,sql在内部优化的时候,会直接过滤掉恒为真的条件,并不会影响sql效率
%代表匹配N位字符,而_代表一个字符
CONSTRAINT FK_EMP_1_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES DEPT_1(DEPTNO) on DELETE CASCADE
定义外键 外键名 本表中的 引用 XX表XX键

通用函数

oracle 常用函数
1: 单行函数:每一个函数值输入一行结果,返回一个结果
        1)字符函数     
        	I.返回对应ASCII码表中的位置 II. 拼接 CONCAT('HELLO',' ORACLE')   或  'HELLO'||' ORACLE' III.返回字符串的长度  
        	length('hel li')  
        	IV.INSTr('hello oracle','or')返回or 在字符串中出现的位置,索引从1开始; V.LOWER ('HELLO') 返回小写 VI. UPPER ('hello')  
        	返回大写
        	VII.LTRIM('QWHELLO','QW')截取以QW开头的字符VIII.RTRIM ('HELLOZW','ZW')截取字符串结尾的ZWIX.TRIM('-' FROM '-
        	HELLO-') 
        	截取字符串前后的字段VII,VIII和IX 三个函数比较类似,如果不填入第二个参数的话,默认参数为空格 , 所以为截取空格     X. 
        	REPLACE ('ABCGG','G','DEF') 
        	字符串替换,把第一个字符的G换成DEF 注意:替换所以的G    XI. SUBSTR ('abcde',2,3) 从字符串的第2位开始取出3位  
        2)数字函数
        	I.ABS(X)  绝对值  II. ACOS(x)  反余弦   III. COS(X) 余弦 IV. CEIL(X) 大于或等于X的最小值  V.FLOOR(X) 小于或等于X的最
        	大值
        	VI. LOG(X,Y) X为底Y为对数 VII. MOD(X,Y)类似于取余 X/Y VIII.POWER(X,Y) X的Y的次幂   IX.ROUND(X,[Y]) 把数字X在Y
        	的位置上四舍五入  X. SQRT(X) X的平方根  XI.TRUNC(X,[Y]) 数字X在Y的位置上截断(舍去)
        3)转换函数      
        	I. TO_CHAR(SYSDATE , 'YYYY"年"MM"月"DD"日" HH24:MI:SS' )   TO_CHAR(SYSDATE , 'YYYY-MM-DD HH24:MI:SS' ) 
				返回: 2018-10-16 17:48:54
            II. TO_DATE('1990-12-12  15:24:20',''YYYY-MM-DD HH24:MI:SS' )
        4)日期函数     
            I. ADD_MONTHS(SYSDATE,X)  在某个时间点增加X个月  SYSDATE :当前时间  II.  ROUND(SYSDATE,'day' )  可以对年 月  
            日的四舍五入 
            III.LAST_DAY(SYSDATE) 返回当前月份的最后一天 IV. EXTRACT(YEAR from SYSDATE)     提取时间戳的年 月 日 V. 
            MONTHs_between(Y,X)返回两个时间点X,Y相差的月份(Y-X)  VI. NEXT_DAY(SYSDATE,1) 返回下个星期的星期几,注意国	
            外与国内相差1天 (1 对应周日)
        5)其他单行函数  
       		I. NVL(COMM,100) 空替换 把COMM列的NULL替换为100;                    
        	II.NVL2(COMM,COMM*2,200)   升级版, 如果comm有值则值*2,如果没值则变成200;                     
2: 聚合函数 :  可以对多行进行操作.返回一个结果集  例如 SUM()
                I. SUM();  II.AVG();  III. MIN();     IV.  MAX();  V. COUNT()

--  1)字符函数  
SELECT ASCII('A') FROM Dual;                                    
SELECT CONCAT('HELLO',' ORACLE') FROM DUal;
SELECT 'HELLO'||' ORACLE'  FROM DUal;
SELECT length('hel li') from dual;
SELECT INSTr('hello oracle','or') FROM dual;
SELECT LOWER ('HELLO') FROM DUAL;
SELECT UPPER ('hello') FROM DUAL;
SELECT LTRIM ('QWHELLO','QW') FROM DUAL;  
SELECT RTRIM ('HELLOQW','QW') FROM DUAL;  
SELECT TRIM('-' FROM '-HELLO-') from DUAL;
SELECT RTRIM ('            HELLOQW            ') FROM DUAL;  
SELECT REPLACE ('ABCGG','G','DEF') FROM DUAL;  
SELECT SUBSTR ('abcde',2,3) FROM DUAL;  
-- 2)数字函数
SELECT ABS(-1) FROM DUAL;   SELECT ACOS(1) FROM DUAL; SELECT COS(0) FROM DUAL; SELECT CEIL(-1) FROM DUAL; SELECT MOD(-9,2) FROM DUAL; 
SELECT ROUND(3.525,2) FROM DUAL; 
SELECT TRUNC(3.525) FROM DUAL;  SELECT TRUNC(3.525,2) FROM DUAL; 
--  4)日期函数 
-- SYSDATE 当前时间 
SELECT SYSDATE , ADD_MONTHS(SYSDATE,5) FROM DUAL;  
SELECT ROUND(SYSDATE,'day' ) FROM DUAL;          -- 相距最近的星期日
SELECT ROUND(SYSDATE,'YEAR' ) FROM DUAL;     -- 对上半年进行舍去,下半年进一
SELECT ROUND(SYSDATE,'MONTH' ) FROM DUAL;       -- 类似四舍五入 
SELECT ROUND(SYSDATE ) FROM DUAL;                      -- 时间上的四舍五入
SELECT LAST_DAY(SYSDATE) from DUAL;
SELECT EXTRACT(YEAR from SYSDATE) from DUAL;
SELECT EXTRACT(MONTH from SYSDATE) from DUAL;
SELECT EXTRACT(DAY from SYSDATE) from DUAL;
SELECT MONTHs_between(ADD_MONTHS(SYSdate,5),sysdate )from DUAL;
SELECT NEXT_DAY(SYSDATE,2) FROM DUAL;
--  3)转换函数
SELECT TO_CHAR(SYSDATE , 'YYYY"年"MM"月"DD"日" HH24:MI:SS' ) from DUAL; 
SELECT TO_CHAR(SYSDATE , 'YYYY-MM-DD HH24:MI:SS' ) from DUAL; 
SELECT TO_DATE ('1990-12-12  15:24:20','YYYY-MM-DD HH24:MI:SS' ) from DUAL; 
-- 空替换
SELECT EMPNO,ENAME NVL(COMM,100) FROM SCOTT.EMP; 

主键

-- ORACLE 中主键没有自增长,但是有SEQUENCE 序列可以用来填充主键
-- SEQUENCE 的属性有: increment  BY :  步长 指定该序列每次增加的值   START with: 从几开始   MAXVALUE : 最大值   	
MINVALUE : 最小值   CYCLE/nocycle : 是否循环  CACHE/nocache  缓存个数 SEQUENCE 除了上面的属性外,还有2个伪列:  
NEXTVAL:  下一个值    CURRVAL:  当前值 
-- 同义词 SYNONYM  FOR  可以为数据库对象创建同义词用于简化查询    简单理解 就是别名的意思
-- 视图 VIEW 我们可以把一个查询结果集封装成一个视图,方便查询; 视图本身不保存任何数据,只是储存一条sql  (动态的也可以查) 		
单表查询叫简单视图,多表查询叫复杂视图,复杂视图不能进行DML操作
-- 事务: COMMIT ROLLBACK ACID 隔离级别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值