您好,欢迎访问三七文档
1第4章数据查询数据查询:DBMS按照用户指定的条件,从数据库相关表中检索满足条件的数据的过程。数据查询涉及两方面的工作:用户指定条件;数据库进行处理,并将查询结果返回。SELECT语句简单查询高级查询一、SELECT语句1、SELECT语句主要功能:根据用户指定的条件,从数据库表检索用户所需的数据,以指定的格式返回给客户(显示)。分组汇总(统计)数据。显示全局变量、局部变量值;设置局部变量值。2、SELECT语句基本语法SELECT[ALL|DISTINCT][TOPn[PERCENT]]选择列表[INTO新表的名称]FROM表名[WHERE查询条件][GROUPBY分组表达式]--分组的列[HAVING分组条件][ORDERBY排序表达式[ASC|DESC]]--排序的列二、基本查询1、选择列-SELECT子句(1)指定列-限制仅返回指定列SELECT列名1,列名2,…2FROM表名注:列名的顺序可以与表定义不同;多个列用“,”分隔。例4-1:选择指定列-限制仅返回指定列。(2)选择所有列(*)-返回所有列SELECT*FROM表名例4-2:选择所有列-返回所有列。(3)使用计算列-计算结果作为列例4-3:使用计算列-计算结果作为列。(4)改变列标题-为返回的列或者计算列指定新的列标题。SQLServer查询默认返回的数据以列名作为列标题,计算列无列标题,可以为返回的列或者计算列指定列标题。SELECT列标题=列名|计算列或:SELECT列名|计算列[AS]列标题注:列标题可以在前也可以在后;AS也可以省略。例4-4:设置计算列的列标题例4-5:改变列标题-用中文列标题取代默认列标题(以列名作为列标题)2、选择行-WHERE子句一般情况,大多数查询不是针对表中的所有记录,而是查询满足某些符合条件的记录。WHERE子句指定查询条件,用于从表中筛选出符合条件的行。SELECT选择列表FROM表名WHERE查询条件其中:查询条件是用于指定查询条件的表达式。SQLSERVER的查询条件可以是:关系表达式、逻辑表达式以及其他一些谓词构成的表达式(字符串模糊匹配LIKE、数据范围BETWEEN、列表数据IN、空值判定ISNULL等)3(1)关系运算符(关系表达式)-比较运算符。表4-1:关系运算符(8种)运算符含义说明1大于2小于3=等于4!=或:不等于5=大于等于6=小于等于7!不大于等价于“=”,SQLSERVER特有。8!不小于等价于“=”,SQLSERVER特有。例4-6:查询Product表价格低于5元的产品信息(演示“”运算符)。例4-7:查询Seller表男销售员的信息(演示“=”运算符)。(2)逻辑运算符:AND(与)、OR(或)、NOT(非)例4-8:查询Product表价格在5~10元之间的产品的信息(演示“AND”运算符)。※例4-9:查询Adventure数据库HumanResources.Department(部门)表,显示GroupName(部门所属组)为“Manufacturing”(制造组)或者“QulityAssurance”(质保组)的部门的信息。(演示“OR”运算符)。※例4-10:(3)字符串模糊查询LIKE语法格式:表达式[NOT]LIKE匹配字符串[ESCAPE‘换码字符’]说明:读作:表达式像或者不像匹配字符串。若匹配,就满足条件。换码字符-指定一个转义字符,在转义字符后的匹配字符(%、_、[])不再具有匹配字符的含义,而是按照普通字符处理。4匹配字符串可以包含4种匹配字符(表4-2)。表4-2:匹配字符的含义匹配字符含义描述1%多个任意代表多个(可以是0个)任意字符2_单个任意代表一个任意字符3[]范围,单个代表指定范围内的任意单个字符4[^]不在范围,单个代表不在指定范围内的任意单个字符表4-3:匹配字符应用示例表达式描述其他说明LIKE‘RA%’搜索以“RA”开头的所有字符串LIKE‘%ion’搜索以“ion”结尾的所有字符串LIKE‘%ir%’搜索任意位置包含字符串“ir”的所有字符串LIKE‘_mt’搜索以“mt”结尾的所有三个字符组成的字符串LIKE‘[BC]%’搜索B或C字符开头的所有字符串范围以列表逐一列出或者以“-”表示字符范围。LIKE‘[B-K]air’搜索“B”到“K”任意字母开头,以“air”结尾的字符串LIKE’B[^a]%’搜索以“B”开头,第二字符不是“a”的所有字符串例4-11:查询Seller表中“张”姓销售员的信息(演示:LIKE):例4-12:查询Seller表中姓名第二个字不是“芳”和“伟”的销售员的信息(演示:LIKE)(4)数据范围BETWEEN…AND语法格式:列名[NOT]BETWEEN表达式1AND表达式2说明:读作列名(不)在表达式1和表达式2之间。例4-13:查询Product表价格在5~10元之间的产品的信息(演示BETWEEN)注:等价于例4-8用AND。(5)数据列表IN5列值的取值不是在一个连续的区间,而是一些离散的值。语法格式:列名[NOT]IN(值1,值2,……)例4-14:查询Seller表saleid(销售员编号)为s01、s05、s07的销售员的信息(演示IN)(6)空值判定ISNULL语法格式:列名IS[NOT]NULL说明:NULL空-表示未确定、未明确、未输入、未知的含义。NULL不等于0。例4-15:查询Seller表HireDate(雇佣日期)为空的销售员的信息(演示ISNULL)3、排序-ORDERBY通常情况,查询显示的记录顺序并非是我们所需要的顺序,ORDERBY子句可将查询结果按照指定的排序方式显示。语法格式:SELECT列名1[,列名2,…]FROM表名WHERE查询条件ORDERBY列名[ASC|DESC][,…n]说明:表示按照列名排序,ASC表示按照升序排序(默认),DESC表示按照降序排序。ORDERBY子句可以包含多个列,此时先按照第一个列排序,在第一个列相同情况下,再按照第二个列排序,……以此类推。例4-17:从Seller表查询销售员信息,结果按照销售员姓名排序(升序)。例4-18:从Seller表查询销售员信息,结果按照销售员出生日期(降序)排序。例4-19:从Orders表查询订单信息。结果按照客户编号升序排序,相同客户编号的订单再按照销售员编号降序排序(多个排序列)。4、使用TOP和DISTINCT关键词(1)TOP关键词-限制查询结果集返回的行数。6语法:SELECT[TOPn|TOPnPERCENT]列名表FROM表名WHERE查询条件说明:TOPn:表示返回前n行;TOPnPERCENT:表示返回前n%行。例4-21:无序地选择前若干行。例4-22:排序后选择前若干行(更常用)-查询产品表价格最高的6种产品。(2)DISTINCT关键词-结果集去除重复行。语法:SELECT[ALL|DISTINCT]列名表FROM表名WHERE查询条件说明:DISTINCT:结果集删除多余行。ALL(默认):结果集保留所有行。例4-23:查询已经有订购的产品的产品编号。三、高级查询I-多表查询关系数据库数据表设计时,为了减少冗余,确保数据一致、完整,要求数据表的设计符合规范(比如3NF),为了遵循这些规范,往往需要将数据分离到多张表中。然而实际应用时,又往往需要将多张表的相关数据提取,聚合后一起提供给用户-即需要多表查询。多表查询的本质是多张表通过关联的列的连接。“多表查询”也称为“连接查询”。多表(连接)查询有2种语法:ANSI语法、SQLSERVER语法。7ANSI连接查询语法SELECT列名表FROM表名1[连接类型]JOIN表2ON连接条件WHERE查询条件SQLSERVER连接查询语法。SELECT列名表FROM表名1,表2[,……n]WHERE连接条件AND查询条件注:连接类型:①内连接、②外连接(左外/右外/完全)、③交叉连接。1、内连接(INNERJOIN)内连接(默认的连接类型):显示连接表中所有匹配的数据行。例4-24:查询OrderID=“10248”的产品相关信息。包括:ProductID(产品编号)、ProductName(产品名称)、Price(单价)、Quantity(订货数量)。分析:ProductID(产品编号)、Quantity(订货数量)来源于OrderDetail表;而ProductName(产品名称)、Price(单价)来源于Product表。因此,本查询属于OrderDetail表、Product表多表查询。OrderDetail表、Product表通过ProductID(产品编号)关联,所以连接的列是两表的ProductID列。例4-25:实现例4-24功能,只是两个表均使用了别名。例4-25还提供了使用SQLSERVER连接查询语法的命令的实现。8例4-26:查询OrderID(订单号)=“10248”订单涉及的客户和销售员的信息。包括:CustomerID(客户编号)、ConnectName(联系人)、SaleID(销售员编号)、SaleName(销售员姓名)。分析:CustomerID、SaleID包含在Oders表中;而ConnectName来源于Customer表;另外SaleName又来源于Seller表;所以本查询涉及3张表:Orders、Customer、Seller。是三表连接查询。Orders表、Customer表通过CustomerID关联(连接)Orders表、Seller表通过SaleID关联(连接)2、外连接(OUTERJOIN)外连接:包含来自一个表的所有行以及来自另外一个表的匹配行。(1)左外连接(LEFTOUTERJOIN)结果集包含左表所有行以及右表匹配的行;对于来自左表的行,如果右表无匹配,右表的数据列显示NULL。例4-27:查询Product表所有产品的订购情况。包括产品编号ProductID、产品名称ProductName、产品单价Price;订单号OrderID、订货数量Quantity。分析:产品编号ProductID、产品名称ProductName、产品单价Price来源于Product表;而订单号OrderID、订货数量Quantity来源于OrderDetail表。所以该查询是多表连接查询。Product表、OrderDetail表通过ProductID关联(连接)。如果采用内连接,那么某些未订购的产品将不在结果集中显示。本例不管产品是否订购,均需要显示Product表的全部产品,故使用外连接。由于Product表作为左表,故使用左外连接。9注:对比一下,假设本例使用内连接的效果。例4-28:查询Customer表所有客户订购产品的情况。包括客户编号CustomerID、公司名称CompanyName、联系人ConnectName、销售员编号SaleID、订单日期OrderDate。分析:(与例4-27类似)客户编号CustomerID、公司名称CompanyName、联系人ConnectName来源于Customer表;销售员编号SaleID、订单日期OrderDate来源于Orders表,所以该查询是多表连接查询。Customer表、Orders表通过CustomerID关联(连接)。如果采用内连接,那么某些未下过订单的客户将不在结果集中显示。本例不管客户是否订购过产品,均需要显示所有Customer表客户,故使用外连接。由于Customer表作为左表,故使用左外连接。(2)右外连接(RIGHTOUTERJOIN)结果集包含右表所有行以及左表匹配的行;对于
本文标题:4-数据查询
链接地址:https://www.777doc.com/doc-2923243 .html