---------------------------数据 过滤--------------------------
-- WHERE 子句

-- 21. AND 操作符 : 满足两个过滤条件,然后输出
SELECT prod_id, prod_price, prod_name, vend_id
FROM products
WHERE vend_id = 1003  AND prod_price <= 10 ;

-- 22. OR 操作符 : 满足其中一个过滤条件,然后输出
SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id =1002 OR vend_id=1003

-- 23. 计算次序 :  AND操作符高于OR 操作符,必须使用括号来使之优先处理
-- 列出价格为10 美元(含)以上且由1002或1003制造的所有产品;
SELECT prod_name, prod_price
FROM products
WHERE ( vend_id =1002 OR vend_id=1003 ) AND prod_price >= 10;

-- 24. IN操作符 :  用来指定条件范围,比OR执行更快
-- 列出由1002或1003制造的所有产品;
SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;

--等价于:
SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id = 1002 OR vend_id = 1003
ORDER BY prod_name;

-- 25. NOT操作符 : 有且只有一个功能,那就是否定它之后所跟的任何条件
-- 列出除1002或1003之外制造的所有产品;
SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;



------------------------用通配符进行过滤-----------------------
-- 26. LIKE操作符,百分号(%) 通配符 : 找出所有以词jet起头的产品,%表示匹配出现任意次数的任何字符。
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'jet%';

--找出所有以词包含anvil的产品,%表示在头尾匹配出现任意次数的任何字符。
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '%anvil%';

-- 27. LIKE操作符,下划线_通配符 : 找出头字符由任何单个字符组成,后面是 'ton anvil%'的产品
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil%';

-- 28. LIKE操作符,方括号[]通配符 : 指定一个字符集,它必须匹配指定位置的一个字符;
-- 找出所有名字以E或J起头的联系人;
SELECT cust_contact
FROM customers
WHERE cust_contact LIKE '[EJ]%'
ORDER BY cust_contact;

-- 29. LIKE操作符,方括号[^]前缀字符-脱字符号来否定,通配符 : 匹配不以E或J起头的任意联系人名;
-- 找出所有名字不以E或J起头的联系人;与上例相反
SELECT cust_contact
FROM customers
WHERE cust_contact LIKE '[^EJ]%'
ORDER BY cust_contact;

--等价于,比较常用NOT关键字
SELECT cust_contact
FROM customers
WHERE cust_contact NOT LIKE '[EJ]%'
ORDER BY cust_contact;

-- 使用通配符技巧:
-- 1. 不要多度使用通配符;
-- 2. 除非有绝对必要,否则不要将通配符置于开始处,否则搜索起来最慢;
-- 3. 注意通配符的位置,如果放错,不会返回想要的数据;



--------------------------创建计算字段-------------------------
--30. 使用 连接符,来拼接字段,使用RTrim()函数去掉右边的所有空格
SELECT RTrim(vend_name) + '(' + RTrim(vend_country) + ')'
FROM vendors
ORDER BY vend_name;

--结果:
(No column name)
ACME(USA)

--31. 使用别名来输出字段,AS 是可选的,别名可用来表示不符合规定的字符如空格;
SELECT RTrim(vend_name) + '(' + RTrim(vend_country) + ')' AS vend_title
--SELECT RTrim(vend_name) + '(' + RTrim(vend_country) + ')'  vend_title
FROM vendors
ORDER BY vend_name;

--结果:
vend_title
ACME(USA)

SELECT [Last Name] AS LastName

-- 32. 执行算术计算
SELECT prod_id, quantity, item_price
FROM orderitems
WHERE order_num=20005;

SELECT prod_id,
       quantity,
       item_price,
       quantity*item_price AS expanded_price      
FROM orderitems
WHERE order_num=20005;



-------------------------使用数据处理函数------------------------

-- SQL 支持利用函数来处理数据; 函数一般是在数据上执行的,给数据的转换和处理提供了方便;

-- 33. 处理字符串的文本函数
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase
FROM vendors
ORDER BY vend_name

-- 在数值数据上进行算术操作的数值函数

-- 34. 用来处理日期和时间值并从这些值中提取特定成分的日期(返回两个日期之差,检查日期有效性)和时间函数
-- DatePart(weekday,order_date) AS weekday; 返回下订单日期为星期几
SELECT order_num,
       DATEPART(WEEKDAY, order_date) AS weekday
FROM orders;

SELECT order_num,
       DateName(WEEKDAY, order_date) AS weekday
FROM orders;

--返回'2005-09-01'下的订单
SELECT cust_id, order_num,order_date
FROM orders
WHERE DATEDIFF(day,order_date,'2005-09-01') =0;

SELECT cust_id, order_num,order_date
FROM orders
WHERE order_date = '2005-09-01'

--返回'2005-09'下的所有订单
SELECT cust_id, order_num,order_date
FROM orders
WHERE YEAR(order_date)=2005 AND Month(order_date)= 9;

SELECT cust_id, order_num,order_date
FROM orders
WHERE DATEDIFF(MONTH,order_date,'2005-09-01')=0;

--DateAdd()     添加日期(天、周等)
--DateDiff()    计算两个日期的差
--DateName()    返回部分日期的字符串表示
--DatePart()    返回日期的一部分(星期几、月、年等)
--Day()         返回日期中的天
--GetDate()     返回当前日期和时间
--Month()  返回日期中的月
--Year()  返回日期中的年


-- 35. 返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本信息)的系统函数

SELECT @@VERSION
GO

-- 36. 返回一个数的平方根
select SQUARE(5)

--返回一个随机数
SELECT RAND()