[SQL]数据库Select命令详解

DATE: 2016-11-10 / VIEWS: 667

从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。虽然 Select 语句的完整语法较复杂,但是其主要的子句可归纳如下:

Select select_list
[ INTO new_table ]
FROM table_source
[ Where search_condition ]
[ GROUP BY group_by_e­xpression ]
[ HAVING search_condition ]
[ orDER BY order_e­xpression [ ASC | DESC ] ]

可以在查询之间使用 UNION 运算符,以将查询的结果组合成单个结果集。

语法

Select statement ::=
    < query_e­xpression >
    [ orDER BY { order_by_e­xpression | column_position [ ASC | DESC ] }
        [ ,...n ]    ]
    [ COMPUTE
        { { AVG | COUNT | MAX | MIN | SUM } ( e­xpression ) } [ ,...n ]
        [ BY e­xpression [ ,...n ] ]
    ]
    [ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
            [ , XMLDATA ]
            [ , ELEMENTS ]
            [ , BINARY base64 ]
        }
]
    [ OPTION ( < query_hint > [ ,...n ]) ]

< query e­xpression > ::=
    { < query specification > | ( < query e­xpression > ) }
    [ UNION [ ALL ] < query specification | ( < query e­xpression > ) [...n ] ]

< query specification > ::=
    Select [ ALL | DISTINCT ]
        [ { TOP integer | TOP integer PERCENT } [ WITH TIES ] ]
        < select_list >
    [ INTO new_table ]
    [ FROM { < table_source > } [ ,...n ] ]
    [ Where < search_condition > ]
    [ GROUP BY [ ALL ] group_by_e­xpression [ ,...n ]
        [ WITH { CUBE | ROLLUP } ]
    ]
    [HAVING <search_condition>]

-----------------------------------------------------------------------------------------------------------


实例学习SQL的Select命令

  -1、查找员工的编号、姓名、部门和出生日期,如果出生日期为空值,
--显示日期不详,并按部门排序输出,日期格式为yyyy-mm-dd。
select emp_no ,emp_name ,dept ,
isnull(convert(char(10),birthday,120),'日期不详') birthday
from employee
order by dept
--2、查找与喻自强在同一个单位的员工姓名、性别、部门和职称
select emp_no,emp_name,dept,title
from employee
where emp_name<>'喻自强' and dept in
(select dept from employee
where emp_name='喻自强')

--3、按部门进行汇总,统计每个部门的总工资
select dept,sum(salary)
from employee
group by dept

--4、查找商品名称为14寸显示器商品的销售情况,
--显示该商品的编号、销售数量、单价和金额
select a.prod_id,qty,unit_price,unit_price*qty totprice
from sale_item a,product b
where a.prod_id=b.prod_id and prod_name='14寸显示器'

--5、在销售明细表中按产品编号进行汇总,统计每种产品的销售数量和金额
select prod_id,sum(qty) totqty,sum(qty*unit_price) totprice
from sale_item
group by prod_id

--6、使用convert函数按客户编号统计每个客户1996年的订单总金额
select cust_id,sum(tot_amt) totprice
from sales
where convert(char(4),order_date,120)='1996'
group by cust_id

--7、查找有销售记录的客户编号、名称和订单总额
select a.cust_id,cust_name,sum(tot_amt) totprice
from customer a,sales b
where a.cust_id=b.cust_id
group by a.cust_id,cust_name

--8、查找在1997年中有销售记录的客户编号、名称和订单总额
select a.cust_id,cust_name,sum(tot_amt) totprice
from customer a,sales b
where a.cust_id=b.cust_id and convert(char(4),order_date,120)='1997'
group by a.cust_id,cust_name

--9、查找一次销售最大的销售记录
select order_no,cust_id,sale_id,tot_amt
from sales
where tot_amt=
(select max(tot_amt)
from sales)

--10、查找至少有3次销售的业务员名单和销售日期
select emp_name,order_date
from employee a,sales b
where emp_no=sale_id and a.emp_no in
(select sale_id
from sales
group by sale_id
having count(*)>=3)
order by emp_name

--11、用存在量词查找没有订货记录的客户名称
select cust_name
from customer a
where not exists
(select *
from sales b
where a.cust_id=b.cust_id)

--12、使用左外连接查找每个客户的客户编号、名称、订货日期、订单金额
--订货日期不要显示时间,日期格式为yyyy-mm-dd
--按客户编号排序,同一客户再按订单降序排序输出
select a.cust_id,cust_name,convert(char(10),order_date,120),tot_amt
from customer a left outer join sales b on a.cust_id=b.cust_id
order by a.cust_id,tot_amt desc

--13、查找16M DRAM的销售情况,要求显示相应的销售员的姓名、
--性别,销售日期、销售数量和金额,其中性别用男、女表示
select emp_name 姓名, 性别= case a.sex when 'm' then '男'
when 'f' then '女'
else '未'
end,
销售日期= isnull(convert(char(10),c.order_date,120),'日期不详'),
qty 数量, qty*unit_price as 金额
from employee a, sales b, sale_item c,product d
where d.prod_name='16M DRAM' and d.prod_id=c.prod_id and
a.emp_no=b.sale_id and b.order_no=c.order_no

--14、查找每个人的销售记录,要求显示销售员的编号、姓名、性别、
--产品名称、数量、单价、金额和销售日期
select emp_no 编号,emp_name 姓名, 性别= case a.sex when 'm' then '男'
when 'f' then '女'
else '未'
end,
prod_name 产品名称,销售日期= isnull(convert(char(10),c.order_date,120),'日期不详'),
qty 数量, qty*unit_price as 金额
from employee a left outer join sales b on a.emp_no=b.sale_id , sale_item c,product d
where d.prod_id=c.prod_id and b.order_no=c.order_no

--15、查找销售金额最大的客户名称和总货款
select cust_name,d.cust_sum
from customer a,
(select cust_id,cust_sum
from (select cust_id, sum(tot_amt) as cust_sum
from sales
group by cust_id ) b
where b.cust_sum =
( select max(cust_sum)
from (select cust_id, sum(tot_amt) as cust_sum
from sales
group by cust_id ) c )
) d
where a.cust_id=d.cust_id

--16、查找销售总额少于1000元的销售员编号、姓名和销售额
select emp_no,emp_name,d.sale_sum
from employee a,
(select sale_id,sale_sum
from (select sale_id, sum(tot_amt) as sale_sum
from sales
group by sale_id ) b
where b.sale_sum <1000
) d
where a.emp_no=d.sale_id

--17、查找至少销售了3种商品的客户编号、客户名称、商品编号、商品名称、数量和金额
select a.cust_id,cust_name,b.prod_id,prod_name,d.qty,d.qty*d.unit_price
from customer a, product b, sales c, sale_item d
where a.cust_id=c.cust_id and d.prod_id=b.prod_id and
c.order_no=d.order_no and a.cust_id in (
select cust_id
from (select cust_id,count(distinct prod_id) prodid
from (select cust_id,prod_id
from sales e,sale_item f
where e.order_no=f.order_no) g
group by cust_id
having count(distinct prod_id)>=3) h )

--18、查找至少与世界技术开发公司销售相同的客户编号、名称和商品编号、商品名称、数量和金额
select a.cust_id,cust_name,d.prod_id,prod_name,qty,qty*unit_price
from customer a, product b, sales c, sale_item d
where a.cust_id=c.cust_id and d.prod_id=b.prod_id and
c.order_no=d.order_no and not exists
(select f.*
from customer x ,sales e, sale_item f
where cust_name='世界技术开发公司' and x.cust_id=e.cust_id and
e.order_no=f.order_no and not exists
( select g.*
from sale_item g, sales h
where g.prod_id = f.prod_id and g.order_no=h.order_no and
h.cust_id=a.cust_id)
)

19、查找表中所有姓刘的职工的工号,部门,薪水
select emp_no,emp_name,dept,salary
from employee
where emp_name like '刘%'

20、查找所有定单金额高于2000的所有客户编号
select cust_id
from sales
where tot_amt>2000

21、统计表中员工的薪水在4000-6000之间的人数
select count(*)as 人数
from employee
where salary between 4000 and 6000

22、查询表中的同一部门的职工的平均工资,但只查询"住址"是"上海市"的员工
select avg(salary) avg_sal,dept
from employee
where addr like '上海市%'
group by dept

23、将表中住址为"上海市"的员工住址改为"北京市"
update employee
set addr like '北京市'
where addr like '上海市'

24、查找业务部或会计部的女员工的基本信息。
select emp_no,emp_name,dept
from employee
where sex='F'and dept in ('业务','会计')

25、显示每种产品的销售金额总和,并依销售金额由大到小输出。
select prod_id ,sum(qty*unit_price)
from sale_item
group by prod_id
order by sum(qty*unit_price) desc
26、选取编号界于'C0001'和'C0004'的客户编号、客户名称、客户地址。
select CUST_ID,cust_name,addr
from customer
where cust_id between 'C0001' AND 'C0004'

27、计算出一共销售了几种产品。
select count(distinct prod_id) as '共销售产品数'
from sale_item

28、将业务部员工的薪水上调3%。
update employee
set salary=salary*1.03
where dept='业务'

29、由employee表中查找出薪水最低的员工信息。
select *
from employee
where salary=
(select min(salary )
from employee )

30、使用join查询客户姓名为"客户丙"所购货物的"客户名称","定单金额","定货日期","电话号码"
select a.cust_id,b.tot_amt,b.order_date,a.tel_no
from customer a join sales b
on a.cust_id=b.cust_id and cust_name like '客户丙'

31、由sales表中查找出订单金额大于"E0013业务员在1996/10/15这天所接每一张订单的金额"的所有订单。
select *
from sales
where tot_amt>all
(select tot_amt
from sales
where sale_id='E0013'and order_date='1996/10/15')
order by tot_amt

32、计算'P0001'产品的平均销售单价
select avg(unit_price)
from sale_item
where prod_id='P0001'

33、找出公司女员工所接的定单
select sale_id,tot_amt
from sales
where sale_id in
(select sale_id from employee
where sex='F')

34、找出同一天进入公司服务的员工
select a.emp_no,a.emp_name,a.date_hired
from employee a
join employee b
on (a.emp_no!=b.emp_no and a.date_hired=b.date_hired)
order by a.date_hired

35、找出目前业绩超过232000元的员工编号和姓名。
select emp_no,emp_name
from employee
where emp_no in
(select sale_id
from sales
group by sale_id
having sum(tot_amt)<232000)

36、查询出employee表中所有女职工的平均工资和住址在"上海市"的所有女职工的平均工资
select avg(salary)
from employee
where sex like 'f'
union
select avg(salary)
from employee
where sex like 'f' and addr like '上海市%'

37、在employee表中查询薪水超过员工平均薪水的员工信息。
Select *
from employee
where salary>( select avg(salary)
from employee)

38、 找出目前销售业绩超过10000元的业务员编号及销售业绩,并按销售业绩从大到小排序。
Select sale_id ,sum(tot_amt)
from sales
group by sale_id
having sum(tot_amt)>10000
order by sum(tot_amt) desc

39、 找出公司男业务员所接且订单金额超过2000元的订单号及订单金额。
Select order_no,tot_amt
From sales ,employee
Where sale_id=emp_no and sex='M' and tot_amt>2000

40、 查询sales表中订单金额最高的订单号及订单金额。
Select order_no,tot_amt from sales
where tot_amt=(select max(tot_amt) from sales)

41、 查询在每张订单中订购金额超过4000元的客户名及其地址。
Select cust_name,addr from customer a,sales b
where a.cust_id=b.cust_id and tot_amt>4000

42、 求出每位客户的总订购金额,显示出客户号及总订购金额,并按总订购金额降序排列。
Select cust_id,sum(tot_amt) from sales
Group by cust_id
order by sum(tot_amt) desc

43、 求每位客户订购的每种产品的总数量及平均单价,并按客户号,产品号从小到大排列。
Select cust_id,prod_id,sum(qty),sum(qty*unit_price)/sum(qty)
From sales a, sale_item b
Where a.order_no=b.order_no
Group by cust_id,prod_id
order by cust_id,prod_id

44、 查询订购了三种以上产品的订单号。
Select order_no
from sale_item
Group by order_no
Having count(*)>3

45、 查询订购的产品至少包含了订单3号中所订购产品的订单。
Select distinct order_no
From sale_item a
Where order_no<>'3'and not exists (
Select * from sale_item b where order_no ='3' and not exists
(select * from sale_item c where c.order_no=a.order_no and c.prod_id=b.prod_id))

46、 在sales表中查找出订单金额大于"E0013业务员在1996/11/10这天所接每一张订单的金额"的所有订单,并显示承接这些订单的业务员和该订单的金额。
Select sale_id,tot_amt from sales
where tot_amt>all(select tot_amt
from sales
where sale_id='E0013' and order_date='1996-11-10')

47、 查询末承接业务的员工的信息。
Select *
From employee a
Where not exists
(select * from sales b where a.emp_no=b.sale_id)

48、 查询来自上海市的客户的姓名,电话、订单号及订单金额。
Select cust_name,tel_no,order_no,tot_amt
From customer a ,sales b
Where a.cust_id=b.cust_id and addr='上海市'

49、 查询每位业务员各个月的业绩,并按业务员编号、月份降序排序。
Select sale_id,month(order_date), sum(tot_amt)
from sales
group by sale_id,month(order_date)
order by sale_id,month(order_date) desc

50、 求每种产品的总销售数量及总销售金额,要求显示出产品编号、产品名称,总数量及总金额,并按产品号从小到大排列。
Select a.prod_id,prod_name,sum(qty),sum(qty*unit_price)
From sale_item a,product b
Where a.prod_id=b.prod_id
Group by a.prod_id,prod_name
order by a.prod_id
51、 查询总订购金额超过'C0002'客户的总订购金额的客户号,客户名及其住址。
Select cust_id, cust_name,addr
From customer
Where cust_id in (select cust_id from sales
Group by cust_id
Having sum(tot_amt)>
(Select sum(tot_amt) from sales where cust_id='C0002'))

52、 查询业绩最好的的业务员号、业务员名及其总销售金额。
select emp_no,emp_name,sum(tot_amt)
from employee a,sales b
where a.emp_no=b.sale_id
group by emp_no,emp_name
having sum(tot_amt)=
(select max(totamt)
from (select sale_id,sum(tot_amt) totamt
from sales
group by sale_id) c)

53、 查询每位客户所订购的每种产品的详细清单,要求显示出客户号,客户名,产品号,产品名,数量及单价。
select a.cust_id, cust_name,c.prod_id,prod_name,qty, unit_price
from customer a,sales b, sale_item c ,product d
where a.cust_id=b.cust_id and b.order_no=c.order_no and c.prod_id=d.prod_id

54、 求各部门的平均薪水,要求按平均薪水从小到大排序。
select dept,avg(salary)
from employee
group by dept
order by avg(salary)

-------------------------------------------------------------------------------------------------------
select语句最简单的格式:
  
select columns from tables


  其功能是从指定的表中选择全部列或部分列
  例1:查看我国濒危动物的濒危等级
  
select level2 from PreservedSpecies


  例2:查询我国濒危动物有那些濒危等级
  
select distinct level2 from PreservedSpecies


   (2)使用通配符
  例3:查询“PreservedSpecies”表中所有的濒危动物保护信息
  
select * from PreservedSpecies


  (3)查询符合条件的记录
  在实际的数据库查询中,经常需要查询满足某些条件的记录,如:在“濒危动物”数据库中,查询濒危等级为“极危”的动物。要实现这样的查询可以使用where子句,在where关键字后设置查询条件,格式如下:
  
select columns from tables [where predicates]


  where 子句中可以使用比较运算符、between关键字、in关键字和like关键字等方法来限制需要检索的记录
  【比较查询】
  在SQL中可以使用多种比较方式查询,用于比较查询的运算符主要包括:
  代表意思 运算符
代表意思 运算符
等于 =
不等于 <>
小于 <
大于 >
小于或等于 <=
大于或等于 >=

  例4:查询濒危等级为“极危”的动物信息
  
select * from PreservedSpecies where level='极危'


  
  【“like”查询】
  SQl中可以使用“like”关键字检索与特定字符串匹配的记录,即模糊查询;
  “%”为通配符,代表一个或者多个;“_”代表一个字符
  例5:查询中文名称最后一个字为“熊”的动物信息。
  
select * from AnimalSpecies where Cname like '%熊'


  (4)使用逻辑运算符查询
  如果要进行的查询需要满足多个条件,可以使用逻辑运算符and、or和not联接多个查询条件,从而实现多个重要条件查询
  例6:查询分布于“广西”且中文名中带有“白”的动物信息
  
select * from AnimalSpecies where Cname like '%白%' and distribution like'%白%'


  (5)对查询结构排序
  
select * from PreservedSpecies order by level desc


  其中,desc表示降序排列,asc表示升序排列,缺省值为升序。
  (6)常用计算函数
  为了增强检索功能,SQL还提供了许多计算机函数,主要有:
1、count() 统计记录个数
2、sum() 统计一列值得综合,只能用于数值型字段
3、avg() 统计一列值得平均值,只能用于数值型字段
4、max() 返回一列中得最大值
5、min() 返回一列中得最小值

  
  统计北京地区动物的个数
  
select count(*) from AnimalSpecies where Distribution like '%北京%'


  (7)从多个表中取列
  前面的查询都是在一个表中进行的,如果查询涉及到多个表,即从多个表中取列,则需要进行连接查询
  连接查询中用于连接两个表的条件称为连接条件,等值连接的连接条件格式为:
  
Table1.column1=Table2.column2


  查看学生的所有科目的综合评价分数
  
select students.stu_name, subjectkind.lesson_name,stu_score.all_price from students,subjectkind,stu_score where students.student_id =stu_score.student_id and stu_score.lesson_id=subjectkind.lesson_id

---------------------------------------------------------------------------------------------------------------------------
一、 简单查询
简单的Transact-SQL查询只包括选择列表、FROM子句和Where子句。它们分别说明所查询列、查询的
表或视图、以及搜索条件等。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
Select nickname,email
FROM testtable
Where name='张三'

(一) 选择列表
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变
量和全局变量)等构成。

1、选择所有列
例如,下面语句显示testtable表中所有列的数据:
Select *
FROM testtable

2、选择部分列并指定它们的显示次序
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
例如:
Select nickname,email
FROM testtable

3、更改列标题
在选择列表中,可重新指定列标题。定义格式为:
列标题=列名
列名 列标题
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列
标题:
Select 昵称=nickname,电子邮件=email
FROM testtable

4、删除重复行
Select语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认
为ALL。使用DISTINCT选项时,对于所有重复的数据行在Select返回的结果集合中只保留一行。

5、限制返回的行数
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是
表示一百分数,指定返回的行数等于总行数的百分之几。
例如:
Select TOP 2 *
FROM testtable
Select TOP 20 PERCENT *
FROM testtable

(二)FROM子句
FROM子句指定Select语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,
它们之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应
使用下面语句格式加以限定:
Select username,citytable.cityid
FROM usertable,citytable
Where usertable.cityid=citytable.cityid
在FROM子句中可用以下两种格式为表或视图指定别名:
表名 as 别名
表名 别名

(二) FROM子句
FROM子句指定Select语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,
它们之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应
使用下面语句格式加以限定:
Select username,citytable.cityid
FROM usertable,citytable
Where usertable.cityid=citytable.cityid
在FROM子句中可用以下两种格式为表或视图指定别名:
表名 as 别名
表名 别名
例如上面语句可用表的别名格式表示为:
Select username,b.cityid
FROM usertable a,citytable b
Where a.cityid=b.cityid
Select不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。
例如:
Select a.au_fname+a.au_lname
FROM authors a,titleauthor ta
(Select title_id,title
FROM titles
Where ytd_sales>10000
) AS t
Where a.au_id=ta.au_id
AND ta.title_id=t.title_id
此例中,将Select返回的结果集合给予一别名t,然后再从中检索数据。

(三) 使用Where子句设置查询条件
Where子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:
Select *
FROM usertable
Where age>20
Where子句可包括各种条件运算符:
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
范围运算符(表达式值是否在指定的范围):BETWEEN…AND…
NOT BETWEEN…AND…
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)
NOT IN (项1,项2……)
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
2、列表运算符例:country IN ('Germany','China')
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、
varchar、text、ntext、datetime和smalldatetime等类型查询。
可使用以下通配字符:
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。

录录网 | 网络电视 | FLASH音乐 | 录录论坛 | 免费服务 | 美女图片 搜索   标题 全文  


设为首页  
·程序设计·网页设计·心情故事·笑话天地·互联网·游戏专区·我的原创 ·录录贴吧







ASP程序 ·ASP程序·PHP程序·JSP程序·asp.net·VB·JAVA·C/C++
您现在的位置:录录网 -> 程序设计-> ASP程序




SQL查询语句Select精华
作者:未知 来自:转载自网络 录录人:>asp 等级: 时间:2005-3-14 页数:[1] [2]  



  文章搜索  

  
标题 全文  



例如:
限制以Publishing结尾,使用LIKE '%Publishing'
限制以A开头:LIKE '[A]%'
限制以A开头外:LIKE '[^A]%'
4、空值判断符例Where age IS NULL
5、逻辑运算符:优先级为NOT、AND、OR
(四)查询结果排序
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:
orDER BY {column_name [ASC|DESC]} [,…n]
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排
序。
例如:
Select *
FROM usertable
orDER BY age desc,userid ASC
另外,可以根据表达式进行排序。

二、 联合查询
UNION运算符可以将两个或两个以上上Select语句的查询结果集合合并成一个结果集合显示,即执行联
合查询。UNION的语法格式为:
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement为待联合的Select查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一
行。
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类
型,系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:
查询1 UNION (查询2 UNION 查询3)

三、连接查询
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型
数据库管理系统的一个标志。
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行
查询。
连接可以在Select 语句的FROM子句或Where子句中建立,似是而非在FROM子句中指出连接时有助于
将连接操作与Where子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。
SQL-92标准所定义的FROM子句的连接语法格式为:
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一
个表操作的连接又称做自连接。
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的
数据行。
交叉连接(CROSS JOIN)没有Where 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑
运算符等构成。
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接
连接。例如:
Select p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

(一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分
三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接
表中的所有列,包括其中的重复列。
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些
运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询
结果集合中所包括的列,并删除连接表中的重复列。
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
Select *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
Select a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二)外连接
内连接时,返回查询结果集合中的仅是符合查询条件( Where 搜索条件或 HAVING 条件)和连接条件
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来:
Select a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:
Select a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username

(三)交叉连接
交叉连接不带Where 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等
于6*8=48行。
Select type,pub_name
FROM titles CROSS JOIN publishers
orDER BY type