第三章基本SQL语句回顾如何创建数据库如何创建表结构数据类型和约束什么是索引,创建和管理索引如何更改数据库表目标掌握如何使用Insert向表中插入数据掌握如何使用Update更新表中已有数据掌握如何使用Delete删除表中已有数据掌握如何使用Select查询数据什么是CRUDCRUD就是Create,Retrieve,Update,Delete的英文首字母的缩写CRUD是指在做计算处理时的增加、查询(重新得到数据)、更新和删除几个单词的首字母简写。主要被用在描述软件系统中数据库或者持久层的基本操作功能添加新数据使用INSERT的最基本的语法INSERTINTO表名(列名列表)VALUES(值列表);INSERTINTOEmployees(FirstName,LastName,HireDate,ReportsTo)VALUES('John','Clinton','2004-01-01',2);讲述T-SQL之前…语法检查数据库对象执行选择数据库T-SQL执行结果插入数据行7-1InSert[INTO]表名[列名]Values值列表INSERTINTOStudents(SName,SAddress,SGrade,SEmail,SSEX)VALUES('张青裁','上海松江',6,'ZQC@Sohu.com',0)插入数据行7-2注意事项1:每次插入一行数据,不可能只插入半行或者几列数据,因此,插入的数据是否有效将按照整行的完整性的要求来检验;INSERTINTOStudents(SName,SAddress,SGrade,SEmail,SSEX)VALUES('张青裁')代码错误插入数据行7-3注意事项2:每个数据值的数据类型、精度和小数位数必须与相应的列匹配;INSERTINTOStudents(SName,SAddress,SGrade,SEmail,SSEX)VALUES('张青裁','上海松江',ZQC,'ZQC@Sohu.com','ZG')代码错误插入数据行7-4注意事项3:不能为标识列指定值,因为它的数字是自动增长的;INSERTINTOStudents(SCode,SName,SAddress,SGrade,SEmail,SSEX)VALUES(32,'张青裁','上海松江',6,'ZQC@Sohu.com',0)代码错误插入数据行7-5注意事项4:如果在设计表的时候就指定了某列不允许为空,则必须插入数据;INSERTINTOStudents(SAddress,SGrade,SEmail,SSEX)VALUES('上海松江',6,'ZQC@Sohu.com',0)代码错误插入数据行7-6注意事项5:插入的数据项,要求符合检查约束的要求INSERTINTOStudents(SName,SAddress,SGrade,SEmail,SSEX)VALUES('张青裁','上海松江',6,'ZQC',0)代码错误插入数据行7-7注意事项6:具有缺省值的列,可以使用DEFAULT(缺省)关键字来代替插入的数值INSERTINTOStudents(SName,SAddress,SGrade,SEmail,SSEX)VALUES('张青裁',DEFAULT,6,'ZQC@Sohu.com',0)示例CREATETABLEStudent1(StudentIDintIDENTITYPRIMARYKEY,StudentNamevarchar(20)DEFAULT'Anonymous',BirthDatevarchar(20)DEFAULT'Unknown');INSERTINTOStudent1(StudentName)VALUES(DEFAULT);示例如果StudentID列是一个标识列,那么我们就可以在INSERT语句中省略它,因为RDBMS会负责自动为该列添加数据。如果我们试图对一个标识列插入数据,在某些RDBMS中会出错在INSERT语句中,包含列名不是严格必须的。如果我们知道每个列的名字,并且知道列在数据库中的顺序,那么我们就可以忽略列名列表CREATETABLEStudents(StudentIDintPRIMARYKEY,StudentNamevarchar(50));INSERTINTOStudents(StudentID,StudentName)VALUES(1,'John1')INSERTINTOStudentsVALUES(2,'John2');执行多行插入SQL不允许使用常量值一次添加多行。但是SQL允许使用从一个嵌入的SELECT查询中获取的值,来一次向表中添加多行以这种方式使用INSERT语句,与上小节的语法有两点不同:在INSERT语句中不用VALUES关键字,而是以一个嵌入在INSERT中的SELECT查询获取的数据来替代插入数据的列名列表是可选的。如果提供了列名列表,那么被SELECT查询返回的,组成INSERT语句值的列必须跟列表中的列有相同列数、数据类型和顺序。如果没有提供列名列表,那么SELECT查询中的列必须匹配目标表中的列。作为规则之一,我们最好在INSERT语句中包含列名,因为这样可以使调试更容易这条语句经常用于在数据库中移动大量数据,例如备份数据INSERTINTO表名(列名列表)SELECTSelect语句;示例与Select(列名)into(表名)from(表名)的区别INSERTINTOStudent1(StudentName)VALUES('John2');INSERTINTOStudent1(StudentName)VALUES('John3');INSERTINTOStudent1(StudentName)VALUES('John4');INSERTINTOStudent1(StudentName)VALUES('John5');INSERTINTOStudents(StudentID,StudentName)SELECTStudentID+2,StudentNameFROMStudent1;更改已有数据UPDATE表名SET新列值列表WHERE过滤条件;删除数据DELETEFROM表名WHERE过滤条件Truncatetable表名Droptable表名问题:三者有什么区别?查询数据有哪些查询操作投影、选择、联接、除、并、交、差、笛卡尔乘积语法Select[distinct]{*|列名[别名],…}From表名[where条件][orderby列名]投影操作语法Select列名列表from表名要点表别名、列别名计算列排除重复数据:distinct限定行数:topn[percent]返回单列语法DEMOSELECT列名FROM表名;SELECTNameFROMProfessor;SELECTProfessor.NameFROMProfessor;返回多列语法DEMOSELECT列A,列B,列CFROM表名;SELECTStudentID,ExamID,CommentsFROMStudentExam;SELECT*FROMStudentExam;使用别名语法DEMOSELECT列AASA,列BASB,列CASCFROM表名AST;SELECTT.列AASA,T.列BASB,T.列CASCFROM表AST;SELECTT.列AA,T.列BB,T.列CCFROM表T;SELECTNameASStudentName,StudentIDASIDFROMStudent;返回计算列执行数学计算连接字符串值SELECTStudentID,ExamID,Mark*IfPassedASMarkIfPassedFROMStudentExam;SELECTFirstName+''+LastNameASFullNameFROMPeople;说明:不同的数据库连接字符串方式是不一样的。过滤重复数据语法DEMOSELECTDISTINCT列AFROM表;SELECTDISTINCT列A,列BFROM表;SELECTSustainedOnfromExam;SELECTDISTINCTSustainedOnFROMExam;SELECTDISTINCTCustomerName,CreditCardFROMCustomers;SELECTDISTINCTExamID,SustainedOnFROMExam;返回限定行数的查询为什么要限定行数数据库有100万条记录,能不能一次查询出来?如何限定行数第一种:指定返回多少行语法:selecttop行数列1,列2from表第二种:指定返回的百分比语法:selecttop百分数PERCENT列1,列2from表示例:SelectTOP120from表SelectTOP15PERCENTfrom表单条件选择语法DEMOSELECT列A,列BFROM表WHERE条件;SELECT列A,列BFROM表WHERE列C=值;SELECTNameFROMStudentWHEREStudentID=3;SELECTFirstName,LastName,AddressFROMCustomersWHERELastName=FirstName;多条件选择操作组合WHERE条件And:并且Or:或者DEMOSELECT列A,列BFROM表WHERE条件1(and或者or)条件2;SELECTStudentID,Mark,CommentsFROMStudentExamWHEREExamID=1ANDPassed=1;SELECTStudentID,Mark,CommentsFROMStudentExamWHERE(Passed=1ORMark80)and(Passed=1)SELECTStudentID,Mark,CommentsFROMStudentExamWHEREExamID=1ANDNOTPassed=1;BETWEEN关键字语法DEMOSELECT列A,列BFROM表WHERE列CBETWEEN下限AND上限;SELECTExamID,SustainedOn,CommentsFROMExamWHERESustainedOnBETWEEN'2003-03-20'AND'2003-03-24';SELECTExamID,SustainedOn,CommentsFROMExamWHERESustainedOnNOTBETWEEN'2003-03-20'AND'2003-03-24';IN关键字语法DEMOSELECT列A,列BFROM表WHERE列C=Value1OR列C=Value2OR列C=Value3;SELECT列A,列BFROM表WHERE列CIN(值集合);SELECT列A,列BFROM表WHERE列CIN('Value1','Value2','Value3');SELECT列A,列BFROM表WHERE列CIN(SELECT列DFROM表2);SELECTStudentID,ExamID,MarkFROMStudentExamWHEREStudentIDin(1,2,3)LIKE关键字语法使用百分号(%)通配符使用下划线(_)通配符SELECT列A,列BFROM表WHERE列CLIKE模式;SELECTExamID,CommentsFROMExamWHERECommentsLIKE'%hour%';--包含hourSELECTExamID,CommentsFROMExamWHERECommentsLIKE'%hour';--以hour结尾SELECTExamID,CommentsFROMExamWHERECommentsLIKE'hour%';--以hour开始SELECTnameFROMprofessorWHEREnameLIKE'_____%';模式匹配注意事项使用模式匹配时