📄 oracle.txt
字号:
1. 数据表间的连接简单的连接语法:SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……]WHERE 表名1.字段名 = 表名2. 字段名 [ AND ……] ;SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……]WHERE 表名1.字段名 = 表名2. 字段名(+) [ AND ……] ;有(+)号的字段位置自动补空值连接的分类:等于的连接 =不等于的连接 != BETWEEN … AND … IN 注意IN和OR不能一起用外连接 有一个字段名(+) , 没有满足的条件补空值自连接 同一个表自己跟自己连接 例如找重复记录2. 数据表间的连接例子删除table_name表里字段名email重复的记录:SQL>delete from table_name t1where t1.rowid >(select min(rowid) from table_name t2where t1.email = t2.emailgroup by emailhaving count(email) > 1);找到手机用户的服务区域:SQL> select a.handphoneno,nvl(c.name,'null'),a.totalscorefrom topscore a,chargeoperator cc,chargeoperatorinfo cwhere substr(a.handphoneno,1,7)=cc.hpnohead(+)and cc.chargetype=c.chargetype(+)order by a.totalscore desc;3. 数据表间的连接技巧连接N个表, 需要N-1个连接操作被连接的表最好建一个单字符的别名, 字段名前加上这个单字符的别名BETWEEN .. AND.. 比用 >= AND <= 要好连接操作的字段名上最好要有索引连接操作的字段最好用整数数字类型有外连接时, 不能用OR或IN的比较操作4. 如何分析和执行SQL语句写多表连接SQL语句时要知道它的分析执行计划的情况.Sys用户下运行@/ORACLE_HOME/sqlplus/admin/plustrce.sql产生plustrace角色Sys用户下把此角色赋予一般用户 SQL> grant plustrace to &username;一般用户下运行@/ORACLE_HOME/rdbms/admin/utlxplan.sql产生plan_tableSQL> set time on; 说明:打开时间显示SQL> set autotrace on; 说明:打开自动分析统计,并显示SQL语句的运行结果SQL> set autotrace traceonly; 说明:打开自动分析统计,不显示SQL语句的运行结果接下来你就运行测试SQL语句,看到其分析统计结果了。一般来讲,我们的SQL语句应该避免大表的全表扫描。SQL> set autotrace off; 说明:关闭自动分析统计五、集合函数 经常和group by一起使用1. 集合函数列表AVG (DISTINCT | ALL | N) 取平均值COUNT (DISTINCT | ALL | N | expr | * ) 统计数量MAX (DISTINCT | ALL | N) 取最大值MIN (DISTINCT | ALL | N) 取最小值SUM (DISTINCT | ALL | N) 取合计值STDDEV (DISTINCT | ALL | N) 取偏差值,如果组里选择的内容都相同,结果为0VARIANCE (DISTINCT | ALL | N) 取平方偏差值2. 使用集合函数的语法SELECT column, group_function FROM tableWHERE condition GROUP BY group_by_expressionHAVING group_condition ORDER BY column;3. 使用count时的注意事项SELECT COUNT(*) FROM table;SELECT COUNT(常量) FROM table;都是统计表中记录数量,如果没有PK后者要好一些SELECT COUNT(all 字段名) FROM table;SELECT COUNT(字段名) FROM table;不会统计为NULL的字段的数量SUM,AVG时都会忽略为NULL的字段4. 用group by时的限制条件SELECT字段名不能随意, 要包含在GROUP BY的字段里GROUP BY后ORDER BY时不能用位置符号和别名限制GROUP BY的显示结果, 用HAVING条件5. 例子SQL> select title,sum(salary) payroll from s_empwhere title like 'VP%' group by titlehaving sum(salary)>5000 order by sum(salary) desc;找出某表里字段重复的记录数, 并显示SQL> select (duplicate field names) from table_namegroup by (list out fields) having count(*)>1;6. 判断题(T/F)(1) Group functions include nulls in calculations [F](2) Using the having clause to exclude rows from a group calculation [F]解释:Group function 都是忽略NULL值的 如果您要计算NULL值, 用NVL函数Where语句在Group By前把结果集排除在外Having语句在Group By后把结果集排除在外7. 在SQL*PLUS里可使用的其它命令:Ctrl^C 终止正在运行的SQL语句remark /*...*/ -- 注释符号HOST 可执行的操作系统下的命令 有些unix可以用 !BREAK ON column_name SKIP n [ ON column_name SKIP n ]按字段的名称column_name分隔显示,更清晰,SKIP n 是在分隔处空行的数量nBREAK ON ROW SKIP n 每一行间隔都放n个空行COMPUTE 集合运算符 OF 字段1 ON 字段2 按字段2对字段1进行集合运算COMPUTE后面可以跟的集合运算符:SUM MINIMUM MAXIMUM AVG STD VARIANCE COUNT NUMBER8.在SQL*PLUS里可使用的其它命令举例:(scott用户)BREAK ON REPORTCOMPUTE SUM LABEL TOTAL OF SAL ON REPORT 在全部结果集后面算合计select ename,sal from emp where job='SALESMAN';COMPUTE AVG LABEL avg OF SAL ON REPORT 在全部结果集后面算平均值/ 再次执行上次的sql语句break on DEPTNO skip 2 on JOB skip 1 在BREAK字段结果集后面算合计COMPUTE SUM OF SAL ON DEPTNOSELECT DEPTNO,JOB,ENAME,SAL FROM EMP ORDER BY DEPTNO,JOB;SQL> CLEAR BREAKS; 清除设置的BREAK条件SQL> CLEAR COMPUTES; 清除设置的COMPUTE条件六、子查询1. 查询语句可以嵌套例如: SELECT …… FROM (SELECT …… FROM表名1, [表名2, ……] WHERE 条件) WHERE 条件2;2. 何处可用子查询?当查询条件是不确定的条件时DML(insert, update,delete)语句里也可用子查询HAVING里也可用子查询3. 两个查询语句的结果可以做集合操作例如:并集UNION(去掉重复记录)并集UNION ALL(不去掉重复记录)差集MINUS,交集INTERSECT4. 子查询的注意事项先执行括号里面的SQL语句,一层层到外面内部查询只执行一次如果里层的结果集返回多个,不能用= > < >= <=等比较符要用IN.5. 子查询的例子(1)SQL> select title,avg(salary) from s_empgroup by title Having avg(salary) =(select min(avg(salary)) from s_empgroup by title);找到最低平均工资的职位名称和工资5. 子查询的例子(2)子查询可以用父查询里的表名这条SQL语句是对的:SQL>select cty_name from city where st_code in(select st_code from state where st_name='TENNESSEE' andcity.cnt_code=state.cnt_code);说明:父查询调用子查询只执行一次.6.取出结果集的80 到100的SQL语句ORACLE处理每个结果集只有一个ROWNUM字段标明它的逻辑位置,并且只能 用ROWNUM<100, 不能用ROWNUM>80。以下是经过分析后较好的两种ORACLE取得结果集80到100间的SQL语句( ID是唯一关键字的字段名 ):语句写法:SQL>select * from (( select rownum as numrow, c.* from (select [field_name,...] from table_name where 条件1 order by 条件2) c)where numrow > 80 and numrow <= 100 )order by 条件3;七、在执行SQL语句时绑定变量1. 接收和定义变量的SQL*PLUS命令ACCEPTDEFINE UNDEFINE&2. 绑定变量SQL语句的例子(1)SQL> select id, last_name, salary from s_emp where dept_id = &department_number;Enter value for department_number: 10old 1: select id, last_name, salary from s_emp where dept_id=&department_number;new 1: select id, last_name, salary from s_emp where dept_id= 10SQL> SET VERIFY OFF | ON;可以关闭和打开提示确认信息old 1和new 1的显示.3. 绑定变量SQL语句的例子(2)SQL> select id, last_name, salaryfrom s_empwhere title = '&job_title';Enter value for job_title: Stock ClerkSQL> select id, last_name, salaryfrom s_empwhere hiredate >to_date( '&start_hire_date','YYYY-MM-DD');Enter value for start_hire_date : 2001-01-01把绑定字符串和日期类型变量时,变量外面要加单引号也可绑定变量来查询不同的字段名输入变量值的时候不要加;等其它符号4. ACCEPT的语法和例子SQL> ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE]说明: variable 指变量名 datatype 指变量类型,如number,char等 format 指变量显示格式 prompt text 可自定义弹出提示符的内容text hide 隐藏用户的输入符号使用ACCEPT的例子:ACCEPT p_dname PROMPT 'Provide the department name: 'ACCEPT p_salary NUMBER PROMPT 'Salary amount: 'ACCEPT pswd CHAR PROMPT 'Password: ' HIDEACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):”4. DEFINE的语法和例子SQL> DEFINE variable = value说明: variable 指变量名 value 指变量值定义好了变良值后, 执行绑定变量的SQL语句时不再提示输入变量使用DEFINE的例子:SQL> DEFINE dname = salesSQL> DEFINE dnameDEFINE dname = “sales” (CHAR)SQL> select name from dept where lower(name)='&dname';NAME-------------------------salessalesSQL> UNDEFINE dnameSQL> DEFINE dnameSymbol dname is UNDEFINED5. SQL*PLUS里传递参数到保存好的*.sql文件里SQL> @ /路径名/文件名 参数名1[,参数名2, ….]SQL> start /路径名/文件名 参数名1[,参数名2, ….]注意事项:一次最多只能获取9个&变量, 变量名称只能是从&1,&2到&9变量名后不要加特殊的结束符号如果在SQL*PLUS里要把&符号保存在ORACLE数据库里,要修改sql*plus环境变量defineSQL> set define off;八、概述数据模型和数据库设计1. 系统开发的阶段:Strategy and AnalysisDesignBuild and DocumentTransitionProduction2. 数据模型Model of system in client's mindEntity model of client's modelTable model of entity modelTables on disk3. 实体关系模型 (ERM)概念ERM ( entity relationship modeling)实体 存有特定信息的目标和事件 例如: 客户,订单等属性 描述实体的属性 例如: 姓名,电话号码等关系 两个实体间的关系 例如:订单和产品等实体关系模型图表里的约定Dashed line (虚线) 可选参数 “may be”Solid line (实线) 必选参数 “must be”Crow's foot (多线) 程度参数 “one or more”Single line (单线) 程度参数 “one and only one”4. 实体关系模型例子每个订单都必须有一个或几个客户每个客户可能是一个或几个订单的申请者5. 实体关系的类型1:1 一对一 例如: 的士和司机M:1 多对一 例如: 乘客和飞机1:M 一对多 例如: 员工和技能6. 校正实体关系的原则属性是单一值的, 不会有重复属性必须依存于实体, 要有唯一标记没有非唯一属性依赖于另一个非唯一的属性7. 定义结构时的注意事项减少数据冗余减少完整性约束产生的问题确认省略的实体,关系和属性8. 完整性约束的要求Primary key 主关键字 唯一非NULLForeign key 外键 依赖于另一个Primary key,可能为NULLColumn 字段名 符合定义的类型和长度Constraint 约束条件 用户自定义的约束条件,要符合工作流要求例如: 一个销售人员的提成不能超过它的基本工资Candidate key 候选主关键字 多个字段名可组成候选主关键字, 其组合是唯一和非NULL的9. 把实体关系图映射到关系数据库对象的方法把简单实体映射到数据库里的表把属性映射到数据库里的表的字段, 标明类型和注释把唯一标记映射到数据库里的唯一关键字把实体间的关系映射到数据库里的外键其它的考虑:设计索引,使查询更快建立视图,使信息有不同的呈现面, 减少复杂的SQL语句计划存储空间的分配重新定义完整性约束条件10. 实体关系图里符号的含义PK 唯一关键字的字段FK 外键的字段FK1,FK2 同一个表的两个不同的外键FK1,FK1 两个字段共同组成一个外键NN 非null字段U 唯一字段U1,U1 两个字段共同组成一个唯一字段
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -