他說,這里似乎很多玩的,有沒有數(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 |
+-----+--------+
-
WHERE和HAVING聯(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 | |
+-------+-------------+------+-----+---------+----------------+
-
WHEREWHERE子查詢,一句話,內(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 |
+--------+----------+---------+-------+
-
簡單連表查詢
在簡單的兩個表連接查詢中,使用
WHERE和JOIN 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ù)... ...