他說偏友,這里似乎很多玩的裤翩,有沒有數(shù)據(jù)庫語句好玩的呢芥炭?然而隨手寫了幾條,我覺得呢看看書再實踐實踐應(yīng)該很不錯的羽峰。
-
CASE WHEN
條件判斷表達式
# 字段的值使用代號趟咆,節(jié)省內(nèi)存
mysql> SELECT `name`,`age`,`sex` FROM `admin`;
+----------+-----+-----+
| name | age | sex |
+----------+-----+-----+
| AlicFeng | 21 | 1 |
| Alice | 20 | 0 |
+----------+-----+-----+
# 通過CASE WHEN條件判斷獲取目標值
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ù),貢獻源于分享惰聂。 |
| Alice | NULL |
+----------+--------------------------------------------+
# 查詢數(shù)據(jù)疆偿,處理空值
mysql> SELECT `name`,IFNULL(`message`,"這人很懶,沒有留下任何東西。") AS `message` FROM `admin`;
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| AlicFeng | 價值源于技術(shù)搓幌,貢獻源于分享杆故。 |
| Alice | 這人很懶,沒有留下任何東西。 |
+----------+--------------------------------------------+
-
IF(EXP1,VALUE1,VALUE2)
IF條件判斷溉愁,EXP表達式成立的話值為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)在我要查詢小學小孩子有兩科以及以上不及格的同學的平均分成績和名字碟案。一步一步來!
# 首先我要查詢出有兩個科目不及格的同學
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ù)學號,這里的數(shù)據(jù)表結(jié)構(gòu)是這樣的(冗余鳖目、數(shù)據(jù)類型不嚴謹)扮叨。
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ù),貢獻源于分享瞧省。 |
| 大傻 | 追求 |
+----------+--------------------------------------------+
一下操作扯夭,我們先打印一下數(shù)據(jù)表數(shù)據(jù),便于觀察
mysql> SELECT * FROM `admin`;
+----+----------+-----+-----+--------------------------------------------+
| id | name | age | sex | message |
+----+----------+-----+-----+--------------------------------------------+
| 1 | AlicFeng | 21 | 1 | 價值源于技術(shù)鞍匾,貢獻源于分享交洗。 |
| 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ù)构拳,貢獻源于分享。 | 28 |
| 大傻 | 追求 | 38 |
| AlicFeng | 價值源于技術(shù)梁棠,貢獻源于分享置森。 | 98 |
| AlicFeng | 價值源于技術(shù),貢獻源于分享符糊。 | 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ù)凫海,貢獻源于分享。 | 28 |
| 大傻 | 追求 | 38 |
| AlicFeng | 價值源于技術(shù)男娄,貢獻源于分享行贪。 | 98 |
| AlicFeng | 價值源于技術(shù),貢獻源于分享模闲。 | 53 |
| 大傻 | 追求 | 99 |
+----------+--------------------------------------------+-------+
-
左連接
建瘫,推薦特點:以左表為準,去右表找數(shù)據(jù)尸折,如果沒有匹配的數(shù)據(jù)啰脚,則以null補空位,輸出結(jié)果數(shù)>=左表原元祖數(shù)
mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` LEFT JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| AlicFeng | 價值源于技術(shù)实夹,貢獻源于分享橄浓。 |
| AlicFeng | 價值源于技術(shù)晾咪,貢獻源于分享。 |
| AlicFeng | 價值源于技術(shù)贮配,貢獻源于分享谍倦。 |
| Alice | NULL |
| 大傻 | 追求 |
| 大傻 | 追求 |
| 大傻 | 追求 |
+----------+--------------------------------------------+
-
右連接
特點:以右表為準,去左表找數(shù)據(jù)泪勒,如果沒有匹配的數(shù)據(jù)昼蛀,則以null補空位,輸出結(jié)果數(shù)>=右表原元祖數(shù)
mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` RIGHT JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| 大傻 | 追求 |
| AlicFeng | 價值源于技術(shù)圆存,貢獻源于分享叼旋。 |
| 大傻 | 追求 |
| AlicFeng | 價值源于技術(shù),貢獻源于分享沦辙。 |
| AlicFeng | 價值源于技術(shù)夫植,貢獻源于分享。 |
| 大傻 | 追求 |
| NULL | NULL |
+----------+--------------------------------------------+
-
內(nèi)連接
特點:左右連接的交集油讯。其實與
WHERE
详民、JOIN ON
的查詢結(jié)果一樣。
mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` INNER JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| 大傻 | 追求 |
| AlicFeng | 價值源于技術(shù)陌兑,貢獻源于分享沈跨。 |
| 大傻 | 追求 |
| AlicFeng | 價值源于技術(shù),貢獻源于分享兔综。 |
| AlicFeng | 價值源于技術(shù)饿凛,貢獻源于分享。 |
| 大傻 | 追求 |
+----------+--------------------------------------------+
-
玩玩效率的查詢
玩這個肯定需要海量的數(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ù)... ...