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