尽量避免select *,影响性能,不直观。
慎用Distinct,会排序,影响性能,用exists
排序尽量利用索引,索引有序
索引列不要加函数,会使索引失效
外连接:主表记录全显示,从表记录有则显示,无则留空
就用标准语法Count(*)
Count(*)/Count(1)全量Count(字段)去Null值Count(null)恒为0Exists和In:理论上,In先执行子查询,然后执行外层主查询;而Exists属于关联子查询,因此,首先执行外层查询,然后再执行子查询,直到找到第一个符合条件的匹配项,就不会再执行了,理论上会快一些
数据字典
物化视图
分页:RowNum
索引:覆盖索引,范围索引,前缀索引,最左前缀原则
位图索引:性别只有男和女两项,用位图索引很快
函数索引:普通索引列上使用函数,会导致不走索引。除非建立函数索引;
两表关联,关联字段类型不一致,会有隐式的类型转换
select * from employees where employee_id='xxx'UNION 去重,UNION ALL,不去重
INTERSECT 取交集, MINUS 取差集
Union去除重复行,并且含排序,因此,效率低下,需要尽量避免的
ROLLUP
闪回:删数据删表可以找回,删数据库则不行
git pull registry.saas.hand-china.com/tools/oracle-xe-11g:16.04
docker run -d -p 1521:1521 name
navicat上连接数据库(默认服务名:xe,默认用户:system,默认密码:oracle)
创建用户名
create user usename identified by password [default tablespace tablename];
创建表空间
create tablespace tablename datafile 'd:\data.dbf' size 20m;
将空间分配给用户
alter user username default tablespace tablename;
给用户授权(加引号)
grant resource,connect,dba to "username";
DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。
增加WITH ADMIN OPTION选项,则得到的权限可以传递。
对于数值和日期型字段,可以进行 “加减乘除"
一个数值与NULL进行四则运算,其结果是 NULL
列别名时加双引号锁定大小写,不加则转换成大写
字符串连接操作符: “||”
SELECT last_name ||' is a '||job_id AS "Employee Details" FROM employees;% 代表 0 个或者多个 字符. _ 代表一个单个字符
表中本身有通配符的怎么查询
使用ESCAPE 标识转义字符
--escape会定义转义字符 select * from t_char where a like '%\%%' escape '\'; select * from t_char where a like '%K%%' escape 'K';排序,按照字段别名排序,按照多字段排序
ORDER BY department_id DESC, salary DESC;单行函数分为五种类型:字符函数、数值函数、日期函数、转换函数、通用函数
oracle数据库大小写敏感
select * from dual where dummy='x' --无结果 select * from dual where lower(dummy)='x' --有结果 select lower('Hello World') 转小写, upper('Hello World') 转大写 from dual; --initcap: 首字母大写 select initcap('hello world') 首字符大写 from dual;--别名 select initcap('hello world') as 首字符大写 from dual;--别名to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配:字符串->日期
to_char(日期,"转换格式" ) 即把给定的日期按照“转换格式”转换:日期->字符串
日期函数解释months_between两个日期相差的月数add_months在指定日期上加上若干个月last_day指定日期的下一个日期next_day本月最后一天round日期四舍五入trunc日期截断 --显示当前日期 select sysdate from dual; --显示昨天,今天和明天,加减数字仍未日期 select sysdate-1 昨天, sysdate 今天, sysdate+1 明天 from dual; --员工工龄 select sysdate-hire_date 天 from employees --months_between:两个日期相差的月数 select (sysdate-hire_date)/30 方式一, months_between(sysdate,hire_date) 方式二 from employees; --add_months:在指定日期上加上若干个月 select add_months(sysdate,1) 下个月 from dual --last_day: 某个日期当月的最后一天 select last_day(sysdate) from dual; --next_day:下周五 select next_day(sysdate,'星期五') from dual; --对日期进行四舍五入 select round(sysdate,'MONTH') 月,round(sysdate,'YEAR') from dual; --对日期进行截断 select trunc(sysdate,'MONTH') 月,trunc(sysdate,'YEAR') from dual; --日期格式 select * from employees where hire_date=to_date('1982-01-23','yyyy-mm-dd'); -- 查询当前日期:显示: 2011-09-17 15:12:15今天是星期六 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual; 格式解释显示yytwo digits 两位年显示值:07yyythree digits 三位年显示值:007yyyyfour digits 四位年显示值:2007mm两位月显示值:11monabbreviated 字符集表示显示值:11月,若是英文版,显示novmonthspelled out 字符集表示显示值:11月,若是英文版,显示novemberddnumber 当月第几天显示值:02dddnumber 当年第几天显示值:02dyabbreviated 当周第几天简写显示值:星期五,若是英文版,显示fridayspelled out 当周第几天全写显示值:星期五,若是英文版,显示fridayhhtwo digits 12小时进制显示值:01hh24two digits 24小时进制显示值:13mitwo digits 60进制显示值:45sstwo digits 60进制显示值:25Qdigit 季度显示值:4WWdigit 当年第几周显示值:44Wdigit 当月第几周显示值:1使用货币格式化显示。
--9代表占位符,如果位数少于前面的数字,都会显示# --L代表本地货币符号
alter session set NLS_CURRENCY = ' ¥'; select to_char(4122341,'L9,999,999.00') from dual; select to_number('$1,324','$9,999') from dual;--能转换成数字1324 后面长度要长于前面长度,否则有问题当比较字符型和数值型的值时,oracle会把字符型的值隐式转换为数值型。
当比较字符型和日期型的数据时,oracle会把字符型隐式转换为日期型。
连接时(||),一般是把数值型隐式转换为字符型,日期型隐式转换为字符型
数据类型优先级为:Number>字符类型>日期类型
隐式转换发生在字段列上时将使索引失效。
双引号的作用是:示意Oracle将严格区分大小写,否则Oracl都默认大写。
单引号:这个加了单引号的字段是一个字类似字符串,并不区分大小写。
转载于:https://www.cnblogs.com/sufferingStriver/p/9403451.html
相关资源:Oracle数据库学习日记