1. 程式人生 > >MySQL UNION、排序、分組、連線、NULL值處理和正則表示式

MySQL UNION、排序、分組、連線、NULL值處理和正則表示式

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 次。