什么是数据库?•数据库是管理数据的一种方法,•如何组织和存储数据,•如何高效地获取和处理数据。数据管理的发展的3个阶段•人工管理阶段–无数据管理的专用软件,数据和程序在一起•文件系统阶段–软件进行数据管理,程序和数据分离–数据冗余度大,数据和程序缺乏独立性–文件之间不能建立联系•数据库系统阶段–数据具有更高的独立性–数据库管理系统-DBMS:数据库的定义、操作和管理关系型数据库•关系型数据库支持关系模型,以关系(表)形式组织数据。•著名的关系型数据库DB2,ORACLE,INFORMIX,SYBASE等。•关系型数据库=Datafile+RDBMSRDBMSOSDBdatafile1datafile2实验环境•%telnet200.1.1.115•用户名/口令:oracle8/oracle8•%sqlplusscott/tiger•sqlconnectscott/tiger•sqlshowuser•sqlquit表•表---关系型DB数据组织的形式•报道表–空表--表的结构–白纸--设计一张表--多少项内容(列)--画表时,每项多宽–列---字段;列类型(宽、类型)---数据类型(长度、类型)–行---记录–表=列+行-------字段+记录姓名编号单位性别表看scott用户有哪些表然后查看其中一个表的结构和内容#sqlplusscott/tigersqlselecttable_namefromtabs;(user_tables)sqldescemp;sqlselect*fromemp;表•表结构(DDL)•createtable•altertable•droptable•truncatetable•表内容(DML)•insert•update•delete•desctable_name•selectfield_namefromtable_name基本数据类型CHAR[(n)]n=255VARCHAR2(n)n=2000LONG(n)n=2G•NUMBER[(m[,n])]m精度(1-38)n小数后位数•RAW(n)二进制数据n=2000•LONGRAW(n)n=2GDATE缺省形式‘DD-MON-YY’ROWID内部数据类型(数据库序号.行序号.数据文件号)NULL字符串用单引号括起来可以存储声音、图片日期型数据的格式说明•Days–ddnumber12–dyabbreviatedfri–dayspelledoutFriday–ddspthspelledout,ordinaltwelfth•Month–mmnumber03–monabbreviatedmar–monthspelledoutmarch•Year–yyyear87–yyyyyearandcentury1987日期型数据的格式说明•缺省日期型:dd-mon-yyselectsysdatefromdual;系统:date,time•改变日期形式:•1.本次会话SQLALTERSESSIONSETNLS_DATE_FORMAT='YY-MM-DD';•2.下次启动后永久生效----改文件设置INITSID.ORA中的NLS_DATE_FORMAT参数可改变缺省日期的格式。表结构•1.建立sqlcreatetabletable_name(column_name1datatype[notnull|unique],column_name2datatype[notnull|unique],column_name2datatype[notnull|unique]);表内容•1.插入记录sqlinsertintotable_name[column_name-a,…,column_name-x]values(column_value-a,…,column_value-x);表结构•2.变更1修改sqlaltertabletable_namemodify(column_namedatatype);2增加sqlaltertabletable_nameadd(column_namedatatype);表内容•2.修改记录sqlupdatetable_namesetcolumn_name1=values1,column_name2=values2[wheresearch_conditions];表内容•3.删除记录sqldelete[from]table_name[wheresearch_conditions];sqltruncatetabletable_name;表结构•3.删除1删结构及内容sqldroptabletable_name;事物处理•事物处理命令提交:commit回滚:rollback保留点:savepoint•SQLSAVEPOINTCLARK_SAL;•SQLROLLBACKTOSAVEPOINTBLAKE_SAL;2.命令修改a当前行末追加c/old/new更改clbuff清缓存del删除(n,last,mn)i加入(i,itext)savefilename保存edit、vifilename编辑startfilename@filename3.保存命令4.执行命令1.显示命令l显示(l,ln,lmn,llast)SQL*PLUS练习•建表•注意利用SQL命令缓冲区•插入、修改、删除数据(注意条件)•提交、回滚练习•表名txl-n•结构:学号数字型3唯一姓名可变长字符串10非空出生日期型电话数字型10•查看结构、查看内容练习•1.增加字段单位可变长字符串12•2.修改字段出生可变长字符串5(原日期)练习•插入数据至少5条•修改数据(根据条件)•删除数据(根据条件)SQL语句中的函数•字符函数–substr、length、lower、rtrim、ltrim•数值函数–abs、mod、round、trunc、nvl•日期函数–months_between、add_months、next_day•转换函数–to_char、to_date数据查询语言(DML)命令•SELECT语句SELECT查询内容FROM表名WHERE条件GROUP分组内容HAVING组内条件ORDERBY排序内容简单查询•无条件查询•条件查询•排序•统计•分组统计分组函数(统计函数)•完成对一组记录的统计处理–count({*|[distinct|all]x}):行数–sum(x):数据列求和–avg([distinct|all]x):数据列平均值–max(x):列的最大值–min(x):列的最小值除count(*)外,当使用分组函数时,均忽略空值分组函数(统计函数)•练习1工资的平均值2奖金的最大值3工资的总和4最低工资5表中数据行的总数6有多少个不同的部门分组查询与排序•数据分组:对有重复值的列进行分组。•查询:SELECTcol1,col2,分组函数FROMtable1WHEREconditionsGROUPBYcol1,col2HAVINGconditionORDERBYcol1,col2SELECT选择的列,必须出现在GROUPBY子句中;GROUPBY子句中的列只能是SELECT选择的列或分组函数中的列。顺序无关。分组查询练习:1)编写SQL语句,从EMP表中返回---部门编号、部门平均工资。2)编写SQL语句,从EMP表中返回----部门编号、部门工资总和条件是:部门工资总和大于8000。3)编写SQL语句,从EMP表中返回----部门编号、部门平均工资条件是:除了部门10,部门工资平均值大于1500的部门的情况。多表查询---连接•等值连接•非等值连接--------------------•自连接•外连接selectename,dnamefromempe,deptdwheree.deptno=d.deptno等值连接(EQUIJOIN)•基于列的相等性来连接两张或多张表。题目:查找雇员姓名及所在部门的名称.MGRJOBENAMEEMPNOSALHIREDATECOMMDEPTNODEPTNODNAMELOCemp表emp表dept表dept表非等值连接(NON-EQUIJOIN)•基于列的不等性来连接两张或多张表。题目:请查找雇员SMITH的工资和工资等级情况,希望显示的信息---员工名、工资、工资等级.MGRJOBENAMEEMPNOSALHIREDATECOMMDEPTNODEPTNODNAMELOCGRADELOSALHISALemp表emp表salgrad表salgrad表dept表dept表非等值连接(NON-EQUIJOIN)请分析下列语句:SELECTENAME,SAL,GRADEFROMEMP,SALGRADWHEREENAME=‘SMITH’;SELECT*FROMSALGRAD;SELECTENAME,SAL,GRADEFROMEMP,SALGRADWHEREENAME=‘SMITH’ANDSALBETWEENLOSALANDHISAL等值连接和非等值连接题目:查找工资级别为2的雇员的信息。要求显示的信息:雇员的姓名,部门的名称,工资、工资级别MGRJOBENAMEEMPNOSALHIREDATECOMMDEPTNODEPTNODNAMELOCGRADELOSALHISALemp表emp表salgrad表salgrad表dept表dept表SELECTENAME,DNAME,SAL,GRADEFROMEMP,DEPT,SALGRADEWHEREGRADE=2ANDSALBETWEENLOSALANDHISALANDEMP.DEPTNO=DEPT.DEPTNO;自我连接(SELFJOIN)•将表连接到自身–在SQL语句中一个表暂时重新命名为两个表。题目:EMP中查找员工和其经理的对应关系:要求-员工名称和其经理的名称同一基表的不同行做联接,如同两个独立的基表,在FROM子句中至少要为一个基表起别名,以区别联接条件中的列名自连接(SELFJOIN)MGREMPNO60100601015060....305030EMPNO10010160....5030EMP(WORKER)EMP(MANAGER)ENAMExhlxqwjAAAKINGENAMExhlxqwjAAAKINGSELECTWORKER.ENAME,MANAGER.ENAMEMANAGERFROMEMPWORKER,EMPMANAGERWHEREWORKER.MGR=MANAGER.EMPNO;外连接(OUTERJOIN)MGREMPNO60100601015060....305030EMPNO10010160....5030EMP(WORKER)EMP(MANAGER)ENAMExhlxqwjAAAKINGENAMExhlxqwjAAAKING需增加一条空记录与WORKER表的相应记录进行匹配•用于返回存在在一张表上的所有数据行,甚至相对应的行在连接的表中不存在。•(+)号用于在查询中的OUTERJOIN。•带(+)的表是那些没有相应行的表。外连接(OUTERJOIN)题目1:EMP中查找员工和其经理的对应关系:要求-员工名称和其经理的名称,请注意使用外连接及(+)放置位置。SELECTWORKER.ENAME,MANAGER.ENAMEMANAGERFROMEMPWORKER,EMPMANAGERWHEREWORKER.MGR=MANAGER.EMPNO(+);外连接(OUTERJOIN)题目2:查找哪些部门有叫SMITH的人显示:雇员名称、部门名称(所有部门都要列出来)ENAMEDNAME------------------------ACCOUNTINGSMITHRESEARCHSALESOPERATIONSMGRJOBENAMEEMPNOSALHIREDATECOMMDEPTNODEPTNODNAMELOCemp表emp表dept表dept表SELECTENAME,DNAMEFROM