MySQL UNION、排序、分組、連線、NULL值處理和正則表示式
阿新 • • 發佈:2018-12-20
UNION
SQL UNION
下面的SQL語句從product
和orderdetail
表中選取所有不同的pCode
(只有不同值)
SELECT pCode FROM product
UNION
SELECT pCode FROM orderdetail
ORDER BY pCode;
SQL UNION ALL
下面的SQL語句從product
和orderdetail
表中選取所有的pCode
(也有重複值)
SELECT pCode FROM product
UNION ALL
SELECT pCode FROM orderdetail
ORDER BY pCode;
帶有 WHERE 的 SQL UNION ALL
下面的SQL語句從product
和orderdetail
表中選取所有的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 join
與join
有所不同。 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值處理
查詢資料表orderdetail
中discount
列是否為NULL
,必須使用 IS NULL
和 IS 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 次。 |