Select 查询
指定要检索的列
在Select关键字后面使用 * 时,表示全部列都是要查询的,不指定 *,就要写出要查询的列,并用逗号分开 , 如:
Select * From [表名];
Select xh,xm,sx From [表名];
剔除重复的行
当选择的列表不包含主键列时,结果表可能包含重复的行。返回不重复的行,要使用关键字 Distinct 。
Drop Table Stu;
Create Table Stu(xh int primary key,xm varchar(8),cj int,City varchar(10));
Insert Into Stu(xh,xm,cj,City) Values(1,'AAA',67,'三明');
Insert Into Stu(xh,xm,cj,City) Values(2,'BBB',87,'福州');
Insert Into Stu(xh,xm,cj,City) Values(3,'CCC',83,'三明');
Insert Into Stu(xh,xm,cj,City) Values(4,'DDD',73,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(5,'EEE',56,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(6,'FFF',45,'泉州')
Select City From Stu;
City
----------
三明
福州
三明
泉州
泉州
泉州
(6 行受影响)
Select Distinct City From Stu;
City
----------
福州
泉州
三明
(3 行受影响)
SQL 函数
SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。
有用的 Aggregate 函数:
- AVG() - 返回平均值
- COUNT() - 返回行数
- FIRST() - 返回第一个记录的值
- LAST() - 返回最后一个记录的值
- MAX() - 返回最大值
- MIN() - 返回最小值
- SUM() - 返回总和
SQL Scalar 函数
SQL Scalar 函数基于输入值,返回一个单一的值。
有用的 Scalar 函数:
UCASE() - 将某个字段转换为大写
LCASE() - 将某个字段转换为小写
-
MID() - 从某个文本字段提取字符,MySql 中使用
SELECT MID(column_name,start[,length]) FROM table_name;
参数 描述 column_name 必需。要提取字符的字段。 start 必需。规定开始位置(起始值是 1)。 length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
-
SubString(字段,1,end) - 从某个文本字段提取字符
LEN() - 返回某个文本字段的长度
SELECT LENGTH(column_name) FROM table_name;
-
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
SELECT ROUND(column_name,decimals) FROM table_name;
参数 描述 column_name 必需。要舍入的字段。 decimals 必需。规定要返回的小数位数。
- NOW() - 返回当前的系统日期和时间
SELECT NOW() FROM table_name;
-
FORMAT() - 格式化某个字段的显示方式
SELECT FORMAT(column_name,format) FROM table_name; SELECT name, url, DATE_FORMAT(Now(),'%Y-%m-%d') AS date FROM Websites;
参数 描述 column_name 必需。要格式化的字段。 format 必需。规定格式。
Select 的条件语句
选择表达式的where和having子句有一个搜索条件,包含了一个简单的条件,或者由and或者or连接的多个简单条件。其判断的结果的三个:真、假或者空。SQL有好几种条件,包括Basic、NULL、Between,In,Like,Exists和Quantified。
注意:Text,Ntext和Image数据类型只能用在Like条件中和允许使用Text和Image参数的函数。Text和Image数据类型不能用在子查询的选择列表中。
基本条件
基本条件使用下面列出的比较运算符来比较两个值:
等于 :=
不等于: <>或!=
大于: <
不大于: <=或!>
不小于: >=或!<
小于: >
select * from Stu where cj >= 80;
xh xm cj City
----------- -------- ---------------------- ----------
2 BBB 87 福州
3 CCC 83 三明
--(2 行受影响)
Select xm,cj,cj/10,cj%10 From Stu;
xm cj
-------- ----------- ----------- -----------
AAA 67 6 7
BBB 87 8 7
CCC 83 8 3
DDD 73 7 3
EEE 56 5 6
FFF 45 4 5
--(6 行受影响)
TOP 和 Limit
**TOP** 子句用于规定要返回的记录的数目 。 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
注释:并非所有的数据库系统都支持 TOP 子句。
用Top n [Percent]子句将结果集的大小限定为一个指定数字或者行的百分比。Top n [Percent]子句放在列选择项之前。
例如:查询xs(xh,xm,cj)表前三名的同学。
Select Top 3 xh,xm From Order By Cj Desc
例如:查询xs(xh,xm,cj)表成绩在前30%的同学。
Select Top 30 Percent xh,xm From Order By Cj Desc
特别说明:With Ties选项是将与限定的最后一条记录有相同值的记录也显示出来。设显示9行就已经达到了30%的显示比例或要求,但第10行,第11行的值与第9行相同,如果用了with Ties选项,则会显示出10、11行,否则只显示9行。可避免一些理应符合条件的记录被排除在结果之外。
Select Top 30 Percent
SELECT TOP n [PERCENT] column_name(s)
FROM table_name
指定只从查询结果集中输出前 n 行。n 是介于 0 和 4294967295 之间的整数。如果还指定了 PERCENT,则只从结果集中输出前百分之 n 行。当指定时带 PERCENT 时,n 必须是介于 0 和 100 之间的整数。
如果查询包含 ORDER BY 子句,将输出由 ORDER BY 子句排序的前 n 行(或前百分之 n 行)。如果查询没有 ORDER BY 子句,行的顺序将任意。
Limit [beginIndex] number 中 beginIdex 表示从什么位置开始结果,number 表示取几条数据。假若只有 number,默认从0开始往后取 number 条结果。
SELECT column_name(s)
FROM table_name
LIMIT number
Null条件
根据ANSI标准,比较两个值时,如果其中一个值或者两个值都是空的,那么该比较的结果为未知。NULL条件提供了一种测试空或者非空的方式,语法如下:
where ShipDate Is Null
或者
where ShipDate Is not Null
Between
操作符 BETWEEN ... AND 是两个不等值测试的方法,会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,请使用下面的 SQL:
SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'
--结果:
Id LastName FirstName Address City
-------- ----------- ----------- ----------- -----------
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:
SELECT * FROM Persons
WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter'
--结果:
Id LastName FirstName Address City
-------- ----------- ----------- ----------- -----------
3 Carter Thomas Changan Street Beijing
4 Gates Bill Xuanwumen 10 Beijing
比较数值则可用:
Select xm,cj From Stu Where cj Between 56 and 83;
xm cj
-------- -----------
AAA 67
CCC 83
DDD 73
EEE 56
(4 行受影响)
--或是:
Select xm,cj From Stu Where cj>=56 and CJ<=83;
xm cj
-------- -----------
AAA 67
CCC 83
DDD 73
EEE 56
(4 行受影响)
In 条件
IN 操作符允许您在 WHERE 子句中规定多个值 ,为了简化一系列相等性测试,可以使用In条件,例如,搜索条件:
where Shipcity IN (‘Eugene’,’Portland’,’Seattle’)
--等价于
where Shipcity=‘Eugene’ or Shipcity=’Portland’ or Shipcity=’Seattle’
--IN条件的另外一种形式允许使用子查询定义一组要比较的值:
Select CustId,Name From Customer
Where ShipCity In (select Distinct City FROM warehouse where …)
--表数据:
Drop Table Stu;
Create Table Stu(xh int primary key,xm varchar(8),cj int,City varchar(10));
Insert Into Stu(xh,xm,cj,City) Values(1,'AAA',67,'三明');
Insert Into Stu(xh,xm,cj,City) Values(2,'BBB',87,'福州');
Insert Into Stu(xh,xm,cj,City) Values(3,'CCC',83,'三明');
Insert Into Stu(xh,xm,cj,City) Values(4,'DDD',73,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(5,'EEE',56,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(6,'FFF',45,'泉州');
--例子:
Select * From Stu Where City In('福州','三明');
xh xm cj City
----------- -------- ----------- ----------
1 AAA 67 三明
2 BBB 87 福州
3 CCC 83 三明
(3 行受影响)
Select * From Stu Where City>='福州'and City<='三明';
xh xm cj City
----------- -------- ----------- ----------
1 AAA 67 三明
2 BBB 87 福州
3 CCC 83 三明
4 DDD 73 泉州
5 EEE 56 泉州
6 FFF 45 泉州
(6 行受影响)
Like 条件
Like条件提供字符串样式匹配 ,在默认情况下,SQL使用忽然大小写不同的排序,所以样式_ick匹配DICK,等等,当安装SQL时,可以指定这种排列顺序,对比较运算,大写字母和小写字母是不同的。这种情况下,这种样式_ick不匹配DICK。
通配符 | 含义 |
---|---|
_下划线 | 任何一个字符或汉字 |
%百分号 | 任意长度的任意字符(0-n) |
[字符列表] | 存在于字符列表中任一值 |
[^字符列表] | 不存在于字符列表中任一值 |
-减号 | 指定字符范围,两边的值分别为其上下限,如0到3写为0-3 |
Like运算符的表达式:
搜索表达式 | 描述 |
---|---|
LIKE ‘J%n’ | 查找以’J’开头并以’n’结尾的值 |
LIKE ‘%Mar%’ | 在日期时间列中查找三月份(March)的值,与年份无关 |
LIKE ‘%1994%’ | 在日期时间列中查找1994年的值 |
LIKE ‘Mac_’ | 查找四个字符的值,其中前三个字符为’Mac’ |
LIKE ‘[a-w]’ | a到w之间的任意一个字符 |
LIKE ‘80[%]’ | 80% |
LIKE ‘[^0-6]’ | 除0到6之间的一个数字 |
LIKE ‘sy[wpk]m’ | 取wpk中一个字符组合,如:sywm,sypm,sykm |
LIKE ‘[a_c]%’ | 以"a"或"_"或"c"开头的字符串 |
Drop Table Stu;
Create Table Stu(xh int primary key,xm varchar(8),cj int,City varchar(10));
Insert Into Stu(xh,xm,cj,City) Values(1,'ABCD',67,'三明');
Insert Into Stu(xh,xm,cj,City) Values(2,'abcd',87,'福州');
Insert Into Stu(xh,xm,cj,City) Values(3,'acd',83,'三明');
Insert Into Stu(xh,xm,cj,City) Values(4,'abc',73,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(5,'ABC',56,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(6,'ACD',45,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(7,'C',56,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(8,'A',45,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(9,'b',45,'泉州');
Insert Into Stu(xh,xm,cj,City) Values(10,'_abc',45,'泉州');
Select * From Stu Where xm Like '[a_c]%';
xh xm cj City
----------- -------- ----------- ----------
1 ABCD 67 三明
2 abcd 87 福州
3 acd 83 三明
4 abc 73 泉州
5 ABC 56 泉州
6 ACD 45 泉州
7 C 56 泉州
8 A 45 泉州
10 _abc 45 泉州
(9 行受影响)
如果要匹配%、-或[字符,那么可以把这种字符放在方括号内。
例如,所匹配的字符串至少有两个字符,并且在第二个或最后一个字符上有一个下划线:
Name Like ‘_%[_]%’
--第一个_下划线匹配任何一个字符,第一个%匹配零个或者多个字符,[_]只匹配一个字符_,最后一个 % 匹配零个或者---多个任意字符。
--指定%、_或 [ 字符的另一种方法是指定一个退出字符。
--例如,该例与前一个示例的样式等价:
Name Like ‘_%\_%’ Escape ‘\’
这个示例Escape子句指定在样式中的\字符后面的任意字符都作为一个文字符对待。
Exists
Exists条件是使用子查询的另一种条件形式。语法是
[Not] Exists(Select_Expression)
如果子查询的结果表中包含一行或者多行,那么该条件为真,否则为假(Exists条件的值永远不会为未知)。
例如,查询没有销售的客户:
Select Customer.CustId,Customer.Name ,Null As Saledate from Customer
Where Not Exists(Select * From Sale where Sale.custId=Customer.CustId)
--例:查询没有选修的学生名单
Drop Table xx;
Drop Table xs;
Drop Table C;
Create Table xs(xh int primary key,xm varchar(12));
Create Table C(kh int primary key,km varchar(12));
Create Table xx(xh int,kh int,CJ Float,Constraint PK_XHKH primary key(XH,KH));
Insert Into xs Values(1,'AAA');
Insert Into xs Values(2,'BBB');
Insert Into xs Values(3,'CCC');
Insert Into C Values(1001,'C语言');
Insert Into C Values(1002,'C++');
Insert Into C Values(1003,'VB');
Insert Into C Values(1004,'数据结构');
Insert Into XX Values(1,1001,80);
Insert Into XX Values(1,1003,70);
Insert Into XX Values(2,1002,90);
Insert Into XX Values(2,1003,75);
Select * From xs Where Not Exists(Select * From xx Where xx.xh=xs.xh);
xh xm
----------- ------------
3 CCC
例:没人选修的课程
Select * From C Where Not Exists(Select * From xx Where xx.kh=C.kh);
kh km
----------- ------------
1004 数据结构
(1 行受影响)
在这个搜索条件中使用的选择表达式称为相关子查询,因为内部的选择表达式引用Customer.CustId,它是在外部的选择表达式中指定的表的某个相关引用列。因此,内部选择表达式的判断与外部选择表达式的当前行相关联。
例如,检索客户的姓名和城市,这些客户的订单总数大于该城市中所有客户订单的平均数。
Select CurCust.Name,CurCust.ShipCity From Customer As CurCust
Where Exists(select * from Sale As BigSale
Where BigSale.CustId=CurCust.CustId
And BigSale.TotalAmt>(Select Avg(AvgSale.totalAmt)
From Customer As AvgCust,Sale As AvgSale
Where AvgCust.CustId=AvgSale.CustId
And AvgCust.ShipCity=CurCust.ShipCity))
例:在学生表Xs(xh,xm,city)和选修表xx(xh,kh,cj)中选出各个地区的优秀学生(成绩CJ大于所在地区的平均成绩)。
Select xm,city From Xs As CurXs
Where Exists(select * from xx As BigXX
Where Bigxx.xh=CurXs.xh
And BigXX.Cj>(Select Avg(AvgXX.Cj)
From Xs As AvgXs,XX As AvgXX
Where AvgXs.xh=AvgXX.xh And AvgXs.City=CurXs.City)
)
或
Select xm,city
From Xs,XX,
(Select City,Avg(Cj) AS PjCJ From Xs,XX Where Xs.xh=XX.xh Groug By City) As CityAvg
Where Xs.xh=XX.xh And Xs.City= CityAvg.City And XX.CJ> CityAvg.PJCj
Select 的分组字句
Group by 字句
Group By 从字面意义上理解就是根据 By 指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
可以使用 Group By子句将合计函数应用到所选行的子组中。但是得注意的是 Group by 后面的参数名需为结果中有输出的字段。
**Group By**语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在 **Select** 中则必须包含在聚合函数中,常见的聚合函数如下表:
函数 | 作用 | 支持性 |
---|---|---|
sum(列名) | 求和 | |
max(列名) | 最大值 | |
min(列名) | 最小值 | |
avg(列名) | 平均值 | |
first(列名) | 第一条记录 | 仅Access支持 |
last(列名) | 最后一条记录 | 仅Access支持 |
count(列名) | 统计记录数 | 注意和count(*)的区别 |
--示例:求各组平均值
select 类别, avg(数量) AS 平均值 from A group by 类别;
--示例:求各组记录数目
select 类别, count(*) AS 记录数 from A group by 类别;
例:查询每个订单ID的订单数,平均折扣和总金额。
Select 订单ID,Count(订单ID) 单数,Avg(折扣) 平均折扣,sum(单价*数量) 总金额
From 订单明细 where 订单ID<10251 Group By 订单ID order By 订单ID
例:求各地区学生人数、平均成绩、总分、最高分、最低分。
Select City,Count(*) as 人数,Avg(cj) as 平均,Sum(cj)as 总分,
Max(cj) as 最高分,Min(cj) as 最低分From stu Group By City;
--结果:
City 人数 平均 总分 最高分 最低分
---------- ----------- ----------- ----------- ----------- -----------
福州 1 87 87 87 87
泉州 7 52 365 73 45
三明 2 75 150 83 67
为了使每一个组合值有一行,即使是那些组中没有行的组,也可在Group By关键字之后使用ALL关键字。
使用ALL关键字使不满足条件的行都能显示出来,但合计函数的值为0或NULL。
Having 字句
子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用 Having 条件过滤出特定的组,也可以使用多个分组标准进行分组,进一步限制结果表中的行。
示例:
select 类别, sum(数量) as 数量之和 from A
group by 类别
having sum(数量) > 18
示例:**Having **和 Where 的联合使用方法
select 类别, SUM(数量)from A
where 数量 > 8
group by 类别
having SUM(数量) > 10
例如,用 Having 子句限定检索平均折扣率大于0.05的记录:
Select 订单ID,Count(订单ID) As 单数,Avg(折扣) As 平均折扣,sum(单价*数量) As 总金额
From 订单明细 where 订单ID<10251 Group By 订单ID Having Avg(折扣)>0.05 order By 订单ID
例:求地区平均成绩大于总平均成绩的各地区学生人数、平均成绩、总分、最高分、最低分。
Select City,Count(*) as 人数,Avg(cj) as 平均,Sum(cj)as 总分,
Max(cj) as 最高分,Min(cj) as 最低分 From stu
Group By City Having Avg(cj)>(Select Avg(cj) From stu);
City 人数 平均 总分 最高分 最低分
---------- ----------- ----------- ----------- ----------- -----------
福州 1 87 87 87 87
三明 2 75 150 83 67
例:求学生成绩大于总平均成绩且地区平均成绩大于总平均成绩的各地区学生人数、平均成绩、总分、最高分、最低分。
Select City,Count(*) as 人数,Avg(cj) as 平均,Sum(cj)as 总分,
Max(cj) as 最高分,Min(cj) as 最低分 From stu
Where cj>(Select Avg(cj) From stu)
Group By City Having Avg(cj)>(Select Avg(cj) From stu);
City 人数 平均 总分 最高分 最低分
---------- ----------- ----------- ----------- ----------- -----------
福州 1 87 87 87 87
泉州 1 73 73 73 73
三明 2 75 150 83 67
Order By子句(Asc/Desc)
使用order By子句,可以在select语句的结果表显示或者返回到程序之前排列顺序。order By子句使用升序或者降序(使用关键字Desc)指定一组列。对于某个在结果表中无名称的列(由表达式或函数指定并且没有别名),可以使用一个相对列号来代替列名,指定使用无名称的列对行排列顺序。
Select City,Count(*) as 人数,Avg(cj) as 平均,Sum(cj)as 总分,
Max(cj) as 最高分,Min(cj) as 最低分 From stu
Where cj>(Select Avg(cj) From stu)
Group By City
Having Avg(cj)>(Select Avg(cj) From stu)
Order By Avg(cj) Desc;
City 人数 平均 总分 最高分 最低分
---------- ----------- ----------- ----------- ----------- -----------
福州 1 87 87 87 87
三明 2 75 150 83 67
泉州 1 73 73 73 73
Select * From stu Order By cj Desc,XH ASC;
xh xm cj City
----------- -------- ----------- ----------
2 abcd 87 福州
3 acd 83 三明
4 abc 73 泉州
1 ABCD 67 三明
5 ABC 56 泉州
7 C 56 泉州
6 ACD 45 泉州
8 A 45 泉州
9 b 45 泉州
10 _abc 45 泉州
例:查询成绩前三名学生信息。
Select Top 3 * From Stu Order By CJ Desc;
xh xm cj City
----------- -------- ----------- ----------
2 abcd 87 福州
3 acd 83 三明
4 abc 73 泉州
例:查询成绩前5名学生信息(若第6名成绩同第5名,则第6名进为第5名)。
Select Top 5 * From Stu Order By CJ Desc;
xh xm cj City
----------- -------- ----------- ----------
2 abcd 87 福州
3 acd 83 三明
4 abc 73 泉州
1 ABCD 67 三明
5 ABC 56 泉州
Select Top 5 With Ties * From Stu Order By CJ Desc;
xh xm cj City
----------- -------- ----------- ----------
2 abcd 87 福州
3 acd 83 三明
4 abc 73 泉州
1 ABCD 67 三明
5 ABC 56 泉州
7 C 56 泉州
例:查询成绩前70%的学生信息(70%位置成绩相同的,进入70%)。
Select Top 70 Percent * From Stu Order By CJ Desc;
xh xm cj City
----------- -------- ----------- ----------
2 abcd 87 福州
3 acd 83 三明
4 abc 73 泉州
1 ABCD 67 三明
5 ABC 56 泉州
7 C 56 泉州
8 A 45 泉州
Select Top 70 Percent With Ties * From Stu Order By CJ Desc;
xh xm cj City
----------- -------- ----------- ----------
2 abcd 87 福州
3 acd 83 三明
4 abc 73 泉州
1 ABCD 67 三明
5 ABC 56 泉州
7 C 56 泉州
8 A 45 泉州
9 b 45 泉州
10 _abc 45 泉州
6 ACD 45 泉州
复杂的 Select 语句
使用联接(From子句指定多个表)
通过联接,可以根据各个表之间的逻辑关系从两个或多个表中检索数据。联接表示SQL应如何使用一个表中的数据来选择另一个表中的行。
联接条件通过以下方法定义两个表在查询中的关联方式:
① 指定每个表中要用于联接的列。典型的联接条件在一个表中指定外键,在另一个表中指定与其关联的键。
② 指定比较列的值时要使用的逻辑运算符=、<>等。
联接条件可在From或Where子句中指定,建议在From子句中指定联接条件。Where和Having子句也可以包含搜索条件,以进一步筛选条件所选的行。From子句中最多可以列出256个表和视图。在From子句中列出的多个表或者视图,执行Select语句时就好象只指定了一个表。
Drop Table xx;
Drop Table xs;
Drop Table C;
Create Table xs(xh int primary key,xm varchar(12));
Create Table C(kh int primary key,km varchar(12));
Create Table xx(xh int,kh int,CJ Float,Constraint PK_XHKH primary key(XH,KH));
Insert Into xs Values(1,'AAA');
Insert Into xs Values(2,'BBB');
Insert Into xs Values(3,'CCC');
Insert Into C Values(1001,'C语言');
Insert Into C Values(1002,'C++');
Insert Into C Values(1003,'VB');
Insert Into C Values(1004,'数据结构');
Insert Into XX Values(1,1001,80);
Insert Into XX Values(1,1003,70);
Insert Into XX Values(2,1002,90);
Insert Into XX Values(2,1003,75);
Select * From xx;
XH KH CJ
---------- ---------- ----------
1 1001 80
1 1003 70
2 1002 90
2 1003 75
Select XS.XH,xm,C.KH,km,CJ From XS,xx,C Where XS.XH=xx.XH and XX.KH=C.KH;
XH xm KH km CJ
----------- ------------ ----------- ------------ ----------------------
1 AAA 1001 C语言 80
1 AAA 1003 VB 70
2 BBB 1002 C++ 90
2 BBB 1003 VB 75
Select XH,(Select xm From xs Where XS.XH=xx.XH)as xm,
KH,(Select km From C Where C.KH=xx.KH)as km,CJ From xx;
XH xm KH km CJ
----------- ------------ ----------- ------------ ----------------------
1 AAA 1001 C语言 80
1 AAA 1003 VB 70
2 BBB 1002 C++ 90
2 BBB 1003 VB 75
联接可分为以下几类:
内联接[Inner] Join
包括相等联接和自然联接。内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
外联接
外联接可以是左向外联接、右向外联接或完整外部联接。在From子句中指定外联接时,可以由下列几组关键字中的一组指定:
Left Join或Left Outer Join
左向外联接的结果集包括Left Outer子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
Right Join或Right Outer Join
右向外联接的结果集包括Right Outer子句中指定的右表的所有行,而不仅仅是联接列所匹配的行。如果右表的某行在左表中没有匹配行,则在相关联的结果集行中左表的所有选择列表列均为空值。
Full Join或Full Outer Join
完整外联接左表和右表的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基本表的数据值。
交叉联接Cross Join
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。该表有指定表中的全部列和这些表中所有行的可能组合。
-
使用内联接
使用比较运算符比较要联接列的值的联接
在SQL-92标准中,内联接可在From或where子句中指定。这是where子句中惟一一种SQL-92支持的联接类型。它返回两个表中的所有列,但只返回在联接列中具有相等值的行。
Use pubs Select * from authors As a Inner join publishers As p On a.city=p.city Order by a.au_lname Desc,a.au_fname Asc --作为改进,消除重复列,可改为: Use pubs Select p.pub_id,p.pub_name,p.state,a.* from authors As a inner join publishers As p On a.city=p.city Order by a.au_lname Desc,a.au_fname Asc Select xs.XH,xm,C.KH,km,CJ From XS Inner Join xx On XS.XH=xx.XH Inner Join C On C.kh=xx.kh; XH xm KH km CJ ----------- ------------ ----------- ------------ ---------------------- 1 AAA 1001 C语言 80 1 AAA 1003 VB 70 2 BBB 1002 C++ 90 2 BBB 1003 VB 75
使用等号以外的运算符的联接
也可以联接两个不相等的列中的值。用于内联接的运算符和谓词同样也可用于不相等联接。
例1: 用ABCDE五个字母代表五个人当选班长、书记、学委三个职务(不兼职),有多少种可能的情况(60种)
Create Table L(C char(1)); Insert Into L Values('A'); Insert Into L Values('B'); Insert Into L Values('C'); Insert Into L Values('D'); Insert Into L Values('E'); Select L1.C+L2.C+L3.C ZH From L as L1 Join L as L2 ON L1.C<>L2.C Join L as L3 ON L1.C<>L3.C and L2.C<>L3.C Order By ZH; 或 Select L1.C+L2.C+L3.C ZH From L L1,L L2,L L3 where L1.C<>L2.C and L1.C<>L3.C and L2.C<>L3.C Order By ZH; ZH ---- ABC ABD ABE ACB ACD ACE ADB ADC ADE AEB AEC AED BAC BAD BAE BCA BCD BCE BDA BDC BDE BEA BEC BED CAB CAD CAE CBA CBD CBE CDA CDB CDE CEA CEB CED DAB DAC DAE DBA DBC DBE DCA DCB DCE DEA DEB DEC EAB EAC EAD EBA EBC EBD
例2:用ABCDE五个字母代表五个人任选三个人参加劳动(不考虑参加顺序),有多少种可能的情况(10种)(显示时字母必须从小到大)。
Select L1.C+L2.C+L3.C ZH From L L1 Join L L2 ON L1.C
例2:用ABCDE五个字母代表五个人参加三个会议(允许一个参加多个会议),有多少种可能的情况(125种)。
Select L1.C+L2.C+L3.C ZH From L L1 Cross Join L L2 Cross Join L L3 Order By ZH; 或 Select L1.C+L2.C+L3.C ZH From L L1,L L2,L L3 Order By ZH; --求同一天生日者 select a.xh,a.xm,b.xh,b.xm,a.cs from xs as a join xs as b on a.xh>b.xh and day(a.cs)=day(b.cs) and month(a.cs)=month(b.cs) --不能用a.cs=b.cs,这表示同一天出生 --求5号同学生日之后生日的同学及生日,如5月1日取值501 select xh,xm,cs from xs where month(cs)*100+day(cs)> month((select cs from xs where xh='5'))*100+ day((select cs from xs where xh='5'))
-
使用外联接
使用左向外联接
例:xs(xh,xm),xx(xh,kh,cj),kc(kh,km) 使用左向外联接
xs表:
Xh xm 02101 张三 02102 李四 02103 王五 02104 陈七 Xx表
Xh kh cj 02101 201 80.0 02101 202 60.0 02102 201 90.0 02102 202 80.0 Kc表
xh kh 201 SQL 202 FOX 203 BASIC 使用如下语句左向外联接:
select xs.xh,xm,c.KH,km,xx.cj from xs left join xx on xs.xh=xx.xh left join c on xx.kh=c.kh xh xm KH km cj ----------- ------------ ----------- ------------ ---------------------- 1 AAA 1001 C语言 80 1 AAA 1003 VB 70 2 BBB 1002 C++ 90 2 BBB 1003 VB 75 3 CCC NULL NULL NULL
使用右向外联接
使用如下语句右向外联接:
select xs.xh,xm,c.KH,km,xx.cj from xs right join xx on xs.xh=xx.xh right join c on xx.kh=c.kh xh xm KH km cj ----------- ------------ ----------- ------------ ---------------------- 1 AAA 1001 C语言 80 2 BBB 1002 C++ 90 1 AAA 1003 VB 70 2 BBB 1003 VB 75 NULL NULL 1004 数据结构 NULL
使用完整外联接
使用如下语句完整外联接:
select xs.xh,xm,c.KH,km,xx.cj from xs full join xx on xs.xh=xx.xh full join c on xx.kh=c.kh xh xm KH km cj ----------- ------------ ----------- ------------ ---------------------- 1 AAA 1001 C语言 80 1 AAA 1003 VB 70 2 BBB 1002 C++ 90 2 BBB 1003 VB 75 3 CCC NULL NULL NULL NULL NULL 1004 数据结构 NULL
Union 关键字
Union运算符使你得以将两个或多个Select语句的结果组合成一个结果集。使用Union组合的结果都必须具有相同的结构。而且它们的列数必须相同,并且相应的结果集列的数据类型兼容。
例如:Table1和Table2具有相同的两列结构:
Table1
CA | CB |
---|---|
A | 1 |
B | 2 |
C | 3 |
Table2
CC | CD |
---|---|
C | 3 |
D | 4 |
E | 5 |
执行如下运算:
Select * From Table1
union
Select * From Table2
结果集如下:
CA | CB |
---|---|
A | 1 |
B | 2 |
C | 3 |
D | 4 |
E | 5 |
Union的结果集列名与Union运算符中第一个Select语句的结果集中的列名相同。第二个Select语句的列名被忽略。
如果使用Union All,在结果表中将包括冗余行。
如:
select * from table1
union All
select * from table2
结果集如下:
CA | CB |
---|---|
A | 1 |
B | 2 |
C | 3 |
C | 3 |
D | 4 |
E | 5 |
Intersect实现多表交集查询(AND运算)
Select xh,xm From xs where xh<=2
Intersect
Select xh,xm From xs where xh>=2;
XH XM
----- ------
2 BBB
Except 实现多表差集查询(差运算)
Select xh,xm From xs where xh<=2
Except ---Oracle用Minus
Select xh,xm From xs where xh>=2;
XH XM
----- -----
1 AAA
Select的其他用法
使用Case表达式
SQL提供了一种Case结构,可以有条件地返回一个值。其结构的形式如下:
Case
When 条件 then 结果
When 条件 then 结果
……
Else 结果
End
--或使用Case结构的快捷形式:
Case Expression
When Exp1 then result_expression1
When Exp2 then result_expression2
……
Else result_expression
End
Group子句的Rollup和Cube选项
提供合并详细行和汇总信息,在同一个查询中提供一种获取多层汇总信息。
Compute子句
提供一种分类汇总功能。
Into子句
允许Select语句检索到的行创建一个新表。新表的名称由Into子句指定,Into子句紧跟在Select列项之后:
Select * Into CutomerSeatle From Cutomer where ShipCity=’Seatle’