




已阅读5页,还剩63页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Open and Closed Issues for this DeliverableEBS开发技术系列- SQL技术总结Author:王鑫Creation Date:May 3, 2013May 3, 2013Last Updated:一月 9, 2017Library No:0202.EBS-TEC1101.SQL技术总结 Version:1.0Approvals: Copy Number_文档控制更改记录5DateAuthorVersionChange Reference2013/5/3Allen.wang1.0No Previous Document审阅NamePosition分发记录Copy No.NameLocation1Library MasterProject Library2Project Manager34Note To Holders:If you receive an electronic copy of this document and print it out, please write your name on the equivalent of the cover page, for document control purposes.If you receive a hard copy of this document, please write your name on the front cover, for document control purposes.目录文档控制ii概述2文档功能2说明2约定2说明2前言3第一部分 数据库查询语句:DQL4第一章 SELECT 语句41.SELECT 语句的作用42.SELECT 语句的语法43.SQL语句中的数学表达式44.在Select的时候给列起个别名(注意双引号的作用)45.字符串连接操作符: “|”46.DISTINCT 去除重复行4第二章 条件限制和排序51.条件限制的关键词:WHERE52.关于NULL的概念53.比较操作符54.使用LIKE做模糊匹配:可使用 % 或者 _ 作为通配符55.使用多个条件组合的逻辑操作符56.使用ORDER BY 子句进行排序67.TOP-N 查询:6第三章 多表关联查询61.等于链接62.不等于链接73.外链接(可细分为左外链接、右外链接)74.自链接75.工业标准定义(SQL 1999)的链接类型8第四章 单行函数91.字符函数(Character):大小写转换函数92.字符函数(Character):字符串操作函数93.数字函数(Number):数字操作函数104.日期函数(Date):日期操作函数105.日期函数(Date):日期的运算操作106.Oracle数据类型的隐式转换规则(Conversion)107.Oracle数据类型的显式转换规则(Conversion)118.条件表达式12第五章 分组计算函数和GROUP BY子句131.常用分组计算函数132.SQL中使用分组计算函数的语法143.COUNT函数说明144.使用GROUP BY子句进行分组145.GROUP BY子句的增强14第六章 子查询151.子查询的语法152.子查询进阶163.递归查询174.查看历史记录18第七章 使用集合操作18第二部分 数据库查询语句:DML20第八章 DML语句201.INSERT语句202.INSERT增强213.UPDATE语句224.DELETE语句225.MERGE INTO 语句: 比较整合语句23第三部分 数据库定义语句:DDL25第九章 数据库对象 表251.数据类型252.创建表的语法253.更改表的语法264.删除表的语法26第十章 数据库对象 约束271.在创建表的时候同时创建约束272.单独创建约束283.常用约束详解284.删除、失效/生效 约束305.查询系统中存在哪些约束30第十一章 数据库对象 视图301.视图的概念302.视图的创建313.视图的删除31第十二章 数据库对象 序列、索引、同义词311.序列的创建、使用、更改和删除312.索引的创建和使用323.同义词的概念33第十三章 数据库对象 数据库连接(Database Link)33第四部分 数据库控制语句:DCL35第十四章 控制用户权限351.Oracle的用户权限概念352.通过数据字典查询系统中的赋权情况373.收回权限374.删除用户37第十五章 事务控制371.隐式的事务提交或回滚动作372.在Commit 或者Rollback前后数据的状态383.读的一致性384.锁的概念38附录一:文档及练习使用表结构40ER图40表结构40表数据42表结构及表数据生成45附录二:练习题及参考答案52Open and Closed Issues for this Deliverable64Open Issues64Closed Issues64 64Company Confidential - For internal use only概述该文档为个人在实施EBS系统的过程中,按照不同的技术学习阶段,进行的技术总结。目的:1. 作为个人技术学习积累,在实施项目中,方便快捷查询相关技术细节。文档功能说明1. 项目实施相关技术参考。2. 在相关工作中,方便快速查询技术细节。约定说明前言SQL(Structure Query Language)语言是结构化查询语言,是数据库的核心语言,是面向集合的描述性非过程化语言。Oracle SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据库控制语言DCL。1. 数据查询语言DQL的基本结构是由select子句,from子句,where子句组成的查询块:Select From Where 2. 数据操纵语言DML完成在数据库中确定、修改、添加、删除某一数据值的任务(以下是部分常用DML语句):Insert:增加数据行到表Delete:从表中删除数据行Update:更改表中数据3. 数据定义语言DDL完成定义数据库的结构,包括数据库本身、数据表、目录、视图等数据库元素(以下是部分常用DDL语句):Create table:创建表Create index:创建索引Create view:创建视图Alter table:增加表列,重定义表列,更改存储分配Drop table:删除表Drop index:删除索引4. 数据库控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等(以下是部分常用DCL语句):Grant:将权限或角色授予用户或其它角色Revoke:回收用户权限Roll:回滚,是当某个对话更改了数据库中的数据后,由于某种原因用户不想提交此更改时,Oracle所采取的保护操作。这是一个把信息恢复到用户使update、insert、delete前最后提交的状态。第一部分 数据库查询语句:DQL第一章 SELECT 语句1. SELECT 语句的作用 列选择:SELECT Column1, Column2 FROM table1; 行选择:SELECT * FROM table1; 多表连接查询:SELECT table1.Column1, table2.Column2 FROM table1, table2;2. SELECT 语句的语法SELECT * | DISTINCT Column | Expression alias ,. FROM table;l SELECT 表示要取哪些列l FROM 表示要从哪些表中取3. SQL语句中的数学表达式对于数值和日期型字段,可以进行“加减乘除”:select last_name, salary, salary + 300 from employees;记住:一个数值与NULL进行四则运算,其结果是? NULL4. 在Select的时候给列起个别名(注意双引号的作用)select last_name AS name, commission_pct comm from employees;select last_name “name”, salary*12 “Annual Salary” from emloyees;不用双引号,列名默认都是大写字符;用双引号可以区分大小写。5. 字符串连接操作符: “|”select last_name | job_id AS Employees from employees;select last_name | is a | job_id AS Employee Details from employees;6. DISTINCT 去除重复行select department_id from employees; 默认情况,返回所有行,包括重复行select DISTINCT department_id FROM employees; 使用DISTINCT消除重复结果行第二章 条件限制和排序1. 条件限制的关键词:WHERESELECT *|DISTINCT column|expression alias,. FROM table WHERE condition(s);select * from employees WHERE department_id = 90 ;2. 关于NULL的概念NULL表示不可用、未赋值、不知道、不适用, 它既不是0 也不是空格。3. 比较操作符= 等于、 大于、= 大于等于、 小于、= 小于等于、 不等于;BETWEEN . AND . 在两个值之间(也包括等于这两个值);IN (set) 在一个集合范围内;LIKE 匹配一个字符串样子,可以使用%通配符;IS NULL 是一个空值,注意不能使用=NULL;IS NOT NULL 不是一个空值;select salary from employees WHERE salary =10000 AND job_id LIKE %MAN%;select * from employees where salary = 10000 OR job_id LIKE %MAN%;select * from employees where job_id NOT IN (IT_PROG, ST_CLERK, SA_REP);6. 使用ORDER BY 子句进行排序ASC:升序(默认,可以省略)、DESC:倒序select * from employees ORDER BY hire_date ;select * from employees ORDER BY hire_date DESC ;select last_name, salary*12 annsal from employees ORDER BY annsal;select * FROM employees ORDER BY department_id, salary DESC;7. TOP-N 查询:SELECT column_list, ROWNUMFROM (SELECT column_listFROM tableORDER BY Top-N_column)WHERE ROWNUM = N;举例:Select Last_name, ROWNUMFrom ( select Last_name from employee order by salary)Where ROWNUM table2.column2举例:SELECT e.last_name, e.salary, j.grade_levelFROM employees e, job_grades jWHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;3. 外链接(可细分为左外链接、右外链接)语法:SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column(+) = table2.column /左链接SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column = table2.column (+) /右链接举例:SELECT e.last_name, e.department_id, d.department_nameFROM employees e, departments dWHERE e.department_id(+) = d.department_id4. 自链接其实是一种概念,某个table和自己本身链接,比如:table1给另一个“自己”起别名为table2语法:SELECT table1.column, table2.columnFROM table1, table1 table2WHERE table1.column1 = table2.column2举例:SELECT worker.last_name | works for | manager.last_nameFROM employees worker, employees managerWHERE worker.manager_id = manager.employee_id ;5. 工业标准定义(SQL 1999)的链接类型Oracle从9i版本开始提供对SQL1999的兼容支持:SQL1999的语法:SELECT table1.column, table2.column FROM table1CROSS JOIN table2 |NATURAL JOIN table2 |JOIN table2 USING (column_name) |JOIN table2 ON(table1.column_name = table2.column_name) |LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name);1)交叉链接,相当于没有连接条件的多表查询,结果是个卡迪尔乘积,很少用到。SELECT last_name, department_name FROM employees CROSS JOIN departments ;2)自然链接,相当于Oracle的“等于链接”,只不过是让系统自己去找两张表中字段名相同的字段作为“等于链接”条件。(注意如果两个表中有相同的列名,但字段类型不一样,这会引发一个错误。)SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations;3)Using子句,可以看作是自然链接的一种补充功能,可以指定特定的字段作为“等于链接”的条件。SELECT e.employee_id, e.last_name, d.location_id FROM employees e JOIN departments dUSING (department_id) ;4)内链接,相当于Oracle的“等于链接”,关键字INNER JOIN,可简写为JOIN。SELECT employee_id, city, department_nameFROM employees eJOIN departments d ON d.department_id = e.department_idJOIN locations l ON d.location_id = l.location_id;5)外链接(全外链接、左外链接、右外链接)SELECT e.last_name, e.department_id, d.department_nameFROM employees eLEFT/RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id);SELECT e.last_name, e.department_id, d.department_nameFROM employees eFULL OUTER JOIN departments d ON (e.department_id = d.department_id)第四章 单行函数SQL函数类型: 单行函数和多行函数单行函数包括:Character、Number、Date、Conversion、General1. 字符函数(Character):大小写转换函数LOWER(SQL Course) 结果:sql courseUPPER(SQL Course) 结果:SQL COURSEINITCAP(SQL course) 结果:Sql CourseOracle数据库中的数据是大小写敏感的:select * from employees where LOWER(last_name) = higgins;2. 字符函数(Character):字符串操作函数CONCAT(Hello, World) 结果:HelloWorldSUBSTR(HelloWorld,1,5) 结果:HelloLENGTH(HelloWorld) 结果:10INSTR(HelloWorld, W) 结果:6LPAD(salary,10,*) 结果:*24000RPAD(salary, 10, *) 结果:24000*TRIM(H FROM HelloWorld) 结果:elloWorldTRIM( HelloWorld) 结果:HelloWorldTRIM(Hello World) 结果:Hello Worldselect employee_id, CONCAT(first_name, last_name) NAME,job_id,LENGTH (last_name),INSTR(last_name, a) Contains a? from employees where SUBSTR(job_id,4) = REP;3. 数字函数(Number):数字操作函数ROUND(45.926, 2) 45.93TRUNC(45.926, 2) 45.92MOD(1600, 300) 100select ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) from DUAL;select TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-2) from DUAL;select last_name, salary, MOD(salary, 5000) from employees where job_id = SA_REP;4. 日期函数(Date):日期操作函数MONTHS_BETWEEN (01-SEP-95,11-JAN-94) 结果:19.6774194ADD_MONTHS (11-JAN-94,6) 结果:11-Jul-94NEXT_DAY (01-SEP-95,FRIDAY) 结果:8-Sep-95NEXT_DAY (01-SEP-95,1) 结果:2-Sep-95NEXT_DAY (1995-09-01,1) 结果:ORA-01861:literal does not match format stringNEXT_DAY (to_date(1995-09-01,YYYY-MM-DD),1) 结果:2-Sep-95LAST_DAY(01-FEB-95) 结果:28-Feb-95ROUND(25-JUL-95,MONTH) 结果:1-Aug-95ROUND(25-JUL-95 ,YEAR) 结果:1-Jan-96TRUNC(25-JUL-95 ,MONTH) 结果:1-Jul-95TRUNC(25-JUL-95,YEAR) 结果:1-Jan-955. 日期函数(Date):日期的运算操作select last_name, (SYSDATE-hire_date)/7 AS WEEKS, sysdate+1 as tomorrow , hire_date + 8/24 from employees where department_id = 90;6. Oracle数据类型的隐式转换规则(Conversion) 对于赋值操作可以:从VARCHAR2 or CHAR 到 NUMBER从VARCHAR2 or CHAR 到 DATE从NUMBER 到 VARCHAR2从DATE 到 VARCHAR2 对于表达式比较操作仅可以:从VARCHAR2 or CHAR 到 NUMBER从VARCHAR2 or CHAR 到 DATE7. Oracle数据类型的显式转换规则(Conversion) TO_CHAR(date, format_model)函数:日期到字符串的转换日期格式化元素: 意义:YYYY 4位数字表示的年份YEAR 英文描述的年份MM 2位数字表示的月份MONTH 英文描述的月份MON 三个字母的英文描述月份简称DD 2位数字表示的日期DAY 英文描述的星期几DY 三个字母的英文描述的星期几简称HH24:MI:SS AM 时分秒的格式化DDspth 英文描述的月中第几天fm 格式化关键字,可选select last_name, TO_CHAR(hire_date, fmDD of Month YYYY) AS HIREDATE from employees; TO_CHAR(number, format_model)函数:数字到字符串的转换数字格式化元素: 意义:9 表示一个数字0 强制显示0$ 放一个美元占位符L 使用浮点本地币种符号. 显示一个小数点占位符, 显示一个千分位占位符select TO_CHAR(salary, L99,999.00) SALARY from employees where last_name = Ernst; TO_NUMBER(char, format_model)函数:字符串到数字的转换select TO_NUMBER($4,456,$9,999 )from dual; TO_DATE(char, format_model) 函数:字符串到日期的转换select TO_DATE(2-22-2011,MM-DD-YYYY) from dual; 日期转换时使用RR格式的注意事项RR格式 函数嵌套,单行函数可以被无限层的嵌套,计算时先计算里层,再计算外层:select last_name, NVL(TO_CHAR(manager_id), No Manager) from employees where manager_id IS NULL; 其他常用单行函数NVL (expr1, expr2) 如果expr1为空,则返回expr2NVL2 (expr1, expr2, expr3) 如果expr1为空,则返回expr3,否则返回expr2NULLIF (expr1, expr2) 如果expr1和expr2相等,则返回空COALESCE (expr1, expr2, ., exprn) 如果expr1不为空,则返回expr1,结束;否则计算expr2,直到找到一个不为NULL的值或者如果全部为NULL,也只能返回NULL了select last_name, salary, commission_pct,NVL2(commission_pct,SAL+COMM, SAL) incomefrom employees where department_id IN (50, 80);8. 条件表达式实现方法: CASE 语句或者DECODE函数,两者均可实现IF-THEN-ELSE 的逻辑,相比较而言,DECODE 更加简洁。CASE语句:CASE expr WHEN comparison_expr1 THEN return_expr1WHEN comparison_expr2 THEN return_expr2WHEN comparison_exprn THEN return_exprnELSE else_exprEND举例:select last_name, job_id, salary,CASE job_idWHEN IT_PROG THEN 1.10*salaryWHEN ST_CLERK THEN 1.15*salaryWHEN SA_REP THEN 1.20*salaryELSE salaryEND REVISED_SALARYfrom employees;DECODE语句:DECODE(col|expression, search1, result1 , search2, result2,., default)举例:select last_name, job_id, salary,DECODE(job_id, IT_PROG, 1.10*salary,ST_CLERK, 1.15*salary,SA_REP, 1.20*salary,salary) REVISED_SALARYfrom employees;第五章 分组计算函数和GROUP BY子句分组计算函数:相对于单行函数,也可称之为多行函数,它的输入是多个行构成得一个行集(这个行集可以是一张表的所有行,也可以是按照某个维度进行分组后的某一组行),而输出都是一个值;比如我们常见的一些分组计算需求:求某个部门的薪资总和,薪资平均值,薪资最大值等等。1. 常用分组计算函数分组计算函数(常用)包括:1、求和(SUM)2、求平均值(AVG)3、计数(COUNT)4、求标准差(STDDEV)5、求方差(VARIANCE)6、求最大值(MAX)7、求最小值(MIN)2. SQL中使用分组计算函数的语法SELECT column, group_function(column), .FROM tableWHERE conditionGROUP BY columnORDER BY column;select AVG(salary), MAX(salary), MIN(salary), SUM(salary) from employees where job_id LIKE %REP%;备注:MIN, MAX 可用于任何数据类型,但AVG , SUM,STDDEV, VARIANCE仅适用于数值型字段。3. COUNT函数说明COUNT(*) 返回满足选择条件的所有行的行数,包括值为空的行和重复的行。COUNT(expr) 返回满足选择条件的且表达式不为空行数。COUNT(DISTINCT expr) 返回满足选择条件的且表达式不为空,且不重复的行数。当分组计算函数遇到NULL时,不进行计算。4. 使用GROUP BY子句进行分组1)可以按照某一个字段分组,也可以按照多个字段的组合进行分组。SELECT AVG(salary) FROM employees GROUP BY department_id ;SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id ;2)SELECT 查询语句中同时选择分组计算函数表达式和其他独立字段时,其他字段必须出现在Group By子句中,否则不合法。SELECT department_id, COUNT(last_name) FROM employees GROUP BY department_id;3)不能在Where 条件中使用分组计算函数表达式,当出现这样的需求的时候,使用Having子句。SELECT department_id, AVG(salary) FROM employees GROUP BY department_idHAVING AVG(salary) 8000;4)分组计算函数也可嵌套使用。SELECT MAX(AVG(salary) FROM employees GROUP BY department_id;5. GROUP BY子句的增强1) 在Group By 中使用Rollup 产生常规分组汇总行以及分组小计:SELECT department_id, job_id, SUM(salary)FROM employeesWHERE department_id 60GROUP BY ROLLUP(department_id, job_id);Rollup 后面跟了n个字段,就将进行n+1次分组,从左到右每次减少一个字段进行分组;然后进行union。2) 在Group By 中使用Cube 产生Rollup结果集+ 多维度的交叉表数据源:SELECT department_id, job_id, SUM(salary)FROM employeesWHERE department_id 60GROUP BY CUBE (department_id, job_id);Cube 后面跟了n个字段,就将进行2的N次方的分组运算,然后进行union。3) GROUPING函数:Rollup 和Cube有点抽象,他分别相当于n+1 和2的n次方常规Group by 运算;那么在Rollup 和Cube的结果集中如何很明确的看出哪些行是针对那些列或者列的组合进行分组运算的结果的? 答案是可以使用Grouping 函数; 没有被Grouping到返回1,否则返回0SELECT department_id DEPTID, job_id JOB,SUM(salary),GROUPING(department_id) GRP_DEPT,GROUPING(job_id) GRP_JOBFROM employeesWHERE department_id (SELECT salary FROM employees WHERE last_name = Abel);注意点:单行比较必须对应单行子查询(返回单一结果值的查询);比如 = , 多行比较必须对应多行子查询(返回一个数据集合的查询);比如IN, ANY, ALL等2. 子查询进阶1) 非相关子查询当作一张表来用SELECT a.last_name, a.salary,a.department_id, b.salavgFROM employees a, (SELECT department_id,AVG(salary) salavgFROM employeesGROUP BY department_id) bWHERE a.department_id = b.department_idAND a.salary b.salavg;2) 相关子查询的概念: 子查询中参考了外部主查询中的表。SELECT e.employee_id, last_name,e.job_idFROM employees eWHERE 2 (SELECT COUNT(*)FROM job_history JHWHERE JH.employee_id = E.employee_idGROUP BY employee_idHAVING COUNT(*) = 4);6) 使用WITH子句。使用WITH好处:1) 如果在后面多次使用则可以简化SQL ; 2) 适当提高性能WITHdept_costs AS (SELECT d.department_name, SUM(e.salary) AS dept_totalFROM employees e, departments dWHERE e.department_id = d.department_idGROUP BY d.department_name),avg_cost AS (SELECT SUM(dept_total)/COUNT(*) AS dept_avgFROM dept_costs)SELECT *FROM dept_costsWHERE dept_total (SELECT dept_avg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理继续教育培训班课件
- 小学语文《黄继光》课件
- 安徽省亳州市部分学校2024-2025学年高一下学期期末考试语文试题(含答案)
- 慢病诊疗培训
- 绩效管理培训方案
- 双法兰液位计培训
- 肝肿瘤射频消融治疗技术
- 流程密码安全管理与共享规范
- 物业安全培训课件
- 2025肿瘤营养饮食指导
- 托育管理制度
- 2025年河南省洛阳市涧西区九年级中考招生一模道法试题卷(含答案)
- 2025年高考语文备考之小说精读:凌叔华《搬家》(附习题+答案)
- 工余安全知识培训课件
- 地生中考试卷真题及答案
- 浙江国企招聘2024温州市交通发展集团有限公司招聘47人笔试参考题库附带答案详解
- 华能国际电力江苏能源开发有限公司南通电厂100MW-200MWh共享储能项目(220kV升压站工程)报告表
- 消防维保合同样本
- 高中主题班会 预防青少年药物滥用课件-高中主题班会
- 股骨粗隆间骨折护理疑难病例讨论
- 电动车充电桩设计
评论
0/150
提交评论