第八讲数据查询语句SELECTSELECT语句基础1多表连接查询2嵌套查询(子查询)3查询的基本思想查询是从数据表中检索数据的方法。我们在进行查询操作之前,必须要建立好了数据库和表,最重要的是表中应该有数据。我们这里介绍的查询是在给定的数据库的一个或多个表中进行的检索,将符合条件的数据组成一个新的表(不管是单个数据项还是多个表内容的组合)返回给查询语句的用户。查询语句的基本语法使用SQL语句从数据库中查询数据,并允许从一个或多个表中选择一个或多个行或列。虽然SELECT语句的完整语法较复杂,但是其主要的子句可归纳如下:SELECTselect_list[INTOnew_table][FROMtable_source][WHEREsearch_condition][GROUPBYgroup_by_expression][HAVINGsearch_condition][ORDERBYorder_expression[ASC|DESC]]查询语句的基本语法SELECT语句的完整语法比较复杂,SELECT是语句关键字,不可缺省,其它的可缺省子句包括:FROM子句、WHERE子句、GROUPBY子句、HAVING子句、ORDERBY子句。在SELECT语句之间还可以使用UNION,EXCEPT和INTERSECT运算符,将各个查询的结果合并到一个结果集中。SELECT子句设定查询结果内容SELECT子句的主要参数查询表中所有列—SELECT子句中使用“*”查询表中某几列—SELECT子句中给出列名列表给列名指定别名—SELECT子句中列名后用as给出别名查看结果的前若干条记录—使用TOP关键字查看结果中不重复的记录—使用DISTINCT关键字构造计算列SELECT子句的主要参数SELECT子句的作用是指定查询返回的列,SELECT关键字后包含的参数很多,下面介绍主要的几个。ALL:指定在结果集中包含所有行(可重复),此参数为默认值,可省略;DISTINCT:指定在结果集中只包含唯一行,即从结果集中去掉重复行;TOPexpression[PERCENT][WITHTIES]:返回结果集中的头几行,其中expression是一个指定的数目(如10);select_list:指定要显示的列,各列之间用逗号分隔;*:指定返回FROM子句中所有表和视图中的所有列。简单查询—使用select子句选取字段输出表中所有列—使用“*”号;SELECT*FROMstudents输出表中部分列—指定部分列名,逗号分隔;SELECTsno,sname,deptFROMstudents为结果集内的列指定别名—as子句或“别名=列名”;SELECTsnoAS学号,snameAS姓名,deptAS所在系FROMstudents过滤结果集内的重复行—使用distinct关键字;SELECTDISTINCTdeptAS系名FROMstudents限制返回行数—topn或topnpercent。SELECTTOP5*FROMstudentsSELECTTOP20PERCENT*FROMstudents构造计算列SELECT后的子句中可以是表达式,因此可根据表中一些列的值计算出所需要的一些结果,这称之为构造计算列。SELECTTOP5snoAS学号,snameAS姓名,year(getdate())-in_year+1AS年级FROMstudentsWHERE子句设定查询条件在实际应用中我们是根据一定的条件来查找所需要的数据,而不是表中所有记录。因此WHERE子句在查询语句显得特别地重要。包含WHERE子句SELECT语句基本格式如下:SELECTcolumn_expressionFROMtable_nameWHEREcondition_expressionWHERE子句设定查询条件其中WHERE子句后的condition_expression是条件表达式,也就是查询条件。查询条件就是一种逻辑表达式,只有那些使这个表达式的值为真值的记录才按照目标列表达式column_expression指定的方式组成一个新记录在结果中显示。因为表达式的结果是一个逻辑值,因此多个条件可以用逻辑联结词NOT、OR、AND(逻辑非运算、逻辑或运算、逻辑与运算)组合成复合条件。简单的查询条件(仅包含比较运算符)简单的查询条件是这种模式“列名比较运算符值”,例如“sname='吴天天'”,或“cj60”这种形式。查询条件中的列名必须是表中存在的,不能有拼写错误,不要用单引号括起来;而对应的值如果是字符和日期型数据就需要用单引号括起来。演示例子:查找出2011年入学的学生信息由联结词构成的复合查询条件当给定的查询要求比较复杂时,不能用简单的查询条件来表示时,可以使用逻辑运算符非、或、与(NOT、OR、AND)将多个简单条件组合成复合条件。演示例子:查找出工程系2011年入学的学生信息使用BETWEEN…AND进行范围查询当要查询的条件取值在某个范围之内时,可使用BETWEEN…AND进行范围锁定,例如课程成绩取值在60到84之间,用上面介绍的复合条件表示为“cj=60ANDcj=84”,也可以用范围表达式表示为“cjBETWEEN60AND80”。使用BETWEEN…AND进行范围比较的字段列数据类型可以是数值型、字符型和日期型等其值可以进行比较的数据类型,还可以使用NOTBETWEEN…AND进行值不在某个范围内的比较。演示例子:找出2008-2010年间入学的学生信息使用IN进行范围查询IN与BETWEEN…AND都可以用来进行范围查询,但不同的是IN后面跟的是一个枚举类型的列表,而不是给出的在两个值之间的范围,即使用IN进行范围查询必须把所有的值一一列举出来,用圆括号组织成一个列表,用于判断记录中的某个列的值是否在这个列表当中。演示例子:找出2009、2012年入学的学生信息使用LIKE进行模糊查询模糊查询是与精确查询相对应的一种查询,即给出的条件不是完整的,只是部分内容,或者说查询条件有些模糊。在T-SQL的实际应用中模糊查询使用比较多,且必须通过LIKE关键字才能实现模糊查询。WHERE子句中使用LIKE进行模糊查询的SELECT语句基本格式如下:SELECTcolumn_expressionFROMtable_nameWHEREcolumn_name[NOT]LIKEcharacter_string模糊查询中的通配符通配符在模糊查询中显得十分重要,下表列出了能够在LIKE后字符串中使用的通配符及其意义。通配符中文名意义举例%百分号任意多个字符(包括0个)吴%,第1个字为吴的字符串_下划线任意一个字符(只有1个字符)_明_,三个字中间为明的串[]方括号由[]指定范围内的1个字符[ABC]:字符A或B或C[^]不在[]指定范围内的1个字符[^ABC]:不是A或B或C的字符模糊查询例子1.查询出姓名首字母为‘l’的学生信息。2.查找出学号尾号为‘5’的学生信息3.查找出专业有‘技术’字样的学生信息4.查找出学号尾数不是‘1’‘2’‘3’的学生信息使用IS进行空值(NULL)查询如果要查询职称(zc)值为空(NULL)的教师信息,查询条件不能写为“zc=NULL”,而应该写成“zcISNULL”。在T-SQL语言中NULL代表未知或不确定的值,所以不能用“=”对NULL值进行比较,只能使用IS进行判断。演示例子:查找出专业信息为空的学生信息在SELECT子句中使用聚合函数进行统计或计算聚合函数在查询语句中使用最多,下面介绍聚合函数的作用及使用方法。聚合函数可以将多个值合并为一个值,其作用是对一组值进行统计或计算,并返回计算后的值,下表中列出了常用的聚合函数。函数名意义使用说明AVG求平均值AVG(age),age列必须是数值类型COUNT返回元素个数COUNT(age),age列中元素个数,即记录数MAX返回最大值MAX(age),返回age列中的最大值MIN返回最小值MIN(age),返回age列中的最小值SUM返回和值SUM(age),返回age列中的值之和使用聚合函数进行统计或计算上表中列出的五个函数中,除COUNT函数外,其余函数在运算时都会忽略空值NULL。另外AVG、MAX和MIN三个函数中的参数如果是表中的字段列,则列的类型一定是可计算的数值类型,不能是非数值类型(例如:字符型或日期型)。演示例题。聚合函数的应用统计函数count:参数可以是全部列,也可以是部分列(使用哪个列来统计都是一样的)比如:selectcount(sno),selectcount(*)AVG,SUM,MAX,MIN:参数必须为数值型的列(可以计算),用法都是一样的:AVG(列名)、SUM(列名);不可以出现AVG(*)等。分组查询—使用GROUPBY子句分组即按照表中某一列或某几列的值将表中的所有记录分成若干组,然后再进行统计或计算结果。在T-SQL语言中SELECT语句中使用GROUPBY子句实现分组,然后在SELECT子句后使用聚合函数进行统计或计算。GROUPBY子句的基本语法代码如下:GROUPBYgroup_by_expression[HAVINGsearch_condition]分组查询—使用GROUPBY子句使用GROUPBY子句,我们首先要理解分组的含义。分组之后,如果要对分组结果进行筛选,即选择满足一定条件的组,这时可以加HAVING子句。HAVING子句的作用有点象WHERE子句,用于指定条件查询。HAVING子句只能在GROUPBY子句后使用,是对组设定条件,而不是针对具体的某一条记录,而WHERE子句是针对记录设定条件的。分组查询例子查询每个专业的人数查询每年入学的人数查询出专业人数大于等于3的系部查询出…结果排序—使用ORDERBY子句有时候希望将查询结果按照一定的顺序进行排列,以便更快速地看到所需要的信息。在SELECT查询语句中使用ORDERBY子句可以方便地实现对查询结果进行排序输出。ORDERBY子句的基本语法格式如下:ORDERBYcolumn_name[ASC|DESC][,…]演示例题:按入学时间输出学生信息使用ORDERBY子句的几点注意(1)ORDERBY子句与其它子句(例如WHERE子句、GROUPBY子句等)可以同时存在,但它必须放在其它所有子句的后面,因此,一般来说,ORDERBY子句总是放到SELECT语句的最后面;(2)对某些特殊类型如xml、ntext、text、image类型的字段,不能使用ORDERBY子句进行排序;(3)空值NULL按最小值处理;(4)ORDERBY子句只影响显示效果,并不会改变数据库中表中记录的位置;使用INTO子句为查询结果建立新表我们使用SELECT语句进行查询可以看到查询结果,但并不会保存。如果在SELECT子句后使用INTO子句,则可以将查询的结果保存到一个新表中。其基本语法如下:SELECTselect_list[INTOnew_table]……使用INTO子句可以将查询的结果保存到新表中,如果新表中不希望有记录只想复制表的结构,可以在WHERE子句中使用“1=2”这样的纯假条件,那么只将表的结构(字段列和数据类型)复制到新表中,没有记录。演示例题:复制mytable表为newtable第八讲数据查询语句SELECTSELECT语句基础1多表连接查询2嵌套查询(子查询)3连接查询前面我们已经介绍了SELECT语句的基本使用方法,但只是针对单个数据表的简单查询,而实际问题往往复杂,一般查询要通过多个表连接才能完成。多表查询是指在多个数据表之间的查询,这种查询是根据表与表之间的联系条件来组织结果表中的数据记录,从而获取所需要的查询内容。连接的分类多表连接的基础是两个表的连接,下面我们先介绍两个表连接,然后再将其推广到多表之间的连接。连接的