MySQL一些花樣招式

他說,這里似乎很多玩的,有沒有數(shù)據(jù)庫語句好玩的呢?然而隨手寫了幾條,我覺得呢看看書再實(shí)踐實(shí)踐應(yīng)該很不錯的。


  • CASE WHEN

    條件判斷表達(dá)式

# 字段的值使用代號,節(jié)省內(nèi)存
mysql> SELECT `name`,`age`,`sex` FROM `admin`;
+----------+-----+-----+
| name     | age | sex |
+----------+-----+-----+
| AlicFeng |  21 |   1 |
| Alice    |  20 |   0 |
+----------+-----+-----+

# 通過CASE WHEN條件判斷獲取目標(biāo)值
mysql> SELECT `name`,`age`,CASE `sex` WHEN 1 THEN '男' WHEN 0 THEN '女' ELSE '不公開' END AS `sex` FROM `admin`;
+----------+-----+-----+
| name     | age | sex |
+----------+-----+-----+
| AlicFeng |  21 | 男  |
| Alice    |  20 | 女  |
+----------+-----+-----+
  • IFNULL

    判斷是否為空并處理,判斷空值的處理,有允許空值的列是會自動移除索引的,因此不推薦使用。知道就好!

# 直接獲取字段值,有些為空值
mysql> SELECT `name`,`message` FROM `admin`;
+----------+--------------------------------------------+
| name     | message                                    |
+----------+--------------------------------------------+
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| Alice    | NULL                                       |
+----------+--------------------------------------------+

# 查詢數(shù)據(jù),處理空值
mysql> SELECT `name`,IFNULL(`message`,"這人很懶,沒有留下任何東西。") AS `message` FROM `admin`;
+----------+--------------------------------------------+
| name     | message                                    |
+----------+--------------------------------------------+
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| Alice    | 這人很懶,沒有留下任何東西。                |
+----------+--------------------------------------------+

  • IF(EXP1,VALUE1,VALUE2)

    IF條件判斷,EXP表達(dá)式成立的話值為VALUE1,否則為VALUE2

# default SELECT
mysql> SELECT `name`,`age` FROM `admin`;
+----------+-----+
| name     | age |
+----------+-----+
| AlicFeng |  21 |
| Alice    |  20 |
+----------+-----+

# 我要根據(jù)年齡來判斷這個家伙是不是小屁孩
mysql> SELECT `name`,IF(`age`>20,"這個很很黑","小屁孩一個") AS `who` FROM `admin`;
+----------+-----------------+
| name     | who             |
+----------+-----------------+
| AlicFeng | 這個很很黑      |
| Alice    | 小屁孩一個      |
+----------+-----------------+
  • UNION 以及 UNION ALL

    就是合并,這個沒什么好玩的。但是注意查詢的字段名必須相同,不管來自哪一個表, ALL的話就是不消除相同行。使用是盡量使用括號括起來,不然有LIMIT、ORDER BY會提示錯誤。

# UNION 
mysql> (SELECT `name` FROM `admin`) UNION (SELECT `name` FROM `user`);
+----------+
| name     |
+----------+
| AlicFeng |
| Alice    |
| 大傻     |
+----------+

# UNION ALL
mysql> (SELECT `name` FROM `admin`) UNION (ALL SELECT `name` FROM `user`);
+----------+
| name     |
+----------+
| AlicFeng |
| Alice    |
| 大傻     |
| AlicFeng |
+----------+
  • GROUP BY+SUM+COUNT+ORDER BY

    這個沒什么說的,經(jīng)常會用到就熟悉了。分組+求和+計數(shù)+排序

mysql> SELECT `age`,COUNT(*) AS `number` FROM `admin` GROUP BY `age` ORDER BY `number` DESC;
+-----+--------+
| age | number |
+-----+--------+
|  21 |      2 |
|  20 |      1 |
+-----+--------+
  • WHEREHAVING聯(lián)合使用

    說明having的話肯定有ORDER BY,分組后再帥選

mysql> SELECT `age`,COUNT(*) FROM `admin` WHERE `age`>18 GROUP BY `age` HAVING COUNT(*) >=1;
+-----+----------+
| age | COUNT(*) |
+-----+----------+
|  20 |        1 |
|  21 |        2 |
+-----+----------+
  • FROM

    這里說的是FROM子查詢。舉個例子好了,現(xiàn)在我要查詢小學(xué)小孩子有兩科以及以上不及格的同學(xué)的平均分成績和名字。一步一步來!

# 首先我要查詢出有兩個科目不及格的同學(xué)
mysql> SELECT `name`,COUNT(*) AS `number_class` FROM `user` WHERE `score`<60 GROUP BY `name` HAVING `number_class`>=2;
+----------+--------------+
| name     | number_class |
+----------+--------------+
| AlicFeng |            2 |
| 大傻     |            2 |
+----------+--------------+

# 既然可以查詢出名字了,我們只獲取名字即可
mysql> SELECT `name` FROM (SELECT `name`,COUNT(*) AS `number_class` FROM `user` WHERE `score`<60 GROUP BY `name` HAVING `number_class`>=2) AS `user_t`;
+----------+
| name     |
+----------+
| AlicFeng |
| 大傻     |
+----------+

# 名字有了,那么就可以獲得最后的結(jié)果了
mysql> SELECT `name`,AVG(`score`) FROM `user`  WHERE `name` IN (SELECT `name` FROM (SELECT `name`,COUNT(*) AS `number_class` FROM `user` WHERE `score`<60 GROUP BY `name` HAVING `number_class`>=2) AS `user_t`) GROUP BY `name`;
+----------+--------------+
| name     | AVG(`score`) |
+----------+--------------+
| AlicFeng |      59.6667 |
| 大傻     |      61.6667 |
+----------+--------------+

# PS:這里只是舉個例子,正確做法根據(jù)學(xué)號,這里的數(shù)據(jù)表結(jié)構(gòu)是這樣的(冗余、數(shù)據(jù)類型不嚴(yán)謹(jǐn))。
mysql> desc user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | NULL    |                |
| sub   | varchar(10) | NO   |     | NULL    |                |
| score | int(11)     | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
  • WHERE

    WHERE子查詢,一句話,內(nèi)層查詢的結(jié)果供外層使用。不多話,舉個例子!

# 查詢一個user表效績最高的人在另一個表的名言
mysql> SELECT `name`,`message` FROM `admin` WHERE `name`=(SELECT `name` FROM (SELECT `name`,max(`score`) FROM `user`) AS `temp_t`);
+--------+---------+
| name   | message |
+--------+---------+
| 大傻   | 追求    |
+--------+---------+
# PS:可以使用連表查詢,還可以分組查找。THIS IS DEMO
  • EXISTS

    簡單說明:外層查詢的結(jié)果拿到內(nèi)層查詢,是否成立。

mysql> SELECT `name`,`message` FROM `admin` WHERE EXISTS(SELECT `name` FROM `user` WHERE `user`.`name`=`admin`.`name`);
+----------+--------------------------------------------+
| name     | message                                    |
+----------+--------------------------------------------+
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| 大傻     | 追求                                       |
+----------+--------------------------------------------+

一下操作,我們先打印一下數(shù)據(jù)表數(shù)據(jù),便于觀察

mysql> SELECT * FROM `admin`;
+----+----------+-----+-----+--------------------------------------------+
| id | name     | age | sex | message                                    |
+----+----------+-----+-----+--------------------------------------------+
|  1 | AlicFeng |  21 |   1 | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
|  2 | Alice    |  20 |   0 | NULL                                       |
|  3 | 大傻     |  21 |   1 | 追求                                       |
+----+----------+-----+-----+--------------------------------------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM `user`;
+--------+----------+---------+-------+
| id     | name     | sub     | score |
+--------+----------+---------+-------+
|      1 | 大傻     | chinese |    48 |
|      2 | AlicFeng | math    |    28 |
|      3 | 大傻     | math    |    38 |
|      4 | AlicFeng | english |    98 |
|      5 | AlicFeng | math    |    53 |
|      6 | 大傻     | english |    99 |
|      7 | 世界     | math    |    88 |
+--------+----------+---------+-------+

  • 簡單連表查詢

    在簡單的兩個表連接查詢中,使用WHEREJOIN ON查詢結(jié)果是等效的。

# JOIN ON
mysql> SELECT `admin`.`name`,`admin`.`message`,`user`.`score` FROM `admin` JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+-------+
| name     | message                                    | score |
+----------+--------------------------------------------+-------+
| 大傻     | 追求                                       |    48 |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |    28 |
| 大傻     | 追求                                       |    38 |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |    98 |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |    53 |
| 大傻     | 追求                                       |    99 |
+----------+--------------------------------------------+-------+

# WHERE
mysql> SELECT `admin`.`name`,`admin`.`message`,`user`.`score` FROM `admin`, `user` WHERE `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+-------+
| name     | message                                    | score |
+----------+--------------------------------------------+-------+
| 大傻     | 追求                                       |    48 |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |    28 |
| 大傻     | 追求                                       |    38 |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |    98 |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |    53 |
| 大傻     | 追求                                       |    99 |
+----------+--------------------------------------------+-------+
  • 左連接,推薦

    特點(diǎn):以左表為準(zhǔn),去右表找數(shù)據(jù),如果沒有匹配的數(shù)據(jù),則以null補(bǔ)空位,輸出結(jié)果數(shù)>=左表原元祖數(shù)

mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` LEFT JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+
| name     | message                                    |
+----------+--------------------------------------------+
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| Alice    | NULL                                       |
| 大傻     | 追求                                       |
| 大傻     | 追求                                       |
| 大傻     | 追求                                       |
+----------+--------------------------------------------+
  • 右連接

    特點(diǎn):以右表為準(zhǔn),去左表找數(shù)據(jù),如果沒有匹配的數(shù)據(jù),則以null補(bǔ)空位,輸出結(jié)果數(shù)>=右表原元祖數(shù)

mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` RIGHT JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+
| name     | message                                    |
+----------+--------------------------------------------+
| 大傻     | 追求                                       |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| 大傻     | 追求                                       |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| 大傻     | 追求                                       |
| NULL     | NULL                                       |
+----------+--------------------------------------------+
  • 內(nèi)連接

    特點(diǎn):左右連接的交集。其實(shí)與WHERE、JOIN ON的查詢結(jié)果一樣。

mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` INNER JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+
| name     | message                                    |
+----------+--------------------------------------------+
| 大傻     | 追求                                       |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| 大傻     | 追求                                       |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| AlicFeng | 價值源于技術(shù),貢獻(xiàn)源于分享。               |
| 大傻     | 追求                                       |
+----------+--------------------------------------------+

  • 玩玩效率的查詢

    玩這個肯定需要海量的數(shù)據(jù)了,好了~搞一個sheel腳本插入海量的數(shù)據(jù)。

# 先來設(shè)置MySQL的最大連接數(shù)
mysql> set global max_connections=100000;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'max_connections';
+-----------------+--------+
| Variable_name   | Value  |
+-----------------+--------+
| max_connections | 100000 |
+-----------------+--------+
1 row in set (0.00 sec)

shell

#!/bin/bash  
date
for i in `seq 1 100000`
do
{
    mysql -usamego -p!@#$%^&123 demo -e "insert into user(name,score,sub)   values('ALicFeng',78,'math');"  
    sleep 0.01
} &
done
wait
date
exit 0

這里的數(shù)據(jù)還是很少的,最后很多了,執(zhí)行這個sh時,我眼睛時刻盯著系統(tǒng)溫度等信息、手已經(jīng)放在CTRL+C上面了,O(∩_∩)O哈哈~

待續(xù)... ...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容