




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL结构化查询语言
(StructuredQueryLanguage)数据库简介从20世界50年代中期开始,计算机的应用由科学研究部门逐步发展到企业、行政部门。至60年代,数据处理成为计算机的主要应用,数据库技术作为数据管理技术,是计算机软件领域的一个重要分支,产生与60年代末。在数据处理中,通常计算是比较简单的,而数据的管理比较复杂。数据管理是指数据的收集、整理、组织、存储、维护、检索、传送等操作,这部分操作是数据处理业务的基本环节。数据管理技术的发展经过了3个阶段:人工管理阶段文件系统阶段数据库阶段数据库简介人工管理阶段(20世纪50年代中期以前),这一阶段的计算机主要用于科学计算,其数据管理有如下特点:数据不保存在机器中,数据是程序的一部分。程序和数据不具备独立性。每个程序都包括存储结构、存取方法输出方式等,当存储结构改变时,程序必须要改变。数据是面向应用的,一组数据对应一个程序。文件系统阶段(20世纪50年代后期至60年代中期),这一阶段,计算机不仅用于科学计算,还用于信息的管理。文件系统的出现使此时的数据管理具有如下特点:数据以文件的形式长期保存在硬盘上。程序与数据之间具有“设备独立性”,程序只需文件名即可操作文件数据不再属于特定的程序,可以重复使用。数据库简介数据库阶段(20世纪60年代末开始),数据库阶段的管理方式具有如下特点:数据不再面向特定的某个或多个应用,而是面向整个应用系统的,数据冗余明显减少,实现了数据共享。有较高的数据独立性。可分为物理数据独立性和逻辑数据独立性。数据库系统为用户提供了方便的用户接口系统提供了多方面的数据保护功能:数据库的恢复、并发控制、数据完整性和数据安全性,以保证数据库中的数据是安全、正确和可靠的。应用程序1dbdbms应用程序1应用程序1....数据库简介在数据库技术中,有3个名词,应加以区分数据库(Database,DB):统一管理的数据的集合,DB能为各种用户共享,具有较小冗余度,数据关联密切,具有较高的数据独立性。数据库管理系统(DatabaseManagementSystem.DBMS):位于用户和OS之间的一层数据管理软件,为用户或应用程序提供访问DB的方法。数据库系统(DatabaseSystem,DBS):采用了数据库技术的计算机系统。实现有组织地、动态地存储大量关联数据,方便多用户访问的计算机软件、硬件和数据资源组成的系统。数据描述在数据处理中,数据描述将涉及不同的范畴。从事物的特点到计算机中的数据表示,经历了三个领域:现实世界信息世界,是现实世界在人们头脑中的反映,人们把它用文字和符号记载下来。数据库技术用的如下术语:实体:客观存在的可以相互区别的事物.实体集:性质相同的同类实体的集合。属性:实体有很多特性,每个特性称为属性。实体标识符:能惟一标识每个实体的属性或属性集。引用机器世界,信息世界的信息在机器中以数据形式存在。字段:标记实体属性的命名单位。是可命名的最小单位。记录:字段的有序集合,通常用一条记录描述一个实体。文件:同一类记录的汇聚,是描述实体集的。键:能惟一标识文件中每个记录的字段或字段集。数据关联现实世界中,事物是相互联系的。这种联系必然在信息世界中有所反映,也就是说,实体不是孤立存在的。两个不同的实体集的实体间联系有三种情况:一对一关联一对多关联多对多关联数据库简介DBMS总是基于某种数据模型的,可以分为层次型、网状型、关系型(RDBMS)和面向对象型DBMS关系型数据库的主要特征是用二维表格结构表达实体集,用外键表示实体间联系。常用的数据库产品OracleMySQLSQLServer,AccessDB2…数据库三级模式结构数据库的作用就是把数据的具体组织留给DBMS去做,用户只要抽象的处理数据,而不必关系数据在计算机中的存储和表示。对DB的一切操作,都是通过DBMS进行的。DB内模式概念模式外模式外模式用户程序用户程序终端命令DBMSOracle数据库的安装Windows下Oracle10g数据库的安装安装路径尽量不要含有中文
配置全局数据库名和设置密码口令管理激活用户帐号管理后台http://system:1158/emSQL*PLUShttp://system:5560/isqlplus/userName:scott,password:tiger/自己改TOAD的安装和使用计算机名connectoraclesqlplussqlplus/nologconnscott/tigerconnsys/chang_on_installconnsystem/mangersqlplusscott/tigersqlplusscott/tiger@link_characterSQL语言结构化查询语言(StructuredQueryLanguage),具有定义、查询、更新和控制等多种功能,是关系数据库的标准语言。SQL分类:数据操纵语言DML:SELECTINSERTUPDATEDELETE数据定义语言DDL:CREATEALTERDROPRENAMETRUNCATE数据控制语言DCL:GRANTREVOKETransaction事务--》原子性操作:commitrollbacksavepoint实验用数据表查看所有表:selecttable_namefromuser_tables;查看表结构:describedept;(或者descdept;)emp表雇员表Empno:雇员工号Ename:雇员名字Job:工作。(秘书、销售、经理、分析员、保管)Mgr(manager):经理的工号Hiredate:雇用日期Sal:工资Comm:津贴Deptno:所属部门号dept表部门表Deptno:部门号Dname:部门名字Loc:地址salgrade表薪水等级Grade:等级losal:最低工资hisal:最高工资bonus表奖金Ename:雇员名字,job:工作,sal:工资comm:津贴添加注释为表添加注释commentontableempis‘雇员表';select*fromuser_tab_comments为列添加注释commentoncolumnemp.Empnois'雇员工号';select*fromuser_col_commentsSELECTSelect-from-where句型SELECT[DISTINCT]{*,columnalias,..}FROMtableWhere条件表达式aliasColumnaliasColumn“alias”ColumnasaliasSELECT语言 检索单个列selectcolfromtableName;检索多个列selectcol1,col2,col3fromtableName;检索所有列select*fromtableName;使用通配符的优点:书写方便、可以检索未知列使用通配符的缺点:降低检索的性能给检索出的列起个别名selectjob"gongzuo"fromemp;selectjobas"gongzuo"fromemp;selectselect*fromemp;selectempnofromemp;selectempnoempnumberfromemp;selectempno“empnumber”fromemp;selectempnoasempnumberfromemp;selectdistinctempnofromemp;where条件比较=,!=,<>,<,>,<=,>=,any,some,allisnull,isnotnullbetweenxandyexsits(sub-query)in(list),notin(list)like_,%,escape‘\‘_\%escape‘\’whereselect*fromempwherecommisnull;select*fromempwherecommisnotnull;selectename,salfromempwheresalin(800,1250,1500,2000);selectename,salfromempwhereenamein(‘SMITH’,‘ALLEN’,‘KING’);selectename,salfromempwheresalbetween1000and2500;selectename,salfromempwheredeptno<>10;where逻辑复合条件not,and&&,or||计算次序问题的解决,最好用括号进行分组处理SQL优化问题:AND:把检索结果较少的条件放到前面OR:把检索结果较多的条件放到前面whereselectename,hiredatefromempwherehiredate>’20-2月-81’;selectename,salfromempwheredeptno=10andsal>1000;selectename,job,deptnofromempwheredeptno=10orjob=‘CLERK’;selectename,salfromempwheresalnotin(800,1500,2000);列出deptno为10或者30,并且工资>2000的所有人。like条件表达式中字符串匹配操作符是“like”%通配符表示任意字符出现任意次数_通配符表示任意字符出现一次Whereenamelike‘A%’技巧和注意事项:不能过度使用通配符。如果其他操作符能达到目的,就不要使用通配符。确实需要使用通配符时,除非绝对必要,否则不要把通配符用到搜索模式最开始处,因为这样搜索起来是最慢的。selectenamefromempwhereenamelike‘%ALL%’;selectenamefromempwhereenamelike‘_A%’;selecttestYouquerythedatabasewiththiscommand:
SELECTename
FROMemp
WHEREenameLIKE‘_a%’;
Whichnamesaredisplayed?
A.namesstartingwith‘a’
B.namesstartingwith‘a’or‘A’
C.namescontaining‘a’asthesecondletter
D.namescontaining‘a’asanyletterexceptthefirstorderby按照单个列排序orderbycol降序和升序:orderbycoldesc(asc)按多个列排序orderbycol1desc(asc),col2desc(asc)orderbyselectename,salfromemporderbyename;selectename,salfromemporderbyempno;selectename,salfromemporderbyenameasc;selectename,salfromemporderbydeptnodesc;selectename,sal,deptnofromemporderbydeptnoasc,enamedesc;创建计算字段为什么需要计算字段?我们经常需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序中重新格式化。计算字段并不实际存在于数据库表Sql允许select子句中出现+,-,*,/以及列名和常数的表达式拼接字段(||,+)首选||(mysql中||表示or,一般用concat())Strings=“”,s1=null;S+s1创建计算字段selectename||’isa’||jobfromemp;selectename,sal,sal*12fromemp;selectename,sal,sal*12+500fromemp;selectename,sal,sal*(12+500)fromemp通用函数nvlSql中允许列值为空,空值用保留字NULL表示。NULL不同与0或者空格,它就是代表了一个不确定的内容。任何含有null值的数学表达式最后的结果都为空值selectename,sal,comm,(sal*12)+comm“income”fromemp;可以通过函数nvl将NULL转换成为一个“actualvalue”selectename,comm,nvl(comm,0)fromemp
selectename,sal,comm,(sal*12)+nvl(comm,0)“income”fromempSQL函数函数一般是在数据上执行的,它给数据的转换和处理提供了方便。只是将取出的数据进行处理,不会改变数据库中的值。函数输入arg1arg2argn函数执行任务输出结果两种SQL函数Sql函数可以分为组函数和单行函数。组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果,组函数仅可用于选择列表或查询的having子句单行函数对单个数值进行操作,并返回一个值。函数单行函数组函数单行函数的分类转换函数字符函数数字函数日期类型其他函数单行函数字符函数字符函数全以字符作为参数,返回值分为两类:一类返回字符值,一类返回数字值concat(string1,string2)连接两个字符串initcap(string)string中每个单词首字母大写Lower(string)以小写形式返回stringtrim()substr提取字符串的一部分substr(string,1,2)upper(string)以大写形式返回stringinstr字符串出现的位置,instr(string,’A‘)length字符串长度字符函数selectename,salfromempwherelower(ename)like‘__a%’;selectename,salfromempwhereupper(ename)like‘__A%’;selectsubstr(‘Hello’,1,3)fromdual;selectname,substr(ename,2)fromemp;selectename,length(ename)fromemp;selectename,instr(ename,‘a')fromemp;selectename,lpad(ename,'6')fromemp;数字函数数字函数以NUMBER类型为参数返回NUMBER值round(number,n)selectround(23.652)fromdual;selectround(23.652,2)fromdual;selectround(23.652,-1)fromdual;trunc(number,n)selecttrunc(23.652)fromdual;selecttrunc(23.652,2)fromdual;selecttrunc(23.652,-1)fromdual;mod(x,y)求余数selectmod(13,5)fromdual;ceil()上取整
selectceil(19.2)fromdual;floor()下取整
selectfloor(19.2)fromdual;日期和时间函数Oracle以内部数字格式存储日期:世纪,年,月,日,小时,分钟,秒sysdate/current_date
以date类型返回当前的日期Add_months(d,x)返回加上x月后的日期d的值LAST_DAY(d)返回的所在月份的最后一天Months_between(date1,date2)返回date1和date2之间月的数目日期和日期时间算术从日期中加或减一个数值,以得当一个日期结果值selectsysdate+2fromdual;selectsysdate-2fromdual;两个日期相减以便得到他们相差多少天selectename,round((sysdate-hiredate)/7)weeksfromempwheredeptno=10转换函数标量数据可以有类型的转换,转换分为两种,隐式类型转换和显示类型转换。隐式类型转换可用于:字符和数字的相互转换&字符和日期的相互转换VARCHAR2orchar--numberVARCHAR2orchar--datenumber--varchar2date--varchar2尽管数据类型之间可以进行隐式转换,仍建议使用显示转换函数,以保持良好的设计风格。转换函数to_charto_numberto_dateNUMBERCHARACTERTO_CHARTO_NUMBERDATETO_CHARTO_DATETO_CHAR函数操作日期TO_CHAR(date,'fmt')用于将日期或时间戳转换成varchar2类型字符串,如果指定了格式字符串,则用它控制结果的结果。格式控制串由格式元素构成。格式控制串必须用单引号括起来格式元素含义YYYY、YY代表四位、两位数字的年份MM用数字表示的月份MON月份的缩写、对中文月份来说就是全称DD数字表示的日DY星期的缩写,对中文的星期来说就是全称HH24,HH1212小时或者24小时进制下的时间MI分钟数SS秒数TO_CHAR函数操作日期Selectto_char(sysdate,'dd-mon-yyhh24:mi:ss')"RigthNow"fromdual;selectename,hiredate,to_char(hiredate,'yyyy/mm/dd')fromempselectsysdate,to_char(sysdate,'yyyy-mon-ddhh12:mi:ss')fromdual;TO_CHAR函数操作数字to_char(num,format)用于将Number类型参数转换为varchar2类型,如果指定了format,它会控制整个转换。控制符含义9代表一位数字,如果该位没有数字则不进行显示,但对于小数点后面的部分仍会强制显示0代表一位数字,如果该位没有数字则强制显示0$显示美元符号L显示本地货币符号.显示小数点,显示千分位符号TO_CHAR函数操作数字selectto_char(sal,‘$99,999.9999’)salaryfromempwhereename=‘ALLEN’;selectto_char(sal,‘$00,000.0000’)salaryfromempwhereename=‘ALLEN’;selectto_char(123456,'99,99,00')fromdual;to_number&to_dateto_date(String,format)将char或varchar2类型的string转换为date类型Select
to_date('04,05,19,10,23,40','yy,mm,dd,hh12,mi,ss')fromdual;selectto_date('2004-09-19','yyyy-mm-dd')fromdual;to_number(String,format)将char或varchar2类型的string转换为number类型selectto_number('$39343.783','$99990.000')fromdual;selectto_number('11.231','999.999')fromdual;单行函数嵌套单行函数可被嵌入到任何层嵌套函数从最深层到最低层求值F3(F2(F1(col,arg1),arg2),arg3)Step1=Result1Step2=Result2Step3=Result3单行函数嵌套显示没有上级管理的公司首脑selectename,nvl(to_char(mgr),’nomanager’)fromempwheremgrisnull;显示员工雇佣期满6个月后下一个星期五的日期Selectto_char(next_day(add_months(hiredate,6),’Friday’),’fmDay,Monthddth,YYYY’)“review”fromemporderbyhiredate;组函数组函数基于多行数据返回单个值EMP员工表中工资的最高值DEPTNOSAL------------------1024501050001013002080020110020300020300020297530160030285030125030950301500301250MAX(SAL)---------5000组函数avg()
返回某列的平均值min()返回某列的最小值max()返回某列的最大值sum()返回某列值的和count()返回某列的行数组函数仅在选择列表和Having子句中有效组函数在数字类型数据使用AVGandSUM函数selectsum(sal),avg(sal),max(sal),min(sal)fromemp;MINandMAX适用于任何数据类型selectmin(hiredate),max(hiredate)fromemp;组函数除了count(*)外,都跳过空值而处理非空值selectcount(*)fromemp;selectcount(comm)fromemp;selectcount(distinctdeptno)fromemp;在分组函数中使用NVL函数
selectavg(comm)fromemp;NVL函数迫使分组函数包括空值selectavg(nvl(comm,0))fromemp;数据分组创建分组groupby子句Groupby子句可以包含任意数目的列。除组函数语句外,select语句中的每个列都必须在groupby子句中给出。如果分组列中具有null值,则null将作为一个分组返回。如果列中有多行null值,他们将分为一组。Groupby子句必须出现在where子句之后,orderby子句之前。过滤分组(having子句)Where过滤行,having过滤分组。Having支持所有where操作符。分组和排序一般在使用groupby子句时,应该也给出orderby子句。数据分组SELECT column,group_functionFROM table[WHERE condition][GROUPBYgroup_by_expression][ORDERBYcolumn];使用GROUPBY子句将表分成小组结果集隐式按升序排列,如果需要改变排序方式可以使用Orderby子句数据分组出现在SELECT列表中的字段,如果出现的位置不是在组函数中,那么必须出现在GROUPBY子句中selectdeptno,avg(sal)fromempgroupbydeptnoGROUPBY列可以不在SELECT列表中selectavg(sal)fromempgroupbydeptno不能在WHERE子句中使用组函数.不能在WHERE子句中限制组.使用Having对分组进行限制selectavg(sal)fromempgroupbydeptnohavingavg(sal)>1000;Select子句顺序子句说明是否必须使用select要返回的列或表达式是from从中检索数据的表仅在从表选择数据时使用where行级过滤否groupby分组说明仅在按组计算聚集时使用Having组级过滤否orderby输出排序顺序否Select子句顺序Sql语句执行过程:读取from子句中的基本表、视图的数据,[执行笛卡尔积操作]。选取满足where子句中给出的条件表达式的元组按group子句中指定列的值分组,同时提取满足Having子句中组条件表达式的那些组按select子句中给出的列名或列表达式求值输出Orderby子句对输出的目标表进行排序。例子selectmax(sal)fromempgroupbydeptno;selectmax(sal),deptno,job fromemp groupbydeptno,job;selectavg(sal)fromemp wheresal>1200 groupbydeptno havingavg(sal)>1500 orderbyavg(sal);多表查询EMPLOYEES
DEPARTMENTS……sql:1992语法的连接语法规则:
SELECT table1.column,table2.column FROM table1,table2 WHERE table1.column1=table2.column2;在WHERE子句中写入连接条件当多个表中有重名列时,必须在列的名字前加上表名作为前缀连接的类型:等值连接–Equijoin非等值连接--Non-equijoin外连接--Outerjoin自连接--Selfjoin笛卡尔积selectcount(*)fromempselectcount(*)fromdeptselectemp.empno,dept.loc fromemp,dept检索出的行的数目将是第一个表中的行数乘以第二个表中的行数检索出的列的数目将是第一个表中的列数加上第二个表中的列数应该保证所有联结都有where子句,不然数据库返回比想要的数据多得多的数据
等值连接EMPLOYEES
DEPARTMENTSForeignkey外键Primarykey主键……等值连接使用AND操作符增加查询条件EMPLOYEES
DEPARTMENTS
……等值连接selectemp.empno,emp.ename,dept.deptno,dept.loc fromemp,dept whereemp.deptno=dept.deptno andemp.deptno=10selectemp.empno,emp.ename,dept.deptno,dept.loc fromemp,dept whereemp.deptno=dept.deptno andename='JAMES'连接中使用表的别名使用表的别名简化了查询selecte.empno,e.ename,e.deptno,d.deptno,d.loc fromempe,deptd wheree.deptno=d.deptno多于两个表的连接为了连接n个表,至少需要n-1个连接条件。EMPLOYEES
LOCATIONS
DEPARTMENTS
…多于两个表的连接createtablemanager as select*fromemp;Manager,emp,deptselecte.empno,e.ename,m.ename,d.loc fromempe,managerm,deptd wheree.mgr=m.empno ande.deptno=d.deptno ande.job=‘ANALYST’非等值连接select* fromemp,salgrade wheresalbetweenlosalandhisal外连接empDEPt没有雇员属于40,50部门Dept.deptno=emp.deptno外连接为了在操作时能保持这些将被舍弃的元组,提出了外连接的概念,使用外连接可以看到不满足连接条件的记录外连接运算符是(+)有左外连接和右外连接左外连接显示左边表的全部行SELECT table.column,table.column FROM table1,table2 WHERE table1.column=table2.column(+);右外连接显示右边表的全部行SELECT table.column,table.column FROM table1,table2 WHERE table1.column(+)=table2.column;外连接selecte.ename,d.deptno,d.dname fromempe,deptd whered.deptno=e.deptno(+);selecte.ename,d.deptno,d.dname fromempe,deptd wheree.deptno(+)=d.deptno;自连接查找每个员工的上级主管selectworker.ename||’worksfor‘||manager.enamefromempworker,empmanagerwhereworker.mgr=manager.empnosql:1999语法的连接sql1992的语法规则暴露了这样的缺点:语句过滤条件和表连接的条件都放到了where子句中。当条件过多时,联结条件多,过滤条件多时,就容易造成混淆。SQL1999修正了整个缺点,把联结条件,过滤条件分开来,包括以下新的TABLEJOIN的句法结构:CROSS
JOINNATURALJOINUSING子句ON子句LEFTOUTERJOINRIGHTOUTERJOINFULLOUTERJOIN交叉连接CROSSJOIN产生了一个笛卡尔积,就象是在连接两个表格时忘记加入一个WHERE子句一样
selectemp.empno,emp.ename,emp.deptno,dept.loc
fromemp,dept;可以使用CROSSJOIN来达到相同的结果
selectemp.empno,emp.ename,emp.deptno,dept.loc
fromempcrossjoindept;自然连接NATURALJOIN子句基于两个表中列名完全相同的列产生连接两个表有相同名字的列数据类型相同从两个表中选出连接列的值相等的所有行select*fromempnaturaljoindeptWheredeptno=10;自然连接的结果不保留重复的属性using创建连接selecte.ename,e.ename,e.sal,deptno,d.loc fromempejoindeptdusing(deptno) wheredeptno=20using子句引用的列在sql任何地方不能使用表名或者别名做前缀,同样适合natural子句使用on创建连接自然连接的条件是基于表中所有同名列的等值连接为了设置任意的连接条件或者指定连接的列,需要使用ON子句连接条件与其它的查询条件分开书写使用ON子句使查询语句更容易理解selectename,dname fromempjoindeptonemp.deptno=dept.deptno whereemp.deptno=30;使用on创建连接三表连接检索雇员名字、所在单位、薪水等级:这三个信息在三个表里面,所以只能用多表联结
selectename,dname,grade fromemp joindeptonemp.deptno=dept.deptno joinsalgradeonemp.salbetweensalgrade.losalandsalgrade.hisal;左外连接在LEFTOUTERJOIN中,会返回所有左边表中的行,即使在右边的表中没有可对应的列值。selecte.ename,d.deptno,d.dname fromdeptd leftouterjoinempe one.deptno=d.deptnoselecte.ename,d.deptno,d.dname fromempe,deptd whered.deptno=e.deptno(+);右外连接RIGHTOUTERJOIN中会返回所有右边表中的行,即使在左边的表中没有可对应的列值。selecte.ename,d.deptno,d.dname fromempe rightouterjoindeptd one.deptno=d.deptnoselecte.ename,d.deptno,d.dname fromempe,deptd wheree.deptno(+)=d.deptno;子查询SQL允许多层嵌套。子查询,即嵌套在其他查询中的查询。SELECT select_list FROM table WHERE exproperator (SELECT select_list FROM table);理解子查询的关键在于把子查询当作一张表来看待。外层的语句可以把内嵌的子查询返回的结果当成一张表使用。子查询要用括号括起来将子查询放在比较运算符的右边(增强可读性)子查询的种类按照子查询返回的记录数,子查询可以分为单行子查询和多行子查询单行子查询主查询子查询
返回CLERK多行子查询CLERKMANAGER主查询子查询
返回单行子查询子查询返回一行记录使用单行记录比较运算符Operator=>>= <<= <>MeaningEqualtoGreaterthanGreaterthanorequaltoLessthanLessthanorequaltoNotequalto单行子查询我们要查询有哪些人的薪水是在整个雇员的平均薪水之上的:首先求所有雇员的平均薪水
selectavg(sal+nvl(comm,0))fromemp
然后求:
selectename,empno,sal,sal+nvl(comm,0) fromemp wheresal+nvl(comm,0)>(selectavg(sal+nvl(comm,0))fromemp);此处嵌套的子查询在外层查询处理之前执行多行子查询子查询返回多行行记录使用集合比较运算符运算符
INsome
ALL含义等于列表中的任何值将值与子查询返回的任意一个值进行比较比较子查询返回的每一个值在多行子查询中使用in我们要查在雇员中有哪些人是经理人,也就是说,有哪些人的empno号在mgr这个字段中出现过,这个时候,应当首先查询mgr中有哪些号码,然后再看看有哪些人的雇员号码在此出现:
selectempno,ename fromemp whereempnoin( selectdistinctmgrfromemp);在多行子查询中使用someall找出部门编号为20的所有员工中收入最高的职员
select*fromemp wheresal>=all( selectsal fromemp wheredeptno=20) anddeptno=20在From子句中使用子查询我们要求每个部门平均薪水的等级,可以这样考虑,首先将每个部门的平均薪水求出来,然后把结果当成一张表,再用这张结果表和salgrade表做连接,以此求得薪水等级。先求出每个部门平均薪水的表t。将t和salgrade进行关联查询就可以了。
select*from salgrades,(selectdeptno,avg(sal)avg_sal fromempgroupbydeptno)t wheret.avg_salbetweens.losalands.hisal;SQL数据更新Sql的数据更新包括数据插入、删除和修改3个操作.往表中插入数据的语句是insert语句,方式有两种,一种是元组值的插入,一种是查询结果的插入元组值的插入语法如下:INSERTINTO table[(column[,column...])]VALUES (value[,value...]);一次插入操作只插入一行Insert语句insertintoemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values(1111,'gao','clerk',7902,sysdate,10000,3000,40)此处插入的元组中列的个数、顺序与emp的结构完全一致,因此表名之后的列名可以省略不写insertintoemp values(2222,'gaohs','clerk',7902,sysdate,10000,3000,40)可以只插入部分列insertintoemp(empno,ename) values(3333,'xiaozhang')但要求省略的列必须满足下面的条件:该列定义为允许Null值。在表定义中给出默认值,这表示如果不给出值,将使用默认值。如果不符合上面两个条件,将会报错。不能成功插入。Insert语句可以用insert语句把一个select语句的查询结果插入到一个基本表中,语法如下:Insertintotablename(column,..)select*fromtablename2创建一个临时表
createtabletemp as select*fromemp where1=2执行插入
insertintossselect*fromemp;DELETE语句SQL的删除操作是指从基本表中删除元组,语法如下:
DELETE[FROM] table [WHERE condition];其语义是从基本表中删除满足条件表达式的元组Deletefromtable表示从表中删除一切元组如果想从表中删除所有的行,不要使用delete,可使用truncatetable
语句,完成相同的工作,但是速度更快。UPDATE语句Update语句用于修改基本表中元组的某些列,其语法如下:UPDATE tableSET column=value[,column=value]…[WHERE condition];其语义是:修改基本表中满足条件表达式的那些元组的列值,需修改的列值在set子句中指出。事务处理事务(Transaction)是一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。事务是为了保证数据库的完整性事务不能嵌套在oracle中,没有事务开始的语句。一个Transaction起始于一条DML(Insert、Update和Delete)语句,结束于以下的几种情况:用户显式执行Commit语句提交操作或Rollback语句回退。当执行DDL(Create、Alter、Drop)语句事务自动提交。用户正常断开连接时,Transaction自动提交。系统崩溃或断电时事务自动回退。Commit&RollbackCommit表示事务成功地结束,此时告诉系统,数据库要进入一个新的正确状态,该事务对数据库的所有更新都以交付实施。每个Commit语句都可以看成是一个事务成功的结束,同时也是另一个事务的开始。Rollback表示事务不成功的结束,此时告诉系统,已发生错误,数据库可能处在不正确的状态,该事务对数据库的更新必须被撤销,数据库应恢复该事务到初始状态。每个Rollback语句同时也是另一个事务的开始。一旦执行了commit语句,将目前对数据库的操作提交给数据库(实际写入DB),以后就不能用rollback进行撤销。执行一个DDL,dcl语句或从SQL*Plus正常退出,都会自动执行commit命令。提交或回滚前数据的状态以前的数据可恢复当前的用户可以看到DML操作的结果其他用户不能看到DML操作的结果被操作的数据被锁住,其他用户不能修改这些数据提交后数据的状态数据的修改被永久写在数据库中.数据以前的状态永久性丢失.所有的用户都能看到操作后的结果.记录锁被释放,其他用户可操作这些记录.回滚后数据的状态语句将放弃所有的数据修改修改的数据被回退.恢复数据以前的状态.行级锁被释放.数据库的对象对象名称 描述表 基本的数据存储对象,以行和列的形式存在,列 也就是字段,行也就是记录约束 执行数据校验,保证了数据完整性的视图 一个或者多个表数据的逻辑显示索引 用于提高查询的性能Sequence数据库对象的命名规则必须以字母开头可包括数字和三个特殊字符(#_$)不要使用oracle的保留字同一用户下的对象不能同名ORACLE常用数据类型数据类型含义Varchar2(n)变长字符串,存储空间等与实际空间的数据大小,最大为4K,长度以字节为单位指定(注意中文字符)Char(n)定长字符串,存储空间大小固定Long变长字符串,最大字节数达到2GBNumber(p,s)整数或小数,p是精度(所有数字位的个数,最大38),s是刻度范围(小数点右边的数字位个数)Date年、月、日、时、分、秒Long变长字符串,最大字节数达到2GB表的创建标准的建表语法:
CREATETABLE[schema.]table (column
datatype[DEFAULTexpr],… );在创建新表时,指定的表名必须不存在,否则将出错。使用默认值:当插入行时如果不给出值,dbms将自动采用默认值。在用Create语句创建基本表时,最初只是一个空的框架,用户可以使用insert命令把数据插入表中。表的创建设计要求:建立一张用来存储学生信息的表,表中的字段包含了学生的学号、姓名、年龄、入学日期、年级、班级、email等信息,并且为grade指定了默认值为1,如果在插入数据时不指定grade得值,就代表是一年级的学生createtablestu ( idnumber(6), namevarchar2(20)notnullunique, sexnumber(1)notnull, agenumber(3), sdatedate, gradenumber(2)default1, classnumber(4), emailvarchar2(50) );表的创建使用子查询创建表的语法
CREATETABLEtable[column(,column...)] ASsubquery;新表的字段列表必须与子查询中的字段列表匹配字段列表可以省略createtableemp2asselect*fromemp;表结构的修改在基本表建立并使用一段时间后,可以根据实际需要对基本表的结构进行修改增加新的列用“altertable…add…”语句
altertableempaddaddressvarchar(20)
新增加的类不能定义为“notnull”,基本表在增加一列后,原有元组在新增加的列上的值都定义为空值。删除原有的列用“altertable…drop…”语句,语法格式:altertable表名dropcolumn列名
altertableempdropcolumnaddress修改字段“altertable...modify...” altertableempmodify(jobvarchar(50))表结构的修改在基本表不需要时,可以使用“droptable”语句撤消。在一个基本表撤消后,所有的数据都丢弃。所有相关的索引被删除
droptableempcascadeconstraints可以使用RENAME语句改变表名(视图),要求必须是表(视图)的所有者RENAMEold_nameTOnew_name约束constraint当我们创建表的时候,同时可以指定所插入数据的一些规则,比如说某个字段不能为空值,某个字段的值(比如年龄)不能小于零等等,这些规则称为约束。约束是在表上强制执行的数据校验规则.Oracle支持下面五类完整性约束:NOTNULL 非空UNIQUEKey 唯一键PRIMARYKEY 主键FOREIGNKEY 外键CHECK 自定义检查约束约束constraintOracle使用SYS_Cn格式命名约束,也可以由用户命名创建约束的时机在建表的同时创建建表后创建约束从作用上分类,可以分成两大类:表级约束:可以约束表中的任意一列或多列。可以定义出了NotNull以外的任何约束。列级约束:只能约束其所在的某一列。可以定义任何约束。
主键约束(PRIMARYKEY)主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。主键从功能上看相当于非空且唯一一个表中只允许一个主键主键是表中能够唯一确定一个行数据的字段主键字段可以是单字段或者是多字段的组合Oracle为主键创建对应的唯一性索引主键约束主键可用下列两种形式之一定义主键子句 在表的定义中加上如下子句primarykey(列)主键短语 在主属性的定义之后加上primarykey字样。上述形式Oracle会自动命名约束,可自己给约束起名createtablet3( idnumber(4), constraintt3_pkprimarykey(id) )非空约束(NOTNULL)确保字段值不允许为空只能在字段级定义
CREATETABLEemployees( employee_idNUMBER(6), nameVARCHAR2(25)NOTNULL, salaryNUMBER(8,2), hire_dateDATECONSTRAINTemp_hire_date_nnNOTNULL )唯一性约束(UNIQUE)唯一性约束条件确保所在的字段或者字段组合不出现重复值唯一性约束条件的字段允许出现空值Oracle将为唯一性约束条件创建对应的唯一性索引
CREATETABLEemployees( idNUMBER(6), nameVARCHAR2(25)NOTNULLUNIQUE, emailVARCHAR2(25), salaryNUMBER(8,2), hire_dateDATENOTNULL, CONSTRAINTemp_email_ukUNIQUE(email) );CHECK约束Check约束用于对一个属性的值加以限制在check中定义检查的条件表达式,数据需要符合设置的条件createtableemp3( idnumber(4)primarykey, agenumber(2)check(age>0andage<100), salarynumber(7,2), sexchar(1), constraintsalary_checkcheck(salary>0))在这种约束下,插入记录或修改记录时,系统要测试新的记录的值是否满足条件关系模型的三类完整性规则为了维护数据库中的数据与现实世界的一致性,关系数据库的数据与更新操作必须遵循下列三类完整性规则:实体完整性规则 这条规则要求关系中在组成主键的属性上不能有空值。参照完整性规则 这条规则要求“不引用不存在的实体”。例如:deptno是dept表的主键,而相应的属性也在表emp中出现,此时deptno是表emp的外键。在emp表中,deptno的取值要么为空,要么等于dept中的某个主键值。用户定义的完整性规则 用户定义的完整性规则反应了某一具体的应用涉及的数据必须满足的语义要求。外键约束(FOREIGNKEY)外键是表中的一个列,其值必须在另一表的主键中列出。作为主键的表称为“主表”,作为外键的关系称为“依赖表”外键参照的是主表的主键或者唯一键对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列3种做法:RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除SETNULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值FOREIGNKEY(DEPTNO)REFERENCESDEPT(DEPTNO)[ONDELETE[CASCADE|SETNULL]]如省略on短语,缺省为第一中处理方式。约束的添加和撤销可增加或删除约束,但不能直接修改
altertabletablename
增加
addconstraintcon_nameunique(col)
删除
dropconstraintcom_name[cascade]查询constraintselectconstraint_name,constraint_type fromuser_constraints wheretable_name=‘aaa’
或者whereowner=‘SCOTT’大写selectconstraint_name,column_namefromuser_cons_columns whertable_name=‘TABLENAME’VIEW定义:视图是从若干基本表和(或)其他视图构造出来的表。在创建一个视图时,只是存放的视图的定义,也即是动态检索数据的查询语句,而并不存放视图对应的数据,在用户使用视图时才去求相对应的数据。所以视图被称作“虚表”视图的作用:可以限制对数据的访问,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。可以使复杂的查询变的简单。在编写查询后,可以方便地重用它而不必知道他的基本查询细节。提供了对相同数据的不同显示创建视图在CREATEVIEW语句后加入子查询.CREATE[ORREPLACE]VIEWview[(alias[,alias]...)]ASsubquery[WITHREADONLY];createorreplaceviewv$_emp_dept asselectemp.deptno,ename,dnamefromempjoindeptonemp.deptno=dept.deptnowithreadonly视图在查询时,不需要再写完全的Select查询语句,只需要简单的写上从视图中查询的语句就可以了select*fromv$_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运动会观后感范文15篇
- 二年级数学口算题
- 一年级50以内加减法口算练习题
- 人教辽宁 九年级 下册 语文 第三单元《 词四首》习题课 课件
- 人教陕西 九年级 下册 语文 第三单元《 单元写作》习题课 课件
- 财务管理招聘
- 透析室上半年工作总结
- 新中式洋房居住区工程规划设计方案
- 东坑酒店蔬菜配送合同范例
- 军队聘用合同范例
- 2025届小米全球校园招聘启动(即将笔试)笔试参考题库附带答案详解
- 胆管癌手术护理
- 中小学生校服安全
- 2025 年小学劳动技术新课程标准(2022 版)标准试题
- 2023年宁夏回族自治区中考地理真题(原卷版)
- 2025年安全员C证考试题库及答案-
- 2025年全球及中国电子雷管芯片模组行业头部企业市场占有率及排名调研报告
- 2024年江西建设职业技术学院高职单招职业技能测验历年参考题库(频考版)含答案解析
- 小肠扭转病人护理查房
- 第二十届中央纪律检查委员会第四次全体会议公报学习解读
- 2025年国家财政部部属单位招聘47人历年高频重点提升(共500题)附带答案详解
评论
0/150
提交评论