您好,欢迎访问三七文档
数据查询本节重点:1.在SSMS中创建查询2.使用T-SQL语言创建查询本节难点:1.使用T-SQL语言实现单表查询2.表之间的连接方式3.使用T-SQL语言实现多表查询♣多表查询♣查看关系图♣单表查询单表查询语法格式:SELECT[ALL|DISTINCT][TOPn[PERCENT]]{*|{table_name|view_name|table_alias}.*|{column_name|expression[[AS]column_alias]|column_alias=expression}[,...n][INTOnew_table][FROMtable_source][WHEREsearch_condition][GROUPBYgroup_by_expression][HAVINGsearch_condition][ORDERBYorder_expression[ASC|DESC]]查询中需要输出的字段生成一张新表源数据表查询条件分组排序单表查询----1.输出字段语法格式:SELECT[ALL|DISTINCT][TOPn[PERCENT]]{*|{table_name|view_name|table_alias}.*|{column_name|expression[[AS]column_alias]|column_alias=expression}[,...n]1.输出表中的所有字段(*)2.去除表中重复的记录(distinct字段名)3.是一个构造列(“列名=表达式”or“表达式as列名”)例1:student表中的详细信息例2:查询出grade表中所有学号(学号不重复)例3:查询各个专业的奖学金的总和及平均值select学号fromgradedistinctselect*fromstudentSelectsum(奖学金)as总和,平均值=avg(奖学金)fromstudent语法格式:SELECT字段列表[FROMtable_source]单表查询----2.查询涉及的源表1.源数据表可以是表也可以是视图Createviewv_studentAsSelect学号,姓名,性别fromstudentWhere性别=‘true’创建一个视图v_student例:查询出所有男同学的学号,姓名法一:select学号,姓名fromstudentwhere性别=‘true’法二:select学号,姓名fromv_student单表查询----3.查询的条件语法格式:SELECT字段列表FROM表名[WHEREsearch_condition]说明:1.条件可以是一个也可以是多个,之间用“or”或“and”连接2.条件表达式的运算符可以是:=、、=、=、、!、!、!=[NOT]IN:判断给定值是否与子查询或列表中的值相匹配[NOT]BETWEENAND:判断是否在指定范围。IS[NOT]NULL:判断是否是空值[NOT]LIKE:判断给定的字符串是否与指定的模式匹配LIKE查询就是平常所说的模糊查询,常用的通配符有以下几种:1.%:代表任意长度的字符串,即0个或更多个字符的任意长度的字符串。包括空字符串。2._(下划线):代表单个字符3.[]:指定范围或集合内的任何单个字符。包括两端数据。如[A-D],只能取A或B或C或D中的一个。4.[^]:不属于指定范围或集合内的任何单个字符。如[^A-D],只能取除A、B、C、D之外的其他任意一个字符例:select*fromstudent(1)where姓名like‘张%’(2)where姓名like‘__’(3)where姓名like‘[张,王]%’(4)where姓名like‘[^张,王]%’例1:select*fromgradewhere成绩60例2:select*fromgradewhere课程号in(‘C01’,‘C02’)例3:select*fromgradewhere成绩between40and59例4:select*fromgradewhere课程号=‘C01’and成绩isnull语法格式:SELECT字段列表FROM表名WHERE条件表达式[GROUPBYgroup_by_expression][HAVINGsearch_condition]单表查询----4.分组1.Groupby常与聚合函数一起使用,达到统计的目的2.Select后面的字段必须是groupby后面有出现的字段,否则必须与聚合函数一起使用3.分组的依据可以是多个字段4.Where子句的条件控制的是“什么记录可以参加分组”,而having子句的条件控制的是“什么样的分组结果可以输出”例:查询出各个专业的奖学金平均值Select专业,avg(奖学金)FromstudentGroupby专业,学号表示各个专业各个班级的奖学金平均值,班级例:查询出学号为’09001’、’09002’和’09003’的同学中各门课程的平均成绩及格的同学的学号,课程号及平均成绩条件一:只求出‘09001’-‘09003’三位同学的平均成绩条件二:求出每位同学的平均成绩,只有平均成绩=60的同学才符合要求Select学号,课程号,avg(成绩)as平均成绩fromgradeWhere学号in(‘09001’,‘09002’,‘09003’)Groupby学号Having平均成绩60常用的聚合函数单表查询----4.分组(显示明细信息)语法格式:SELECT字段列表FROM表名WHERE条件表达式ORDERBY字段1,字段2……COMPUTE汇总BY字段1,字段2……1.Select后面的字段可以是任意字段,汇总值不在select后面出现,而是在compute与by之间2.必须先orderby再computeby,且orderby后面的字段和computeby后面的字段必须同序Select*fromstduentWhere专业=‘计算机’or专业=‘外语’Orderby专业,性别Computesum(奖学金)by专业,性别性别单表查询----5.排序语法格式:SELECT字段列表FROM表名WHERE条件表达式[ORDERBYorder_expression[ASC|DESC]]1.排序的依据可以是一个也可以是多个2.ASC:升序(默认)DESC:降序3.TOPn[PERCENT]常与orderby联用,表示排序后取前面的n条或n%条的记录例:查询出student表中所有同学的信息,要求先按“专业”降序,再按“性别”降序排列Select*fromstudentOrderby专业,性别descdesc否则默认为asc单表查询----6.生成新表语法格式:SELECT字段列表INTOTABLE_NAMEFROM表名WHERE条件表达式1.生成一张新表(可以是原表中的一部分,也可以是整个原表)2.注意它的位置,不是在最后例:把grade表中所有不及格的同学的记录找出来生成一张“补考表”Select*into补考表fromgradeWhere成绩60完成单表查询必须先弄清楚以下问题1.要输出的字段:跟在select的后面2.涉及到的表:跟在from的后面3.检索的条件:跟在where的后面4.是否有排序:跟在orderby的后面5.是否有分组:跟在groupby的后面例:查询出所有‘09’级的同学所修的所有课程的平均成绩,按平均成绩降序排列Select学号,avg(成绩)fromgradeWhere学号like’09%’Groupby学号Orderbyavg(成绩)desc(学号、平均成绩)(grade)(09级的学生)(“平均成绩”降序)(各个同学平均成绩)查看关系图一.通过关系图可以看出数据库中表之间得关联二.可以在关系图中直接设置表之间的关联语法格式一:SELECT字段列表FROM表1,表2[,…n]WHERE条件表达式and表1.关联字段=表2.关联字段[,…n]GROUPBY分组字段ORDERBY排序字段多表查询语法格式二:SELECT字段列表FROM表1innerjoin表2on表1.关联字段=表2.关联字段[,…n]WHERE条件表达式GROUPBY分组字段ORDERBY排序字段可以有多张表两表要有关联字段可以有多种连接方式例:查询出所有修了’C01’课程的同学的学号,姓名Select学号,姓名fromstudentinnerjoingradeOnstudent.学号=grade.学号where课程号=‘C01’Selects.学号,姓名fromstudentass,gradeasgWheres.学号=g.学号and课程号=‘C01’Student.可略语法格式一:SELECT字段列表FROM表1,表2[,…n]WHERE条件表达式and表1.关联字段=表2.关联字段[,…n]GROUPBY分组字段ORDERBY排序字段多表查询语法格式二:SELECT字段列表FROM表1innerjoin表2on表1.关联字段=表2.关联字段[,…n]WHERE条件表达式GROUPBY分组字段ORDERBY排序字段可以有多张表两表要有关联字段可以有多种连接方式表的连接方式:1.内部连接:innerjoin2.左外连接:left[outer]join3.右外连接:right[outer]join4.完全外连接:full[outer]join5.自连接selectdistinct学号from先解除student与grade的外键约束,再添加如右图一条记录studentInnerjoingradeLeftjoinRightjoinFulljoin自连接:同一张表进行连接例:如上左图的表grade1与表grade1进行自己与自己的连接Select*fromgradeasa,gradeasbWherea.学号=b.学号一定要为表取别名完成一个查询必须先弄清楚以下问题1.要输出的字段:跟在select的后面2.涉及到的表:跟在from的后面3.表之间是怎么连接的:4.检索的条件:5.是否有排序:跟在orderby的后面6.是否有分组:跟在groupby的后面例:查询出修了“计算机导论”课程的同学的学号、姓名Selects.学号,姓名fromstudents,gradeg,coursecWheres.学号=g.学号andg.课程号=c.课程号and课程名=‘计算机导论’(学号、姓名)(student,couser)(student-grade,course-grade)(修了”计算机导论”)跟在where的后面Select学号,姓名fromstudentWhere学号in(select学号fromgradewhere成绩60)嵌套查询1.在Select、insert、update、delete语句中还有其他的查询语句的就称嵌套查询2.允许多层嵌套3.执行的时候先从内部查询开始,依次执行外部查询嵌套查询三种格式----格式1格式1:Where表达式[not]In(子查询)例:查询出所有“计算机”专业的同学的学号和成绩(Select学号fromstduentWhere专业=‘计算机’)学号inSelect学号,成绩fromgradeWhere*嵌套查询三种格式----格式2格式1:Where表达式比较运算符[Any|All](子查询)、、=、=、=、Any:任意一个值满足条件即可All:所有值都要满足条件例:查询出比“张三”和“李四”奖学金都高的同学的学号(Select奖学金fromstudentwhere姓名=‘张三’or姓名=‘李四’)Select学号fromstudentwhere奖学金allany奖学金只要比“张三”或“李四”大即可嵌套查询三种格式----格式3格式1:Where[not]Exists(子查询)例:如果student表不为空,则查询出该表的所有信息Exists(Select*fromstudent)Select*fromstudentWhereIfExists(S
本文标题:数据查询
链接地址:https://www.777doc.com/doc-3700063 .html