MySQL UNION 操作符
本教程為大家介紹 MySQL?UNION?操作符的語法和實例。
描述
MySQL UNION 操作符用于連接兩個以上的 SELECT 語句的結果組合到一個結果集合,并去除重復的行。
UNION 操作符必須由兩個或多個 SELECT 語句組成,每個 SELECT 語句的列數和對應位置的數據類型必須相同。
語法
MySQL UNION 操作符語法格式:
SELECT column1, column2, ... FROM table1 WHERE condition1 UNION SELECT column1, column2, ... FROM table2 WHERE condition2 [ORDER BY column1, column2, ...];
參數說明:
column1
,?column2
, ... 是你要選擇的列的名稱,如果使用?*
?表示選擇所有列。table1
,?table2
, ... 是你要從中查詢數據的表的名稱。condition1
,?condition2
, ... 是每個?SELECT
?語句的過濾條件,是可選的。ORDER BY
?子句是一個可選的子句,用于指定合并后的結果集的排序順序。
實例
1. 基本的 UNION 操作:
SELECT city FROM customers UNION SELECT city FROM suppliers ORDER BY city;
以上 SQL 語句將選擇客戶表和供應商表中所有城市的唯一值,并按城市名稱升序排序。
2. 使用過濾條件的 UNION:
SELECT product_name FROM products WHERE category = 'Electronics' UNION SELECT product_name FROM products WHERE category = 'Clothing' ORDER BY product_name;
以上 SQL 語句將選擇電子產品和服裝類別的產品名稱,并按產品名稱升序排序。
3. UNION 操作中的列數和數據類型必須相同:
SELECT first_name, last_name FROM employees UNION SELECT department_name, NULL FROM departments ORDER BY first_name;
以上 SQL 語句中,departments 表中的 department_name 列被映射到了 employees 表中的 last_name 列,但是列數和數據類型必須相同。
4. 使用 UNION ALL 不去除重復行:
SELECT city FROM customers UNION ALL SELECT city FROM suppliers ORDER BY city;
以上 SQL 語句使用 UNION ALL 將客戶表和供應商表中的所有城市合并在一起,不去除重復行。
UNION 操作符在合并結果集時會去除重復行,而 UNION ALL 不會去除重復行,因此 UNION ALL 的性能可能更好,但如果你確實希望去除重復行,可以使用 UNION。
演示數據庫
在本教程中,我們將使用 RUNOOB 樣本數據庫。
下面是選自 "Websites" 表的數據:
mysql> SELECT * FROM Websites; +----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘寶 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鳥教程 | http://www.runoob.com/ | 4689 | CN | | 4 | 微博 | http://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | | 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND | +----+---------------+---------------------------+-------+---------+
下面是 "apps" APP 的數據:
mysql> SELECT * FROM apps; +----+------------+-------------------------+---------+ | id | app_name | url | country | +----+------------+-------------------------+---------+ | 1 | QQ APP | http://im.qq.com/ | CN | | 2 | 微博 APP | http://weibo.com/ | CN | | 3 | 淘寶 APP | https://www.taobao.com/ | CN | +----+------------+-------------------------+---------+ 3 rows in set (0.00 sec)
SQL UNION 實例
下面的 SQL 語句從 "Websites" 和 "apps" 表中選取所有不同的country(只有不同的值):
實例
SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
執行以上 SQL 輸出結果如下:
注釋:UNION 不能用于列出兩個表中所有的country。如果一些網站和APP來自同一個國家,每個國家只會列出一次。UNION 只會選取不同的值。請使用 UNION ALL 來選取重復的值!
SQL UNION ALL 實例
下面的 SQL 語句使用 UNION ALL 從 "Websites" 和 "apps" 表中選取所有的country(也有重復的值):
實例
SELECT country FROM Websites
UNION ALL
SELECT country FROM apps
ORDER BY country;
執行以上 SQL 輸出結果如下:
帶有 WHERE 的 SQL UNION ALL
下面的 SQL 語句使用 UNION ALL 從 "Websites" 和 "apps" 表中選取所有的中國(CN)的數據(也有重復的值):
實例
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;
執行以上 SQL 輸出結果如下:
UNION 語句:用于將不同表中相同列中查詢的數據展示出來;(不包括重復數據)
UNION ALL 語句:用于將不同表中相同列中查詢的數據展示出來;(包括重復數據)
使用形式如下:
SELECT 列名稱 FROM 表名稱 UNION SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱; SELECT 列名稱 FROM 表名稱 UNION ALL SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;
?
MySQL ORDER BY(排序) 語句
我們知道從 MySQL 表中使用?SELECT?語句來讀取數據。
如果我們需要對讀取的數據進行排序,我們就可以使用 MySQL 的?ORDER BY?子句來設定你想按哪個字段哪種方式來進行排序,再返回搜索結果。
MySQL?ORDER BY(排序)?語句可以按照一個或多個列的值進行升序(ASC)或降序(DESC)排序。
語法
以下是 SELECT 語句使用?ORDER BY?子句將查詢數據排序后再返回數據:
SELECT column1, column2, ... FROM table_name ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
參數說明:
column1
,?column2
, ... 是你要選擇的列的名稱,如果使用?*
?表示選擇所有列。table_name
?是你要從中查詢數據的表的名稱。ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...
?是用于指定排序順序的子句。ASC
?表示升序(默認),DESC
?表示降序。
更多說明:
- 你可以使用任何字段來作為排序的條件,從而返回排序后的查詢結果。
- 你可以設定多個字段來排序。
- 你可以使用 ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列。 默認情況下,它是按升序排列。
- 你可以添加 WHERE...LIKE 子句來設置條件。
實例
以下是一些 ORDER BY 子句的使用實例。
1. 單列排序:
SELECT * FROM products ORDER BY product_name ASC;
以上 SQL 語句將選擇產品表 products 中的所有產品,并按產品名稱升序 ASC 排序。
2. 多列排序:
SELECT * FROM employees ORDER BY department_id ASC, hire_date DESC;
以上 SQL 語句將選擇員工表 employees 中的所有員工,并先按部門 ID 升序 ASC 排序,然后在相同部門中按雇傭日期降序 DESC 排序。
3. 使用數字表示列的位置:
SELECT first_name, last_name, salary FROM employees ORDER BY 3 DESC, 1 ASC;
以上 SQL 語句將選擇員工表 employees 中的名字和工資列,并按第三列(salary)降序 DESC 排序,然后按第一列(first_name)升序 ASC 排序。
4. 使用表達式排序:
SELECT product_name, price * discount_rate AS discounted_price FROM products ORDER BY discounted_price DESC;
以上 SQL 語句將選擇產品表 products 中的產品名稱和根據折扣率計算的折扣后價格,并按折扣后價格降序 DESC 排序。
5. 使用 NULLS FIRST 或 NULLS LAST 處理 NULL 值:
SELECT product_name, price FROM products ORDER BY price DESC NULLS LAST;
以上 SQL 語句將選擇產品表 products 中的產品名稱和價格,并按價格降序 DESC 排序,將 NULL 值排在最后。
ORDER BY 子句是一個強大的工具,可以根據不同的業務需求對查詢結果進行排序。在實際應用中,注意選擇適當的列和排序順序,以獲得符合期望的排序效果。
在命令提示符中使用 ORDER BY 子句
以下將在 SELECT 語句中使用 ORDER BY 子句來讀取 MySQL 數據表 runoob_tbl 中的數據:
實例
嘗試以下實例,結果將按升序及降序排列。
SQL 排序
mysql> use RUNOOB; Database changed mysql> SELECT * from runoob_tbl ORDER BY submission_date ASC; +-----------+---------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+---------------+---------------+-----------------+ | 3 | 學習 Java | RUNOOB.COM | 2015-05-01 | | 4 | 學習 Python | RUNOOB.COM | 2016-03-06 | | 1 | 學習 PHP | 菜鳥教程 | 2017-04-12 | | 2 | 學習 MySQL | 菜鳥教程 | 2017-04-12 | +-----------+---------------+---------------+-----------------+ 4 rows in set (0.01 sec) mysql> SELECT * from runoob_tbl ORDER BY submission_date DESC; +-----------+---------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | 學習 PHP | 菜鳥教程 | 2017-04-12 | | 2 | 學習 MySQL | 菜鳥教程 | 2017-04-12 | | 4 | 學習 Python | RUNOOB.COM | 2016-03-06 | | 3 | 學習 Java | RUNOOB.COM | 2015-05-01 | +-----------+---------------+---------------+-----------------+ 4 rows in set (0.01 sec)
讀取 runoob_tbl 表中所有數據并按 submission_date 字段的升序排列。
在 PHP 腳本中使用 ORDER BY 子句
你可以使用 PHP 函數的 mysqli_query() 及相同的 SELECT 帶上 ORDER BY 子句的命令來獲取數據。
該函數用于執行 SQL 命令,然后通過 PHP 函數 mysqli_fetch_array() 來輸出所有查詢的數據。
實例
嘗試以下實例,查詢后的數據按 submission_date 字段的降序排列后返回。
MySQL ORDER BY 測試:
<?php $dbhost = 'localhost'; // mysql服務器主機地址 $dbuser = 'root'; // mysql用戶名 $dbpass = '123456'; // mysql用戶名密碼 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('連接失敗: ' . mysqli_error($conn)); } // 設置編碼,防止中文亂碼 mysqli_query($conn , "set names utf8"); $sql = 'SELECT runoob_id, runoob_title, runoob_author, submission_date FROM runoob_tbl ORDER BY submission_date ASC'; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('無法讀取數據: ' . mysqli_error($conn)); } echo '<h2>菜鳥教程 MySQL ORDER BY 測試<h2>'; echo '<table border="1"><tr><td>教程 ID</td><td>標題</td><td>作者</td><td>提交日期</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['runoob_id']}</td> ". "<td>{$row['runoob_title']} </td> ". "<td>{$row['runoob_author']} </td> ". "<td>{$row['submission_date']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>
輸出結果如下圖所示:
MySQL 排序我們知道從 MySQL 表中使用 SQL SELECT 語句來讀取:
MySQL 拼音排序
如果字符集采用的是 gbk(漢字編碼字符集),直接在查詢語句后邊添加 ORDER BY:
SELECT * FROM runoob_tbl ORDER BY runoob_title;
如果字符集采用的是 utf8(萬國碼),需要先對字段進行轉碼然后排序:
SELECT * FROM runoob_tbl ORDER BY CONVERT(runoob_title using gbk);
?