美文网首页
2019-10-17

2019-10-17

作者: 墨陵玥 | 来源:发表于2019-10-17 00:37 被阅读0次

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

    ​ 选择表达式的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

    操作符 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

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

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

      使用左向外联接

      ​ 例: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’
    

    相关文章

      网友评论

          本文标题:2019-10-17

          本文链接:https://www.haomeiwen.com/subject/yhipmctx.html