您好,欢迎访问三七文档
SQLServer中常用的SQL语句1、概述2、查询概述3、单表查询4、连接查询5、带有exists的相关子查询6、SQL的集合操作7、插入操作8、删除操作9、修改操作10、数据定义11、视图1、概述名词笛卡尔积、主键、外键数据完整性实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空参照完整性:表中的外键取值为空或参照表中的主键用户定义完整性:取值范围或非空限制,例如:性别(男女),年龄(0-130)表连接自然连接:与等值连接(a.id=b.id)相比,连接后的表只有一列id,而不是两列(a.id和b.id)。半连接:与等值连接(a.id=b.id)相比,连接后的表只有A表的列,被B表“多次匹配”列会显示为一行。左外连接:leftjoin右外连接:rightjoin全外连接:fulljoin全内连接:innerjoinSQL语言的构成DDL语言:数据定义,定义基本表、视图、索引;DML语言:数据操纵,查询、增加、修改、删除DCL语言:权限2、查询概述查询包括:单表查询、连接查询、带有exists的相关子查询、集合操作四中。select...from常用语句执行过程select…⑤投影from…①table→内存where…②选取元组group…③分组having…④选择分组[{union|…}⑥查徇结果的集合运算select…]①~⑤orderby…⑦排序输出3、单表查询groupby只有出现在groupby子句中的属性,才可出现在select子句中。用orderby子句对查询结果按照一个或多个列的值进行升/降排列输出,升序为ASC;降序为desc,空值将作为最大值排序having与where的区别where决定哪些元组被选择参加运算,作用于关系中的元组having决定哪些分组符合要求,作用于分组4、连接查询连接查询包括:多表连接查询、单表连接查询(自连接)、外连接查询、嵌套查询4种连接条件一[表名1.]列名1比较运算符[表名2.]列名2连接条件二[表名1.]列名1between[表名2.]列名2and[表名2.]列名3连接条件中的列名称为连接字段,对应的连接字段应是可比的。执行过程:采用表扫描的方法,在表1中找到第一个元组,然后从头开始扫描表2,查找到满足条件的元组即进行串接并存入结果表中;再继续扫描表2,依次类推,直到表2末尾。再从表1中取第二个元组,重复上述的操作,直到表1中的元组全部处理完毕。4.1单表连接(自连接)用表别名把一个表定义为两个不同的表进行连接。例:查找至少选修了2号和4号课程的学生的学号selectFIRST.snofromSCasFIRST,SCasSECONDwhereFIRST.Sno=SECOND.SnoandFIRST.cno='s2'andSECOND.cno='4'4.2外连接查询外连接查询包括:Leftjoin、rightjoin、fulljoin4.3嵌套查询在select…from…where语句结构的where子句中可嵌入一个select语句块其上层查询称为外层查询或父查询,其下层查询称为内层查询或子查询SQL语言允许使用多重嵌套查询在子查询中不允许使用orderby子句嵌套查询的实现一般是从里到外,即先进行子查询,再把其结果用于父查询作为条件4.3.1返回单个值的子查询例:求与“刘力”同一个系的学生名,年龄方法一:selectSname,SagefromstudentwhereSdept=(selectsdeptfromstudentwhereSname=刘力);方法二:selectFIRST.Sname,FIRST.SagefromStudentFIRST,StudentSECONDwhereFIRST.Sdept=SECOND.SdeptANDSECOND.Sname=刘力;4.3.2返回一组值的子查询例:求选修“C6”课程且成绩超过90分的学生方法一:select*fromstudentwheresnoIN(selectsnofromSCwhereCno=C6ANDGrade90);方法二(连接查询):selectstudent.*fromstudent,SCwhereStudent.Sno=SC.SnoANDCno=C6ANDGrade90;例:求比计算机系中某一学生年龄小的其他系的学生方法一:select*fromstudentwheresdept!=CSANDsageANY(selectSagefromStudentwhereSdept=CS);方法二:select*fromStudentwhereSdept!=’CS’ANDSage(selectMAX(Sage)fromStudentwhereSdept=CS);4.3.3多重子查询例:求D01部门中工资与国贸系中任意职工相同的职工姓名和工资表结构:Teacher(tno,tname,salary,dno)Department(dno,dname)查询语句:selectTname,SalaryfromTeacherwhereDno=D01ANDsalaryIN(selectsalaryfromteacherwhereDno=(selectDNOfromdepartmentwhereDname=国贸));例:求工资介于“张三”与“里司”两个之间的职工select*fromteacherwhereSalary=(selectMIN(Salary)fromteacherwhereTnameIN(张三,里司))ANDSalary=(selectMAX(Salary)fromteacherwhereTnameIN(张三,里司);4.3.4在from语句中使用子查询,对查询结果定义表名及列名例:求平均成绩超过80分的学号及平均成绩selectSno,avg_Gfrom(selectSno,avg(Grade)fromSCgroupbySno)ASRA(Sno,avg_G)whereavg_G80;ASRA(Sno,avg_G),为查询作为定义表名(RA)和列名(Sno,avg_G)5、带有exists的相关子查询不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带exists的子查询就是相关子查询exists表示存在量词,带有exists的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”例:求所有选修了“C1”课程的学生名。不相关子查询:selectSnamefromstudentwheresnoIN(selectsnofromSCwhereCno=C1);相关子查询selectSnamefromstudentwhereexists(select*fromSCwherestudent.sno=SC.snoANDCno=C1);相关子查询执行过程:先在外层查询中取student表的第一个元组(记录),用该记录的相关的属性值(在内层where子句中给定的)处理内层查询,若外层的where子句返回‘TRUE’值,则此元组送入结果的表中。然后再取下一个元组;重复上述过程直到外层表的记录全部遍历一次为止。不关心子查询的具体内容,因此用select*exists+子查询用来判断该子查询是否返回元组当子查询的结果集非空时,exists为“True”;当子查询的结果集为空时,exists为“False”。notexists:若子查询结果为空,返回“TRUE”值,否则返回“FALSE”例:查询选修了所有课程的学生的姓名(续)selectSnamefromstudentwherenotexists(select*fromCoursewherenotexists(select*fromSCwherestudent.sno=SC.snoANDCourse.Cno=SC.Cno));例:查询至少选修了S1所选的全部课程的学生名selectSnamefromstudentwherenotexists(select*fromSCSCXwhereSCX.sno=s1ANDnotexists(select*fromSCSCYwherestudent.sno=SCY.snoANDSCX.Cno=SCY.Cno));6、SQL的集合操作属性个数必须一致、对应的类型必须一致属性名可以不一致,最终结果集采用第一个结果的属性名缺省为自动去除重复元组,除非显式说明ALLorderby放在整个语句的最后6.1“并”操作,例:查询计算机系的学生或者年龄不大于19岁的学生,并按年龄倒排序。select*fromstudentwhereSdept=CSUNIONselect*fromstudentwhereAGE=19orderbyAGEdesc6.2“交”操作,例:查询计算机系的学生并且年龄不大于19岁的学生,并按年龄倒排序。(select*fromstudentwhereSdept=CS)INTERSECT(select*fromstudentwhereAGE=19)orderbyAGEdesc6.3“差”操作,例:查询选修课程1但没有选修课程2的学生。selectSname,SdeptfromstudentwheresnoIN((selectsnofromSCwhereCno=1)EXCEPT(selectsnofromSCwhereCno=2))7、插入操作格式:insertinto表名[(列名1,…)]values(列值1,…)插入一已知元组的全部列值insertintostudentvalues(2003001,陈冬,18,男,电商,管理学院,徐州);插入一已知元组的部分列值insertintoSC(Sno,Cno)values(2003001,C003);插入子查询的结果例:设关系S_G(Sno,avg_G),把平均成绩大于80的男生的学号及平均成绩存入S_G中insertintoS_G(sno,avg_G)(selectsno,avg(GRADE)fromSCwhereSnoIN(selectSnofromStudentwhereSEX=男)groupbySnohavingavg(GRADE)80);8、删除操作格式:deletefrom表名[where条件];只能对整个元组操作,不能只删除某些属性上的值只能对一个关系(表)起作用,若要从多个关系(表)中删除元组,则必须对每个关系分别执行删除命令9、修改操作update语句一次只能操作一个表。格式1:update表名[别名]set列名=表达式,...[where条件];格式2:update表名[别名]set(列名,...)=(子查询)[where条件];例:工种为SALESMEN的职工的工资改为工种平均工资的110%updateEMPLOYEEsetSalary=(select1.1*avg(Salary)fromEMPLOYEEwhereJOB=SALESMEN)whereJOB=SALESMEN;例:将所有学生的年龄增加1岁updatestudentsetSage=Sage+1;10、数据定义创建课程表createtableSC(snoCHAR(6)notnull,CnoCHAR(6)notnull,Gradesmallintdefaultnull)primarykey(sno,Cno)foreignkey(sno)referencesstudent(sno)foreignkey(Cno)referencesCourse(Cno)check(Gradebetween0AND100);常用的索引:唯一索引和聚簇索引唯一索引对于已含重复值的属性列不能建UNIQUE索引对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了
本文标题:常用的sql语句
链接地址:https://www.777doc.com/doc-2452116 .html