MySQL UNION、排序、分组、连接、NULL值处理和正则表达式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/love__live1/article/details/83864025

UNION

SQL UNION

下面的SQL语句从productorderdetail表中选取所有不同的pCode(只有不同值)

SELECT pCode FROM product
UNION
SELECT pCode FROM orderdetail
ORDER BY pCode;

SQL UNION ALL

下面的SQL语句从productorderdetail表中选取所有的pCode(也有重复值)

SELECT pCode FROM product
UNION ALL
SELECT pCode FROM orderdetail
ORDER BY pCode;

带有 WHERE 的 SQL UNION ALL

下面的SQL语句从productorderdetail表中选取所有的pCode=101的值(也有重复值)

SELECT pCode, pName FROM product 
WHERE pCode=101 
UNION ALL
SELECT pCode, qty FROM orderdetail 
WHERE pCode=101  
ORDER BY pCode;

排序

ORDER BY子句

ASC升序,DESC降序

SELECT * FROM product ORDER BY cost ASC;
SELECT * FROM product ORDER BY cost DESC;

分组

GROUP BY语句

统计每种类型的球有多少条记录

SELECT pType, COUNT(*) FROM product
GROUP BY pType;

WITH ROLLUP

统计pType中相同类型的球cost的总数,命名为cost_count

SELECT pType, SUM(cost) as cost_count
FROM product 
GROUP BY pType WITH ROLLUP;

执行完后最后一行是NULL,取代NULL的语句coalesce(a,b,c)
参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

SELECT coalesce(pType, '总数'), SUM(cost) as cost_count
FROM product 
GROUP BY pType WITH ROLLUP;

连接

INNER JOIN

SELECT a.pId, a.pCode, a.pType, b.qty 
FROM product a INNER JOIN orderdetail b
ON a.pCode = b.pCode;

使用while子句

SELECT a.pId, a.pCode, a.pType, b.qty 
FROM product a, orderdetail b
WHERE a.pCode = b.pCode;

LEFT JOIN
MySQL left joinjoin 有所不同。 LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。

SELECT a.pId, a.pCode, a.pType, b.qty 
FROM product a LEFT JOIN orderdetail b
ON a.pCode = b.pCode;

RIGHT JOIN
RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。

SELECT a.pId, a.pCode, a.pType, b.qty 
FROM product a RIGHT JOIN orderdetail b
ON a.pCode = b.pCode;

NULL值处理

查找数据表orderdetaildiscount列是否为NULL,必须使用 IS NULLIS NOT NULL,如下实例:

SELECT * FROM orderdetail WHERE discount IS NOT NULL;
SELECT * FROM orderdetail WHERE discount IS NULL;

正则表达式

之前的LIKE是用来进行模糊匹配

使用REGEXP操作符来进行正则表达式匹配。

# 以"足"字开头的所有数据
SELECT pType FROM product WHERE pType REGEXP '^足';
# 以"类"字开头的所有数据
SELECT pType FROM product WHERE pType REGEXP '类$';
# 字段中含有"球"字的所有数据
SELECT pType FROM product WHERE pType REGEXP '球';
# 字段中含有"球"或者"泳"字且以"类"字的所有数据
SELECT pType FROM product WHERE pType REGEXP '[球泳]|类&';
模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^也匹配 '\n''\r'之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n''\r' 之前的位置。
. 匹配除"\n" 之外的任何单个字符。要匹配包括'\n' 在内的任何字符,请使用象'[.\n]'的模式。
[…] 字符集合。匹配所包含的任意一个字符。例如, '[abc]'可以匹配 "plain"中的'a'
[^...] 负值字符集合。匹配未包含的任意字符。例如,'[^abc]' 可以匹配"plain"中的'p'
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配"z""food"'(z|f)ood'则匹配"zood""food"
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配"z" 以及 "zoo"*等价于{0,}
+ 匹配前面的子表达式一次或多次。例如,'zo+'能匹配 "zo" 以及 "zoo",但不能匹配 "z"+等价于{1,}
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}'不能匹配 "Bob"中的'o',但是能匹配 "food"中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

猜你喜欢

转载自blog.csdn.net/love__live1/article/details/83864025