排序:
order by 多个列名 默认asc即正序
若对多个字段进行倒序排列 必须每个字段对应一个desc关键字
eg:SELECT * FROM mcw_shop_merchandise
ORDER BY style desc ,operator desc ;
范围检查between:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
检查是否为null: is null
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
OR关键字:若第一个关键字满足 则不会判断第二个条件
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’;
AND 比OR的优先级更高: 下面这个条sqlwhere字句意思是:由供应商 BRS01 制造的价格为 10美元以
上的所有产品,以及由供应商 DLL01 制造的所有产品,而不管其价格如何。
换句话说,由于 AND 在求值过程中优先级更高,操作符被错误地组合了。
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’
AND prod_price >= 10;
解决办法就是加上():
SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = ‘DLL01’ OR vend_id = ‘BRS01’)
AND prod_price >= 10;
NOT 操作符
WHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定其后所跟的
任何条件。因为 NOT 从不单独使用(它总是与其他操作符一起使用),所
以它的语法与其他操作符有所不同。NOT 关键字可以用在要过滤的列前,
而不仅是在其后。
下面的例子说明 NOT 的用法。为了列出除 DLL01 之外的所有供应商制造
的产品,可编写如下的代码。
SELECT prod_name
FROM Products
WHERE NOT vend_id = ‘DLL01’
ORDER BY prod_name;
通配符:通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE ‘Fish%’;
此例子使用了搜索模式’Fish%’。在执行这条子句时,将检索任意以
Fish 起头的词。%告诉 DBMS 接受 Fish 之后的任意字符,不管它有多
少字符。
通配符可在搜索模式中的任意位置使用,并且可以使用多个通配符。下
面的例子使用两个通配符,它们位于模式的两端:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE ‘%bean bag%’;
3.方括号([ ])通配符
方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配
符的位置)的一个字符。
例如,找出所有名字以 J 或 M 起头的联系人,可进行如下查询:
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE ‘[JM]%’
ORDER BY cust_contact;
此通配符可以用前缀字符^
(脱字号)来否定。例如,下面的查询匹配以
J 和 M 之外的任意字符起头的任意联系人名(与前一个例子相反):
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE ‘[^
JM]%’
ORDER BY cust_contact;
计算字段:
拼接函数:把多个列数据拼接为一个列数据
SELECT Concat(vend_name, ’ (’, vend_country, ‘)’)
FROM Vendors
ORDER BY vend_name;
sql可对列名进行加减乘除计算:还可加括号
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
字符串转大写:upper
eg:SELECT UPPER(name) as n FROM user
where id=1;
其余函数:
LEFT()(或使用子字符串函数) 返回字符串左边的字符
LENGTH()(也使用DATALENGTH()或LEN()) 返回字符串的长度
LOWER()(Access使用LCASE()) 将字符串转换为小写
LTRIM() 去掉字符串左边的空格
RIGHT()(或使用子字符串函数) 返回字符串右边的字符
RTRIM() 去掉字符串右边的空格
SOUNDEX() 返回字符串的SOUNDEX值
UPPER()(Access使用UCASE()) 将字符串转换为大写
SOUNDEX() 详解: 找出语音相近的
Customers 表中有一个顾客
Kids Place,其联系名为 Michelle Green。但如果这是错误的输入,
此联系名实际上应该是 Michael Green,该怎么办呢?显然,按正确的
联系名搜索不会返回数据,如下所示:
SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX(‘Michael Green’);
YEAR()函数:从日期中提取年份
SELECT *
FROM user
WHERE YEAR(crrete_time) = 2020;
AVG():
SELECT AVG(prod_price) AS avg_price
FROM Products;
count():
如果指定列名,则 COUNT()函数会忽略指定列的值为空的行,但如果
COUNT()函数中用的是星号(),则不忽略。
SELECT COUNT() AS num_cust
FROM Customers;
MAX()返回指定列中的最大值。MAX()要求指定列名,如下所示:
对非数值数据使用 MAX()
虽然 MAX()一般用来找出最大的数值或日期值,但许多(并非所有)
DBMS 允许将它用来返回任意列中的最大值,包括返回文本列中的最
大值。在用于文本数据时,MAX()返回按该列排序后的最后一行。
SELECT MAX(prod_price) AS max_price
FROM Products;
MIN()函数
MIN()的功能正好与 MAX()功能相反,它返回指定列的最小值。与 MAX()
一样,MIN()要求指定列名,如下所示:
SELECT MIN(prod_price) AS min_price
FROM Products;
SUM()函数
SUM()用来返回指定列值的和(总计)。
SELECT SUM(quantity) AS items_ordered
FROM OrderItems
WHERE order_num = 20005;
SUM()也可以用来合计计算值。在下面的例子中,合计每项物品的
item_pricequantity,得出总的订单金额:
SELECT SUM(item_pricequantity) AS total_price
FROM OrderItems
WHERE order_num = 20005;
以上 5 个聚集函数都可以如下使用。
对所有行执行计算,指定 ALL 参数或不指定参数(因为 ALL 是默认行
为)。
只包含不同的值,指定 DISTINCT 参数。
eg:
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = ‘DLL01’;
上述函数也可组合使用:
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM Products;
分组:GROUP BY
简单的例子:
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
在使用 GROUP BY 子句前,需要知道一些重要的规定。
GROUP BY 子句可以包含任意数目的列,因而可以对分组进行嵌套,
更细致地进行数据分组。
如果在 GROUP BY 子句中嵌套了分组,数据将在最后指定的分组上进
行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以
不能从个别的列取回数据)。
GROUP BY 子句中列出的每一列都必须是检索列或有效的表达式(但
不能是聚集函数)。如果在 SELECT 中使用表达式,则必须在 GROUP BY
子句中指定相同的表达式。不能使用别名。
大多数 SQL 实现不允许 GROUP BY 列带有长度可变的数据类型(如文
本或备注型字段)。
除聚集计算语句外,SELECT 语句中的每一列都必须在 GROUP BY 子句
中给出。
如果分组列中包含具有 NULL 值的行,则 NULL 将作为一个分组返回。
如果列中有多行 NULL 值,它们将分为一组。
GROUP BY 子句必须出现在 WHERE 子句之后,ORDER BY 子句之前。
HAVING:
HAVING 非常类似于 WHERE。事实上,目前为止所学过的
所有类型的 WHERE 子句都可以用 HAVING 来替代。唯一的差别是,WHERE
过滤行,而 HAVING 过滤分组。
SELECT cust_id, COUNT() AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT() >= 2;
这里有另一种理解方法,WHERE 在数据分组前进行过滤,HAVING 在数
据分组后进行过滤。这是一个重要的区别,WHERE 排除的行不包括在
分组中。这可能会改变计算值,从而影响 HAVING 子句中基于这些值
过滤掉的分组。
HAVING 与 WHERE 非常类似,如果不指定 GROUP BY,则大多数 DBMS
会同等对待它们。不过,你自己要能区分这一点。使用 HAVING 时应
该结合 GROUP BY 子句,而 WHERE 子句用于标准的行级过滤。
子查询:
1.子查询在where关键处的使用
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = ‘RGAN01’);
在 SELECT 语句中,子查询总是从内向外处理。在处理上面的 SELECT 语
句时,DBMS 实际上执行了两个操作。
注意:只能是单列
作为子查询的 SELECT 语句只能查询单个列。企图检索多个列将返回
错误。
对组合查询结果排序
SELECT 语句的输出用 ORDER BY 子句排序。在用 UNION 组合查询时,只
能使用一条 ORDER BY 子句,它必须位于最后一条 SELECT 语句之后。对
于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一
图灵社区会员 maik000 专享 尊重版权
128 | 第 14 课 组合查询
部分的情况,因此不允许使用多条 ORDER BY 子句。
插入查询:
INSERT INTO Customers(cust_id, cust_country)
SELECT cust_id, cust_country
FROM CustNew;
提示:插入多行
INSERT 通常只插入一行。要插入多行,必须执行多个 INSERT 语句。
INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT
语句返回多少行,都将被 INSERT 插入。
从一个表复制到另一个表
有一种数据插入不使用 INSERT 语句。要将一个表的内容复制到一个全
新的表(运行中创建的表),可以使用 SELECT INTO 语句。
eg:
CREATE TABLE CustCopy AS
SELECT * FROM roles;