很久沒有寫sql語句了嗜价,今天當需要講數(shù)據(jù)庫的時候(是的艇抠,就是那樣~),發(fā)現(xiàn)已經(jīng)手生了炭剪,深夜看文檔后寫下了這篇文章练链。
這篇文章主要是針對有一定數(shù)據(jù)庫基礎(chǔ)知識的盆友。是的奴拦,就像走兩步是檢驗腳一樣媒鼓,作為了解數(shù)據(jù)庫的我們,得:寫兩句错妖。當然绿鸣,如果是對數(shù)據(jù)庫知之甚少的伙伴,按照本文的示例也能初步感受sql語句的魅力(就那么幾句)暂氯。數(shù)據(jù)庫版本尤其是商用版本夠多潮模,但是基本sql語句都是大同小異,本文主要是針對MySql痴施。
開發(fā)過程中擎厢,個人非常熱衷官方文檔。能用看文檔解決的問題辣吃,都不是大問題动遭,如果有問題,那就再看一遍神得!
所以厘惦,不得不第一個提起的就是:
>mysql --help
Step 1, connecting&disconnecting
當我們需要數(shù)據(jù)庫服務的時候,首先得通過既有賬號和密碼連接到數(shù)據(jù)庫哩簿。
>mysql -h host -u user -p
Enter password:
-h:what host(不填則為連接本機上的MySQL), -u:user name, -p:password to use,輸入密碼后就可以對數(shù)據(jù)庫進行各種溫柔的交流了宵蕉。
當我們不再需要操作數(shù)據(jù)庫的時候,作為一個有始有終的人节榜,這個時候一定不能原諒自己忘了斷開連接羡玛。
mysql>?QUIT(or \q)
如果使用的是Unix,也可通過 Control+D 斷開數(shù)據(jù)庫連接全跨。
Step 2,寫兩句
第一步我們已經(jīng)成功與數(shù)據(jù)庫建立連接缝左,下面就開始本文的重點啦,嗯浓若,寫上兩句。
2.1 首先蛇数,得有數(shù)據(jù)庫
查看當前server上已經(jīng)存在數(shù)據(jù)庫挪钓,[關(guān)鍵詞?SHOW]:
mysql>SHOW DATABASES;
特別注意:當前用戶是否擁有SHOW_DDATABASES 權(quán)限。
如果沒有既有的數(shù)據(jù)庫耳舅,則需要創(chuàng)建數(shù)據(jù)庫(庫名:test)碌上,[關(guān)鍵詞?CREATE]:
mysql> CREATE DATABASE test;
注意:Unix環(huán)境下是區(qū)分大小寫的倚评,所以,建表的時候表名避免大小寫混寫馏予,數(shù)據(jù)庫命名也是如此天梧!
訪問數(shù)據(jù)庫(本地存在該數(shù)據(jù)庫,本文測試數(shù)據(jù)庫名均為test)霞丧,[關(guān)鍵詞?USE]:
mysql> USE test
2.2 其次呢岗,得有表
基于步驟2.1已經(jīng)訪問到特定數(shù)據(jù)庫后,產(chǎn)看當前數(shù)據(jù)庫所有表蛹尝,[關(guān)鍵詞 SHOW TABLES]:
mysql> SHOW TABLES;
如果沒有需要的表的時候后豫,則創(chuàng)建一張新的表(表名 user),[關(guān)鍵詞 CREATE TABLE]:
mysql> CREATE TABLE user (name VARCHAR(20), sex CHAR(1), birth DATE);
表名:user突那,每個user都有name挫酿,sex以及birth三個屬性值。VARCHAR長度可以為1-65535愕难,為“節(jié)能減排”早龟,對某些屬性設置特定長度可以有效的減小資源占用,如name設置長度為20猫缭。當后期有變更的時候葱弟,可以使用ALTER TABLE對已有表添加、修改或刪除列饵骨。
mysql> create table users (id int(4) primary key not null auto_increment,name varchar(20) not null default '', gender char(1) not null default 'm',address varchar(20), tel varchar(20));
表名:users,每個user都有一個自增的主鍵id翘悉,name,gender居触,address以及tel三個屬性值妖混。
當成功創(chuàng)建表需要查看創(chuàng)建表語句檢驗是否符合設計預期,或者忘記表中列的屬性定義的時候轮洋,可以查看表各列及其屬性制市,[關(guān)鍵詞 DESCRIBE 或 DESC]:
mysql> DESCRIBE user;
2.3 填充數(shù)據(jù)
將本地文件按順序填充到數(shù)據(jù)庫:
mysql> LOAD DATA LOCAL INFILE '/path/users.txt' INTO TABLE user;
若文件是在Windows上創(chuàng)建,則需要將上述語句改成:
mysql> LOAD DATA LOCAL INFILE '/path/users.txt' INTO TABLE user LINES TERMINATED BY '\r\n\';
在OS X系統(tǒng)上弊予,對應修改成 LINES TERMINATED BY '\r'祥楣。
插入數(shù)據(jù),[關(guān)鍵詞 INSERT]:
mysql> INSERT INTO user VALUES ('John', 'f', '1999-01-01');
當插入值缺失的時候汉柒,用NULL代替误褪。
2.4 操作表
·1 最簡單的方式,獲取表中所有數(shù)據(jù) [關(guān)鍵詞SELECT]
mysql> SELECT * FROM user;
·2 獲取特定行
mysql> SELECT * FROM user WHERE name = 'Tommy';
mysql> SELECT * FROM user WHERE birth >= '2000-01-01';
mysql> SELECT * FROM user WHERE name = 'Tommy' OR name = 'Tom';
mysql> SELECT * FROM user WHERE (sex = 'm' AND birth >= '2000-01-01') OR (sex = 'f' AND birth >= '2005-01-01');
·3 獲取特定列
mysql> SELECT name, birth FROM user;
mysql> SELECT DISTINCT birth FROM user; ?
DISTINCT:相同結(jié)果只輸出一次碾褂。
·4 排序兽间,[關(guān)鍵詞 ORDER BY,默認排序為升序正塌,降序則添加關(guān)鍵詞 DESC]
mysql> SELECT name, birth FROM user ORDER BY birth;
mysql> SELECT name, birth FROM user ORDER BY birth DESC;
mysql>SELECT?name, birth?FROM?user?ORDER BY sex,?birth?DESC;
關(guān)鍵詞DESC只對緊鄰產(chǎn)生影響(birth)嘀略。
·5 修改一條數(shù)據(jù)的值恤溶,[關(guān)鍵詞 UPDATE]
mysql> UPDATE user SET birth = '2000-01-01' WHERE name = 'Tommy';
·6 ALTER
(1)修改表名:
mysql> ALTER TABLE user RENAME TO db_user;
(2)增加主鍵:
mysql> ALTER TABLE user ADD id int(5) unsigned NOT NULL AUTO_INCREMENT , ADD PRIMARY KEY(id);
(3)修改id為自增,并設置為主鍵:
mysql> ALTER TABLE user MODIFY id INT AUTO_INCREMENT PRIMARY KEY;
(4)增加字段:
mysql> ALTER TABLE user ADD (address varchar(20));
(5)修改字段默認值:
mysql> ALTER TABLE user ALTER COLUMN gender set default 0;
(6)在某個自斷后增加字段:
mysql> ALTER TABLE user ADD COLUMN email VARCHAR(20) NOT NULL DEFAULT ''AFTER tel;
(7)修改原字段名稱及類型帜羊,修改字段名時必須重新制定字段類型:
mysql> ALTER TABLE user CHANGE project project_new varchar(20) NOT NULL DEFAULT '';
(8)刪除字段:
mysql> ALTER TABLE db_teacher DROP address;
(9)修改一個字段類型:
mysql> ALTER TABLE db_teacher MODIFY gender INT(1) UNSIGNED DEFAULT 0;
·7 NULL
NULL虐我千百遍咒程,還得待她如初戀~
官方文檔對于NULL的定義是:a missing unknown value。
對于值的NULL判斷讼育,[關(guān)鍵詞 IS NULL帐姻,IS NOT NULL]:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
1不為NULL窥淆,故上述結(jié)果分別是0卖宠,1。
注意:將一個值與NULL進行比較運算(=, <, <>),結(jié)果均為NULL忧饭。
查看更多比較運算扛伍。
·8 統(tǒng)計數(shù)據(jù)條數(shù) [關(guān)鍵方法 COUNT(*)]
mysql> SELECT COUNT(*) FROM user; ? ? 注:統(tǒng)計用戶數(shù)
mysql> SELECT sex, COUNT(*) FROM user GROUP BY sex; ? ?注:統(tǒng)計male,female (如果有NULL則還有NULL)人數(shù)
查看更多分組運算词裤。
·9 Pattern Matching
MySQL提供了正則表達式相關(guān)的模式匹配方法刺洒。
(1),"_":匹配一個字符吼砂,“%”:匹配任意字符數(shù)(包括0)逆航;
(2),不區(qū)分大小寫渔肩;
(3)因俐,關(guān)鍵詞 LIKE,NOT LIKE周偎。
mysql> SELECT * FROM user WHERE name LIKE 'a%'; ? 注:名字以a開頭
mysql> SELECT * FROM user WHERE name LIKE '%s'; ? ?注:名字以s結(jié)束
mysql> SELECT * FROM user WHERE name NOT LIKE '%b%';? ? 注:名字不包含b
mysql> SELECT * FROM user WHERE name LIKE? '___'; ? ? ?注:名字長度為5個字符
查看更多正則表達運算符抹剩。
·10 多表查詢
為準確記錄用戶一些重大事件,目前僅只有一張user表已經(jīng)無法滿足我們的需求了蓉坎,新增一張event表澳眷,分別記錄用戶名,日期蛉艾,事件類型以及備注钳踊。
mysql> CREATE TABLE event (name VARCHAR(20), date DATE, type VARCHAR(15), describe VARCHAR(255));
將數(shù)據(jù)導入或插入表中。
event表中記錄用戶一條type為marry的結(jié)婚事件勿侯,現(xiàn)在需要查詢各用戶的結(jié)婚年齡:
mysql> SELECT user.name, TIMESTAMPDIFF(YEAR,birth, date) AS age, desc FROM user INNER JOIN event ON user.name = event.name WHERE event.type = 'marry';
有時候也用當前表join表本身用于計算拓瞪。
mysql> SELECT u1.name, u1.sex FROM user AS u1 INNER JOIN user AS u2 ON u1.birth = u2.birth AND u1.sex = 'f' AND u2.sex = 'm';
·11 日期計算
日期計算在數(shù)據(jù)庫使用中非常普遍。MySQL也提供了日期相關(guān)的計算方法助琐。
計算年齡吴藻,[方法 TIMESTAMPDIFF()]
mysql> SELECT name, birth, CURDATE(), ?TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM user;
mysql>?SELECT?name, birth,?CURDATE(), ?TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS?age?FROM user ORDER BY age;
mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth, CURDATE()) AS age FROM user WHERE birth IS NOT NULL ORDER BY age;
上述sql語句執(zhí)行結(jié)果是:輸出會增加顯示當前時間(CURDATE()),年齡age(TIMESTAMPDIFF(YEAR,birth,CURDATE()))弓柱。
mysql> SELECT name, birth, MONTH(birth) FROM user;
獲取特定日期的月份使用 MONTH()沟堡,相似方法還有YEAR(),MONTH()矢空,DAYOFMONTH()等航罗,查看MySQL更過日期、時間計算方法屁药。
好了粥血,本次關(guān)于找回MySQL曾經(jīng)內(nèi)容就到這了,后續(xù)會寫深入MySQL相關(guān)內(nèi)容酿箭。
文中若有疏漏及錯誤复亏,煩請斧正,謝謝缭嫡。
在中秋假期的最后一天祝各位看官中秋快樂~
附:官方文檔地址 MySQL 5.6 Reference Manual