SQL入门教程内容数据库的相关概念实用SQL语言关系模型由实体和联系构成,即通常所说的E-R图。实体通常以表的形式表现,表的每一行描述实体的一个实例,表的每一列描述实体的一个特征或属性。联系指实体间的对应关系,联系分为三种:一对一的联系一对多的联系多对一的联系关系模型一对一的联系。如:一个人只有一种性别,一个人→性别为一对一的联系;一对多的联系。如:相同性别的人有许多个,性别→人为一对多的联系;多对一的联系。如:很多人有同一个性别,人→性别为多对一的联系。通过联系就可以用一个实体的信息来查找另一个实体的信息。关系数据库基于关系模型的数据库。关系数据库中的数据结构是关系,关系是指由行与列构成的二维表。在关系模型中,实体和实体间的联系都是用关系表示的。关系不但可以表示实体间一对多的联系,通过建立关系间的关联,也可以表示多对多的联系。主关键字(PrimaryKey)主关键字是被挑选出来,作表的行的惟一标识的侯选关键字。一个表通常只有一个主关键字。主关键字又可以称为主键。外关键字(ForeignKey)外关键字表示了两个关系之间的联系。以另一个关系的外关键字作主关键字的表被称为主表,具有此外关键字的表被称为主表的从表。外关键字又称作外键。外键的选择体现了表(实体)之间的联系。表(Table)数据库中主要的对象。指关系数据库系统的二维表,也即关系。一般来说,关系数据库表的结构包含三个基本组成元素:字段名、数据类型和长度。表(Table)CREATETABLEEmployee(Employee_Idvarchar(20),Employee_Namevarchar(50),Employee_Departvarchar(100),Job_Idvarchar(20),Employee_Salarydecimal(18,2))索引(Index)和视图(View)索引(Index):是根据指定的数据库表列建立起来的顺序,它提供了快速访问数据的途径。视图(View):视图看上去同表似乎一模一样,具有一组命名的、不重复的字段和数据项,但它其实是一个虚拟的表,在数据库中并不实际存在。它是数据库预编译好的一段查询语句。存储过程(Procedure)存储过程是为完成特定的功能而汇集在一起的一组SQL程序语句,经编译后存储在数据库中的SQL程序。CREATEPROCEDUREP_GET_EMPLOYEE_INFO_BY_ID(@employee_idINT)ASBEGINSELECT*FROMEmployeeWHEREEmployee_Id=@employee_idENDGO函数(Function)与存储过程相比,函数必须具有返回值,并且使用的SQL语句也有诸多限制--创建函数(返回varchar类型的值)createfunctiontest(@Numvarchar(20))--@Num参数returnsvarchar(50)--返回值类型asbegindeclare@MSGvarchar(20)if(@Num=1)select@MSG='正确'elseselect@MSG='错误'return@MSGend--调用函数selectdbo.test(2)--传递参数2返回结果:错误聚合函数COUNTSELECTCOUNT(*)FROMEmployeeWHEREJob_Id=‘0001’SUMAVGMAXMIN简单的SELECT简单的SELECT语句的语法如下:SELECT[DISTINCT]目标表达式[,目标表达式]...FROM表或视图名[,表或视图名]...[WHERE条件表达式][GROUPBY列名1[HAVING条件表达式]][ORDERBY列名2[ASC|DESC]]Select*fromemployeewherefname='Paolo'使用函数Selectconvert(char(10),getdate(),121);Selectupper(lname)fromemployeewherefname='Paolo';SelectdateDiff(DAY,’2008-12-12’,’2008-12-25’)判断分支selectcasewhenfname='Anabela'then'1'whenfname='Ann'then'2'else'name'endfromemployeeorderbyfnameselect嵌套Select*fromemployeewherejob_idin(selectjob_idfromjobswheremin_lvlbetween0and10)表合并(union)select'1'xunionallselect'1'看看这个结果:select'1'xunionallselect'1'unionselect'1'别名定义Selectupper(lname)Unamefromemployeeawherefname='Paolo';表连接(多表查询)select*fromemployeea,jobsbwherea.job_id=b.job_id以a表为主表:select*fromemployeea,jobsbwherea.job_id*=b.job_id以b表为主表:select*fromemployeea,jobsbwherea.job_id=*b.job_idOracle的写法是不同的:以a表为主表:select*fromemployeea,jobsbwherea.job_id=b.job_id(+)以b表为主表:select*fromemployeea,jobsbwherea.job_id(+)=b.job_id通用的写法:select*fromemployeeainnerjoinjobsbona.job_id=b.job_idselect*fromemployeealeftjoinjobsbona.job_id=b.job_idselect*fromemployeearightjoinjobsbona.job_id=b.job_idIn条件转换成existsSelect*fromemployeeawherea.job_idin(selectjob_idfromjobsbwhereb.min_lvlbetween20and100)Select*fromemployeeawhereexists(selectjob_idfromjobsbwherea.job_id=b.job_idandb.min_lvlbetween20and100)简单的update语句UPDATEStudentSETStudent_Name=‘保罗’WHEREStudent_Id=‘0001’表联合更新UpdateBsetB.字段=A.字段fromA,BwhereB.条件字段=A.条件字段insert语句insertintojobs(job_desc,min_lvl,max_lvl)values('lh',99,99);不推荐下面的写法:insertintojobsvalues('lh',99,99);在sqlserver中,IDENTITY类型的数据字段不能应用于insertdelete语句删除单行:DELETEFROMStudentWHEREStudent_Id=‘0001’删除多行:DELETEFROMemployeeawherea.job_idin(selectjob_idfromjobsbwhereb.min_lvlbetween20and100)