zoukankan      html  css  js  c++  java
  • SQL必知必会笔记(1)

    • 去SQL AXDB 中Query数据

    Open the SQL > Connect > Select AXDB > new Query

    select REFID, ITEMID, REQDATE, ACTIONDATE, ACTIONDAYS, FUTURESDATE from REQTRANS where REFID = 'PRD_00005230'

    查询命令的模板“Select * (or columns 中间用,隔开)”from "Table " where "条件"

    Set transaction isolation level read uncommitted

    在X++中对数据库表里面的数据所做的操作(eg)

       ttsBegin;

        //select forUpdate vendorList where vendorList.ItemId == purchLineItemNoCheckVendOk.ItemId;

        //vendorList.PdsApprovedVendor = #VendBad;

        //vendorList.Update();

        delete_from vendorList where vendorList.PdsApprovedVendor == #Vend;

        result = avl.check();

        this.assertEquals(PdsVendorCheckResult::NotAllowed, result, 'Test_1');

        ttsAbort;

    Select locationType, inputLocation, from WMSLocation

    Add ttsbegin/ttscommit/ttsabort 来进行事务处理,保证数据库不包括不完整的操作结果。

    Ttsbegin-------开始事务处理,

    Ttscommit----提交事务处理

    Ttsabort-------回滚事务处理

    /****** Script for SelectTopNRows command from SSMS  ******/

    SELECT WORKER, PROFILEDATE, PaySpecType, PAYCOSTTYPE, PaySeconds, Price, *

      FROM [AXDB].[dbo].[JMGPAYEVENTS]

      where PAYCOSTTYPE = '1201'

      and PAYSPECTYPE = 0

      --WORKER = '5637145188'

       order by RECID desc

     

    1. Some query statement: 

      检索一列: Select A from TableA;

      检索多列: Select A,B,C from TableA;

      检索所有列:Select * from TableA;

      检索只有不同的列,可以使用关键字“Distinct”: select distinct A from TableA;

      要限制一定数量的行(在SQL Server And Access中使用),可以使用关键字”Top“来实现: Select Top 5 A from TableA;

    2. 注释: -- 之后的文本是注释

    在一行的开头用 #, 这一整行都是注释

    使用 /*  */ 表示整段都是注释

    3. 对检索内容进行排序:

    (单个)Select A from TableA order by A(Order by必须要放在select语句中的最后一条子句)

    (多个)Select A,B,C from TableA order by A, B, C

    除了能用列名指出排序顺序之外,Order by 还支持按相对列位置进行排序:Select A,B,C from TableA order by 2, 3(= order by B,C)

    指定关键字”DESC“则查询结果可以按降序排序: Select A,B,C from TableA order by A DESC;

    DESC 关键字只作用于直接位于其前面的那个列名,后面可以加其他的列名来排列,但DESC不作用于此。(升序是默认的,所以一般不指定就是升序排序的)要是想要按多列降序排列,就必须要在每一个列名前面添加关键字”DESC“。

    4. 过滤数据:

    相等检验: Select prod_name, prod_price from Products where prod_price = 3.49;

    操作符

    说 明

    =

    等于

    < >

    不等于

    !=

    不等于

    小于

    <=

    小于等于

    !<

    不小于

    大于

    >=

    大于等于

    !>

    不大于

    BETWEEN

    在指定的两个值之间

    IS NULL

    为NULL值

    注:在比较的时候,如果将值与字符串类型的列来进行比较,就需要限定引号,而如果用来与数值列进行比较就不需要使用引号。

    PS: where 子句的位置在同时使用Order by 和 Where 子句的时候,应该让order by 位于 where之后,否则将会产生错误!

    范围值检查

    使用”between“关键字,eg: Select prod_name,prod_price from Products where prod_price BETWEEN 5 and 10;

    空值检查

    NULL(no value) 与字段包含0、空字符串或仅仅包含空格不同。

    Select prod_name from Products where prod_price is NULL;//返回所有没有价格的产品(不是价格为0的产品)

    5. 高级数据过滤

    SQL允许给出多个WHERE子句,即用AND 或OR子句来连接。

    Eg: SELECT prod_id, prod_price, peod_name from Products WHERE vend_id = 'DLL01' AND prod_price <= 4;

     SELECT prod_id, prod_price, peod_name from Products WHERE vend_id = 'DLL01' OR prod_price <= 4;

    Ps:在SQL语言中,SQL在处理OR操作符前,优先处理AND操作符,寄AND操作符的优先级比OR操作符的优先级高,要是想先处理OR操作符,就要用圆括号对操作符进行明确分组。

    Like: SELECT prod_name, prod_price FROM Products WHERE (vend_id = "DLL01" OR vend_id = 'BRS01') AND prod_price >=10;

    @ IN 操作符:(IN 操作符和OR的功能是一样的!!!)

    用来指定条件范围,范围中的每个条件都可以进行匹配 。IN取一组由逗号分隔,括在圆括号中的合法值。

    Like: SELECT prod_name, prod_price FROM Products WHERE vend_id IN ('DLL01', 'BRS01') ORDER BY prod_name;

    Thinking:既然IN和OR的功能一样,为什么还要使用IN操作符呢?

                         其优点是: 在有很多合法选项时,IN操作符的语法更清楚,更直观,在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理,而且IN操作符一般比一组OR操作符执行的更快。IN的最大优点是可以包含其他SELECT语句,能够更动态的建立WHERE子句。

    @NOT操作符:(功能和 <> 一样)

    NOT操作符有且只有一个功能,即否定其后所跟的任何条件。

    Eg: SELECT prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name;

    PS: 前面所有的操作符都是针对已知值进行过滤的。

    6. 用通配符进行过滤

    @LIKE:

    通配符(Wildcard):用来匹配值的一部分的特殊字符

    搜索模式(Search pattern):由字面值、通配符或者两者结合构成的搜索条件。

    谓词(Predicate)操作符在作为谓词的时候就不是操作符?!(什么鬼?!!?)

    通配符搜索只能用于文本字段(串),非文本数据类型字段不能使用通配符搜索。

    @百分号(%)通配符:%表示任何字符出现的任意次数。

    Eg: 为了找出所有以词Fish起头的产品,可发布以下SELECT语句:SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE ‘Fish%’;

    注:区分大小写

    Or SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE ‘%bean bag%’;

    %通配符代表的搜索模式中给定位置的0个、1个或多个字符。

    @下划线(_)通配符

    下划线的用途和%一样,但它只匹配单个字符,而不是多个字符。(要是使用Microsoft Access,需要使用?而不是 _).

    @方括号([ ])通配符:

    必须要匹配指定位置(通配符的位置)的一个字符:

    PS:只有微软的Access 和 SQL Server支持集合。

    Eg: 找出所有名字以J或M开头的联系人: SELECT cust_contact FROM Customers WHERE cust_contact LIKE '[JM]%' ORDRR BY cust_contact;

    如果要找出所有名字不以J或M开头的联系人: SELECT cust_contact FROM Customers WHERE cust_contact LIKE '[^JM]%' ORDRR BY cust_contact;

    总结:使用通配符的技巧:

    (1)不要过度的使用通配符,要是其他的操作符可以达到相同的目的就尽量不要使用通配符,而是使用其他的操作符;

    (2)在确实需要通配符的地方,也尽量不要把他们放在搜索模式的开始处,若放在开始处,搜索起来是最慢的。

    7. 创建计算字段

    1 计算字段并不是实际存在于数据库表中的,而是在运行时在SELECT语句内创建的。

    Ps:虽然在SQL语句中可完成的许多转换和格式化工作可以直接在客户端应用程序中完成,但一般来说,要是在数据库服务器上完成这些操作的话比在客户端完成要快很多。

    2 拼接字段

    拼接(concatenate),即将值联结到一起构成单个的值,也就是说把两个列拼接起来。Like: Vendors 表包含供应商名和地址信息,如果要生成一个供应商报表的话,需要在格式化的名称中列出供应商的位置,该报表需要一个值,而表中的数据存储在两个列vend_name和vend_country中,此外,还需要用括号将vend_country 括起来,这些东西没有存储在数据库表中。所以要怎么表示呢?

    此时,可以使用操作符加号(+)或者两个竖杠(||)

    在Access 和 SQL Server中使用+号,在DB2、Oracle、PostgreSQL、SQLite中一般使用 || .

    别名:(AS)Select Rtrim(vend_name) + '(' + Rtrim(vend_country) + ')' AS vend_title From Vendors Order by Vend_name;

    // RTRIM( )是一个函数,用于去掉字符串串尾的空格。

    注:别名可用可不用,但最好使用,但是,别名还有其他的用途,常见的包括在实际的表列名包含不合法的字符(如空格)的时候重新命名它, 在原来的名字容易被误解的时候扩充它。但是,需要注意的是,别名可以是一个单词,也可以是一个字符串,但当别名是字符串的时候,最好将多个单词重命名为一个单词的名字去使用。

    3 执行算术计算

    Eg: Select prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM OrderItems WHERE order_num = 20008;

    1. 使用数据处理函数

    函数一般是在数据上执行的,为数据的转换和处理提供方便。

    eg: 一些函数: (1)提取字符串的组成部分: SUBSTRING( ); //Mysql and Sql Server 使用;

            (2)数据类型转换: Convert( ); //Mysql and Sql Server中使用;

            (3)获取当前日期: Mysql 中使用Curdate( ); Sql Server 中使用 GetDate( )方法;

    1) 文本处理函数(Upper( )函数将文本转换为大写)

    Select vend_name,Upper(vend_name)AS vend_name_upcase from Vendors Order by vend_name;

    其他的一些函数: a. Length( );//返回字符串的长度;

        b. Lower( );//将字符串转换为小写;

        c. LTRIM ( ); // 去掉字符串左边的空格;

       d. RTRIM( );// 去掉字符串右边的空格;

       e. RIGHT( );//返回字符串右边的字符;

       f. Soundex( ); // 返回字符串的Soundex值;

    其中,Soundex( )是一个将任何文本串转换为描述其语音表示的字母模式的算法。Soundex考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。

    Eg: Select cust_name, cust_contact From Customers Where SOUNDEX(cust_contact) = SOUNDEX('Michael Green');

    2)日期和时间处理函数

    Eg: 在SQL Server中检索2012年的所有订单:

        Select order_num From Orders Where DATEPART(yy, order_date) = 2012;

    3) 数值处理函数(在主要的DBMS的函数中,数值函数是最一致,最统一的函数)

    常用的数值处理函数有:

    a.   ABS( ) : 返回一个数的绝对值

     

        
           
      1. COS( ): 返回一个角的余弦
      2.    
      3. EXP( ): 返回一个数的指数值
      4.    
      5. PI ( ): 返回圆周率
      6.    
      7. SIN ( ): 返回一个角度的正弦
      8.    
      9. SQRT( ): 返回一个数的平方根
      10.    
      11. TAN ( ): 返回一个角度的正弦切
      12.   

     

    1. 汇总数据

    1)聚集函数(aggregate function):对某些行运行的函数,计算并返回一个值。

    SQL中的聚集函数:

    函数

    说明

    AVG( )

    返回某列的平均值

    COUNT()

    返回某列的行数

    MAX()

    返回某列的最大值

    MIN()

    返回某列的最小值

    SUM()

    返回某列值的总和

    1. AVG( )函数

    AVG()通过对表中的行数计数,并计算其列值之和,求得该列的平均值。可用来返回所有列的平均值,也可以返回特定列或者行的平均值。

    Eg: 用AVG()返回Products表中的所有产品的平均价格:

    Select AVG( prod_price ) AS avg_price From Products;

    Eg: 用AVG()来确定特定的列或者行的平均值,如返回特定供应商所提供的产品的平均价格:

    Select AVG(prod_price)AS avg_price From Products Where vend_id = ‘ DLL01’;

    警告:AVG( )函数只能用于单独列的平均值,如果想要得到多个列的平均值必须要用多个AVG()函数来求取!

    1. Count( )函数

    可利用Count( )确定表中行的数目或符合特定条件的行的数目。

    Count()函数有两种使用方式: 使用Count(*)对表中的行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。使用Count(column)对特定列中具有值的行数进行计数,而忽略NULL值。

    Eg: 返回Customers表中的顾客的总数:

    Select Count(*) As Num_count from Customers;

    Select Count(cust_email) AS Num_count from Customers;

    c)    MAX( )函数

    返回列中的最大值,

    eg: Select MAX(prod_price) AS max_price From Products;

    有些DBMS允许它用来返回任意列中的最大值,但在用于文本数据时,MAX()返回按该列排序后的最后一行。且 MAX()函数忽略列值为NULL的行。

    d) MIN( ) 函数

    MIN()函数跟MAX()函数的功能刚好相反。同时,在用于文本数据时,MIN()返回该列排序后最前面的行。同样会忽略列值为NULL的行。

    e) SUM( )函数

    SUM()用来返回指定列值的和(总计)。

    Eg: Select SUM(quantity) AS items_ordered From OrderItems Where order_num = 20003;//统计order_num 是20003的所有订单数量;

    Select SUM(item_price * quantity) as item_total From OrderItems Where order_num = 20003;//统计order_num 是20003的所有订单的价格;

     注:对于以上5个函数,可以使用参数ALL 和 DISTINCT,其中ALL是默认的,但可以指定DISTINCT参数,即使操作只包含不同的值。

    但在Microsoft Access中不支持DISTINCT参数。

    Eg: Select AVG(DISTINCT prod_price) AS avg_price From Products Where vend_id = 'DLL01';

    警告:DISTINCT不能用于COUNT(*),同样,DISTINCT必须使用列名, 不能用于计算或者表达式。

    同时,聚集函数还可以同时多个一起使用,中间用,隔开。

       10.  分组数据

    使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。

    分组是使用Select语句的GROUP BY子句建立的。

    E.g.: Select vend_id, COUNT(*) AS num_prods From Products GROUP BY vend_id; // 返回每个产品供应商提供的产品数量;

    Select  Count(*) AS num_prods From Products Where vend_id =  'DLL01';//只返回id为"DLL01"的产品供应商提供的产品数量;

    使用GROUP BY子句时,需要注意的一些规定:

    (1)GROUP BY子句可以包含任意数目的列,所以可以对分组进行嵌套,更细致地进行数据分组;

    (2)若在GROUP BY 子句中嵌套分组,数据将在最后指定的分组上进行汇总。即,在建立分组时,指定的所有列都一起计算,而不能从个别的列取回数据。

    (3)GROUP BY子句中列出的每一列都必须是检索列或者有效的表达式(不能是聚集函数)。如果在Select中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名。

    (4)大多数的SQL实现不允许GROUP BY列带有长度可变的数据类型;

    GROUP BY and Order By 经常完成相同的工作,但他们又非常不同, 下面是他们之间的差别:

    ORDER BY

    GROUP BY

    对产生的输出排序

    对行分组,但输出可能不是分组的顺序

    任意列都可以使用(甚至非选择的列也可以使用)

    只可能使用选择列或表达式列,而且必须使用每个选择列表达式

    不一定需要

    如果与聚集函数一起使用列(或表达式),则必须使用

    他们也可以同时使用:

    Eg: Select order_num, COUNT(*) AS items From OrderItems GROUP BY order_num Having COUNT(*)>=3

    Order by items, order_num;

    Select 子句及其顺序:

    子  句

    说  明

    是否必须使用

    SELECT

    要返回的列或表达式

    FROM

    从中检索数据的表

    仅在从表选择数据时使用

    WHERE

    行级过滤

    GROUP BY

    分组说明

    仅在按组计算聚集时使用

    HAVING

    组级过滤

    ORDER BY

    输出排序顺序

     

    11. 子查询(subquery)

    即嵌套在其他查询中的查询。

    1. 利用子查询进行过滤

    Eg: 如果需要列出购物品RGAN01的所有顾客,要进行检索的话,需要做以下三步:

    (1)先检索包含RGAN01的所有订单编号;

    (2)检索所有订单编号中的顾客ID;

    (3)检索以上返回的所有顾客ID中的顾客信息。

    单独查询语句:

    a. SELECT order_num FROM OrdersItems WHERE prod_id = 'RGAN01';(Output: 20007,20008)

    b. Select cust_id From Orders Where order_num  IN (20007,20008); (Output: 100000004,10000005)

    c. Select cust_Name, cust_contact From Customers Where cust_id IN ('10000004','10000005');

    现在使用子查询来进行查询, 一般情况下,子查询是遵循从里往外的方式进行查询的:

    Select cust_Name, cust_contact From Customers Where cust_id IN (Select cust_id From Orders Where order_num  IN(SELECT order_num FROM OrdersItems WHERE prod_id = 'RGAN01'));

    在学完联结后,你会发现,子查询也可以用联结来表示:

    SELECT cust_name, cust_contact FROM Customers, Orders, OrdersItems WHERE Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Order.order_num AND prod_id = 'RGAN01';

    But,在实际使用过程中由于性能的限制,不能嵌套太多的自查询,只能是单列作为子查询的Select语句只能查询单个列。

    2. 作为计算字段使用子查询

    Eg: 假如需要显示Customers表中的每个顾客的订单总数,订单与相应的顾客ID存储在Orders表中,执行这个操作需要下面的步骤:

    (1)从Customers表中检索顾客列表;

    (2)对于检索出来的每个客户,统计其在Order表中的所有订单。(要统计所有订单就要使用到SELECT COUNT(*))

    SELECT cust_name, cust_state, (SELECT COUNT(*) FROM Orders Where Orders.cust_id = Customers,cust_id) AS orders FROM Customers Orders by cust_name;

    12. 联结表(join)

    可伸缩(scale):能够适应不断增加的工作量而不失败,设计良好的数据库或者应用程序称为可伸缩性好(Scale Well)。

    1. 为什么使用联结

    联结是一种机制,用来在一条Select语句中关联表,因此称为联结。

    使用联结可以更清晰的将分别存储在不同表中却相关联的数据使用一条Select语句查询得到。(比如说供应商表单和产品表单之间的关联是供应商id(主键))。

    2. 创建联结

    补充: 完全限定列名:有时候,相同的字段代表的列名会出现在不同但却相关的两个表中,为了在使用时区分它们,就要使用完全限定列名(Vendors.vend_id & Products.vend_id)

    创建联结的语句:

    Select vend_name,prod_name,prod_price FROM Vendors,Products WHERE Vendors.vend_id = Products.vend_id;

    // 其中,vend_name在表Vendors里,而prod_name, prod_price在表Products中,而两个表中的联结就是vend_id。

    笛卡儿积:由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行数是第一个表的行数乘以第二个表中的行数。有时候,返回笛卡尔积的联结,又称为叉联结(cross join)。

    3. 内联结

    目前为止使用的联结称为等值联结(equijoin),它基于两个表之间的相等测试,这种联结也成为内联结(inner join)

    所以刚才创建的联结,还可以用下面的格式来表示:

    SELECT vend_name,prod_name, prod_price FROM Vendors INNER JOIN Products ON Vendors.vend_id = Products.vend_id;

    4.联结多个表

    Eg: SELECT prod_name, prod_price,vend_id, quantity FROM OrderItems, Products, Vendors WHERE Products.vend_id = Vendors.vend_id AND OrderItems.prod_id = Products.prod_id AND order_num = 20007;

    13. 创建高级联结

    1. 使用表别名

    这样做的理由有两个:缩短SQL语句; 允许在一条SELECT语句中多次使用相同的表。

    SELECT cust_name, cust_contact FROM Customers AS C, Orders AS O, OrdersItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01';

    需要注意的是:Oracle中没有AS,如果要在Oracle中使用表别名,直接是Customers C 而不是 Customers AS C!

    同时需要注意的是,表别名只在查询执行中使用,与列别名不一样,表别名不返回到客户端。

    2. 使用不同类型的联结

    除了内联结(inner join)之外,还有其他联结:自联结(self-join),自然联结(natural join)和外联结(outer join) 。

    (1)自联结(self-join)

    自联结通常作为外部语句,用来替代在相同的表中检索数据的使用子查询语句。

    Eg: 假如要给跟Jimmy Jonhs同一公司的所有顾客发一份邮件,首先要查找到Jimmy Jonhs所在的公司,然后要查找到他所在公司的所有员工。

    用子查询语句: Select cust_id, cust_name, cust_contact FROM Customers WHERE cust_name = (SELECT cust_name FROM Customer WHERE cust_contact ='Jimmy Jonhs');//在同一张表里面查找两次

    用自联结来查询:SELECT c1.cust_id, c1.cust_name, c1.cust_contact FROM Customers AS c1, Customers AS c2 WHERE c1.cust_name=c2.cust_name AND c2.cust_contact = 'Jimmy Jonhs';//c1, c2 都是Customers表的别名

    注:通常用自联结,不用子查询

    (2)自然联结(natural join)

    无论何时联结,应该至少有一列是不止一次的出现在最终的表中(被联结的列),标准的联结返回所有的数据,相同的列甚至多次出现。而自然联结排除多次出现,使得每列只返回一次。要求你只能选择那些唯一的列,一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成。

    Eg: SELECT *, O.order_num, O.order_date, OI.prod_id, OI.quantity, OI.Item_price FROM Customers AS C, Orders AS O, OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01';

    (3)外联结(outer join)

    联结包含了那些在相关表中没有关联行的行,这种联结叫做外联结。比如:要对每个顾客下的订单进行计数, 包括那些至今尚未下订单的顾客; 列出所有产品以及订购数量,包括没有人订购的产品;计算平均销售规模,包括那些至今尚未下订单的顾客等等现象需要使用到外联结。

    外联结的语法和内联结的语法相似,例如:

    内联结: SELECT Customers.cust_id, Orders.order_num FROM Customers INNER JOIN Orders ON Customers,cust_id = Orders.cust_id;

    外联结: SELECT Customers.cust_id, Orders.order_num FROM Customers LEFT OUTER JOIN Orders ON Customers,cust_id = Orders.cust_id;//使用关键字LEFT指出的是OUTER JOIN 右边的表(左外联结) or 使用 RIGHT 关键字指出的是OUTER JOIN左边的表(右外联结)。

    还有一种是全外联结的,即全外联结包含两个表中的不关联的行。语法如下:

    SELECT Customers.cust_id, Orders.order_num FROM Customers FULL OUTER JOIN Orders ON Customers,cust_id = Orders.cust_id;

    注: 好多数据库都不支持全外联结方法,需要用的时候注意查询一下。

    3. 使用带聚集函数的联结

    聚集函数可以与联结一起使用。

    Eg: 检索所有顾客及每个顾客所下的订单数:

    SELECT Customers.cust_id, COUNT(Orders.order_num) AS num_ord FROM Customers INNER JOIN Orders ON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;

    4.使用联结和联结的条件

    (1)注意使用的联结类型,一般我们使用内联结,但使用外联结也有效;

    (2)关于确切的联结语法,应该查看具体的文档,看相应的DBMS支持何种语法,保证使用正确的联结条件,否则会返回不正确的数据;

    (3)应该总是提供联结条件,否则就会得出笛卡儿积;

    (4)虽然可以对每个联结采用不同的联结类型,但为了排除故障,应该在一起测试所有的联结前,先分别测试每个联结。

    14. 组合查询

    本课讲述如何利用UNION操作符将多条SELECT语句组合成一个结果集。

    1. 组合查询

    SQL允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。

    会用到组合查询的情况有:

    在一个查询中从不同的表中返回结构数据;

    对一个表执行多个查询,按一个查询返回数据。

    2. 创建组合查询

    (1) 使用UNION

    使用UNION很简单,所要做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION。

    Eg: 假如需要Illinois、Indiana和Michigan等美国几个州的所有顾客的报表,还想包括不管位于哪个州的所有的Fun4All。

    首先看单条语句:

    a. SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI');

    b. SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name = 'Fun4All';

    然后,使用UNION进行组合查询:

    SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI') UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name = 'Fun4All';

    (2)UNION规则

    在进行组合的时候要注意以下规则:

    a. UNION中的每个查询必须包含相同的列,表达式或聚集函数;

    b. 列数据类型必须兼容,类型不必完全相同,但必须要是DBMS可以隐含转换的类型。

    (3)包含或者取消重复的行

    一般情况下,当你使用UNION关键字的时候,他会自动取消重复行,这是他的默认行为,但如果你要全部行都显示出来就必须要使用UNION ALL操作符而不是UNION。

    (4)对组合查询结果排序

    在使用UNION组合查询时, 只能使用一条ORDER BY子句,必须位于最后一条SELECT语句之后。

  • 相关阅读:
    【java】对象赋值给另一个对象
    spring boot系列(五)spring boot 配置spring data jpa (查询方法)
    Spring Data JPA 查询
    Spring Data JPA 介绍
    OpenID简介
    OAUTH协议介绍
    URL encoding(URL编码)
    RESTful 介绍
    spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)
    spring boot 启动报 java.lang.NoClassDefFoundError: ch/qos/logback/core/spi/LifeCycle 错误
  • 原文地址:https://www.cnblogs.com/Bonnieh/p/5729660.html
Copyright © 2011-2022 走看看