讀書 - 《MySQL 技術(shù)內(nèi)幕(第4版)》之常用命令不平常

畢業(yè)多年抑党,問題驅(qū)動型學習模式包警,學習不挑食,現(xiàn)在成功的成為前端底靠、后端害晦、移動端的全棧,不苛骨,是全干程序員篱瞎。

問題驅(qū)動學習,導致學習碎片化痒芝,知識體系不專一俐筋,用時方學,再用其他工具時繼續(xù)學严衬,邊學邊忘澄者。很難想像自己曾外包一年到家電子商務公司做報表數(shù)據(jù)整理,報表涉及到 ibm cognos、microsoft reporting service粱挡、webfocus赠幕、qlickview、ireport询筏,客戶部分第三方數(shù)據(jù)通過 excel 導入榕堰,當時使用 vb 編程做各種關(guān)聯(lián)、篩選嫌套、聯(lián)動匯總逆屡,感嘆 excel 的強大,但此刻感覺好遙遠踱讨,遠得把我再放回工位會無從下手魏蔗。

天天掛在口頭的縮寫單詞,用得太多已忘記它的原意痹筛,很慶幸自己愚笨的大腦里還尚存自知莺治,看到略感陌生的單詞全拼統(tǒng)統(tǒng)放入筆記,工作多年的事實永遠是自黑的依據(jù)帚稠。

SQL: structured query language 結(jié)構(gòu)化查詢語言
RTF: rich text format 富文本格式
RDBMS: relational database management system 關(guān)系數(shù)據(jù)庫管理系統(tǒng)

常用命令的常用用法不值得放在筆記中谣旁,是的,此篇筆記就是按這個思路整理的翁锡,白紙黑字蔓挖,為日后扇臉留下些痕跡。

操作數(shù)據(jù)庫的第一步馆衔,自是開門進屋,再翻箱倒柜的找東西怨绣;登錄操作目前沒有發(fā)現(xiàn)不平常的用法角溃,參數(shù)可指定主機、端口篮撑、編碼類型减细、數(shù)據(jù)庫、是否加載數(shù)據(jù)等功能赢笨。

$ mysql -uroot -ppassword;
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 61
Server version: 5.6.16 Homebrew

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

上面這段提示語不能再眼熟未蝌,熟到?jīng)]有完整的閱讀過整體文字,若是告訴你里面提示了幾個不常用的命令茧妒,你能找到幾個或用到過幾個萧吠?

sql 語句語法是以分號 ; 結(jié)尾,也可以使用 \g 桐筏,雖然感覺分號更簡潔纸型,但必需承認在閱讀此書前我是無知的。

mysql> select now()\g
+---------------------+
| now()               |
+---------------------+
| 2016-11-09 23:26:18 |
+---------------------+
1 row in set (0.00 sec)

\c 清空當前的輸入,解釋很簡單狰腌,平時使用 ctrl + u 組合命令清空輸入的信息除破,但試想若 sql 語句過長分行輸入時,其間發(fā)現(xiàn)輸入有誤放棄已輸入命令琼腔,如何做瑰枫?無知的我是直接輸入分號 ; 表示 sql 語句結(jié)束再回車,任由報錯信息橫行丹莲。其實輸入 \c 才是干凈光坝、優(yōu)雅的解決方案。

mysql> select
    -> now()\c
mysql>

sqlite3 支持結(jié)果集行列轉(zhuǎn)換圾笨,一直以來以為是 sqlite3 的特性教馆,還是我所待的井太深,結(jié)尾符使用 \G 表示結(jié)果集行列轉(zhuǎn)換擂达。

mysql> select now()\G
*************************** 1. row ***************************
now(): 2016-11-09 23:31:19
1 row in set (0.00 sec)

業(yè)務邏輯復雜時在多個數(shù)據(jù)庫中切來切去土铺,亂忙一通后,還記當前是那個數(shù)據(jù)庫嗎板鬓?之前我的做法悲敷,想繼續(xù)在那個數(shù)據(jù)庫操作就再執(zhí)行 use the-db-i-want,這樣操作過于暴力俭令,查看一下當前所在數(shù)據(jù)庫省時省力后德。

mysql> select database();
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)

查看表結(jié)構(gòu)只會 desc,其實下面五行命令都可以達到預期的效果抄腔,雖然最終還堅持簡短的 desc瓢湃,但多了四條學習的入口。

mysql> desc sys_users;
mysql> describe sys_users;
mysql> explain sys_users;
mysql> show columns from sys_users;
mysql> show fields from sys_users;

有些屬性表字段列表好幾屏赫蛇,總有些字段名讓記混绵患,如何過濾字段?在 information_schema 數(shù)據(jù)庫中翻來倒去的各種不利索悟耘,其實查看表結(jié)構(gòu)的命令本身就支持過濾功能落蝙,解鎖更多用法請查看 api。

mysql> desc sys_users 'user_name';
mysql> show columns from sys_users like '%name';
mysql> show fields from sys_users like '%name';

數(shù)據(jù)庫一般不會很多暂幼,數(shù)據(jù)表上百倒是稀松平常筏勒,有些功能相近的數(shù)據(jù)表名完全沒有讓人想去記的欲望,只記得一些關(guān)鍵字旺嬉,如何去過濾管行?曾經(jīng)自以為找到了救星 page 命令,但過于啰嗦鹰服,show 命令原天然支持病瞳。

mysql> show databases like '%bi';
mysql> show tables like '%bases';

平時按行 values() 插入數(shù)據(jù)揽咕,也可以按列 set 插入,用法一目了然套菜,為日后多條解法思路亲善。

mysql> create table test_set (first_name varchar(255), last_name varchar(255));
Query OK, 0 rows affected (0.05 sec)

mysql> insert into test_set value();
Query OK, 1 row affected (0.01 sec)

mysql> select * from test_set;
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| NULL       | NULL      |
+------------+-----------+
1 row in set (0.00 sec)

mysql> insert into test_set set first_name='hello';
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_set;
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| NULL       | NULL      |
| hello      | NULL      |
+------------+-----------+
2 rows in set (0.00 sec)

雖然登錄成功后提示的文字中包含了版本信息,也不耽誤隨時查看 mysql 版本逗柴。

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.16    |
+-----------+
1 row in set (0.00 sec)

雖然百分之八十的運算符都有用過蛹头,就是因為它全必須收下。

MySQL 運算符

數(shù)據(jù)過濾比較 null 時都是使用 is戏溺,查看上述運算符可以知道宇宙飛船是相當有用的渣蜗,日常可以不用旷祸,但閱讀別人代碼時至少不應該怔住耕拷。

where name is null;
where name <=> null;
where name is not null;
where not (name <=> null);

使用 if 命令排序,場景比如: 按加入時間升序查看用戶列表托享,那些未賦值的行就會排前面骚烧,使用 where 過濾則會顯示部分結(jié)果集,如何做到顯示所有用戶闰围,并按加入時間升序赃绊,加入時間為 null 的排在后面?

mysql> select user_name, join_date
    -> from sys_users
    -> order by if(join_date <=> null, 1, 0), join_date asc;
if(condition, value_when_true, value_when_false)

加入時間為空時為 1羡榴,否則為 0碧查,所以不為空的都排在前面,繼續(xù)按加入時間升序校仑,達到了預期效果忠售。

limit 自身就支持 offset,下面兩條命令運行效果一致迄沫。

limit 3, 3
limit 3 offset 3

隨機排序档痪,從來就沒有想過該功能,可能服務器代碼寫多了邢滑,從來都是把結(jié)果集交給服務器語言二次處理。假若做個抽簽功能愿汰,隨機抽一名幸運用戶困后,分別在數(shù)據(jù)庫、服務器端處理看性能如何衬廷。

mysql> select id, user_name from sys_users order by rand() limit 1;
+------+-----------+
| id   | user_name |
+------+-----------+
| 7249 | 宋某某    |
+------+-----------+
1 row in set (0.00 sec)
#!/usr/bin/env ruby
require 'benchmark'

def massive_run(&block)
  1.upto(10) { yield }
end

Benchmark.bm(7)  do |x|
  x.report('server') do
    massive_run { User.all.sample }
  end
  x.report('sql') do
    massive_run { User.all.order('rand()').limit(1).first }
  end
end

output:
              user     system      total        real
server    2.860000   0.120000   2.980000 (  3.243038)
sql       0.010000   0.000000   0.010000 (  0.435641)

毫無疑問摇予,在數(shù)據(jù)庫端處理更高效,而且隨著數(shù)據(jù)量的增大性能差距會更大吗跋,同時提醒一直追求碼更少代碼的自己侧戴,性能才是核心宁昭,但提高性能需要更專業(yè)、更全面的知識酗宋,只會一個解決方案积仗,那它絕對不會是最佳實踐方案。

日期操作的命令很豐富蜕猫,有時間需要單獨整理總結(jié)寂曹,作份簡單的時間報告。

mysql> select
    ->   month(now()) as '月份'
    -> , monthname(now()) as '英文'
    -> , dayofmonth(now()) as '幾號'
    -> , week(now()) as '幾周'
    -> , dayofweek(now()) - 1 as '周幾'
    -> , dayofyear(now()) as '已過'
    -> , timestampdiff(day, curdate(), '2017-01-01') as '還剩'\G
*************************** 1. row ***************************
月份: 11
英文: November
幾號: 10
幾周: 45
周幾: 4
已過: 315
還剩: 52
1 row in set (0.00 sec)

模糊匹配使用 % 太多回右,很少想起單字符匹配符 _隆圆,匹配一位三個字的用戶名,不要貿(mào)然使用 length 除非你確定用戶名全英文或中文翔烁,一個中文占幾個字符渺氧。

_ 匹配一個字符
% 匹配任何一個字符序列(包括空序列在內(nèi))

mysql> select user_name from sys_users where user_name like '___' limit 1;
+-----------+
| user_name |
+-----------+
| 張某某    |
+-----------+
1 row in set (0.01 sec)

mysql> select user_name, length(user_name) from sys_users limit 2;
+-----------+-------------------+
| user_name | length(user_name) |
+-----------+-------------------+
| 張某      |                 6 |
| 張某某    |                 9 |
+-----------+-------------------+
2 rows in set (0.00 sec)

難得整理這么全的組合命令,光標操作的命令不止適用于 mysql, linux/darwin terminal 都支持的蹬屹,珍愛手指侣背,愛護鍵盤,從使用快捷鍵做起哩治。

MySQL/Linux/Darwin 光標操作組合命令.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秃踩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子业筏,更是在濱河造成了極大的恐慌憔杨,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒜胖,死亡現(xiàn)場離奇詭異消别,居然都是意外死亡,警方通過查閱死者的電腦和手機台谢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門寻狂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朋沮,你說我怎么就攤上這事蛇券。” “怎么了樊拓?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵纠亚,是天一觀的道長。 經(jīng)常有香客問我筋夏,道長蒂胞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任条篷,我火速辦了婚禮骗随,結(jié)果婚禮上蛤织,老公的妹妹穿的比我還像新娘。我一直安慰自己鸿染,他們只是感情好指蚜,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牡昆,像睡著了一般姚炕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丢烘,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天柱宦,我揣著相機與錄音,去河邊找鬼播瞳。 笑死掸刊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的赢乓。 我是一名探鬼主播忧侧,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牌芋!你這毒婦竟也來了蚓炬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤躺屁,失蹤者是張志新(化名)和其女友劉穎肯夏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犀暑,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡驯击,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耐亏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徊都。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖广辰,靈堂內(nèi)的尸體忽然破棺而出暇矫,到底是詐尸還是另有隱情,我是刑警寧澤择吊,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布袱耽,位于F島的核電站,受9級特大地震影響干发,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜史翘,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一枉长、第九天 我趴在偏房一處隱蔽的房頂上張望冀续。 院中可真熱鬧,春花似錦必峰、人聲如沸洪唐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凭需。三九已至,卻和暖如春肝匆,著一層夾襖步出監(jiān)牢的瞬間粒蜈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工旗国, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枯怖,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓能曾,卻偏偏與公主長得像度硝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寿冕,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容