6、LIKE操作符
%匹配0个或任意个字符,_匹配任意一个字符
SELECT prod_name FROM products WHERE prod_name LIKE 'fish%';
-- MySQL默认不区分大小写,紧跟WHERE后加一个BINARY以区分大小写
[]匹配括号中任意一个字符,MySQL并不支持~~
SELECT xxx FROM yyy WHERE xxx LIKE '[ab]%';
-- 匹配任何以a或者b开头的字符串,MySQL可以用OR来代替?^ab表示不匹配a和b
7、计算与拼接字段
拼接就相当于格式化字符串吧
SELECT vend_name + '(' + vend_country + ')' AS vend_title FROM vendors;
-- MySQL并不支持'+'号,但这样确实好看多了,AS后面跟的是新组合列的列名
MySQL采用函数拼接
SELECT concat(vend_name, '(', vend_country, ')') AS vend_title FROM vendors;
执行算术计算(支持+-*/,和正常的优先级)
SELECT prod_id, quantity, item_price, quantity * item_price AS expanded_price
FROM orderitems
WHERE order_num = 20008;
-- 显示4列,其中最后一列为计算出来的新列,expanded_price表示总价格
SELECT可以用来进行语句检查,比如:
SELECT 6 * 4; -- 输出24,SELECT trim(' abc '); -- 输出abc
8、函数
用SOUNDEX检索读音相似的人名或其他
SELECT cust_contact FROM customers WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
-- 能检索到Michelle Green,可能用于存储人名时的拼写错误~~
日期相关函数示例,更多函数,参考MySQL文档Function and Operator Reference
SELECT order_num FROM orders WHERE YEAR(order_date) = 2012;
-- 用YEAR从日期中获取年份,再与2012匹配~~
9、聚集函数 (对某些行运行的函数,计算并返回一个值)
AVG
SELECT AVG(prod_price) AS avg_price1, AVG(prod_price) AS avg_price2 FROM products;
-- 一个AVG计算一个列,多个(可以是不同的聚集函数)对应多个列,并分别指定AS,会忽略值为NULL的行
COUNT
SELECT COUNT(*) FROM products; -- 统计整个表的行数,不管是否为NULL
SELECT COUNT(cust_email) FROM customers; -- 统计cust_email列中,值不为NULL的行数
MAX、MIN
SELECT MAX(prod_price) AS max_price FROM products;
-- 输出
--------------------
-- max_price
--------------------
-- 11.99
--------------------
-- 就输出一个最大值,感觉没什么用啊,
显示价格最大的行
SELECT * FROM products ORDER BY prod_price DESC LIMIT 1;
SUM
SELECT SUM(item_price * quantity) AS total_price FROM orderitems WHERE order_num = 20005;
-- 查询20005号订单的总价值之和
聚集中使用DISTINCT
SELECT AVG(DISTINCT prod_price) FROM products; -- 查询值不相同的价格的平均值
10、分组数据
NULL值会被分为一组,GROUP BY必须位于WHERE之后,ORDER BY之前
-- 以vend_id分组统计各供应商的商品数,并以商品数排序
SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id ORDER BY num_prods;
-- 以vend_id和prod_price进行分组,SELECT中出现的列,GROUP BY中必须有,反之则没必要
SELECT vend_id, prod_price, COUNT(*) AS num_prodsFROM productsGROUP BY vend_id, prod_price
-- MySQL支持相对位置分组,即上例中可以换成GROUP BY 1, 2
过滤分组HAVING(简单理解为:WHERE分组前过滤,HAVING分组后过滤)
SELECT vend_id, COUNT(*) AS num_prodsFROM products
WHERE prod_price >= 4
GROUP BY vend_idHAVING COUNT(*) >= 2;
-- 可换成HAVING num_prods >= 2-- 此语句查询有2个及以上商品价格>=4的供应商
参考:SQL必知必会(第四版)