美文网首页
【笔记】T-SQL数据查询

【笔记】T-SQL数据查询

作者: Murrey_Xiao | 来源:发表于2017-05-09 12:52 被阅读25次

    一. 简单查询

    1. 简单查询T-SQL代码
    SELECT 列名/* FROM 表名 
    [WHERE 限制条件]
    [ORDER BY  排序要求]
    
    2. 在查询中使用列的别名:
    • 使用AS子句来改变结果集中列的名称
    • 使用=来改变结果集中列的别名
    • 使用“空格”来改变结果集中列的别名
    USE DB_CH
    (1) SELECT UserId AS 用户名,PayWay AS 付款方式,PayMoney AS 付款金额 FROM OrderInfo
    WHERE PayWay<>"网上银行"
    (2) SELECT 用户名=UserId,付款方式=PayWay,付款金额=PayMoney FROM OrderInfo
    WHERE PayWay<>"网上银行"
    (3) SELECT UserId 用户名,PayWay 付款方式,PayMoney 付款金额 FROM OrderInfo
    WHERE PayWay<>"网上银行"
    
    3. 查询空值NULL
    SELECT * FROM UserInfo WHERE Email IS NULL
    
    • 如果原来有数据,而后又被删除,那么使用IS NULL将不能被查到,可以使用以下语句:
    SELECT * FROM UserInfo 
    WHERE Email IS NULL OR Email=''
    
    4. 在查询中使用常量列
    SELECT UserId 用户号,PayWay 付款方式,PayMoney 付款金额,'天猫' AS 购物网站 FROM OrderInfo
    
    5. 查询返回限制的行数
    --- TOP 个数
    SELECT TOP 个数 列名或* FROM 表名
    SELECT TOP 3 cno AS 课程号,cname AS 课程名 FROM course
    
    --- TOP 百分比
    SELECT TOP 百分比 PERCENT 列名或* FROM 表名
    SELECT TOP 20 PERCENT cno AS 课程号,cname AS 课程名 FROM course
    
    6. 排序查询
    SELECT 列名或* FROM 表名
    [WHERE]
    ORDER BY 列名[DESC/ASC]
    
    SELECT * FROM OrderInfo
    ORDER BY PayMoney DESC
    

    二、模糊查询

    1. 通配符

    定义:一类字符,代替一个或多个真正的字符,与LIKE关键字一起使用

    • -:一个字符
    • %:包含任意字符串
    • []:指定范围[0-9]或集合[0123]中的任意字符
    • [^]:不在指定范围[a-z]或集合[234]中的任意字符

    2. T-SQL语句

    (1)使用LIKE关键字进行模糊查询
    SELECT 列名或* FROM 表名 WHERE 列名 LIKE '%字符%'
    
    (2)使用BETWEEN在某个范围内进行查询
    SELECT 列名或* FROM 表名 WHERE 列名 [NOT] BETWEEN 小值 AND 大值
    
    (3)使用IN在列举值内进行查询
    SELECT 列名或* FROM 表名 WHERE 列名 IN(值1,值2,值3...)
    

    三、分组查询

    SELECT 聚合函数,分组的列 FROM 表
    [WHERE条件]
    GROUP BY 分组的列
    [HAVING条件]
    [ORDER BY 列名DESC/ASC]
    

    四、多表连接查询

    定义:实际上是通过各个表之间共同列的关联性来查询数据,它是关系数据库查询最主要的特征

    1. 连接查询的分类

    (1) 内连接:根据表中共同的列来进行匹配
    (2) 外连接

    2. 内连接

    (1)特点:
    ① 两个表存在主外键关系
    ② 参与查询的两个表的地位相同无主次关系

    (2)实现方式
    ① 使用WHERE子句指定连接条件

    SELECT O.OrderId , U.UserName , O.Amount , C.CommodityName
    FROM OrderInfo AS O,UserInfo AS U,CommodityInfo AS C
    WHERE O.UserId=U.UserId AND C.CommodityId=O.CommodityId
    

    ② 在FROM子句中使用INNER JOIN...ON

    SELECT O.OrderId , U.UserName , O.Amount , C.CommodityName FROM UseInfo AS U
    INNER JOIN OrderInfo AS O ON U.UserId=O.UserId
    INNER JOIN CommodityInfo AS C ON O.CommodityId=C.CommodityId
    

    3. 外连接

    (1)作用:
    至少返回一张表中的所有记录,再根据匹配条件有选择性地返回另一张表的记录,若不存在则填上NULL值

    (2)分类
    ① 左外连接 LEFT JOIN
    ② 右外连接 RIGHT JOIN

    (3)SQL语句

    --- 左外连接 --- 右外连接类似
    SELECT SortName AS 商品类别,Amount AS 库存量,CommodityName AS 商品名称
    FROM CommoditySort
    LEFT JOIN CommodityInfo
    ON CommoditySort.SortId=CommodityInfo.SortId
    

    五、合并查询UNION

    1. 语法

    SELECT ... FROM 表1
    UNION
    SELECT ... FROM 表2
    

    2. 特点

    ① 合并的表中的列数和数据类型必须相同或相互兼容
    ② UNION默认去掉重复值,如果允许有重复值需使用UNION ALL
    ③ 执行顺序由左向右(可通过列的顺序或空格改变结果集的排序顺序)
    ④ 可以与SELECT INTO一起使用,但是INTO必须放在第一个SELECT语句中
    ⑤ 可以对合并的结果进行排序,但排序的ORDER BY必须放在最后一个SELECT后面,所使用的列名也必须是第一个SELECT
    ⑥合并后的列名由第一个SELECT中的列决定

    3. SQL语句

    SELECT UserID , UserName
    FROM UserInfo
    UNION
    SELECT UserID, Info
    FROM OrderInfo
    

    六、子查询

    举例
    SELECT * FROM CommodityInfo
    WHERE SortId=
    (
      SELECT SortId FROM CommoditySort WHERE SortName='手机数码'
    )
    
    特点

    ① 子查询必须放在一对小括号内
    ② '='比较运算符,还可以与其他的比较运算符一起使用,要求子查询所得的列只能有一个
    ③ 子查询通常作为WHERE的条件
    ④ 子查询中不能出现ORDER BY子句,只能出现在父查询中

    七、IN和NOT IN子查询

    特点

    ① 子查询返回的列中有多行数据,不能再使用'=',即比较运算符,只能使用IN或NOT IN
    ② 可以使用DISTINCT去掉重复记录

    八、EXISTS

    特点

    ① 只注重子查询是否有返回行,如查有返回行则为TRUE,否则则为FALSE
    ② 通常会使用NOT EXISTS对子查询的结果进行取反

    举例
    -- 语法
    IF EXISTS (子查询)
    BEGIN
    ...
    END
    
    -- 举例:一次性购买"手机数码"产品的数量超过3个的,消费金额打8折
    -- 【1】根据类别名称查询类别的编号
    SELECT SortId FROM CommoditySort WHERE SortName='手机数码'
    
    -- 【2】根据1中类别的编号查询商品编号
    SELECT * FROM CommodityInfo WHERE SortId=
    (
        SELECT SortId FROM CommoditySort WHERE SortName='手机数码'
    )
    
    -- 【3】根据2中得到的商品编号去查询订单表中的购买数量超过3个的用户信息
    SELECT * FROM OrderInfo WHERE CommodityId IN
    (
        SELECT * FROM CommodityInfo WHERE SortId=
        (
            SELECT SortId FROM CommoditySort WHERE SortName='手机数码'
        )
    )AND Amount>3
    
    -- 【4】对购买超过3个的用户的付款金额打8折
    IF EXISTS
    (
        SELECT * FROM OrderInfo WHERE CommodityId IN
        (
            SELECT * FROM CommodityInfo WHERE SortId=
            (
                SELECT SortId FROM CommoditySort WHERE SortName='手机数码'
            )
        )AND Amount>3
    )
        BEGIN
        -- 打八折
            UPDATE OrderInfo SET PayMoney=PayMoney*0.8
            WHERE CommodityId IN 
            (
                SELECT CommodityId FROM OrderInfo WHERE CommodityId IN
                (
                    SELECT * FROM CommodityInfo WHERE SortId=
                    (
                        SELECT SortId FROM CommoditySort WHERE SortName='手机数码'
                    )
                )AND Amount>3
            )
        END
    

    九、ALL ANY SOME子查询

    ALL:所有
    ANY:部分
    SOME:与ANY等同,使用ANY的地方都可以使用SOME替换
    >ALL:父查询中列的值必须大于子查询返回的值列表的每一个值
    >ANY:父查询的返回值必须至少大于子查询中的某一个值
    =ANY:与IN等效,父查询中列的值必须匹配子查询返回值列表的某个值
    <>ANY:父查询的结果中列的值与子查询返回值列表 主要有一个不相同就成立
    NOT IN:父查询的结果中列的值必须不能存在在子查询的返回列表中

    相关文章

      网友评论

          本文标题:【笔记】T-SQL数据查询

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