《Oracle数据库Sql语句详解大全.pptx》由会员分享,可在线阅读,更多相关《Oracle数据库Sql语句详解大全.pptx(170页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、NameDateOracleSQL第一章第一章SELECT查询查询本章目标本章目标写一条SELECT查询语句在查询中使用表达式、运算符对空值的处理对查询字段起别名查询字段的连接SELECT查询基本语法查询基本语法SELECT FROM SQL SQL SELECT SELECT *FROM s_emp FROM s_emp请查询出s_emp表中所有的员工信息:查询指定列查询指定列SQL SQL SELECT SELECT dept_id,salarydept_id,salary FROM s_emp FROM s_emp请查询出s_emp表中所有的员工的部门ID,工资:运用算数表达式运用算数表
2、达式SQL SQL SELECT SELECT salary*12salary*12 FROM s_emp FROM s_emp请查询出s_emp表中所有的员工的年薪:运用算数表达式运用算数表达式括号可以改变运算符运算的优先顺序:SQL SELECT SQL SELECT last_name,salary,12*salary+100last_name,salary,12*salary+100 2 FROM 2 FROM s_emp;s_emp;.Velasquez 2500 30100Velasquez 2500 30100SQL SELECT SQL SELECT last_name,sal
3、ary,12*(salary+100)last_name,salary,12*(salary+100)2 FROM 2 FROM s_emp;s_emp;.Velasquez 2500 31200Velasquez 2500 31200列别名列别名请查询出s_emp表中所有的员工的姓名:SQL SQL SELECT SELECT firname_name|last_namefirname_name|last_name FROM s_emp FROM s_empSQL SQL SELECT firname_name|last_name SELECT firname_name|last_name
4、“姓名姓名姓名姓名”FROM s_empFROM s_emp请查询出s_emp表中所有的员工的姓名:空值的处理空值的处理请查询出s_emp表中所有的员工的工资:SQL SELECTSQL SELECT last_name,last_name,salary*commission_pct/100salary*commission_pct/100 “工资工资工资工资”2 2 FROM FROM s_emp;s_emp;SQL SQL SELECT SELECT last_name,salary+salary*last_name,salary+salary*NVL(commission_pct,0)N
5、VL(commission_pct,0)/100/100 2 2 FROM FROM s_emp;s_emp;去掉重复行去掉重复行请查询出s_dept表的部门名称:SQL SELECTSQL SELECTnamename 2 FROM 2 FROM s_dept;s_dept;SQL SELECTSQL SELECTDISTINCTDISTINCT name name 2 FROM 2 FROM s_dept;s_dept;去掉多列重复行去掉多列重复行SQL SELECTSQL SELECT DISTINCTDISTINCT dept_id,title dept_id,title 2 FROM
6、 2 FROM s_emp;s_emp;请查询出s_emp表中所有的员工的部门ID及职称:小结小结查询表的全部记录查询指定的列给列起别名NVL函数及字符串连接符重复行的处理DistinctSELECTSELECT DISTINCT*,columnalias,.DISTINCT*,columnalias,.FROMFROM table;table;引言引言第二章第二章 条件查询条件查询本章目标本章目标WHERE条件查询在查询中使用表达式、运算符使用LIKE、BETWEEN、IN进行模糊查询第一章内容回顾第一章内容回顾v对员工表中信息进行查询,具体要求如下:1.查询s_emp表表要求输出员工姓名(
7、firs_name、last_name)和实际工资(基本工资+提成):查询基本语法查询基本语法SELECT FROM WHERE 列名称列名称SELECT*表名表名FROMS_emp过滤条件过滤条件WHEREdept_id=41 v请查询出s_emp表中dept_id为41的员工信息:WHERE条件查询条件查询请查询出s_emp表中last_name为Smith的员工的信息:SELECT*FROM s_emp WHERE last_name=Smith请查询出s_emp表中部门ID为50并且工资大于1500的员工的信息:SELECT*FROM s_emp WHERE salary1500 an
8、d dept_id=50WHERE条件查询条件查询-BETWEEN&IN请查询出s_emp表中工资在1500到2000之间的员工信息:SELECT*FROM s_emp WHERE salary between 1500 and 2000请查询出s_dept表中region_id为1,3的部门信息:SELECT*FROM s_dept WHERE region_id in(1,3)WHERE条件查询条件查询-like请查询出s_emp表中姓中含有字母a的员工信息:SELECT*FROM s_emp WHERE last_name like%a%请查询出当前用户下所有以s_开头的表:SELECT
9、 table_name FROM user_tables WHERE table_name like S_%escape 请查询出s_emp表姓中第二个字母为a的员工信息:SELECT*FROM s_emp WHERE last_name like _a%空值的查询空值的查询v查询出s_emp表中非销售职位的员工信息:SELECT*FROM s_emp WHERE commission_pct is null 课堂练习课堂练习已建立好的S_emp表,对此表中的数据进行模糊查询,具体要求如下:查询一名last_name以“M”开头的员工,他的dept_id好像是3X查询工资在1200至1500之
10、间的员工查询来自部门ID为(41,42,43)的员工查询结果排序查询结果排序v查询出s_emp表将部门ID为41的员工的工资按从高到低排列显示出来:SELECT*FROM s_emp WHERE dept_id=41 ORDER BY salary DESC SQL SELECTSQL SELECTlast_name,dept_id,salarylast_name,dept_id,salary 2 FROM 2 FROM s_emps_emp 3 3 ORDER BYORDER BYdept_id,salary DESC;dept_id,salary DESC;小结小结Where条件查询Bet
11、weenand&In&Like 模糊查询对查询结果排序SELECTSELECTDISTINCT*,column alias,.DISTINCT*,column alias,.FROM FROM tabletableWHEREWHEREcondition(s)condition(s)ORDER BYORDER BYcolumn,expr,alias ASC|DESC;column,expr,alias ASC|DESC;第三章第三章 单行函数单行函数本章目标本章目标熟悉各种类型单行函数的使用掌握转换函数的使用两种两种SQL函数函数单行函数CharacterNumberDateConversion
12、SINGLE-ROWSINGLE-ROWFUNCTIONFUNCTION多行函数GroupMULTI-ROWMULTI-ROWFUNCTIONFUNCTION字符函数字符函数LOWER将字符串转换成小写 UPPER将字符串变为大写 INITCAP将字符串的第一个字母变为大写 CONCAT拼接两个字符串,与|相同 SUBSTR取字符串的子串 LENGTH以字符字符给出字符串的长度 NVL以一个值来替换空值 字符函数举例字符函数举例LOWER(SQL Course)sql courseUPPER(SQL Course)SQL COURSEINITCAP(SQL Course)Sql CourseS
13、ELECT*FROM s_emp WHERE last_name=PATELSELECT*FROM s_emp WHERE UPPER(last_name)=PATEL字符操作函数字符操作函数CONCAT(Good,String)GoodStringSUBSTR(String,1,3)StrLENGTH(String)6数字函数数字函数ROUND(value,precision)按precision 精度4舍5入TRUNC(value,precision)按precision 截取valueSQLSELECTround(55.5),round(-55.5),trunc(55.5),trunc(
14、-55.5)FROMdual;round(55.5)round(-55.5)trunc(55.5)trunc(-55.5)-56 -56 55 -55SQLSELECTTRUNC(124.16666,-2)trunc1,trunc(124.16666,2)FROMdual;TRUNC1 TRUNC(124.16666,2)-100 124.16Round&Trunc函数函数ROUND(45.923,2)45.92ROUND(45.923,0)46ROUND(45.923,-1)50TRUNC(45.923,2)45.92TRUNC(45.923)45TRUNC(45.923,-1)40日期函数
15、日期函数MONTHS_BETWEEN(date2,date1)给出 Date2-date1的月数ADD_MONTHS增加或减去月份NEXT_DAY(date,day)给出日期date之后下一天的日期LAST_DAY(date)返回日期所在月的最后一天 日期函数日期函数MONTHS_BETWEEN(01-SEP-95,11-JAN-94)19.774194ADD_MONTHS(11-JAN-94,6)11-JUL-94NEXT_DAY(01-SEP-95,FRIDAY)08-SEP-95LAST_DAY(01-SEP-95)30-SEP-95日期函数日期函数ROUND(25-MAY-95,MON
16、TH)01-JUN-95ROUND(25-MAY-95,YEAR)01-JAN-95TRUNC(25-MAY-95,MONTH)01-MAY-95TRUNC(25-MAY-95,YEAR)01-JAN-95转换函数转换函数TO_CHAR(date,fmt)TO_CHAR(date,fmt)转换日期格式到字符串转换日期格式到字符串转换日期格式到字符串转换日期格式到字符串 用下列格式显示字符为数字:9代表一个数字.0显示前缀零.$根据本地语言环境显示货币.L采用当地货币符号.打印一个小数点.,千位计算法显示.日期格式日期格式DY星期几的缩写Mon,Tue,.DAY星期几的全拼Monday,Tues
17、day,.D一周的星期几,星期天=1,星期六=71,2,3,4,5,6,7DD一月的第几天,1311,2,.31W一个月的第几周,151,2,3,4,5WW,IW一年的第几周,一年的ISO的第几周1,2,3,4,.52MM两为数的月01,02,03,.12MON月份的缩写Jan,Feb,Mar,.DecMONTH月份的全拼January,February,.YYYY,YYY,YY,Y四位数的年,三位数的年1999,999,99,9YEAR年的全拼NineteenNinety-nineRR当前年份的后两位数字01代表2001年HH,HH1212小时制,1121,2,3,.12HH2424小时制,
18、0230,1,2,3,.23MI一小时中的第几分,0590,1,2,3.59SS一分中的第几秒,0590,1,2,3,.59To-char举例举例SQL SELECTSQL SELECT last_name,last_name,TO_CHAR(start_date,TO_CHAR(start_date,2 2 fmDdspth offmDdspth of Month YYYY Month YYYY fmHH:MI:SS AM)HIREDATEfmHH:MI:SS AM)HIREDATE 3 3 FROM FROMs_emps_emp 4 4 WHERE WHERE start_date LIK
19、E%91;start_date LIKE%91;SQL SELECTSQL SELECT Order Order|TO_CHAR(id)TO_CHAR(id)|2 2 was filled for a total of was filled for a total of|TO_CHAR(total,fm$9,999,999)TO_CHAR(total,fm$9,999,999)3 3 FROM FROM s_ords_ord 4 4 WHERE WHERE ship_date=21-SEP-92;ship_date=21-SEP-92;To-char举例举例v查询员工表中入职日期在7月份的员工
20、信息:SELECT*FROM s_emp WHERE SELECT*FROM s_emp WHERE to_char(start_date,mm)=07to_char(start_date,mm)=07RR 日期格式日期格式Current YearCurrent Year19951995199519952001200120012001Specified DateSpecified Date27-OCT-9527-OCT-9527-OCT-1727-OCT-1727-OCT-1727-OCT-1727-OCT-9527-OCT-95RR FormatRR Format19951995201720
21、172017201719951995YY FormatYY Format19951995191719172017201720952095If the specified two-digit year isIf the specified two-digit year isIf two If two digits digits of the of the current current year year areare0-490-490-490-4950-9950-9950-9950-99The return The return date is in the date is in the cu
22、rrent current century.century.The return The return date is in date is in the century the century after the after the current one.current one.The return The return date is in the date is in the century century before the before the current one.current one.The return The return date is in the date is
23、 in the current current century.century.转换函数转换函数TO_TO_NUMBERNUMBER(StringString)转换字符串到数字转换字符串到数字转换字符串到数字转换字符串到数字TO_TO_DATEDATE(StringString)转换字符串到日期格式转换字符串到日期格式转换字符串到日期格式转换字符串到日期格式SELECT SELECT to_date(to_date(2009-09-222009-09-22,yyyy-mm-ddyyyy-mm-dd)FROM dual FROM dual转换函数的嵌套转换函数的嵌套F3(F2(F1(col,ar
24、g1),arg2),arg3)F3(F2(F1(col,arg1),arg2),arg3)Step 1=Result 1Step 2=Result 2Step 3=Result 3转换函数嵌套举例转换函数嵌套举例SQL SELECTSQL SELECTlast_name,last_name,2 2 NVL(TO_CHAR(manager_id),No Manager)NVL(TO_CHAR(manager_id),No Manager)3 FROM 3 FROMs_emps_emp 4 WHERE 4 WHERE manager_id IS NULL;manager_id IS NULL;查询
25、员工表中manager_idmanager_id为空的员工查询出来,并将空列的值置为“NoManager”:小结小结字符函数日期函数数值函数转换函数第四章第四章 关联查询关联查询本章目标本章目标在一张或多张表中使用等值或非等值连接使用外连接查询自连接查询等值连接的种类等值连接的种类等值连接非等值连接外连接自连接S_EMP TableS_EMP TableID LAST_NAME ID LAST_NAME DEPT_IDDEPT_ID-1 Velasquez 1 Velasquez5050 2 Ngao 2 Ngao4141 3 Nagayama 3 Nagayama3131 4 Quick-T
26、o-See 4 Quick-To-See1010 5 Ropeburn 5 Ropeburn5050 6 Urguhart 6 Urguhart4141 7 Menchu 7 Menchu4242 8 Biri 8 Biri4343 9 Catchpole 9 Catchpole444410 Havel10 Havel454511 Magee11 Magee313112 Giljum12 Giljum323213 Sedeghi13 Sedeghi333314 Nguyen14 Nguyen343415 Dumas15 Dumas353516 Maduro16 Maduro4141表间的关系表
27、间的关系S_DEPT TableS_DEPT TableID NAME REGION_IDID NAME REGION_ID-30 Finance 130 Finance 131 Sales 131 Sales 132 Sales 232 Sales 243 Operations 343 Operations 350 Administration 150 Administration 1S_REGION TableS_REGION TableID NAMEID NAME-1 North America 1 North America 2 South America 2 South Americ
28、a 3 Africa/Middle East 3 Africa/Middle East 4 Asia 4 Asia 5 Europe 5 Europe简单关联查询的语法简单关联查询的语法查询员工表中last_namelast_name为Biri的员工的last_name与部门名称查询出来:SELECT table.column,table.columntable.column,table.columnFROMtable1,table2table1,table2WHERE table1.column1=table2.column2table1.column1=table2.column2SQL
29、SELECTSQL SELECT e.last_name e.last_name,d.name d.name 2 2 FROMFROM s_emps_emp e,s_dept d e,s_dept d 3 3 WHEREWHERE e.dept_id=d.ide.dept_id=d.id and e.last_name=Biri and e.last_name=Biri非等值连接非等值连接SQL SELECT e.ename,e.job,e.sal,s.gradeSQL SELECT e.ename,e.job,e.sal,s.grade2 2FROM emp e,salgrade sFROM
30、 emp e,salgrade s3 3WHERE WHERE e.sal BETWEEN s.losal AND s.hisal;e.sal BETWEEN s.losal AND s.hisal;自连接自连接S_EMP(WORKER)S_EMP(WORKER)S_EMP(MANAGER)S_EMP(MANAGER)LAST_NAME LAST_NAME MANAGER_IDMANAGER_ID IDID LAST_NAMELAST_NAME-NgaoNgao1 11 1 VelasquezVelasquezNagayamaNagayama1 11 1 Velasquez Velasquez
31、 RopeburnRopeburn1 11 1 Velasquez Velasquez UrguhartUrguhart2 22 2 NgaoNgaoMenchuMenchu2 2 2 2 Ngao Ngao BiriBiri2 2 2 2 Ngao Ngao MageeMagee3 33 3 NagaymaNagaymaGiljumGiljum3 3 3 3 Nagayma Nagayma.ServerServer自连接自连接查询员工表中last_namelast_name为Biri的员工的last_name及其部门经理名称查询出来:SQL SELECTSQL SELECT worker.l
32、ast_name|works for|manager.last_nameworker.last_name|works for|manager.last_name 2 2 FROM FROM s_emp worker,s_emp managers_emp worker,s_emp manager 3 3 WHERE WHERE worker.manager_id=manager.id;worker.manager_id=manager.id;外连接外连接SQL SELECTSQL SELECT worker.last_name|works for|manager.last_nameworker.
33、last_name|works for|manager.last_name 2 2 FROM FROM s_emp worker,s_emp managers_emp worker,s_emp manager 3 3 WHERE WHERE worker.manager_id=manager.idworker.manager_id=manager.id (+);SQL SELECTSQL SELECT worker.last_name|works for|manager.last_nameworker.last_name|works for|manager.last_name 2 2 FROM
34、 FROM s_emp worker,s_emp managers_emp worker,s_emp manager 3 3 WHERE WHERE worker.manager_idworker.manager_id(+)=manager.id;=manager.id;SQL SELECTSQL SELECT worker.last_name|works for|manager.last_nameworker.last_name|works for|manager.last_name 2 2 FROM FROM s_emp workers_emp worker left outer join
35、left outer join s_emp managers_emp manager 3 3 on on worker.manager_id=manager.id;worker.manager_id=manager.id;内连接内连接SQL SELECTSQL SELECT e.last_name e.last_name,d.name d.name 2 2 FROMFROM s_emps_emp e,s_dept d e,s_dept d 3 3 WHEREWHERE e.dept_id=d.ide.dept_id=d.id and e.last_name=Biri and e.last_na
36、me=BiriSQL SELECTSQL SELECT e.last_name e.last_name,d.name d.name 2 2 FROMFROM s_emps_emp e e inner joininner join s_dept d s_dept d onon e.dept_id=d.id e.dept_id=d.id 3 WHERE e.last_name=Biri 3 WHERE e.last_name=Biri小结小结等值连接非等值连接外连接自连接第五章第五章 组函数组函数本章目标本章目标定义及有效的使用组函数使用Group By对查询数据分组使用HAVING子句对分组后的
37、数据进行过滤使用使用Group By的查询语法的查询语法SELECTSELECT column,group_functioncolumn,group_functionFROMFROMtabletableWHEREWHEREconditionconditionGROUP BYGROUP BY group_by_expressiongroup_by_expressionHAVINGHAVINGgroup_conditiongroup_conditionORDER BYORDER BYcolumn;column;常用组函数常用组函数vAVG(DISTINCT|ALL|n)vCOUNT(DISTINC
38、T|ALL|expr|*)vMAX(DISTINCT|ALL|expr)vMIN(DISTINCT|ALL|expr)vSUM(DISTINCT|ALL|n)应用举例应用举例查询s_emp表中所有员工的平均工资:SQL SELECTSQL SELECT avgavg(salarysalary)2 2 FROMFROM s_emps_emp查询s_emp表中各个部门员工的平均工资及部门名称:SQL SELECTSQL SELECT e.dept_id,e.dept_id,max(d.name)max(d.name),avg(e.salary),avg(e.salary)2 2 FROMFROM
39、s_emps_emp e,s_dept d e,s_dept d 3 WHERE e.dept_id=d.id 3 WHERE e.dept_id=d.id 4 4 GROUP BY dept_idGROUP BY dept_id;应用举例应用举例查询s_emp表中31部门一共有多少员工:SQL SELECTSQL SELECTCOUNT(*)COUNT(*)2 FROM 2 FROMs_emps_emp 3 WHERE 3 WHERE dept_id=31;dept_id=31;查询s_emp表中销售人员的数量(提成率不为空的记录个数):SQL SELECTSQL SELECTCOUNT(C
40、OUNT(commission_pctcommission_pct)2 FROM 2 FROMs_emps_emp应用举例应用举例SQL SELECTSQL SELECT e.dept_id,e.dept_id,max(d.name),avg(e.salary),sum(salary)max(d.name),avg(e.salary),sum(salary)2 2 FROMFROM s_emps_emp e,s_dept d e,s_dept d 3 WHERE e.dept_id=d.id 3 WHERE e.dept_id=d.id 4 GROUP BY dept_id 4 GROUP B
41、Y dept_id 5 ORDER BY sum(salary);5 ORDER BY sum(salary);查询s_emp表中各个部门员工的平均工资,工资总和及部门名称并按照工资总和排序:应用举例应用举例SQL SELECTSQL SELECT e.dept_id,e.dept_id,max(d.name),avg(e.salary),sum(salary)max(d.name),avg(e.salary),sum(salary)2 2 FROMFROM s_emps_emp e,s_dept d e,s_dept d 3 WHERE e.dept_id=d.id 3 WHERE e.de
42、pt_id=d.id and e.dept_id!=41and e.dept_id!=41 4 GROUP BY dept_id 4 GROUP BY dept_id 5 ORDER BY sum(salary);5 ORDER BY sum(salary);查询s_emp表中除41部门以外的部门员工的平均工资,工资总和及部门名称并按照工资总和排序:SQL SELECTSQL SELECT e.dept_id,e.dept_id,max(d.name),avg(e.salary),sum(salary)max(d.name),avg(e.salary),sum(salary)2 2 FROMF
43、ROM s_emps_emp e,s_dept d e,s_dept d 3 WHERE e.dept_id=d.id 3 WHERE e.dept_id=d.id 4 GROUP BY dept_id 4 GROUP BY dept_id 5 HAVING e.dept_id!=415 HAVING e.dept_id!=41 6 ORDER BY sum(salary);6 ORDER BY sum(salary);应用举例应用举例求平均工资高于1500的部门的工资总和,最高工资,最低工资:SQL SELECTSQL SELECT e.dept_id,e.dept_id,max(d.nam
44、e),avg(e.salary),sum(e.salary)max(d.name),avg(e.salary),sum(e.salary)2 2 FROMFROM s_emps_emp e,s_dept d e,s_dept d 3 WHERE e.dept_id=d.id 3 WHERE e.dept_id=d.id 4 GROUP BY dept_id 4 GROUP BY dept_id 5 HAVING avg(e.salary)15005 HAVING avg(e.salary)1500 6 ORDER BY 6 ORDER BY avgavg(e.salary);(e.salary
45、);课堂练习课堂练习求不以“VP”开头职位的,各个职位中工资总和大于5000的职位及工资总和,并按工资总和排序:SQL SELECTSQL SELECT title,SUM(salary)PAYROLLtitle,SUM(salary)PAYROLL 2 FROM 2 FROM s_emps_emp 3 WHERE 3 WHERE title NOT LIKE VP%title NOT LIKE VP%4 GROUP BY 4 GROUP BY titletitle 5 HAVING 5 HAVING SUM(salary)5000SUM(salary)5000 6 ORDER BY 6 OR
46、DER BY SUM(salary);SUM(salary);小结小结vSELECTSELECT column,group_functioncolumn,group_functionvFROMFROMtabletablevWHEREWHERE conditionconditionvGROUP BYGROUP BY group_by_expressiongroup_by_expressionvHAVINGHAVING group_conditiongroup_conditionvORDER BYORDER BY column;column;第六章第六章 子查询子查询子查询子查询查询s_emp表中
47、工资最低的员工的姓名:SQL SELECTSQL SELECT min min(salarysalary)2 2 FROMFROM s_emps_empSQL SELECTSQL SELECT last_name last_name 2 2 FROMFROM s_emps_emp 3 WHERE salary=3 WHERE salary=最小工资(上一条的运行结果)最小工资(上一条的运行结果)最小工资(上一条的运行结果)最小工资(上一条的运行结果)SQL SELECTSQL SELECT last_name last_name 2 2 FROMFROM s_emps_emp 3 WHERE
48、salary 3 WHERE salary=(=(SELECTSELECT min(salary)min(salary)FROMFROM s_emps_emp)子查询子查询查询s_emp表中平均工资低于32部门的部门ID:SQL SELECTSQL SELECT avg avg(salarysalary)2 2 FROMFROM s_emps_emp 3 WHERE dept_id=32;3 WHERE dept_id=32;SQL SELECTSQL SELECT dept_id,avg(salary)dept_id,avg(salary)2 2 FROMFROM s_emps_emp 3
49、GROUP BY dept_id 3 GROUP BY dept_id 4 HAVING 4 HAVING avg(salary)32avg(salary)SELECTSQL SELECT dept_id,avg(salary)dept_id,avg(salary)2 2 FROMFROM s_emps_emp 3 GROUP BY dept_id 3 GROUP BY dept_id 4 HAVING4 HAVING avg(salary)(avg(salary)SELECTSQL SELECT dept_id,avg(salary),name dept_id,avg(salary),nam
50、e 2 2 FROMFROM s_emps_emp,s_dept,s_dept 3 WHERE 3 WHERE s_emps_emp.dept_id=s_dept.id.dept_id=s_dept.id 4 GROUP BY dept_id,name 4 GROUP BY dept_id,name 5 HAVING avg(salary)(5 HAVING avg(salary)SELECTSQL SELECTlast_name,first_name,titlelast_name,first_name,title 2 FROM 2 FROMs_emps_emp 3 WHERE 3 WHERE