SQL
Distinct
NULL
||连接符
Oracle数据库中大小写敏感
要求找出含有%的记录
这需要使用ESCAPE标识转义字符
select * from t_charwhere a like ‘%\%%' escape '\';
select * fromt_char where a like ‘%K%%' escape ‘K';
PLSQL中日期比较
1.格式需要一致,可以通过字符串比较。
2.TO_CHAR(CREATE_DATE,'yyyy-mm-dd')>=NVL(P_CREATE_FROMDATE,TO_CHAR(CREATE_DATE,'yyyy-mm-dd'))
2. START_DATE <= TO_date(p_trans_date,'YYYY-MM-DD')
--不易发现的错误
select * from test1where column1 = '1234';--将所有行转换为字符串
select * from test1where column1 = 1234;--将所有行转换为数字,包含字符的行出错
--连接
-oracle全外外连接
select e.last_name,e.department_id,d.department_namefrom employees e,departments dwhere e.department_id=d.department_id(+)union
select e.last_name,e.department_id,d.department_namefrom employees e,departments dwhere e.department_id(+)=d.department_id;
--sql1999标准
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULLOUTERJOIN departments d
ON (e.department_id =d.department_id) ;
分组计算函数和group by子句
备注:MIN, MAX 可用于任何数据类型,但AVG, SUM,STDDEV,VARIANCE仅适用于数值型字段。
使用GROUP BY 子句进行分组:
l 可以按照某一个字段分组,也可以按照多个字段的组合进行分组
l SELECT查询语句中同时选择分组计算函数表达式和其他独立字段时,其他字段必须出现在Group By子句中,否则不合法。
l 不能在Where条件中使用分组计算函数表达式,当出现这样的需求的时候,使用Having 子句。
l 分组计算函数也可嵌套使用。
事务控制
隐式的事务提交或回滚动作:
Commit,rollback 是显式的提交和回滚语句,还有一些隐式的提交和回滚是大家需要知道并引起注意的:
当如下事件发生是,会隐式的执行Commit动作:
1、数据定义语句被执行的时候,比如新建一张表:Create Table …
2、数据控制语句被执行的时候,比如赋权GRANT …( 或者DENY)
3、正常退出iSQL*Plus 或者PLSQLDEVELOPER, 而没有显式的执行COMMIT 或者ROLLBACK 语句。
当如下事件发生时,会隐式执行Rollback 动作:
1、非正常退出iSQL*Plus, PLSQL DEVELOPER, 或者发生系统错误。
在Commit 或者Rollback前后数据的状态:
1、在数据已经被更改,但没有Commit前,被更改记录处于被锁定状态,其他用户无法进行更改;
2、在数据已经被更改,但没有Commit前,只有当前Session的用户可以看到这种变更,其他Session的用户
看不到数据的变化。
3、在数据已经被更改,并且被Commit后,被更改记录自动解锁,其他用户可以进行更改;
4、在数据已经被更改,并且被Commit后,其他Session的用户再次访问这些数据时,看到的是变化后的数据。
那么同理可知Rollback前后数据的状态及锁的变化。
锁
表的命名要求和表中列的命名要求:
1、必须以字母开头
2、长度不能超过30个字符
3、只能包含A–Z,a–z, 0–9,_, $, and #
4、不能与数据库中的已有对象重名
5、不能使用Oracle 数据库的保留字
注意TRUNCATE 与DELETE FROM table 的区别: 1)没有Rollback机会2)HWM标记复位(HWM高水位线)都不会删除表结构
约束
更改表的语法:
添加列:
ALTERTABLE table
ADD(column datatype [DEFAULT expr]
[, columndatatype]...);
更改列:
ALTERTABLE table
MODIFY(column datatype [DEFAULT expr]
[, columndatatype]...);
删除列:
ALTERTABLE table
DROP(column);
ALTER TABLE tablenameADD CONSTRAINT constraintname
constrainttype(column1,…);
CONSTRAINT emp_email_ukUNIQUE(email))
CONSTRAINT dept_id_pk PRIMARYKEY(department_id))
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCESdepartments(department_id)
CONSTRAINT emp_salary_min CHECK (salary > 0)
索引、序列、同义词
函数索引
CREATE INDEX upper_dept_name_idx
ON departments(UPPER(department_name));
控制用户权限
GRANT object_priv [(columns)]
ON object
TO {user|role|PUBLIC}
[WITHGRANT OPTION];
如果你想让其他用户也有权把你赋给他的权限进一步赋予给别人,那么需要带WITH GRANT OPTION;
GRANT select, insert
ON departments
TO scott
WITH GRANT OPTION;
撤销权限
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM{user[, user...]|role|PUBLIC}
创建DB-LINK,通过DB-LINK访问另一数据库中的表
CREATE PUBLIC DATABASE LINK hq.acme.com
USING'sales';
SELECT*
递归查询
SELECTlast_name||' reports to '||
PRIORlast_name "Walk Top Down"
FROMemployees
STARTWITH last_name = 'King'
CONNECTBY PRIOR employee_id = manager_id ;
使用LEVEL关键字和LPAD函数,在OUTPUT中显示树形层次。
SELECT LPAD(last_name,LENGTH(last_name)+(LEVEL*2)-2,'_')
AS org_chart
FROM