【笔记】T-SQL数据查询

一. 简单查询

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:父查询的结果中列的值必须不能存在在子查询的返回列表中

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容