SQL SERVER 数据查询

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本章内容
⏹6.1基本查询
⏹6.2嵌套查询
⏹6.3连接查询
6.1基本查询
SQL数据查询语句是SELECT语句。

该语句的基本框架是SELECT-FROM-WHERE,它包含输出字段、数据来源和查询条件等基本子句。

在这种固定格式中,可以不要WHERE,但是SELECT和FROM是必备的。

SELECT语句的子句很多,理解了这条语句各项的含义,就能从数据库中查询出各种数据。

6.1基本查询
⏹简单查询
语法格式:
SELECT[ALL|DISTINCT]
[TOPn[PERCENT]]select_listFROM
table_name
(1)ALL:表示输出所有记录,包括重复记录。

(2)select_list:所要查询的选项的集合,多个选项之间用逗号分开。

(3)table_name:要查询的表。

6.1基本查询
例6-1分别显示Sales数据库中的员工表employee、商品表goods、销售表sell_order表和部门表department中的所有记录。

SELECT*FROMemployee
SELECT*FROMgoods
SELECT*FROMsell_order
SELECT*FROMdepartment
6.1基本查询
例6-2显示employee表中全部员工的姓名和年龄,去掉重名。

SELECTDISTINCTemployee_nameAS姓名,YEAR(GETDATE())-YEAR(birth_date)AS年龄FROMemployee
6.1基本查询
例6-3对employee表,分别查询公司的员工总数和公司员工的平均收入。

SELECTCOUNT(*)AS总数FROMemployee
SELECTAVG(wages)AS平均收入FROMemployee
6.1基本查询
⏹带条件查询
语法格式:
WHEREsearch_condition
例6-4对employee表,列出月工资在2000以上的员工记录。

SELECT*FROMemployeeWHEREwages>2000
6.1基本查询
例6-5对employee表,求出男员工的平均工资。

SELECTAVG(wages)as平均工资FROMemployeeWHEREsex='男‘
例6-6对employee表,列出市场部和销售部的员工名单。

SELECTd.department_name,e.employee_name FROMemployeeeINNERJOINdepartmentdONe.department_id=d.department_id WHEREd.department_nameIN('市场部','销售部')
语句中的WHERE子句还有等价的形式:
WHERE(d.department_name='市场部')OR(d.department_name='销售部')
6.1基本查询
例6-7对employee表,列出月工资在2000到3000之间的员工名单。

SELECT*FROMemployeeWHEREwagesBETWEEN2000AND3000
语句中的WHERE子句还有等价的形式:
WHEREwages>=2000ANDwages<=3000
6.1基本查询
例6-8对employee表,列出所有的姓“张”的员工名单。

SELECT*FROMemployeeWHEREemployee_nameLIKE'张%'
语句中的WHERE子句还有等价的形式:
WHERELEFT(employee_name,1)='张‘
例6-9对employee表,列出所有工资为空值的员工编号和姓名。

SELECTemployee_id,employee_nameFROMemployeeWHEREwagesISNULL
6.1基本查询
查询结果处理
1.排序输出(ORDERBY)
语法格式:
ORDERBYorder_by_expression1[ASC|DESC]
[,order_by_expression2[ASC|DESC]][,…]]
6.1基本查询
例6-10对employee表,按性别顺序列出员工的编号、姓名、性别、部门编号及工资,性别相同的再先按部门后按工资由高到低排序。

SELECTemployee_id,employee_name,sex,department_id,wagesFROMemployee ORDERBYsex,department_id,wagesDESC
6.1基本查询
2.重定向输出(INTO)
语法格式:
INTOnew_table
例6-11对部门表department和员工表employee,查询出“市场部”所有员工的信息,并将结果存入testtable表中。

SELECTemployee.*INTOtesttable
FROMemployeeINNERJOINdepartment
ONemployee.department_id=department.dapartment_id
WHEREdepartment.department_name='市场部'
6.1基本查询
3.输出合并(UNION)
语法格式:
[UNION[ALL]<SELECT语句>]
合并的规则是:
(1)不能合并子查询的结果。

(2)两个SELECT语句必须输出同样的列数。

(3)两个表各相应列的数据类型必须相同,数字和字符不能合并。

(4)仅最后一个SELECT语句中可以用ORDERBY子句,且排序选项必须依据第一个SELECT 列表中的列。

6.1基本查询
例6-12对employee表,列出部门编号为“D001”或“D002”的所有员工姓名。

SELECTemployee_name,department_idFROMemployeeWHEREdepartment_id='D001' UNION
SELECTemployee_name,department_idFROMemployeeWHEREdepartment_id='D002'
6.1基本查询
4.分组统计(GROUPBY)与筛选(HA VING)
语法格式:
GR OUPBYgroup_by_expression1[,group_by_expression2][,…]
例6-13对employee表,分别统计男女员工人数。

SELECTsex,COUNT(sex)as人数FROMemployeeGROUPBYsex
6.1基本查询
例6-14对employee表,分别统计各部门男女员工的人数。

SELECTdepartment_id,sex,COUNT(*)as人数FROMemployee
GROUPBYdepartment_id,sex
例6-15对employee表,列出部门平均工资大于2000的部门编号。

SELECTdepartment_id,A VG(wages)AS平均工资FROMemployee
GROUPBYdepartment_idHA VINGA VG(wages)>=2000
6.1基本查询
5.使用COMPUTE和COMPUTEBY子句汇总
语法格式:
COMPUTErow_aggregate(column_name)[,row_aggregate(colornn_name)...]
[BYcolumn_name[,column_name...]]
例6-16对employee表中部门编号为“D001”的员工工资,按照其部门编号生成汇总行和明细行。

SELECTdepartment_id,wagesFROMemployee
WHEREdepartment_id='D001'ORDERBYdepartment_idCOMPUTEsum(wages)
6.1基本查询
例6-17对employee表中部门编号为“D001”或“D002”的员工工资,按照其部门编号生成分组汇总行和明细行。

SELECTdepartment_id,wagesFROMemployee
WHEREdepartment_id='D001'ORdepartment_id='D002'
ORDERBYdepartment_id
COMPUTEsum(wages)BYdepartment_id
6.2嵌套查询
SQLServer允许多层嵌套查询。

嵌套查询一般的查询方法是由里向外进行处理,即每个子查询在上一级查询处理之前处理,子查询的结果用于建立其父查询的查找条件。

子查询中所存取的表可以是父查询没有存取的表,子查询选出的记录不显示。

6.2嵌套查询
单值嵌套查询
1.返回单值的子查询
子查询的返回结果是一个值的嵌套查询称为单值嵌套查询。

例6-18对Sales数据库,列出“市场部”的所有员工的编号。

SELECTemployee_idFROMemployee
WHEREdepartment_id=(SELECTdepartment_id
FROMdepartment
WHEREdepartment_name='市场部')
6.2嵌套查询
⏹多值嵌套查询
子查询的返回结果是一列值的嵌套查询称为多值嵌套查询。

(1)ANY运算符的用法
例6-19对Sales数据库,列出D001号部门中工资比D002号部门的员工最低工资高的员工编号和工资。

SELECTemployee_id,wagesFROMemployee
WHEREdepartment_id='D001'ANDwages>ANY
(SELECTwagesFROMemployee
WHEREdepartment_id='D002')
6.2嵌套查询
(2)ALL运算符的用法
例6-20对Sales数据库,列出部门编号为“D001”的员工,这些员工的工资比部门为“D002”的员工的最高工资还要高的员工的编号和工资。

SELECTemployee_id,wagesFROMemployee
WHEREdepartment_id='D001'ANDwages>ALL
(SELECTwagesFROMemployee
WHEREdepartment_id='D002')
6.2嵌套查询
(3)IN运算符的用法
例6-21对Sales数据库,列出部门为“市场部”或“销售部”的所有员工的编号。

SELECTemployee_idFROMemployee
WHEREdepartment_idIN
(SELECTdepartment_idFROMdepartment
WHEREdepartment_name='市场部'ORdepartment_name='销售部')
6.3连接查询
⏹连接概述
通过连接运算符可以实现多个表查询。

连接是关系数据库模型的主要特点,也是它区别于其他类型数据库管理系统的一个标志。

连接可以在SELECT语句的WHERE子句中建立。

6.3连接查询
例6-22对Sales数据库输出所有员工的销售单,要求给出员工编号、姓名、商品编号、商品名和销售数量。

SELECTemployee.employee_id,employee.employee_name,goods.goods_id,
goods.goods_name,sell_order.order_num
FROMemployee,sell_order,goods
WHEREemployee.employee_id=sell_order.employee_idand
sell_order.goods_id=goods.goods_id
6.3连接查询
连接也可以在FROM子句中建立,而且在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。

所以,在Transact-SQL中推荐使用这种方法。

FROM子句建立连接的语法格式是:
FROMjoin_table[join_type]JOINjoin_tableONjoin_condition
6.3连接查询
⏹内连接
内连接分3种:等值连接、不等值连接和自然连接。

1.等值连接
在连接条件中使用等号(=)运算符比较被连接列的列值,按对应列的共同值将一个表中的记录与另一个表中的记录相连接,包括其中的重复列。

例6-23Sales数据库中部门表department和员工表employee的等值连接。

SELECT*FROMdepartmentINNERJOIN
employeeONemployee.department_id=
department.department_id
6.3连接查询
2.不等值连接
在连接条件中使用除等于(=)运算符以外的其他比较运算符比较被连接的列的列值。

这些运算符包括>、>=、<=、<、!>、!<和<>。

例6-24对Sales数据库,列出销售“G00001”产品的员工中,销售数量大于编号为“E001”的员工销售该类产品销售数量的那些员工的编号和销售数量。

SELECTa.employee_id,a.order_num
FROMsell_orderaINNERJOIN
sell_orderbONa.order_num>b.order_numANDa.goods_id=b.goods_id
WHERE(b.goods_id='G00001')AND(b.employee_id='E001')
6.3连接查询
3.自然连接
在连接条件中使用等于(=)运算符比较被连接列的列值,它使用选择列表方式来指出查询结果集合中所包括的列,并删除连接表中的重复列。

例6-25Sales数据库中部门表department和员工表employee的自然连接。

SELECTa.department_name,b.*
FROMdepartmentaINNERJOIN
employeebONb.department_id=a.department_id
6.3连接查询
外连接
在内连接查询时,返回查询结果集合中的仅是符合查询条件(WHERE搜索条件或HA VING条件)和连接条件的行。

而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个连接表(全外连接)中的所有数据行。

6.3连接查询
1.使用左外连接
左外连接通过左向外连接引用左表的所有行。

例6-26员工信息表employee左外连接销售信息表sell_order。

SELECTa.employee_id,a.employee_name,b.goods_id,b.order_num,b.send_date FROMemployeeaLEFTOUTERJOIN
sell_orderbONa.employee_id=b.employee_id
6.3连接查询
2.使用右外连接
右外连接通过右向外连接引用右表的所有行。

例6-27员工信息表employee右外连接销售信息表sell_order。

为了说明方便,先在sell_order表中插入一条销售信息。

INSERTINTOsell_order(order_id1,goods_id,employee_id,customer_id,transporter_id,
order_num,discount,order_date,send_date,arrival_date,cost)
V ALUES('S00006','G00005','','C0006','T002',21,0.5,
GETDATE(),GETDATE(),GETDATE(),100)
SELECTa.employee_id,a.employee_name,b.goods_id,b.order_num,
b.send_date,b.order_id1
FROMemployeeaRIGHTOUTERJOIN
sell_orderbONa.employee_id=b.employee_id
6.3连接查询
3.使用全外连接
全外连接返回两个表的所有行。

不管两个表的行是否满足连接条件,均返回查询结果集。

对不满足连接条件的记录,另一个表相对应字段用NULL代替。

例6-28员工信息表employee全外连接销售信息表sell_order。

SELECTa.employee_id,a.employee_name,b.goods_id,b.order_num,b.send_date,
b.order_id1
FROMemployeeaFULLOUTERJOIN
sell_orderbONa.employee_id=b.employee_id
6.3连接查询
交叉连接
交叉连接不带WHERE子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

例如,部门信息表department中有4个部门,而员工信息表employee中有7名员工,则下列交叉连接检索到的记录数将等于4×7=28行。

SELECTa.department_id,a.department_name,b.employee_id,b.employee_name FROMdepartmentaCROSSJOIN
employeeb
本章小结
(1)SQL数据查询语句基本结构:基本框架为SELECT-FROM-WHERE,它包含输出字段、数据来源、查询条件等基本子句。

(2)带条件查询:WHERE子名中指定的查询条件可以是单表的条件表达式,也可以是多表之间的条件表达式。

(3)查询结果处理:使用SELECT语句完成查询工作后,所查询的结果默认显示在屏幕上,若需要对这些查询结果进行处理,则需要SELECT的其他子句配合操作。

(4)嵌套查询:在一个SELECT语句的WHERE子句中出现另一个SELECT语句,这种查询称为嵌套查询。

(5)连接查询:连接分为内连接、外连接和交叉连接。

内连接分为等值连接、非等值连接和自然连接。

外连接又分为左外连接、右外连接和全外连接。

相关文档
最新文档