Select 查询

SQL 查询

指定要检索的列

在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 的条件语句

​ 选择表达式的wherehaving子句有一个搜索条件,包含了一个简单的条件,或者由and或者or连接的多个简单条件。其判断的结果的三个:真、假或者空。SQL有好几种条件,包括BasicNULLBetween,In,Like,ExistsQuantified

​ 注意:Text,NtextImage数据类型只能用在Like条件中和允许使用TextImage参数的函数。TextImage数据类型不能用在子查询的选择列表中。

基本条件

​ 基本条件使用下面列出的比较运算符来比较两个值:

​ 等于 :=

​ 不等于: **<>**或!=

​ 大于: <

​ 不大于: <=或!>

​ 不小于: >=或!<

​ 小于: >

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] numberbeginIdex 表示从什么位置开始结果,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

操作符 BETWEENAND 是两个不等值测试的方法,会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

如需以字母顺序显示介于 “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

交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。该表有指定表中的全部列和这些表中所有行的可能组合。

  1. 使用内联接

    使用比较运算符比较要联接列的值的联接

    ​ 在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<L2.C
     Join L 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
    ACD
    ACE
    ADE
    BCD
    BCE
    BDE
    CDE
    

    ​ 例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'))
    
  2. 使用外联接

    使用左向外联接

    ​ 例:xs(xh,xm),xx(xh,kh,cj),kc(kh,km) 使用左向外联接

    ​ xs表:

    Xhxm
    02101张三
    02102李四
    02103王五
    02104陈七

    ​ Xx表

    Xhkhcj
    0210120180.0
    0210120260.0
    0210220190.0
    0210220280.0

    ​ Kc表

    xhkh
    201SQL
    202FOX
    203BASIC

    使用如下语句左向外联接:

    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

CACB
A1
B2
C3

Table2

CCCD
C3
D4
E5

执行如下运算:

Select * From Table1
 union
Select * From Table2

结果集如下:

CACB
A1
B2
C3
D4
E5

Union的结果集列名与Union运算符中第一个Select语句的结果集中的列名相同。第二个Select语句的列名被忽略。

如果使用Union All,在结果表中将包括冗余行。

如:

select * from table1
 union All
select * from table2

结果集如下:

CACB
A1
B2
C3
C3
D4
E5

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’
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值