《MySQL必知必会》10~14章

第十章到第十四章

第十章

拼接字段, 用Concat()函数来拼接两个列

SELECT Concat(vend_name, ' (', vend_country, ')')
FROM vendors
ORDER BY vend_name;

输出如下类型

ACME (USA)
Anvils R US (USA)

通过RTrim()函数来删除数据右侧多余的空格来整理数据

SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')')
FROM vendors
ORDER BY  vend_name;

LTrim()用来删除左侧空格, Trim()删除两侧空格。

使用别名,AS关键词

SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') AS vend_title
FROM vendors
ORDER BY  vend_name;

算术计算

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

第十一章

文本处理函数,Upper()函数

SELECT vend_name, Upper(vend_name) AS vend_name_upcase
FROM  vendors
ORDER BY vend_name;

Soundex()函数匹配发音类似Y.Lie的联系名

SELECT cust_name, cust_contact
FROM customers
WHERE Soundex(cust_contact) = Soundex('Y Lie');

日期和时间处理函数

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

如果order_date里包含具体时间的话,用Data()函数来取其中的日期进行比较

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

匹配某一月所有日期,两种方法

SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
SELECT cust_id, order_num
FROM orders
WHERE Year(order_date) = 2005 AND Month(order_date) = 9;

后者不需要操心每月有多少天。

第十二章

AVG()函数

SELECT AVG(prod_price) AS avg_price
FROM products;

返回特定供应商提供产品的平均价格

SELECT AVG(prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;

COUNT()函数
COUNT(*)对所有行进行计数,包括NULL值
COUNT(column)对特定列具有值的行进行计数

SELECT COUNT(*) AS num_cust
FROM customers;
SELECT COUNT(cust_email) AS num_cust
FROM customers;

MAX()函数,对于非数据列,MAX()函数返回最后一行,且忽略NULL值

SELECT MAX(prod_price) AS max_price
FROM products;

MIN()函数,对于非数据列,MIN()函数返回最前面一行,且忽略NULL值

SELECT MIN(prod_price) AS min_price
FROM products;

SUM()函数

SELECT SUM(quantity) AS items_ordered
FROM orderitems
WHERE order_num = 20005;
SELECT SUM(quantity*item_price) AS total_price
FROM orderitems
WHERE order_num = 20005;

聚集不同的值,DISTINCT

SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;

使用了DISTINCT之后,平均值只考虑各个不同的价格
DISTINCT必须使用列名,不能用于COUNT(*),即COUNT(DISTINCT)是错误的

组合聚集函数

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;

第十三章

创建分组

SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;

这里对每个vend_id而不是整个列表计算num_prod一次

过滤分组

SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;

先过滤掉prod_price < 10的产品,在进行分组

SELECT vend_id, COUNT(*) AS num_prods
FROM  products
WHERE  prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;

不能仅依赖GROUP BY的排序,使用ORDER BY

SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50
ORDER BY ordertotal;

若没有最后一句,结果会按照order_num升序排列,若加上最后一句话,结果按ordertotal升序排列

SLELCT子句顺序

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT

第十四章

子查询

SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';

根据查询到的order_num进一步查询

SELECT cust_id
FROM orders
WHERE order_num IN (20005, 20007);

根据查询到的cust_id进一步查询

SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (10001, 10004);

这三次查询可以整合

SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
                  FROM orderts
                  WHERE order_num IN (SELECT order_num
                                      FROM order_items
                                      WHERE prod_id = 'TNT2'));

由于性能限制,不能嵌套太多的子查询。

对客户10001的订单进行计数

SELECT COUNT(*) AS orders
FROM orders
WHERE cust_id = 10001;

对每个客户执行COUNT(*),将此作为一个子查询

SELECT cust_name,
       cust_state,
       (SELECT COUNT(*)
        FROM orders
        WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;

在此子查询中
customers中cust_id有10001, 10002, 10003, 10004, 10005
而orders中cust_id有10001, 10001, 10003, 10004, 10005
因此对于每个customers中的cust_id, COUNT(*)返回该cust_id在orders中的数量。

发布了84 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43569916/article/details/104247026
今日推荐